diff --git a/.env.dist b/.env.dist
new file mode 100644
index 0000000..a8c6177
--- /dev/null
+++ b/.env.dist
@@ -0,0 +1,36 @@
+# This file is a "template" of which env vars need to be defined for your application
+# Copy this file to .env file for development, create environment variables when deploying to production
+# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration
+
+GOS_WEB_SOCKET_PORT=1337
+GOS_WEB_SOCKET_HOST=127.0.0.1
+
+DATABASE_DRIVER=pdo_mysql
+DATABASE_HOST=127.0.0.1
+DATABASE_PORT=3306
+DATABASE_NAME=gosdemo
+DATABASE_USER=root
+DATABASE_PASSWORD=
+
+LOCALE=en
+
+###> symfony/framework-bundle ###
+APP_ENV=dev
+APP_SECRET=e6c9be9d2001d5278a3a587f60f77dcd
+#TRUSTED_PROXIES=127.0.0.1,127.0.0.2
+#TRUSTED_HOSTS=localhost,example.com
+###< symfony/framework-bundle ###
+
+###> doctrine/doctrine-bundle ###
+# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
+# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
+# Configure your db driver and server_version in config/packages/doctrine.yaml
+DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name
+###< doctrine/doctrine-bundle ###
+
+###> symfony/swiftmailer-bundle ###
+# For Gmail as a transport, use: "gmail://username:password@localhost"
+# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode="
+# Delivery is disabled by default via "null://localhost"
+MAILER_URL=null://localhost
+###< symfony/swiftmailer-bundle ###
diff --git a/.gitignore b/.gitignore
index b2019be..ee717a8 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1,12 +1,21 @@
-/web/bundles/
-/app/bootstrap.php.cache
-/app/cache/*
-/app/config/parameters.yml
-/app/logs/*
-!app/cache/.gitkeep
-!app/logs/.gitkeep
-/app/phpunit.xml
-/build/
-/vendor/
+/.idea
/bin/
/composer.phar
+
+###> symfony/framework-bundle ###
+/.env
+/public/bundles/
+/var/
+!/var/cache/.gitkeep
+!/var/log/.gitkeep
+/vendor/
+###< symfony/framework-bundle ###
+
+###> phpunit/phpunit ###
+###< phpunit/phpunit ###
+
+###> symfony/phpunit-bridge ###
+###< symfony/phpunit-bridge ###
+###> symfony/web-server-bundle ###
+/.web-server-pid
+###< symfony/web-server-bundle ###
diff --git a/README.md b/README.md
index 46a77fe..fcb75c1 100755
--- a/README.md
+++ b/README.md
@@ -1,8 +1,9 @@
Gos Websocket Demo
==================
-- Start websocket bundle `php app/console gos:websocket:server`
-- Go to 127.0.0.1/app_dev.php/app/example
+- Start socket service in term `php bin/console gos:websocket:server`
+- Start web service in a second term `php bin/console server:run`
+- Go to 127.0.0.1/app/example
- Look at the console browser
- Play with the code :)
diff --git a/app/.htaccess b/app/.htaccess
deleted file mode 100755
index fb1de45..0000000
--- a/app/.htaccess
+++ /dev/null
@@ -1,7 +0,0 @@
-
- Require all denied
-
-
- Order deny,allow
- Deny from all
-
diff --git a/app/AppCache.php b/app/AppCache.php
deleted file mode 100755
index ddb51db..0000000
--- a/app/AppCache.php
+++ /dev/null
@@ -1,9 +0,0 @@
-getEnvironment(), array('dev', 'test'))) {
- $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
- $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
- }
-
- return $bundles;
- }
-
- public function registerContainerConfiguration(LoaderInterface $loader)
- {
- $loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml');
- }
-}
diff --git a/app/Resources/views/base.html.twig b/app/Resources/views/base.html.twig
deleted file mode 100755
index bafd28d..0000000
--- a/app/Resources/views/base.html.twig
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
- {% block title %}Welcome!{% endblock %}
- {% block stylesheets %}{% endblock %}
-
-
-
- {% block body %}{% endblock %}
- {% block javascripts %}{% endblock %}
-
-
diff --git a/app/SymfonyRequirements.php b/app/SymfonyRequirements.php
deleted file mode 100755
index 841338f..0000000
--- a/app/SymfonyRequirements.php
+++ /dev/null
@@ -1,774 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/*
- * Users of PHP 5.2 should be able to run the requirements checks.
- * This is why the file and all classes must be compatible with PHP 5.2+
- * (e.g. not using namespaces and closures).
- *
- * ************** CAUTION **************
- *
- * DO NOT EDIT THIS FILE as it will be overridden by Composer as part of
- * the installation/update process. The original file resides in the
- * SensioDistributionBundle.
- *
- * ************** CAUTION **************
- */
-
-/**
- * Represents a single PHP requirement, e.g. an installed extension.
- * It can be a mandatory requirement or an optional recommendation.
- * There is a special subclass, named PhpIniRequirement, to check a php.ini configuration.
- *
- * @author Tobias Schultze
- */
-class Requirement
-{
- private $fulfilled;
- private $testMessage;
- private $helpText;
- private $helpHtml;
- private $optional;
-
- /**
- * Constructor that initializes the requirement.
- *
- * @param bool $fulfilled Whether the requirement is fulfilled
- * @param string $testMessage The message for testing the requirement
- * @param string $helpHtml The help text formatted in HTML for resolving the problem
- * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
- * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement
- */
- public function __construct($fulfilled, $testMessage, $helpHtml, $helpText = null, $optional = false)
- {
- $this->fulfilled = (bool) $fulfilled;
- $this->testMessage = (string) $testMessage;
- $this->helpHtml = (string) $helpHtml;
- $this->helpText = null === $helpText ? strip_tags($this->helpHtml) : (string) $helpText;
- $this->optional = (bool) $optional;
- }
-
- /**
- * Returns whether the requirement is fulfilled.
- *
- * @return bool true if fulfilled, otherwise false
- */
- public function isFulfilled()
- {
- return $this->fulfilled;
- }
-
- /**
- * Returns the message for testing the requirement.
- *
- * @return string The test message
- */
- public function getTestMessage()
- {
- return $this->testMessage;
- }
-
- /**
- * Returns the help text for resolving the problem.
- *
- * @return string The help text
- */
- public function getHelpText()
- {
- return $this->helpText;
- }
-
- /**
- * Returns the help text formatted in HTML.
- *
- * @return string The HTML help
- */
- public function getHelpHtml()
- {
- return $this->helpHtml;
- }
-
- /**
- * Returns whether this is only an optional recommendation and not a mandatory requirement.
- *
- * @return bool true if optional, false if mandatory
- */
- public function isOptional()
- {
- return $this->optional;
- }
-}
-
-/**
- * Represents a PHP requirement in form of a php.ini configuration.
- *
- * @author Tobias Schultze
- */
-class PhpIniRequirement extends Requirement
-{
- /**
- * Constructor that initializes the requirement.
- *
- * @param string $cfgName The configuration name used for ini_get()
- * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false,
- * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
- * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false.
- * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
- * Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
- * @param string|null $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived)
- * @param string|null $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived)
- * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
- * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement
- */
- public function __construct($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null, $optional = false)
- {
- $cfgValue = ini_get($cfgName);
-
- if (is_callable($evaluation)) {
- if (null === $testMessage || null === $helpHtml) {
- throw new InvalidArgumentException('You must provide the parameters testMessage and helpHtml for a callback evaluation.');
- }
-
- $fulfilled = call_user_func($evaluation, $cfgValue);
- } else {
- if (null === $testMessage) {
- $testMessage = sprintf('%s %s be %s in php.ini',
- $cfgName,
- $optional ? 'should' : 'must',
- $evaluation ? 'enabled' : 'disabled'
- );
- }
-
- if (null === $helpHtml) {
- $helpHtml = sprintf('Set %s to %s in php.ini*.',
- $cfgName,
- $evaluation ? 'on' : 'off'
- );
- }
-
- $fulfilled = $evaluation == $cfgValue;
- }
-
- parent::__construct($fulfilled || ($approveCfgAbsence && false === $cfgValue), $testMessage, $helpHtml, $helpText, $optional);
- }
-}
-
-/**
- * A RequirementCollection represents a set of Requirement instances.
- *
- * @author Tobias Schultze
- */
-class RequirementCollection implements IteratorAggregate
-{
- private $requirements = array();
-
- /**
- * Gets the current RequirementCollection as an Iterator.
- *
- * @return Traversable A Traversable interface
- */
- public function getIterator()
- {
- return new ArrayIterator($this->requirements);
- }
-
- /**
- * Adds a Requirement.
- *
- * @param Requirement $requirement A Requirement instance
- */
- public function add(Requirement $requirement)
- {
- $this->requirements[] = $requirement;
- }
-
- /**
- * Adds a mandatory requirement.
- *
- * @param bool $fulfilled Whether the requirement is fulfilled
- * @param string $testMessage The message for testing the requirement
- * @param string $helpHtml The help text formatted in HTML for resolving the problem
- * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
- */
- public function addRequirement($fulfilled, $testMessage, $helpHtml, $helpText = null)
- {
- $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, false));
- }
-
- /**
- * Adds an optional recommendation.
- *
- * @param bool $fulfilled Whether the recommendation is fulfilled
- * @param string $testMessage The message for testing the recommendation
- * @param string $helpHtml The help text formatted in HTML for resolving the problem
- * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
- */
- public function addRecommendation($fulfilled, $testMessage, $helpHtml, $helpText = null)
- {
- $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, true));
- }
-
- /**
- * Adds a mandatory requirement in form of a php.ini configuration.
- *
- * @param string $cfgName The configuration name used for ini_get()
- * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false,
- * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
- * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false.
- * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
- * Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
- * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived)
- * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived)
- * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
- */
- public function addPhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null)
- {
- $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, false));
- }
-
- /**
- * Adds an optional recommendation in form of a php.ini configuration.
- *
- * @param string $cfgName The configuration name used for ini_get()
- * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false,
- * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
- * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false.
- * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
- * Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
- * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived)
- * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived)
- * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
- */
- public function addPhpIniRecommendation($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null)
- {
- $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, true));
- }
-
- /**
- * Adds a requirement collection to the current set of requirements.
- *
- * @param RequirementCollection $collection A RequirementCollection instance
- */
- public function addCollection(RequirementCollection $collection)
- {
- $this->requirements = array_merge($this->requirements, $collection->all());
- }
-
- /**
- * Returns both requirements and recommendations.
- *
- * @return array Array of Requirement instances
- */
- public function all()
- {
- return $this->requirements;
- }
-
- /**
- * Returns all mandatory requirements.
- *
- * @return array Array of Requirement instances
- */
- public function getRequirements()
- {
- $array = array();
- foreach ($this->requirements as $req) {
- if (!$req->isOptional()) {
- $array[] = $req;
- }
- }
-
- return $array;
- }
-
- /**
- * Returns the mandatory requirements that were not met.
- *
- * @return array Array of Requirement instances
- */
- public function getFailedRequirements()
- {
- $array = array();
- foreach ($this->requirements as $req) {
- if (!$req->isFulfilled() && !$req->isOptional()) {
- $array[] = $req;
- }
- }
-
- return $array;
- }
-
- /**
- * Returns all optional recommendations.
- *
- * @return array Array of Requirement instances
- */
- public function getRecommendations()
- {
- $array = array();
- foreach ($this->requirements as $req) {
- if ($req->isOptional()) {
- $array[] = $req;
- }
- }
-
- return $array;
- }
-
- /**
- * Returns the recommendations that were not met.
- *
- * @return array Array of Requirement instances
- */
- public function getFailedRecommendations()
- {
- $array = array();
- foreach ($this->requirements as $req) {
- if (!$req->isFulfilled() && $req->isOptional()) {
- $array[] = $req;
- }
- }
-
- return $array;
- }
-
- /**
- * Returns whether a php.ini configuration is not correct.
- *
- * @return bool php.ini configuration problem?
- */
- public function hasPhpIniConfigIssue()
- {
- foreach ($this->requirements as $req) {
- if (!$req->isFulfilled() && $req instanceof PhpIniRequirement) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Returns the PHP configuration file (php.ini) path.
- *
- * @return string|false php.ini file path
- */
- public function getPhpIniConfigPath()
- {
- return get_cfg_var('cfg_file_path');
- }
-}
-
-/**
- * This class specifies all requirements and optional recommendations that
- * are necessary to run the Symfony Standard Edition.
- *
- * @author Tobias Schultze
- * @author Fabien Potencier
- */
-class SymfonyRequirements extends RequirementCollection
-{
- const REQUIRED_PHP_VERSION = '5.3.3';
-
- /**
- * Constructor that initializes the requirements.
- */
- public function __construct()
- {
- /* mandatory requirements follow */
-
- $installedPhpVersion = phpversion();
-
- $this->addRequirement(
- version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>='),
- sprintf('PHP version must be at least %s (%s installed)', self::REQUIRED_PHP_VERSION, $installedPhpVersion),
- sprintf('You are running PHP version "%s", but Symfony needs at least PHP "%s" to run.
- Before using Symfony, upgrade your PHP installation, preferably to the latest version.',
- $installedPhpVersion, self::REQUIRED_PHP_VERSION),
- sprintf('Install PHP %s or newer (installed version is %s)', self::REQUIRED_PHP_VERSION, $installedPhpVersion)
- );
-
- $this->addRequirement(
- version_compare($installedPhpVersion, '5.3.16', '!='),
- 'PHP version must not be 5.3.16 as Symfony won\'t work properly with it',
- 'Install PHP 5.3.17 or newer (or downgrade to an earlier PHP version)'
- );
-
- $this->addRequirement(
- is_dir(__DIR__.'/../vendor/composer'),
- 'Vendor libraries must be installed',
- 'Vendor libraries are missing. Install composer following instructions from http://getcomposer.org/. '.
- 'Then run "php composer.phar install" to install them.'
- );
-
- $cacheDir = is_dir(__DIR__.'/../var/cache') ? __DIR__.'/../var/cache' : __DIR__.'/cache';
-
- $this->addRequirement(
- is_writable($cacheDir),
- 'app/cache/ or var/cache/ directory must be writable',
- 'Change the permissions of either "app/cache/" or "var/cache/" directory so that the web server can write into it.'
- );
-
- $logsDir = is_dir(__DIR__.'/../var/logs') ? __DIR__.'/../var/logs' : __DIR__.'/logs';
-
- $this->addRequirement(
- is_writable($logsDir),
- 'app/logs/ or var/logs/ directory must be writable',
- 'Change the permissions of either "app/logs/" or "var/logs/" directory so that the web server can write into it.'
- );
-
- if (version_compare($installedPhpVersion, '7.0.0', '<')) {
- $this->addPhpIniRequirement(
- 'date.timezone', true, false,
- 'date.timezone setting must be set',
- 'Set the "date.timezone" setting in php.ini* (like Europe/Paris).'
- );
- }
-
- if (version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>=')) {
- $timezones = array();
- foreach (DateTimeZone::listAbbreviations() as $abbreviations) {
- foreach ($abbreviations as $abbreviation) {
- $timezones[$abbreviation['timezone_id']] = true;
- }
- }
-
- $this->addRequirement(
- isset($timezones[@date_default_timezone_get()]),
- sprintf('Configured default timezone "%s" must be supported by your installation of PHP', @date_default_timezone_get()),
- 'Your default timezone is not supported by PHP. Check for typos in your php.ini file and have a look at the list of deprecated timezones at http://php.net/manual/en/timezones.others.php.'
- );
- }
-
- $this->addRequirement(
- function_exists('iconv'),
- 'iconv() must be available',
- 'Install and enable the iconv extension.'
- );
-
- $this->addRequirement(
- function_exists('json_encode'),
- 'json_encode() must be available',
- 'Install and enable the JSON extension.'
- );
-
- $this->addRequirement(
- function_exists('session_start'),
- 'session_start() must be available',
- 'Install and enable the session extension.'
- );
-
- $this->addRequirement(
- function_exists('ctype_alpha'),
- 'ctype_alpha() must be available',
- 'Install and enable the ctype extension.'
- );
-
- $this->addRequirement(
- function_exists('token_get_all'),
- 'token_get_all() must be available',
- 'Install and enable the Tokenizer extension.'
- );
-
- $this->addRequirement(
- function_exists('simplexml_import_dom'),
- 'simplexml_import_dom() must be available',
- 'Install and enable the SimpleXML extension.'
- );
-
- if (function_exists('apc_store') && ini_get('apc.enabled')) {
- if (version_compare($installedPhpVersion, '5.4.0', '>=')) {
- $this->addRequirement(
- version_compare(phpversion('apc'), '3.1.13', '>='),
- 'APC version must be at least 3.1.13 when using PHP 5.4',
- 'Upgrade your APC extension (3.1.13+).'
- );
- } else {
- $this->addRequirement(
- version_compare(phpversion('apc'), '3.0.17', '>='),
- 'APC version must be at least 3.0.17',
- 'Upgrade your APC extension (3.0.17+).'
- );
- }
- }
-
- $this->addPhpIniRequirement('detect_unicode', false);
-
- if (extension_loaded('suhosin')) {
- $this->addPhpIniRequirement(
- 'suhosin.executor.include.whitelist',
- create_function('$cfgValue', 'return false !== stripos($cfgValue, "phar");'),
- false,
- 'suhosin.executor.include.whitelist must be configured correctly in php.ini',
- 'Add "phar" to suhosin.executor.include.whitelist in php.ini*.'
- );
- }
-
- if (extension_loaded('xdebug')) {
- $this->addPhpIniRequirement(
- 'xdebug.show_exception_trace', false, true
- );
-
- $this->addPhpIniRequirement(
- 'xdebug.scream', false, true
- );
-
- $this->addPhpIniRecommendation(
- 'xdebug.max_nesting_level',
- create_function('$cfgValue', 'return $cfgValue > 100;'),
- true,
- 'xdebug.max_nesting_level should be above 100 in php.ini',
- 'Set "xdebug.max_nesting_level" to e.g. "250" in php.ini* to stop Xdebug\'s infinite recursion protection erroneously throwing a fatal error in your project.'
- );
- }
-
- $pcreVersion = defined('PCRE_VERSION') ? (float) PCRE_VERSION : null;
-
- $this->addRequirement(
- null !== $pcreVersion,
- 'PCRE extension must be available',
- 'Install the PCRE extension (version 8.0+).'
- );
-
- if (extension_loaded('mbstring')) {
- $this->addPhpIniRequirement(
- 'mbstring.func_overload',
- create_function('$cfgValue', 'return (int) $cfgValue === 0;'),
- true,
- 'string functions should not be overloaded',
- 'Set "mbstring.func_overload" to 0 in php.ini* to disable function overloading by the mbstring extension.'
- );
- }
-
- /* optional recommendations follow */
-
- if (file_exists(__DIR__.'/../vendor/composer')) {
- require_once __DIR__.'/../vendor/autoload.php';
-
- try {
- $r = new ReflectionClass('Sensio\Bundle\DistributionBundle\SensioDistributionBundle');
-
- $contents = file_get_contents(dirname($r->getFileName()).'/Resources/skeleton/app/SymfonyRequirements.php');
- } catch (ReflectionException $e) {
- $contents = '';
- }
- $this->addRecommendation(
- file_get_contents(__FILE__) === $contents,
- 'Requirements file should be up-to-date',
- 'Your requirements file is outdated. Run composer install and re-check your configuration.'
- );
- }
-
- $this->addRecommendation(
- version_compare($installedPhpVersion, '5.3.4', '>='),
- 'You should use at least PHP 5.3.4 due to PHP bug #52083 in earlier versions',
- 'Your project might malfunction randomly due to PHP bug #52083 ("Notice: Trying to get property of non-object"). Install PHP 5.3.4 or newer.'
- );
-
- $this->addRecommendation(
- version_compare($installedPhpVersion, '5.3.8', '>='),
- 'When using annotations you should have at least PHP 5.3.8 due to PHP bug #55156',
- 'Install PHP 5.3.8 or newer if your project uses annotations.'
- );
-
- $this->addRecommendation(
- version_compare($installedPhpVersion, '5.4.0', '!='),
- 'You should not use PHP 5.4.0 due to the PHP bug #61453',
- 'Your project might not work properly due to the PHP bug #61453 ("Cannot dump definitions which have method calls"). Install PHP 5.4.1 or newer.'
- );
-
- $this->addRecommendation(
- version_compare($installedPhpVersion, '5.4.11', '>='),
- 'When using the logout handler from the Symfony Security Component, you should have at least PHP 5.4.11 due to PHP bug #63379 (as a workaround, you can also set invalidate_session to false in the security logout handler configuration)',
- 'Install PHP 5.4.11 or newer if your project uses the logout handler from the Symfony Security Component.'
- );
-
- $this->addRecommendation(
- (version_compare($installedPhpVersion, '5.3.18', '>=') && version_compare($installedPhpVersion, '5.4.0', '<'))
- ||
- version_compare($installedPhpVersion, '5.4.8', '>='),
- 'You should use PHP 5.3.18+ or PHP 5.4.8+ to always get nice error messages for fatal errors in the development environment due to PHP bug #61767/#60909',
- 'Install PHP 5.3.18+ or PHP 5.4.8+ if you want nice error messages for all fatal errors in the development environment.'
- );
-
- if (null !== $pcreVersion) {
- $this->addRecommendation(
- $pcreVersion >= 8.0,
- sprintf('PCRE extension should be at least version 8.0 (%s installed)', $pcreVersion),
- 'PCRE 8.0+ is preconfigured in PHP since 5.3.2 but you are using an outdated version of it. Symfony probably works anyway but it is recommended to upgrade your PCRE extension.'
- );
- }
-
- $this->addRecommendation(
- class_exists('DomDocument'),
- 'PHP-DOM and PHP-XML modules should be installed',
- 'Install and enable the PHP-DOM and the PHP-XML modules.'
- );
-
- $this->addRecommendation(
- function_exists('mb_strlen'),
- 'mb_strlen() should be available',
- 'Install and enable the mbstring extension.'
- );
-
- $this->addRecommendation(
- function_exists('iconv'),
- 'iconv() should be available',
- 'Install and enable the iconv extension.'
- );
-
- $this->addRecommendation(
- function_exists('utf8_decode'),
- 'utf8_decode() should be available',
- 'Install and enable the XML extension.'
- );
-
- $this->addRecommendation(
- function_exists('filter_var'),
- 'filter_var() should be available',
- 'Install and enable the filter extension.'
- );
-
- if (!defined('PHP_WINDOWS_VERSION_BUILD')) {
- $this->addRecommendation(
- function_exists('posix_isatty'),
- 'posix_isatty() should be available',
- 'Install and enable the php_posix extension (used to colorize the CLI output).'
- );
- }
-
- $this->addRecommendation(
- extension_loaded('intl'),
- 'intl extension should be available',
- 'Install and enable the intl extension (used for validators).'
- );
-
- if (extension_loaded('intl')) {
- // in some WAMP server installations, new Collator() returns null
- $this->addRecommendation(
- null !== new Collator('fr_FR'),
- 'intl extension should be correctly configured',
- 'The intl extension does not behave properly. This problem is typical on PHP 5.3.X x64 WIN builds.'
- );
-
- // check for compatible ICU versions (only done when you have the intl extension)
- if (defined('INTL_ICU_VERSION')) {
- $version = INTL_ICU_VERSION;
- } else {
- $reflector = new ReflectionExtension('intl');
-
- ob_start();
- $reflector->info();
- $output = strip_tags(ob_get_clean());
-
- preg_match('/^ICU version +(?:=> )?(.*)$/m', $output, $matches);
- $version = $matches[1];
- }
-
- $this->addRecommendation(
- version_compare($version, '4.0', '>='),
- 'intl ICU version should be at least 4+',
- 'Upgrade your intl extension with a newer ICU version (4+).'
- );
-
- if (class_exists('Symfony\Component\Intl\Intl')) {
- $this->addRecommendation(
- \Symfony\Component\Intl\Intl::getIcuDataVersion() === \Symfony\Component\Intl\Intl::getIcuVersion(),
- sprintf('intl ICU version installed on your system (%s) should match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()),
- 'In most cases you should be fine, but please verify there is no inconsistencies between data provided by Symfony and the intl extension. See https://github.com/symfony/symfony/issues/15007 for an example of inconsistencies you might run into.'
- );
- }
-
- $this->addPhpIniRecommendation(
- 'intl.error_level',
- create_function('$cfgValue', 'return (int) $cfgValue === 0;'),
- true,
- 'intl.error_level should be 0 in php.ini',
- 'Set "intl.error_level" to "0" in php.ini* to inhibit the messages when an error occurs in ICU functions.'
- );
- }
-
- $accelerator =
- (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable'))
- ||
- (extension_loaded('apc') && ini_get('apc.enabled'))
- ||
- (extension_loaded('Zend Optimizer+') && ini_get('zend_optimizerplus.enable'))
- ||
- (extension_loaded('Zend OPcache') && ini_get('opcache.enable'))
- ||
- (extension_loaded('xcache') && ini_get('xcache.cacher'))
- ||
- (extension_loaded('wincache') && ini_get('wincache.ocenabled'))
- ;
-
- $this->addRecommendation(
- $accelerator,
- 'a PHP accelerator should be installed',
- 'Install and/or enable a PHP accelerator (highly recommended).'
- );
-
- if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
- $this->addRecommendation(
- $this->getRealpathCacheSize() > 1000,
- 'realpath_cache_size should be above 1024 in php.ini',
- 'Set "realpath_cache_size" to e.g. "1024" in php.ini* to improve performance on windows.'
- );
- }
-
- $this->addPhpIniRecommendation('short_open_tag', false);
-
- $this->addPhpIniRecommendation('magic_quotes_gpc', false, true);
-
- $this->addPhpIniRecommendation('register_globals', false, true);
-
- $this->addPhpIniRecommendation('session.auto_start', false);
-
- $this->addRecommendation(
- class_exists('PDO'),
- 'PDO should be installed',
- 'Install PDO (mandatory for Doctrine).'
- );
-
- if (class_exists('PDO')) {
- $drivers = PDO::getAvailableDrivers();
- $this->addRecommendation(
- count($drivers) > 0,
- sprintf('PDO should have some drivers installed (currently available: %s)', count($drivers) ? implode(', ', $drivers) : 'none'),
- 'Install PDO drivers (mandatory for Doctrine).'
- );
- }
- }
-
- /**
- * Loads realpath_cache_size from php.ini and converts it to int.
- *
- * (e.g. 16k is converted to 16384 int)
- *
- * @return int
- */
- protected function getRealpathCacheSize()
- {
- $size = ini_get('realpath_cache_size');
- $size = trim($size);
- $unit = strtolower(substr($size, -1, 1));
- switch ($unit) {
- case 'g':
- return $size * 1024 * 1024 * 1024;
- case 'm':
- return $size * 1024 * 1024;
- case 'k':
- return $size * 1024;
- default:
- return (int) $size;
- }
- }
-}
diff --git a/app/autoload.php b/app/autoload.php
deleted file mode 100755
index 70526bb..0000000
--- a/app/autoload.php
+++ /dev/null
@@ -1,13 +0,0 @@
-getPhpIniConfigPath();
-
-echo_title('Symfony Requirements Checker');
-
-echo '> PHP is using the following php.ini file:'.PHP_EOL;
-if ($iniPath) {
- echo_style('green', ' '.$iniPath);
-} else {
- echo_style('warning', ' WARNING: No configuration file (php.ini) used by PHP!');
-}
-
-echo PHP_EOL.PHP_EOL;
-
-echo '> Checking Symfony requirements:'.PHP_EOL.' ';
-
-$messages = array();
-foreach ($symfonyRequirements->getRequirements() as $req) {
- /** @var $req Requirement */
- if ($helpText = get_error_message($req, $lineSize)) {
- echo_style('red', 'E');
- $messages['error'][] = $helpText;
- } else {
- echo_style('green', '.');
- }
-}
-
-$checkPassed = empty($messages['error']);
-
-foreach ($symfonyRequirements->getRecommendations() as $req) {
- if ($helpText = get_error_message($req, $lineSize)) {
- echo_style('yellow', 'W');
- $messages['warning'][] = $helpText;
- } else {
- echo_style('green', '.');
- }
-}
-
-if ($checkPassed) {
- echo_block('success', 'OK', 'Your system is ready to run Symfony projects');
-} else {
- echo_block('error', 'ERROR', 'Your system is not ready to run Symfony projects');
-
- echo_title('Fix the following mandatory requirements', 'red');
-
- foreach ($messages['error'] as $helpText) {
- echo ' * '.$helpText.PHP_EOL;
- }
-}
-
-if (!empty($messages['warning'])) {
- echo_title('Optional recommendations to improve your setup', 'yellow');
-
- foreach ($messages['warning'] as $helpText) {
- echo ' * '.$helpText.PHP_EOL;
- }
-}
-
-echo PHP_EOL;
-echo_style('title', 'Note');
-echo ' The command console could use a different php.ini file'.PHP_EOL;
-echo_style('title', '~~~~');
-echo ' than the one used with your web server. To be on the'.PHP_EOL;
-echo ' safe side, please check the requirements from your web'.PHP_EOL;
-echo ' server using the ';
-echo_style('yellow', 'web/config.php');
-echo ' script.'.PHP_EOL;
-echo PHP_EOL;
-
-exit($checkPassed ? 0 : 1);
-
-function get_error_message(Requirement $requirement, $lineSize)
-{
- if ($requirement->isFulfilled()) {
- return;
- }
-
- $errorMessage = wordwrap($requirement->getTestMessage(), $lineSize - 3, PHP_EOL.' ').PHP_EOL;
- $errorMessage .= ' > '.wordwrap($requirement->getHelpText(), $lineSize - 5, PHP_EOL.' > ').PHP_EOL;
-
- return $errorMessage;
-}
-
-function echo_title($title, $style = null)
-{
- $style = $style ?: 'title';
-
- echo PHP_EOL;
- echo_style($style, $title.PHP_EOL);
- echo_style($style, str_repeat('~', strlen($title)).PHP_EOL);
- echo PHP_EOL;
-}
-
-function echo_style($style, $message)
-{
- // ANSI color codes
- $styles = array(
- 'reset' => "\033[0m",
- 'red' => "\033[31m",
- 'green' => "\033[32m",
- 'yellow' => "\033[33m",
- 'error' => "\033[37;41m",
- 'success' => "\033[37;42m",
- 'title' => "\033[34m",
- );
- $supports = has_color_support();
-
- echo($supports ? $styles[$style] : '').$message.($supports ? $styles['reset'] : '');
-}
-
-function echo_block($style, $title, $message)
-{
- $message = ' '.trim($message).' ';
- $width = strlen($message);
-
- echo PHP_EOL.PHP_EOL;
-
- echo_style($style, str_repeat(' ', $width).PHP_EOL);
- echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT).PHP_EOL);
- echo_style($style, str_pad($message, $width, ' ', STR_PAD_RIGHT).PHP_EOL);
- echo_style($style, str_repeat(' ', $width).PHP_EOL);
-}
-
-function has_color_support()
-{
- static $support;
-
- if (null === $support) {
- if (DIRECTORY_SEPARATOR == '\\') {
- $support = false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI');
- } else {
- $support = function_exists('posix_isatty') && @posix_isatty(STDOUT);
- }
- }
-
- return $support;
-}
diff --git a/app/config/config.yml b/app/config/config.yml
deleted file mode 100755
index ab90588..0000000
--- a/app/config/config.yml
+++ /dev/null
@@ -1,59 +0,0 @@
-imports:
- - { resource: parameters.yml }
- - { resource: security.yml }
- - { resource: services.yml }
-
-framework:
- #esi: ~
- #translator: { fallbacks: ["%locale%"] }
- secret: "%secret%"
- router:
- resource: "%kernel.root_dir%/config/routing.yml"
- strict_requirements: ~
- form: ~
- csrf_protection: ~
- validation: { enable_annotations: true }
- templating:
- engines: ['twig']
- #assets_version: SomeVersionScheme
- default_locale: "%locale%"
- trusted_hosts: ~
- session:
- # handler_id set to null will use default session handler from php.ini
- handler_id: ~
- fragments: ~
- http_method_override: true
-
-# Twig Configuration
-twig:
- debug: "%kernel.debug%"
- strict_variables: "%kernel.debug%"
-
-# Doctrine Configuration
-doctrine:
- dbal:
- driver: "%database_driver%"
- host: "%database_host%"
- port: "%database_port%"
- dbname: "%database_name%"
- user: "%database_user%"
- password: "%database_password%"
- charset: UTF8
- # if using pdo_sqlite as your database driver:
- # 1. add the path in parameters.yml
- # e.g. database_path: "%kernel.root_dir%/data/data.db3"
- # 2. Uncomment database_path in parameters.yml.dist
- # 3. Uncomment next line:
- # path: "%database_path%"
-
- orm:
- auto_generate_proxy_classes: "%kernel.debug%"
- auto_mapping: true
-
-gos_web_socket:
- server:
- port: 1337 #The port the socket server will listen on
- host: 127.0.0.1 #The host ip to bind to
- router:
- resources:
- - '@AppBundle/Resources/config/pubsub/routing.yml'
diff --git a/app/config/config_test.yml b/app/config/config_test.yml
deleted file mode 100755
index e5f0415..0000000
--- a/app/config/config_test.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-imports:
- - { resource: config_dev.yml }
-
-framework:
- test: ~
- session:
- storage_id: session.storage.mock_file
- profiler:
- collect: false
-
-web_profiler:
- toolbar: false
- intercept_redirects: false
diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist
deleted file mode 100755
index 1da778f..0000000
--- a/app/config/parameters.yml.dist
+++ /dev/null
@@ -1,20 +0,0 @@
-# This file is a "template" of what your parameters.yml file should look like
-parameters:
- database_driver: pdo_mysql
- database_host: 127.0.0.1
- database_port: ~
- database_name: symfony
- database_user: root
- database_password: ~
- # You should uncomment this if you want use pdo_sqlite
- # database_path: "%kernel.root_dir%/data.db3"
-
- mailer_transport: smtp
- mailer_host: 127.0.0.1
- mailer_user: ~
- mailer_password: ~
-
- locale: en
-
- # A secret key that's used to generate certain security-related tokens
- secret: ThisTokenIsNotSoSecretChangeIt
diff --git a/app/config/routing.yml b/app/config/routing.yml
deleted file mode 100755
index 8eadc31..0000000
--- a/app/config/routing.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-app:
- resource: "@AppBundle/Controller/"
- type: annotation
diff --git a/app/config/security.yml b/app/config/security.yml
deleted file mode 100755
index b891000..0000000
--- a/app/config/security.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-security:
- providers:
- in_memory:
- memory: ~
-
- firewalls:
- dev:
- pattern: ^/(_(profiler|wdt|error)|css|images|js)/
- security: false
-
- default:
- anonymous: ~
diff --git a/app/config/services.yml b/app/config/services.yml
deleted file mode 100755
index 5c76fc5..0000000
--- a/app/config/services.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-# Learn more about services, parameters and containers at
-# http://symfony.com/doc/current/book/service_container.html
-parameters:
-# parameter_name: value
-
-services:
-# service_name:
-# class: AppBundle\Directory\ClassName
-# arguments: ["@another_service_name", "plain_value", "%parameter_name%"]
diff --git a/app/console b/app/console
deleted file mode 100755
index 1619a70..0000000
--- a/app/console
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env php
-getParameterOption(['--env', '-e'], getenv('SYMFONY_ENV') ?: 'dev');
-$debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(['--no-debug', '']) && $env !== 'prod';
-if ($debug) {
- Debug::enable();
-}
-$kernel = new AppKernel($env, $debug);
-$application = new Application($kernel);
-$application->run($input);
diff --git a/composer.json b/composer.json
index 92a1dd9..2779739 100755
--- a/composer.json
+++ b/composer.json
@@ -1,64 +1,105 @@
{
- "name": "symfony/framework-standard-edition",
- "license": "MIT",
- "type": "project",
- "description": "The \"Symfony Standard Edition\" distribution",
- "autoload": {
- "psr-4": { "": "src/" },
- "classmap": [ "app/AppKernel.php", "app/AppCache.php" ]
+ "name": "ggos/web-socket-bundle-demo",
+ "license": "MIT",
+ "type": "project",
+ "description": "This is a symfony 4 demo of ggos/web-socket-bundle",
+ "authors": [
+ {
+ "name": "Jeremy Dare",
+ "email": "jeremy.d.dare@gmail.com"
},
- "require": {
- "php": ">=5.5",
- "symfony/symfony": "^4.0",
- "doctrine/orm": "^2.5",
- "doctrine/doctrine-bundle": "^1.6",
- "doctrine/doctrine-cache-bundle": "^1.2",
- "twig/extensions": "^1.2",
- "symfony/swiftmailer-bundle": "^2.3",
- "gos/web-socket-bundle": "=1.8.12-rc1",
- "symfony/monolog-bundle": "^3.1",
- "symfony/console": "^4.0"
+ {
+ "name": "Johann Saunier",
+ "email": "johann_27@hotmail.fr"
},
- "require-dev": {
- "symfony/debug": "^4.0"
- },
- "scripts": {
- "post-root-package-install": [
- "SymfonyStandard\\Composer::hookRootPackageInstall"
- ],
- "post-install-cmd": [
- "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::removeSymfonyStandardFiles",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
- ],
- "post-update-cmd": [
- "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::removeSymfonyStandardFiles",
- "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
- ]
+ {
+ "name": "Mathieu Delisle",
+ "email": "mathieu@delisle.com",
+ "homepage": "https://github.com/Webonaute",
+ "role": "Contributor"
+ }
+ ],
+ "autoload": {
+ "psr-4": {
+ "App\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Tests\\": "tests/"
+ }
+ },
+ "repositories": [
+ {
+ "type": "vcs",
+ "url": "https://github.com/Webonaute/WebSocketBundle.git"
+ }
+ ],
+ "require": {
+ "php": ">=7.2",
+ "doctrine/doctrine-bundle": "^1.6",
+ "doctrine/doctrine-cache-bundle": "^1.2",
+ "doctrine/orm": "^2.5",
+ "gos/web-socket-bundle": "dev-master",
+ "symfony/asset": "^4.1",
+ "symfony/console": "^4.0",
+ "symfony/flex": "^1.0",
+ "symfony/form": "^4.1",
+ "symfony/monolog-bundle": "^3.1",
+ "symfony/security": "^4.1",
+ "symfony/security-bundle": "^4.1",
+ "symfony/swiftmailer-bundle": "3.2.*",
+ "symfony/templating": "^4.1",
+ "symfony/twig-bridge": "^4.1",
+ "symfony/twig-bundle": "^4.1",
+ "symfony/validator": "^4.1",
+ "twig/extensions": "^1.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0",
+ "symfony/debug": "^4.0",
+ "symfony/debug-pack": "^1.0",
+ "symfony/dotenv": "^4.0",
+ "symfony/maker-bundle": "^1.4",
+ "symfony/phpunit-bridge": "^4.0",
+ "symfony/web-profiler-bundle": "^4.0",
+ "symfony/web-server-bundle": "^4.1"
+ },
+ "scripts": {
+ "auto-scripts": {
+ "cache:clear": "symfony-cmd",
+ "assets:install %PUBLIC_DIR%": "symfony-cmd"
},
- "config": {
- "bin-dir": "bin"
+ "post-install-cmd": [
+ "@auto-scripts"
+ ],
+ "post-update-cmd": [
+ "@auto-scripts"
+ ]
+ },
+ "config": {
+ "bin-dir": "bin",
+ "discard-changes": true,
+ "sort-packages": true,
+ "preferred-install": {
+ "*": "dist"
+ }
+ },
+ "prefer-stable": true,
+ "minimum-stability": "RC",
+ "extra": {
+ "symfony": {
+ "allow-contrib": true
},
- "prefer-stable": true,
- "minimum-stability": "RC",
- "extra": {
- "symfony-app-dir": "app",
- "symfony-web-dir": "web",
- "symfony-assets-install": "relative",
- "incenteev-parameters": {
- "file": "app/config/parameters.yml"
- },
- "branch-alias": {
- "dev-master": "2.6-dev"
- }
+ "symfony-web-dir": "public",
+ "symfony-var-dir": "var",
+ "symfony-bin-dir": "bin",
+ "symfony-assets-install": "hard",
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
}
+ },
+ "conflict": {
+ "symfony/symfony": "*"
+ }
}
diff --git a/composer.lock b/composer.lock
index 20a7c07..3f333d7 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1,10 +1,10 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "b086111426478b91faf02460d39120c4",
+ "content-hash": "b8e728083fd0eb95fd07071ae77e650f",
"packages": [
{
"name": "cboden/ratchet",
@@ -343,16 +343,16 @@
},
{
"name": "doctrine/dbal",
- "version": "v2.6.3",
+ "version": "v2.7.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
- "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13"
+ "reference": "11037b4352c008373561dc6fc836834eed80c3b5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/dbal/zipball/e3eed9b1facbb0ced3a0995244843a189e7d1b13",
- "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/11037b4352c008373561dc6fc836834eed80c3b5",
+ "reference": "11037b4352c008373561dc6fc836834eed80c3b5",
"shasum": ""
},
"require": {
@@ -361,9 +361,11 @@
"php": "^7.1"
},
"require-dev": {
- "phpunit/phpunit": "^5.4.6",
+ "doctrine/coding-standard": "^4.0",
+ "phpunit/phpunit": "^7.0",
"phpunit/phpunit-mock-objects": "!=3.2.4,!=3.2.5",
- "symfony/console": "2.*||^3.0"
+ "symfony/console": "^2.0.5||^3.0",
+ "symfony/phpunit-bridge": "^3.4.5|^4.0.5"
},
"suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files."
@@ -374,7 +376,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.6.x-dev"
+ "dev-master": "2.7.x-dev"
}
},
"autoload": {
@@ -412,20 +414,20 @@
"persistence",
"queryobject"
],
- "time": "2017-11-19T13:38:54+00:00"
+ "time": "2018-04-07T18:44:18+00:00"
},
{
"name": "doctrine/doctrine-bundle",
- "version": "1.8.1",
+ "version": "1.9.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/DoctrineBundle.git",
- "reference": "eb6e4fb904a459be28872765ab6e2d246aac7c87"
+ "reference": "703fad32e4c8cbe609caf45a71a1d4266c830f0f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/eb6e4fb904a459be28872765ab6e2d246aac7c87",
- "reference": "eb6e4fb904a459be28872765ab6e2d246aac7c87",
+ "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/703fad32e4c8cbe609caf45a71a1d4266c830f0f",
+ "reference": "703fad32e4c8cbe609caf45a71a1d4266c830f0f",
"shasum": ""
},
"require": {
@@ -436,13 +438,13 @@
"symfony/console": "~2.7|~3.0|~4.0",
"symfony/dependency-injection": "~2.7|~3.0|~4.0",
"symfony/doctrine-bridge": "~2.7|~3.0|~4.0",
- "symfony/framework-bundle": "~2.7|~3.0|~4.0"
+ "symfony/framework-bundle": "^2.7.22|~3.0|~4.0"
},
"conflict": {
"symfony/http-foundation": "<2.6"
},
"require-dev": {
- "doctrine/orm": "~2.3",
+ "doctrine/orm": "~2.4",
"phpunit/phpunit": "^4.8.36|^5.7|^6.4",
"satooshi/php-coveralls": "^1.0",
"symfony/phpunit-bridge": "~2.7|~3.0|~4.0",
@@ -497,43 +499,43 @@
"orm",
"persistence"
],
- "time": "2017-11-24T13:09:19+00:00"
+ "time": "2018-04-19T14:07:39+00:00"
},
{
"name": "doctrine/doctrine-cache-bundle",
- "version": "1.3.2",
+ "version": "1.3.3",
"source": {
"type": "git",
"url": "https://github.com/doctrine/DoctrineCacheBundle.git",
- "reference": "9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1"
+ "reference": "4c8e363f96427924e7e519c5b5119b4f54512697"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1",
- "reference": "9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1",
+ "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/4c8e363f96427924e7e519c5b5119b4f54512697",
+ "reference": "4c8e363f96427924e7e519c5b5119b4f54512697",
"shasum": ""
},
"require": {
"doctrine/cache": "^1.4.2",
"doctrine/inflector": "~1.0",
"php": ">=5.3.2",
- "symfony/doctrine-bridge": "~2.2|~3.0|~4.0"
+ "symfony/doctrine-bridge": "~2.7|~3.3|~4.0"
},
"require-dev": {
"instaclick/coding-standard": "~1.1",
"instaclick/object-calisthenics-sniffs": "dev-master",
"instaclick/symfony2-coding-standard": "dev-remaster",
- "phpunit/phpunit": "~4",
+ "phpunit/phpunit": "~4|~5",
"predis/predis": "~0.8",
"satooshi/php-coveralls": "^1.0",
"squizlabs/php_codesniffer": "~1.5",
- "symfony/console": "~2.2|~3.0|~4.0",
- "symfony/finder": "~2.2|~3.0|~4.0",
- "symfony/framework-bundle": "~2.2|~3.0|~4.0",
- "symfony/phpunit-bridge": "~2.7|~3.0|~4.0",
- "symfony/security-acl": "~2.3|~3.0",
- "symfony/validator": "~2.2|~3.0|~4.0",
- "symfony/yaml": "~2.2|~3.0|~4.0"
+ "symfony/console": "~2.7|~3.3|~4.0",
+ "symfony/finder": "~2.7|~3.3|~4.0",
+ "symfony/framework-bundle": "~2.7|~3.3|~4.0",
+ "symfony/phpunit-bridge": "~2.7|~3.3|~4.0",
+ "symfony/security-acl": "~2.7|~3.3",
+ "symfony/validator": "~2.7|~3.3|~4.0",
+ "symfony/yaml": "~2.7|~3.3|~4.0"
},
"suggest": {
"symfony/security-acl": "For using this bundle to cache ACLs"
@@ -585,7 +587,7 @@
"cache",
"caching"
],
- "time": "2017-10-12T17:23:29+00:00"
+ "time": "2018-03-27T09:22:12+00:00"
},
{
"name": "doctrine/inflector",
@@ -764,16 +766,16 @@
},
{
"name": "doctrine/orm",
- "version": "v2.6.0",
+ "version": "v2.6.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/doctrine2.git",
- "reference": "374e7ace49d864dad8cddbc55346447c8a6a2083"
+ "reference": "87ee409783a4a322b5597ebaae558661404055a7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/374e7ace49d864dad8cddbc55346447c8a6a2083",
- "reference": "374e7ace49d864dad8cddbc55346447c8a6a2083",
+ "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/87ee409783a4a322b5597ebaae558661404055a7",
+ "reference": "87ee409783a4a322b5597ebaae558661404055a7",
"shasum": ""
},
"require": {
@@ -842,37 +844,43 @@
"database",
"orm"
],
- "time": "2017-12-20T00:38:15+00:00"
+ "time": "2018-02-27T07:30:56+00:00"
},
{
- "name": "evenement/evenement",
- "version": "v2.1.0",
+ "name": "egulias/email-validator",
+ "version": "2.1.4",
"source": {
"type": "git",
- "url": "https://github.com/igorw/evenement.git",
- "reference": "6ba9a777870ab49f417e703229d53931ed40fd7a"
+ "url": "https://github.com/egulias/EmailValidator.git",
+ "reference": "8790f594151ca6a2010c6218e09d96df67173ad3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/igorw/evenement/zipball/6ba9a777870ab49f417e703229d53931ed40fd7a",
- "reference": "6ba9a777870ab49f417e703229d53931ed40fd7a",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/8790f594151ca6a2010c6218e09d96df67173ad3",
+ "reference": "8790f594151ca6a2010c6218e09d96df67173ad3",
"shasum": ""
},
"require": {
- "php": ">=5.4.0"
+ "doctrine/lexer": "^1.0.1",
+ "php": ">= 5.5"
},
"require-dev": {
- "phpunit/phpunit": "^6.0||^5.7||^4.8.35"
+ "dominicsayers/isemail": "dev-master",
+ "phpunit/phpunit": "^4.8.35||^5.7||^6.0",
+ "satooshi/php-coveralls": "^1.0.1"
+ },
+ "suggest": {
+ "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-master": "2.0.x-dev"
}
},
"autoload": {
- "psr-0": {
- "Evenement": "src"
+ "psr-4": {
+ "Egulias\\EmailValidator\\": "EmailValidator"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -881,48 +889,44 @@
],
"authors": [
{
- "name": "Igor Wiedler",
- "email": "igor@wiedler.ch"
+ "name": "Eduardo Gulias Davis"
}
],
- "description": "Événement is a very simple event dispatching library for PHP",
+ "description": "A library for validating emails against several RFCs",
+ "homepage": "https://github.com/egulias/EmailValidator",
"keywords": [
- "event-dispatcher",
- "event-emitter"
+ "email",
+ "emailvalidation",
+ "emailvalidator",
+ "validation",
+ "validator"
],
- "time": "2017-07-17T17:39:19+00:00"
+ "time": "2018-04-10T10:11:19+00:00"
},
{
- "name": "fig/link-util",
- "version": "1.0.0",
+ "name": "evenement/evenement",
+ "version": "v3.0.1",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/link-util.git",
- "reference": "1a07821801a148be4add11ab0603e4af55a72fac"
+ "url": "https://github.com/igorw/evenement.git",
+ "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac",
- "reference": "1a07821801a148be4add11ab0603e4af55a72fac",
+ "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
+ "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
"shasum": ""
},
"require": {
- "php": ">=5.5.0",
- "psr/link": "~1.0@dev"
+ "php": ">=7.0"
},
"require-dev": {
- "phpunit/phpunit": "^5.1",
- "squizlabs/php_codesniffer": "^2.3.1"
+ "phpunit/phpunit": "^6.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
"autoload": {
- "psr-4": {
- "Fig\\Link\\": "src/"
+ "psr-0": {
+ "Evenement": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -931,39 +935,35 @@
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
}
],
- "description": "Common utility implementations for HTTP links",
+ "description": "Événement is a very simple event dispatching library for PHP",
"keywords": [
- "http",
- "http-link",
- "link",
- "psr",
- "psr-13",
- "rest"
+ "event-dispatcher",
+ "event-emitter"
],
- "time": "2016-10-17T18:31:11+00:00"
+ "time": "2017-07-23T21:35:13+00:00"
},
{
"name": "gos/pnctl-event-loop-emitter",
- "version": "v0.1.5",
+ "version": "v0.1.7",
"source": {
"type": "git",
"url": "https://github.com/GeniusesOfSymfony/PNCTLEventLoopEmitter.git",
- "reference": "279a4b54cdef447b0912189e0d736cc3d25ce6c9"
+ "reference": "93bb0f0e60e4e1f4025f77c8a4fd9ae0c3b45fb3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GeniusesOfSymfony/PNCTLEventLoopEmitter/zipball/279a4b54cdef447b0912189e0d736cc3d25ce6c9",
- "reference": "279a4b54cdef447b0912189e0d736cc3d25ce6c9",
+ "url": "https://api.github.com/repos/GeniusesOfSymfony/PNCTLEventLoopEmitter/zipball/93bb0f0e60e4e1f4025f77c8a4fd9ae0c3b45fb3",
+ "reference": "93bb0f0e60e4e1f4025f77c8a4fd9ae0c3b45fb3",
"shasum": ""
},
"require": {
- "evenement/evenement": "~2.0",
- "php": ">=5.3",
- "react/event-loop": "~0.4.0"
+ "evenement/evenement": "~2.0|~3.0",
+ "php": ">=5.4",
+ "react/event-loop": "~0.4.0|^0.5"
},
"type": "library",
"extra": {
@@ -996,20 +996,20 @@
"event loop",
"reactphp"
],
- "time": "2016-05-06T15:19:39+00:00"
+ "time": "2018-04-09T11:12:07+00:00"
},
{
"name": "gos/pubsub-router-bundle",
- "version": "v0.3.2",
+ "version": "v0.3.4",
"source": {
"type": "git",
"url": "https://github.com/GeniusesOfSymfony/PubSubRouterBundle.git",
- "reference": "9ab694a76b71f69acd5ea48f8dc4b9b1138a5c24"
+ "reference": "58ea6c65d603653776bd034748c6ea4e58596f60"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GeniusesOfSymfony/PubSubRouterBundle/zipball/9ab694a76b71f69acd5ea48f8dc4b9b1138a5c24",
- "reference": "9ab694a76b71f69acd5ea48f8dc4b9b1138a5c24",
+ "url": "https://api.github.com/repos/GeniusesOfSymfony/PubSubRouterBundle/zipball/58ea6c65d603653776bd034748c6ea4e58596f60",
+ "reference": "58ea6c65d603653776bd034748c6ea4e58596f60",
"shasum": ""
},
"require": {
@@ -1051,20 +1051,20 @@
"redis",
"zmq"
],
- "time": "2017-12-12T16:12:53+00:00"
+ "time": "2018-05-21T12:14:35+00:00"
},
{
"name": "gos/web-socket-bundle",
- "version": "v1.8.12-rc1",
+ "version": "dev-master",
"source": {
"type": "git",
- "url": "https://github.com/GeniusesOfSymfony/WebSocketBundle.git",
- "reference": "d8c11a159097c276e104b459e46bec9b64faaaf6"
+ "url": "https://github.com/Webonaute/WebSocketBundle.git",
+ "reference": "15174761596ebe9fb58d037ec144822531922f66"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GeniusesOfSymfony/WebSocketBundle/zipball/d8c11a159097c276e104b459e46bec9b64faaaf6",
- "reference": "d8c11a159097c276e104b459e46bec9b64faaaf6",
+ "url": "https://api.github.com/repos/Webonaute/WebSocketBundle/zipball/15174761596ebe9fb58d037ec144822531922f66",
+ "reference": "15174761596ebe9fb58d037ec144822531922f66",
"shasum": ""
},
"require": {
@@ -1097,7 +1097,6 @@
"Gos\\Bundle\\WebSocketBundle\\": ""
}
},
- "notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
@@ -1114,13 +1113,16 @@
"description": "Symfony Web Socket Bundle",
"homepage": "https://github.com/GeniusesOfSymfony/WebSocketBundle",
"keywords": [
+ "IO",
"Ratchet",
"WAMP",
"Web Socket Bundle",
- "io",
- "websocket"
+ "Websocket"
],
- "time": "2018-01-22T15:54:36+00:00"
+ "support": {
+ "source": "https://github.com/Webonaute/WebSocketBundle/tree/v1.8.12"
+ },
+ "time": "2018-03-08T20:37:00+00:00"
},
{
"name": "gos/websocket-client",
@@ -1367,27 +1369,27 @@
},
{
"name": "ocramius/package-versions",
- "version": "1.2.0",
+ "version": "1.3.0",
"source": {
"type": "git",
"url": "https://github.com/Ocramius/PackageVersions.git",
- "reference": "ad8a245decad4897cc6b432743913dad0d69753c"
+ "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/ad8a245decad4897cc6b432743913dad0d69753c",
- "reference": "ad8a245decad4897cc6b432743913dad0d69753c",
+ "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f",
+ "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f",
"shasum": ""
},
"require": {
- "composer-plugin-api": "^1.0",
- "php": "~7.0"
+ "composer-plugin-api": "^1.0.0",
+ "php": "^7.1.0"
},
"require-dev": {
- "composer/composer": "^1.3",
+ "composer/composer": "^1.6.3",
"ext-zip": "*",
- "humbug/humbug": "dev-master",
- "phpunit/phpunit": "^6.4"
+ "infection/infection": "^0.7.1",
+ "phpunit/phpunit": "^7.0.0"
},
"type": "composer-plugin",
"extra": {
@@ -1412,7 +1414,7 @@
}
],
"description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
- "time": "2017-11-24T11:07:03+00:00"
+ "time": "2018-02-05T13:05:30+00:00"
},
{
"name": "ocramius/proxy-manager",
@@ -1629,55 +1631,6 @@
],
"time": "2016-08-06T14:39:51+00:00"
},
- {
- "name": "psr/link",
- "version": "1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/link.git",
- "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562",
- "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Link\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interfaces for HTTP links",
- "keywords": [
- "http",
- "http-link",
- "link",
- "psr",
- "psr-13",
- "rest"
- ],
- "time": "2016-10-28T16:06:13+00:00"
- },
{
"name": "psr/log",
"version": "1.0.2",
@@ -1727,16 +1680,16 @@
},
{
"name": "psr/simple-cache",
- "version": "1.0.0",
+ "version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/simple-cache.git",
- "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24"
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24",
- "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
"shasum": ""
},
"require": {
@@ -1771,20 +1724,20 @@
"psr-16",
"simple-cache"
],
- "time": "2017-01-02T13:31:39+00:00"
+ "time": "2017-10-23T01:57:42+00:00"
},
{
"name": "ratchet/rfc6455",
- "version": "v0.2.3",
+ "version": "0.2.4",
"source": {
"type": "git",
"url": "https://github.com/ratchetphp/RFC6455.git",
- "reference": "cc8a1a46a703ce01de10fdb5fab387381b66edc8"
+ "reference": "1612f528c3496ad06e910d0f8b6f16ab97696706"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ratchetphp/RFC6455/zipball/cc8a1a46a703ce01de10fdb5fab387381b66edc8",
- "reference": "cc8a1a46a703ce01de10fdb5fab387381b66edc8",
+ "url": "https://api.github.com/repos/ratchetphp/RFC6455/zipball/1612f528c3496ad06e910d0f8b6f16ab97696706",
+ "reference": "1612f528c3496ad06e910d0f8b6f16ab97696706",
"shasum": ""
},
"require": {
@@ -1820,7 +1773,7 @@
"rfc6455",
"websocket"
],
- "time": "2017-09-13T13:49:42+00:00"
+ "time": "2018-05-02T14:52:00+00:00"
},
{
"name": "react/cache",
@@ -1864,16 +1817,16 @@
},
{
"name": "react/dns",
- "version": "v0.4.12",
+ "version": "v0.4.13",
"source": {
"type": "git",
"url": "https://github.com/reactphp/dns.git",
- "reference": "c74a0af0c7254e73600fd8c5c95f6bf23c5998f4"
+ "reference": "7d1e08c300fd7de600810883386ee5e2a64898f4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/dns/zipball/c74a0af0c7254e73600fd8c5c95f6bf23c5998f4",
- "reference": "c74a0af0c7254e73600fd8c5c95f6bf23c5998f4",
+ "url": "https://api.github.com/repos/reactphp/dns/zipball/7d1e08c300fd7de600810883386ee5e2a64898f4",
+ "reference": "7d1e08c300fd7de600810883386ee5e2a64898f4",
"shasum": ""
},
"require": {
@@ -1882,7 +1835,6 @@
"react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5",
"react/promise": "^2.1 || ^1.2.1",
"react/promise-timer": "^1.2",
- "react/socket": "^1.0 || ^0.8 || ^0.7 || ^0.6 || ^0.5 || ^0.4.4",
"react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.5"
},
"require-dev": {
@@ -1906,32 +1858,31 @@
"dns-resolver",
"reactphp"
],
- "time": "2018-01-14T10:04:36+00:00"
+ "time": "2018-02-27T12:51:22+00:00"
},
{
"name": "react/event-loop",
- "version": "v0.4.3",
+ "version": "v0.5.2",
"source": {
"type": "git",
"url": "https://github.com/reactphp/event-loop.git",
- "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f"
+ "reference": "e94985d93c689c554265b01014f8c3064921ca27"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/event-loop/zipball/8bde03488ee897dc6bb3d91e4e17c353f9c5252f",
- "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f",
+ "url": "https://api.github.com/repos/reactphp/event-loop/zipball/e94985d93c689c554265b01014f8c3064921ca27",
+ "reference": "e94985d93c689c554265b01014f8c3064921ca27",
"shasum": ""
},
"require": {
- "php": ">=5.4.0"
+ "php": ">=5.3.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.8"
+ "phpunit/phpunit": "~4.8.35 || ^5.7 || ^6.4"
},
"suggest": {
- "ext-event": "~1.0",
- "ext-libev": "*",
- "ext-libevent": ">=0.1.0"
+ "ext-event": "~1.0 for ExtEventLoop",
+ "ext-pcntl": "For signal handling support when using the StreamSelectLoop"
},
"type": "library",
"autoload": {
@@ -1943,12 +1894,12 @@
"license": [
"MIT"
],
- "description": "Event loop abstraction layer that libraries can use for evented I/O.",
+ "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
"keywords": [
"asynchronous",
"event-loop"
],
- "time": "2017-04-27T10:56:23+00:00"
+ "time": "2018-04-24T11:23:06+00:00"
},
{
"name": "react/promise",
@@ -1998,16 +1949,16 @@
},
{
"name": "react/promise-timer",
- "version": "v1.2.1",
+ "version": "v1.3.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/promise-timer.git",
- "reference": "9b4cd9cbe7457e0d87fe8aa7ccceab8a2c830fbd"
+ "reference": "604513e33feb96ffb0dfb3d25233d3f9f0dce356"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/9b4cd9cbe7457e0d87fe8aa7ccceab8a2c830fbd",
- "reference": "9b4cd9cbe7457e0d87fe8aa7ccceab8a2c830fbd",
+ "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/604513e33feb96ffb0dfb3d25233d3f9f0dce356",
+ "reference": "604513e33feb96ffb0dfb3d25233d3f9f0dce356",
"shasum": ""
},
"require": {
@@ -2047,26 +1998,26 @@
"timeout",
"timer"
],
- "time": "2017-12-22T15:41:41+00:00"
+ "time": "2018-04-24T14:19:26+00:00"
},
{
"name": "react/socket",
- "version": "v0.8.9",
+ "version": "v0.8.11",
"source": {
"type": "git",
"url": "https://github.com/reactphp/socket.git",
- "reference": "9db38c58cbb1343bbe6523d1b930a40d0e110839"
+ "reference": "94e98bb4def7054454784b330e44f73b7f6c160f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/socket/zipball/9db38c58cbb1343bbe6523d1b930a40d0e110839",
- "reference": "9db38c58cbb1343bbe6523d1b930a40d0e110839",
+ "url": "https://api.github.com/repos/reactphp/socket/zipball/94e98bb4def7054454784b330e44f73b7f6c160f",
+ "reference": "94e98bb4def7054454784b330e44f73b7f6c160f",
"shasum": ""
},
"require": {
"evenement/evenement": "^3.0 || ^2.0 || ^1.0",
"php": ">=5.3.0",
- "react/dns": "^0.4.11",
+ "react/dns": "^0.4.13",
"react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5",
"react/promise": "^2.1 || ^1.2",
"react/promise-timer": "~1.0",
@@ -2094,7 +2045,7 @@
"reactphp",
"stream"
],
- "time": "2018-01-18T11:29:21+00:00"
+ "time": "2018-04-24T14:07:53+00:00"
},
{
"name": "react/stream",
@@ -2144,29 +2095,30 @@
},
{
"name": "swiftmailer/swiftmailer",
- "version": "v5.4.9",
+ "version": "v6.0.2",
"source": {
"type": "git",
"url": "https://github.com/swiftmailer/swiftmailer.git",
- "reference": "7ffc1ea296ed14bf8260b6ef11b80208dbadba91"
+ "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91",
- "reference": "7ffc1ea296ed14bf8260b6ef11b80208dbadba91",
+ "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/412333372fb6c8ffb65496a2bbd7321af75733fc",
+ "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "egulias/email-validator": "~2.0",
+ "php": ">=7.0.0"
},
"require-dev": {
"mockery/mockery": "~0.9.1",
- "symfony/phpunit-bridge": "~3.2"
+ "symfony/phpunit-bridge": "~3.3@dev"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.4-dev"
+ "dev-master": "6.0-dev"
}
},
"autoload": {
@@ -2188,50 +2140,47 @@
}
],
"description": "Swiftmailer, free feature-rich PHP mailer",
- "homepage": "https://swiftmailer.symfony.com",
+ "homepage": "http://swiftmailer.symfony.com",
"keywords": [
"email",
"mail",
"mailer"
],
- "time": "2018-01-23T07:37:21+00:00"
+ "time": "2017-09-30T22:39:41+00:00"
},
{
- "name": "symfony/monolog-bundle",
- "version": "v3.1.2",
+ "name": "symfony/asset",
+ "version": "v4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/monolog-bundle.git",
- "reference": "2b41b8b6d2c6edb1a5494f02f8e4129be2a44784"
+ "url": "https://github.com/symfony/asset.git",
+ "reference": "73358508628c10832e87c3ff18db527d48387afc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/2b41b8b6d2c6edb1a5494f02f8e4129be2a44784",
- "reference": "2b41b8b6d2c6edb1a5494f02f8e4129be2a44784",
+ "url": "https://api.github.com/repos/symfony/asset/zipball/73358508628c10832e87c3ff18db527d48387afc",
+ "reference": "73358508628c10832e87c3ff18db527d48387afc",
"shasum": ""
},
"require": {
- "monolog/monolog": "~1.22",
- "php": ">=5.3.2",
- "symfony/config": "~2.7|~3.0|~4.0",
- "symfony/dependency-injection": "~2.7|~3.0|~4.0",
- "symfony/http-kernel": "~2.7|~3.0|~4.0",
- "symfony/monolog-bridge": "~2.7|~3.0|~4.0"
+ "php": "^7.1.3"
},
"require-dev": {
- "symfony/console": "~2.3|~3.0|~4.0",
- "symfony/phpunit-bridge": "^3.3|^4.0",
- "symfony/yaml": "~2.3|~3.0|~4.0"
+ "symfony/http-foundation": "~3.4|~4.0",
+ "symfony/http-kernel": "~3.4|~4.0"
},
- "type": "symfony-bundle",
+ "suggest": {
+ "symfony/http-foundation": ""
+ },
+ "type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.x-dev"
+ "dev-master": "4.1-dev"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Bundle\\MonologBundle\\": ""
+ "Symfony\\Component\\Asset\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -2242,53 +2191,64 @@
"MIT"
],
"authors": [
- {
- "name": "Symfony Community",
- "homepage": "http://symfony.com/contributors"
- },
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony MonologBundle",
- "homepage": "http://symfony.com",
- "keywords": [
- "log",
- "logging"
- ],
- "time": "2017-11-06T16:02:17+00:00"
+ "description": "Symfony Asset Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-30T07:26:09+00:00"
},
{
- "name": "symfony/polyfill-intl-icu",
- "version": "v1.6.0",
+ "name": "symfony/cache",
+ "version": "v4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-intl-icu.git",
- "reference": "d2bb2ef00dd8605d6fbd4db53ed4af1395953497"
+ "url": "https://github.com/symfony/cache.git",
+ "reference": "4986efce97c002e58380e8c0474acbf72eda9339"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d2bb2ef00dd8605d6fbd4db53ed4af1395953497",
- "reference": "d2bb2ef00dd8605d6fbd4db53ed4af1395953497",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/4986efce97c002e58380e8c0474acbf72eda9339",
+ "reference": "4986efce97c002e58380e8c0474acbf72eda9339",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
- "symfony/intl": "~2.3|~3.0|~4.0"
+ "php": "^7.1.3",
+ "psr/cache": "~1.0",
+ "psr/log": "~1.0",
+ "psr/simple-cache": "^1.0"
},
- "suggest": {
- "ext-intl": "For best performance"
+ "conflict": {
+ "symfony/var-dumper": "<3.4"
+ },
+ "provide": {
+ "psr/cache-implementation": "1.0",
+ "psr/simple-cache-implementation": "1.0"
+ },
+ "require-dev": {
+ "cache/integration-tests": "dev-master",
+ "doctrine/cache": "~1.6",
+ "doctrine/dbal": "~2.4",
+ "predis/predis": "~1.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.6-dev"
+ "dev-master": "4.1-dev"
}
},
"autoload": {
- "files": [
- "bootstrap.php"
+ "psr-4": {
+ "Symfony\\Component\\Cache\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2305,50 +2265,57 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for intl's ICU-related data and classes",
+ "description": "Symfony Cache component with PSR-6, PSR-16, and tags",
"homepage": "https://symfony.com",
"keywords": [
- "compatibility",
- "icu",
- "intl",
- "polyfill",
- "portable",
- "shim"
+ "caching",
+ "psr6"
],
- "time": "2017-10-11T12:05:26+00:00"
+ "time": "2018-05-16T14:33:22+00:00"
},
{
- "name": "symfony/polyfill-mbstring",
- "version": "v1.6.0",
+ "name": "symfony/config",
+ "version": "v4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296"
+ "url": "https://github.com/symfony/config.git",
+ "reference": "5ceefc256caecc3e25147c4e5b933de71d0020c4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296",
- "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296",
+ "url": "https://api.github.com/repos/symfony/config/zipball/5ceefc256caecc3e25147c4e5b933de71d0020c4",
+ "reference": "5ceefc256caecc3e25147c4e5b933de71d0020c4",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": "^7.1.3",
+ "symfony/filesystem": "~3.4|~4.0",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/finder": "<3.4"
+ },
+ "require-dev": {
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/event-dispatcher": "~3.4|~4.0",
+ "symfony/finder": "~3.4|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
},
"suggest": {
- "ext-mbstring": "For best performance"
+ "symfony/yaml": "To use the yaml reference dumper"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.6-dev"
+ "dev-master": "4.1-dev"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
+ "Symfony\\Component\\Config\\": ""
},
- "files": [
- "bootstrap.php"
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2357,54 +2324,66 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for the Mbstring extension",
+ "description": "Symfony Config Component",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "mbstring",
- "polyfill",
- "portable",
- "shim"
- ],
- "time": "2017-10-11T12:05:26+00:00"
+ "time": "2018-05-16T14:33:22+00:00"
},
{
- "name": "symfony/polyfill-php72",
- "version": "v1.6.0",
+ "name": "symfony/console",
+ "version": "v4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php72.git",
- "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254"
+ "url": "https://github.com/symfony/console.git",
+ "reference": "2d5d973bf9933d46802b01010bd25c800c87c242"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/6de4f4884b97abbbed9f0a84a95ff2ff77254254",
- "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254",
+ "url": "https://api.github.com/repos/symfony/console/zipball/2d5d973bf9933d46802b01010bd25c800c87c242",
+ "reference": "2d5d973bf9933d46802b01010bd25c800c87c242",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": "^7.1.3",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.4",
+ "symfony/process": "<3.3"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/event-dispatcher": "~3.4|~4.0",
+ "symfony/lock": "~3.4|~4.0",
+ "symfony/process": "~3.4|~4.0"
+ },
+ "suggest": {
+ "psr/log-implementation": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.6-dev"
+ "dev-master": "4.1-dev"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Polyfill\\Php72\\": ""
+ "Symfony\\Component\\Console\\": ""
},
- "files": [
- "bootstrap.php"
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2413,54 +2392,51 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+ "description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "time": "2017-10-11T12:05:26+00:00"
+ "time": "2018-05-30T07:26:09+00:00"
},
{
- "name": "symfony/swiftmailer-bridge",
- "version": "v2.8.33",
+ "name": "symfony/debug",
+ "version": "v4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/swiftmailer-bridge.git",
- "reference": "9e7911c17973483f4f6b04577532d2b532e91fa4"
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "449f8b00b28ab6e6912c3e6b920406143b27193b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/swiftmailer-bridge/zipball/9e7911c17973483f4f6b04577532d2b532e91fa4",
- "reference": "9e7911c17973483f4f6b04577532d2b532e91fa4",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/449f8b00b28ab6e6912c3e6b920406143b27193b",
+ "reference": "449f8b00b28ab6e6912c3e6b920406143b27193b",
"shasum": ""
},
"require": {
- "php": ">=5.3.9",
- "swiftmailer/swiftmailer": ">=4.2.0,<6.0-dev"
+ "php": "^7.1.3",
+ "psr/log": "~1.0"
},
- "suggest": {
- "symfony/http-kernel": ""
+ "conflict": {
+ "symfony/http-kernel": "<3.4"
},
- "type": "symfony-bridge",
+ "require-dev": {
+ "symfony/http-kernel": "~3.4|~4.0"
+ },
+ "type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.8-dev"
+ "dev-master": "4.1-dev"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Bridge\\Swiftmailer\\": ""
+ "Symfony\\Component\\Debug\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -2480,196 +2456,3971 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Swiftmailer Bridge",
+ "description": "Symfony Debug Component",
"homepage": "https://symfony.com",
- "abandoned": true,
- "time": "2018-01-03T07:36:31+00:00"
+ "time": "2018-05-16T14:33:22+00:00"
},
{
- "name": "symfony/swiftmailer-bundle",
- "version": "v2.3.8",
+ "name": "symfony/dependency-injection",
+ "version": "v4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/swiftmailer-bundle.git",
- "reference": "970b13d01871207e81d17b17ddda025e7e21e797"
+ "url": "https://github.com/symfony/dependency-injection.git",
+ "reference": "f2a3f0dc640a28b8aedd51b47ad6e6c5cebb3c00"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/970b13d01871207e81d17b17ddda025e7e21e797",
- "reference": "970b13d01871207e81d17b17ddda025e7e21e797",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f2a3f0dc640a28b8aedd51b47ad6e6c5cebb3c00",
+ "reference": "f2a3f0dc640a28b8aedd51b47ad6e6c5cebb3c00",
"shasum": ""
},
"require": {
- "php": ">=5.3.2",
- "swiftmailer/swiftmailer": ">=4.2.0,~5.0",
- "symfony/swiftmailer-bridge": "~2.1"
+ "php": "^7.1.3",
+ "psr/container": "^1.0"
+ },
+ "conflict": {
+ "symfony/config": "<4.1",
+ "symfony/finder": "<3.4",
+ "symfony/proxy-manager-bridge": "<3.4",
+ "symfony/yaml": "<3.4"
+ },
+ "provide": {
+ "psr/container-implementation": "1.0"
},
"require-dev": {
- "symfony/config": "~2.1",
- "symfony/dependency-injection": "~2.1",
- "symfony/http-kernel": "~2.1",
- "symfony/yaml": "~2.1"
+ "symfony/config": "~4.1",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
},
"suggest": {
- "psr/log": "Allows logging"
+ "symfony/config": "",
+ "symfony/expression-language": "For using expressions in service container configuration",
+ "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required",
+ "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
+ "symfony/yaml": ""
},
- "type": "symfony-bundle",
+ "type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.3-dev"
+ "dev-master": "4.1-dev"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Bundle\\SwiftmailerBundle\\": ""
- }
+ "Symfony\\Component\\DependencyInjection\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
- {
- "name": "Symfony Community",
- "homepage": "http://symfony.com/contributors"
- },
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony SwiftmailerBundle",
- "homepage": "http://symfony.com",
- "time": "2014-12-01T17:44:50+00:00"
+ "description": "Symfony DependencyInjection Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-25T14:55:38+00:00"
},
{
- "name": "symfony/symfony",
- "version": "v4.0.3",
+ "name": "symfony/doctrine-bridge",
+ "version": "v4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/symfony.git",
- "reference": "8cc66bf6746c278755609b7b158f8444d0633456"
+ "url": "https://github.com/symfony/doctrine-bridge.git",
+ "reference": "9d361867451d5397e46bb32056fa43921545676e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/symfony/zipball/8cc66bf6746c278755609b7b158f8444d0633456",
- "reference": "8cc66bf6746c278755609b7b158f8444d0633456",
+ "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/9d361867451d5397e46bb32056fa43921545676e",
+ "reference": "9d361867451d5397e46bb32056fa43921545676e",
"shasum": ""
},
"require": {
"doctrine/common": "~2.4",
- "ext-xml": "*",
- "fig/link-util": "^1.0",
"php": "^7.1.3",
- "psr/cache": "~1.0",
- "psr/container": "^1.0",
- "psr/link": "^1.0",
- "psr/log": "~1.0",
- "psr/simple-cache": "^1.0",
- "symfony/polyfill-intl-icu": "~1.0",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+ "symfony/dependency-injection": "<3.4"
+ },
+ "require-dev": {
+ "doctrine/data-fixtures": "1.0.*",
+ "doctrine/dbal": "~2.4",
+ "doctrine/orm": "^2.4.5",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/form": "~3.4|~4.0",
+ "symfony/http-kernel": "~3.4|~4.0",
+ "symfony/property-access": "~3.4|~4.0",
+ "symfony/property-info": "~3.4|~4.0",
+ "symfony/proxy-manager-bridge": "~3.4|~4.0",
+ "symfony/security": "~3.4|~4.0",
+ "symfony/stopwatch": "~3.4|~4.0",
+ "symfony/translation": "~3.4|~4.0",
+ "symfony/validator": "~3.4|~4.0"
+ },
+ "suggest": {
+ "doctrine/data-fixtures": "",
+ "doctrine/dbal": "",
+ "doctrine/orm": "",
+ "symfony/form": "",
+ "symfony/property-info": "",
+ "symfony/validator": ""
+ },
+ "type": "symfony-bridge",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\Doctrine\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Doctrine Bridge",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-16T14:41:07+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "2391ed210a239868e7256eb6921b1bd83f3087b5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2391ed210a239868e7256eb6921b1bd83f3087b5",
+ "reference": "2391ed210a239868e7256eb6921b1bd83f3087b5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.4"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/stopwatch": "~3.4|~4.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony EventDispatcher Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-04-06T07:35:57+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "562bf7005b55fd80d26b582d28e3e10f2dd5ae9c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/562bf7005b55fd80d26b582d28e3e10f2dd5ae9c",
+ "reference": "562bf7005b55fd80d26b582d28e3e10f2dd5ae9c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "087e2ee0d74464a4c6baac4e90417db7477dc238"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/087e2ee0d74464a4c6baac4e90417db7477dc238",
+ "reference": "087e2ee0d74464a4c6baac4e90417db7477dc238",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Finder Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-16T14:33:22+00:00"
+ },
+ {
+ "name": "symfony/flex",
+ "version": "v1.0.80",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/flex.git",
+ "reference": "729aee08d62b47224e85b83c97e2824ff7d1735e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/flex/zipball/729aee08d62b47224e85b83c97e2824ff7d1735e",
+ "reference": "729aee08d62b47224e85b83c97e2824ff7d1735e",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0",
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "composer/composer": "^1.0.2",
+ "symfony/phpunit-bridge": "^3.2.8"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ },
+ "class": "Symfony\\Flex\\Flex"
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Flex\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien.potencier@gmail.com"
+ }
+ ],
+ "time": "2018-05-02T19:08:56+00:00"
+ },
+ {
+ "name": "symfony/form",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/form.git",
+ "reference": "95f8237303e1f7101fee0e72d6ba630a3e4c5178"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/form/zipball/95f8237303e1f7101fee0e72d6ba630a3e4c5178",
+ "reference": "95f8237303e1f7101fee0e72d6ba630a3e4c5178",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/event-dispatcher": "~3.4|~4.0",
+ "symfony/intl": "~3.4|~4.0",
+ "symfony/options-resolver": "~3.4|~4.0",
+ "symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.0",
- "symfony/polyfill-php72": "~1.5",
- "twig/twig": "^1.35|^2.4.4"
+ "symfony/property-access": "~3.4|~4.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/doctrine-bridge": "<3.4",
+ "symfony/framework-bundle": "<3.4",
+ "symfony/http-kernel": "<3.4",
+ "symfony/twig-bridge": "<3.4.5|<4.0.5,>=4.0"
+ },
+ "require-dev": {
+ "doctrine/collections": "~1.0",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/console": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/http-foundation": "~3.4|~4.0",
+ "symfony/http-kernel": "~3.4|~4.0",
+ "symfony/security-csrf": "~3.4|~4.0",
+ "symfony/translation": "~3.4|~4.0",
+ "symfony/validator": "~3.4|~4.0",
+ "symfony/var-dumper": "~3.4|~4.0"
+ },
+ "suggest": {
+ "symfony/framework-bundle": "For templating with PHP.",
+ "symfony/security-csrf": "For protecting forms against CSRF attacks.",
+ "symfony/twig-bridge": "For templating with Twig.",
+ "symfony/validator": "For form validation."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Form\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Form Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "symfony/framework-bundle",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/framework-bundle.git",
+ "reference": "e93974e78872d22cceebf401ce230363b192268e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/e93974e78872d22cceebf401ce230363b192268e",
+ "reference": "e93974e78872d22cceebf401ce230363b192268e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-xml": "*",
+ "php": "^7.1.3",
+ "symfony/cache": "~3.4|~4.0",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/dependency-injection": "^4.1",
+ "symfony/event-dispatcher": "^4.1",
+ "symfony/filesystem": "~3.4|~4.0",
+ "symfony/finder": "~3.4|~4.0",
+ "symfony/http-foundation": "^4.1",
+ "symfony/http-kernel": "^4.1",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/routing": "^4.1"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "<3.0",
+ "phpdocumentor/type-resolver": "<0.2.1",
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+ "symfony/asset": "<3.4",
+ "symfony/console": "<3.4",
+ "symfony/form": "<4.1",
+ "symfony/property-info": "<3.4",
+ "symfony/serializer": "<4.1",
+ "symfony/stopwatch": "<3.4",
+ "symfony/translation": "<3.4",
+ "symfony/validator": "<4.1",
+ "symfony/workflow": "<4.1"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "doctrine/cache": "~1.0",
+ "fig/link-util": "^1.0",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0",
+ "symfony/asset": "~3.4|~4.0",
+ "symfony/browser-kit": "~3.4|~4.0",
+ "symfony/console": "~3.4|~4.0",
+ "symfony/css-selector": "~3.4|~4.0",
+ "symfony/dom-crawler": "~3.4|~4.0",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/form": "^4.1",
+ "symfony/lock": "~3.4|~4.0",
+ "symfony/messenger": "^4.1-beta2",
+ "symfony/polyfill-intl-icu": "~1.0",
+ "symfony/process": "~3.4|~4.0",
+ "symfony/property-info": "~3.4|~4.0",
+ "symfony/security": "~3.4|~4.0",
+ "symfony/security-core": "~3.4|~4.0",
+ "symfony/security-csrf": "~3.4|~4.0",
+ "symfony/serializer": "^4.1",
+ "symfony/stopwatch": "~3.4|~4.0",
+ "symfony/templating": "~3.4|~4.0",
+ "symfony/translation": "~3.4|~4.0",
+ "symfony/validator": "^4.1",
+ "symfony/var-dumper": "~3.4|~4.0",
+ "symfony/web-link": "~3.4|~4.0",
+ "symfony/workflow": "^4.1",
+ "symfony/yaml": "~3.4|~4.0",
+ "twig/twig": "~1.34|~2.4"
+ },
+ "suggest": {
+ "ext-apcu": "For best performance of the system caches",
+ "symfony/console": "For using the console commands",
+ "symfony/form": "For using forms",
+ "symfony/property-info": "For using the property_info service",
+ "symfony/serializer": "For using the serializer service",
+ "symfony/validator": "For using validation",
+ "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering",
+ "symfony/yaml": "For using the debug:config and lint:yaml commands"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\FrameworkBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony FrameworkBundle",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-30T09:26:42+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "a916c88390fb861ee21f12a92b107d51bb68af99"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a916c88390fb861ee21f12a92b107d51bb68af99",
+ "reference": "a916c88390fb861ee21f12a92b107d51bb68af99",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-mbstring": "~1.1"
+ },
+ "require-dev": {
+ "predis/predis": "~1.0",
+ "symfony/expression-language": "~3.4|~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony HttpFoundation Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-25T14:55:38+00:00"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "b5ab9d4cdbfd369083744b6b5dfbf454e31e5f90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b5ab9d4cdbfd369083744b6b5dfbf454e31e5f90",
+ "reference": "b5ab9d4cdbfd369083744b6b5dfbf454e31e5f90",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "psr/log": "~1.0",
+ "symfony/debug": "~3.4|~4.0",
+ "symfony/event-dispatcher": "~4.1",
+ "symfony/http-foundation": "~4.1",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/config": "<3.4",
+ "symfony/dependency-injection": "<4.1",
+ "symfony/var-dumper": "<4.1",
+ "twig/twig": "<1.34|<2.4,>=2"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0"
+ },
+ "require-dev": {
+ "psr/cache": "~1.0",
+ "symfony/browser-kit": "~3.4|~4.0",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/console": "~3.4|~4.0",
+ "symfony/css-selector": "~3.4|~4.0",
+ "symfony/dependency-injection": "^4.1",
+ "symfony/dom-crawler": "~3.4|~4.0",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/finder": "~3.4|~4.0",
+ "symfony/process": "~3.4|~4.0",
+ "symfony/routing": "~3.4|~4.0",
+ "symfony/stopwatch": "~3.4|~4.0",
+ "symfony/templating": "~3.4|~4.0",
+ "symfony/translation": "~3.4|~4.0",
+ "symfony/var-dumper": "~4.1"
+ },
+ "suggest": {
+ "symfony/browser-kit": "",
+ "symfony/config": "",
+ "symfony/console": "",
+ "symfony/dependency-injection": "",
+ "symfony/var-dumper": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpKernel\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony HttpKernel Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-30T12:52:34+00:00"
+ },
+ {
+ "name": "symfony/inflector",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/inflector.git",
+ "reference": "a55513ebd8aa4843300e325c84d0954a9d1f4ed8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/inflector/zipball/a55513ebd8aa4843300e325c84d0954a9d1f4ed8",
+ "reference": "a55513ebd8aa4843300e325c84d0954a9d1f4ed8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Inflector\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Inflector Component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "inflection",
+ "pluralize",
+ "singularize",
+ "string",
+ "symfony",
+ "words"
+ ],
+ "time": "2018-05-01T23:02:13+00:00"
+ },
+ {
+ "name": "symfony/intl",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/intl.git",
+ "reference": "e2a48225f7d525b23a6e34caaa7320205abcf179"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/intl/zipball/e2a48225f7d525b23a6e34caaa7320205abcf179",
+ "reference": "e2a48225f7d525b23a6e34caaa7320205abcf179",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-intl-icu": "~1.0"
+ },
+ "require-dev": {
+ "symfony/filesystem": "~3.4|~4.0"
+ },
+ "suggest": {
+ "ext-intl": "to use the component with locales other than \"en\""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Intl\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ },
+ {
+ "name": "Eriksen Costa",
+ "email": "eriksen.costa@infranology.com.br"
+ },
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "i18n",
+ "icu",
+ "internationalization",
+ "intl",
+ "l10n",
+ "localization"
+ ],
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "symfony/monolog-bridge",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/monolog-bridge.git",
+ "reference": "c0fe8631641b370f926c9dc54f9cac154a9e503b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/c0fe8631641b370f926c9dc54f9cac154a9e503b",
+ "reference": "c0fe8631641b370f926c9dc54f9cac154a9e503b",
+ "shasum": ""
+ },
+ "require": {
+ "monolog/monolog": "~1.19",
+ "php": "^7.1.3",
+ "symfony/http-kernel": "~3.4|~4.0"
+ },
+ "conflict": {
+ "symfony/http-foundation": "<3.4"
+ },
+ "require-dev": {
+ "symfony/console": "~3.4|~4.0",
+ "symfony/event-dispatcher": "~3.4|~4.0",
+ "symfony/security-core": "~3.4|~4.0",
+ "symfony/var-dumper": "~3.4|~4.0"
+ },
+ "suggest": {
+ "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings. You need version ~2.3 of the console for it.",
+ "symfony/event-dispatcher": "Needed when using log messages in console commands.",
+ "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.",
+ "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler."
+ },
+ "type": "symfony-bridge",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\Monolog\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Monolog Bridge",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-16T14:33:22+00:00"
+ },
+ {
+ "name": "symfony/monolog-bundle",
+ "version": "v3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/monolog-bundle.git",
+ "reference": "8204f3cd7c1bd6a6e2955c0a34475243a7bd9802"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/8204f3cd7c1bd6a6e2955c0a34475243a7bd9802",
+ "reference": "8204f3cd7c1bd6a6e2955c0a34475243a7bd9802",
+ "shasum": ""
+ },
+ "require": {
+ "monolog/monolog": "~1.22",
+ "php": ">=5.6",
+ "symfony/config": "~2.7|~3.3|~4.0",
+ "symfony/dependency-injection": "~2.7|~3.4.10|^4.0.10",
+ "symfony/http-kernel": "~2.7|~3.3|~4.0",
+ "symfony/monolog-bridge": "~2.7|~3.3|~4.0"
+ },
+ "require-dev": {
+ "symfony/console": "~2.7|~3.3|~4.0",
+ "symfony/phpunit-bridge": "^3.3|^4.0",
+ "symfony/yaml": "~2.7|~3.3|~4.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\MonologBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony MonologBundle",
+ "homepage": "http://symfony.com",
+ "keywords": [
+ "log",
+ "logging"
+ ],
+ "time": "2018-06-04T05:55:43+00:00"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "9b9ab6043c57c8c5571bc846e6ebfd27dff3b589"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/9b9ab6043c57c8c5571bc846e6ebfd27dff3b589",
+ "reference": "9b9ab6043c57c8c5571bc846e6ebfd27dff3b589",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\OptionsResolver\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony OptionsResolver Component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "config",
+ "configuration",
+ "options"
+ ],
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae",
+ "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ },
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "time": "2018-04-30T19:57:29+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-icu",
+ "version": "v1.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-icu.git",
+ "reference": "80ee17ae83c10cd513e5144f91a73607a21edb4e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/80ee17ae83c10cd513e5144f91a73607a21edb4e",
+ "reference": "80ee17ae83c10cd513e5144f91a73607a21edb4e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "symfony/intl": "~2.3|~3.0|~4.0"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's ICU-related data and classes",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "icu",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2018-04-25T14:53:50+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "3296adf6a6454a050679cde90f95350ad604b171"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171",
+ "reference": "3296adf6a6454a050679cde90f95350ad604b171",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2018-04-26T10:06:28+00:00"
+ },
+ {
+ "name": "symfony/property-access",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/property-access.git",
+ "reference": "f957d37eb476c9442a0c684b0cd0dd1fb38cb74a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/f957d37eb476c9442a0c684b0cd0dd1fb38cb74a",
+ "reference": "f957d37eb476c9442a0c684b0cd0dd1fb38cb74a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/inflector": "~3.4|~4.0"
+ },
+ "require-dev": {
+ "symfony/cache": "~3.4|~4.0"
+ },
+ "suggest": {
+ "psr/cache-implementation": "To cache access methods."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\PropertyAccess\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony PropertyAccess Component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "access",
+ "array",
+ "extraction",
+ "index",
+ "injection",
+ "object",
+ "property",
+ "property path",
+ "reflection"
+ ],
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "180b51c66d10f09e562c9ebc395b39aacb2cf8a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/180b51c66d10f09e562c9ebc395b39aacb2cf8a2",
+ "reference": "180b51c66d10f09e562c9ebc395b39aacb2cf8a2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3"
+ },
+ "conflict": {
+ "symfony/config": "<3.4",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/yaml": "<3.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "doctrine/common": "~2.2",
+ "psr/log": "~1.0",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/http-foundation": "~3.4|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
+ },
+ "suggest": {
+ "doctrine/annotations": "For using the annotation loader",
+ "symfony/config": "For using the all-in-one router or any loader",
+ "symfony/dependency-injection": "For loading routes from a service",
+ "symfony/expression-language": "For using expression matching",
+ "symfony/http-foundation": "For using a Symfony Request object",
+ "symfony/yaml": "For using the YAML loader"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Routing\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Routing Component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "symfony/security",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/security.git",
+ "reference": "2ba804b4af205c060094c28cece0b42a26a67537"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/security/zipball/2ba804b4af205c060094c28cece0b42a26a67537",
+ "reference": "2ba804b4af205c060094c28cece0b42a26a67537",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/event-dispatcher": "~3.4|~4.0",
+ "symfony/http-foundation": "~3.4|~4.0",
+ "symfony/http-kernel": "~3.4|~4.0",
+ "symfony/property-access": "~3.4|~4.0"
+ },
+ "replace": {
+ "symfony/security-core": "self.version",
+ "symfony/security-csrf": "self.version",
+ "symfony/security-guard": "self.version",
+ "symfony/security-http": "self.version"
+ },
+ "require-dev": {
+ "psr/container": "^1.0",
+ "psr/log": "~1.0",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/finder": "~3.4|~4.0",
+ "symfony/ldap": "~3.4|~4.0",
+ "symfony/polyfill-intl-icu": "~1.0",
+ "symfony/routing": "~3.4|~4.0",
+ "symfony/validator": "~3.4|~4.0"
+ },
+ "suggest": {
+ "psr/container-implementation": "To instantiate the Security class",
+ "symfony/expression-language": "For using the expression voter",
+ "symfony/form": "",
+ "symfony/ldap": "For using the LDAP user and authentication providers",
+ "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs",
+ "symfony/validator": "For using the user password constraint"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Security\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Security Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "symfony/security-bundle",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/security-bundle.git",
+ "reference": "8ac1bc3575a40eb57e0ed84f00bcb5964986945b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/security-bundle/zipball/8ac1bc3575a40eb57e0ed84f00bcb5964986945b",
+ "reference": "8ac1bc3575a40eb57e0ed84f00bcb5964986945b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-xml": "*",
+ "php": "^7.1.3",
+ "symfony/dependency-injection": "^3.4.3|^4.0.3",
+ "symfony/http-kernel": "^4.1",
+ "symfony/security": "~4.1"
+ },
+ "conflict": {
+ "symfony/console": "<3.4",
+ "symfony/event-dispatcher": "<3.4",
+ "symfony/framework-bundle": "<=4.1-beta2",
+ "symfony/security": "4.1.0-beta1|4.1.0-beta2",
+ "symfony/var-dumper": "<3.4"
+ },
+ "require-dev": {
+ "doctrine/doctrine-bundle": "~1.5",
+ "symfony/asset": "~3.4|~4.0",
+ "symfony/browser-kit": "~3.4|~4.0",
+ "symfony/console": "~3.4|~4.0",
+ "symfony/css-selector": "~3.4|~4.0",
+ "symfony/dom-crawler": "~3.4|~4.0",
+ "symfony/event-dispatcher": "~3.4|~4.0",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/form": "~3.4|~4.0",
+ "symfony/framework-bundle": "~4.1",
+ "symfony/http-foundation": "~3.4|~4.0",
+ "symfony/process": "~3.4|~4.0",
+ "symfony/translation": "~3.4|~4.0",
+ "symfony/twig-bridge": "~3.4|~4.0",
+ "symfony/twig-bundle": "~3.4|~4.0",
+ "symfony/validator": "~3.4|~4.0",
+ "symfony/var-dumper": "~3.4|~4.0",
+ "symfony/yaml": "~3.4|~4.0",
+ "twig/twig": "~1.34|~2.4"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\SecurityBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony SecurityBundle",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-25T13:53:35+00:00"
+ },
+ {
+ "name": "symfony/swiftmailer-bundle",
+ "version": "v3.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/swiftmailer-bundle.git",
+ "reference": "f1ba0552a9cd4df0191a58845fbd5541cf9eda2d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/f1ba0552a9cd4df0191a58845fbd5541cf9eda2d",
+ "reference": "f1ba0552a9cd4df0191a58845fbd5541cf9eda2d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "swiftmailer/swiftmailer": "^6.0.1",
+ "symfony/config": "~2.8|~3.3|~4.0",
+ "symfony/dependency-injection": "~2.7|~3.3|~4.0",
+ "symfony/http-kernel": "~2.7|~3.3|~4.0"
+ },
+ "require-dev": {
+ "symfony/console": "~2.7|~3.3|~4.0",
+ "symfony/framework-bundle": "~2.7|~3.3|~4.0",
+ "symfony/phpunit-bridge": "~3.3|~4.0",
+ "symfony/yaml": "~2.7|~3.3|~4.0"
+ },
+ "suggest": {
+ "psr/log": "Allows logging"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\SwiftmailerBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony SwiftmailerBundle",
+ "homepage": "http://symfony.com",
+ "time": "2018-04-03T16:29:41+00:00"
+ },
+ {
+ "name": "symfony/templating",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/templating.git",
+ "reference": "c9731b5e11fc01a1363e0cf9b3c90faf619ea479"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/templating/zipball/c9731b5e11fc01a1363e0cf9b3c90faf619ea479",
+ "reference": "c9731b5e11fc01a1363e0cf9b3c90faf619ea479",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "require-dev": {
+ "psr/log": "~1.0"
+ },
+ "suggest": {
+ "psr/log-implementation": "For using debug logging in loaders"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Templating\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Templating Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-01T23:02:13+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "16328f5b217cebc8dd4adfe4aeeaa8c377581f5a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/16328f5b217cebc8dd4adfe4aeeaa8c377581f5a",
+ "reference": "16328f5b217cebc8dd4adfe4aeeaa8c377581f5a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/config": "<3.4",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/yaml": "<3.4"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/console": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/finder": "~2.8|~3.0|~4.0",
+ "symfony/intl": "~3.4|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
+ },
+ "suggest": {
+ "psr/log-implementation": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Translation Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "symfony/twig-bridge",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/twig-bridge.git",
+ "reference": "b2e4c10df6517d1fdbb053326387f8e1779ad76e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/b2e4c10df6517d1fdbb053326387f8e1779ad76e",
+ "reference": "b2e4c10df6517d1fdbb053326387f8e1779ad76e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "twig/twig": "^1.35|^2.4.4"
+ },
+ "conflict": {
+ "symfony/console": "<3.4",
+ "symfony/form": "<4.1"
+ },
+ "require-dev": {
+ "symfony/asset": "~3.4|~4.0",
+ "symfony/console": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/finder": "~3.4|~4.0",
+ "symfony/form": "^4.1",
+ "symfony/http-foundation": "~3.4|~4.0",
+ "symfony/http-kernel": "~3.4|~4.0",
+ "symfony/polyfill-intl-icu": "~1.0",
+ "symfony/routing": "~3.4|~4.0",
+ "symfony/security": "~3.4|~4.0",
+ "symfony/security-acl": "~2.8|~3.0",
+ "symfony/stopwatch": "~3.4|~4.0",
+ "symfony/templating": "~3.4|~4.0",
+ "symfony/translation": "~3.4|~4.0",
+ "symfony/var-dumper": "~3.4|~4.0",
+ "symfony/web-link": "~3.4|~4.0",
+ "symfony/workflow": "~3.4|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
+ },
+ "suggest": {
+ "symfony/asset": "For using the AssetExtension",
+ "symfony/expression-language": "For using the ExpressionExtension",
+ "symfony/finder": "",
+ "symfony/form": "For using the FormExtension",
+ "symfony/http-kernel": "For using the HttpKernelExtension",
+ "symfony/routing": "For using the RoutingExtension",
+ "symfony/security": "For using the SecurityExtension",
+ "symfony/stopwatch": "For using the StopwatchExtension",
+ "symfony/templating": "For using the TwigEngine",
+ "symfony/translation": "For using the TranslationExtension",
+ "symfony/var-dumper": "For using the DumpExtension",
+ "symfony/web-link": "For using the WebLinkExtension",
+ "symfony/yaml": "For using the YamlExtension"
+ },
+ "type": "symfony-bridge",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\Twig\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Twig Bridge",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-16T14:33:22+00:00"
+ },
+ {
+ "name": "symfony/twig-bundle",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/twig-bundle.git",
+ "reference": "158bf522a8df74b0a322421bbde14a1647197007"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/158bf522a8df74b0a322421bbde14a1647197007",
+ "reference": "158bf522a8df74b0a322421bbde14a1647197007",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/http-foundation": "~3.4|~4.0",
+ "symfony/http-kernel": "~3.4|~4.0",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/twig-bridge": "^3.4.3|^4.0.3",
+ "twig/twig": "~1.34|~2.4"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.4",
+ "symfony/event-dispatcher": "<3.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "doctrine/cache": "~1.0",
+ "symfony/asset": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/finder": "~3.4|~4.0",
+ "symfony/form": "~3.4|~4.0",
+ "symfony/framework-bundle": "~3.4|~4.0",
+ "symfony/routing": "~3.4|~4.0",
+ "symfony/stopwatch": "~3.4|~4.0",
+ "symfony/templating": "~3.4|~4.0",
+ "symfony/web-link": "~3.4|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\TwigBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony TwigBundle",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-16T14:41:07+00:00"
+ },
+ {
+ "name": "symfony/validator",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/validator.git",
+ "reference": "f07bc14af6759710fb4639811a8240650d89786a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/validator/zipball/f07bc14af6759710fb4639811a8240650d89786a",
+ "reference": "f07bc14af6759710fb4639811a8240650d89786a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/translation": "~3.4|~4.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/http-kernel": "<3.4",
+ "symfony/intl": "<4.1",
+ "symfony/yaml": "<3.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "doctrine/cache": "~1.0",
+ "egulias/email-validator": "^1.2.8|~2.0",
+ "symfony/cache": "~3.4|~4.0",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/http-foundation": "~4.1",
+ "symfony/http-kernel": "~3.4|~4.0",
+ "symfony/intl": "~4.1",
+ "symfony/property-access": "~3.4|~4.0",
+ "symfony/var-dumper": "~3.4|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
+ },
+ "suggest": {
+ "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.",
+ "doctrine/cache": "For using the default cached annotation reader and metadata cache.",
+ "egulias/email-validator": "Strict (RFC compliant) email validation",
+ "psr/cache-implementation": "For using the metadata cache.",
+ "symfony/config": "",
+ "symfony/expression-language": "For using the Expression validator",
+ "symfony/http-foundation": "",
+ "symfony/intl": "",
+ "symfony/property-access": "For accessing properties within comparison constraints",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Validator\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Validator Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "twig/extensions",
+ "version": "v1.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twigphp/Twig-extensions.git",
+ "reference": "d188c76168b853481cc75879ea045bf93d718e9c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/d188c76168b853481cc75879ea045bf93d718e9c",
+ "reference": "d188c76168b853481cc75879ea045bf93d718e9c",
+ "shasum": ""
+ },
+ "require": {
+ "twig/twig": "~1.27|~2.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~3.3@dev",
+ "symfony/translation": "~2.3|~3.0"
+ },
+ "suggest": {
+ "symfony/translation": "Allow the time_diff output to be translated"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Twig_Extensions_": "lib/"
+ },
+ "psr-4": {
+ "Twig\\Extensions\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Common additional features for Twig that do not directly belong in core",
+ "homepage": "http://twig.sensiolabs.org/doc/extensions/index.html",
+ "keywords": [
+ "i18n",
+ "text"
+ ],
+ "time": "2017-06-08T18:19:53+00:00"
+ },
+ {
+ "name": "twig/twig",
+ "version": "v2.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twigphp/Twig.git",
+ "reference": "7b604c89da162034bdf4bb66310f358d313dd16d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/7b604c89da162034bdf4bb66310f358d313dd16d",
+ "reference": "7b604c89da162034bdf4bb66310f358d313dd16d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "psr/container": "^1.0",
+ "symfony/debug": "^2.7",
+ "symfony/phpunit-bridge": "^3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Twig_": "lib/"
+ },
+ "psr-4": {
+ "Twig\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Armin Ronacher",
+ "email": "armin.ronacher@active-4.com",
+ "role": "Project Founder"
+ },
+ {
+ "name": "Twig Team",
+ "homepage": "http://twig.sensiolabs.org/contributors",
+ "role": "Contributors"
+ }
+ ],
+ "description": "Twig, the flexible, fast, and secure template language for PHP",
+ "homepage": "http://twig.sensiolabs.org",
+ "keywords": [
+ "templating"
+ ],
+ "time": "2018-04-02T09:24:19+00:00"
+ },
+ {
+ "name": "zendframework/zend-code",
+ "version": "3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-code.git",
+ "reference": "6b1059db5b368db769e4392c6cb6cc139e56640d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-code/zipball/6b1059db5b368db769e4392c6cb6cc139e56640d",
+ "reference": "6b1059db5b368db769e4392c6cb6cc139e56640d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1",
+ "zendframework/zend-eventmanager": "^2.6 || ^3.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "ext-phar": "*",
+ "phpunit/phpunit": "^6.2.3",
+ "zendframework/zend-coding-standard": "^1.0.0",
+ "zendframework/zend-stdlib": "^2.7 || ^3.0"
+ },
+ "suggest": {
+ "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
+ "zendframework/zend-stdlib": "Zend\\Stdlib component"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev",
+ "dev-develop": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Zend\\Code\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "provides facilities to generate arbitrary code using an object oriented interface",
+ "homepage": "https://github.com/zendframework/zend-code",
+ "keywords": [
+ "code",
+ "zf2"
+ ],
+ "time": "2017-10-20T15:21:32+00:00"
+ },
+ {
+ "name": "zendframework/zend-eventmanager",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-eventmanager.git",
+ "reference": "a5e2583a211f73604691586b8406ff7296a946dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd",
+ "reference": "a5e2583a211f73604691586b8406ff7296a946dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "athletic/athletic": "^0.1",
+ "container-interop/container-interop": "^1.1.0",
+ "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2",
+ "zendframework/zend-coding-standard": "~1.0.0",
+ "zendframework/zend-stdlib": "^2.7.3 || ^3.0"
+ },
+ "suggest": {
+ "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature",
+ "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev",
+ "dev-develop": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Zend\\EventManager\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "Trigger and listen to events within a PHP application",
+ "homepage": "https://github.com/zendframework/zend-eventmanager",
+ "keywords": [
+ "event",
+ "eventmanager",
+ "events",
+ "zf2"
+ ],
+ "time": "2018-04-25T15:33:34+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "easycorp/easy-log-handler",
+ "version": "v1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/EasyCorp/easy-log-handler.git",
+ "reference": "1a617a37ab9389eac4e2e1d14cb70ee0087d724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/EasyCorp/easy-log-handler/zipball/1a617a37ab9389eac4e2e1d14cb70ee0087d724d",
+ "reference": "1a617a37ab9389eac4e2e1d14cb70ee0087d724d",
+ "shasum": ""
+ },
+ "require": {
+ "monolog/monolog": "~1.6",
+ "php": ">=5.3.0",
+ "symfony/yaml": "~2.3|~3.0|~4.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "EasyCorp\\EasyLog\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Javier Eguiluz",
+ "email": "javiereguiluz@gmail.com"
+ },
+ {
+ "name": "Project Contributors",
+ "homepage": "https://github.com/EasyCorp/easy-log-handler"
+ }
+ ],
+ "description": "A handler for Monolog that optimizes log messages to be processed by humans instead of software. Improve your productivity with logs that are easy to understand.",
+ "homepage": "https://github.com/EasyCorp/easy-log-handler",
+ "keywords": [
+ "easy",
+ "log",
+ "logging",
+ "monolog",
+ "productivity"
+ ],
+ "time": "2018-01-10T08:34:20+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "478465659fd987669df0bd8a9bf22a8710e5f1b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/478465659fd987669df0bd8a9bf22a8710e5f1b6",
+ "reference": "478465659fd987669df0bd8a9bf22a8710e5f1b6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "replace": {
+ "myclabs/deep-copy": "self.version"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0",
+ "doctrine/common": "^2.6",
+ "phpunit/phpunit": "^7.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ },
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "time": "2018-05-29T17:25:09+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "35b8caf75e791ba1b2d24fec1552168d72692b12"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/35b8caf75e791ba1b2d24fec1552168d72692b12",
+ "reference": "35b8caf75e791ba1b2d24fec1552168d72692b12",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.5 || ^7.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "time": "2018-06-03T11:33:10+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0",
+ "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "phar-io/version": "^1.0.1",
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "time": "2017-03-05T18:14:27+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df",
+ "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "time": "2017-03-05T17:38:23+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+ "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2017-09-11T18:02:19+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "4.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "94fd0001232e47129dd3504189fa1c7225010d08"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08",
+ "reference": "94fd0001232e47129dd3504189fa1c7225010d08",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "phpdocumentor/reflection-common": "^1.0.0",
+ "phpdocumentor/type-resolver": "^0.4.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "doctrine/instantiator": "~1.0.5",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^6.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2017-11-30T07:14:17+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
+ "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5 || ^7.0",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "time": "2017-07-14T14:27:02+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "1.7.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712",
+ "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
+ "sebastian/comparator": "^1.1|^2.0|^3.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.5|^3.2",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2018-04-18T13:57:24+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "6.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/865662550c384bc1db7e51d29aeda1c2c161d69a",
+ "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.1",
+ "phpunit/php-file-iterator": "^2.0",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-token-stream": "^3.0",
+ "sebastian/code-unit-reverse-lookup": "^1.0.1",
+ "sebastian/environment": "^3.1",
+ "sebastian/version": "^2.0.1",
+ "theseer/tokenizer": "^1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0"
+ },
+ "suggest": {
+ "ext-xdebug": "^2.6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2018-06-01T07:51:50+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "e20525b0c2945c7c317fff95660698cb3d2a53bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/e20525b0c2945c7c317fff95660698cb3d2a53bc",
+ "reference": "e20525b0c2945c7c317fff95660698cb3d2a53bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2018-05-28T12:13:49+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21T13:50:34+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f",
+ "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2018-02-01T13:07:23+00:00"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace",
+ "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2018-02-01T13:16:43+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "7.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "00bc0b93f0ff4f557e9ea766557fde96da9a03dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/00bc0b93f0ff4f557e9ea766557fde96da9a03dd",
+ "reference": "00bc0b93f0ff4f557e9ea766557fde96da9a03dd",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.1",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "^1.7",
+ "phar-io/manifest": "^1.0.1",
+ "phar-io/version": "^1.0",
+ "php": "^7.1",
+ "phpspec/prophecy": "^1.7",
+ "phpunit/php-code-coverage": "^6.0.7",
+ "phpunit/php-file-iterator": "^2.0",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-timer": "^2.0",
+ "sebastian/comparator": "^3.0",
+ "sebastian/diff": "^3.0",
+ "sebastian/environment": "^3.1",
+ "sebastian/exporter": "^3.1",
+ "sebastian/global-state": "^2.0",
+ "sebastian/object-enumerator": "^3.0.3",
+ "sebastian/resource-operations": "^1.0",
+ "sebastian/version": "^2.0.1"
+ },
+ "conflict": {
+ "phpunit/phpunit-mock-objects": "*"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-soap": "*",
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "^2.0"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "time": "2018-06-05T03:40:05+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "time": "2017-03-04T06:30:41+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "ed5fd2281113729f1ebcc64d101ad66028aeb3d5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ed5fd2281113729f1ebcc64d101ad66028aeb3d5",
+ "reference": "ed5fd2281113729f1ebcc64d101ad66028aeb3d5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1",
+ "sebastian/diff": "^3.0",
+ "sebastian/exporter": "^3.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2018-04-18T13:33:00+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "e09160918c66281713f1c324c1f4c4c3037ba1e8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/e09160918c66281713f1c324c1f4c4c3037ba1e8",
+ "reference": "e09160918c66281713f1c324c1f4c4c3037ba1e8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0",
+ "symfony/process": "^2 || ^3.3 || ^4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "time": "2018-02-01T13:45:15+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
+ "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2017-07-01T08:51:00+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "234199f4528de6d12aaa58b612e98f7d36adb937"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937",
+ "reference": "234199f4528de6d12aaa58b612e98f7d36adb937",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2017-04-03T13:19:02+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2017-04-27T15:39:26+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
+ "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/object-reflector": "^1.1.1",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "time": "2017-08-03T12:35:26+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "773f97c67f28de00d397be301821b06708fca0be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
+ "reference": "773f97c67f28de00d397be301821b06708fca0be",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "time": "2017-03-29T09:07:27+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2017-03-03T06:23:57+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "time": "2015-07-28T20:34:47+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2016-10-03T07:35:21+00:00"
+ },
+ {
+ "name": "symfony/debug-bundle",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug-bundle.git",
+ "reference": "3158b762b15f9f8a037ace25c08c4c12ca4395dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/3158b762b15f9f8a037ace25c08c4c12ca4395dd",
+ "reference": "3158b762b15f9f8a037ace25c08c4c12ca4395dd",
+ "shasum": ""
+ },
+ "require": {
+ "ext-xml": "*",
+ "php": "^7.1.3",
+ "symfony/http-kernel": "~3.4|~4.0",
+ "symfony/twig-bridge": "~3.4|~4.0",
+ "symfony/var-dumper": "~4.1"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.4"
+ },
+ "require-dev": {
+ "symfony/config": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/web-profiler-bundle": "~3.4|~4.0"
+ },
+ "suggest": {
+ "symfony/config": "For service container configuration",
+ "symfony/dependency-injection": "For using as a service from the container"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\DebugBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DebugBundle",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-04T00:01:20+00:00"
+ },
+ {
+ "name": "symfony/debug-pack",
+ "version": "v1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug-pack.git",
+ "reference": "ae4b15596788f9592f67f8615398671bf3f796e4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug-pack/zipball/ae4b15596788f9592f67f8615398671bf3f796e4",
+ "reference": "ae4b15596788f9592f67f8615398671bf3f796e4",
+ "shasum": ""
+ },
+ "require": {
+ "easycorp/easy-log-handler": "^1.0.2",
+ "php": "^7.0",
+ "symfony/debug-bundle": "^3.3|^4.0",
+ "symfony/monolog-bundle": "^3.0",
+ "symfony/profiler-pack": "^1.0",
+ "symfony/var-dumper": "^3.3|^4.0"
+ },
+ "type": "symfony-pack",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A debug pack for Symfony projects",
+ "time": "2018-03-29T13:53:44+00:00"
+ },
+ {
+ "name": "symfony/dotenv",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dotenv.git",
+ "reference": "f98b6b65e04dd51f40d2cfc81c2c833ff3773b1e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dotenv/zipball/f98b6b65e04dd51f40d2cfc81c2c833ff3773b1e",
+ "reference": "f98b6b65e04dd51f40d2cfc81c2c833ff3773b1e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3"
+ },
+ "require-dev": {
+ "symfony/process": "~3.4|~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Dotenv\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Registers environment variables from a .env file",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "dotenv",
+ "env",
+ "environment"
+ ],
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "symfony/maker-bundle",
+ "version": "v1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/maker-bundle.git",
+ "reference": "bb0485a3b2eecc561eff735109316677e18fb1d1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/bb0485a3b2eecc561eff735109316677e18fb1d1",
+ "reference": "bb0485a3b2eecc561eff735109316677e18fb1d1",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/inflector": "^1.2",
+ "nikic/php-parser": "^4.0",
+ "php": "^7.0.8",
+ "symfony/config": "^3.4|^4.0",
+ "symfony/console": "^3.4|^4.0",
+ "symfony/dependency-injection": "^3.4|^4.0",
+ "symfony/filesystem": "^3.4|^4.0",
+ "symfony/finder": "^3.4|^4.0",
+ "symfony/framework-bundle": "^3.4|^4.0",
+ "symfony/http-kernel": "^3.4|^4.0"
+ },
+ "require-dev": {
+ "allocine/twigcs": "^3.0",
+ "doctrine/doctrine-bundle": "^1.8",
+ "doctrine/orm": "^2.3",
+ "friendsofphp/php-cs-fixer": "^2.8",
+ "symfony/phpunit-bridge": "^3.4|^4.0",
+ "symfony/process": "^3.4|^4.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\MakerBundle\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.",
+ "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html",
+ "keywords": [
+ "code generator",
+ "generator",
+ "scaffold",
+ "scaffolding"
+ ],
+ "time": "2018-05-17T19:26:29+00:00"
+ },
+ {
+ "name": "symfony/phpunit-bridge",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/phpunit-bridge.git",
+ "reference": "b3451fc442baaf9169e50491a059ef17582c4424"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/b3451fc442baaf9169e50491a059ef17582c4424",
+ "reference": "b3451fc442baaf9169e50491a059ef17582c4424",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
+ },
+ "suggest": {
+ "ext-zip": "Zip support is required when using bin/simple-phpunit",
+ "symfony/debug": "For tracking deprecated interfaces usages at runtime with DebugClassLoader"
+ },
+ "bin": [
+ "bin/simple-phpunit"
+ ],
+ "type": "symfony-bridge",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ },
+ "thanks": {
+ "name": "phpunit/phpunit",
+ "url": "https://github.com/sebastianbergmann/phpunit"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Bridge\\PhpUnit\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony PHPUnit Bridge",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-25T14:55:38+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php72",
+ "version": "v1.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/a4576e282d782ad82397f3e4ec1df8e0f0cafb46",
+ "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php72\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2018-04-26T10:06:28+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "73445bd33b0d337c060eef9652b94df72b6b3434"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/73445bd33b0d337c060eef9652b94df72b6b3434",
+ "reference": "73445bd33b0d337c060eef9652b94df72b6b3434",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "symfony/profiler-pack",
+ "version": "v1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/profiler-pack.git",
+ "reference": "fa2e2dad522a3bef322196abad28ffce6d0fdbc5"
},
- "conflict": {
- "phpdocumentor/reflection-docblock": "<3.0||>=3.2.0,<3.2.2",
- "phpdocumentor/type-resolver": "<0.2.1",
- "phpunit/phpunit": "<5.4.3"
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/fa2e2dad522a3bef322196abad28ffce6d0fdbc5",
+ "reference": "fa2e2dad522a3bef322196abad28ffce6d0fdbc5",
+ "shasum": ""
},
- "provide": {
- "psr/cache-implementation": "1.0",
- "psr/container-implementation": "1.0",
- "psr/log-implementation": "1.0",
- "psr/simple-cache-implementation": "1.0"
+ "require": {
+ "php": "^7.0",
+ "symfony/stopwatch": "^3.3|^4.0",
+ "symfony/twig-bundle": "^3.3|^4.0",
+ "symfony/web-profiler-bundle": "^3.3|^4.0"
},
- "replace": {
- "symfony/asset": "self.version",
- "symfony/browser-kit": "self.version",
- "symfony/cache": "self.version",
- "symfony/config": "self.version",
- "symfony/console": "self.version",
- "symfony/css-selector": "self.version",
- "symfony/debug": "self.version",
- "symfony/debug-bundle": "self.version",
- "symfony/dependency-injection": "self.version",
- "symfony/doctrine-bridge": "self.version",
- "symfony/dom-crawler": "self.version",
- "symfony/dotenv": "self.version",
- "symfony/event-dispatcher": "self.version",
- "symfony/expression-language": "self.version",
- "symfony/filesystem": "self.version",
- "symfony/finder": "self.version",
- "symfony/form": "self.version",
- "symfony/framework-bundle": "self.version",
- "symfony/http-foundation": "self.version",
- "symfony/http-kernel": "self.version",
- "symfony/inflector": "self.version",
- "symfony/intl": "self.version",
- "symfony/ldap": "self.version",
- "symfony/lock": "self.version",
- "symfony/monolog-bridge": "self.version",
- "symfony/options-resolver": "self.version",
- "symfony/process": "self.version",
- "symfony/property-access": "self.version",
- "symfony/property-info": "self.version",
- "symfony/proxy-manager-bridge": "self.version",
- "symfony/routing": "self.version",
- "symfony/security": "self.version",
- "symfony/security-bundle": "self.version",
- "symfony/security-core": "self.version",
- "symfony/security-csrf": "self.version",
- "symfony/security-guard": "self.version",
- "symfony/security-http": "self.version",
- "symfony/serializer": "self.version",
- "symfony/stopwatch": "self.version",
- "symfony/templating": "self.version",
- "symfony/translation": "self.version",
- "symfony/twig-bridge": "self.version",
- "symfony/twig-bundle": "self.version",
- "symfony/validator": "self.version",
- "symfony/var-dumper": "self.version",
- "symfony/web-link": "self.version",
- "symfony/web-profiler-bundle": "self.version",
- "symfony/web-server-bundle": "self.version",
- "symfony/workflow": "self.version",
- "symfony/yaml": "self.version"
+ "type": "symfony-pack",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A pack for the Symfony web profiler",
+ "time": "2017-12-12T01:48:24+00:00"
+ },
+ {
+ "name": "symfony/stopwatch",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "07463bbbbbfe119045a24c4a516f92ebd2752784"
},
- "require-dev": {
- "cache/integration-tests": "dev-master",
- "doctrine/annotations": "~1.0",
- "doctrine/cache": "~1.6",
- "doctrine/data-fixtures": "1.0.*",
- "doctrine/dbal": "~2.4",
- "doctrine/doctrine-bundle": "~1.4",
- "doctrine/orm": "~2.4,>=2.4.5",
- "egulias/email-validator": "~1.2,>=1.2.8|~2.0",
- "monolog/monolog": "~1.11",
- "ocramius/proxy-manager": "~0.4|~1.0|~2.0",
- "phpdocumentor/reflection-docblock": "^3.0|^4.0",
- "predis/predis": "~1.0",
- "symfony/phpunit-bridge": "~3.4|~4.0",
- "symfony/security-acl": "~2.8|~3.0"
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/07463bbbbbfe119045a24c4a516f92ebd2752784",
+ "reference": "07463bbbbbfe119045a24c4a516f92ebd2752784",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-master": "4.1-dev"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Bridge\\Doctrine\\": "src/Symfony/Bridge/Doctrine/",
- "Symfony\\Bridge\\Monolog\\": "src/Symfony/Bridge/Monolog/",
- "Symfony\\Bridge\\ProxyManager\\": "src/Symfony/Bridge/ProxyManager/",
- "Symfony\\Bridge\\Twig\\": "src/Symfony/Bridge/Twig/",
- "Symfony\\Bundle\\": "src/Symfony/Bundle/",
- "Symfony\\Component\\": "src/Symfony/Component/"
+ "Symfony\\Component\\Stopwatch\\": ""
},
- "classmap": [
- "src/Symfony/Component/Intl/Resources/stubs"
- ],
"exclude-from-classmap": [
- "**/Tests/"
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2686,50 +6437,62 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "The Symfony PHP framework",
+ "description": "Symfony Stopwatch Component",
"homepage": "https://symfony.com",
- "keywords": [
- "framework"
- ],
- "time": "2018-01-05T08:55:01+00:00"
+ "time": "2018-02-19T16:51:42+00:00"
},
{
- "name": "twig/extensions",
- "version": "v1.5.1",
+ "name": "symfony/var-dumper",
+ "version": "v4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/twigphp/Twig-extensions.git",
- "reference": "d188c76168b853481cc75879ea045bf93d718e9c"
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "bc88ad53e825ebacc7b190bbd360781fce381c64"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/d188c76168b853481cc75879ea045bf93d718e9c",
- "reference": "d188c76168b853481cc75879ea045bf93d718e9c",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/bc88ad53e825ebacc7b190bbd360781fce381c64",
+ "reference": "bc88ad53e825ebacc7b190bbd360781fce381c64",
"shasum": ""
},
"require": {
- "twig/twig": "~1.27|~2.0"
+ "php": "^7.1.3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php72": "~1.5"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+ "symfony/console": "<3.4"
},
"require-dev": {
- "symfony/phpunit-bridge": "~3.3@dev",
- "symfony/translation": "~2.3|~3.0"
+ "ext-iconv": "*",
+ "symfony/process": "~3.4|~4.0",
+ "twig/twig": "~1.34|~2.4"
},
"suggest": {
- "symfony/translation": "Allow the time_diff output to be translated"
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-intl": "To show region name in time zone dump",
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
},
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.5-dev"
+ "dev-master": "4.1-dev"
}
},
"autoload": {
- "psr-0": {
- "Twig_Extensions_": "lib/"
- },
+ "files": [
+ "Resources/functions/dump.php"
+ ],
"psr-4": {
- "Twig\\Extensions\\": "src/"
- }
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2737,202 +6500,306 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Common additional features for Twig that do not directly belong in core",
- "homepage": "http://twig.sensiolabs.org/doc/extensions/index.html",
+ "description": "Symfony mechanism for exploring and dumping PHP variables",
+ "homepage": "https://symfony.com",
"keywords": [
- "i18n",
- "text"
+ "debug",
+ "dump"
],
- "time": "2017-06-08T18:19:53+00:00"
+ "time": "2018-04-29T07:56:09+00:00"
},
{
- "name": "twig/twig",
- "version": "v2.4.4",
+ "name": "symfony/web-profiler-bundle",
+ "version": "v4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/twigphp/Twig.git",
- "reference": "eddb97148ad779f27e670e1e3f19fb323aedafeb"
+ "url": "https://github.com/symfony/web-profiler-bundle.git",
+ "reference": "8b3914ac388b2c560d4dc162c8136d136245718b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/eddb97148ad779f27e670e1e3f19fb323aedafeb",
- "reference": "eddb97148ad779f27e670e1e3f19fb323aedafeb",
+ "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/8b3914ac388b2c560d4dc162c8136d136245718b",
+ "reference": "8b3914ac388b2c560d4dc162c8136d136245718b",
"shasum": ""
},
"require": {
- "php": "^7.0",
- "symfony/polyfill-mbstring": "~1.0"
+ "php": "^7.1.3",
+ "symfony/http-kernel": "~4.1",
+ "symfony/routing": "~3.4|~4.0",
+ "symfony/twig-bridge": "~3.4|~4.0",
+ "symfony/var-dumper": "~3.4|~4.0",
+ "twig/twig": "~1.34|~2.4"
+ },
+ "conflict": {
+ "symfony/config": "<3.4",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/event-dispatcher": "<3.4",
+ "symfony/var-dumper": "<3.4"
},
"require-dev": {
- "psr/container": "^1.0",
- "symfony/debug": "~2.7",
- "symfony/phpunit-bridge": "~3.3@dev"
+ "symfony/config": "~3.4|~4.0",
+ "symfony/console": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/stopwatch": "~3.4|~4.0"
},
- "type": "library",
+ "type": "symfony-bundle",
"extra": {
"branch-alias": {
- "dev-master": "2.4-dev"
+ "dev-master": "4.1-dev"
}
},
"autoload": {
- "psr-0": {
- "Twig_": "lib/"
- },
"psr-4": {
- "Twig\\": "src/"
- }
+ "Symfony\\Bundle\\WebProfilerBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
"name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": "http://fabien.potencier.org",
- "role": "Lead Developer"
+ "email": "fabien@symfony.com"
},
{
- "name": "Armin Ronacher",
- "email": "armin.ronacher@active-4.com",
- "role": "Project Founder"
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony WebProfilerBundle",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-23T13:33:23+00:00"
+ },
+ {
+ "name": "symfony/web-server-bundle",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/web-server-bundle.git",
+ "reference": "d8f9acbb98e8ce8c45aabe9b695615bed0e77fb4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/web-server-bundle/zipball/d8f9acbb98e8ce8c45aabe9b695615bed0e77fb4",
+ "reference": "d8f9acbb98e8ce8c45aabe9b695615bed0e77fb4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/console": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/http-kernel": "~3.4|~4.0",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/process": "^3.4.2|^4.0.2"
+ },
+ "suggest": {
+ "symfony/expression-language": "For using the filter option of the log server.",
+ "symfony/monolog-bridge": "For using the log server."
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\WebServerBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
- "name": "Twig Team",
- "homepage": "http://twig.sensiolabs.org/contributors",
- "role": "Contributors"
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Twig, the flexible, fast, and secure template language for PHP",
- "homepage": "http://twig.sensiolabs.org",
- "keywords": [
- "templating"
- ],
- "time": "2017-09-27T18:10:31+00:00"
+ "description": "Symfony WebServerBundle",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-07T07:14:12+00:00"
},
{
- "name": "zendframework/zend-code",
- "version": "3.3.0",
+ "name": "symfony/yaml",
+ "version": "v4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/zendframework/zend-code.git",
- "reference": "6b1059db5b368db769e4392c6cb6cc139e56640d"
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "80e4bfa9685fc4a09acc4a857ec16974a9cd944e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zendframework/zend-code/zipball/6b1059db5b368db769e4392c6cb6cc139e56640d",
- "reference": "6b1059db5b368db769e4392c6cb6cc139e56640d",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/80e4bfa9685fc4a09acc4a857ec16974a9cd944e",
+ "reference": "80e4bfa9685fc4a09acc4a857ec16974a9cd944e",
"shasum": ""
},
"require": {
- "php": "^7.1",
- "zendframework/zend-eventmanager": "^2.6 || ^3.0"
+ "php": "^7.1.3",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/console": "<3.4"
},
"require-dev": {
- "doctrine/annotations": "~1.0",
- "ext-phar": "*",
- "phpunit/phpunit": "^6.2.3",
- "zendframework/zend-coding-standard": "^1.0.0",
- "zendframework/zend-stdlib": "^2.7 || ^3.0"
+ "symfony/console": "~3.4|~4.0"
},
"suggest": {
- "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
- "zendframework/zend-stdlib": "Zend\\Stdlib component"
+ "symfony/console": "For validating YAML files using the lint command"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev",
- "dev-develop": "3.3-dev"
+ "dev-master": "4.1-dev"
}
},
"autoload": {
"psr-4": {
- "Zend\\Code\\": "src/"
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2018-05-30T07:26:09+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b",
+ "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
- "description": "provides facilities to generate arbitrary code using an object oriented interface",
- "homepage": "https://github.com/zendframework/zend-code",
- "keywords": [
- "code",
- "zf2"
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
],
- "time": "2017-10-20T15:21:32+00:00"
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "time": "2017-04-07T12:08:54+00:00"
},
{
- "name": "zendframework/zend-eventmanager",
- "version": "3.2.0",
+ "name": "webmozart/assert",
+ "version": "1.3.0",
"source": {
"type": "git",
- "url": "https://github.com/zendframework/zend-eventmanager.git",
- "reference": "9d72db10ceb6e42fb92350c0cb54460da61bd79c"
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "0df1908962e7a3071564e857d86874dad1ef204a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/9d72db10ceb6e42fb92350c0cb54460da61bd79c",
- "reference": "9d72db10ceb6e42fb92350c0cb54460da61bd79c",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a",
+ "reference": "0df1908962e7a3071564e857d86874dad1ef204a",
"shasum": ""
},
"require": {
- "php": "^5.6 || ^7.0"
+ "php": "^5.3.3 || ^7.0"
},
"require-dev": {
- "athletic/athletic": "^0.1",
- "container-interop/container-interop": "^1.1.0",
- "phpunit/phpunit": "^6.0.7 || ^5.7.14",
- "zendframework/zend-coding-standard": "~1.0.0",
- "zendframework/zend-stdlib": "^2.7.3 || ^3.0"
- },
- "suggest": {
- "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature",
- "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature"
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev",
- "dev-develop": "3.3-dev"
+ "dev-master": "1.3-dev"
}
},
"autoload": {
"psr-4": {
- "Zend\\EventManager\\": "src/"
+ "Webmozart\\Assert\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
- "description": "Trigger and listen to events within a PHP application",
- "homepage": "https://github.com/zendframework/zend-eventmanager",
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
"keywords": [
- "event",
- "eventmanager",
- "events",
- "zf2"
+ "assert",
+ "check",
+ "validate"
],
- "time": "2017-07-11T19:17:22+00:00"
+ "time": "2018-01-29T19:49:41+00:00"
}
],
- "packages-dev": [],
"aliases": [],
"minimum-stability": "RC",
"stability-flags": {
- "gos/web-socket-bundle": 5
+ "gos/web-socket-bundle": 20
},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
- "php": ">=5.5"
+ "php": ">=7.2"
},
"platform-dev": []
}
diff --git a/config/bundles.php b/config/bundles.php
new file mode 100644
index 0000000..11d9de9
--- /dev/null
+++ b/config/bundles.php
@@ -0,0 +1,17 @@
+ ['all' => true],
+ Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
+ Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
+ Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
+ Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true],
+ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
+ Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'beta' => true, 'test' => true],
+ Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'beta' => true, 'test' => true],
+ Gos\Bundle\WebSocketBundle\GosWebSocketBundle::class => ['all' => true],
+ Gos\Bundle\PubSubRouterBundle\GosPubSubRouterBundle::class => ['all' => true],
+ Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle::class => ['all' => true],
+ Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
+ Symfony\Bundle\WebServerBundle\WebServerBundle::class => ['dev' => true],
+];
diff --git a/src/AppBundle/Resources/config/pubsub/routing.yml b/config/gos_routes/routes.yaml
similarity index 100%
rename from src/AppBundle/Resources/config/pubsub/routing.yml
rename to config/gos_routes/routes.yaml
diff --git a/config/packages/dev/debug.yaml b/config/packages/dev/debug.yaml
new file mode 100644
index 0000000..26d4e53
--- /dev/null
+++ b/config/packages/dev/debug.yaml
@@ -0,0 +1,4 @@
+debug:
+ # Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser.
+ # See the "server:dump" command to start a new server.
+ dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%"
diff --git a/config/packages/dev/easy_log_handler.yaml b/config/packages/dev/easy_log_handler.yaml
new file mode 100644
index 0000000..27bfc60
--- /dev/null
+++ b/config/packages/dev/easy_log_handler.yaml
@@ -0,0 +1,16 @@
+services:
+ EasyCorp\EasyLog\EasyLogHandler:
+ public: false
+ arguments: ['%kernel.logs_dir%/%kernel.environment%.log']
+
+#// FIXME: How to add this configuration automatically without messing up with the monolog configuration?
+#monolog:
+# handlers:
+# buffered:
+# type: buffer
+# handler: easylog
+# channels: ['!event']
+# level: debug
+# easylog:
+# type: service
+# id: EasyCorp\EasyLog\EasyLogHandler
diff --git a/config/packages/dev/framework.yaml b/config/packages/dev/framework.yaml
new file mode 100644
index 0000000..7084d90
--- /dev/null
+++ b/config/packages/dev/framework.yaml
@@ -0,0 +1,4 @@
+framework:
+ router:
+ strict_requirements: true
+ profiler: { only_exceptions: false }
\ No newline at end of file
diff --git a/app/config/config_dev.yml b/config/packages/dev/monolog.yaml
old mode 100755
new mode 100644
similarity index 67%
rename from app/config/config_dev.yml
rename to config/packages/dev/monolog.yaml
index 29d9dcc..1b846b8
--- a/app/config/config_dev.yml
+++ b/config/packages/dev/monolog.yaml
@@ -1,16 +1,3 @@
-imports:
- - { resource: config.yml }
-
-framework:
- router:
- resource: "%kernel.root_dir%/config/routing_dev.yml"
- strict_requirements: true
- profiler: { only_exceptions: false }
-
-web_profiler:
- toolbar: true
- intercept_redirects: false
-
monolog:
handlers:
main:
@@ -31,4 +18,4 @@ monolog:
VERBOSITY_VERBOSE: NOTICE
VERBOSITY_VERY_VERBOSE: NOTICE
VERBOSITY_DEBUG: DEBUG
- channels: ["doctrine"]
+ channels: ["doctrine"]
\ No newline at end of file
diff --git a/config/packages/dev/routing.yaml b/config/packages/dev/routing.yaml
new file mode 100644
index 0000000..4116679
--- /dev/null
+++ b/config/packages/dev/routing.yaml
@@ -0,0 +1,3 @@
+framework:
+ router:
+ strict_requirements: true
diff --git a/config/packages/dev/swiftmailer.yaml b/config/packages/dev/swiftmailer.yaml
new file mode 100644
index 0000000..b98158e
--- /dev/null
+++ b/config/packages/dev/swiftmailer.yaml
@@ -0,0 +1,4 @@
+# See https://symfony.com/doc/current/email/dev_environment.html
+swiftmailer:
+ # send all emails to a specific address
+ #delivery_addresses: ['me@example.com']
diff --git a/config/packages/dev/web_profiler.yaml b/config/packages/dev/web_profiler.yaml
new file mode 100644
index 0000000..1f1cb2b
--- /dev/null
+++ b/config/packages/dev/web_profiler.yaml
@@ -0,0 +1,3 @@
+web_profiler:
+ toolbar: true
+ intercept_redirects: false
diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml
new file mode 100644
index 0000000..c5ecbb4
--- /dev/null
+++ b/config/packages/doctrine.yaml
@@ -0,0 +1,20 @@
+# Doctrine Configuration
+doctrine:
+ dbal:
+ driver: "%env(DATABASE_DRIVER)%"
+ host: "%env(DATABASE_HOST)%"
+ port: "%env(DATABASE_PORT)%"
+ dbname: "%env(DATABASE_NAME)%"
+ user: "%env(DATABASE_USER)%%"
+ password: "%env(DATABASE_PASSWORD)%"
+ charset: UTF8
+ # if using pdo_sqlite as your database driver:
+ # 1. add the path in parameters.yml
+ # e.g. database_path: "%kernel.root_dir%/data/data.db3"
+ # 2. Uncomment database_path in parameters.yml.dist
+ # 3. Uncomment next line:
+ # path: "%database_path%"
+
+ orm:
+ auto_generate_proxy_classes: "%kernel.debug%"
+ auto_mapping: true
\ No newline at end of file
diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml
new file mode 100644
index 0000000..cb2494c
--- /dev/null
+++ b/config/packages/framework.yaml
@@ -0,0 +1,21 @@
+framework:
+ #esi: ~
+ #translator: { fallbacks: ["%locale%"] }
+ secret: '%env(APP_SECRET)%'
+ router:
+ strict_requirements: ~
+ form: ~
+ csrf_protection: ~
+ validation: { enable_annotations: true }
+ templating:
+ engines: ['twig']
+ #assets_version: SomeVersionScheme
+ default_locale: "%env(LOCALE)%"
+ trusted_hosts: ~
+ session:
+ # handler_id set to null will use default session handler from php.ini
+ handler_id: ~
+ fragments: ~
+ http_method_override: true
+ php_errors:
+ log: true
\ No newline at end of file
diff --git a/config/packages/gos_web_socket.yaml b/config/packages/gos_web_socket.yaml
new file mode 100644
index 0000000..ff36886
--- /dev/null
+++ b/config/packages/gos_web_socket.yaml
@@ -0,0 +1,7 @@
+gos_web_socket:
+ server:
+ port: '%env(GOS_WEB_SOCKET_PORT)%' #The port the socket server will listen on
+ host: '%env(GOS_WEB_SOCKET_HOST)%' #The host ip to bind to
+ router:
+ resources:
+ - '%kernel.project_dir%/config/gos_routes/routes.yaml'
diff --git a/config/packages/prod/doctrine.yaml b/config/packages/prod/doctrine.yaml
new file mode 100644
index 0000000..2f16f0f
--- /dev/null
+++ b/config/packages/prod/doctrine.yaml
@@ -0,0 +1,31 @@
+doctrine:
+ orm:
+ metadata_cache_driver:
+ type: service
+ id: doctrine.system_cache_provider
+ query_cache_driver:
+ type: service
+ id: doctrine.system_cache_provider
+ result_cache_driver:
+ type: service
+ id: doctrine.result_cache_provider
+
+services:
+ doctrine.result_cache_provider:
+ class: Symfony\Component\Cache\DoctrineProvider
+ public: false
+ arguments:
+ - '@doctrine.result_cache_pool'
+ doctrine.system_cache_provider:
+ class: Symfony\Component\Cache\DoctrineProvider
+ public: false
+ arguments:
+ - '@doctrine.system_cache_pool'
+
+framework:
+ cache:
+ pools:
+ doctrine.result_cache_pool:
+ adapter: cache.app
+ doctrine.system_cache_pool:
+ adapter: cache.system
diff --git a/app/config/config_prod.yml b/config/packages/prod/monolog.yaml
old mode 100755
new mode 100644
similarity index 59%
rename from app/config/config_prod.yml
rename to config/packages/prod/monolog.yaml
index 342837a..25f2c67
--- a/app/config/config_prod.yml
+++ b/config/packages/prod/monolog.yaml
@@ -1,16 +1,3 @@
-imports:
- - { resource: config.yml }
-
-#framework:
-# validation:
-# cache: apc
-
-#doctrine:
-# orm:
-# metadata_cache_driver: apc
-# result_cache_driver: apc
-# query_cache_driver: apc
-
monolog:
handlers:
main:
diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml
new file mode 100644
index 0000000..368bc7f
--- /dev/null
+++ b/config/packages/routing.yaml
@@ -0,0 +1,3 @@
+framework:
+ router:
+ strict_requirements: ~
diff --git a/config/packages/security.yaml b/config/packages/security.yaml
new file mode 100755
index 0000000..3fd6152
--- /dev/null
+++ b/config/packages/security.yaml
@@ -0,0 +1,27 @@
+security:
+ # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
+ providers:
+ in_memory:
+ memory: ~
+
+ firewalls:
+ dev:
+ pattern: ^/(_(profiler|wdt|error)|css|images|js)/
+ security: false
+
+ main:
+ anonymous: ~
+
+ # activate different ways to authenticate
+
+ # http_basic: true
+ # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
+
+ # form_login: true
+ # https://symfony.com/doc/current/security/form_login_setup.html
+
+ # Easy way to control access for large sections of your site
+ # Note: Only the *first* access control that matches will be used
+ access_control:
+ # - { path: ^/admin, roles: ROLE_ADMIN }
+ # - { path: ^/profile, roles: ROLE_USER }
diff --git a/config/packages/swiftmailer.yaml b/config/packages/swiftmailer.yaml
new file mode 100644
index 0000000..cae6508
--- /dev/null
+++ b/config/packages/swiftmailer.yaml
@@ -0,0 +1,3 @@
+swiftmailer:
+ url: '%env(MAILER_URL)%'
+ spool: { type: 'memory' }
diff --git a/config/packages/test/framework.yaml b/config/packages/test/framework.yaml
new file mode 100644
index 0000000..778aa54
--- /dev/null
+++ b/config/packages/test/framework.yaml
@@ -0,0 +1,7 @@
+imports:
+ - { resource: ../dev/framework.yaml }
+
+framework:
+ test: ~
+ session:
+ storage_id: session.storage.mock_file
\ No newline at end of file
diff --git a/config/packages/test/monolog.yaml b/config/packages/test/monolog.yaml
new file mode 100644
index 0000000..2762653
--- /dev/null
+++ b/config/packages/test/monolog.yaml
@@ -0,0 +1,7 @@
+monolog:
+ handlers:
+ main:
+ type: stream
+ path: "%kernel.logs_dir%/%kernel.environment%.log"
+ level: debug
+ channels: ["!event"]
diff --git a/config/packages/test/swiftmailer.yaml b/config/packages/test/swiftmailer.yaml
new file mode 100644
index 0000000..f438078
--- /dev/null
+++ b/config/packages/test/swiftmailer.yaml
@@ -0,0 +1,2 @@
+swiftmailer:
+ disable_delivery: true
diff --git a/config/packages/test/web_profiler.yaml b/config/packages/test/web_profiler.yaml
new file mode 100644
index 0000000..39455f4
--- /dev/null
+++ b/config/packages/test/web_profiler.yaml
@@ -0,0 +1,9 @@
+imports:
+ - { resource: ../dev/web_profiler.yaml }
+
+web_profiler:
+ toolbar: false
+ intercept_redirects: false
+
+framework:
+ profiler: { collect: false }
\ No newline at end of file
diff --git a/config/packages/translation.yaml b/config/packages/translation.yaml
new file mode 100644
index 0000000..31a34b8
--- /dev/null
+++ b/config/packages/translation.yaml
@@ -0,0 +1,7 @@
+framework:
+ default_locale: '%env(LOCALE)%'
+ translator:
+ paths:
+ - '%kernel.project_dir%/translations'
+ fallbacks:
+ - '%env(LOCALE)%'
diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml
new file mode 100644
index 0000000..f801a48
--- /dev/null
+++ b/config/packages/twig.yaml
@@ -0,0 +1,3 @@
+twig:
+ debug: "%kernel.debug%"
+ strict_variables: "%kernel.debug%"
\ No newline at end of file
diff --git a/config/packages/twig_extensions.yaml b/config/packages/twig_extensions.yaml
new file mode 100644
index 0000000..417b7bc
--- /dev/null
+++ b/config/packages/twig_extensions.yaml
@@ -0,0 +1,10 @@
+services:
+ _defaults:
+ public: false
+ autowire: true
+ autoconfigure: true
+
+ #Twig\Extensions\ArrayExtension: ~
+ #Twig\Extensions\DateExtension: ~
+ #Twig\Extensions\IntlExtension: ~
+ #Twig\Extensions\TextExtension: ~
diff --git a/app/cache/.gitkeep b/config/routes.yaml
old mode 100755
new mode 100644
similarity index 100%
rename from app/cache/.gitkeep
rename to config/routes.yaml
diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml
new file mode 100644
index 0000000..d49a502
--- /dev/null
+++ b/config/routes/annotations.yaml
@@ -0,0 +1,3 @@
+controllers:
+ resource: ../../src/Controller/
+ type: annotation
diff --git a/config/routes/dev/twig.yaml b/config/routes/dev/twig.yaml
new file mode 100644
index 0000000..f4ee839
--- /dev/null
+++ b/config/routes/dev/twig.yaml
@@ -0,0 +1,3 @@
+_errors:
+ resource: '@TwigBundle/Resources/config/routing/errors.xml'
+ prefix: /_error
diff --git a/config/routes/dev/web_profiler.yaml b/config/routes/dev/web_profiler.yaml
new file mode 100644
index 0000000..c82beff
--- /dev/null
+++ b/config/routes/dev/web_profiler.yaml
@@ -0,0 +1,7 @@
+web_profiler_wdt:
+ resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml'
+ prefix: /_wdt
+
+web_profiler_profiler:
+ resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml'
+ prefix: /_profiler
diff --git a/app/config/routing_dev.yml b/config/routes_dev.yaml
old mode 100755
new mode 100644
similarity index 89%
rename from app/config/routing_dev.yml
rename to config/routes_dev.yaml
index 404f6a3..d2f8db3
--- a/app/config/routing_dev.yml
+++ b/config/routes_dev.yaml
@@ -9,6 +9,3 @@ _profiler:
_errors:
resource: "@TwigBundle/Resources/config/routing/errors.xml"
prefix: /_error
-
-_main:
- resource: routing.yml
diff --git a/config/services.yaml b/config/services.yaml
new file mode 100644
index 0000000..baf46d8
--- /dev/null
+++ b/config/services.yaml
@@ -0,0 +1,36 @@
+# Put parameters here that don't need to change on each machine where the app is deployed
+# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
+parameters:
+ locale: 'en'
+
+services:
+ # default configuration for services in *this* file
+ _defaults:
+ autowire: true # Automatically injects dependencies in your services.
+ autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
+ public: false # Allows optimizing the container by removing unused services; this also means
+ # fetching services directly from the container via $container->get() won't work.
+ # The best practice is to be explicit about your dependencies anyway.
+
+ # makes classes in src/ available to be used as services
+ # this creates a service per class whose id is the fully-qualified class name
+ App\:
+ resource: '../src/*'
+ exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'
+
+ # controllers are imported separately to make sure services can be injected
+ # as action arguments even if you don't extend any base controller class
+ App\Controller\:
+ resource: '../src/Controller'
+ tags: ['controller.service_arguments']
+
+ # add more service definitions when explicit configuration is needed
+ # please note that last definitions always *replace* previous ones
+
+ App\Topic\AcmeTopic:
+ tags:
+ - { name: gos_web_socket.topic }
+
+ App\Rpc\AcmeRpc:
+ tags:
+ - { name: gos_web_socket.rpc }
\ No newline at end of file
diff --git a/config/services_test.yaml b/config/services_test.yaml
new file mode 100644
index 0000000..4bb143f
--- /dev/null
+++ b/config/services_test.yaml
@@ -0,0 +1,10 @@
+services:
+ _defaults:
+ public: false
+ autowire: true
+ autoconfigure: true
+ # If you need to access services in a test, create an alias
+ # and then fetch that alias from the container. As a convention,
+ # aliases are prefixed with test. For example:
+ #
+ # test.App\Service\MyService: '@App\Service\MyService'
diff --git a/phpunit.xml b/phpunit.xml
new file mode 100644
index 0000000..208506f
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tests
+
+
+
+
+
+ src
+
+
+
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 0000000..208506f
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tests
+
+
+
+
+
+ src
+
+
+
diff --git a/web/.htaccess b/public/.htaccess
similarity index 68%
rename from web/.htaccess
rename to public/.htaccess
index 94b3892..1fbf8f4 100755
--- a/web/.htaccess
+++ b/public/.htaccess
@@ -1,12 +1,18 @@
# Use the front controller as index file. It serves as a fallback solution when
# every other rewrite/redirect fails (e.g. in an aliased environment without
# mod_rewrite). Additionally, this reduces the matching process for the
-# start page (path "/") because otherwise Apache will apply the rewriting rules
+# start page (path "/") because otherwise Apache will indexly the rewriting rules
# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
-DirectoryIndex app.php
+DirectoryIndex index.php
-# Disabling MultiViews prevents unwanted negotiation, e.g. "/app" should not resolve
-# to the front controller "/app.php" but be rewritten to "/app.php/app".
+# By default, Apache does not evaluate symbolic links if you did not enable this
+# feature in your server configuration. Uncomment the following line if you
+# install assets as symlinks or if you experience problems related to symlinks
+# when compiling LESS/Sass/CoffeScript assets.
+# Options FollowSymlinks
+
+# Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve
+# to the front controller "/index.php" but be rewritten to "/index.php/index".
Options -MultiViews
@@ -17,19 +23,19 @@ DirectoryIndex app.php
# Determine the RewriteBase automatically and set it as environment variable.
# If you are using Apache aliases to do mass virtual hosting or installed the
# project in a subdirectory, the base path will be prepended to allow proper
- # resolution of the app.php file and to redirect to the correct URI. It will
+ # resolution of the index.php file and to redirect to the correct URI. It will
# work in environments without path prefix as well, providing a safe, one-size
# fits all solution. But as you do not need it in this case, you can comment
# the following 2 lines to eliminate the overhead.
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
- # Sets the HTTP_AUTHORIZATION header removed by apache
+ # Sets the HTTP_AUTHORIZATION header removed by Apache
RewriteCond %{HTTP:Authorization} .
- RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect to URI without front controller to prevent duplicate content
- # (with and without `/app.php`). Only do this redirect on the initial
+ # (with and without `/index.php`). Only do this redirect on the initial
# rewrite by Apache and not on subsequent cycles. Otherwise we would get an
# endless redirect loop (request -> rewrite to front controller ->
# redirect -> request -> ...).
@@ -40,15 +46,15 @@ DirectoryIndex app.php
# - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
# following RewriteCond (best solution)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
- RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
+ RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
RewriteCond %{REQUEST_FILENAME} -f
- RewriteRule .? - [L]
+ RewriteRule ^ - [L]
# Rewrite all other queries to the front controller.
- RewriteRule .? %{ENV:BASE}/app.php [L]
+ RewriteRule ^ %{ENV:BASE}/index.php [L]
@@ -56,7 +62,7 @@ DirectoryIndex app.php
# When mod_rewrite is not available, we instruct a temporary redirect of
# the start page to the front controller explicitly so that the website
# and the generated links can still be used.
- RedirectMatch 302 ^/$ /app.php/
+ RedirectMatch 302 ^/$ /index.php/
# RedirectTemp cannot be used instead
-
+
\ No newline at end of file
diff --git a/web/apple-touch-icon.png b/public/apple-touch-icon.png
similarity index 100%
rename from web/apple-touch-icon.png
rename to public/apple-touch-icon.png
diff --git a/public/build/autobahn.js b/public/build/autobahn.js
new file mode 100644
index 0000000..a96ef09
--- /dev/null
+++ b/public/build/autobahn.js
@@ -0,0 +1,3549 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "/build/";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./vendor/gos/web-socket-bundle/Resources/public/js/vendor/autobahn.min.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./node_modules/process/browser.js":
+/*!*****************************************!*\
+ !*** ./node_modules/process/browser.js ***!
+ \*****************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports) {
+
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+ throw new Error('clearTimeout has not been defined');
+}
+(function () {
+ try {
+ if (typeof setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ if (typeof clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+} ())
+function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch(e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch(e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+
+
+}
+function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+}
+
+function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while(len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/amd-define.js":
+/*!***************************************!*\
+ !*** (webpack)/buildin/amd-define.js ***!
+ \***************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports) {
+
+module.exports = function() {
+ throw new Error("define cannot be used indirect");
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/Promise.js":
+/*!******************************************!*\
+ !*** ./node_modules/when/lib/Promise.js ***!
+ \******************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function (require) {
+
+ var makePromise = __webpack_require__(/*! ./makePromise */ "./node_modules/when/lib/makePromise.js");
+ var Scheduler = __webpack_require__(/*! ./Scheduler */ "./node_modules/when/lib/Scheduler.js");
+ var async = __webpack_require__(/*! ./env */ "./node_modules/when/lib/env.js").asap;
+
+ return makePromise({
+ scheduler: new Scheduler(async)
+ });
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+})(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js"));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/Scheduler.js":
+/*!********************************************!*\
+ !*** ./node_modules/when/lib/Scheduler.js ***!
+ \********************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+
+ // Credit to Twisol (https://github.com/Twisol) for suggesting
+ // this type of extensible queue + trampoline approach for next-tick conflation.
+
+ /**
+ * Async task scheduler
+ * @param {function} async function to schedule a single async function
+ * @constructor
+ */
+ function Scheduler(async) {
+ this._async = async;
+ this._running = false;
+
+ this._queue = this;
+ this._queueLen = 0;
+ this._afterQueue = {};
+ this._afterQueueLen = 0;
+
+ var self = this;
+ this.drain = function() {
+ self._drain();
+ };
+ }
+
+ /**
+ * Enqueue a task
+ * @param {{ run:function }} task
+ */
+ Scheduler.prototype.enqueue = function(task) {
+ this._queue[this._queueLen++] = task;
+ this.run();
+ };
+
+ /**
+ * Enqueue a task to run after the main task queue
+ * @param {{ run:function }} task
+ */
+ Scheduler.prototype.afterQueue = function(task) {
+ this._afterQueue[this._afterQueueLen++] = task;
+ this.run();
+ };
+
+ Scheduler.prototype.run = function() {
+ if (!this._running) {
+ this._running = true;
+ this._async(this.drain);
+ }
+ };
+
+ /**
+ * Drain the handler queue entirely, and then the after queue
+ */
+ Scheduler.prototype._drain = function() {
+ var i = 0;
+ for (; i < this._queueLen; ++i) {
+ this._queue[i].run();
+ this._queue[i] = void 0;
+ }
+
+ this._queueLen = 0;
+ this._running = false;
+
+ for (i = 0; i < this._afterQueueLen; ++i) {
+ this._afterQueue[i].run();
+ this._afterQueue[i] = void 0;
+ }
+
+ this._afterQueueLen = 0;
+ };
+
+ return Scheduler;
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/TimeoutError.js":
+/*!***********************************************!*\
+ !*** ./node_modules/when/lib/TimeoutError.js ***!
+ \***********************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+
+ /**
+ * Custom error type for promises rejected by promise.timeout
+ * @param {string} message
+ * @constructor
+ */
+ function TimeoutError (message) {
+ Error.call(this);
+ this.message = message;
+ this.name = TimeoutError.name;
+ if (typeof Error.captureStackTrace === 'function') {
+ Error.captureStackTrace(this, TimeoutError);
+ }
+ }
+
+ TimeoutError.prototype = Object.create(Error.prototype);
+ TimeoutError.prototype.constructor = TimeoutError;
+
+ return TimeoutError;
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/apply.js":
+/*!****************************************!*\
+ !*** ./node_modules/when/lib/apply.js ***!
+ \****************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+
+ makeApply.tryCatchResolve = tryCatchResolve;
+
+ return makeApply;
+
+ function makeApply(Promise, call) {
+ if(arguments.length < 2) {
+ call = tryCatchResolve;
+ }
+
+ return apply;
+
+ function apply(f, thisArg, args) {
+ var p = Promise._defer();
+ var l = args.length;
+ var params = new Array(l);
+ callAndResolve({ f:f, thisArg:thisArg, args:args, params:params, i:l-1, call:call }, p._handler);
+
+ return p;
+ }
+
+ function callAndResolve(c, h) {
+ if(c.i < 0) {
+ return call(c.f, c.thisArg, c.params, h);
+ }
+
+ var handler = Promise._handler(c.args[c.i]);
+ handler.fold(callAndResolveNext, c, void 0, h);
+ }
+
+ function callAndResolveNext(c, x, h) {
+ c.params[c.i] = x;
+ c.i -= 1;
+ callAndResolve(c, h);
+ }
+ }
+
+ function tryCatchResolve(f, thisArg, args, resolver) {
+ try {
+ resolver.resolve(f.apply(thisArg, args));
+ } catch(e) {
+ resolver.reject(e);
+ }
+ }
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/decorators/array.js":
+/*!***************************************************!*\
+ !*** ./node_modules/when/lib/decorators/array.js ***!
+ \***************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function(require) {
+
+ var state = __webpack_require__(/*! ../state */ "./node_modules/when/lib/state.js");
+ var applier = __webpack_require__(/*! ../apply */ "./node_modules/when/lib/apply.js");
+
+ return function array(Promise) {
+
+ var applyFold = applier(Promise);
+ var toPromise = Promise.resolve;
+ var all = Promise.all;
+
+ var ar = Array.prototype.reduce;
+ var arr = Array.prototype.reduceRight;
+ var slice = Array.prototype.slice;
+
+ // Additional array combinators
+
+ Promise.any = any;
+ Promise.some = some;
+ Promise.settle = settle;
+
+ Promise.map = map;
+ Promise.filter = filter;
+ Promise.reduce = reduce;
+ Promise.reduceRight = reduceRight;
+
+ /**
+ * When this promise fulfills with an array, do
+ * onFulfilled.apply(void 0, array)
+ * @param {function} onFulfilled function to apply
+ * @returns {Promise} promise for the result of applying onFulfilled
+ */
+ Promise.prototype.spread = function(onFulfilled) {
+ return this.then(all).then(function(array) {
+ return onFulfilled.apply(this, array);
+ });
+ };
+
+ return Promise;
+
+ /**
+ * One-winner competitive race.
+ * Return a promise that will fulfill when one of the promises
+ * in the input array fulfills, or will reject when all promises
+ * have rejected.
+ * @param {array} promises
+ * @returns {Promise} promise for the first fulfilled value
+ */
+ function any(promises) {
+ var p = Promise._defer();
+ var resolver = p._handler;
+ var l = promises.length>>>0;
+
+ var pending = l;
+ var errors = [];
+
+ for (var h, x, i = 0; i < l; ++i) {
+ x = promises[i];
+ if(x === void 0 && !(i in promises)) {
+ --pending;
+ continue;
+ }
+
+ h = Promise._handler(x);
+ if(h.state() > 0) {
+ resolver.become(h);
+ Promise._visitRemaining(promises, i, h);
+ break;
+ } else {
+ h.visit(resolver, handleFulfill, handleReject);
+ }
+ }
+
+ if(pending === 0) {
+ resolver.reject(new RangeError('any(): array must not be empty'));
+ }
+
+ return p;
+
+ function handleFulfill(x) {
+ /*jshint validthis:true*/
+ errors = null;
+ this.resolve(x); // this === resolver
+ }
+
+ function handleReject(e) {
+ /*jshint validthis:true*/
+ if(this.resolved) { // this === resolver
+ return;
+ }
+
+ errors.push(e);
+ if(--pending === 0) {
+ this.reject(errors);
+ }
+ }
+ }
+
+ /**
+ * N-winner competitive race
+ * Return a promise that will fulfill when n input promises have
+ * fulfilled, or will reject when it becomes impossible for n
+ * input promises to fulfill (ie when promises.length - n + 1
+ * have rejected)
+ * @param {array} promises
+ * @param {number} n
+ * @returns {Promise} promise for the earliest n fulfillment values
+ *
+ * @deprecated
+ */
+ function some(promises, n) {
+ /*jshint maxcomplexity:7*/
+ var p = Promise._defer();
+ var resolver = p._handler;
+
+ var results = [];
+ var errors = [];
+
+ var l = promises.length>>>0;
+ var nFulfill = 0;
+ var nReject;
+ var x, i; // reused in both for() loops
+
+ // First pass: count actual array items
+ for(i=0; i nFulfill) {
+ resolver.reject(new RangeError('some(): array must contain at least '
+ + n + ' item(s), but had ' + nFulfill));
+ } else if(nFulfill === 0) {
+ resolver.resolve(results);
+ }
+
+ // Second pass: observe each array item, make progress toward goals
+ for(i=0; i 2 ? ar.call(promises, liftCombine(f), arguments[2])
+ : ar.call(promises, liftCombine(f));
+ }
+
+ /**
+ * Traditional reduce function, similar to `Array.prototype.reduceRight()`, but
+ * input may contain promises and/or values, and reduceFunc
+ * may return either a value or a promise, *and* initialValue may
+ * be a promise for the starting value.
+ * @param {Array|Promise} promises array or promise for an array of anything,
+ * may contain a mix of promises and values.
+ * @param {function(accumulated:*, x:*, index:Number):*} f reduce function
+ * @returns {Promise} that will resolve to the final reduced value
+ */
+ function reduceRight(promises, f /*, initialValue */) {
+ return arguments.length > 2 ? arr.call(promises, liftCombine(f), arguments[2])
+ : arr.call(promises, liftCombine(f));
+ }
+
+ function liftCombine(f) {
+ return function(z, x, i) {
+ return applyFold(f, void 0, [z,x,i]);
+ };
+ }
+ };
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/decorators/flow.js":
+/*!**************************************************!*\
+ !*** ./node_modules/when/lib/decorators/flow.js ***!
+ \**************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+
+ return function flow(Promise) {
+
+ var resolve = Promise.resolve;
+ var reject = Promise.reject;
+ var origCatch = Promise.prototype['catch'];
+
+ /**
+ * Handle the ultimate fulfillment value or rejection reason, and assume
+ * responsibility for all errors. If an error propagates out of result
+ * or handleFatalError, it will be rethrown to the host, resulting in a
+ * loud stack track on most platforms and a crash on some.
+ * @param {function?} onResult
+ * @param {function?} onError
+ * @returns {undefined}
+ */
+ Promise.prototype.done = function(onResult, onError) {
+ this._handler.visit(this._handler.receiver, onResult, onError);
+ };
+
+ /**
+ * Add Error-type and predicate matching to catch. Examples:
+ * promise.catch(TypeError, handleTypeError)
+ * .catch(predicate, handleMatchedErrors)
+ * .catch(handleRemainingErrors)
+ * @param onRejected
+ * @returns {*}
+ */
+ Promise.prototype['catch'] = Promise.prototype.otherwise = function(onRejected) {
+ if (arguments.length < 2) {
+ return origCatch.call(this, onRejected);
+ }
+
+ if(typeof onRejected !== 'function') {
+ return this.ensure(rejectInvalidPredicate);
+ }
+
+ return origCatch.call(this, createCatchFilter(arguments[1], onRejected));
+ };
+
+ /**
+ * Wraps the provided catch handler, so that it will only be called
+ * if the predicate evaluates truthy
+ * @param {?function} handler
+ * @param {function} predicate
+ * @returns {function} conditional catch handler
+ */
+ function createCatchFilter(handler, predicate) {
+ return function(e) {
+ return evaluatePredicate(e, predicate)
+ ? handler.call(this, e)
+ : reject(e);
+ };
+ }
+
+ /**
+ * Ensures that onFulfilledOrRejected will be called regardless of whether
+ * this promise is fulfilled or rejected. onFulfilledOrRejected WILL NOT
+ * receive the promises' value or reason. Any returned value will be disregarded.
+ * onFulfilledOrRejected may throw or return a rejected promise to signal
+ * an additional error.
+ * @param {function} handler handler to be called regardless of
+ * fulfillment or rejection
+ * @returns {Promise}
+ */
+ Promise.prototype['finally'] = Promise.prototype.ensure = function(handler) {
+ if(typeof handler !== 'function') {
+ return this;
+ }
+
+ return this.then(function(x) {
+ return runSideEffect(handler, this, identity, x);
+ }, function(e) {
+ return runSideEffect(handler, this, reject, e);
+ });
+ };
+
+ function runSideEffect (handler, thisArg, propagate, value) {
+ var result = handler.call(thisArg);
+ return maybeThenable(result)
+ ? propagateValue(result, propagate, value)
+ : propagate(value);
+ }
+
+ function propagateValue (result, propagate, x) {
+ return resolve(result).then(function () {
+ return propagate(x);
+ });
+ }
+
+ /**
+ * Recover from a failure by returning a defaultValue. If defaultValue
+ * is a promise, it's fulfillment value will be used. If defaultValue is
+ * a promise that rejects, the returned promise will reject with the
+ * same reason.
+ * @param {*} defaultValue
+ * @returns {Promise} new promise
+ */
+ Promise.prototype['else'] = Promise.prototype.orElse = function(defaultValue) {
+ return this.then(void 0, function() {
+ return defaultValue;
+ });
+ };
+
+ /**
+ * Shortcut for .then(function() { return value; })
+ * @param {*} value
+ * @return {Promise} a promise that:
+ * - is fulfilled if value is not a promise, or
+ * - if value is a promise, will fulfill with its value, or reject
+ * with its reason.
+ */
+ Promise.prototype['yield'] = function(value) {
+ return this.then(function() {
+ return value;
+ });
+ };
+
+ /**
+ * Runs a side effect when this promise fulfills, without changing the
+ * fulfillment value.
+ * @param {function} onFulfilledSideEffect
+ * @returns {Promise}
+ */
+ Promise.prototype.tap = function(onFulfilledSideEffect) {
+ return this.then(onFulfilledSideEffect)['yield'](this);
+ };
+
+ return Promise;
+ };
+
+ function rejectInvalidPredicate() {
+ throw new TypeError('catch predicate must be a function');
+ }
+
+ function evaluatePredicate(e, predicate) {
+ return isError(predicate) ? e instanceof predicate : predicate(e);
+ }
+
+ function isError(predicate) {
+ return predicate === Error
+ || (predicate != null && predicate.prototype instanceof Error);
+ }
+
+ function maybeThenable(x) {
+ return (typeof x === 'object' || typeof x === 'function') && x !== null;
+ }
+
+ function identity(x) {
+ return x;
+ }
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/decorators/fold.js":
+/*!**************************************************!*\
+ !*** ./node_modules/when/lib/decorators/fold.js ***!
+ \**************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+/** @author Jeff Escalante */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+
+ return function fold(Promise) {
+
+ Promise.prototype.fold = function(f, z) {
+ var promise = this._beget();
+
+ this._handler.fold(function(z, x, to) {
+ Promise._handler(z).fold(function(x, z, to) {
+ to.resolve(f.call(this, z, x));
+ }, x, this, to);
+ }, z, promise._handler.receiver, promise._handler);
+
+ return promise;
+ };
+
+ return Promise;
+ };
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/decorators/inspect.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/when/lib/decorators/inspect.js ***!
+ \*****************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function(require) {
+
+ var inspect = __webpack_require__(/*! ../state */ "./node_modules/when/lib/state.js").inspect;
+
+ return function inspection(Promise) {
+
+ Promise.prototype.inspect = function() {
+ return inspect(Promise._handler(this));
+ };
+
+ return Promise;
+ };
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/decorators/iterate.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/when/lib/decorators/iterate.js ***!
+ \*****************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+
+ return function generate(Promise) {
+
+ var resolve = Promise.resolve;
+
+ Promise.iterate = iterate;
+ Promise.unfold = unfold;
+
+ return Promise;
+
+ /**
+ * @deprecated Use github.com/cujojs/most streams and most.iterate
+ * Generate a (potentially infinite) stream of promised values:
+ * x, f(x), f(f(x)), etc. until condition(x) returns true
+ * @param {function} f function to generate a new x from the previous x
+ * @param {function} condition function that, given the current x, returns
+ * truthy when the iterate should stop
+ * @param {function} handler function to handle the value produced by f
+ * @param {*|Promise} x starting value, may be a promise
+ * @return {Promise} the result of the last call to f before
+ * condition returns true
+ */
+ function iterate(f, condition, handler, x) {
+ return unfold(function(x) {
+ return [x, f(x)];
+ }, condition, handler, x);
+ }
+
+ /**
+ * @deprecated Use github.com/cujojs/most streams and most.unfold
+ * Generate a (potentially infinite) stream of promised values
+ * by applying handler(generator(seed)) iteratively until
+ * condition(seed) returns true.
+ * @param {function} unspool function that generates a [value, newSeed]
+ * given a seed.
+ * @param {function} condition function that, given the current seed, returns
+ * truthy when the unfold should stop
+ * @param {function} handler function to handle the value produced by unspool
+ * @param x {*|Promise} starting value, may be a promise
+ * @return {Promise} the result of the last value produced by unspool before
+ * condition returns true
+ */
+ function unfold(unspool, condition, handler, x) {
+ return resolve(x).then(function(seed) {
+ return resolve(condition(seed)).then(function(done) {
+ return done ? seed : resolve(unspool(seed)).spread(next);
+ });
+ });
+
+ function next(item, newSeed) {
+ return resolve(handler(item)).then(function() {
+ return unfold(unspool, condition, handler, newSeed);
+ });
+ }
+ }
+ };
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/decorators/progress.js":
+/*!******************************************************!*\
+ !*** ./node_modules/when/lib/decorators/progress.js ***!
+ \******************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+
+ return function progress(Promise) {
+
+ /**
+ * @deprecated
+ * Register a progress handler for this promise
+ * @param {function} onProgress
+ * @returns {Promise}
+ */
+ Promise.prototype.progress = function(onProgress) {
+ return this.then(void 0, void 0, onProgress);
+ };
+
+ return Promise;
+ };
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/decorators/timed.js":
+/*!***************************************************!*\
+ !*** ./node_modules/when/lib/decorators/timed.js ***!
+ \***************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function(require) {
+
+ var env = __webpack_require__(/*! ../env */ "./node_modules/when/lib/env.js");
+ var TimeoutError = __webpack_require__(/*! ../TimeoutError */ "./node_modules/when/lib/TimeoutError.js");
+
+ function setTimeout(f, ms, x, y) {
+ return env.setTimer(function() {
+ f(x, y, ms);
+ }, ms);
+ }
+
+ return function timed(Promise) {
+ /**
+ * Return a new promise whose fulfillment value is revealed only
+ * after ms milliseconds
+ * @param {number} ms milliseconds
+ * @returns {Promise}
+ */
+ Promise.prototype.delay = function(ms) {
+ var p = this._beget();
+ this._handler.fold(handleDelay, ms, void 0, p._handler);
+ return p;
+ };
+
+ function handleDelay(ms, x, h) {
+ setTimeout(resolveDelay, ms, x, h);
+ }
+
+ function resolveDelay(x, h) {
+ h.resolve(x);
+ }
+
+ /**
+ * Return a new promise that rejects after ms milliseconds unless
+ * this promise fulfills earlier, in which case the returned promise
+ * fulfills with the same value.
+ * @param {number} ms milliseconds
+ * @param {Error|*=} reason optional rejection reason to use, defaults
+ * to a TimeoutError if not provided
+ * @returns {Promise}
+ */
+ Promise.prototype.timeout = function(ms, reason) {
+ var p = this._beget();
+ var h = p._handler;
+
+ var t = setTimeout(onTimeout, ms, reason, p._handler);
+
+ this._handler.visit(h,
+ function onFulfill(x) {
+ env.clearTimer(t);
+ this.resolve(x); // this = h
+ },
+ function onReject(x) {
+ env.clearTimer(t);
+ this.reject(x); // this = h
+ },
+ h.notify);
+
+ return p;
+ };
+
+ function onTimeout(reason, h, ms) {
+ var e = typeof reason === 'undefined'
+ ? new TimeoutError('timed out after ' + ms + 'ms')
+ : reason;
+ h.reject(e);
+ }
+
+ return Promise;
+ };
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/decorators/unhandledRejection.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/when/lib/decorators/unhandledRejection.js ***!
+ \****************************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function(require) {
+
+ var setTimer = __webpack_require__(/*! ../env */ "./node_modules/when/lib/env.js").setTimer;
+ var format = __webpack_require__(/*! ../format */ "./node_modules/when/lib/format.js");
+
+ return function unhandledRejection(Promise) {
+
+ var logError = noop;
+ var logInfo = noop;
+ var localConsole;
+
+ if(typeof console !== 'undefined') {
+ // Alias console to prevent things like uglify's drop_console option from
+ // removing console.log/error. Unhandled rejections fall into the same
+ // category as uncaught exceptions, and build tools shouldn't silence them.
+ localConsole = console;
+ logError = typeof localConsole.error !== 'undefined'
+ ? function (e) { localConsole.error(e); }
+ : function (e) { localConsole.log(e); };
+
+ logInfo = typeof localConsole.info !== 'undefined'
+ ? function (e) { localConsole.info(e); }
+ : function (e) { localConsole.log(e); };
+ }
+
+ Promise.onPotentiallyUnhandledRejection = function(rejection) {
+ enqueue(report, rejection);
+ };
+
+ Promise.onPotentiallyUnhandledRejectionHandled = function(rejection) {
+ enqueue(unreport, rejection);
+ };
+
+ Promise.onFatalRejection = function(rejection) {
+ enqueue(throwit, rejection.value);
+ };
+
+ var tasks = [];
+ var reported = [];
+ var running = null;
+
+ function report(r) {
+ if(!r.handled) {
+ reported.push(r);
+ logError('Potentially unhandled rejection [' + r.id + '] ' + format.formatError(r.value));
+ }
+ }
+
+ function unreport(r) {
+ var i = reported.indexOf(r);
+ if(i >= 0) {
+ reported.splice(i, 1);
+ logInfo('Handled previous rejection [' + r.id + '] ' + format.formatObject(r.value));
+ }
+ }
+
+ function enqueue(f, x) {
+ tasks.push(f, x);
+ if(running === null) {
+ running = setTimer(flush, 0);
+ }
+ }
+
+ function flush() {
+ running = null;
+ while(tasks.length > 0) {
+ tasks.shift()(tasks.shift());
+ }
+ }
+
+ return Promise;
+ };
+
+ function throwit(e) {
+ throw e;
+ }
+
+ function noop() {}
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/decorators/with.js":
+/*!**************************************************!*\
+ !*** ./node_modules/when/lib/decorators/with.js ***!
+ \**************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+
+ return function addWith(Promise) {
+ /**
+ * Returns a promise whose handlers will be called with `this` set to
+ * the supplied receiver. Subsequent promises derived from the
+ * returned promise will also have their handlers called with receiver
+ * as `this`. Calling `with` with undefined or no arguments will return
+ * a promise whose handlers will again be called in the usual Promises/A+
+ * way (no `this`) thus safely undoing any previous `with` in the
+ * promise chain.
+ *
+ * WARNING: Promises returned from `with`/`withThis` are NOT Promises/A+
+ * compliant, specifically violating 2.2.5 (http://promisesaplus.com/#point-41)
+ *
+ * @param {object} receiver `this` value for all handlers attached to
+ * the returned promise.
+ * @returns {Promise}
+ */
+ Promise.prototype['with'] = Promise.prototype.withThis = function(receiver) {
+ var p = this._beget();
+ var child = p._handler;
+ child.receiver = receiver;
+ this._handler.chain(child, receiver);
+ return p;
+ };
+
+ return Promise;
+ };
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/env.js":
+/*!**************************************!*\
+ !*** ./node_modules/when/lib/env.js ***!
+ \**************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process) {var __WEBPACK_AMD_DEFINE_RESULT__;var require;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+/*global process,document,setTimeout,clearTimeout,MutationObserver,WebKitMutationObserver*/
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function(require) {
+ /*jshint maxcomplexity:6*/
+
+ // Sniff "best" async scheduling option
+ // Prefer process.nextTick or MutationObserver, then check for
+ // setTimeout, and finally vertx, since its the only env that doesn't
+ // have setTimeout
+
+ var MutationObs;
+ var capturedSetTimeout = typeof setTimeout !== 'undefined' && setTimeout;
+
+ // Default env
+ var setTimer = function(f, ms) { return setTimeout(f, ms); };
+ var clearTimer = function(t) { return clearTimeout(t); };
+ var asap = function (f) { return capturedSetTimeout(f, 0); };
+
+ // Detect specific env
+ if (isNode()) { // Node
+ asap = function (f) { return process.nextTick(f); };
+
+ } else if (MutationObs = hasMutationObserver()) { // Modern browser
+ asap = initMutationObserver(MutationObs);
+
+ } else if (!capturedSetTimeout) { // vert.x
+ var vertxRequire = require;
+ var vertx = __webpack_require__(/*! vertx */ 0);
+ setTimer = function (f, ms) { return vertx.setTimer(ms, f); };
+ clearTimer = vertx.cancelTimer;
+ asap = vertx.runOnLoop || vertx.runOnContext;
+ }
+
+ return {
+ setTimer: setTimer,
+ clearTimer: clearTimer,
+ asap: asap
+ };
+
+ function isNode () {
+ return typeof process !== 'undefined' &&
+ Object.prototype.toString.call(process) === '[object process]';
+ }
+
+ function hasMutationObserver () {
+ return (typeof MutationObserver !== 'undefined' && MutationObserver) ||
+ (typeof WebKitMutationObserver !== 'undefined' && WebKitMutationObserver);
+ }
+
+ function initMutationObserver(MutationObserver) {
+ var scheduled;
+ var node = document.createTextNode('');
+ var o = new MutationObserver(run);
+ o.observe(node, { characterData: true });
+
+ function run() {
+ var f = scheduled;
+ scheduled = void 0;
+ f();
+ }
+
+ var i = 0;
+ return function (f) {
+ scheduled = f;
+ node.data = (i ^= 1);
+ };
+ }
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/format.js":
+/*!*****************************************!*\
+ !*** ./node_modules/when/lib/format.js ***!
+ \*****************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+
+ return {
+ formatError: formatError,
+ formatObject: formatObject,
+ tryStringify: tryStringify
+ };
+
+ /**
+ * Format an error into a string. If e is an Error and has a stack property,
+ * it's returned. Otherwise, e is formatted using formatObject, with a
+ * warning added about e not being a proper Error.
+ * @param {*} e
+ * @returns {String} formatted string, suitable for output to developers
+ */
+ function formatError(e) {
+ var s = typeof e === 'object' && e !== null && (e.stack || e.message) ? e.stack || e.message : formatObject(e);
+ return e instanceof Error ? s : s + ' (WARNING: non-Error used)';
+ }
+
+ /**
+ * Format an object, detecting "plain" objects and running them through
+ * JSON.stringify if possible.
+ * @param {Object} o
+ * @returns {string}
+ */
+ function formatObject(o) {
+ var s = String(o);
+ if(s === '[object Object]' && typeof JSON !== 'undefined') {
+ s = tryStringify(o, s);
+ }
+ return s;
+ }
+
+ /**
+ * Try to return the result of JSON.stringify(x). If that fails, return
+ * defaultValue
+ * @param {*} x
+ * @param {*} defaultValue
+ * @returns {String|*} JSON.stringify(x) or defaultValue
+ */
+ function tryStringify(x, defaultValue) {
+ try {
+ return JSON.stringify(x);
+ } catch(e) {
+ return defaultValue;
+ }
+ }
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/lib/makePromise.js":
+/*!**********************************************!*\
+ !*** ./node_modules/when/lib/makePromise.js ***!
+ \**********************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process) {var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+
+ return function makePromise(environment) {
+
+ var tasks = environment.scheduler;
+ var emitRejection = initEmitRejection();
+
+ var objectCreate = Object.create ||
+ function(proto) {
+ function Child() {}
+ Child.prototype = proto;
+ return new Child();
+ };
+
+ /**
+ * Create a promise whose fate is determined by resolver
+ * @constructor
+ * @returns {Promise} promise
+ * @name Promise
+ */
+ function Promise(resolver, handler) {
+ this._handler = resolver === Handler ? handler : init(resolver);
+ }
+
+ /**
+ * Run the supplied resolver
+ * @param resolver
+ * @returns {Pending}
+ */
+ function init(resolver) {
+ var handler = new Pending();
+
+ try {
+ resolver(promiseResolve, promiseReject, promiseNotify);
+ } catch (e) {
+ promiseReject(e);
+ }
+
+ return handler;
+
+ /**
+ * Transition from pre-resolution state to post-resolution state, notifying
+ * all listeners of the ultimate fulfillment or rejection
+ * @param {*} x resolution value
+ */
+ function promiseResolve (x) {
+ handler.resolve(x);
+ }
+ /**
+ * Reject this promise with reason, which will be used verbatim
+ * @param {Error|*} reason rejection reason, strongly suggested
+ * to be an Error type
+ */
+ function promiseReject (reason) {
+ handler.reject(reason);
+ }
+
+ /**
+ * @deprecated
+ * Issue a progress event, notifying all progress listeners
+ * @param {*} x progress event payload to pass to all listeners
+ */
+ function promiseNotify (x) {
+ handler.notify(x);
+ }
+ }
+
+ // Creation
+
+ Promise.resolve = resolve;
+ Promise.reject = reject;
+ Promise.never = never;
+
+ Promise._defer = defer;
+ Promise._handler = getHandler;
+
+ /**
+ * Returns a trusted promise. If x is already a trusted promise, it is
+ * returned, otherwise returns a new trusted Promise which follows x.
+ * @param {*} x
+ * @return {Promise} promise
+ */
+ function resolve(x) {
+ return isPromise(x) ? x
+ : new Promise(Handler, new Async(getHandler(x)));
+ }
+
+ /**
+ * Return a reject promise with x as its reason (x is used verbatim)
+ * @param {*} x
+ * @returns {Promise} rejected promise
+ */
+ function reject(x) {
+ return new Promise(Handler, new Async(new Rejected(x)));
+ }
+
+ /**
+ * Return a promise that remains pending forever
+ * @returns {Promise} forever-pending promise.
+ */
+ function never() {
+ return foreverPendingPromise; // Should be frozen
+ }
+
+ /**
+ * Creates an internal {promise, resolver} pair
+ * @private
+ * @returns {Promise}
+ */
+ function defer() {
+ return new Promise(Handler, new Pending());
+ }
+
+ // Transformation and flow control
+
+ /**
+ * Transform this promise's fulfillment value, returning a new Promise
+ * for the transformed result. If the promise cannot be fulfilled, onRejected
+ * is called with the reason. onProgress *may* be called with updates toward
+ * this promise's fulfillment.
+ * @param {function=} onFulfilled fulfillment handler
+ * @param {function=} onRejected rejection handler
+ * @param {function=} onProgress @deprecated progress handler
+ * @return {Promise} new promise
+ */
+ Promise.prototype.then = function(onFulfilled, onRejected, onProgress) {
+ var parent = this._handler;
+ var state = parent.join().state();
+
+ if ((typeof onFulfilled !== 'function' && state > 0) ||
+ (typeof onRejected !== 'function' && state < 0)) {
+ // Short circuit: value will not change, simply share handler
+ return new this.constructor(Handler, parent);
+ }
+
+ var p = this._beget();
+ var child = p._handler;
+
+ parent.chain(child, parent.receiver, onFulfilled, onRejected, onProgress);
+
+ return p;
+ };
+
+ /**
+ * If this promise cannot be fulfilled due to an error, call onRejected to
+ * handle the error. Shortcut for .then(undefined, onRejected)
+ * @param {function?} onRejected
+ * @return {Promise}
+ */
+ Promise.prototype['catch'] = function(onRejected) {
+ return this.then(void 0, onRejected);
+ };
+
+ /**
+ * Creates a new, pending promise of the same type as this promise
+ * @private
+ * @returns {Promise}
+ */
+ Promise.prototype._beget = function() {
+ return begetFrom(this._handler, this.constructor);
+ };
+
+ function begetFrom(parent, Promise) {
+ var child = new Pending(parent.receiver, parent.join().context);
+ return new Promise(Handler, child);
+ }
+
+ // Array combinators
+
+ Promise.all = all;
+ Promise.race = race;
+ Promise._traverse = traverse;
+
+ /**
+ * Return a promise that will fulfill when all promises in the
+ * input array have fulfilled, or will reject when one of the
+ * promises rejects.
+ * @param {array} promises array of promises
+ * @returns {Promise} promise for array of fulfillment values
+ */
+ function all(promises) {
+ return traverseWith(snd, null, promises);
+ }
+
+ /**
+ * Array> -> Promise>
+ * @private
+ * @param {function} f function to apply to each promise's value
+ * @param {Array} promises array of promises
+ * @returns {Promise} promise for transformed values
+ */
+ function traverse(f, promises) {
+ return traverseWith(tryCatch2, f, promises);
+ }
+
+ function traverseWith(tryMap, f, promises) {
+ var handler = typeof f === 'function' ? mapAt : settleAt;
+
+ var resolver = new Pending();
+ var pending = promises.length >>> 0;
+ var results = new Array(pending);
+
+ for (var i = 0, x; i < promises.length && !resolver.resolved; ++i) {
+ x = promises[i];
+
+ if (x === void 0 && !(i in promises)) {
+ --pending;
+ continue;
+ }
+
+ traverseAt(promises, handler, i, x, resolver);
+ }
+
+ if(pending === 0) {
+ resolver.become(new Fulfilled(results));
+ }
+
+ return new Promise(Handler, resolver);
+
+ function mapAt(i, x, resolver) {
+ if(!resolver.resolved) {
+ traverseAt(promises, settleAt, i, tryMap(f, x, i), resolver);
+ }
+ }
+
+ function settleAt(i, x, resolver) {
+ results[i] = x;
+ if(--pending === 0) {
+ resolver.become(new Fulfilled(results));
+ }
+ }
+ }
+
+ function traverseAt(promises, handler, i, x, resolver) {
+ if (maybeThenable(x)) {
+ var h = getHandlerMaybeThenable(x);
+ var s = h.state();
+
+ if (s === 0) {
+ h.fold(handler, i, void 0, resolver);
+ } else if (s > 0) {
+ handler(i, h.value, resolver);
+ } else {
+ resolver.become(h);
+ visitRemaining(promises, i+1, h);
+ }
+ } else {
+ handler(i, x, resolver);
+ }
+ }
+
+ Promise._visitRemaining = visitRemaining;
+ function visitRemaining(promises, start, handler) {
+ for(var i=start; i 0 ? toFulfilledState(handler.value)
+ : toRejectedState(handler.value);
+ }
+
+}).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js")));
+
+
+/***/ }),
+
+/***/ "./node_modules/when/when.js":
+/*!***********************************!*\
+ !*** ./node_modules/when/when.js ***!
+ \***********************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/** @license MIT License (c) copyright 2010-2014 original author or authors */
+
+/**
+ * Promises/A+ and when() implementation
+ * when is part of the cujoJS family of libraries (http://cujojs.com/)
+ * @author Brian Cavalier
+ * @author John Hann
+ */
+(function(define) { 'use strict';
+!(__WEBPACK_AMD_DEFINE_RESULT__ = (function (require) {
+
+ var timed = __webpack_require__(/*! ./lib/decorators/timed */ "./node_modules/when/lib/decorators/timed.js");
+ var array = __webpack_require__(/*! ./lib/decorators/array */ "./node_modules/when/lib/decorators/array.js");
+ var flow = __webpack_require__(/*! ./lib/decorators/flow */ "./node_modules/when/lib/decorators/flow.js");
+ var fold = __webpack_require__(/*! ./lib/decorators/fold */ "./node_modules/when/lib/decorators/fold.js");
+ var inspect = __webpack_require__(/*! ./lib/decorators/inspect */ "./node_modules/when/lib/decorators/inspect.js");
+ var generate = __webpack_require__(/*! ./lib/decorators/iterate */ "./node_modules/when/lib/decorators/iterate.js");
+ var progress = __webpack_require__(/*! ./lib/decorators/progress */ "./node_modules/when/lib/decorators/progress.js");
+ var withThis = __webpack_require__(/*! ./lib/decorators/with */ "./node_modules/when/lib/decorators/with.js");
+ var unhandledRejection = __webpack_require__(/*! ./lib/decorators/unhandledRejection */ "./node_modules/when/lib/decorators/unhandledRejection.js");
+ var TimeoutError = __webpack_require__(/*! ./lib/TimeoutError */ "./node_modules/when/lib/TimeoutError.js");
+
+ var Promise = [array, flow, fold, generate, progress,
+ inspect, withThis, timed, unhandledRejection]
+ .reduce(function(Promise, feature) {
+ return feature(Promise);
+ }, __webpack_require__(/*! ./lib/Promise */ "./node_modules/when/lib/Promise.js"));
+
+ var apply = __webpack_require__(/*! ./lib/apply */ "./node_modules/when/lib/apply.js")(Promise);
+
+ // Public API
+
+ when.promise = promise; // Create a pending promise
+ when.resolve = Promise.resolve; // Create a resolved promise
+ when.reject = Promise.reject; // Create a rejected promise
+
+ when.lift = lift; // lift a function to return promises
+ when['try'] = attempt; // call a function and return a promise
+ when.attempt = attempt; // alias for when.try
+
+ when.iterate = Promise.iterate; // DEPRECATED (use cujojs/most streams) Generate a stream of promises
+ when.unfold = Promise.unfold; // DEPRECATED (use cujojs/most streams) Generate a stream of promises
+
+ when.join = join; // Join 2 or more promises
+
+ when.all = all; // Resolve a list of promises
+ when.settle = settle; // Settle a list of promises
+
+ when.any = lift(Promise.any); // One-winner race
+ when.some = lift(Promise.some); // Multi-winner race
+ when.race = lift(Promise.race); // First-to-settle race
+
+ when.map = map; // Array.map() for promises
+ when.filter = filter; // Array.filter() for promises
+ when.reduce = lift(Promise.reduce); // Array.reduce() for promises
+ when.reduceRight = lift(Promise.reduceRight); // Array.reduceRight() for promises
+
+ when.isPromiseLike = isPromiseLike; // Is something promise-like, aka thenable
+
+ when.Promise = Promise; // Promise constructor
+ when.defer = defer; // Create a {promise, resolve, reject} tuple
+
+ // Error types
+
+ when.TimeoutError = TimeoutError;
+
+ /**
+ * Get a trusted promise for x, or by transforming x with onFulfilled
+ *
+ * @param {*} x
+ * @param {function?} onFulfilled callback to be called when x is
+ * successfully fulfilled. If promiseOrValue is an immediate value, callback
+ * will be invoked immediately.
+ * @param {function?} onRejected callback to be called when x is
+ * rejected.
+ * @param {function?} onProgress callback to be called when progress updates
+ * are issued for x. @deprecated
+ * @returns {Promise} a new promise that will fulfill with the return
+ * value of callback or errback or the completion value of promiseOrValue if
+ * callback and/or errback is not supplied.
+ */
+ function when(x, onFulfilled, onRejected, onProgress) {
+ var p = Promise.resolve(x);
+ if (arguments.length < 2) {
+ return p;
+ }
+
+ return p.then(onFulfilled, onRejected, onProgress);
+ }
+
+ /**
+ * Creates a new promise whose fate is determined by resolver.
+ * @param {function} resolver function(resolve, reject, notify)
+ * @returns {Promise} promise whose fate is determine by resolver
+ */
+ function promise(resolver) {
+ return new Promise(resolver);
+ }
+
+ /**
+ * Lift the supplied function, creating a version of f that returns
+ * promises, and accepts promises as arguments.
+ * @param {function} f
+ * @returns {Function} version of f that returns promises
+ */
+ function lift(f) {
+ return function() {
+ for(var i=0, l=arguments.length, a=new Array(l); i>> 0;l = Math.max(0, Math.min(d, t));D = [];q = t - l + 1;m = [];if (l) {
+ _n = function n(a) {
+ m.push(a);--q || (_k = _n = s, c(m));
+ };_k = function k(a) {
+ D.push(a);--l || (_k = _n = s, b(D));
+ };for (g = 0; g < t; ++g) {
+ g in e && a(e[g], A, h, f);
+ }
+ } else b(D);
+ }).then(c, f, h);
+ });
+ }function n(a, b, e, d) {
+ return u(a, s).then(b, e, d);
+ }function u(b, e, c) {
+ return a(b, function (b) {
+ return new d(function (d, f, h) {
+ function A(b, q) {
+ a(b, e, c).then(function (a) {
+ l[q] = a;--k || d(l);
+ }, f, h);
+ }var l, q, k, m;k = q = b.length >>> 0;l = [];if (k) for (m = 0; m < q; m++) {
+ m in b ? A(b[m], m) : --k;
+ } else d(l);
+ });
+ });
+ }function y(a) {
+ return { state: "fulfilled", value: a };
+ }function x(a) {
+ return { state: "rejected", reason: a };
+ }function p(a) {
+ 1 === E.push(a) && C(v);
+ }function v() {
+ f(E);E = [];
+ }function s(a) {
+ return a;
+ }function K(a) {
+ "function" === typeof B.reportUnhandled ? B.reportUnhandled() : p(function () {
+ throw a;
+ });throw a;
+ }a.promise = b;a.resolve = h;a.reject = function (b) {
+ return a(b, function (a) {
+ return new k(a);
+ });
+ };
+ a.defer = function () {
+ var a, e, d;a = { promise: w, resolve: w, reject: w, notify: w, resolver: { resolve: w, reject: w, notify: w } };a.promise = e = b(function (b, c, f) {
+ a.resolve = a.resolver.resolve = function (a) {
+ if (d) return h(a);d = !0;b(a);return e;
+ };a.reject = a.resolver.reject = function (a) {
+ if (d) return h(new k(a));d = !0;c(a);return e;
+ };a.notify = a.resolver.notify = function (a) {
+ f(a);return a;
+ };
+ });return a;
+ };a.join = function () {
+ return u(arguments, s);
+ };a.all = n;a.map = function (a, b) {
+ return u(a, b);
+ };a.reduce = function (b, e) {
+ var d = G(H, arguments, 1);return a(b, function (b) {
+ var c;c = b.length;d[0] = function (b, d, f) {
+ return a(b, function (b) {
+ return a(d, function (a) {
+ return e(b, a, f, c);
+ });
+ });
+ };return I.apply(b, d);
+ });
+ };a.settle = function (a) {
+ return u(a, y, x);
+ };a.any = function (a, b, e, d) {
+ return m(a, 1, function (a) {
+ return b ? b(a[0]) : a[0];
+ }, e, d);
+ };a.some = m;a.isPromise = q;a.isPromiseLike = q;r = d.prototype;r.then = function (a, b, e) {
+ var c = this;return new d(function (d, f, h) {
+ c._when(d, h, a, b, e);
+ }, this._status && this._status.observed());
+ };r["catch"] = r.otherwise = function (a) {
+ return this.then(w, a);
+ };r["finally"] = r.ensure = function (a) {
+ function b() {
+ return h(a());
+ }return "function" === typeof a ? this.then(b, b).yield(this) : this;
+ };r.done = function (a, b) {
+ this.then(a, b)["catch"](K);
+ };r.yield = function (a) {
+ return this.then(function () {
+ return a;
+ });
+ };r.tap = function (a) {
+ return this.then(a).yield(this);
+ };r.spread = function (a) {
+ return this.then(function (b) {
+ return n(b, function (b) {
+ return a.apply(w, b);
+ });
+ });
+ };r.always = function (a, b) {
+ return this.then(a, a, b);
+ };F = Object.create || function (a) {
+ function b() {}b.prototype = a;return new b();
+ };t.prototype = F(r);
+ t.prototype.inspect = function () {
+ return y(this.value);
+ };t.prototype._when = function (a, b, e) {
+ try {
+ a("function" === typeof e ? e(this.value) : this.value);
+ } catch (d) {
+ a(new k(d));
+ }
+ };k.prototype = F(r);k.prototype.inspect = function () {
+ return x(this.value);
+ };k.prototype._when = function (a, b, e, d) {
+ try {
+ a("function" === typeof d ? d(this.value) : this);
+ } catch (c) {
+ a(new k(c));
+ }
+ };z.prototype = F(r);z.prototype._when = function (a, b, e, d, c) {
+ try {
+ b("function" === typeof c ? c(this.value) : this.value);
+ } catch (f) {
+ b(f);
+ }
+ };var r, F, I, H, G, C, E, B, J, w;E = [];B = "undefined" !== typeof console ? console : a;if ("object" === (typeof process === "undefined" ? "undefined" : _typeof(process)) && process.nextTick) C = process.nextTick;else if (r = "function" === typeof MutationObserver && MutationObserver || "function" === typeof WebKitMutationObserver && WebKitMutationObserver) C = function (a, b, e) {
+ var d = a.createElement("div");new b(e).observe(d, { attributes: !0 });return function () {
+ d.setAttribute("x", "x");
+ };
+ }(document, r, v);else try {
+ C = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module \"vertx\""); e.code = 'MODULE_NOT_FOUND'; throw e; }())).runOnLoop || __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module \"vertx\""); e.code = 'MODULE_NOT_FOUND'; throw e; }())).runOnContext;
+ } catch (L) {
+ J = setTimeout, C = function C(a) {
+ J(a, 0);
+ };
+ }c = Function.prototype;r = c.call;G = c.bind ? r.bind(r) : function (a, b) {
+ return a.apply(b, H.call(arguments, 2));
+ };c = [];H = c.slice;I = c.reduce || function (a) {
+ var b, e, d, c, f;f = 0;b = Object(this);c = b.length >>> 0;e = arguments;if (1 >= e.length) for (;;) {
+ if (f in b) {
+ d = b[f++];break;
+ }if (++f >= c) throw new TypeError();
+ } else d = e[1];for (; f < c; ++f) {
+ f in b && (d = a(d, b[f], f, b));
+ }return d;
+ };return a;
+ }).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+})(__webpack_require__(/*! !webpack amd define */ "./node_modules/webpack/buildin/amd-define.js"));var CryptoJS = CryptoJS || function (c, g) {
+ var a = {},
+ b = a.lib = {},
+ d = b.Base = function () {
+ function a() {}return { extend: function extend(b) {
+ a.prototype = this;var e = new a();b && e.mixIn(b);e.hasOwnProperty("init") || (e.init = function () {
+ e.$super.init.apply(this, arguments);
+ });e.init.prototype = e;e.$super = this;return e;
+ }, create: function create() {
+ var a = this.extend();a.init.apply(a, arguments);return a;
+ }, init: function init() {}, mixIn: function mixIn(a) {
+ for (var b in a) {
+ a.hasOwnProperty(b) && (this[b] = a[b]);
+ }a.hasOwnProperty("toString") && (this.toString = a.toString);
+ },
+ clone: function clone() {
+ return this.init.prototype.extend(this);
+ } };
+ }(),
+ h = b.WordArray = d.extend({ init: function init(a, b) {
+ a = this.words = a || [];this.sigBytes = b != g ? b : 4 * a.length;
+ }, toString: function toString(a) {
+ return (a || e).stringify(this);
+ }, concat: function concat(a) {
+ var b = this.words,
+ e = a.words,
+ d = this.sigBytes;a = a.sigBytes;this.clamp();if (d % 4) for (var c = 0; c < a; c++) {
+ b[d + c >>> 2] |= (e[c >>> 2] >>> 24 - 8 * (c % 4) & 255) << 24 - 8 * ((d + c) % 4);
+ } else if (65535 < e.length) for (c = 0; c < a; c += 4) {
+ b[d + c >>> 2] = e[c >>> 2];
+ } else b.push.apply(b, e);this.sigBytes += a;return this;
+ }, clamp: function clamp() {
+ var a = this.words,
+ b = this.sigBytes;a[b >>> 2] &= 4294967295 << 32 - 8 * (b % 4);a.length = c.ceil(b / 4);
+ }, clone: function clone() {
+ var a = d.clone.call(this);a.words = this.words.slice(0);return a;
+ }, random: function random(a) {
+ for (var b = [], e = 0; e < a; e += 4) {
+ b.push(4294967296 * c.random() | 0);
+ }return new h.init(b, a);
+ } }),
+ f = a.enc = {},
+ e = f.Hex = { stringify: function stringify(a) {
+ var b = a.words;a = a.sigBytes;for (var e = [], d = 0; d < a; d++) {
+ var c = b[d >>> 2] >>> 24 - 8 * (d % 4) & 255;e.push((c >>> 4).toString(16));e.push((c & 15).toString(16));
+ }return e.join("");
+ }, parse: function parse(a) {
+ for (var b = a.length, e = [], d = 0; d < b; d += 2) {
+ e[d >>> 3] |= parseInt(a.substr(d, 2), 16) << 24 - 4 * (d % 8);
+ }return new h.init(e, b / 2);
+ } },
+ l = f.Latin1 = { stringify: function stringify(a) {
+ var b = a.words;a = a.sigBytes;for (var e = [], d = 0; d < a; d++) {
+ e.push(String.fromCharCode(b[d >>> 2] >>> 24 - 8 * (d % 4) & 255));
+ }return e.join("");
+ }, parse: function parse(a) {
+ for (var b = a.length, e = [], d = 0; d < b; d++) {
+ e[d >>> 2] |= (a.charCodeAt(d) & 255) << 24 - 8 * (d % 4);
+ }return new h.init(e, b);
+ } },
+ t = f.Utf8 = { stringify: function stringify(a) {
+ try {
+ return decodeURIComponent(escape(l.stringify(a)));
+ } catch (b) {
+ throw Error("Malformed UTF-8 data");
+ }
+ }, parse: function parse(a) {
+ return l.parse(unescape(encodeURIComponent(a)));
+ } },
+ k = b.BufferedBlockAlgorithm = d.extend({ reset: function reset() {
+ this._data = new h.init();this._nDataBytes = 0;
+ }, _append: function _append(a) {
+ "string" == typeof a && (a = t.parse(a));this._data.concat(a);this._nDataBytes += a.sigBytes;
+ }, _process: function _process(a) {
+ var b = this._data,
+ e = b.words,
+ d = b.sigBytes,
+ f = this.blockSize,
+ l = d / (4 * f),
+ l = a ? c.ceil(l) : c.max((l | 0) - this._minBufferSize, 0);a = l * f;d = c.min(4 * a, d);if (a) {
+ for (var k = 0; k < a; k += f) {
+ this._doProcessBlock(e, k);
+ }k = e.splice(0, a);b.sigBytes -= d;
+ }return new h.init(k, d);
+ }, clone: function clone() {
+ var a = d.clone.call(this);a._data = this._data.clone();return a;
+ }, _minBufferSize: 0 });b.Hasher = k.extend({ cfg: d.extend(), init: function init(a) {
+ this.cfg = this.cfg.extend(a);this.reset();
+ }, reset: function reset() {
+ k.reset.call(this);this._doReset();
+ }, update: function update(a) {
+ this._append(a);this._process();return this;
+ }, finalize: function finalize(a) {
+ a && this._append(a);return this._doFinalize();
+ }, blockSize: 16, _createHelper: function _createHelper(a) {
+ return function (b, e) {
+ return new a.init(e).finalize(b);
+ };
+ }, _createHmacHelper: function _createHmacHelper(a) {
+ return function (b, e) {
+ return new z.HMAC.init(a, e).finalize(b);
+ };
+ } });var z = a.algo = {};return a;
+}(Math);(function () {
+ var c = CryptoJS,
+ g = c.lib.WordArray;c.enc.Base64 = { stringify: function stringify(a) {
+ var b = a.words,
+ d = a.sigBytes,
+ c = this._map;a.clamp();a = [];for (var f = 0; f < d; f += 3) {
+ for (var e = (b[f >>> 2] >>> 24 - 8 * (f % 4) & 255) << 16 | (b[f + 1 >>> 2] >>> 24 - 8 * ((f + 1) % 4) & 255) << 8 | b[f + 2 >>> 2] >>> 24 - 8 * ((f + 2) % 4) & 255, l = 0; 4 > l && f + 0.75 * l < d; l++) {
+ a.push(c.charAt(e >>> 6 * (3 - l) & 63));
+ }
+ }if (b = c.charAt(64)) for (; a.length % 4;) {
+ a.push(b);
+ }return a.join("");
+ }, parse: function parse(a) {
+ var b = a.length,
+ d = this._map,
+ c = d.charAt(64);c && (c = a.indexOf(c), -1 != c && (b = c));for (var c = [], f = 0, e = 0; e < b; e++) {
+ if (e % 4) {
+ var l = d.indexOf(a.charAt(e - 1)) << 2 * (e % 4),
+ t = d.indexOf(a.charAt(e)) >>> 6 - 2 * (e % 4);c[f >>> 2] |= (l | t) << 24 - 8 * (f % 4);f++;
+ }
+ }return g.create(c, f);
+ }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" };
+})();(function () {
+ var c = CryptoJS,
+ g = c.enc.Utf8;c.algo.HMAC = c.lib.Base.extend({ init: function init(a, b) {
+ a = this._hasher = new a.init();"string" == typeof b && (b = g.parse(b));var d = a.blockSize,
+ c = 4 * d;b.sigBytes > c && (b = a.finalize(b));b.clamp();for (var f = this._oKey = b.clone(), e = this._iKey = b.clone(), l = f.words, t = e.words, k = 0; k < d; k++) {
+ l[k] ^= 1549556828, t[k] ^= 909522486;
+ }f.sigBytes = e.sigBytes = c;this.reset();
+ }, reset: function reset() {
+ var a = this._hasher;a.reset();a.update(this._iKey);
+ }, update: function update(a) {
+ this._hasher.update(a);return this;
+ }, finalize: function finalize(a) {
+ var b = this._hasher;a = b.finalize(a);b.reset();return b.finalize(this._oKey.clone().concat(a));
+ } });
+})();(function (c) {
+ var g = CryptoJS,
+ a = g.lib,
+ b = a.WordArray,
+ d = a.Hasher,
+ a = g.algo,
+ h = [],
+ f = [];(function () {
+ function a(b) {
+ for (var e = c.sqrt(b), d = 2; d <= e; d++) {
+ if (!(b % d)) return !1;
+ }return !0;
+ }function b(a) {
+ return 4294967296 * (a - (a | 0)) | 0;
+ }for (var e = 2, d = 0; 64 > d;) {
+ a(e) && (8 > d && (h[d] = b(c.pow(e, 0.5))), f[d] = b(c.pow(e, 1 / 3)), d++), e++;
+ }
+ })();var e = [],
+ a = a.SHA256 = d.extend({ _doReset: function _doReset() {
+ this._hash = new b.init(h.slice(0));
+ }, _doProcessBlock: function _doProcessBlock(a, b) {
+ for (var d = this._hash.words, c = d[0], h = d[1], g = d[2], m = d[3], n = d[4], u = d[5], y = d[6], x = d[7], p = 0; 64 > p; p++) {
+ if (16 > p) e[p] = a[b + p] | 0;else {
+ var v = e[p - 15],
+ s = e[p - 2];e[p] = ((v << 25 | v >>> 7) ^ (v << 14 | v >>> 18) ^ v >>> 3) + e[p - 7] + ((s << 15 | s >>> 17) ^ (s << 13 | s >>> 19) ^ s >>> 10) + e[p - 16];
+ }v = x + ((n << 26 | n >>> 6) ^ (n << 21 | n >>> 11) ^ (n << 7 | n >>> 25)) + (n & u ^ ~n & y) + f[p] + e[p];s = ((c << 30 | c >>> 2) ^ (c << 19 | c >>> 13) ^ (c << 10 | c >>> 22)) + (c & h ^ c & g ^ h & g);x = y;y = u;u = n;n = m + v | 0;m = g;g = h;h = c;c = v + s | 0;
+ }d[0] = d[0] + c | 0;d[1] = d[1] + h | 0;d[2] = d[2] + g | 0;d[3] = d[3] + m | 0;d[4] = d[4] + n | 0;d[5] = d[5] + u | 0;d[6] = d[6] + y | 0;d[7] = d[7] + x | 0;
+ }, _doFinalize: function _doFinalize() {
+ var a = this._data,
+ b = a.words,
+ d = 8 * this._nDataBytes,
+ e = 8 * a.sigBytes;b[e >>> 5] |= 128 << 24 - e % 32;b[(e + 64 >>> 9 << 4) + 14] = c.floor(d / 4294967296);b[(e + 64 >>> 9 << 4) + 15] = d;a.sigBytes = 4 * b.length;this._process();return this._hash;
+ }, clone: function clone() {
+ var a = d.clone.call(this);a._hash = this._hash.clone();return a;
+ } });g.SHA256 = d._createHelper(a);g.HmacSHA256 = d._createHmacHelper(a);
+})(Math);(function () {
+ var c = CryptoJS,
+ g = c.lib,
+ a = g.Base,
+ b = g.WordArray,
+ g = c.algo,
+ d = g.HMAC,
+ h = g.PBKDF2 = a.extend({ cfg: a.extend({ keySize: 4, hasher: g.SHA1, iterations: 1 }), init: function init(a) {
+ this.cfg = this.cfg.extend(a);
+ }, compute: function compute(a, e) {
+ for (var c = this.cfg, h = d.create(c.hasher, a), g = b.create(), z = b.create([1]), A = g.words, q = z.words, m = c.keySize, c = c.iterations; A.length < m;) {
+ var n = h.update(e).finalize(z);h.reset();for (var u = n.words, y = u.length, x = n, p = 1; p < c; p++) {
+ x = h.finalize(x);h.reset();for (var v = x.words, s = 0; s < y; s++) {
+ u[s] ^= v[s];
+ }
+ }g.concat(n);
+ q[0]++;
+ }g.sigBytes = 4 * m;return g;
+ } });c.PBKDF2 = function (a, b, d) {
+ return h.create(d).compute(a, b);
+ };
+})(); /*
+ MIT License (c) 2011-2013 Copyright Tavendo GmbH. */
+var AUTOBAHNJS_VERSION = "0.8.2",
+ global = this;
+(function (c, g) {
+ true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! when */ "./node_modules/when/when.js")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (a) {
+ return c.ab = g(c, a);
+ }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : "undefined" !== typeof exports ? "undefined" != typeof module && module.exports && (exports = module.exports = g(c, c.when)) : c.ab = g(c, c.when);
+})(global, function (c, g) {
+ var a = { _version: AUTOBAHNJS_VERSION };(function () {
+ Array.prototype.indexOf || (Array.prototype.indexOf = function (a) {
+ if (null === this) throw new TypeError();var d = Object(this),
+ c = d.length >>> 0;if (0 === c) return -1;var f = 0;0 < arguments.length && (f = Number(arguments[1]), f !== f ? f = 0 : 0 !== f && Infinity !== f && -Infinity !== f && (f = (0 < f || -1) * Math.floor(Math.abs(f))));if (f >= c) return -1;for (f = 0 <= f ? f : Math.max(c - Math.abs(f), 0); f < c; f++) {
+ if (f in d && d[f] === a) return f;
+ }return -1;
+ });Array.prototype.forEach || (Array.prototype.forEach = function (a, d) {
+ var c, f;if (null === this) throw new TypeError(" this is null or not defined");var e = Object(this),
+ l = e.length >>> 0;if ("[object Function]" !== {}.toString.call(a)) throw new TypeError(a + " is not a function");d && (c = d);for (f = 0; f < l;) {
+ var g;f in e && (g = e[f], a.call(c, g, f, e));f++;
+ }
+ });
+ })();a._sliceUserAgent = function (a, d, c) {
+ var f = [],
+ e = navigator.userAgent;a = e.indexOf(a);d = e.indexOf(d, a);0 > d && (d = e.length);c = e.slice(a, d).split(c);e = c[1].split(".");for (d = 0; d < e.length; ++d) {
+ f.push(parseInt(e[d], 10));
+ }return { name: c[0], version: f };
+ };a.getBrowser = function () {
+ var b = navigator.userAgent;return -1 < b.indexOf("Chrome") ? a._sliceUserAgent("Chrome", " ", "/") : -1 < b.indexOf("Safari") ? a._sliceUserAgent("Safari", " ", "/") : -1 < b.indexOf("Firefox") ? a._sliceUserAgent("Firefox", " ", "/") : -1 < b.indexOf("MSIE") ? a._sliceUserAgent("MSIE", ";", " ") : null;
+ };a.getServerUrl = function (a, d) {
+ return "file:" === c.location.protocol ? d ? d : "ws://127.0.0.1/ws" : ("https:" === c.location.protocol ? "wss://" : "ws://") + c.location.hostname + ("" !== c.location.port ? ":" + c.location.port : "") + "/" + (a ? a : "ws");
+ };a.browserNotSupportedMessage = "Browser does not support WebSockets (RFC6455)";a.deriveKey = function (a, d) {
+ return d && d.salt ? CryptoJS.PBKDF2(a, d.salt, { keySize: (d.keylen || 32) / 4, iterations: d.iterations || 1E4, hasher: CryptoJS.algo.SHA256 }).toString(CryptoJS.enc.Base64) : a;
+ };a._idchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";a._idlen = 16;a._subprotocol = "wamp";a._newid = function () {
+ for (var b = "", d = 0; d < a._idlen; d += 1) {
+ b += a._idchars.charAt(Math.floor(Math.random() * a._idchars.length));
+ }return b;
+ };a._newidFast = function () {
+ return Math.random().toString(36);
+ };a.log = function () {
+ if (1 < arguments.length) {
+ console.group("Log Item");for (var a = 0; a < arguments.length; a += 1) {
+ console.log(arguments[a]);
+ }console.groupEnd();
+ } else console.log(arguments[0]);
+ };a._debugrpc = !1;a._debugpubsub = !1;a._debugws = !1;a._debugconnect = !1;a.debug = function (b, d, h) {
+ if ("console" in c) a._debugrpc = b, a._debugpubsub = b, a._debugws = d, a._debugconnect = h;else throw "browser does not support console object";
+ };a.version = function () {
+ return a._version;
+ };a.PrefixMap = function () {
+ this._index = {};this._rindex = {};
+ };a.PrefixMap.prototype.get = function (a) {
+ return this._index[a];
+ };a.PrefixMap.prototype.set = function (a, d) {
+ this._index[a] = d;this._rindex[d] = a;
+ };a.PrefixMap.prototype.setDefault = function (a) {
+ this._index[""] = a;this._rindex[a] = "";
+ };a.PrefixMap.prototype.remove = function (a) {
+ var d = this._index[a];d && (delete this._index[a], delete this._rindex[d]);
+ };a.PrefixMap.prototype.resolve = function (a, d) {
+ var c = a.indexOf(":");if (0 <= c) {
+ var f = a.substring(0, c);if (this._index[f]) return this._index[f] + a.substring(c + 1);
+ }return !0 === d ? a : null;
+ };a.PrefixMap.prototype.shrink = function (a, d) {
+ for (var c = a.length; 0 < c; c -= 1) {
+ var f = a.substring(0, c);if (f = this._rindex[f]) return f + ":" + a.substring(c);
+ }return !0 === d ? a : null;
+ };a._MESSAGE_TYPEID_WELCOME = 0;a._MESSAGE_TYPEID_PREFIX = 1;a._MESSAGE_TYPEID_CALL = 2;a._MESSAGE_TYPEID_CALL_RESULT = 3;a._MESSAGE_TYPEID_CALL_ERROR = 4;a._MESSAGE_TYPEID_SUBSCRIBE = 5;a._MESSAGE_TYPEID_UNSUBSCRIBE = 6;a._MESSAGE_TYPEID_PUBLISH = 7;a._MESSAGE_TYPEID_EVENT = 8;a.CONNECTION_CLOSED = 0;a.CONNECTION_LOST = 1;a.CONNECTION_RETRIES_EXCEEDED = 2;a.CONNECTION_UNREACHABLE = 3;a.CONNECTION_UNSUPPORTED = 4;a.CONNECTION_UNREACHABLE_SCHEDULED_RECONNECT = 5;a.CONNECTION_LOST_SCHEDULED_RECONNECT = 6;a.Deferred = g.defer;a._construct = function (a, d) {
+ return "WebSocket" in c ? d ? new WebSocket(a, d) : new WebSocket(a) : "MozWebSocket" in c ? d ? new MozWebSocket(a, d) : new MozWebSocket(a) : null;
+ };a.Session = function (b, d, c, f) {
+ var e = this;e._wsuri = b;e._options = f;e._websocket_onopen = d;e._websocket_onclose = c;e._websocket = null;e._websocket_connected = !1;e._session_id = null;e._wamp_version = null;e._server = null;e._calls = {};e._subscriptions = {};e._prefixes = new a.PrefixMap();e._txcnt = 0;e._rxcnt = 0;e._websocket = e._options && e._options.skipSubprotocolAnnounce ? a._construct(e._wsuri) : a._construct(e._wsuri, [a._subprotocol]);
+ if (!e._websocket) {
+ if (void 0 !== c) {
+ c(a.CONNECTION_UNSUPPORTED);return;
+ }throw a.browserNotSupportedMessage;
+ }e._websocket.onmessage = function (b) {
+ a._debugws && (e._rxcnt += 1, console.group("WS Receive"), console.info(e._wsuri + " [" + e._session_id + "]"), console.log(e._rxcnt), console.log(b.data), console.groupEnd());b = JSON.parse(b.data);if (b[1] in e._calls) {
+ if (b[0] === a._MESSAGE_TYPEID_CALL_RESULT) {
+ var d = e._calls[b[1]],
+ c = b[2];if (a._debugrpc && void 0 !== d._ab_callobj) {
+ console.group("WAMP Call", d._ab_callobj[2]);console.timeEnd(d._ab_tid);
+ console.group("Arguments");for (var f = 3; f < d._ab_callobj.length; f += 1) {
+ var h = d._ab_callobj[f];if (void 0 !== h) console.log(h);else break;
+ }console.groupEnd();console.group("Result");console.log(c);console.groupEnd();console.groupEnd();
+ }d.resolve(c);
+ } else if (b[0] === a._MESSAGE_TYPEID_CALL_ERROR) {
+ d = e._calls[b[1]];c = b[2];f = b[3];h = b[4];if (a._debugrpc && void 0 !== d._ab_callobj) {
+ console.group("WAMP Call", d._ab_callobj[2]);console.timeEnd(d._ab_tid);console.group("Arguments");for (var g = 3; g < d._ab_callobj.length; g += 1) {
+ var m = d._ab_callobj[g];if (void 0 !== m) console.log(m);else break;
+ }console.groupEnd();console.group("Error");console.log(c);console.log(f);void 0 !== h && console.log(h);console.groupEnd();console.groupEnd();
+ }void 0 !== h ? d.reject({ uri: c, desc: f, detail: h }) : d.reject({ uri: c, desc: f });
+ }delete e._calls[b[1]];
+ } else if (b[0] === a._MESSAGE_TYPEID_EVENT) {
+ if (d = e._prefixes.resolve(b[1], !0), d in e._subscriptions) {
+ var n = b[1],
+ u = b[2];a._debugpubsub && (console.group("WAMP Event"), console.info(e._wsuri + " [" + e._session_id + "]"), console.log(n), console.log(u), console.groupEnd());e._subscriptions[d].forEach(function (a) {
+ a(n, u);
+ });
+ }
+ } else if (b[0] === a._MESSAGE_TYPEID_WELCOME) if (null === e._session_id) {
+ e._session_id = b[1];e._wamp_version = b[2];e._server = b[3];if (a._debugrpc || a._debugpubsub) console.group("WAMP Welcome"), console.info(e._wsuri + " [" + e._session_id + "]"), console.log(e._wamp_version), console.log(e._server), console.groupEnd();null !== e._websocket_onopen && e._websocket_onopen();
+ } else throw "protocol error (welcome message received more than once)";
+ };e._websocket.onopen = function (b) {
+ if (e._websocket.protocol !== a._subprotocol) if ("undefined" === typeof e._websocket.protocol) a._debugws && (console.group("WS Warning"), console.info(e._wsuri), console.log("WebSocket object has no protocol attribute: WAMP subprotocol check skipped!"), console.groupEnd());else if (e._options && e._options.skipSubprotocolCheck) a._debugws && (console.group("WS Warning"), console.info(e._wsuri), console.log("Server does not speak WAMP, but subprotocol check disabled by option!"), console.log(e._websocket.protocol), console.groupEnd());else throw e._websocket.close(1E3, "server does not speak WAMP"), "server does not speak WAMP (but '" + e._websocket.protocol + "' !)";a._debugws && (console.group("WAMP Connect"), console.info(e._wsuri), console.log(e._websocket.protocol), console.groupEnd());e._websocket_connected = !0;
+ };e._websocket.onerror = function (a) {};e._websocket.onclose = function (b) {
+ a._debugws && (e._websocket_connected ? console.log("Autobahn connection to " + e._wsuri + " lost (code " + b.code + ", reason '" + b.reason + "', wasClean " + b.wasClean + ").") : console.log("Autobahn could not connect to " + e._wsuri + " (code " + b.code + ", reason '" + b.reason + "', wasClean " + b.wasClean + ")."));void 0 !== e._websocket_onclose && (e._websocket_connected ? b.wasClean ? e._websocket_onclose(a.CONNECTION_CLOSED, "WS-" + b.code + ": " + b.reason) : e._websocket_onclose(a.CONNECTION_LOST) : e._websocket_onclose(a.CONNECTION_UNREACHABLE));e._websocket_connected = !1;e._wsuri = null;e._websocket_onopen = null;e._websocket_onclose = null;e._websocket = null;
+ };e.log = function () {
+ e._options && "sessionIdent" in e._options ? console.group("WAMP Session '" + e._options.sessionIdent + "' [" + e._session_id + "]") : console.group("WAMP Session [" + e._session_id + "]");for (var a = 0; a < arguments.length; ++a) {
+ console.log(arguments[a]);
+ }console.groupEnd();
+ };
+ };a.Session.prototype._send = function (b) {
+ if (!this._websocket_connected) throw "Autobahn not connected";switch (!0) {case c.Prototype && "undefined" === typeof top.root.__prototype_deleted:case "function" === typeof b.toJSON:
+ b = b.toJSON();break;default:
+ b = JSON.stringify(b);}this._websocket.send(b);
+ this._txcnt += 1;a._debugws && (console.group("WS Send"), console.info(this._wsuri + " [" + this._session_id + "]"), console.log(this._txcnt), console.log(b), console.groupEnd());
+ };a.Session.prototype.close = function () {
+ this._websocket_connected && this._websocket.close();
+ };a.Session.prototype.sessionid = function () {
+ return this._session_id;
+ };a.Session.prototype.wsuri = function () {
+ return this._wsuri;
+ };a.Session.prototype.shrink = function (a, d) {
+ void 0 === d && (d = !0);return this._prefixes.shrink(a, d);
+ };a.Session.prototype.resolve = function (a, d) {
+ void 0 === d && (d = !0);return this._prefixes.resolve(a, d);
+ };a.Session.prototype.prefix = function (b, d) {
+ this._prefixes.set(b, d);if (a._debugrpc || a._debugpubsub) console.group("WAMP Prefix"), console.info(this._wsuri + " [" + this._session_id + "]"), console.log(b), console.log(d), console.groupEnd();this._send([a._MESSAGE_TYPEID_PREFIX, b, d]);
+ };a.Session.prototype.call = function () {
+ for (var b = new a.Deferred(), d; !(d = a._newidFast(), !(d in this._calls));) {}this._calls[d] = b;for (var c = this._prefixes.shrink(arguments[0], !0), c = [a._MESSAGE_TYPEID_CALL, d, c], f = 1; f < arguments.length; f += 1) {
+ c.push(arguments[f]);
+ }this._send(c);a._debugrpc && (b._ab_callobj = c, b._ab_tid = this._wsuri + " [" + this._session_id + "][" + d + "]", console.time(b._ab_tid), console.info());return b.promise.then ? b.promise : b;
+ };a.Session.prototype.subscribe = function (b, d) {
+ var c = this._prefixes.resolve(b, !0);c in this._subscriptions || (a._debugpubsub && (console.group("WAMP Subscribe"), console.info(this._wsuri + " [" + this._session_id + "]"), console.log(b), console.log(d), console.groupEnd()), this._send([a._MESSAGE_TYPEID_SUBSCRIBE, b]), this._subscriptions[c] = []);if (-1 === this._subscriptions[c].indexOf(d)) this._subscriptions[c].push(d);else throw "callback " + d + " already subscribed for topic " + c;
+ };a.Session.prototype.unsubscribe = function (b, d) {
+ var c = this._prefixes.resolve(b, !0);if (c in this._subscriptions) {
+ var f;if (void 0 !== d) {
+ var e = this._subscriptions[c].indexOf(d);if (-1 !== e) f = d, this._subscriptions[c].splice(e, 1);else throw "no callback " + d + " subscribed on topic " + c;
+ } else f = this._subscriptions[c].slice(), this._subscriptions[c] = [];0 === this._subscriptions[c].length && (delete this._subscriptions[c], a._debugpubsub && (console.group("WAMP Unsubscribe"), console.info(this._wsuri + " [" + this._session_id + "]"), console.log(b), console.log(f), console.groupEnd()), this._send([a._MESSAGE_TYPEID_UNSUBSCRIBE, b]));
+ } else throw "not subscribed to topic " + c;
+ };a.Session.prototype.publish = function () {
+ var b = arguments[0],
+ d = arguments[1],
+ c = null,
+ f = null,
+ e = null,
+ g = null;if (3 < arguments.length) {
+ if (!(arguments[2] instanceof Array)) throw "invalid argument type(s)";
+ if (!(arguments[3] instanceof Array)) throw "invalid argument type(s)";f = arguments[2];e = arguments[3];g = [a._MESSAGE_TYPEID_PUBLISH, b, d, f, e];
+ } else if (2 < arguments.length) {
+ if ("boolean" === typeof arguments[2]) c = arguments[2], g = [a._MESSAGE_TYPEID_PUBLISH, b, d, c];else if (arguments[2] instanceof Array) f = arguments[2], g = [a._MESSAGE_TYPEID_PUBLISH, b, d, f];else throw "invalid argument type(s)";
+ } else g = [a._MESSAGE_TYPEID_PUBLISH, b, d];a._debugpubsub && (console.group("WAMP Publish"), console.info(this._wsuri + " [" + this._session_id + "]"), console.log(b), console.log(d), null !== c ? console.log(c) : null !== f && (console.log(f), null !== e && console.log(e)), console.groupEnd());this._send(g);
+ };a.Session.prototype.authreq = function (a, d) {
+ return this.call("http://api.wamp.ws/procedure#authreq", a, d);
+ };a.Session.prototype.authsign = function (a, d) {
+ d || (d = "");return CryptoJS.HmacSHA256(a, d).toString(CryptoJS.enc.Base64);
+ };a.Session.prototype.auth = function (a) {
+ return this.call("http://api.wamp.ws/procedure#auth", a);
+ };a._connect = function (b) {
+ var d = new a.Session(b.wsuri, function () {
+ b.connects += 1;b.retryCount = 0;b.onConnect(d);
+ }, function (d, f) {
+ var e = null;switch (d) {case a.CONNECTION_CLOSED:
+ b.onHangup(d, "Connection was closed properly [" + f + "]");break;case a.CONNECTION_UNSUPPORTED:
+ b.onHangup(d, "Browser does not support WebSocket.");break;case a.CONNECTION_UNREACHABLE:
+ b.retryCount += 1;if (0 === b.connects) b.onHangup(d, "Connection could not be established.");else if (b.retryCount <= b.options.maxRetries) (e = b.onHangup(a.CONNECTION_UNREACHABLE_SCHEDULED_RECONNECT, "Connection unreachable - scheduled reconnect to occur in " + b.options.retryDelay / 1E3 + " second(s) - attempt " + b.retryCount + " of " + b.options.maxRetries + ".", { delay: b.options.retryDelay, retries: b.retryCount, maxretries: b.options.maxRetries })) ? (a._debugconnect && console.log("Connection unreachable - retrying stopped by app"), b.onHangup(a.CONNECTION_RETRIES_EXCEEDED, "Number of connection retries exceeded.")) : (a._debugconnect && console.log("Connection unreachable - retrying (" + b.retryCount + ") .."), c.setTimeout(function () {
+ a._connect(b);
+ }, b.options.retryDelay));else b.onHangup(a.CONNECTION_RETRIES_EXCEEDED, "Number of connection retries exceeded.");break;case a.CONNECTION_LOST:
+ b.retryCount += 1;if (b.retryCount <= b.options.maxRetries) (e = b.onHangup(a.CONNECTION_LOST_SCHEDULED_RECONNECT, "Connection lost - scheduled " + b.retryCount + "th reconnect to occur in " + b.options.retryDelay / 1E3 + " second(s).", { delay: b.options.retryDelay, retries: b.retryCount, maxretries: b.options.maxRetries })) ? (a._debugconnect && console.log("Connection lost - retrying stopped by app"), b.onHangup(a.CONNECTION_RETRIES_EXCEEDED, "Connection lost.")) : (a._debugconnect && console.log("Connection lost - retrying (" + b.retryCount + ") .."), c.setTimeout(function () {
+ a._connect(b);
+ }, b.options.retryDelay));else b.onHangup(a.CONNECTION_RETRIES_EXCEEDED, "Connection lost.");break;default:
+ throw "unhandled close code in ab._connect";}
+ }, b.options);
+ };a.connect = function (b, d, c, f) {
+ var e = {};e.wsuri = b;e.options = f ? f : {};void 0 === e.options.retryDelay && (e.options.retryDelay = 5E3);void 0 === e.options.maxRetries && (e.options.maxRetries = 10);void 0 === e.options.skipSubprotocolCheck && (e.options.skipSubprotocolCheck = !1);void 0 === e.options.skipSubprotocolAnnounce && (e.options.skipSubprotocolAnnounce = !1);if (d) e.onConnect = d;else throw "onConnect handler required!";e.onHangup = c ? c : function (b, d, c) {
+ a._debugconnect && console.log(b, d, c);
+ };e.connects = 0;e.retryCount = 0;a._connect(e);
+ };a.launch = function (b, d, c) {
+ a.connect(b.wsuri, function (c) {
+ !b.appkey || "" === b.appkey ? c.authreq().then(function () {
+ c.auth().then(function (b) {
+ d ? d(c) : a._debugconnect && c.log("Session opened.");
+ }, c.log);
+ }, c.log) : c.authreq(b.appkey, b.appextra).then(function (e) {
+ var g = null;"function" === typeof b.appsecret ? g = b.appsecret(e) : (g = a.deriveKey(b.appsecret, JSON.parse(e).authextra), g = c.authsign(e, g));c.auth(g).then(function (b) {
+ d ? d(c) : a._debugconnect && c.log("Session opened.");
+ }, c.log);
+ }, c.log);
+ }, function (b, d, g) {
+ c ? c(b, d, g) : a._debugconnect && a.log("Session closed.", b, d, g);
+ }, b.sessionConfig);
+ };return a;
+});ab._UA_FIREFOX = /.*Firefox\/([0-9+]*).*/;ab._UA_CHROME = /.*Chrome\/([0-9+]*).*/;ab._UA_CHROMEFRAME = /.*chromeframe\/([0-9]*).*/;ab._UA_WEBKIT = /.*AppleWebKit\/([0-9+.]*)w*.*/;ab._UA_WEBOS = /.*webOS\/([0-9+.]*)w*.*/;ab._matchRegex = function (c, g) {
+ var a = g.exec(c);return a ? a[1] : a;
+};
+ab.lookupWsSupport = function () {
+ var c = navigator.userAgent;if (-1 < c.indexOf("MSIE")) {
+ if (-1 < c.indexOf("MSIE 10")) return [!0, !0, !0];if (-1 < c.indexOf("chromeframe")) {
+ var g = parseInt(ab._matchRegex(c, ab._UA_CHROMEFRAME));return 14 <= g ? [!0, !1, !0] : [!1, !1, !1];
+ }if (-1 < c.indexOf("MSIE 8") || -1 < c.indexOf("MSIE 9")) return [!0, !0, !0];
+ } else {
+ if (-1 < c.indexOf("Firefox")) {
+ if (g = parseInt(ab._matchRegex(c, ab._UA_FIREFOX))) {
+ if (7 <= g) return [!0, !1, !0];if (3 <= g) return [!0, !0, !0];
+ }return [!1, !1, !0];
+ }if (-1 < c.indexOf("Safari") && -1 == c.indexOf("Chrome")) {
+ if (g = ab._matchRegex(c, ab._UA_WEBKIT)) return -1 < c.indexOf("Windows") && "534+" == g || -1 < c.indexOf("Macintosh") && (g = g.replace("+", "").split("."), 535 == parseInt(g[0]) && 24 <= parseInt(g[1]) || 535 < parseInt(g[0])) ? [!0, !1, !0] : -1 < c.indexOf("webOS") ? (g = ab._matchRegex(c, ab._UA_WEBOS).split("."), 2 == parseInt(g[0]) ? [!1, !0, !0] : [!1, !1, !1]) : [!0, !0, !0];
+ } else if (-1 < c.indexOf("Chrome")) {
+ if (g = parseInt(ab._matchRegex(c, ab._UA_CHROME))) return 14 <= g ? [!0, !1, !0] : 4 <= g ? [!0, !0, !0] : [!1, !1, !0];
+ } else if (-1 < c.indexOf("Android")) {
+ if (-1 < c.indexOf("Firefox") || -1 < c.indexOf("CrMo")) return [!0, !1, !0];if (-1 < c.indexOf("Opera")) return [!1, !1, !0];if (-1 < c.indexOf("CrMo")) return [!0, !0, !0];
+ } else if (-1 < c.indexOf("iPhone") || -1 < c.indexOf("iPad") || -1 < c.indexOf("iPod")) return [!1, !1, !0];
+ }return [!1, !1, !1];
+};
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(/*! ./../../../../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ 0:
+/*!***********************!*\
+ !*** vertx (ignored) ***!
+ \***********************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports) {
+
+/* (ignored) */
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgYjYwMjM3ZDYzNGExZmMxNDI2ODkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vYW1kLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvUHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvU2NoZWR1bGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy93aGVuL2xpYi9UaW1lb3V0RXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2FwcGx5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy93aGVuL2xpYi9kZWNvcmF0b3JzL2FycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy93aGVuL2xpYi9kZWNvcmF0b3JzL2Zsb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvZm9sZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvZGVjb3JhdG9ycy9pbnNwZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy93aGVuL2xpYi9kZWNvcmF0b3JzL2l0ZXJhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvcHJvZ3Jlc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvdGltZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvdW5oYW5kbGVkUmVqZWN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy93aGVuL2xpYi9kZWNvcmF0b3JzL3dpdGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2Vudi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvZm9ybWF0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy93aGVuL2xpYi9tYWtlUHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvc3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3doZW4vd2hlbi5qcyIsIndlYnBhY2s6Ly8vLi92ZW5kb3IvZ29zL3dlYi1zb2NrZXQtYnVuZGxlL1Jlc291cmNlcy9wdWJsaWMvanMvdmVuZG9yL2F1dG9iYWhuLm1pbi5qcyIsIndlYnBhY2s6Ly8vdmVydHggKGlnbm9yZWQpIl0sIm5hbWVzIjpbIndpbmRvdyIsImRlZmluZSIsImMiLCJnIiwid2hlbiIsImFtZCIsImNvbnNvbGUiLCJsb2ciLCJhIiwiYiIsImQiLCJoIiwiaW5mbyIsIndhcm4iLCJlcnJvciIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiYmluZCIsIkFycmF5Iiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJjb25jYXQiLCJncm91cCIsImdyb3VwRW5kIiwidGltZSIsIkRhdGUiLCJnZXRUaW1lIiwidGltZUVuZCIsImUiLCJ0aGVuIiwiQiIsIlByb21pc2VTdGF0dXMiLCJtIiwidyIsInAiLCJxIiwibCIsIkEiLCJmIiwiayIsInoiLCJfc3RhdHVzIiwiaW5zcGVjdCIsInN0YXRlIiwiX3doZW4iLCJwdXNoIiwibiIsImxlbmd0aCIsIlR5cGVFcnJvciIsIk9iamVjdCIsInQiLCJHIiwidmFsdWUiLCJmdWxmaWxsZWQiLCJyZWplY3RlZCIsIkQiLCJNYXRoIiwibWF4IiwibWluIiwicyIsInUiLCJ5IiwieCIsInJlYXNvbiIsIkUiLCJDIiwidiIsIksiLCJyZXBvcnRVbmhhbmRsZWQiLCJwcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImRlZmVyIiwibm90aWZ5IiwicmVzb2x2ZXIiLCJqb2luIiwiYWxsIiwibWFwIiwicmVkdWNlIiwiSCIsIkkiLCJzZXR0bGUiLCJhbnkiLCJzb21lIiwiaXNQcm9taXNlIiwiaXNQcm9taXNlTGlrZSIsInIiLCJvYnNlcnZlZCIsIm90aGVyd2lzZSIsImVuc3VyZSIsInlpZWxkIiwiZG9uZSIsInRhcCIsInNwcmVhZCIsImFsd2F5cyIsIkYiLCJjcmVhdGUiLCJKIiwicHJvY2VzcyIsIm5leHRUaWNrIiwiTXV0YXRpb25PYnNlcnZlciIsIldlYktpdE11dGF0aW9uT2JzZXJ2ZXIiLCJjcmVhdGVFbGVtZW50Iiwib2JzZXJ2ZSIsImF0dHJpYnV0ZXMiLCJzZXRBdHRyaWJ1dGUiLCJkb2N1bWVudCIsInJ1bk9uTG9vcCIsInJ1bk9uQ29udGV4dCIsIkwiLCJzZXRUaW1lb3V0IiwiQ3J5cHRvSlMiLCJsaWIiLCJCYXNlIiwiZXh0ZW5kIiwibWl4SW4iLCJoYXNPd25Qcm9wZXJ0eSIsImluaXQiLCIkc3VwZXIiLCJ0b1N0cmluZyIsImNsb25lIiwiV29yZEFycmF5Iiwid29yZHMiLCJzaWdCeXRlcyIsInN0cmluZ2lmeSIsImNsYW1wIiwiY2VpbCIsInJhbmRvbSIsImVuYyIsIkhleCIsInBhcnNlIiwicGFyc2VJbnQiLCJzdWJzdHIiLCJMYXRpbjEiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJjaGFyQ29kZUF0IiwiVXRmOCIsImRlY29kZVVSSUNvbXBvbmVudCIsImVzY2FwZSIsIkVycm9yIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJCdWZmZXJlZEJsb2NrQWxnb3JpdGhtIiwicmVzZXQiLCJfZGF0YSIsIl9uRGF0YUJ5dGVzIiwiX2FwcGVuZCIsIl9wcm9jZXNzIiwiYmxvY2tTaXplIiwiX21pbkJ1ZmZlclNpemUiLCJfZG9Qcm9jZXNzQmxvY2siLCJzcGxpY2UiLCJIYXNoZXIiLCJjZmciLCJfZG9SZXNldCIsInVwZGF0ZSIsImZpbmFsaXplIiwiX2RvRmluYWxpemUiLCJfY3JlYXRlSGVscGVyIiwiX2NyZWF0ZUhtYWNIZWxwZXIiLCJITUFDIiwiYWxnbyIsIkJhc2U2NCIsIl9tYXAiLCJjaGFyQXQiLCJpbmRleE9mIiwiX2hhc2hlciIsIl9vS2V5IiwiX2lLZXkiLCJzcXJ0IiwicG93IiwiU0hBMjU2IiwiX2hhc2giLCJmbG9vciIsIkhtYWNTSEEyNTYiLCJQQktERjIiLCJrZXlTaXplIiwiaGFzaGVyIiwiU0hBMSIsIml0ZXJhdGlvbnMiLCJjb21wdXRlIiwiQVVUT0JBSE5KU19WRVJTSU9OIiwiZ2xvYmFsIiwiYWIiLCJleHBvcnRzIiwibW9kdWxlIiwiX3ZlcnNpb24iLCJOdW1iZXIiLCJJbmZpbml0eSIsImFicyIsImZvckVhY2giLCJfc2xpY2VVc2VyQWdlbnQiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJzcGxpdCIsIm5hbWUiLCJ2ZXJzaW9uIiwiZ2V0QnJvd3NlciIsImdldFNlcnZlclVybCIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJob3N0bmFtZSIsInBvcnQiLCJicm93c2VyTm90U3VwcG9ydGVkTWVzc2FnZSIsImRlcml2ZUtleSIsInNhbHQiLCJrZXlsZW4iLCJfaWRjaGFycyIsIl9pZGxlbiIsIl9zdWJwcm90b2NvbCIsIl9uZXdpZCIsIl9uZXdpZEZhc3QiLCJfZGVidWdycGMiLCJfZGVidWdwdWJzdWIiLCJfZGVidWd3cyIsIl9kZWJ1Z2Nvbm5lY3QiLCJkZWJ1ZyIsIlByZWZpeE1hcCIsIl9pbmRleCIsIl9yaW5kZXgiLCJnZXQiLCJzZXQiLCJzZXREZWZhdWx0IiwicmVtb3ZlIiwic3Vic3RyaW5nIiwic2hyaW5rIiwiX01FU1NBR0VfVFlQRUlEX1dFTENPTUUiLCJfTUVTU0FHRV9UWVBFSURfUFJFRklYIiwiX01FU1NBR0VfVFlQRUlEX0NBTEwiLCJfTUVTU0FHRV9UWVBFSURfQ0FMTF9SRVNVTFQiLCJfTUVTU0FHRV9UWVBFSURfQ0FMTF9FUlJPUiIsIl9NRVNTQUdFX1RZUEVJRF9TVUJTQ1JJQkUiLCJfTUVTU0FHRV9UWVBFSURfVU5TVUJTQ1JJQkUiLCJfTUVTU0FHRV9UWVBFSURfUFVCTElTSCIsIl9NRVNTQUdFX1RZUEVJRF9FVkVOVCIsIkNPTk5FQ1RJT05fQ0xPU0VEIiwiQ09OTkVDVElPTl9MT1NUIiwiQ09OTkVDVElPTl9SRVRSSUVTX0VYQ0VFREVEIiwiQ09OTkVDVElPTl9VTlJFQUNIQUJMRSIsIkNPTk5FQ1RJT05fVU5TVVBQT1JURUQiLCJDT05ORUNUSU9OX1VOUkVBQ0hBQkxFX1NDSEVEVUxFRF9SRUNPTk5FQ1QiLCJDT05ORUNUSU9OX0xPU1RfU0NIRURVTEVEX1JFQ09OTkVDVCIsIkRlZmVycmVkIiwiX2NvbnN0cnVjdCIsIldlYlNvY2tldCIsIk1veldlYlNvY2tldCIsIlNlc3Npb24iLCJfd3N1cmkiLCJfb3B0aW9ucyIsIl93ZWJzb2NrZXRfb25vcGVuIiwiX3dlYnNvY2tldF9vbmNsb3NlIiwiX3dlYnNvY2tldCIsIl93ZWJzb2NrZXRfY29ubmVjdGVkIiwiX3Nlc3Npb25faWQiLCJfd2FtcF92ZXJzaW9uIiwiX3NlcnZlciIsIl9jYWxscyIsIl9zdWJzY3JpcHRpb25zIiwiX3ByZWZpeGVzIiwiX3R4Y250IiwiX3J4Y250Iiwic2tpcFN1YnByb3RvY29sQW5ub3VuY2UiLCJvbm1lc3NhZ2UiLCJkYXRhIiwiSlNPTiIsIl9hYl9jYWxsb2JqIiwiX2FiX3RpZCIsInVyaSIsImRlc2MiLCJkZXRhaWwiLCJvbm9wZW4iLCJza2lwU3VicHJvdG9jb2xDaGVjayIsImNsb3NlIiwib25lcnJvciIsIm9uY2xvc2UiLCJjb2RlIiwid2FzQ2xlYW4iLCJzZXNzaW9uSWRlbnQiLCJfc2VuZCIsIlByb3RvdHlwZSIsInRvcCIsInJvb3QiLCJfX3Byb3RvdHlwZV9kZWxldGVkIiwidG9KU09OIiwic2VuZCIsInNlc3Npb25pZCIsIndzdXJpIiwicHJlZml4Iiwic3Vic2NyaWJlIiwidW5zdWJzY3JpYmUiLCJwdWJsaXNoIiwiYXV0aHJlcSIsImF1dGhzaWduIiwiYXV0aCIsIl9jb25uZWN0IiwiY29ubmVjdHMiLCJyZXRyeUNvdW50Iiwib25Db25uZWN0Iiwib25IYW5ndXAiLCJvcHRpb25zIiwibWF4UmV0cmllcyIsInJldHJ5RGVsYXkiLCJkZWxheSIsInJldHJpZXMiLCJtYXhyZXRyaWVzIiwiY29ubmVjdCIsImxhdW5jaCIsImFwcGtleSIsImFwcGV4dHJhIiwiYXBwc2VjcmV0IiwiYXV0aGV4dHJhIiwic2Vzc2lvbkNvbmZpZyIsIl9VQV9GSVJFRk9YIiwiX1VBX0NIUk9NRSIsIl9VQV9DSFJPTUVGUkFNRSIsIl9VQV9XRUJLSVQiLCJfVUFfV0VCT1MiLCJfbWF0Y2hSZWdleCIsImV4ZWMiLCJsb29rdXBXc1N1cHBvcnQiLCJyZXBsYWNlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUM3REE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNU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QTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixjQUFjLGdCQUFnQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0FBRCxHQUFHdEssRUFBRXNLLE9BQUYsQ0FBVSxPQUFWLENBQU4sRUFBeUIsT0FBTSxDQUFDLENBQUMsQ0FBRixFQUFJLENBQUMsQ0FBTCxFQUFPLENBQUMsQ0FBUixDQUFOLENBQWlCLElBQUcsQ0FBQyxDQUFELEdBQUd0SyxFQUFFc0ssT0FBRixDQUFVLE1BQVYsQ0FBTixFQUF3QixPQUFNLENBQUMsQ0FBQyxDQUFGLEVBQUksQ0FBQyxDQUFMLEVBQU8sQ0FBQyxDQUFSLENBQU47QUFBaUIsU0FEc1YsTUFDalYsSUFBRyxDQUFDLENBQUQsR0FBR3RLLEVBQUVzSyxPQUFGLENBQVUsUUFBVixDQUFILElBQXdCLENBQUMsQ0FBRCxHQUFHdEssRUFBRXNLLE9BQUYsQ0FBVSxNQUFWLENBQTNCLElBQThDLENBQUMsQ0FBRCxHQUFHdEssRUFBRXNLLE9BQUYsQ0FBVSxNQUFWLENBQXBELEVBQXNFLE9BQU0sQ0FBQyxDQUFDLENBQUYsRUFBSSxDQUFDLENBQUwsRUFBTyxDQUFDLENBQVIsQ0FBTjtBQUFpQixZQUFNLENBQUMsQ0FBQyxDQUFGLEVBQUksQ0FBQyxDQUFMLEVBQU8sQ0FBQyxDQUFSLENBQU47QUFBaUIsQ0FGMU8sQzs7Ozs7Ozs7Ozs7OztBQ3BGQSxlIiwiZmlsZSI6ImF1dG9iYWhuLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2J1aWxkL1wiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi92ZW5kb3IvZ29zL3dlYi1zb2NrZXQtYnVuZGxlL1Jlc291cmNlcy9wdWJsaWMvanMvdmVuZG9yL2F1dG9iYWhuLm1pbi5qc1wiKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBiNjAyMzdkNjM0YTFmYzE0MjY4OSIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG5cdHRocm93IG5ldyBFcnJvcihcImRlZmluZSBjYW5ub3QgYmUgdXNlZCBpbmRpcmVjdFwiKTtcclxufTtcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vYW1kLWRlZmluZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2FtZC1kZWZpbmUuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE0IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbihmdW5jdGlvbihkZWZpbmUpIHsgJ3VzZSBzdHJpY3QnO1xuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlKSB7XG5cblx0dmFyIG1ha2VQcm9taXNlID0gcmVxdWlyZSgnLi9tYWtlUHJvbWlzZScpO1xuXHR2YXIgU2NoZWR1bGVyID0gcmVxdWlyZSgnLi9TY2hlZHVsZXInKTtcblx0dmFyIGFzeW5jID0gcmVxdWlyZSgnLi9lbnYnKS5hc2FwO1xuXG5cdHJldHVybiBtYWtlUHJvbWlzZSh7XG5cdFx0c2NoZWR1bGVyOiBuZXcgU2NoZWR1bGVyKGFzeW5jKVxuXHR9KTtcblxufSk7XG59KSh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUgOiBmdW5jdGlvbiAoZmFjdG9yeSkgeyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSk7IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvUHJvbWlzZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvUHJvbWlzZS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTQgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxuKGZ1bmN0aW9uKGRlZmluZSkgeyAndXNlIHN0cmljdCc7XG5kZWZpbmUoZnVuY3Rpb24oKSB7XG5cblx0Ly8gQ3JlZGl0IHRvIFR3aXNvbCAoaHR0cHM6Ly9naXRodWIuY29tL1R3aXNvbCkgZm9yIHN1Z2dlc3Rpbmdcblx0Ly8gdGhpcyB0eXBlIG9mIGV4dGVuc2libGUgcXVldWUgKyB0cmFtcG9saW5lIGFwcHJvYWNoIGZvciBuZXh0LXRpY2sgY29uZmxhdGlvbi5cblxuXHQvKipcblx0ICogQXN5bmMgdGFzayBzY2hlZHVsZXJcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gYXN5bmMgZnVuY3Rpb24gdG8gc2NoZWR1bGUgYSBzaW5nbGUgYXN5bmMgZnVuY3Rpb25cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRmdW5jdGlvbiBTY2hlZHVsZXIoYXN5bmMpIHtcblx0XHR0aGlzLl9hc3luYyA9IGFzeW5jO1xuXHRcdHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcblxuXHRcdHRoaXMuX3F1ZXVlID0gdGhpcztcblx0XHR0aGlzLl9xdWV1ZUxlbiA9IDA7XG5cdFx0dGhpcy5fYWZ0ZXJRdWV1ZSA9IHt9O1xuXHRcdHRoaXMuX2FmdGVyUXVldWVMZW4gPSAwO1xuXG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXHRcdHRoaXMuZHJhaW4gPSBmdW5jdGlvbigpIHtcblx0XHRcdHNlbGYuX2RyYWluKCk7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbnF1ZXVlIGEgdGFza1xuXHQgKiBAcGFyYW0ge3sgcnVuOmZ1bmN0aW9uIH19IHRhc2tcblx0ICovXG5cdFNjaGVkdWxlci5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uKHRhc2spIHtcblx0XHR0aGlzLl9xdWV1ZVt0aGlzLl9xdWV1ZUxlbisrXSA9IHRhc2s7XG5cdFx0dGhpcy5ydW4oKTtcblx0fTtcblxuXHQvKipcblx0ICogRW5xdWV1ZSBhIHRhc2sgdG8gcnVuIGFmdGVyIHRoZSBtYWluIHRhc2sgcXVldWVcblx0ICogQHBhcmFtIHt7IHJ1bjpmdW5jdGlvbiB9fSB0YXNrXG5cdCAqL1xuXHRTY2hlZHVsZXIucHJvdG90eXBlLmFmdGVyUXVldWUgPSBmdW5jdGlvbih0YXNrKSB7XG5cdFx0dGhpcy5fYWZ0ZXJRdWV1ZVt0aGlzLl9hZnRlclF1ZXVlTGVuKytdID0gdGFzaztcblx0XHR0aGlzLnJ1bigpO1xuXHR9O1xuXG5cdFNjaGVkdWxlci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLl9ydW5uaW5nKSB7XG5cdFx0XHR0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcblx0XHRcdHRoaXMuX2FzeW5jKHRoaXMuZHJhaW4pO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogRHJhaW4gdGhlIGhhbmRsZXIgcXVldWUgZW50aXJlbHksIGFuZCB0aGVuIHRoZSBhZnRlciBxdWV1ZVxuXHQgKi9cblx0U2NoZWR1bGVyLnByb3RvdHlwZS5fZHJhaW4gPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaSA9IDA7XG5cdFx0Zm9yICg7IGkgPCB0aGlzLl9xdWV1ZUxlbjsgKytpKSB7XG5cdFx0XHR0aGlzLl9xdWV1ZVtpXS5ydW4oKTtcblx0XHRcdHRoaXMuX3F1ZXVlW2ldID0gdm9pZCAwO1xuXHRcdH1cblxuXHRcdHRoaXMuX3F1ZXVlTGVuID0gMDtcblx0XHR0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fYWZ0ZXJRdWV1ZUxlbjsgKytpKSB7XG5cdFx0XHR0aGlzLl9hZnRlclF1ZXVlW2ldLnJ1bigpO1xuXHRcdFx0dGhpcy5fYWZ0ZXJRdWV1ZVtpXSA9IHZvaWQgMDtcblx0XHR9XG5cblx0XHR0aGlzLl9hZnRlclF1ZXVlTGVuID0gMDtcblx0fTtcblxuXHRyZXR1cm4gU2NoZWR1bGVyO1xuXG59KTtcbn0odHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lIDogZnVuY3Rpb24oZmFjdG9yeSkgeyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsgfSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvU2NoZWR1bGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy93aGVuL2xpYi9TY2hlZHVsZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE0IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbihmdW5jdGlvbihkZWZpbmUpIHsgJ3VzZSBzdHJpY3QnO1xuZGVmaW5lKGZ1bmN0aW9uKCkge1xuXG5cdC8qKlxuXHQgKiBDdXN0b20gZXJyb3IgdHlwZSBmb3IgcHJvbWlzZXMgcmVqZWN0ZWQgYnkgcHJvbWlzZS50aW1lb3V0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0ZnVuY3Rpb24gVGltZW91dEVycm9yIChtZXNzYWdlKSB7XG5cdFx0RXJyb3IuY2FsbCh0aGlzKTtcblx0XHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXHRcdHRoaXMubmFtZSA9IFRpbWVvdXRFcnJvci5uYW1lO1xuXHRcdGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFRpbWVvdXRFcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0VGltZW91dEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcblx0VGltZW91dEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRpbWVvdXRFcnJvcjtcblxuXHRyZXR1cm4gVGltZW91dEVycm9yO1xufSk7XG59KHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZSA6IGZ1bmN0aW9uKGZhY3RvcnkpIHsgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7IH0pKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy93aGVuL2xpYi9UaW1lb3V0RXJyb3IuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL1RpbWVvdXRFcnJvci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTQgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxuKGZ1bmN0aW9uKGRlZmluZSkgeyAndXNlIHN0cmljdCc7XG5kZWZpbmUoZnVuY3Rpb24oKSB7XG5cblx0bWFrZUFwcGx5LnRyeUNhdGNoUmVzb2x2ZSA9IHRyeUNhdGNoUmVzb2x2ZTtcblxuXHRyZXR1cm4gbWFrZUFwcGx5O1xuXG5cdGZ1bmN0aW9uIG1ha2VBcHBseShQcm9taXNlLCBjYWxsKSB7XG5cdFx0aWYoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcblx0XHRcdGNhbGwgPSB0cnlDYXRjaFJlc29sdmU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFwcGx5O1xuXG5cdFx0ZnVuY3Rpb24gYXBwbHkoZiwgdGhpc0FyZywgYXJncykge1xuXHRcdFx0dmFyIHAgPSBQcm9taXNlLl9kZWZlcigpO1xuXHRcdFx0dmFyIGwgPSBhcmdzLmxlbmd0aDtcblx0XHRcdHZhciBwYXJhbXMgPSBuZXcgQXJyYXkobCk7XG5cdFx0XHRjYWxsQW5kUmVzb2x2ZSh7IGY6ZiwgdGhpc0FyZzp0aGlzQXJnLCBhcmdzOmFyZ3MsIHBhcmFtczpwYXJhbXMsIGk6bC0xLCBjYWxsOmNhbGwgfSwgcC5faGFuZGxlcik7XG5cblx0XHRcdHJldHVybiBwO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNhbGxBbmRSZXNvbHZlKGMsIGgpIHtcblx0XHRcdGlmKGMuaSA8IDApIHtcblx0XHRcdFx0cmV0dXJuIGNhbGwoYy5mLCBjLnRoaXNBcmcsIGMucGFyYW1zLCBoKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGhhbmRsZXIgPSBQcm9taXNlLl9oYW5kbGVyKGMuYXJnc1tjLmldKTtcblx0XHRcdGhhbmRsZXIuZm9sZChjYWxsQW5kUmVzb2x2ZU5leHQsIGMsIHZvaWQgMCwgaCk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY2FsbEFuZFJlc29sdmVOZXh0KGMsIHgsIGgpIHtcblx0XHRcdGMucGFyYW1zW2MuaV0gPSB4O1xuXHRcdFx0Yy5pIC09IDE7XG5cdFx0XHRjYWxsQW5kUmVzb2x2ZShjLCBoKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiB0cnlDYXRjaFJlc29sdmUoZiwgdGhpc0FyZywgYXJncywgcmVzb2x2ZXIpIHtcblx0XHR0cnkge1xuXHRcdFx0cmVzb2x2ZXIucmVzb2x2ZShmLmFwcGx5KHRoaXNBcmcsIGFyZ3MpKTtcblx0XHR9IGNhdGNoKGUpIHtcblx0XHRcdHJlc29sdmVyLnJlamVjdChlKTtcblx0XHR9XG5cdH1cblxufSk7XG59KHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZSA6IGZ1bmN0aW9uKGZhY3RvcnkpIHsgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7IH0pKTtcblxuXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy93aGVuL2xpYi9hcHBseS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvYXBwbHkuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE0IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbihmdW5jdGlvbihkZWZpbmUpIHsgJ3VzZSBzdHJpY3QnO1xuZGVmaW5lKGZ1bmN0aW9uKHJlcXVpcmUpIHtcblxuXHR2YXIgc3RhdGUgPSByZXF1aXJlKCcuLi9zdGF0ZScpO1xuXHR2YXIgYXBwbGllciA9IHJlcXVpcmUoJy4uL2FwcGx5Jyk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIGFycmF5KFByb21pc2UpIHtcblxuXHRcdHZhciBhcHBseUZvbGQgPSBhcHBsaWVyKFByb21pc2UpO1xuXHRcdHZhciB0b1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmU7XG5cdFx0dmFyIGFsbCA9IFByb21pc2UuYWxsO1xuXG5cdFx0dmFyIGFyID0gQXJyYXkucHJvdG90eXBlLnJlZHVjZTtcblx0XHR2YXIgYXJyID0gQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0O1xuXHRcdHZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuXHRcdC8vIEFkZGl0aW9uYWwgYXJyYXkgY29tYmluYXRvcnNcblxuXHRcdFByb21pc2UuYW55ID0gYW55O1xuXHRcdFByb21pc2Uuc29tZSA9IHNvbWU7XG5cdFx0UHJvbWlzZS5zZXR0bGUgPSBzZXR0bGU7XG5cblx0XHRQcm9taXNlLm1hcCA9IG1hcDtcblx0XHRQcm9taXNlLmZpbHRlciA9IGZpbHRlcjtcblx0XHRQcm9taXNlLnJlZHVjZSA9IHJlZHVjZTtcblx0XHRQcm9taXNlLnJlZHVjZVJpZ2h0ID0gcmVkdWNlUmlnaHQ7XG5cblx0XHQvKipcblx0XHQgKiBXaGVuIHRoaXMgcHJvbWlzZSBmdWxmaWxscyB3aXRoIGFuIGFycmF5LCBkb1xuXHRcdCAqIG9uRnVsZmlsbGVkLmFwcGx5KHZvaWQgMCwgYXJyYXkpXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbn0gb25GdWxmaWxsZWQgZnVuY3Rpb24gdG8gYXBwbHlcblx0XHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSBmb3IgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBvbkZ1bGZpbGxlZFxuXHRcdCAqL1xuXHRcdFByb21pc2UucHJvdG90eXBlLnNwcmVhZCA9IGZ1bmN0aW9uKG9uRnVsZmlsbGVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50aGVuKGFsbCkudGhlbihmdW5jdGlvbihhcnJheSkge1xuXHRcdFx0XHRyZXR1cm4gb25GdWxmaWxsZWQuYXBwbHkodGhpcywgYXJyYXkpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdHJldHVybiBQcm9taXNlO1xuXG5cdFx0LyoqXG5cdFx0ICogT25lLXdpbm5lciBjb21wZXRpdGl2ZSByYWNlLlxuXHRcdCAqIFJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIGZ1bGZpbGwgd2hlbiBvbmUgb2YgdGhlIHByb21pc2VzXG5cdFx0ICogaW4gdGhlIGlucHV0IGFycmF5IGZ1bGZpbGxzLCBvciB3aWxsIHJlamVjdCB3aGVuIGFsbCBwcm9taXNlc1xuXHRcdCAqIGhhdmUgcmVqZWN0ZWQuXG5cdFx0ICogQHBhcmFtIHthcnJheX0gcHJvbWlzZXNcblx0XHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSBmb3IgdGhlIGZpcnN0IGZ1bGZpbGxlZCB2YWx1ZVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGFueShwcm9taXNlcykge1xuXHRcdFx0dmFyIHAgPSBQcm9taXNlLl9kZWZlcigpO1xuXHRcdFx0dmFyIHJlc29sdmVyID0gcC5faGFuZGxlcjtcblx0XHRcdHZhciBsID0gcHJvbWlzZXMubGVuZ3RoPj4+MDtcblxuXHRcdFx0dmFyIHBlbmRpbmcgPSBsO1xuXHRcdFx0dmFyIGVycm9ycyA9IFtdO1xuXG5cdFx0XHRmb3IgKHZhciBoLCB4LCBpID0gMDsgaSA8IGw7ICsraSkge1xuXHRcdFx0XHR4ID0gcHJvbWlzZXNbaV07XG5cdFx0XHRcdGlmKHggPT09IHZvaWQgMCAmJiAhKGkgaW4gcHJvbWlzZXMpKSB7XG5cdFx0XHRcdFx0LS1wZW5kaW5nO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aCA9IFByb21pc2UuX2hhbmRsZXIoeCk7XG5cdFx0XHRcdGlmKGguc3RhdGUoKSA+IDApIHtcblx0XHRcdFx0XHRyZXNvbHZlci5iZWNvbWUoaCk7XG5cdFx0XHRcdFx0UHJvbWlzZS5fdmlzaXRSZW1haW5pbmcocHJvbWlzZXMsIGksIGgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGgudmlzaXQocmVzb2x2ZXIsIGhhbmRsZUZ1bGZpbGwsIGhhbmRsZVJlamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYocGVuZGluZyA9PT0gMCkge1xuXHRcdFx0XHRyZXNvbHZlci5yZWplY3QobmV3IFJhbmdlRXJyb3IoJ2FueSgpOiBhcnJheSBtdXN0IG5vdCBiZSBlbXB0eScpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHA7XG5cblx0XHRcdGZ1bmN0aW9uIGhhbmRsZUZ1bGZpbGwoeCkge1xuXHRcdFx0XHQvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSovXG5cdFx0XHRcdGVycm9ycyA9IG51bGw7XG5cdFx0XHRcdHRoaXMucmVzb2x2ZSh4KTsgLy8gdGhpcyA9PT0gcmVzb2x2ZXJcblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gaGFuZGxlUmVqZWN0KGUpIHtcblx0XHRcdFx0Lypqc2hpbnQgdmFsaWR0aGlzOnRydWUqL1xuXHRcdFx0XHRpZih0aGlzLnJlc29sdmVkKSB7IC8vIHRoaXMgPT09IHJlc29sdmVyXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZXJyb3JzLnB1c2goZSk7XG5cdFx0XHRcdGlmKC0tcGVuZGluZyA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMucmVqZWN0KGVycm9ycyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBOLXdpbm5lciBjb21wZXRpdGl2ZSByYWNlXG5cdFx0ICogUmV0dXJuIGEgcHJvbWlzZSB0aGF0IHdpbGwgZnVsZmlsbCB3aGVuIG4gaW5wdXQgcHJvbWlzZXMgaGF2ZVxuXHRcdCAqIGZ1bGZpbGxlZCwgb3Igd2lsbCByZWplY3Qgd2hlbiBpdCBiZWNvbWVzIGltcG9zc2libGUgZm9yIG5cblx0XHQgKiBpbnB1dCBwcm9taXNlcyB0byBmdWxmaWxsIChpZSB3aGVuIHByb21pc2VzLmxlbmd0aCAtIG4gKyAxXG5cdFx0ICogaGF2ZSByZWplY3RlZClcblx0XHQgKiBAcGFyYW0ge2FycmF5fSBwcm9taXNlc1xuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBuXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgZm9yIHRoZSBlYXJsaWVzdCBuIGZ1bGZpbGxtZW50IHZhbHVlc1xuXHRcdCAqXG5cdFx0ICogQGRlcHJlY2F0ZWRcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBzb21lKHByb21pc2VzLCBuKSB7XG5cdFx0XHQvKmpzaGludCBtYXhjb21wbGV4aXR5OjcqL1xuXHRcdFx0dmFyIHAgPSBQcm9taXNlLl9kZWZlcigpO1xuXHRcdFx0dmFyIHJlc29sdmVyID0gcC5faGFuZGxlcjtcblxuXHRcdFx0dmFyIHJlc3VsdHMgPSBbXTtcblx0XHRcdHZhciBlcnJvcnMgPSBbXTtcblxuXHRcdFx0dmFyIGwgPSBwcm9taXNlcy5sZW5ndGg+Pj4wO1xuXHRcdFx0dmFyIG5GdWxmaWxsID0gMDtcblx0XHRcdHZhciBuUmVqZWN0O1xuXHRcdFx0dmFyIHgsIGk7IC8vIHJldXNlZCBpbiBib3RoIGZvcigpIGxvb3BzXG5cblx0XHRcdC8vIEZpcnN0IHBhc3M6IGNvdW50IGFjdHVhbCBhcnJheSBpdGVtc1xuXHRcdFx0Zm9yKGk9MDsgaTxsOyArK2kpIHtcblx0XHRcdFx0eCA9IHByb21pc2VzW2ldO1xuXHRcdFx0XHRpZih4ID09PSB2b2lkIDAgJiYgIShpIGluIHByb21pc2VzKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCsrbkZ1bGZpbGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXB1dGUgYWN0dWFsIGdvYWxzXG5cdFx0XHRuID0gTWF0aC5tYXgobiwgMCk7XG5cdFx0XHRuUmVqZWN0ID0gKG5GdWxmaWxsIC0gbiArIDEpO1xuXHRcdFx0bkZ1bGZpbGwgPSBNYXRoLm1pbihuLCBuRnVsZmlsbCk7XG5cblx0XHRcdGlmKG4gPiBuRnVsZmlsbCkge1xuXHRcdFx0XHRyZXNvbHZlci5yZWplY3QobmV3IFJhbmdlRXJyb3IoJ3NvbWUoKTogYXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0ICdcblx0XHRcdFx0KyBuICsgJyBpdGVtKHMpLCBidXQgaGFkICcgKyBuRnVsZmlsbCkpO1xuXHRcdFx0fSBlbHNlIGlmKG5GdWxmaWxsID09PSAwKSB7XG5cdFx0XHRcdHJlc29sdmVyLnJlc29sdmUocmVzdWx0cyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNlY29uZCBwYXNzOiBvYnNlcnZlIGVhY2ggYXJyYXkgaXRlbSwgbWFrZSBwcm9ncmVzcyB0b3dhcmQgZ29hbHNcblx0XHRcdGZvcihpPTA7IGk8bDsgKytpKSB7XG5cdFx0XHRcdHggPSBwcm9taXNlc1tpXTtcblx0XHRcdFx0aWYoeCA9PT0gdm9pZCAwICYmICEoaSBpbiBwcm9taXNlcykpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdFByb21pc2UuX2hhbmRsZXIoeCkudmlzaXQocmVzb2x2ZXIsIGZ1bGZpbGwsIHJlamVjdCwgcmVzb2x2ZXIubm90aWZ5KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHA7XG5cblx0XHRcdGZ1bmN0aW9uIGZ1bGZpbGwoeCkge1xuXHRcdFx0XHQvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSovXG5cdFx0XHRcdGlmKHRoaXMucmVzb2x2ZWQpIHsgLy8gdGhpcyA9PT0gcmVzb2x2ZXJcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRzLnB1c2goeCk7XG5cdFx0XHRcdGlmKC0tbkZ1bGZpbGwgPT09IDApIHtcblx0XHRcdFx0XHRlcnJvcnMgPSBudWxsO1xuXHRcdFx0XHRcdHRoaXMucmVzb2x2ZShyZXN1bHRzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiByZWplY3QoZSkge1xuXHRcdFx0XHQvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSovXG5cdFx0XHRcdGlmKHRoaXMucmVzb2x2ZWQpIHsgLy8gdGhpcyA9PT0gcmVzb2x2ZXJcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRlcnJvcnMucHVzaChlKTtcblx0XHRcdFx0aWYoLS1uUmVqZWN0ID09PSAwKSB7XG5cdFx0XHRcdFx0cmVzdWx0cyA9IG51bGw7XG5cdFx0XHRcdFx0dGhpcy5yZWplY3QoZXJyb3JzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEFwcGx5IGYgdG8gdGhlIHZhbHVlIG9mIGVhY2ggcHJvbWlzZSBpbiBhIGxpc3Qgb2YgcHJvbWlzZXNcblx0XHQgKiBhbmQgcmV0dXJuIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgcmVzdWx0cy5cblx0XHQgKiBAcGFyYW0ge2FycmF5fSBwcm9taXNlc1xuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oeDoqLCBpbmRleDpOdW1iZXIpOip9IGYgbWFwcGluZyBmdW5jdGlvblxuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIG1hcChwcm9taXNlcywgZikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UuX3RyYXZlcnNlKGYsIHByb21pc2VzKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBGaWx0ZXIgdGhlIHByb3ZpZGVkIGFycmF5IG9mIHByb21pc2VzIHVzaW5nIHRoZSBwcm92aWRlZCBwcmVkaWNhdGUuICBJbnB1dCBtYXlcblx0XHQgKiBjb250YWluIHByb21pc2VzIGFuZCB2YWx1ZXNcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBwcm9taXNlcyBhcnJheSBvZiBwcm9taXNlcyBhbmQgdmFsdWVzXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbih4OiosIGluZGV4Ok51bWJlcik6Ym9vbGVhbn0gcHJlZGljYXRlIGZpbHRlcmluZyBwcmVkaWNhdGUuXG5cdFx0ICogIE11c3QgcmV0dXJuIHRydXRoeSAob3IgcHJvbWlzZSBmb3IgdHJ1dGh5KSBmb3IgaXRlbXMgdG8gcmV0YWluLlxuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgd2lsbCBmdWxmaWxsIHdpdGggYW4gYXJyYXkgY29udGFpbmluZyBhbGwgaXRlbXNcblx0XHQgKiAgZm9yIHdoaWNoIHByZWRpY2F0ZSByZXR1cm5lZCB0cnV0aHkuXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZmlsdGVyKHByb21pc2VzLCBwcmVkaWNhdGUpIHtcblx0XHRcdHZhciBhID0gc2xpY2UuY2FsbChwcm9taXNlcyk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5fdHJhdmVyc2UocHJlZGljYXRlLCBhKS50aGVuKGZ1bmN0aW9uKGtlZXApIHtcblx0XHRcdFx0cmV0dXJuIGZpbHRlclN5bmMoYSwga2VlcCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmaWx0ZXJTeW5jKHByb21pc2VzLCBrZWVwKSB7XG5cdFx0XHQvLyBTYWZlIGJlY2F1c2Ugd2Uga25vdyBhbGwgcHJvbWlzZXMgaGF2ZSBmdWxmaWxsZWQgaWYgd2UndmUgbWFkZSBpdCB0aGlzIGZhclxuXHRcdFx0dmFyIGwgPSBrZWVwLmxlbmd0aDtcblx0XHRcdHZhciBmaWx0ZXJlZCA9IG5ldyBBcnJheShsKTtcblx0XHRcdGZvcih2YXIgaT0wLCBqPTA7IGk8bDsgKytpKSB7XG5cdFx0XHRcdGlmKGtlZXBbaV0pIHtcblx0XHRcdFx0XHRmaWx0ZXJlZFtqKytdID0gUHJvbWlzZS5faGFuZGxlcihwcm9taXNlc1tpXSkudmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZpbHRlcmVkLmxlbmd0aCA9IGo7XG5cdFx0XHRyZXR1cm4gZmlsdGVyZWQ7XG5cblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBSZXR1cm4gYSBwcm9taXNlIHRoYXQgd2lsbCBhbHdheXMgZnVsZmlsbCB3aXRoIGFuIGFycmF5IGNvbnRhaW5pbmdcblx0XHQgKiB0aGUgb3V0Y29tZSBzdGF0ZXMgb2YgYWxsIGlucHV0IHByb21pc2VzLiAgVGhlIHJldHVybmVkIHByb21pc2Vcblx0XHQgKiB3aWxsIG5ldmVyIHJlamVjdC5cblx0XHQgKiBAcGFyYW0ge0FycmF5fSBwcm9taXNlc1xuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIGZvciBhcnJheSBvZiBzZXR0bGVkIHN0YXRlIGRlc2NyaXB0b3JzXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gc2V0dGxlKHByb21pc2VzKSB7XG5cdFx0XHRyZXR1cm4gYWxsKHByb21pc2VzLm1hcChzZXR0bGVPbmUpKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzZXR0bGVPbmUocCkge1xuXHRcdFx0Ly8gT3B0aW1pemUgdGhlIGNhc2Ugd2hlcmUgd2UgZ2V0IGFuIGFscmVhZHktcmVzb2x2ZWQgd2hlbi5qcyBwcm9taXNlXG5cdFx0XHQvLyAgYnkgZXh0cmFjdGluZyBpdHMgc3RhdGU6XG5cdFx0XHR2YXIgaGFuZGxlcjtcblx0XHRcdGlmIChwIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIG91ciBvd24gUHJvbWlzZSB0eXBlIGFuZCB3ZSBjYW4gcmVhY2ggaXRzIGhhbmRsZXIgaW50ZXJuYWxzOlxuXHRcdFx0XHRoYW5kbGVyID0gcC5faGFuZGxlci5qb2luKCk7XG5cdFx0XHR9XG5cdFx0XHRpZigoaGFuZGxlciAmJiBoYW5kbGVyLnN0YXRlKCkgPT09IDApIHx8ICFoYW5kbGVyKSB7XG5cdFx0XHRcdC8vIEVpdGhlciBzdGlsbCBwZW5kaW5nLCBvciBub3QgYSBQcm9taXNlIGF0IGFsbDpcblx0XHRcdFx0cmV0dXJuIHRvUHJvbWlzZShwKS50aGVuKHN0YXRlLmZ1bGZpbGxlZCwgc3RhdGUucmVqZWN0ZWQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGUgcHJvbWlzZSBpcyBvdXIgb3duLCBidXQgaXQgaXMgYWxyZWFkeSByZXNvbHZlZC4gVGFrZSBhIHNob3J0Y3V0LlxuXHRcdFx0Ly8gU2luY2Ugd2UncmUgbm90IGFjdHVhbGx5IGhhbmRsaW5nIHRoZSByZXNvbHV0aW9uLCB3ZSBuZWVkIHRvIGRpc2FibGVcblx0XHRcdC8vIHJlamVjdGlvbiByZXBvcnRpbmcuXG5cdFx0XHRoYW5kbGVyLl91bnJlcG9ydCgpO1xuXHRcdFx0cmV0dXJuIHN0YXRlLmluc3BlY3QoaGFuZGxlcik7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogVHJhZGl0aW9uYWwgcmVkdWNlIGZ1bmN0aW9uLCBzaW1pbGFyIHRvIGBBcnJheS5wcm90b3R5cGUucmVkdWNlKClgLCBidXRcblx0XHQgKiBpbnB1dCBtYXkgY29udGFpbiBwcm9taXNlcyBhbmQvb3IgdmFsdWVzLCBhbmQgcmVkdWNlRnVuY1xuXHRcdCAqIG1heSByZXR1cm4gZWl0aGVyIGEgdmFsdWUgb3IgYSBwcm9taXNlLCAqYW5kKiBpbml0aWFsVmFsdWUgbWF5XG5cdFx0ICogYmUgYSBwcm9taXNlIGZvciB0aGUgc3RhcnRpbmcgdmFsdWUuXG5cdFx0ICogQHBhcmFtIHtBcnJheXxQcm9taXNlfSBwcm9taXNlcyBhcnJheSBvciBwcm9taXNlIGZvciBhbiBhcnJheSBvZiBhbnl0aGluZyxcblx0XHQgKiAgICAgIG1heSBjb250YWluIGEgbWl4IG9mIHByb21pc2VzIGFuZCB2YWx1ZXMuXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihhY2N1bXVsYXRlZDoqLCB4OiosIGluZGV4Ok51bWJlcik6Kn0gZiByZWR1Y2UgZnVuY3Rpb25cblx0XHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gdGhhdCB3aWxsIHJlc29sdmUgdG8gdGhlIGZpbmFsIHJlZHVjZWQgdmFsdWVcblx0XHQgKi9cblx0XHRmdW5jdGlvbiByZWR1Y2UocHJvbWlzZXMsIGYgLyosIGluaXRpYWxWYWx1ZSAqLykge1xuXHRcdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXIuY2FsbChwcm9taXNlcywgbGlmdENvbWJpbmUoZiksIGFyZ3VtZW50c1syXSlcblx0XHRcdFx0XHQ6IGFyLmNhbGwocHJvbWlzZXMsIGxpZnRDb21iaW5lKGYpKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBUcmFkaXRpb25hbCByZWR1Y2UgZnVuY3Rpb24sIHNpbWlsYXIgdG8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodCgpYCwgYnV0XG5cdFx0ICogaW5wdXQgbWF5IGNvbnRhaW4gcHJvbWlzZXMgYW5kL29yIHZhbHVlcywgYW5kIHJlZHVjZUZ1bmNcblx0XHQgKiBtYXkgcmV0dXJuIGVpdGhlciBhIHZhbHVlIG9yIGEgcHJvbWlzZSwgKmFuZCogaW5pdGlhbFZhbHVlIG1heVxuXHRcdCAqIGJlIGEgcHJvbWlzZSBmb3IgdGhlIHN0YXJ0aW5nIHZhbHVlLlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl8UHJvbWlzZX0gcHJvbWlzZXMgYXJyYXkgb3IgcHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgYW55dGhpbmcsXG5cdFx0ICogICAgICBtYXkgY29udGFpbiBhIG1peCBvZiBwcm9taXNlcyBhbmQgdmFsdWVzLlxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oYWNjdW11bGF0ZWQ6KiwgeDoqLCBpbmRleDpOdW1iZXIpOip9IGYgcmVkdWNlIGZ1bmN0aW9uXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9IHRoYXQgd2lsbCByZXNvbHZlIHRvIHRoZSBmaW5hbCByZWR1Y2VkIHZhbHVlXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gcmVkdWNlUmlnaHQocHJvbWlzZXMsIGYgLyosIGluaXRpYWxWYWx1ZSAqLykge1xuXHRcdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJyLmNhbGwocHJvbWlzZXMsIGxpZnRDb21iaW5lKGYpLCBhcmd1bWVudHNbMl0pXG5cdFx0XHRcdFx0OiBhcnIuY2FsbChwcm9taXNlcywgbGlmdENvbWJpbmUoZikpO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGxpZnRDb21iaW5lKGYpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbih6LCB4LCBpKSB7XG5cdFx0XHRcdHJldHVybiBhcHBseUZvbGQoZiwgdm9pZCAwLCBbeix4LGldKTtcblx0XHRcdH07XG5cdFx0fVxuXHR9O1xuXG59KTtcbn0odHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lIDogZnVuY3Rpb24oZmFjdG9yeSkgeyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSk7IH0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvYXJyYXkuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE0IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbihmdW5jdGlvbihkZWZpbmUpIHsgJ3VzZSBzdHJpY3QnO1xuZGVmaW5lKGZ1bmN0aW9uKCkge1xuXG5cdHJldHVybiBmdW5jdGlvbiBmbG93KFByb21pc2UpIHtcblxuXHRcdHZhciByZXNvbHZlID0gUHJvbWlzZS5yZXNvbHZlO1xuXHRcdHZhciByZWplY3QgPSBQcm9taXNlLnJlamVjdDtcblx0XHR2YXIgb3JpZ0NhdGNoID0gUHJvbWlzZS5wcm90b3R5cGVbJ2NhdGNoJ107XG5cblx0XHQvKipcblx0XHQgKiBIYW5kbGUgdGhlIHVsdGltYXRlIGZ1bGZpbGxtZW50IHZhbHVlIG9yIHJlamVjdGlvbiByZWFzb24sIGFuZCBhc3N1bWVcblx0XHQgKiByZXNwb25zaWJpbGl0eSBmb3IgYWxsIGVycm9ycy4gIElmIGFuIGVycm9yIHByb3BhZ2F0ZXMgb3V0IG9mIHJlc3VsdFxuXHRcdCAqIG9yIGhhbmRsZUZhdGFsRXJyb3IsIGl0IHdpbGwgYmUgcmV0aHJvd24gdG8gdGhlIGhvc3QsIHJlc3VsdGluZyBpbiBhXG5cdFx0ICogbG91ZCBzdGFjayB0cmFjayBvbiBtb3N0IHBsYXRmb3JtcyBhbmQgYSBjcmFzaCBvbiBzb21lLlxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24/fSBvblJlc3VsdFxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24/fSBvbkVycm9yXG5cdFx0ICogQHJldHVybnMge3VuZGVmaW5lZH1cblx0XHQgKi9cblx0XHRQcm9taXNlLnByb3RvdHlwZS5kb25lID0gZnVuY3Rpb24ob25SZXN1bHQsIG9uRXJyb3IpIHtcblx0XHRcdHRoaXMuX2hhbmRsZXIudmlzaXQodGhpcy5faGFuZGxlci5yZWNlaXZlciwgb25SZXN1bHQsIG9uRXJyb3IpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBBZGQgRXJyb3ItdHlwZSBhbmQgcHJlZGljYXRlIG1hdGNoaW5nIHRvIGNhdGNoLiAgRXhhbXBsZXM6XG5cdFx0ICogcHJvbWlzZS5jYXRjaChUeXBlRXJyb3IsIGhhbmRsZVR5cGVFcnJvcilcblx0XHQgKiAgIC5jYXRjaChwcmVkaWNhdGUsIGhhbmRsZU1hdGNoZWRFcnJvcnMpXG5cdFx0ICogICAuY2F0Y2goaGFuZGxlUmVtYWluaW5nRXJyb3JzKVxuXHRcdCAqIEBwYXJhbSBvblJlamVjdGVkXG5cdFx0ICogQHJldHVybnMgeyp9XG5cdFx0ICovXG5cdFx0UHJvbWlzZS5wcm90b3R5cGVbJ2NhdGNoJ10gPSBQcm9taXNlLnByb3RvdHlwZS5vdGhlcndpc2UgPSBmdW5jdGlvbihvblJlamVjdGVkKSB7XG5cdFx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcblx0XHRcdFx0cmV0dXJuIG9yaWdDYXRjaC5jYWxsKHRoaXMsIG9uUmVqZWN0ZWQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZih0eXBlb2Ygb25SZWplY3RlZCAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5lbnN1cmUocmVqZWN0SW52YWxpZFByZWRpY2F0ZSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvcmlnQ2F0Y2guY2FsbCh0aGlzLCBjcmVhdGVDYXRjaEZpbHRlcihhcmd1bWVudHNbMV0sIG9uUmVqZWN0ZWQpKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogV3JhcHMgdGhlIHByb3ZpZGVkIGNhdGNoIGhhbmRsZXIsIHNvIHRoYXQgaXQgd2lsbCBvbmx5IGJlIGNhbGxlZFxuXHRcdCAqIGlmIHRoZSBwcmVkaWNhdGUgZXZhbHVhdGVzIHRydXRoeVxuXHRcdCAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBoYW5kbGVyXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbn0gcHJlZGljYXRlXG5cdFx0ICogQHJldHVybnMge2Z1bmN0aW9ufSBjb25kaXRpb25hbCBjYXRjaCBoYW5kbGVyXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gY3JlYXRlQ2F0Y2hGaWx0ZXIoaGFuZGxlciwgcHJlZGljYXRlKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRyZXR1cm4gZXZhbHVhdGVQcmVkaWNhdGUoZSwgcHJlZGljYXRlKVxuXHRcdFx0XHRcdD8gaGFuZGxlci5jYWxsKHRoaXMsIGUpXG5cdFx0XHRcdFx0OiByZWplY3QoZSk7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEVuc3VyZXMgdGhhdCBvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQgd2lsbCBiZSBjYWxsZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyXG5cdFx0ICogdGhpcyBwcm9taXNlIGlzIGZ1bGZpbGxlZCBvciByZWplY3RlZC4gIG9uRnVsZmlsbGVkT3JSZWplY3RlZCBXSUxMIE5PVFxuXHRcdCAqIHJlY2VpdmUgdGhlIHByb21pc2VzJyB2YWx1ZSBvciByZWFzb24uICBBbnkgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBkaXNyZWdhcmRlZC5cblx0XHQgKiBvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQgbWF5IHRocm93IG9yIHJldHVybiBhIHJlamVjdGVkIHByb21pc2UgdG8gc2lnbmFsXG5cdFx0ICogYW4gYWRkaXRpb25hbCBlcnJvci5cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBoYW5kbGVyIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHJlZ2FyZGxlc3Mgb2Zcblx0XHQgKiAgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0UHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXSA9IFByb21pc2UucHJvdG90eXBlLmVuc3VyZSA9IGZ1bmN0aW9uKGhhbmRsZXIpIHtcblx0XHRcdGlmKHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKHgpIHtcblx0XHRcdFx0cmV0dXJuIHJ1blNpZGVFZmZlY3QoaGFuZGxlciwgdGhpcywgaWRlbnRpdHksIHgpO1xuXHRcdFx0fSwgZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRyZXR1cm4gcnVuU2lkZUVmZmVjdChoYW5kbGVyLCB0aGlzLCByZWplY3QsIGUpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIHJ1blNpZGVFZmZlY3QgKGhhbmRsZXIsIHRoaXNBcmcsIHByb3BhZ2F0ZSwgdmFsdWUpIHtcblx0XHRcdHZhciByZXN1bHQgPSBoYW5kbGVyLmNhbGwodGhpc0FyZyk7XG5cdFx0XHRyZXR1cm4gbWF5YmVUaGVuYWJsZShyZXN1bHQpXG5cdFx0XHRcdD8gcHJvcGFnYXRlVmFsdWUocmVzdWx0LCBwcm9wYWdhdGUsIHZhbHVlKVxuXHRcdFx0XHQ6IHByb3BhZ2F0ZSh2YWx1ZSk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcHJvcGFnYXRlVmFsdWUgKHJlc3VsdCwgcHJvcGFnYXRlLCB4KSB7XG5cdFx0XHRyZXR1cm4gcmVzb2x2ZShyZXN1bHQpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gcHJvcGFnYXRlKHgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogUmVjb3ZlciBmcm9tIGEgZmFpbHVyZSBieSByZXR1cm5pbmcgYSBkZWZhdWx0VmFsdWUuICBJZiBkZWZhdWx0VmFsdWVcblx0XHQgKiBpcyBhIHByb21pc2UsIGl0J3MgZnVsZmlsbG1lbnQgdmFsdWUgd2lsbCBiZSB1c2VkLiAgSWYgZGVmYXVsdFZhbHVlIGlzXG5cdFx0ICogYSBwcm9taXNlIHRoYXQgcmVqZWN0cywgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCByZWplY3Qgd2l0aCB0aGVcblx0XHQgKiBzYW1lIHJlYXNvbi5cblx0XHQgKiBAcGFyYW0geyp9IGRlZmF1bHRWYWx1ZVxuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlfSBuZXcgcHJvbWlzZVxuXHRcdCAqL1xuXHRcdFByb21pc2UucHJvdG90eXBlWydlbHNlJ10gPSBQcm9taXNlLnByb3RvdHlwZS5vckVsc2UgPSBmdW5jdGlvbihkZWZhdWx0VmFsdWUpIHtcblx0XHRcdHJldHVybiB0aGlzLnRoZW4odm9pZCAwLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGRlZmF1bHRWYWx1ZTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBTaG9ydGN1dCBmb3IgLnRoZW4oZnVuY3Rpb24oKSB7IHJldHVybiB2YWx1ZTsgfSlcblx0XHQgKiBAcGFyYW0gIHsqfSB2YWx1ZVxuXHRcdCAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0OlxuXHRcdCAqICAtIGlzIGZ1bGZpbGxlZCBpZiB2YWx1ZSBpcyBub3QgYSBwcm9taXNlLCBvclxuXHRcdCAqICAtIGlmIHZhbHVlIGlzIGEgcHJvbWlzZSwgd2lsbCBmdWxmaWxsIHdpdGggaXRzIHZhbHVlLCBvciByZWplY3Rcblx0XHQgKiAgICB3aXRoIGl0cyByZWFzb24uXG5cdFx0ICovXG5cdFx0UHJvbWlzZS5wcm90b3R5cGVbJ3lpZWxkJ10gPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIFJ1bnMgYSBzaWRlIGVmZmVjdCB3aGVuIHRoaXMgcHJvbWlzZSBmdWxmaWxscywgd2l0aG91dCBjaGFuZ2luZyB0aGVcblx0XHQgKiBmdWxmaWxsbWVudCB2YWx1ZS5cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBvbkZ1bGZpbGxlZFNpZGVFZmZlY3Rcblx0XHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0XHQgKi9cblx0XHRQcm9taXNlLnByb3RvdHlwZS50YXAgPSBmdW5jdGlvbihvbkZ1bGZpbGxlZFNpZGVFZmZlY3QpIHtcblx0XHRcdHJldHVybiB0aGlzLnRoZW4ob25GdWxmaWxsZWRTaWRlRWZmZWN0KVsneWllbGQnXSh0aGlzKTtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIFByb21pc2U7XG5cdH07XG5cblx0ZnVuY3Rpb24gcmVqZWN0SW52YWxpZFByZWRpY2F0ZSgpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdjYXRjaCBwcmVkaWNhdGUgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cdH1cblxuXHRmdW5jdGlvbiBldmFsdWF0ZVByZWRpY2F0ZShlLCBwcmVkaWNhdGUpIHtcblx0XHRyZXR1cm4gaXNFcnJvcihwcmVkaWNhdGUpID8gZSBpbnN0YW5jZW9mIHByZWRpY2F0ZSA6IHByZWRpY2F0ZShlKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGlzRXJyb3IocHJlZGljYXRlKSB7XG5cdFx0cmV0dXJuIHByZWRpY2F0ZSA9PT0gRXJyb3Jcblx0XHRcdHx8IChwcmVkaWNhdGUgIT0gbnVsbCAmJiBwcmVkaWNhdGUucHJvdG90eXBlIGluc3RhbmNlb2YgRXJyb3IpO1xuXHR9XG5cblx0ZnVuY3Rpb24gbWF5YmVUaGVuYWJsZSh4KSB7XG5cdFx0cmV0dXJuICh0eXBlb2YgeCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHggPT09ICdmdW5jdGlvbicpICYmIHggIT09IG51bGw7XG5cdH1cblxuXHRmdW5jdGlvbiBpZGVudGl0eSh4KSB7XG5cdFx0cmV0dXJuIHg7XG5cdH1cblxufSk7XG59KHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZSA6IGZ1bmN0aW9uKGZhY3RvcnkpIHsgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7IH0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvZmxvdy5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvZGVjb3JhdG9ycy9mbG93LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNCBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuLyoqIEBhdXRob3IgSmVmZiBFc2NhbGFudGUgKi9cblxuKGZ1bmN0aW9uKGRlZmluZSkgeyAndXNlIHN0cmljdCc7XG5kZWZpbmUoZnVuY3Rpb24oKSB7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIGZvbGQoUHJvbWlzZSkge1xuXG5cdFx0UHJvbWlzZS5wcm90b3R5cGUuZm9sZCA9IGZ1bmN0aW9uKGYsIHopIHtcblx0XHRcdHZhciBwcm9taXNlID0gdGhpcy5fYmVnZXQoKTtcblxuXHRcdFx0dGhpcy5faGFuZGxlci5mb2xkKGZ1bmN0aW9uKHosIHgsIHRvKSB7XG5cdFx0XHRcdFByb21pc2UuX2hhbmRsZXIoeikuZm9sZChmdW5jdGlvbih4LCB6LCB0bykge1xuXHRcdFx0XHRcdHRvLnJlc29sdmUoZi5jYWxsKHRoaXMsIHosIHgpKTtcblx0XHRcdFx0fSwgeCwgdGhpcywgdG8pO1xuXHRcdFx0fSwgeiwgcHJvbWlzZS5faGFuZGxlci5yZWNlaXZlciwgcHJvbWlzZS5faGFuZGxlcik7XG5cblx0XHRcdHJldHVybiBwcm9taXNlO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gUHJvbWlzZTtcblx0fTtcblxufSk7XG59KHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZSA6IGZ1bmN0aW9uKGZhY3RvcnkpIHsgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7IH0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvZm9sZC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvZGVjb3JhdG9ycy9mb2xkLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNCBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG4oZnVuY3Rpb24oZGVmaW5lKSB7ICd1c2Ugc3RyaWN0JztcbmRlZmluZShmdW5jdGlvbihyZXF1aXJlKSB7XG5cblx0dmFyIGluc3BlY3QgPSByZXF1aXJlKCcuLi9zdGF0ZScpLmluc3BlY3Q7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIGluc3BlY3Rpb24oUHJvbWlzZSkge1xuXG5cdFx0UHJvbWlzZS5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGluc3BlY3QoUHJvbWlzZS5faGFuZGxlcih0aGlzKSk7XG5cdFx0fTtcblxuXHRcdHJldHVybiBQcm9taXNlO1xuXHR9O1xuXG59KTtcbn0odHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lIDogZnVuY3Rpb24oZmFjdG9yeSkgeyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSk7IH0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvaW5zcGVjdC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvZGVjb3JhdG9ycy9pbnNwZWN0LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNCBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG4oZnVuY3Rpb24oZGVmaW5lKSB7ICd1c2Ugc3RyaWN0JztcbmRlZmluZShmdW5jdGlvbigpIHtcblxuXHRyZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGUoUHJvbWlzZSkge1xuXG5cdFx0dmFyIHJlc29sdmUgPSBQcm9taXNlLnJlc29sdmU7XG5cblx0XHRQcm9taXNlLml0ZXJhdGUgPSBpdGVyYXRlO1xuXHRcdFByb21pc2UudW5mb2xkID0gdW5mb2xkO1xuXG5cdFx0cmV0dXJuIFByb21pc2U7XG5cblx0XHQvKipcblx0XHQgKiBAZGVwcmVjYXRlZCBVc2UgZ2l0aHViLmNvbS9jdWpvanMvbW9zdCBzdHJlYW1zIGFuZCBtb3N0Lml0ZXJhdGVcblx0XHQgKiBHZW5lcmF0ZSBhIChwb3RlbnRpYWxseSBpbmZpbml0ZSkgc3RyZWFtIG9mIHByb21pc2VkIHZhbHVlczpcblx0XHQgKiB4LCBmKHgpLCBmKGYoeCkpLCBldGMuIHVudGlsIGNvbmRpdGlvbih4KSByZXR1cm5zIHRydWVcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEgbmV3IHggZnJvbSB0aGUgcHJldmlvdXMgeFxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbmRpdGlvbiBmdW5jdGlvbiB0aGF0LCBnaXZlbiB0aGUgY3VycmVudCB4LCByZXR1cm5zXG5cdFx0ICogIHRydXRoeSB3aGVuIHRoZSBpdGVyYXRlIHNob3VsZCBzdG9wXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlciBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHZhbHVlIHByb2R1Y2VkIGJ5IGZcblx0XHQgKiBAcGFyYW0geyp8UHJvbWlzZX0geCBzdGFydGluZyB2YWx1ZSwgbWF5IGJlIGEgcHJvbWlzZVxuXHRcdCAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgY2FsbCB0byBmIGJlZm9yZVxuXHRcdCAqICBjb25kaXRpb24gcmV0dXJucyB0cnVlXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gaXRlcmF0ZShmLCBjb25kaXRpb24sIGhhbmRsZXIsIHgpIHtcblx0XHRcdHJldHVybiB1bmZvbGQoZnVuY3Rpb24oeCkge1xuXHRcdFx0XHRyZXR1cm4gW3gsIGYoeCldO1xuXHRcdFx0fSwgY29uZGl0aW9uLCBoYW5kbGVyLCB4KTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBAZGVwcmVjYXRlZCBVc2UgZ2l0aHViLmNvbS9jdWpvanMvbW9zdCBzdHJlYW1zIGFuZCBtb3N0LnVuZm9sZFxuXHRcdCAqIEdlbmVyYXRlIGEgKHBvdGVudGlhbGx5IGluZmluaXRlKSBzdHJlYW0gb2YgcHJvbWlzZWQgdmFsdWVzXG5cdFx0ICogYnkgYXBwbHlpbmcgaGFuZGxlcihnZW5lcmF0b3Ioc2VlZCkpIGl0ZXJhdGl2ZWx5IHVudGlsXG5cdFx0ICogY29uZGl0aW9uKHNlZWQpIHJldHVybnMgdHJ1ZS5cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSB1bnNwb29sIGZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIGEgW3ZhbHVlLCBuZXdTZWVkXVxuXHRcdCAqICBnaXZlbiBhIHNlZWQuXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbn0gY29uZGl0aW9uIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIHRoZSBjdXJyZW50IHNlZWQsIHJldHVybnNcblx0XHQgKiAgdHJ1dGh5IHdoZW4gdGhlIHVuZm9sZCBzaG91bGQgc3RvcFxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSB2YWx1ZSBwcm9kdWNlZCBieSB1bnNwb29sXG5cdFx0ICogQHBhcmFtIHggeyp8UHJvbWlzZX0gc3RhcnRpbmcgdmFsdWUsIG1heSBiZSBhIHByb21pc2Vcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IHZhbHVlIHByb2R1Y2VkIGJ5IHVuc3Bvb2wgYmVmb3JlXG5cdFx0ICogIGNvbmRpdGlvbiByZXR1cm5zIHRydWVcblx0XHQgKi9cblx0XHRmdW5jdGlvbiB1bmZvbGQodW5zcG9vbCwgY29uZGl0aW9uLCBoYW5kbGVyLCB4KSB7XG5cdFx0XHRyZXR1cm4gcmVzb2x2ZSh4KS50aGVuKGZ1bmN0aW9uKHNlZWQpIHtcblx0XHRcdFx0cmV0dXJuIHJlc29sdmUoY29uZGl0aW9uKHNlZWQpKS50aGVuKGZ1bmN0aW9uKGRvbmUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZG9uZSA/IHNlZWQgOiByZXNvbHZlKHVuc3Bvb2woc2VlZCkpLnNwcmVhZChuZXh0KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0ZnVuY3Rpb24gbmV4dChpdGVtLCBuZXdTZWVkKSB7XG5cdFx0XHRcdHJldHVybiByZXNvbHZlKGhhbmRsZXIoaXRlbSkpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHVuZm9sZCh1bnNwb29sLCBjb25kaXRpb24sIGhhbmRsZXIsIG5ld1NlZWQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cbn0pO1xufSh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUgOiBmdW5jdGlvbihmYWN0b3J5KSB7IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOyB9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy93aGVuL2xpYi9kZWNvcmF0b3JzL2l0ZXJhdGUuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvaXRlcmF0ZS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTQgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxuKGZ1bmN0aW9uKGRlZmluZSkgeyAndXNlIHN0cmljdCc7XG5kZWZpbmUoZnVuY3Rpb24oKSB7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHByb2dyZXNzKFByb21pc2UpIHtcblxuXHRcdC8qKlxuXHRcdCAqIEBkZXByZWNhdGVkXG5cdFx0ICogUmVnaXN0ZXIgYSBwcm9ncmVzcyBoYW5kbGVyIGZvciB0aGlzIHByb21pc2Vcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBvblByb2dyZXNzXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0UHJvbWlzZS5wcm90b3R5cGUucHJvZ3Jlc3MgPSBmdW5jdGlvbihvblByb2dyZXNzKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCwgdm9pZCAwLCBvblByb2dyZXNzKTtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIFByb21pc2U7XG5cdH07XG5cbn0pO1xufSh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUgOiBmdW5jdGlvbihmYWN0b3J5KSB7IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOyB9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy93aGVuL2xpYi9kZWNvcmF0b3JzL3Byb2dyZXNzLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy93aGVuL2xpYi9kZWNvcmF0b3JzL3Byb2dyZXNzLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNCBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG4oZnVuY3Rpb24oZGVmaW5lKSB7ICd1c2Ugc3RyaWN0JztcbmRlZmluZShmdW5jdGlvbihyZXF1aXJlKSB7XG5cblx0dmFyIGVudiA9IHJlcXVpcmUoJy4uL2VudicpO1xuXHR2YXIgVGltZW91dEVycm9yID0gcmVxdWlyZSgnLi4vVGltZW91dEVycm9yJyk7XG5cblx0ZnVuY3Rpb24gc2V0VGltZW91dChmLCBtcywgeCwgeSkge1xuXHRcdHJldHVybiBlbnYuc2V0VGltZXIoZnVuY3Rpb24oKSB7XG5cdFx0XHRmKHgsIHksIG1zKTtcblx0XHR9LCBtcyk7XG5cdH1cblxuXHRyZXR1cm4gZnVuY3Rpb24gdGltZWQoUHJvbWlzZSkge1xuXHRcdC8qKlxuXHRcdCAqIFJldHVybiBhIG5ldyBwcm9taXNlIHdob3NlIGZ1bGZpbGxtZW50IHZhbHVlIGlzIHJldmVhbGVkIG9ubHlcblx0XHQgKiBhZnRlciBtcyBtaWxsaXNlY29uZHNcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gbXMgbWlsbGlzZWNvbmRzXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0UHJvbWlzZS5wcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbihtcykge1xuXHRcdFx0dmFyIHAgPSB0aGlzLl9iZWdldCgpO1xuXHRcdFx0dGhpcy5faGFuZGxlci5mb2xkKGhhbmRsZURlbGF5LCBtcywgdm9pZCAwLCBwLl9oYW5kbGVyKTtcblx0XHRcdHJldHVybiBwO1xuXHRcdH07XG5cblx0XHRmdW5jdGlvbiBoYW5kbGVEZWxheShtcywgeCwgaCkge1xuXHRcdFx0c2V0VGltZW91dChyZXNvbHZlRGVsYXksIG1zLCB4LCBoKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiByZXNvbHZlRGVsYXkoeCwgaCkge1xuXHRcdFx0aC5yZXNvbHZlKHgpO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybiBhIG5ldyBwcm9taXNlIHRoYXQgcmVqZWN0cyBhZnRlciBtcyBtaWxsaXNlY29uZHMgdW5sZXNzXG5cdFx0ICogdGhpcyBwcm9taXNlIGZ1bGZpbGxzIGVhcmxpZXIsIGluIHdoaWNoIGNhc2UgdGhlIHJldHVybmVkIHByb21pc2Vcblx0XHQgKiBmdWxmaWxscyB3aXRoIHRoZSBzYW1lIHZhbHVlLlxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBtcyBtaWxsaXNlY29uZHNcblx0XHQgKiBAcGFyYW0ge0Vycm9yfCo9fSByZWFzb24gb3B0aW9uYWwgcmVqZWN0aW9uIHJlYXNvbiB0byB1c2UsIGRlZmF1bHRzXG5cdFx0ICogICB0byBhIFRpbWVvdXRFcnJvciBpZiBub3QgcHJvdmlkZWRcblx0XHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0XHQgKi9cblx0XHRQcm9taXNlLnByb3RvdHlwZS50aW1lb3V0ID0gZnVuY3Rpb24obXMsIHJlYXNvbikge1xuXHRcdFx0dmFyIHAgPSB0aGlzLl9iZWdldCgpO1xuXHRcdFx0dmFyIGggPSBwLl9oYW5kbGVyO1xuXG5cdFx0XHR2YXIgdCA9IHNldFRpbWVvdXQob25UaW1lb3V0LCBtcywgcmVhc29uLCBwLl9oYW5kbGVyKTtcblxuXHRcdFx0dGhpcy5faGFuZGxlci52aXNpdChoLFxuXHRcdFx0XHRmdW5jdGlvbiBvbkZ1bGZpbGwoeCkge1xuXHRcdFx0XHRcdGVudi5jbGVhclRpbWVyKHQpO1xuXHRcdFx0XHRcdHRoaXMucmVzb2x2ZSh4KTsgLy8gdGhpcyA9IGhcblx0XHRcdFx0fSxcblx0XHRcdFx0ZnVuY3Rpb24gb25SZWplY3QoeCkge1xuXHRcdFx0XHRcdGVudi5jbGVhclRpbWVyKHQpO1xuXHRcdFx0XHRcdHRoaXMucmVqZWN0KHgpOyAvLyB0aGlzID0gaFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRoLm5vdGlmeSk7XG5cblx0XHRcdHJldHVybiBwO1xuXHRcdH07XG5cblx0XHRmdW5jdGlvbiBvblRpbWVvdXQocmVhc29uLCBoLCBtcykge1xuXHRcdFx0dmFyIGUgPSB0eXBlb2YgcmVhc29uID09PSAndW5kZWZpbmVkJ1xuXHRcdFx0XHQ/IG5ldyBUaW1lb3V0RXJyb3IoJ3RpbWVkIG91dCBhZnRlciAnICsgbXMgKyAnbXMnKVxuXHRcdFx0XHQ6IHJlYXNvbjtcblx0XHRcdGgucmVqZWN0KGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlO1xuXHR9O1xuXG59KTtcbn0odHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lIDogZnVuY3Rpb24oZmFjdG9yeSkgeyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSk7IH0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvdGltZWQuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvdGltZWQuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE0IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbihmdW5jdGlvbihkZWZpbmUpIHsgJ3VzZSBzdHJpY3QnO1xuZGVmaW5lKGZ1bmN0aW9uKHJlcXVpcmUpIHtcblxuXHR2YXIgc2V0VGltZXIgPSByZXF1aXJlKCcuLi9lbnYnKS5zZXRUaW1lcjtcblx0dmFyIGZvcm1hdCA9IHJlcXVpcmUoJy4uL2Zvcm1hdCcpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1bmhhbmRsZWRSZWplY3Rpb24oUHJvbWlzZSkge1xuXG5cdFx0dmFyIGxvZ0Vycm9yID0gbm9vcDtcblx0XHR2YXIgbG9nSW5mbyA9IG5vb3A7XG5cdFx0dmFyIGxvY2FsQ29uc29sZTtcblxuXHRcdGlmKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0Ly8gQWxpYXMgY29uc29sZSB0byBwcmV2ZW50IHRoaW5ncyBsaWtlIHVnbGlmeSdzIGRyb3BfY29uc29sZSBvcHRpb24gZnJvbVxuXHRcdFx0Ly8gcmVtb3ZpbmcgY29uc29sZS5sb2cvZXJyb3IuIFVuaGFuZGxlZCByZWplY3Rpb25zIGZhbGwgaW50byB0aGUgc2FtZVxuXHRcdFx0Ly8gY2F0ZWdvcnkgYXMgdW5jYXVnaHQgZXhjZXB0aW9ucywgYW5kIGJ1aWxkIHRvb2xzIHNob3VsZG4ndCBzaWxlbmNlIHRoZW0uXG5cdFx0XHRsb2NhbENvbnNvbGUgPSBjb25zb2xlO1xuXHRcdFx0bG9nRXJyb3IgPSB0eXBlb2YgbG9jYWxDb25zb2xlLmVycm9yICE9PSAndW5kZWZpbmVkJ1xuXHRcdFx0XHQ/IGZ1bmN0aW9uIChlKSB7IGxvY2FsQ29uc29sZS5lcnJvcihlKTsgfVxuXHRcdFx0XHQ6IGZ1bmN0aW9uIChlKSB7IGxvY2FsQ29uc29sZS5sb2coZSk7IH07XG5cblx0XHRcdGxvZ0luZm8gPSB0eXBlb2YgbG9jYWxDb25zb2xlLmluZm8gIT09ICd1bmRlZmluZWQnXG5cdFx0XHRcdD8gZnVuY3Rpb24gKGUpIHsgbG9jYWxDb25zb2xlLmluZm8oZSk7IH1cblx0XHRcdFx0OiBmdW5jdGlvbiAoZSkgeyBsb2NhbENvbnNvbGUubG9nKGUpOyB9O1xuXHRcdH1cblxuXHRcdFByb21pc2Uub25Qb3RlbnRpYWxseVVuaGFuZGxlZFJlamVjdGlvbiA9IGZ1bmN0aW9uKHJlamVjdGlvbikge1xuXHRcdFx0ZW5xdWV1ZShyZXBvcnQsIHJlamVjdGlvbik7XG5cdFx0fTtcblxuXHRcdFByb21pc2Uub25Qb3RlbnRpYWxseVVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZWQgPSBmdW5jdGlvbihyZWplY3Rpb24pIHtcblx0XHRcdGVucXVldWUodW5yZXBvcnQsIHJlamVjdGlvbik7XG5cdFx0fTtcblxuXHRcdFByb21pc2Uub25GYXRhbFJlamVjdGlvbiA9IGZ1bmN0aW9uKHJlamVjdGlvbikge1xuXHRcdFx0ZW5xdWV1ZSh0aHJvd2l0LCByZWplY3Rpb24udmFsdWUpO1xuXHRcdH07XG5cblx0XHR2YXIgdGFza3MgPSBbXTtcblx0XHR2YXIgcmVwb3J0ZWQgPSBbXTtcblx0XHR2YXIgcnVubmluZyA9IG51bGw7XG5cblx0XHRmdW5jdGlvbiByZXBvcnQocikge1xuXHRcdFx0aWYoIXIuaGFuZGxlZCkge1xuXHRcdFx0XHRyZXBvcnRlZC5wdXNoKHIpO1xuXHRcdFx0XHRsb2dFcnJvcignUG90ZW50aWFsbHkgdW5oYW5kbGVkIHJlamVjdGlvbiBbJyArIHIuaWQgKyAnXSAnICsgZm9ybWF0LmZvcm1hdEVycm9yKHIudmFsdWUpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiB1bnJlcG9ydChyKSB7XG5cdFx0XHR2YXIgaSA9IHJlcG9ydGVkLmluZGV4T2Yocik7XG5cdFx0XHRpZihpID49IDApIHtcblx0XHRcdFx0cmVwb3J0ZWQuc3BsaWNlKGksIDEpO1xuXHRcdFx0XHRsb2dJbmZvKCdIYW5kbGVkIHByZXZpb3VzIHJlamVjdGlvbiBbJyArIHIuaWQgKyAnXSAnICsgZm9ybWF0LmZvcm1hdE9iamVjdChyLnZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZW5xdWV1ZShmLCB4KSB7XG5cdFx0XHR0YXNrcy5wdXNoKGYsIHgpO1xuXHRcdFx0aWYocnVubmluZyA9PT0gbnVsbCkge1xuXHRcdFx0XHRydW5uaW5nID0gc2V0VGltZXIoZmx1c2gsIDApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGZsdXNoKCkge1xuXHRcdFx0cnVubmluZyA9IG51bGw7XG5cdFx0XHR3aGlsZSh0YXNrcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRhc2tzLnNoaWZ0KCkodGFza3Muc2hpZnQoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFByb21pc2U7XG5cdH07XG5cblx0ZnVuY3Rpb24gdGhyb3dpdChlKSB7XG5cdFx0dGhyb3cgZTtcblx0fVxuXG5cdGZ1bmN0aW9uIG5vb3AoKSB7fVxuXG59KTtcbn0odHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lIDogZnVuY3Rpb24oZmFjdG9yeSkgeyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSk7IH0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvdW5oYW5kbGVkUmVqZWN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy93aGVuL2xpYi9kZWNvcmF0b3JzL3VuaGFuZGxlZFJlamVjdGlvbi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTQgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxuKGZ1bmN0aW9uKGRlZmluZSkgeyAndXNlIHN0cmljdCc7XG5kZWZpbmUoZnVuY3Rpb24oKSB7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIGFkZFdpdGgoUHJvbWlzZSkge1xuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgYSBwcm9taXNlIHdob3NlIGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkIHdpdGggYHRoaXNgIHNldCB0b1xuXHRcdCAqIHRoZSBzdXBwbGllZCByZWNlaXZlci4gIFN1YnNlcXVlbnQgcHJvbWlzZXMgZGVyaXZlZCBmcm9tIHRoZVxuXHRcdCAqIHJldHVybmVkIHByb21pc2Ugd2lsbCBhbHNvIGhhdmUgdGhlaXIgaGFuZGxlcnMgY2FsbGVkIHdpdGggcmVjZWl2ZXJcblx0XHQgKiBhcyBgdGhpc2AuIENhbGxpbmcgYHdpdGhgIHdpdGggdW5kZWZpbmVkIG9yIG5vIGFyZ3VtZW50cyB3aWxsIHJldHVyblxuXHRcdCAqIGEgcHJvbWlzZSB3aG9zZSBoYW5kbGVycyB3aWxsIGFnYWluIGJlIGNhbGxlZCBpbiB0aGUgdXN1YWwgUHJvbWlzZXMvQStcblx0XHQgKiB3YXkgKG5vIGB0aGlzYCkgdGh1cyBzYWZlbHkgdW5kb2luZyBhbnkgcHJldmlvdXMgYHdpdGhgIGluIHRoZVxuXHRcdCAqIHByb21pc2UgY2hhaW4uXG5cdFx0ICpcblx0XHQgKiBXQVJOSU5HOiBQcm9taXNlcyByZXR1cm5lZCBmcm9tIGB3aXRoYC9gd2l0aFRoaXNgIGFyZSBOT1QgUHJvbWlzZXMvQStcblx0XHQgKiBjb21wbGlhbnQsIHNwZWNpZmljYWxseSB2aW9sYXRpbmcgMi4yLjUgKGh0dHA6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNDEpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge29iamVjdH0gcmVjZWl2ZXIgYHRoaXNgIHZhbHVlIGZvciBhbGwgaGFuZGxlcnMgYXR0YWNoZWQgdG9cblx0XHQgKiAgdGhlIHJldHVybmVkIHByb21pc2UuXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0UHJvbWlzZS5wcm90b3R5cGVbJ3dpdGgnXSA9IFByb21pc2UucHJvdG90eXBlLndpdGhUaGlzID0gZnVuY3Rpb24ocmVjZWl2ZXIpIHtcblx0XHRcdHZhciBwID0gdGhpcy5fYmVnZXQoKTtcblx0XHRcdHZhciBjaGlsZCA9IHAuX2hhbmRsZXI7XG5cdFx0XHRjaGlsZC5yZWNlaXZlciA9IHJlY2VpdmVyO1xuXHRcdFx0dGhpcy5faGFuZGxlci5jaGFpbihjaGlsZCwgcmVjZWl2ZXIpO1xuXHRcdFx0cmV0dXJuIHA7XG5cdFx0fTtcblxuXHRcdHJldHVybiBQcm9taXNlO1xuXHR9O1xuXG59KTtcbn0odHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lIDogZnVuY3Rpb24oZmFjdG9yeSkgeyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsgfSkpO1xuXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy93aGVuL2xpYi9kZWNvcmF0b3JzL3dpdGguanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2RlY29yYXRvcnMvd2l0aC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTQgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxuLypnbG9iYWwgcHJvY2Vzcyxkb2N1bWVudCxzZXRUaW1lb3V0LGNsZWFyVGltZW91dCxNdXRhdGlvbk9ic2VydmVyLFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqL1xuKGZ1bmN0aW9uKGRlZmluZSkgeyAndXNlIHN0cmljdCc7XG5kZWZpbmUoZnVuY3Rpb24ocmVxdWlyZSkge1xuXHQvKmpzaGludCBtYXhjb21wbGV4aXR5OjYqL1xuXG5cdC8vIFNuaWZmIFwiYmVzdFwiIGFzeW5jIHNjaGVkdWxpbmcgb3B0aW9uXG5cdC8vIFByZWZlciBwcm9jZXNzLm5leHRUaWNrIG9yIE11dGF0aW9uT2JzZXJ2ZXIsIHRoZW4gY2hlY2sgZm9yXG5cdC8vIHNldFRpbWVvdXQsIGFuZCBmaW5hbGx5IHZlcnR4LCBzaW5jZSBpdHMgdGhlIG9ubHkgZW52IHRoYXQgZG9lc24ndFxuXHQvLyBoYXZlIHNldFRpbWVvdXRcblxuXHR2YXIgTXV0YXRpb25PYnM7XG5cdHZhciBjYXB0dXJlZFNldFRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcgJiYgc2V0VGltZW91dDtcblxuXHQvLyBEZWZhdWx0IGVudlxuXHR2YXIgc2V0VGltZXIgPSBmdW5jdGlvbihmLCBtcykgeyByZXR1cm4gc2V0VGltZW91dChmLCBtcyk7IH07XG5cdHZhciBjbGVhclRpbWVyID0gZnVuY3Rpb24odCkgeyByZXR1cm4gY2xlYXJUaW1lb3V0KHQpOyB9O1xuXHR2YXIgYXNhcCA9IGZ1bmN0aW9uIChmKSB7IHJldHVybiBjYXB0dXJlZFNldFRpbWVvdXQoZiwgMCk7IH07XG5cblx0Ly8gRGV0ZWN0IHNwZWNpZmljIGVudlxuXHRpZiAoaXNOb2RlKCkpIHsgLy8gTm9kZVxuXHRcdGFzYXAgPSBmdW5jdGlvbiAoZikgeyByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmKTsgfTtcblxuXHR9IGVsc2UgaWYgKE11dGF0aW9uT2JzID0gaGFzTXV0YXRpb25PYnNlcnZlcigpKSB7IC8vIE1vZGVybiBicm93c2VyXG5cdFx0YXNhcCA9IGluaXRNdXRhdGlvbk9ic2VydmVyKE11dGF0aW9uT2JzKTtcblxuXHR9IGVsc2UgaWYgKCFjYXB0dXJlZFNldFRpbWVvdXQpIHsgLy8gdmVydC54XG5cdFx0dmFyIHZlcnR4UmVxdWlyZSA9IHJlcXVpcmU7XG5cdFx0dmFyIHZlcnR4ID0gdmVydHhSZXF1aXJlKCd2ZXJ0eCcpO1xuXHRcdHNldFRpbWVyID0gZnVuY3Rpb24gKGYsIG1zKSB7IHJldHVybiB2ZXJ0eC5zZXRUaW1lcihtcywgZik7IH07XG5cdFx0Y2xlYXJUaW1lciA9IHZlcnR4LmNhbmNlbFRpbWVyO1xuXHRcdGFzYXAgPSB2ZXJ0eC5ydW5Pbkxvb3AgfHwgdmVydHgucnVuT25Db250ZXh0O1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRzZXRUaW1lcjogc2V0VGltZXIsXG5cdFx0Y2xlYXJUaW1lcjogY2xlYXJUaW1lcixcblx0XHRhc2FwOiBhc2FwXG5cdH07XG5cblx0ZnVuY3Rpb24gaXNOb2RlICgpIHtcblx0XHRyZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmXG5cdFx0XHRPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJztcblx0fVxuXG5cdGZ1bmN0aW9uIGhhc011dGF0aW9uT2JzZXJ2ZXIgKCkge1xuXHQgICAgcmV0dXJuICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgTXV0YXRpb25PYnNlcnZlcikgfHxcblx0XHRcdCh0eXBlb2YgV2ViS2l0TXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgV2ViS2l0TXV0YXRpb25PYnNlcnZlcik7XG5cdH1cblxuXHRmdW5jdGlvbiBpbml0TXV0YXRpb25PYnNlcnZlcihNdXRhdGlvbk9ic2VydmVyKSB7XG5cdFx0dmFyIHNjaGVkdWxlZDtcblx0XHR2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcblx0XHR2YXIgbyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHJ1bik7XG5cdFx0by5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcblxuXHRcdGZ1bmN0aW9uIHJ1bigpIHtcblx0XHRcdHZhciBmID0gc2NoZWR1bGVkO1xuXHRcdFx0c2NoZWR1bGVkID0gdm9pZCAwO1xuXHRcdFx0ZigpO1xuXHRcdH1cblxuXHRcdHZhciBpID0gMDtcblx0XHRyZXR1cm4gZnVuY3Rpb24gKGYpIHtcblx0XHRcdHNjaGVkdWxlZCA9IGY7XG5cdFx0XHRub2RlLmRhdGEgPSAoaSBePSAxKTtcblx0XHR9O1xuXHR9XG59KTtcbn0odHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lIDogZnVuY3Rpb24oZmFjdG9yeSkgeyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSk7IH0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2Vudi5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvZW52LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNCBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG4oZnVuY3Rpb24oZGVmaW5lKSB7ICd1c2Ugc3RyaWN0JztcbmRlZmluZShmdW5jdGlvbigpIHtcblxuXHRyZXR1cm4ge1xuXHRcdGZvcm1hdEVycm9yOiBmb3JtYXRFcnJvcixcblx0XHRmb3JtYXRPYmplY3Q6IGZvcm1hdE9iamVjdCxcblx0XHR0cnlTdHJpbmdpZnk6IHRyeVN0cmluZ2lmeVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBGb3JtYXQgYW4gZXJyb3IgaW50byBhIHN0cmluZy4gIElmIGUgaXMgYW4gRXJyb3IgYW5kIGhhcyBhIHN0YWNrIHByb3BlcnR5LFxuXHQgKiBpdCdzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBlIGlzIGZvcm1hdHRlZCB1c2luZyBmb3JtYXRPYmplY3QsIHdpdGggYVxuXHQgKiB3YXJuaW5nIGFkZGVkIGFib3V0IGUgbm90IGJlaW5nIGEgcHJvcGVyIEVycm9yLlxuXHQgKiBAcGFyYW0geyp9IGVcblx0ICogQHJldHVybnMge1N0cmluZ30gZm9ybWF0dGVkIHN0cmluZywgc3VpdGFibGUgZm9yIG91dHB1dCB0byBkZXZlbG9wZXJzXG5cdCAqL1xuXHRmdW5jdGlvbiBmb3JtYXRFcnJvcihlKSB7XG5cdFx0dmFyIHMgPSB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgZSAhPT0gbnVsbCAmJiAoZS5zdGFjayB8fCBlLm1lc3NhZ2UpID8gZS5zdGFjayB8fCBlLm1lc3NhZ2UgOiBmb3JtYXRPYmplY3QoZSk7XG5cdFx0cmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvciA/IHMgOiBzICsgJyAoV0FSTklORzogbm9uLUVycm9yIHVzZWQpJztcblx0fVxuXG5cdC8qKlxuXHQgKiBGb3JtYXQgYW4gb2JqZWN0LCBkZXRlY3RpbmcgXCJwbGFpblwiIG9iamVjdHMgYW5kIHJ1bm5pbmcgdGhlbSB0aHJvdWdoXG5cdCAqIEpTT04uc3RyaW5naWZ5IGlmIHBvc3NpYmxlLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gb1xuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gZm9ybWF0T2JqZWN0KG8pIHtcblx0XHR2YXIgcyA9IFN0cmluZyhvKTtcblx0XHRpZihzID09PSAnW29iamVjdCBPYmplY3RdJyAmJiB0eXBlb2YgSlNPTiAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHMgPSB0cnlTdHJpbmdpZnkobywgcyk7XG5cdFx0fVxuXHRcdHJldHVybiBzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyeSB0byByZXR1cm4gdGhlIHJlc3VsdCBvZiBKU09OLnN0cmluZ2lmeSh4KS4gIElmIHRoYXQgZmFpbHMsIHJldHVyblxuXHQgKiBkZWZhdWx0VmFsdWVcblx0ICogQHBhcmFtIHsqfSB4XG5cdCAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd8Kn0gSlNPTi5zdHJpbmdpZnkoeCkgb3IgZGVmYXVsdFZhbHVlXG5cdCAqL1xuXHRmdW5jdGlvbiB0cnlTdHJpbmdpZnkoeCwgZGVmYXVsdFZhbHVlKSB7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh4KTtcblx0XHR9IGNhdGNoKGUpIHtcblx0XHRcdHJldHVybiBkZWZhdWx0VmFsdWU7XG5cdFx0fVxuXHR9XG5cbn0pO1xufSh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUgOiBmdW5jdGlvbihmYWN0b3J5KSB7IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOyB9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy93aGVuL2xpYi9mb3JtYXQuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL2Zvcm1hdC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTQgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxuKGZ1bmN0aW9uKGRlZmluZSkgeyAndXNlIHN0cmljdCc7XG5kZWZpbmUoZnVuY3Rpb24oKSB7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIG1ha2VQcm9taXNlKGVudmlyb25tZW50KSB7XG5cblx0XHR2YXIgdGFza3MgPSBlbnZpcm9ubWVudC5zY2hlZHVsZXI7XG5cdFx0dmFyIGVtaXRSZWplY3Rpb24gPSBpbml0RW1pdFJlamVjdGlvbigpO1xuXG5cdFx0dmFyIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHxcblx0XHRcdGZ1bmN0aW9uKHByb3RvKSB7XG5cdFx0XHRcdGZ1bmN0aW9uIENoaWxkKCkge31cblx0XHRcdFx0Q2hpbGQucHJvdG90eXBlID0gcHJvdG87XG5cdFx0XHRcdHJldHVybiBuZXcgQ2hpbGQoKTtcblx0XHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBDcmVhdGUgYSBwcm9taXNlIHdob3NlIGZhdGUgaXMgZGV0ZXJtaW5lZCBieSByZXNvbHZlclxuXHRcdCAqIEBjb25zdHJ1Y3RvclxuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlXG5cdFx0ICogQG5hbWUgUHJvbWlzZVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIFByb21pc2UocmVzb2x2ZXIsIGhhbmRsZXIpIHtcblx0XHRcdHRoaXMuX2hhbmRsZXIgPSByZXNvbHZlciA9PT0gSGFuZGxlciA/IGhhbmRsZXIgOiBpbml0KHJlc29sdmVyKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBSdW4gdGhlIHN1cHBsaWVkIHJlc29sdmVyXG5cdFx0ICogQHBhcmFtIHJlc29sdmVyXG5cdFx0ICogQHJldHVybnMge1BlbmRpbmd9XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gaW5pdChyZXNvbHZlcikge1xuXHRcdFx0dmFyIGhhbmRsZXIgPSBuZXcgUGVuZGluZygpO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXNvbHZlcihwcm9taXNlUmVzb2x2ZSwgcHJvbWlzZVJlamVjdCwgcHJvbWlzZU5vdGlmeSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHByb21pc2VSZWplY3QoZSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBoYW5kbGVyO1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIFRyYW5zaXRpb24gZnJvbSBwcmUtcmVzb2x1dGlvbiBzdGF0ZSB0byBwb3N0LXJlc29sdXRpb24gc3RhdGUsIG5vdGlmeWluZ1xuXHRcdFx0ICogYWxsIGxpc3RlbmVycyBvZiB0aGUgdWx0aW1hdGUgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uXG5cdFx0XHQgKiBAcGFyYW0geyp9IHggcmVzb2x1dGlvbiB2YWx1ZVxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbiBwcm9taXNlUmVzb2x2ZSAoeCkge1xuXHRcdFx0XHRoYW5kbGVyLnJlc29sdmUoeCk7XG5cdFx0XHR9XG5cdFx0XHQvKipcblx0XHRcdCAqIFJlamVjdCB0aGlzIHByb21pc2Ugd2l0aCByZWFzb24sIHdoaWNoIHdpbGwgYmUgdXNlZCB2ZXJiYXRpbVxuXHRcdFx0ICogQHBhcmFtIHtFcnJvcnwqfSByZWFzb24gcmVqZWN0aW9uIHJlYXNvbiwgc3Ryb25nbHkgc3VnZ2VzdGVkXG5cdFx0XHQgKiAgIHRvIGJlIGFuIEVycm9yIHR5cGVcblx0XHRcdCAqL1xuXHRcdFx0ZnVuY3Rpb24gcHJvbWlzZVJlamVjdCAocmVhc29uKSB7XG5cdFx0XHRcdGhhbmRsZXIucmVqZWN0KHJlYXNvbik7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQGRlcHJlY2F0ZWRcblx0XHRcdCAqIElzc3VlIGEgcHJvZ3Jlc3MgZXZlbnQsIG5vdGlmeWluZyBhbGwgcHJvZ3Jlc3MgbGlzdGVuZXJzXG5cdFx0XHQgKiBAcGFyYW0geyp9IHggcHJvZ3Jlc3MgZXZlbnQgcGF5bG9hZCB0byBwYXNzIHRvIGFsbCBsaXN0ZW5lcnNcblx0XHRcdCAqL1xuXHRcdFx0ZnVuY3Rpb24gcHJvbWlzZU5vdGlmeSAoeCkge1xuXHRcdFx0XHRoYW5kbGVyLm5vdGlmeSh4KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDcmVhdGlvblxuXG5cdFx0UHJvbWlzZS5yZXNvbHZlID0gcmVzb2x2ZTtcblx0XHRQcm9taXNlLnJlamVjdCA9IHJlamVjdDtcblx0XHRQcm9taXNlLm5ldmVyID0gbmV2ZXI7XG5cblx0XHRQcm9taXNlLl9kZWZlciA9IGRlZmVyO1xuXHRcdFByb21pc2UuX2hhbmRsZXIgPSBnZXRIYW5kbGVyO1xuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJucyBhIHRydXN0ZWQgcHJvbWlzZS4gSWYgeCBpcyBhbHJlYWR5IGEgdHJ1c3RlZCBwcm9taXNlLCBpdCBpc1xuXHRcdCAqIHJldHVybmVkLCBvdGhlcndpc2UgcmV0dXJucyBhIG5ldyB0cnVzdGVkIFByb21pc2Ugd2hpY2ggZm9sbG93cyB4LlxuXHRcdCAqIEBwYXJhbSAgeyp9IHhcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG5cdFx0XHRyZXR1cm4gaXNQcm9taXNlKHgpID8geFxuXHRcdFx0XHQ6IG5ldyBQcm9taXNlKEhhbmRsZXIsIG5ldyBBc3luYyhnZXRIYW5kbGVyKHgpKSk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJuIGEgcmVqZWN0IHByb21pc2Ugd2l0aCB4IGFzIGl0cyByZWFzb24gKHggaXMgdXNlZCB2ZXJiYXRpbSlcblx0XHQgKiBAcGFyYW0geyp9IHhcblx0XHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gcmVqZWN0ZWQgcHJvbWlzZVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIHJlamVjdCh4KSB7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoSGFuZGxlciwgbmV3IEFzeW5jKG5ldyBSZWplY3RlZCh4KSkpO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybiBhIHByb21pc2UgdGhhdCByZW1haW5zIHBlbmRpbmcgZm9yZXZlclxuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlfSBmb3JldmVyLXBlbmRpbmcgcHJvbWlzZS5cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBuZXZlcigpIHtcblx0XHRcdHJldHVybiBmb3JldmVyUGVuZGluZ1Byb21pc2U7IC8vIFNob3VsZCBiZSBmcm96ZW5cblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBDcmVhdGVzIGFuIGludGVybmFsIHtwcm9taXNlLCByZXNvbHZlcn0gcGFpclxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZGVmZXIoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoSGFuZGxlciwgbmV3IFBlbmRpbmcoKSk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJhbnNmb3JtYXRpb24gYW5kIGZsb3cgY29udHJvbFxuXG5cdFx0LyoqXG5cdFx0ICogVHJhbnNmb3JtIHRoaXMgcHJvbWlzZSdzIGZ1bGZpbGxtZW50IHZhbHVlLCByZXR1cm5pbmcgYSBuZXcgUHJvbWlzZVxuXHRcdCAqIGZvciB0aGUgdHJhbnNmb3JtZWQgcmVzdWx0LiAgSWYgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZCwgb25SZWplY3RlZFxuXHRcdCAqIGlzIGNhbGxlZCB3aXRoIHRoZSByZWFzb24uICBvblByb2dyZXNzICptYXkqIGJlIGNhbGxlZCB3aXRoIHVwZGF0ZXMgdG93YXJkXG5cdFx0ICogdGhpcyBwcm9taXNlJ3MgZnVsZmlsbG1lbnQuXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbj19IG9uRnVsZmlsbGVkIGZ1bGZpbGxtZW50IGhhbmRsZXJcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uPX0gb25SZWplY3RlZCByZWplY3Rpb24gaGFuZGxlclxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb249fSBvblByb2dyZXNzIEBkZXByZWNhdGVkIHByb2dyZXNzIGhhbmRsZXJcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfSBuZXcgcHJvbWlzZVxuXHRcdCAqL1xuXHRcdFByb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgb25Qcm9ncmVzcykge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMuX2hhbmRsZXI7XG5cdFx0XHR2YXIgc3RhdGUgPSBwYXJlbnQuam9pbigpLnN0YXRlKCk7XG5cblx0XHRcdGlmICgodHlwZW9mIG9uRnVsZmlsbGVkICE9PSAnZnVuY3Rpb24nICYmIHN0YXRlID4gMCkgfHxcblx0XHRcdFx0KHR5cGVvZiBvblJlamVjdGVkICE9PSAnZnVuY3Rpb24nICYmIHN0YXRlIDwgMCkpIHtcblx0XHRcdFx0Ly8gU2hvcnQgY2lyY3VpdDogdmFsdWUgd2lsbCBub3QgY2hhbmdlLCBzaW1wbHkgc2hhcmUgaGFuZGxlclxuXHRcdFx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoSGFuZGxlciwgcGFyZW50KTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHAgPSB0aGlzLl9iZWdldCgpO1xuXHRcdFx0dmFyIGNoaWxkID0gcC5faGFuZGxlcjtcblxuXHRcdFx0cGFyZW50LmNoYWluKGNoaWxkLCBwYXJlbnQucmVjZWl2ZXIsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBvblByb2dyZXNzKTtcblxuXHRcdFx0cmV0dXJuIHA7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIElmIHRoaXMgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkIGR1ZSB0byBhbiBlcnJvciwgY2FsbCBvblJlamVjdGVkIHRvXG5cdFx0ICogaGFuZGxlIHRoZSBlcnJvci4gU2hvcnRjdXQgZm9yIC50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZClcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uP30gb25SZWplY3RlZFxuXHRcdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0UHJvbWlzZS5wcm90b3R5cGVbJ2NhdGNoJ10gPSBmdW5jdGlvbihvblJlamVjdGVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCwgb25SZWplY3RlZCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIENyZWF0ZXMgYSBuZXcsIHBlbmRpbmcgcHJvbWlzZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgcHJvbWlzZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0UHJvbWlzZS5wcm90b3R5cGUuX2JlZ2V0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gYmVnZXRGcm9tKHRoaXMuX2hhbmRsZXIsIHRoaXMuY29uc3RydWN0b3IpO1xuXHRcdH07XG5cblx0XHRmdW5jdGlvbiBiZWdldEZyb20ocGFyZW50LCBQcm9taXNlKSB7XG5cdFx0XHR2YXIgY2hpbGQgPSBuZXcgUGVuZGluZyhwYXJlbnQucmVjZWl2ZXIsIHBhcmVudC5qb2luKCkuY29udGV4dCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoSGFuZGxlciwgY2hpbGQpO1xuXHRcdH1cblxuXHRcdC8vIEFycmF5IGNvbWJpbmF0b3JzXG5cblx0XHRQcm9taXNlLmFsbCA9IGFsbDtcblx0XHRQcm9taXNlLnJhY2UgPSByYWNlO1xuXHRcdFByb21pc2UuX3RyYXZlcnNlID0gdHJhdmVyc2U7XG5cblx0XHQvKipcblx0XHQgKiBSZXR1cm4gYSBwcm9taXNlIHRoYXQgd2lsbCBmdWxmaWxsIHdoZW4gYWxsIHByb21pc2VzIGluIHRoZVxuXHRcdCAqIGlucHV0IGFycmF5IGhhdmUgZnVsZmlsbGVkLCBvciB3aWxsIHJlamVjdCB3aGVuIG9uZSBvZiB0aGVcblx0XHQgKiBwcm9taXNlcyByZWplY3RzLlxuXHRcdCAqIEBwYXJhbSB7YXJyYXl9IHByb21pc2VzIGFycmF5IG9mIHByb21pc2VzXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgZm9yIGFycmF5IG9mIGZ1bGZpbGxtZW50IHZhbHVlc1xuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuXHRcdFx0cmV0dXJuIHRyYXZlcnNlV2l0aChzbmQsIG51bGwsIHByb21pc2VzKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBBcnJheTxQcm9taXNlPFg+PiAtPiBQcm9taXNlPEFycmF5PGYoWCk+PlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbn0gZiBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIHByb21pc2UncyB2YWx1ZVxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IHByb21pc2VzIGFycmF5IG9mIHByb21pc2VzXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgZm9yIHRyYW5zZm9ybWVkIHZhbHVlc1xuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIHRyYXZlcnNlKGYsIHByb21pc2VzKSB7XG5cdFx0XHRyZXR1cm4gdHJhdmVyc2VXaXRoKHRyeUNhdGNoMiwgZiwgcHJvbWlzZXMpO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHRyYXZlcnNlV2l0aCh0cnlNYXAsIGYsIHByb21pc2VzKSB7XG5cdFx0XHR2YXIgaGFuZGxlciA9IHR5cGVvZiBmID09PSAnZnVuY3Rpb24nID8gbWFwQXQgOiBzZXR0bGVBdDtcblxuXHRcdFx0dmFyIHJlc29sdmVyID0gbmV3IFBlbmRpbmcoKTtcblx0XHRcdHZhciBwZW5kaW5nID0gcHJvbWlzZXMubGVuZ3RoID4+PiAwO1xuXHRcdFx0dmFyIHJlc3VsdHMgPSBuZXcgQXJyYXkocGVuZGluZyk7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwLCB4OyBpIDwgcHJvbWlzZXMubGVuZ3RoICYmICFyZXNvbHZlci5yZXNvbHZlZDsgKytpKSB7XG5cdFx0XHRcdHggPSBwcm9taXNlc1tpXTtcblxuXHRcdFx0XHRpZiAoeCA9PT0gdm9pZCAwICYmICEoaSBpbiBwcm9taXNlcykpIHtcblx0XHRcdFx0XHQtLXBlbmRpbmc7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0cmF2ZXJzZUF0KHByb21pc2VzLCBoYW5kbGVyLCBpLCB4LCByZXNvbHZlcik7XG5cdFx0XHR9XG5cblx0XHRcdGlmKHBlbmRpbmcgPT09IDApIHtcblx0XHRcdFx0cmVzb2x2ZXIuYmVjb21lKG5ldyBGdWxmaWxsZWQocmVzdWx0cykpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoSGFuZGxlciwgcmVzb2x2ZXIpO1xuXG5cdFx0XHRmdW5jdGlvbiBtYXBBdChpLCB4LCByZXNvbHZlcikge1xuXHRcdFx0XHRpZighcmVzb2x2ZXIucmVzb2x2ZWQpIHtcblx0XHRcdFx0XHR0cmF2ZXJzZUF0KHByb21pc2VzLCBzZXR0bGVBdCwgaSwgdHJ5TWFwKGYsIHgsIGkpLCByZXNvbHZlcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gc2V0dGxlQXQoaSwgeCwgcmVzb2x2ZXIpIHtcblx0XHRcdFx0cmVzdWx0c1tpXSA9IHg7XG5cdFx0XHRcdGlmKC0tcGVuZGluZyA9PT0gMCkge1xuXHRcdFx0XHRcdHJlc29sdmVyLmJlY29tZShuZXcgRnVsZmlsbGVkKHJlc3VsdHMpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHRyYXZlcnNlQXQocHJvbWlzZXMsIGhhbmRsZXIsIGksIHgsIHJlc29sdmVyKSB7XG5cdFx0XHRpZiAobWF5YmVUaGVuYWJsZSh4KSkge1xuXHRcdFx0XHR2YXIgaCA9IGdldEhhbmRsZXJNYXliZVRoZW5hYmxlKHgpO1xuXHRcdFx0XHR2YXIgcyA9IGguc3RhdGUoKTtcblxuXHRcdFx0XHRpZiAocyA9PT0gMCkge1xuXHRcdFx0XHRcdGguZm9sZChoYW5kbGVyLCBpLCB2b2lkIDAsIHJlc29sdmVyKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzID4gMCkge1xuXHRcdFx0XHRcdGhhbmRsZXIoaSwgaC52YWx1ZSwgcmVzb2x2ZXIpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmVyLmJlY29tZShoKTtcblx0XHRcdFx0XHR2aXNpdFJlbWFpbmluZyhwcm9taXNlcywgaSsxLCBoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGFuZGxlcihpLCB4LCByZXNvbHZlcik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0UHJvbWlzZS5fdmlzaXRSZW1haW5pbmcgPSB2aXNpdFJlbWFpbmluZztcblx0XHRmdW5jdGlvbiB2aXNpdFJlbWFpbmluZyhwcm9taXNlcywgc3RhcnQsIGhhbmRsZXIpIHtcblx0XHRcdGZvcih2YXIgaT1zdGFydDsgaTxwcm9taXNlcy5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHRtYXJrQXNIYW5kbGVkKGdldEhhbmRsZXIocHJvbWlzZXNbaV0pLCBoYW5kbGVyKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBtYXJrQXNIYW5kbGVkKGgsIGhhbmRsZXIpIHtcblx0XHRcdGlmKGggPT09IGhhbmRsZXIpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcyA9IGguc3RhdGUoKTtcblx0XHRcdGlmKHMgPT09IDApIHtcblx0XHRcdFx0aC52aXNpdChoLCB2b2lkIDAsIGguX3VucmVwb3J0KTtcblx0XHRcdH0gZWxzZSBpZihzIDwgMCkge1xuXHRcdFx0XHRoLl91bnJlcG9ydCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEZ1bGZpbGwtcmVqZWN0IGNvbXBldGl0aXZlIHJhY2UuIFJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIHNldHRsZVxuXHRcdCAqIHRvIHRoZSBzYW1lIHN0YXRlIGFzIHRoZSBlYXJsaWVzdCBpbnB1dCBwcm9taXNlIHRvIHNldHRsZS5cblx0XHQgKlxuXHRcdCAqIFdBUk5JTkc6IFRoZSBFUzYgUHJvbWlzZSBzcGVjIHJlcXVpcmVzIHRoYXQgcmFjZSgpaW5nIGFuIGVtcHR5IGFycmF5XG5cdFx0ICogbXVzdCByZXR1cm4gYSBwcm9taXNlIHRoYXQgaXMgcGVuZGluZyBmb3JldmVyLiAgVGhpcyBpbXBsZW1lbnRhdGlvblxuXHRcdCAqIHJldHVybnMgYSBzaW5nbGV0b24gZm9yZXZlci1wZW5kaW5nIHByb21pc2UsIHRoZSBzYW1lIHNpbmdsZXRvbiB0aGF0IGlzXG5cdFx0ICogcmV0dXJuZWQgYnkgUHJvbWlzZS5uZXZlcigpLCB0aHVzIGNhbiBiZSBjaGVja2VkIHdpdGggPT09XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2FycmF5fSBwcm9taXNlcyBhcnJheSBvZiBwcm9taXNlcyB0byByYWNlXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9IGlmIGlucHV0IGlzIG5vbi1lbXB0eSwgYSBwcm9taXNlIHRoYXQgd2lsbCBzZXR0bGVcblx0XHQgKiB0byB0aGUgc2FtZSBvdXRjb21lIGFzIHRoZSBlYXJsaWVzdCBpbnB1dCBwcm9taXNlIHRvIHNldHRsZS4gaWYgZW1wdHlcblx0XHQgKiBpcyBlbXB0eSwgcmV0dXJucyBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyIHNldHRsZS5cblx0XHQgKi9cblx0XHRmdW5jdGlvbiByYWNlKHByb21pc2VzKSB7XG5cdFx0XHRpZih0eXBlb2YgcHJvbWlzZXMgIT09ICdvYmplY3QnIHx8IHByb21pc2VzID09PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiByZWplY3QobmV3IFR5cGVFcnJvcignbm9uLWl0ZXJhYmxlIHBhc3NlZCB0byByYWNlKCknKSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNpZ2gsIHJhY2UoW10pIGlzIHVudGVzdGFibGUgdW5sZXNzIHdlIHJldHVybiAqc29tZXRoaW5nKlxuXHRcdFx0Ly8gdGhhdCBpcyByZWNvZ25pemFibGUgd2l0aG91dCBjYWxsaW5nIC50aGVuKCkgb24gaXQuXG5cdFx0XHRyZXR1cm4gcHJvbWlzZXMubGVuZ3RoID09PSAwID8gbmV2ZXIoKVxuXHRcdFx0XHQgOiBwcm9taXNlcy5sZW5ndGggPT09IDEgPyByZXNvbHZlKHByb21pc2VzWzBdKVxuXHRcdFx0XHQgOiBydW5SYWNlKHByb21pc2VzKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBydW5SYWNlKHByb21pc2VzKSB7XG5cdFx0XHR2YXIgcmVzb2x2ZXIgPSBuZXcgUGVuZGluZygpO1xuXHRcdFx0dmFyIGksIHgsIGg7XG5cdFx0XHRmb3IoaT0wOyBpPHByb21pc2VzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdHggPSBwcm9taXNlc1tpXTtcblx0XHRcdFx0aWYgKHggPT09IHZvaWQgMCAmJiAhKGkgaW4gcHJvbWlzZXMpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRoID0gZ2V0SGFuZGxlcih4KTtcblx0XHRcdFx0aWYoaC5zdGF0ZSgpICE9PSAwKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZXIuYmVjb21lKGgpO1xuXHRcdFx0XHRcdHZpc2l0UmVtYWluaW5nKHByb21pc2VzLCBpKzEsIGgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGgudmlzaXQocmVzb2x2ZXIsIHJlc29sdmVyLnJlc29sdmUsIHJlc29sdmVyLnJlamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShIYW5kbGVyLCByZXNvbHZlcik7XG5cdFx0fVxuXG5cdFx0Ly8gUHJvbWlzZSBpbnRlcm5hbHNcblx0XHQvLyBCZWxvdyB0aGlzLCBldmVyeXRoaW5nIGlzIEBwcml2YXRlXG5cblx0XHQvKipcblx0XHQgKiBHZXQgYW4gYXBwcm9wcmlhdGUgaGFuZGxlciBmb3IgeCwgd2l0aG91dCBjaGVja2luZyBmb3IgY3ljbGVzXG5cdFx0ICogQHBhcmFtIHsqfSB4XG5cdFx0ICogQHJldHVybnMge29iamVjdH0gaGFuZGxlclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGdldEhhbmRsZXIoeCkge1xuXHRcdFx0aWYoaXNQcm9taXNlKHgpKSB7XG5cdFx0XHRcdHJldHVybiB4Ll9oYW5kbGVyLmpvaW4oKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXliZVRoZW5hYmxlKHgpID8gZ2V0SGFuZGxlclVudHJ1c3RlZCh4KSA6IG5ldyBGdWxmaWxsZWQoeCk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogR2V0IGEgaGFuZGxlciBmb3IgdGhlbmFibGUgeC5cblx0XHQgKiBOT1RFOiBZb3UgbXVzdCBvbmx5IGNhbGwgdGhpcyBpZiBtYXliZVRoZW5hYmxlKHgpID09IHRydWVcblx0XHQgKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbnxQcm9taXNlfSB4XG5cdFx0ICogQHJldHVybnMge29iamVjdH0gaGFuZGxlclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGdldEhhbmRsZXJNYXliZVRoZW5hYmxlKHgpIHtcblx0XHRcdHJldHVybiBpc1Byb21pc2UoeCkgPyB4Ll9oYW5kbGVyLmpvaW4oKSA6IGdldEhhbmRsZXJVbnRydXN0ZWQoeCk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogR2V0IGEgaGFuZGxlciBmb3IgcG90ZW50aWFsbHkgdW50cnVzdGVkIHRoZW5hYmxlIHhcblx0XHQgKiBAcGFyYW0geyp9IHhcblx0XHQgKiBAcmV0dXJucyB7b2JqZWN0fSBoYW5kbGVyXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZ2V0SGFuZGxlclVudHJ1c3RlZCh4KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR2YXIgdW50cnVzdGVkVGhlbiA9IHgudGhlbjtcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiB1bnRydXN0ZWRUaGVuID09PSAnZnVuY3Rpb24nXG5cdFx0XHRcdFx0PyBuZXcgVGhlbmFibGUodW50cnVzdGVkVGhlbiwgeClcblx0XHRcdFx0XHQ6IG5ldyBGdWxmaWxsZWQoeCk7XG5cdFx0XHR9IGNhdGNoKGUpIHtcblx0XHRcdFx0cmV0dXJuIG5ldyBSZWplY3RlZChlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBIYW5kbGVyIGZvciBhIHByb21pc2UgdGhhdCBpcyBwZW5kaW5nIGZvcmV2ZXJcblx0XHQgKiBAY29uc3RydWN0b3Jcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBIYW5kbGVyKCkge31cblxuXHRcdEhhbmRsZXIucHJvdG90eXBlLndoZW5cblx0XHRcdD0gSGFuZGxlci5wcm90b3R5cGUuYmVjb21lXG5cdFx0XHQ9IEhhbmRsZXIucHJvdG90eXBlLm5vdGlmeSAvLyBkZXByZWNhdGVkXG5cdFx0XHQ9IEhhbmRsZXIucHJvdG90eXBlLmZhaWxcblx0XHRcdD0gSGFuZGxlci5wcm90b3R5cGUuX3VucmVwb3J0XG5cdFx0XHQ9IEhhbmRsZXIucHJvdG90eXBlLl9yZXBvcnRcblx0XHRcdD0gbm9vcDtcblxuXHRcdEhhbmRsZXIucHJvdG90eXBlLl9zdGF0ZSA9IDA7XG5cblx0XHRIYW5kbGVyLnByb3RvdHlwZS5zdGF0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3N0YXRlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBSZWN1cnNpdmVseSBjb2xsYXBzZSBoYW5kbGVyIGNoYWluIHRvIGZpbmQgdGhlIGhhbmRsZXJcblx0XHQgKiBuZWFyZXN0IHRvIHRoZSBmdWxseSByZXNvbHZlZCB2YWx1ZS5cblx0XHQgKiBAcmV0dXJucyB7b2JqZWN0fSBoYW5kbGVyIG5lYXJlc3QgdGhlIGZ1bGx5IHJlc29sdmVkIHZhbHVlXG5cdFx0ICovXG5cdFx0SGFuZGxlci5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGggPSB0aGlzO1xuXHRcdFx0d2hpbGUoaC5oYW5kbGVyICE9PSB2b2lkIDApIHtcblx0XHRcdFx0aCA9IGguaGFuZGxlcjtcblx0XHRcdH1cblx0XHRcdHJldHVybiBoO1xuXHRcdH07XG5cblx0XHRIYW5kbGVyLnByb3RvdHlwZS5jaGFpbiA9IGZ1bmN0aW9uKHRvLCByZWNlaXZlciwgZnVsZmlsbGVkLCByZWplY3RlZCwgcHJvZ3Jlc3MpIHtcblx0XHRcdHRoaXMud2hlbih7XG5cdFx0XHRcdHJlc29sdmVyOiB0byxcblx0XHRcdFx0cmVjZWl2ZXI6IHJlY2VpdmVyLFxuXHRcdFx0XHRmdWxmaWxsZWQ6IGZ1bGZpbGxlZCxcblx0XHRcdFx0cmVqZWN0ZWQ6IHJlamVjdGVkLFxuXHRcdFx0XHRwcm9ncmVzczogcHJvZ3Jlc3Ncblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRIYW5kbGVyLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uKHJlY2VpdmVyLCBmdWxmaWxsZWQsIHJlamVjdGVkLCBwcm9ncmVzcykge1xuXHRcdFx0dGhpcy5jaGFpbihmYWlsSWZSZWplY3RlZCwgcmVjZWl2ZXIsIGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIHByb2dyZXNzKTtcblx0XHR9O1xuXG5cdFx0SGFuZGxlci5wcm90b3R5cGUuZm9sZCA9IGZ1bmN0aW9uKGYsIHosIGMsIHRvKSB7XG5cdFx0XHR0aGlzLndoZW4obmV3IEZvbGQoZiwgeiwgYywgdG8pKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogSGFuZGxlciB0aGF0IGludm9rZXMgZmFpbCgpIG9uIGFueSBoYW5kbGVyIGl0IGJlY29tZXNcblx0XHQgKiBAY29uc3RydWN0b3Jcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBGYWlsSWZSZWplY3RlZCgpIHt9XG5cblx0XHRpbmhlcml0KEhhbmRsZXIsIEZhaWxJZlJlamVjdGVkKTtcblxuXHRcdEZhaWxJZlJlamVjdGVkLnByb3RvdHlwZS5iZWNvbWUgPSBmdW5jdGlvbihoKSB7XG5cdFx0XHRoLmZhaWwoKTtcblx0XHR9O1xuXG5cdFx0dmFyIGZhaWxJZlJlamVjdGVkID0gbmV3IEZhaWxJZlJlamVjdGVkKCk7XG5cblx0XHQvKipcblx0XHQgKiBIYW5kbGVyIHRoYXQgbWFuYWdlcyBhIHF1ZXVlIG9mIGNvbnN1bWVycyB3YWl0aW5nIG9uIGEgcGVuZGluZyBwcm9taXNlXG5cdFx0ICogQGNvbnN0cnVjdG9yXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gUGVuZGluZyhyZWNlaXZlciwgaW5oZXJpdGVkQ29udGV4dCkge1xuXHRcdFx0UHJvbWlzZS5jcmVhdGVDb250ZXh0KHRoaXMsIGluaGVyaXRlZENvbnRleHQpO1xuXG5cdFx0XHR0aGlzLmNvbnN1bWVycyA9IHZvaWQgMDtcblx0XHRcdHRoaXMucmVjZWl2ZXIgPSByZWNlaXZlcjtcblx0XHRcdHRoaXMuaGFuZGxlciA9IHZvaWQgMDtcblx0XHRcdHRoaXMucmVzb2x2ZWQgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpbmhlcml0KEhhbmRsZXIsIFBlbmRpbmcpO1xuXG5cdFx0UGVuZGluZy5wcm90b3R5cGUuX3N0YXRlID0gMDtcblxuXHRcdFBlbmRpbmcucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbih4KSB7XG5cdFx0XHR0aGlzLmJlY29tZShnZXRIYW5kbGVyKHgpKTtcblx0XHR9O1xuXG5cdFx0UGVuZGluZy5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24oeCkge1xuXHRcdFx0aWYodGhpcy5yZXNvbHZlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYmVjb21lKG5ldyBSZWplY3RlZCh4KSk7XG5cdFx0fTtcblxuXHRcdFBlbmRpbmcucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICghdGhpcy5yZXNvbHZlZCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblxuXHRcdFx0dmFyIGggPSB0aGlzO1xuXG5cdFx0XHR3aGlsZSAoaC5oYW5kbGVyICE9PSB2b2lkIDApIHtcblx0XHRcdFx0aCA9IGguaGFuZGxlcjtcblx0XHRcdFx0aWYgKGggPT09IHRoaXMpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5oYW5kbGVyID0gY3ljbGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gaDtcblx0XHR9O1xuXG5cdFx0UGVuZGluZy5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgcSA9IHRoaXMuY29uc3VtZXJzO1xuXHRcdFx0dmFyIGhhbmRsZXIgPSB0aGlzLmhhbmRsZXI7XG5cdFx0XHR0aGlzLmhhbmRsZXIgPSB0aGlzLmhhbmRsZXIuam9pbigpO1xuXHRcdFx0dGhpcy5jb25zdW1lcnMgPSB2b2lkIDA7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcS5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHRoYW5kbGVyLndoZW4ocVtpXSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdFBlbmRpbmcucHJvdG90eXBlLmJlY29tZSA9IGZ1bmN0aW9uKGhhbmRsZXIpIHtcblx0XHRcdGlmKHRoaXMucmVzb2x2ZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnJlc29sdmVkID0gdHJ1ZTtcblx0XHRcdHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG5cdFx0XHRpZih0aGlzLmNvbnN1bWVycyAhPT0gdm9pZCAwKSB7XG5cdFx0XHRcdHRhc2tzLmVucXVldWUodGhpcyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmKHRoaXMuY29udGV4dCAhPT0gdm9pZCAwKSB7XG5cdFx0XHRcdGhhbmRsZXIuX3JlcG9ydCh0aGlzLmNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRQZW5kaW5nLnByb3RvdHlwZS53aGVuID0gZnVuY3Rpb24oY29udGludWF0aW9uKSB7XG5cdFx0XHRpZih0aGlzLnJlc29sdmVkKSB7XG5cdFx0XHRcdHRhc2tzLmVucXVldWUobmV3IENvbnRpbnVhdGlvblRhc2soY29udGludWF0aW9uLCB0aGlzLmhhbmRsZXIpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKHRoaXMuY29uc3VtZXJzID09PSB2b2lkIDApIHtcblx0XHRcdFx0XHR0aGlzLmNvbnN1bWVycyA9IFtjb250aW51YXRpb25dO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuY29uc3VtZXJzLnB1c2goY29udGludWF0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAZGVwcmVjYXRlZFxuXHRcdCAqL1xuXHRcdFBlbmRpbmcucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uKHgpIHtcblx0XHRcdGlmKCF0aGlzLnJlc29sdmVkKSB7XG5cdFx0XHRcdHRhc2tzLmVucXVldWUobmV3IFByb2dyZXNzVGFzayh4LCB0aGlzKSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdFBlbmRpbmcucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbihjb250ZXh0KSB7XG5cdFx0XHR2YXIgYyA9IHR5cGVvZiBjb250ZXh0ID09PSAndW5kZWZpbmVkJyA/IHRoaXMuY29udGV4dCA6IGNvbnRleHQ7XG5cdFx0XHR0aGlzLnJlc29sdmVkICYmIHRoaXMuaGFuZGxlci5qb2luKCkuZmFpbChjKTtcblx0XHR9O1xuXG5cdFx0UGVuZGluZy5wcm90b3R5cGUuX3JlcG9ydCA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcblx0XHRcdHRoaXMucmVzb2x2ZWQgJiYgdGhpcy5oYW5kbGVyLmpvaW4oKS5fcmVwb3J0KGNvbnRleHQpO1xuXHRcdH07XG5cblx0XHRQZW5kaW5nLnByb3RvdHlwZS5fdW5yZXBvcnQgPSBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMucmVzb2x2ZWQgJiYgdGhpcy5oYW5kbGVyLmpvaW4oKS5fdW5yZXBvcnQoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogV3JhcCBhbm90aGVyIGhhbmRsZXIgYW5kIGZvcmNlIGl0IGludG8gYSBmdXR1cmUgc3RhY2tcblx0XHQgKiBAcGFyYW0ge29iamVjdH0gaGFuZGxlclxuXHRcdCAqIEBjb25zdHJ1Y3RvclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIEFzeW5jKGhhbmRsZXIpIHtcblx0XHRcdHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG5cdFx0fVxuXG5cdFx0aW5oZXJpdChIYW5kbGVyLCBBc3luYyk7XG5cblx0XHRBc3luYy5wcm90b3R5cGUud2hlbiA9IGZ1bmN0aW9uKGNvbnRpbnVhdGlvbikge1xuXHRcdFx0dGFza3MuZW5xdWV1ZShuZXcgQ29udGludWF0aW9uVGFzayhjb250aW51YXRpb24sIHRoaXMpKTtcblx0XHR9O1xuXG5cdFx0QXN5bmMucHJvdG90eXBlLl9yZXBvcnQgPSBmdW5jdGlvbihjb250ZXh0KSB7XG5cdFx0XHR0aGlzLmpvaW4oKS5fcmVwb3J0KGNvbnRleHQpO1xuXHRcdH07XG5cblx0XHRBc3luYy5wcm90b3R5cGUuX3VucmVwb3J0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmpvaW4oKS5fdW5yZXBvcnQoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogSGFuZGxlciB0aGF0IHdyYXBzIGFuIHVudHJ1c3RlZCB0aGVuYWJsZSBhbmQgYXNzaW1pbGF0ZXMgaXQgaW4gYSBmdXR1cmUgc3RhY2tcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSB0aGVuXG5cdFx0ICogQHBhcmFtIHt7dGhlbjogZnVuY3Rpb259fSB0aGVuYWJsZVxuXHRcdCAqIEBjb25zdHJ1Y3RvclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIFRoZW5hYmxlKHRoZW4sIHRoZW5hYmxlKSB7XG5cdFx0XHRQZW5kaW5nLmNhbGwodGhpcyk7XG5cdFx0XHR0YXNrcy5lbnF1ZXVlKG5ldyBBc3NpbWlsYXRlVGFzayh0aGVuLCB0aGVuYWJsZSwgdGhpcykpO1xuXHRcdH1cblxuXHRcdGluaGVyaXQoUGVuZGluZywgVGhlbmFibGUpO1xuXG5cdFx0LyoqXG5cdFx0ICogSGFuZGxlciBmb3IgYSBmdWxmaWxsZWQgcHJvbWlzZVxuXHRcdCAqIEBwYXJhbSB7Kn0geCBmdWxmaWxsbWVudCB2YWx1ZVxuXHRcdCAqIEBjb25zdHJ1Y3RvclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIEZ1bGZpbGxlZCh4KSB7XG5cdFx0XHRQcm9taXNlLmNyZWF0ZUNvbnRleHQodGhpcyk7XG5cdFx0XHR0aGlzLnZhbHVlID0geDtcblx0XHR9XG5cblx0XHRpbmhlcml0KEhhbmRsZXIsIEZ1bGZpbGxlZCk7XG5cblx0XHRGdWxmaWxsZWQucHJvdG90eXBlLl9zdGF0ZSA9IDE7XG5cblx0XHRGdWxmaWxsZWQucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbihmLCB6LCBjLCB0bykge1xuXHRcdFx0cnVuQ29udGludWF0aW9uMyhmLCB6LCB0aGlzLCBjLCB0byk7XG5cdFx0fTtcblxuXHRcdEZ1bGZpbGxlZC5wcm90b3R5cGUud2hlbiA9IGZ1bmN0aW9uKGNvbnQpIHtcblx0XHRcdHJ1bkNvbnRpbnVhdGlvbjEoY29udC5mdWxmaWxsZWQsIHRoaXMsIGNvbnQucmVjZWl2ZXIsIGNvbnQucmVzb2x2ZXIpO1xuXHRcdH07XG5cblx0XHR2YXIgZXJyb3JJZCA9IDA7XG5cblx0XHQvKipcblx0XHQgKiBIYW5kbGVyIGZvciBhIHJlamVjdGVkIHByb21pc2Vcblx0XHQgKiBAcGFyYW0geyp9IHggcmVqZWN0aW9uIHJlYXNvblxuXHRcdCAqIEBjb25zdHJ1Y3RvclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIFJlamVjdGVkKHgpIHtcblx0XHRcdFByb21pc2UuY3JlYXRlQ29udGV4dCh0aGlzKTtcblxuXHRcdFx0dGhpcy5pZCA9ICsrZXJyb3JJZDtcblx0XHRcdHRoaXMudmFsdWUgPSB4O1xuXHRcdFx0dGhpcy5oYW5kbGVkID0gZmFsc2U7XG5cdFx0XHR0aGlzLnJlcG9ydGVkID0gZmFsc2U7XG5cblx0XHRcdHRoaXMuX3JlcG9ydCgpO1xuXHRcdH1cblxuXHRcdGluaGVyaXQoSGFuZGxlciwgUmVqZWN0ZWQpO1xuXG5cdFx0UmVqZWN0ZWQucHJvdG90eXBlLl9zdGF0ZSA9IC0xO1xuXG5cdFx0UmVqZWN0ZWQucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbihmLCB6LCBjLCB0bykge1xuXHRcdFx0dG8uYmVjb21lKHRoaXMpO1xuXHRcdH07XG5cblx0XHRSZWplY3RlZC5wcm90b3R5cGUud2hlbiA9IGZ1bmN0aW9uKGNvbnQpIHtcblx0XHRcdGlmKHR5cGVvZiBjb250LnJlamVjdGVkID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHRoaXMuX3VucmVwb3J0KCk7XG5cdFx0XHR9XG5cdFx0XHRydW5Db250aW51YXRpb24xKGNvbnQucmVqZWN0ZWQsIHRoaXMsIGNvbnQucmVjZWl2ZXIsIGNvbnQucmVzb2x2ZXIpO1xuXHRcdH07XG5cblx0XHRSZWplY3RlZC5wcm90b3R5cGUuX3JlcG9ydCA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcblx0XHRcdHRhc2tzLmFmdGVyUXVldWUobmV3IFJlcG9ydFRhc2sodGhpcywgY29udGV4dCkpO1xuXHRcdH07XG5cblx0XHRSZWplY3RlZC5wcm90b3R5cGUuX3VucmVwb3J0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZih0aGlzLmhhbmRsZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5oYW5kbGVkID0gdHJ1ZTtcblx0XHRcdHRhc2tzLmFmdGVyUXVldWUobmV3IFVucmVwb3J0VGFzayh0aGlzKSk7XG5cdFx0fTtcblxuXHRcdFJlamVjdGVkLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24oY29udGV4dCkge1xuXHRcdFx0dGhpcy5yZXBvcnRlZCA9IHRydWU7XG5cdFx0XHRlbWl0UmVqZWN0aW9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCB0aGlzKTtcblx0XHRcdFByb21pc2Uub25GYXRhbFJlamVjdGlvbih0aGlzLCBjb250ZXh0ID09PSB2b2lkIDAgPyB0aGlzLmNvbnRleHQgOiBjb250ZXh0KTtcblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gUmVwb3J0VGFzayhyZWplY3Rpb24sIGNvbnRleHQpIHtcblx0XHRcdHRoaXMucmVqZWN0aW9uID0gcmVqZWN0aW9uO1xuXHRcdFx0dGhpcy5jb250ZXh0ID0gY29udGV4dDtcblx0XHR9XG5cblx0XHRSZXBvcnRUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmKCF0aGlzLnJlamVjdGlvbi5oYW5kbGVkICYmICF0aGlzLnJlamVjdGlvbi5yZXBvcnRlZCkge1xuXHRcdFx0XHR0aGlzLnJlamVjdGlvbi5yZXBvcnRlZCA9IHRydWU7XG5cdFx0XHRcdGVtaXRSZWplY3Rpb24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIHRoaXMucmVqZWN0aW9uKSB8fFxuXHRcdFx0XHRcdFByb21pc2Uub25Qb3RlbnRpYWxseVVuaGFuZGxlZFJlamVjdGlvbih0aGlzLnJlamVjdGlvbiwgdGhpcy5jb250ZXh0KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gVW5yZXBvcnRUYXNrKHJlamVjdGlvbikge1xuXHRcdFx0dGhpcy5yZWplY3Rpb24gPSByZWplY3Rpb247XG5cdFx0fVxuXG5cdFx0VW5yZXBvcnRUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmKHRoaXMucmVqZWN0aW9uLnJlcG9ydGVkKSB7XG5cdFx0XHRcdGVtaXRSZWplY3Rpb24oJ3JlamVjdGlvbkhhbmRsZWQnLCB0aGlzLnJlamVjdGlvbikgfHxcblx0XHRcdFx0XHRQcm9taXNlLm9uUG90ZW50aWFsbHlVbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVkKHRoaXMucmVqZWN0aW9uKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gVW5oYW5kbGVkIHJlamVjdGlvbiBob29rc1xuXHRcdC8vIEJ5IGRlZmF1bHQsIGV2ZXJ5dGhpbmcgaXMgYSBub29wXG5cblx0XHRQcm9taXNlLmNyZWF0ZUNvbnRleHRcblx0XHRcdD0gUHJvbWlzZS5lbnRlckNvbnRleHRcblx0XHRcdD0gUHJvbWlzZS5leGl0Q29udGV4dFxuXHRcdFx0PSBQcm9taXNlLm9uUG90ZW50aWFsbHlVbmhhbmRsZWRSZWplY3Rpb25cblx0XHRcdD0gUHJvbWlzZS5vblBvdGVudGlhbGx5VW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlZFxuXHRcdFx0PSBQcm9taXNlLm9uRmF0YWxSZWplY3Rpb25cblx0XHRcdD0gbm9vcDtcblxuXHRcdC8vIEVycm9ycyBhbmQgc2luZ2xldG9uc1xuXG5cdFx0dmFyIGZvcmV2ZXJQZW5kaW5nSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7XG5cdFx0dmFyIGZvcmV2ZXJQZW5kaW5nUHJvbWlzZSA9IG5ldyBQcm9taXNlKEhhbmRsZXIsIGZvcmV2ZXJQZW5kaW5nSGFuZGxlcik7XG5cblx0XHRmdW5jdGlvbiBjeWNsZSgpIHtcblx0XHRcdHJldHVybiBuZXcgUmVqZWN0ZWQobmV3IFR5cGVFcnJvcignUHJvbWlzZSBjeWNsZScpKTtcblx0XHR9XG5cblx0XHQvLyBUYXNrIHJ1bm5lcnNcblxuXHRcdC8qKlxuXHRcdCAqIFJ1biBhIHNpbmdsZSBjb25zdW1lclxuXHRcdCAqIEBjb25zdHJ1Y3RvclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIENvbnRpbnVhdGlvblRhc2soY29udGludWF0aW9uLCBoYW5kbGVyKSB7XG5cdFx0XHR0aGlzLmNvbnRpbnVhdGlvbiA9IGNvbnRpbnVhdGlvbjtcblx0XHRcdHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG5cdFx0fVxuXG5cdFx0Q29udGludWF0aW9uVGFzay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmhhbmRsZXIuam9pbigpLndoZW4odGhpcy5jb250aW51YXRpb24pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBSdW4gYSBxdWV1ZSBvZiBwcm9ncmVzcyBoYW5kbGVyc1xuXHRcdCAqIEBjb25zdHJ1Y3RvclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIFByb2dyZXNzVGFzayh2YWx1ZSwgaGFuZGxlcikge1xuXHRcdFx0dGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcblx0XHRcdHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0XHR9XG5cblx0XHRQcm9ncmVzc1Rhc2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHEgPSB0aGlzLmhhbmRsZXIuY29uc3VtZXJzO1xuXHRcdFx0aWYocSA9PT0gdm9pZCAwKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Zm9yICh2YXIgYywgaSA9IDA7IGkgPCBxLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdGMgPSBxW2ldO1xuXHRcdFx0XHRydW5Ob3RpZnkoYy5wcm9ncmVzcywgdGhpcy52YWx1ZSwgdGhpcy5oYW5kbGVyLCBjLnJlY2VpdmVyLCBjLnJlc29sdmVyKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQXNzaW1pbGF0ZSBhIHRoZW5hYmxlLCBzZW5kaW5nIGl0J3MgdmFsdWUgdG8gcmVzb2x2ZXJcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSB0aGVuXG5cdFx0ICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHRoZW5hYmxlXG5cdFx0ICogQHBhcmFtIHtvYmplY3R9IHJlc29sdmVyXG5cdFx0ICogQGNvbnN0cnVjdG9yXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gQXNzaW1pbGF0ZVRhc2sodGhlbiwgdGhlbmFibGUsIHJlc29sdmVyKSB7XG5cdFx0XHR0aGlzLl90aGVuID0gdGhlbjtcblx0XHRcdHRoaXMudGhlbmFibGUgPSB0aGVuYWJsZTtcblx0XHRcdHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjtcblx0XHR9XG5cblx0XHRBc3NpbWlsYXRlVGFzay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaCA9IHRoaXMucmVzb2x2ZXI7XG5cdFx0XHR0cnlBc3NpbWlsYXRlKHRoaXMuX3RoZW4sIHRoaXMudGhlbmFibGUsIF9yZXNvbHZlLCBfcmVqZWN0LCBfbm90aWZ5KTtcblxuXHRcdFx0ZnVuY3Rpb24gX3Jlc29sdmUoeCkgeyBoLnJlc29sdmUoeCk7IH1cblx0XHRcdGZ1bmN0aW9uIF9yZWplY3QoeCkgIHsgaC5yZWplY3QoeCk7IH1cblx0XHRcdGZ1bmN0aW9uIF9ub3RpZnkoeCkgIHsgaC5ub3RpZnkoeCk7IH1cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gdHJ5QXNzaW1pbGF0ZSh0aGVuLCB0aGVuYWJsZSwgcmVzb2x2ZSwgcmVqZWN0LCBub3RpZnkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoZW4uY2FsbCh0aGVuYWJsZSwgcmVzb2x2ZSwgcmVqZWN0LCBub3RpZnkpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZWplY3QoZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogRm9sZCBhIGhhbmRsZXIgdmFsdWUgd2l0aCB6XG5cdFx0ICogQGNvbnN0cnVjdG9yXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gRm9sZChmLCB6LCBjLCB0bykge1xuXHRcdFx0dGhpcy5mID0gZjsgdGhpcy56ID0gejsgdGhpcy5jID0gYzsgdGhpcy50byA9IHRvO1xuXHRcdFx0dGhpcy5yZXNvbHZlciA9IGZhaWxJZlJlamVjdGVkO1xuXHRcdFx0dGhpcy5yZWNlaXZlciA9IHRoaXM7XG5cdFx0fVxuXG5cdFx0Rm9sZC5wcm90b3R5cGUuZnVsZmlsbGVkID0gZnVuY3Rpb24oeCkge1xuXHRcdFx0dGhpcy5mLmNhbGwodGhpcy5jLCB0aGlzLnosIHgsIHRoaXMudG8pO1xuXHRcdH07XG5cblx0XHRGb2xkLnByb3RvdHlwZS5yZWplY3RlZCA9IGZ1bmN0aW9uKHgpIHtcblx0XHRcdHRoaXMudG8ucmVqZWN0KHgpO1xuXHRcdH07XG5cblx0XHRGb2xkLnByb3RvdHlwZS5wcm9ncmVzcyA9IGZ1bmN0aW9uKHgpIHtcblx0XHRcdHRoaXMudG8ubm90aWZ5KHgpO1xuXHRcdH07XG5cblx0XHQvLyBPdGhlciBoZWxwZXJzXG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0geyp9IHhcblx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZmYgeCBpcyBhIHRydXN0ZWQgUHJvbWlzZVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGlzUHJvbWlzZSh4KSB7XG5cdFx0XHRyZXR1cm4geCBpbnN0YW5jZW9mIFByb21pc2U7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogVGVzdCBqdXN0IGVub3VnaCB0byBydWxlIG91dCBwcmltaXRpdmVzLCBpbiBvcmRlciB0byB0YWtlIGZhc3RlclxuXHRcdCAqIHBhdGhzIGluIHNvbWUgY29kZVxuXHRcdCAqIEBwYXJhbSB7Kn0geFxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufSBmYWxzZSBpZmYgeCBpcyBndWFyYW50ZWVkICpub3QqIHRvIGJlIGEgdGhlbmFibGVcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBtYXliZVRoZW5hYmxlKHgpIHtcblx0XHRcdHJldHVybiAodHlwZW9mIHggPT09ICdvYmplY3QnIHx8IHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nKSAmJiB4ICE9PSBudWxsO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHJ1bkNvbnRpbnVhdGlvbjEoZiwgaCwgcmVjZWl2ZXIsIG5leHQpIHtcblx0XHRcdGlmKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHJldHVybiBuZXh0LmJlY29tZShoKTtcblx0XHRcdH1cblxuXHRcdFx0UHJvbWlzZS5lbnRlckNvbnRleHQoaCk7XG5cdFx0XHR0cnlDYXRjaFJlamVjdChmLCBoLnZhbHVlLCByZWNlaXZlciwgbmV4dCk7XG5cdFx0XHRQcm9taXNlLmV4aXRDb250ZXh0KCk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcnVuQ29udGludWF0aW9uMyhmLCB4LCBoLCByZWNlaXZlciwgbmV4dCkge1xuXHRcdFx0aWYodHlwZW9mIGYgIT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0cmV0dXJuIG5leHQuYmVjb21lKGgpO1xuXHRcdFx0fVxuXG5cdFx0XHRQcm9taXNlLmVudGVyQ29udGV4dChoKTtcblx0XHRcdHRyeUNhdGNoUmVqZWN0MyhmLCB4LCBoLnZhbHVlLCByZWNlaXZlciwgbmV4dCk7XG5cdFx0XHRQcm9taXNlLmV4aXRDb250ZXh0KCk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQGRlcHJlY2F0ZWRcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBydW5Ob3RpZnkoZiwgeCwgaCwgcmVjZWl2ZXIsIG5leHQpIHtcblx0XHRcdGlmKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHJldHVybiBuZXh0Lm5vdGlmeSh4KTtcblx0XHRcdH1cblxuXHRcdFx0UHJvbWlzZS5lbnRlckNvbnRleHQoaCk7XG5cdFx0XHR0cnlDYXRjaFJldHVybihmLCB4LCByZWNlaXZlciwgbmV4dCk7XG5cdFx0XHRQcm9taXNlLmV4aXRDb250ZXh0KCk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gdHJ5Q2F0Y2gyKGYsIGEsIGIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJldHVybiBmKGEsIGIpO1xuXHRcdFx0fSBjYXRjaChlKSB7XG5cdFx0XHRcdHJldHVybiByZWplY3QoZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJuIGYuY2FsbCh0aGlzQXJnLCB4KSwgb3IgaWYgaXQgdGhyb3dzIHJldHVybiBhIHJlamVjdGVkIHByb21pc2UgZm9yXG5cdFx0ICogdGhlIHRocm93biBleGNlcHRpb25cblx0XHQgKi9cblx0XHRmdW5jdGlvbiB0cnlDYXRjaFJlamVjdChmLCB4LCB0aGlzQXJnLCBuZXh0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRuZXh0LmJlY29tZShnZXRIYW5kbGVyKGYuY2FsbCh0aGlzQXJnLCB4KSkpO1xuXHRcdFx0fSBjYXRjaChlKSB7XG5cdFx0XHRcdG5leHQuYmVjb21lKG5ldyBSZWplY3RlZChlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogU2FtZSBhcyBhYm92ZSwgYnV0IGluY2x1ZGVzIHRoZSBleHRyYSBhcmd1bWVudCBwYXJhbWV0ZXIuXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gdHJ5Q2F0Y2hSZWplY3QzKGYsIHgsIHksIHRoaXNBcmcsIG5leHQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGYuY2FsbCh0aGlzQXJnLCB4LCB5LCBuZXh0KTtcblx0XHRcdH0gY2F0Y2goZSkge1xuXHRcdFx0XHRuZXh0LmJlY29tZShuZXcgUmVqZWN0ZWQoZSkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBkZXByZWNhdGVkXG5cdFx0ICogUmV0dXJuIGYuY2FsbCh0aGlzQXJnLCB4KSwgb3IgaWYgaXQgdGhyb3dzLCAqcmV0dXJuKiB0aGUgZXhjZXB0aW9uXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gdHJ5Q2F0Y2hSZXR1cm4oZiwgeCwgdGhpc0FyZywgbmV4dCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0bmV4dC5ub3RpZnkoZi5jYWxsKHRoaXNBcmcsIHgpKTtcblx0XHRcdH0gY2F0Y2goZSkge1xuXHRcdFx0XHRuZXh0Lm5vdGlmeShlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBpbmhlcml0KFBhcmVudCwgQ2hpbGQpIHtcblx0XHRcdENoaWxkLnByb3RvdHlwZSA9IG9iamVjdENyZWF0ZShQYXJlbnQucHJvdG90eXBlKTtcblx0XHRcdENoaWxkLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENoaWxkO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNuZCh4LCB5KSB7XG5cdFx0XHRyZXR1cm4geTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBub29wKCkge31cblxuXHRcdGZ1bmN0aW9uIGhhc0N1c3RvbUV2ZW50KCkge1xuXHRcdFx0aWYodHlwZW9mIEN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dmFyIGV2ID0gbmV3IEN1c3RvbUV2ZW50KCd1bmhhbmRsZWRSZWplY3Rpb24nKTtcblx0XHRcdFx0XHRyZXR1cm4gZXYgaW5zdGFuY2VvZiBDdXN0b21FdmVudDtcblx0XHRcdFx0fSBjYXRjaCAoaWdub3JlZEV4Y2VwdGlvbikge31cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBoYXNJbnRlcm5ldEV4cGxvcmVyQ3VzdG9tRXZlbnQoKSB7XG5cdFx0XHRpZih0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIFRyeSB0byBjcmVhdGUgb25lIGV2ZW50IHRvIG1ha2Ugc3VyZSBpdCdzIHN1cHBvcnRlZFxuXHRcdFx0XHRcdHZhciBldiA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuXHRcdFx0XHRcdGV2LmluaXRDdXN0b21FdmVudCgnZXZlbnRUeXBlJywgZmFsc2UsIHRydWUsIHt9KTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSBjYXRjaCAoaWdub3JlZEV4Y2VwdGlvbikge31cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBpbml0RW1pdFJlamVjdGlvbigpIHtcblx0XHRcdC8qZ2xvYmFsIHByb2Nlc3MsIHNlbGYsIEN1c3RvbUV2ZW50Ki9cblx0XHRcdGlmKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzICE9PSBudWxsXG5cdFx0XHRcdCYmIHR5cGVvZiBwcm9jZXNzLmVtaXQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0Ly8gUmV0dXJuaW5nIGZhbHN5IGhlcmUgbWVhbnMgdG8gY2FsbCB0aGUgZGVmYXVsdFxuXHRcdFx0XHQvLyBvblBvdGVudGlhbGx5VW5oYW5kbGVkUmVqZWN0aW9uIEFQSS4gIFRoaXMgaXMgc2FmZSBldmVuIGluXG5cdFx0XHRcdC8vIGJyb3dzZXJpZnkgc2luY2UgcHJvY2Vzcy5lbWl0IGFsd2F5cyByZXR1cm5zIGZhbHN5IGluIGJyb3dzZXJpZnk6XG5cdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWZ1bmN0em9tYmllL25vZGUtcHJvY2Vzcy9ibG9iL21hc3Rlci9icm93c2VyLmpzI0w0MC1MNDZcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKHR5cGUsIHJlamVjdGlvbikge1xuXHRcdFx0XHRcdHJldHVybiB0eXBlID09PSAndW5oYW5kbGVkUmVqZWN0aW9uJ1xuXHRcdFx0XHRcdFx0PyBwcm9jZXNzLmVtaXQodHlwZSwgcmVqZWN0aW9uLnZhbHVlLCByZWplY3Rpb24pXG5cdFx0XHRcdFx0XHQ6IHByb2Nlc3MuZW1pdCh0eXBlLCByZWplY3Rpb24pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBoYXNDdXN0b21FdmVudCgpKSB7XG5cdFx0XHRcdHJldHVybiAoZnVuY3Rpb24gKHNlbGYsIEN1c3RvbUV2ZW50KSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICh0eXBlLCByZWplY3Rpb24pIHtcblx0XHRcdFx0XHRcdHZhciBldiA9IG5ldyBDdXN0b21FdmVudCh0eXBlLCB7XG5cdFx0XHRcdFx0XHRcdGRldGFpbDoge1xuXHRcdFx0XHRcdFx0XHRcdHJlYXNvbjogcmVqZWN0aW9uLnZhbHVlLFxuXHRcdFx0XHRcdFx0XHRcdGtleTogcmVqZWN0aW9uXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGJ1YmJsZXM6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRjYW5jZWxhYmxlOiB0cnVlXG5cdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuICFzZWxmLmRpc3BhdGNoRXZlbnQoZXYpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0oc2VsZiwgQ3VzdG9tRXZlbnQpKTtcblx0XHRcdH0gZWxzZSBpZih0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgaGFzSW50ZXJuZXRFeHBsb3JlckN1c3RvbUV2ZW50KCkpIHtcblx0XHRcdFx0cmV0dXJuIChmdW5jdGlvbihzZWxmLCBkb2N1bWVudCkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbih0eXBlLCByZWplY3Rpb24pIHtcblx0XHRcdFx0XHRcdHZhciBldiA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuXHRcdFx0XHRcdFx0ZXYuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGZhbHNlLCB0cnVlLCB7XG5cdFx0XHRcdFx0XHRcdHJlYXNvbjogcmVqZWN0aW9uLnZhbHVlLFxuXHRcdFx0XHRcdFx0XHRrZXk6IHJlamVjdGlvblxuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdHJldHVybiAhc2VsZi5kaXNwYXRjaEV2ZW50KGV2KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9KHNlbGYsIGRvY3VtZW50KSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBub29wO1xuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlO1xuXHR9O1xufSk7XG59KHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZSA6IGZ1bmN0aW9uKGZhY3RvcnkpIHsgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7IH0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL21ha2VQcm9taXNlLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy93aGVuL2xpYi9tYWtlUHJvbWlzZS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTQgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxuKGZ1bmN0aW9uKGRlZmluZSkgeyAndXNlIHN0cmljdCc7XG5kZWZpbmUoZnVuY3Rpb24oKSB7XG5cblx0cmV0dXJuIHtcblx0XHRwZW5kaW5nOiB0b1BlbmRpbmdTdGF0ZSxcblx0XHRmdWxmaWxsZWQ6IHRvRnVsZmlsbGVkU3RhdGUsXG5cdFx0cmVqZWN0ZWQ6IHRvUmVqZWN0ZWRTdGF0ZSxcblx0XHRpbnNwZWN0OiBpbnNwZWN0XG5cdH07XG5cblx0ZnVuY3Rpb24gdG9QZW5kaW5nU3RhdGUoKSB7XG5cdFx0cmV0dXJuIHsgc3RhdGU6ICdwZW5kaW5nJyB9O1xuXHR9XG5cblx0ZnVuY3Rpb24gdG9SZWplY3RlZFN0YXRlKGUpIHtcblx0XHRyZXR1cm4geyBzdGF0ZTogJ3JlamVjdGVkJywgcmVhc29uOiBlIH07XG5cdH1cblxuXHRmdW5jdGlvbiB0b0Z1bGZpbGxlZFN0YXRlKHgpIHtcblx0XHRyZXR1cm4geyBzdGF0ZTogJ2Z1bGZpbGxlZCcsIHZhbHVlOiB4IH07XG5cdH1cblxuXHRmdW5jdGlvbiBpbnNwZWN0KGhhbmRsZXIpIHtcblx0XHR2YXIgc3RhdGUgPSBoYW5kbGVyLnN0YXRlKCk7XG5cdFx0cmV0dXJuIHN0YXRlID09PSAwID8gdG9QZW5kaW5nU3RhdGUoKVxuXHRcdFx0IDogc3RhdGUgPiAwICAgPyB0b0Z1bGZpbGxlZFN0YXRlKGhhbmRsZXIudmFsdWUpXG5cdFx0XHQgICAgICAgICAgICAgICA6IHRvUmVqZWN0ZWRTdGF0ZShoYW5kbGVyLnZhbHVlKTtcblx0fVxuXG59KTtcbn0odHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lIDogZnVuY3Rpb24oZmFjdG9yeSkgeyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsgfSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvd2hlbi9saWIvc3RhdGUuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3doZW4vbGliL3N0YXRlLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNCBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuXG4vKipcbiAqIFByb21pc2VzL0ErIGFuZCB3aGVuKCkgaW1wbGVtZW50YXRpb25cbiAqIHdoZW4gaXMgcGFydCBvZiB0aGUgY3Vqb0pTIGZhbWlseSBvZiBsaWJyYXJpZXMgKGh0dHA6Ly9jdWpvanMuY29tLylcbiAqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXJcbiAqIEBhdXRob3IgSm9obiBIYW5uXG4gKi9cbihmdW5jdGlvbihkZWZpbmUpIHsgJ3VzZSBzdHJpY3QnO1xuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlKSB7XG5cblx0dmFyIHRpbWVkID0gcmVxdWlyZSgnLi9saWIvZGVjb3JhdG9ycy90aW1lZCcpO1xuXHR2YXIgYXJyYXkgPSByZXF1aXJlKCcuL2xpYi9kZWNvcmF0b3JzL2FycmF5Jyk7XG5cdHZhciBmbG93ID0gcmVxdWlyZSgnLi9saWIvZGVjb3JhdG9ycy9mbG93Jyk7XG5cdHZhciBmb2xkID0gcmVxdWlyZSgnLi9saWIvZGVjb3JhdG9ycy9mb2xkJyk7XG5cdHZhciBpbnNwZWN0ID0gcmVxdWlyZSgnLi9saWIvZGVjb3JhdG9ycy9pbnNwZWN0Jyk7XG5cdHZhciBnZW5lcmF0ZSA9IHJlcXVpcmUoJy4vbGliL2RlY29yYXRvcnMvaXRlcmF0ZScpO1xuXHR2YXIgcHJvZ3Jlc3MgPSByZXF1aXJlKCcuL2xpYi9kZWNvcmF0b3JzL3Byb2dyZXNzJyk7XG5cdHZhciB3aXRoVGhpcyA9IHJlcXVpcmUoJy4vbGliL2RlY29yYXRvcnMvd2l0aCcpO1xuXHR2YXIgdW5oYW5kbGVkUmVqZWN0aW9uID0gcmVxdWlyZSgnLi9saWIvZGVjb3JhdG9ycy91bmhhbmRsZWRSZWplY3Rpb24nKTtcblx0dmFyIFRpbWVvdXRFcnJvciA9IHJlcXVpcmUoJy4vbGliL1RpbWVvdXRFcnJvcicpO1xuXG5cdHZhciBQcm9taXNlID0gW2FycmF5LCBmbG93LCBmb2xkLCBnZW5lcmF0ZSwgcHJvZ3Jlc3MsXG5cdFx0aW5zcGVjdCwgd2l0aFRoaXMsIHRpbWVkLCB1bmhhbmRsZWRSZWplY3Rpb25dXG5cdFx0LnJlZHVjZShmdW5jdGlvbihQcm9taXNlLCBmZWF0dXJlKSB7XG5cdFx0XHRyZXR1cm4gZmVhdHVyZShQcm9taXNlKTtcblx0XHR9LCByZXF1aXJlKCcuL2xpYi9Qcm9taXNlJykpO1xuXG5cdHZhciBhcHBseSA9IHJlcXVpcmUoJy4vbGliL2FwcGx5JykoUHJvbWlzZSk7XG5cblx0Ly8gUHVibGljIEFQSVxuXG5cdHdoZW4ucHJvbWlzZSAgICAgPSBwcm9taXNlOyAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcGVuZGluZyBwcm9taXNlXG5cdHdoZW4ucmVzb2x2ZSAgICAgPSBQcm9taXNlLnJlc29sdmU7ICAgICAgLy8gQ3JlYXRlIGEgcmVzb2x2ZWQgcHJvbWlzZVxuXHR3aGVuLnJlamVjdCAgICAgID0gUHJvbWlzZS5yZWplY3Q7ICAgICAgIC8vIENyZWF0ZSBhIHJlamVjdGVkIHByb21pc2VcblxuXHR3aGVuLmxpZnQgICAgICAgID0gbGlmdDsgICAgICAgICAgICAgICAgIC8vIGxpZnQgYSBmdW5jdGlvbiB0byByZXR1cm4gcHJvbWlzZXNcblx0d2hlblsndHJ5J10gICAgICA9IGF0dGVtcHQ7ICAgICAgICAgICAgICAvLyBjYWxsIGEgZnVuY3Rpb24gYW5kIHJldHVybiBhIHByb21pc2Vcblx0d2hlbi5hdHRlbXB0ICAgICA9IGF0dGVtcHQ7ICAgICAgICAgICAgICAvLyBhbGlhcyBmb3Igd2hlbi50cnlcblxuXHR3aGVuLml0ZXJhdGUgICAgID0gUHJvbWlzZS5pdGVyYXRlOyAgICAgIC8vIERFUFJFQ0FURUQgKHVzZSBjdWpvanMvbW9zdCBzdHJlYW1zKSBHZW5lcmF0ZSBhIHN0cmVhbSBvZiBwcm9taXNlc1xuXHR3aGVuLnVuZm9sZCAgICAgID0gUHJvbWlzZS51bmZvbGQ7ICAgICAgIC8vIERFUFJFQ0FURUQgKHVzZSBjdWpvanMvbW9zdCBzdHJlYW1zKSBHZW5lcmF0ZSBhIHN0cmVhbSBvZiBwcm9taXNlc1xuXG5cdHdoZW4uam9pbiAgICAgICAgPSBqb2luOyAgICAgICAgICAgICAgICAgLy8gSm9pbiAyIG9yIG1vcmUgcHJvbWlzZXNcblxuXHR3aGVuLmFsbCAgICAgICAgID0gYWxsOyAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgYSBsaXN0IG9mIHByb21pc2VzXG5cdHdoZW4uc2V0dGxlICAgICAgPSBzZXR0bGU7ICAgICAgICAgICAgICAgLy8gU2V0dGxlIGEgbGlzdCBvZiBwcm9taXNlc1xuXG5cdHdoZW4uYW55ICAgICAgICAgPSBsaWZ0KFByb21pc2UuYW55KTsgICAgLy8gT25lLXdpbm5lciByYWNlXG5cdHdoZW4uc29tZSAgICAgICAgPSBsaWZ0KFByb21pc2Uuc29tZSk7ICAgLy8gTXVsdGktd2lubmVyIHJhY2Vcblx0d2hlbi5yYWNlICAgICAgICA9IGxpZnQoUHJvbWlzZS5yYWNlKTsgICAvLyBGaXJzdC10by1zZXR0bGUgcmFjZVxuXG5cdHdoZW4ubWFwICAgICAgICAgPSBtYXA7ICAgICAgICAgICAgICAgICAgLy8gQXJyYXkubWFwKCkgZm9yIHByb21pc2VzXG5cdHdoZW4uZmlsdGVyICAgICAgPSBmaWx0ZXI7ICAgICAgICAgICAgICAgLy8gQXJyYXkuZmlsdGVyKCkgZm9yIHByb21pc2VzXG5cdHdoZW4ucmVkdWNlICAgICAgPSBsaWZ0KFByb21pc2UucmVkdWNlKTsgICAgICAgLy8gQXJyYXkucmVkdWNlKCkgZm9yIHByb21pc2VzXG5cdHdoZW4ucmVkdWNlUmlnaHQgPSBsaWZ0KFByb21pc2UucmVkdWNlUmlnaHQpOyAgLy8gQXJyYXkucmVkdWNlUmlnaHQoKSBmb3IgcHJvbWlzZXNcblxuXHR3aGVuLmlzUHJvbWlzZUxpa2UgPSBpc1Byb21pc2VMaWtlOyAgICAgIC8vIElzIHNvbWV0aGluZyBwcm9taXNlLWxpa2UsIGFrYSB0aGVuYWJsZVxuXG5cdHdoZW4uUHJvbWlzZSAgICAgPSBQcm9taXNlOyAgICAgICAgICAgICAgLy8gUHJvbWlzZSBjb25zdHJ1Y3RvclxuXHR3aGVuLmRlZmVyICAgICAgID0gZGVmZXI7ICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHtwcm9taXNlLCByZXNvbHZlLCByZWplY3R9IHR1cGxlXG5cblx0Ly8gRXJyb3IgdHlwZXNcblxuXHR3aGVuLlRpbWVvdXRFcnJvciA9IFRpbWVvdXRFcnJvcjtcblxuXHQvKipcblx0ICogR2V0IGEgdHJ1c3RlZCBwcm9taXNlIGZvciB4LCBvciBieSB0cmFuc2Zvcm1pbmcgeCB3aXRoIG9uRnVsZmlsbGVkXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0geFxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uP30gb25GdWxmaWxsZWQgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4geCBpc1xuXHQgKiAgIHN1Y2Nlc3NmdWxseSBmdWxmaWxsZWQuICBJZiBwcm9taXNlT3JWYWx1ZSBpcyBhbiBpbW1lZGlhdGUgdmFsdWUsIGNhbGxiYWNrXG5cdCAqICAgd2lsbCBiZSBpbnZva2VkIGltbWVkaWF0ZWx5LlxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uP30gb25SZWplY3RlZCBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB4IGlzXG5cdCAqICAgcmVqZWN0ZWQuXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24/fSBvblByb2dyZXNzIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHByb2dyZXNzIHVwZGF0ZXNcblx0ICogICBhcmUgaXNzdWVkIGZvciB4LiBAZGVwcmVjYXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBuZXcgcHJvbWlzZSB0aGF0IHdpbGwgZnVsZmlsbCB3aXRoIHRoZSByZXR1cm5cblx0ICogICB2YWx1ZSBvZiBjYWxsYmFjayBvciBlcnJiYWNrIG9yIHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHByb21pc2VPclZhbHVlIGlmXG5cdCAqICAgY2FsbGJhY2sgYW5kL29yIGVycmJhY2sgaXMgbm90IHN1cHBsaWVkLlxuXHQgKi9cblx0ZnVuY3Rpb24gd2hlbih4LCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgb25Qcm9ncmVzcykge1xuXHRcdHZhciBwID0gUHJvbWlzZS5yZXNvbHZlKHgpO1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdFx0cmV0dXJuIHA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHAudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgb25Qcm9ncmVzcyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlIHdob3NlIGZhdGUgaXMgZGV0ZXJtaW5lZCBieSByZXNvbHZlci5cblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZXIgZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0LCBub3RpZnkpXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHdob3NlIGZhdGUgaXMgZGV0ZXJtaW5lIGJ5IHJlc29sdmVyXG5cdCAqL1xuXHRmdW5jdGlvbiBwcm9taXNlKHJlc29sdmVyKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMaWZ0IHRoZSBzdXBwbGllZCBmdW5jdGlvbiwgY3JlYXRpbmcgYSB2ZXJzaW9uIG9mIGYgdGhhdCByZXR1cm5zXG5cdCAqIHByb21pc2VzLCBhbmQgYWNjZXB0cyBwcm9taXNlcyBhcyBhcmd1bWVudHMuXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb259IGZcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSB2ZXJzaW9uIG9mIGYgdGhhdCByZXR1cm5zIHByb21pc2VzXG5cdCAqL1xuXHRmdW5jdGlvbiBsaWZ0KGYpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRmb3IodmFyIGk9MCwgbD1hcmd1bWVudHMubGVuZ3RoLCBhPW5ldyBBcnJheShsKTsgaTxsOyArK2kpIHtcblx0XHRcdFx0YVtpXSA9IGFyZ3VtZW50c1tpXTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhcHBseShmLCB0aGlzLCBhKTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGwgZiBpbiBhIGZ1dHVyZSB0dXJuLCB3aXRoIHRoZSBzdXBwbGllZCBhcmdzLCBhbmQgcmV0dXJuIGEgcHJvbWlzZVxuXHQgKiBmb3IgdGhlIHJlc3VsdC5cblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gZlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICovXG5cdGZ1bmN0aW9uIGF0dGVtcHQoZiAvKiwgYXJncy4uLiAqLykge1xuXHRcdC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG5cdFx0Zm9yKHZhciBpPTAsIGw9YXJndW1lbnRzLmxlbmd0aC0xLCBhPW5ldyBBcnJheShsKTsgaTxsOyArK2kpIHtcblx0XHRcdGFbaV0gPSBhcmd1bWVudHNbaSsxXTtcblx0XHR9XG5cdFx0cmV0dXJuIGFwcGx5KGYsIHRoaXMsIGEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSB7cHJvbWlzZSwgcmVzb2x2ZXJ9IHBhaXIsIGVpdGhlciBvciBib3RoIG9mIHdoaWNoXG5cdCAqIG1heSBiZSBnaXZlbiBvdXQgc2FmZWx5IHRvIGNvbnN1bWVycy5cblx0ICogQHJldHVybiB7e3Byb21pc2U6IFByb21pc2UsIHJlc29sdmU6IGZ1bmN0aW9uLCByZWplY3Q6IGZ1bmN0aW9uLCBub3RpZnk6IGZ1bmN0aW9ufX1cblx0ICovXG5cdGZ1bmN0aW9uIGRlZmVyKCkge1xuXHRcdHJldHVybiBuZXcgRGVmZXJyZWQoKTtcblx0fVxuXG5cdGZ1bmN0aW9uIERlZmVycmVkKCkge1xuXHRcdHZhciBwID0gUHJvbWlzZS5fZGVmZXIoKTtcblxuXHRcdGZ1bmN0aW9uIHJlc29sdmUoeCkgeyBwLl9oYW5kbGVyLnJlc29sdmUoeCk7IH1cblx0XHRmdW5jdGlvbiByZWplY3QoeCkgeyBwLl9oYW5kbGVyLnJlamVjdCh4KTsgfVxuXHRcdGZ1bmN0aW9uIG5vdGlmeSh4KSB7IHAuX2hhbmRsZXIubm90aWZ5KHgpOyB9XG5cblx0XHR0aGlzLnByb21pc2UgPSBwO1xuXHRcdHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0dGhpcy5yZWplY3QgPSByZWplY3Q7XG5cdFx0dGhpcy5ub3RpZnkgPSBub3RpZnk7XG5cdFx0dGhpcy5yZXNvbHZlciA9IHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QsIG5vdGlmeTogbm90aWZ5IH07XG5cdH1cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyBpZiB4IGlzIHByb21pc2UtbGlrZSwgaS5lLiBhIHRoZW5hYmxlIG9iamVjdFxuXHQgKiBOT1RFOiBXaWxsIHJldHVybiB0cnVlIGZvciAqYW55IHRoZW5hYmxlIG9iamVjdCosIGFuZCBpc24ndCB0cnVseVxuXHQgKiBzYWZlLCBzaW5jZSBpdCBtYXkgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIGB0aGVuYCBwcm9wZXJ0eSBvZiB4IChpLmUuXG5cdCAqICBjbGV2ZXIvbWFsaWNpb3VzIGdldHRlcnMgbWF5IGRvIHdlaXJkIHRoaW5ncylcblx0ICogQHBhcmFtIHsqfSB4IGFueXRoaW5nXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHggaXMgcHJvbWlzZS1saWtlXG5cdCAqL1xuXHRmdW5jdGlvbiBpc1Byb21pc2VMaWtlKHgpIHtcblx0XHRyZXR1cm4geCAmJiB0eXBlb2YgeC50aGVuID09PSAnZnVuY3Rpb24nO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgb25seSBvbmNlIGFsbCB0aGUgc3VwcGxpZWQgYXJndW1lbnRzXG5cdCAqIGhhdmUgcmVzb2x2ZWQuIFRoZSByZXNvbHV0aW9uIHZhbHVlIG9mIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgYW4gYXJyYXlcblx0ICogY29udGFpbmluZyB0aGUgcmVzb2x1dGlvbiB2YWx1ZXMgb2YgZWFjaCBvZiB0aGUgYXJndW1lbnRzLlxuXHQgKiBAcGFyYW0gey4uLip9IGFyZ3VtZW50cyBtYXkgYmUgYSBtaXggb2YgcHJvbWlzZXMgYW5kIHZhbHVlc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICovXG5cdGZ1bmN0aW9uIGpvaW4oLyogLi4ucHJvbWlzZXMgKi8pIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYXJndW1lbnRzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm4gYSBwcm9taXNlIHRoYXQgd2lsbCBmdWxmaWxsIG9uY2UgYWxsIGlucHV0IHByb21pc2VzIGhhdmVcblx0ICogZnVsZmlsbGVkLCBvciByZWplY3Qgd2hlbiBhbnkgb25lIGlucHV0IHByb21pc2UgcmVqZWN0cy5cblx0ICogQHBhcmFtIHthcnJheXxQcm9taXNlfSBwcm9taXNlcyBhcnJheSAob3IgcHJvbWlzZSBmb3IgYW4gYXJyYXkpIG9mIHByb21pc2VzXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHQgKi9cblx0ZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG5cdFx0cmV0dXJuIHdoZW4ocHJvbWlzZXMsIFByb21pc2UuYWxsKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm4gYSBwcm9taXNlIHRoYXQgd2lsbCBhbHdheXMgZnVsZmlsbCB3aXRoIGFuIGFycmF5IGNvbnRhaW5pbmdcblx0ICogdGhlIG91dGNvbWUgc3RhdGVzIG9mIGFsbCBpbnB1dCBwcm9taXNlcy4gIFRoZSByZXR1cm5lZCBwcm9taXNlXG5cdCAqIHdpbGwgb25seSByZWplY3QgaWYgYHByb21pc2VzYCBpdHNlbGYgaXMgYSByZWplY3RlZCBwcm9taXNlLlxuXHQgKiBAcGFyYW0ge2FycmF5fFByb21pc2V9IHByb21pc2VzIGFycmF5IChvciBwcm9taXNlIGZvciBhbiBhcnJheSkgb2YgcHJvbWlzZXNcblx0ICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgZm9yIGFycmF5IG9mIHNldHRsZWQgc3RhdGUgZGVzY3JpcHRvcnNcblx0ICovXG5cdGZ1bmN0aW9uIHNldHRsZShwcm9taXNlcykge1xuXHRcdHJldHVybiB3aGVuKHByb21pc2VzLCBQcm9taXNlLnNldHRsZSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvbWlzZS1hd2FyZSBhcnJheSBtYXAgZnVuY3Rpb24sIHNpbWlsYXIgdG8gYEFycmF5LnByb3RvdHlwZS5tYXAoKWAsXG5cdCAqIGJ1dCBpbnB1dCBhcnJheSBtYXkgY29udGFpbiBwcm9taXNlcyBvciB2YWx1ZXMuXG5cdCAqIEBwYXJhbSB7QXJyYXl8UHJvbWlzZX0gcHJvbWlzZXMgYXJyYXkgb2YgYW55dGhpbmcsIG1heSBjb250YWluIHByb21pc2VzIGFuZCB2YWx1ZXNcblx0ICogQHBhcmFtIHtmdW5jdGlvbih4OiosIGluZGV4Ok51bWJlcik6Kn0gbWFwRnVuYyBtYXAgZnVuY3Rpb24gd2hpY2ggbWF5XG5cdCAqICByZXR1cm4gYSBwcm9taXNlIG9yIHZhbHVlXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgd2lsbCBmdWxmaWxsIHdpdGggYW4gYXJyYXkgb2YgbWFwcGVkIHZhbHVlc1xuXHQgKiAgb3IgcmVqZWN0IGlmIGFueSBpbnB1dCBwcm9taXNlIHJlamVjdHMuXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXAocHJvbWlzZXMsIG1hcEZ1bmMpIHtcblx0XHRyZXR1cm4gd2hlbihwcm9taXNlcywgZnVuY3Rpb24ocHJvbWlzZXMpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLm1hcChwcm9taXNlcywgbWFwRnVuYyk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRmlsdGVyIHRoZSBwcm92aWRlZCBhcnJheSBvZiBwcm9taXNlcyB1c2luZyB0aGUgcHJvdmlkZWQgcHJlZGljYXRlLiAgSW5wdXQgbWF5XG5cdCAqIGNvbnRhaW4gcHJvbWlzZXMgYW5kIHZhbHVlc1xuXHQgKiBAcGFyYW0ge0FycmF5fFByb21pc2V9IHByb21pc2VzIGFycmF5IG9mIHByb21pc2VzIGFuZCB2YWx1ZXNcblx0ICogQHBhcmFtIHtmdW5jdGlvbih4OiosIGluZGV4Ok51bWJlcik6Ym9vbGVhbn0gcHJlZGljYXRlIGZpbHRlcmluZyBwcmVkaWNhdGUuXG5cdCAqICBNdXN0IHJldHVybiB0cnV0aHkgKG9yIHByb21pc2UgZm9yIHRydXRoeSkgZm9yIGl0ZW1zIHRvIHJldGFpbi5cblx0ICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgdGhhdCB3aWxsIGZ1bGZpbGwgd2l0aCBhbiBhcnJheSBjb250YWluaW5nIGFsbCBpdGVtc1xuXHQgKiAgZm9yIHdoaWNoIHByZWRpY2F0ZSByZXR1cm5lZCB0cnV0aHkuXG5cdCAqL1xuXHRmdW5jdGlvbiBmaWx0ZXIocHJvbWlzZXMsIHByZWRpY2F0ZSkge1xuXHRcdHJldHVybiB3aGVuKHByb21pc2VzLCBmdW5jdGlvbihwcm9taXNlcykge1xuXHRcdFx0cmV0dXJuIFByb21pc2UuZmlsdGVyKHByb21pc2VzLCBwcmVkaWNhdGUpO1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIHdoZW47XG59KTtcbn0pKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZSA6IGZ1bmN0aW9uIChmYWN0b3J5KSB7IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKTsgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy93aGVuL3doZW4uanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3doZW4vd2hlbi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKlxuIEF1dG9iYWhuSlMgLSBodHRwOi8vYXV0b2JhaG4ud3NcblxuIENvcHlyaWdodCAoQykgMjAxMS0yMDE0IFRhdmVuZG8gR21iSC5cbiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gU2VlIGxpY2Vuc2UgdGV4dCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuXG4gQXV0b2JhaG5KUyBpbmNsdWRlcyBjb2RlIGZyb206XG5cbiB3aGVuIC0gaHR0cDovL2N1am9qcy5jb21cblxuIChjKSBjb3B5cmlnaHQgQiBDYXZhbGllciAmIEogSGFublxuIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSBhdDpcbiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuXG4gQ3J5cHRvLUpTIC0gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy9cblxuIChjKSAyMDA5LTIwMTIgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UgYXQ6XG4gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcblxuIGNvbnNvbGUtbm9ybWFsaXplciAtIGh0dHBzOi8vZ2l0aHViLmNvbS9aZW5vdmF0aW9ucy9jb25zb2xlLW5vcm1hbGl6ZXJcblxuIChjKSAyMDEyIGJ5IFplbm92YXRpb25zLlxuIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSBhdDpcbiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuXG4gKi9cbndpbmRvdy5kZWZpbmV8fCh3aW5kb3cuZGVmaW5lPWZ1bmN0aW9uKGMpe3RyeXtkZWxldGUgd2luZG93LmRlZmluZX1jYXRjaChnKXt3aW5kb3cuZGVmaW5lPXZvaWQgMH13aW5kb3cud2hlbj1jKCl9LHdpbmRvdy5kZWZpbmUuYW1kPXt9KTsoZnVuY3Rpb24oYyl7Y3x8KGM9d2luZG93LmNvbnNvbGU9e2xvZzpmdW5jdGlvbihjLGEsYixkLGgpe30saW5mbzpmdW5jdGlvbihjLGEsYixkLGgpe30sd2FybjpmdW5jdGlvbihjLGEsYixkLGgpe30sZXJyb3I6ZnVuY3Rpb24oYyxhLGIsZCxoKXt9fSk7RnVuY3Rpb24ucHJvdG90eXBlLmJpbmR8fChGdW5jdGlvbi5wcm90b3R5cGUuYmluZD1mdW5jdGlvbihjKXt2YXIgYT10aGlzLGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGMsQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShiLGFyZ3VtZW50cykpfX0pO1wib2JqZWN0XCI9PT10eXBlb2YgYy5sb2cmJihjLmxvZz1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbC5iaW5kKGMubG9nLGMpLGMuaW5mbz1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbC5iaW5kKGMuaW5mbyxjKSxjLndhcm49RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYmluZChjLndhcm4sYyksXG4gICAgYy5lcnJvcj1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbC5iaW5kKGMuZXJyb3IsYykpO1wiZ3JvdXBcImluIGN8fChjLmdyb3VwPWZ1bmN0aW9uKGcpe2MuaW5mbyhcIlxcbi0tLSBcIitnK1wiIC0tLVxcblwiKX0pO1wiZ3JvdXBFbmRcImluIGN8fChjLmdyb3VwRW5kPWZ1bmN0aW9uKCl7Yy5sb2coXCJcXG5cIil9KTtcInRpbWVcImluIGN8fGZ1bmN0aW9uKCl7dmFyIGc9e307Yy50aW1lPWZ1bmN0aW9uKGEpe2dbYV09KG5ldyBEYXRlKS5nZXRUaW1lKCl9O2MudGltZUVuZD1mdW5jdGlvbihhKXt2YXIgYj0obmV3IERhdGUpLmdldFRpbWUoKTtjLmluZm8oYStcIjogXCIrKGEgaW4gZz9iLWdbYV06MCkrXCJtc1wiKX19KCl9KSh3aW5kb3cuY29uc29sZSk7LypcbiBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTEtMjAxMyBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuKGZ1bmN0aW9uKGMpe2MoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZSxjKXtyZXR1cm4oYSBpbnN0YW5jZW9mIGQ/YTpoKGEpKS50aGVuKGIsZSxjKX1mdW5jdGlvbiBiKGEpe3JldHVybiBuZXcgZChhLEIuUHJvbWlzZVN0YXR1cyYmQi5Qcm9taXNlU3RhdHVzKCkpfWZ1bmN0aW9uIGQoYSxiKXtmdW5jdGlvbiBkKGEpe2lmKG0pe3ZhciBjPW07bT13O3AoZnVuY3Rpb24oKXtxPWUobCxhKTtiJiZBKHEsYik7ZihjLHEpfSl9fWZ1bmN0aW9uIGMoYSl7ZChuZXcgayhhKSl9ZnVuY3Rpb24gaChhKXtpZihtKXt2YXIgYj1tO3AoZnVuY3Rpb24oKXtmKGIsbmV3IHooYSkpfSl9fXZhciBsLHEsbT1bXTtsPXRoaXM7dGhpcy5fc3RhdHVzPWI7dGhpcy5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHE/cS5pbnNwZWN0KCk6e3N0YXRlOlwicGVuZGluZ1wifX07dGhpcy5fd2hlbj1mdW5jdGlvbihhLGIsZSxkLGMpe2Z1bmN0aW9uIGYoaCl7aC5fd2hlbihhLGIsZSxkLGMpfW0/bS5wdXNoKGYpOlxuICAgIHAoZnVuY3Rpb24oKXtmKHEpfSl9O3RyeXthKGQsYyxoKX1jYXRjaChuKXtjKG4pfX1mdW5jdGlvbiBoKGEpe3JldHVybiBiKGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXShiKX1mdW5jdGlvbiBlKGEsYil7aWYoYj09PWEpcmV0dXJuIG5ldyBrKG5ldyBUeXBlRXJyb3IpO2lmKGIgaW5zdGFuY2VvZiBkKXJldHVybiBiO3RyeXt2YXIgZT1iPT09T2JqZWN0KGIpJiZiLnRoZW47cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGU/bChlLGIpOm5ldyB0KGIpfWNhdGNoKGMpe3JldHVybiBuZXcgayhjKX19ZnVuY3Rpb24gbChhLGUpe3JldHVybiBiKGZ1bmN0aW9uKGIsZCl7RyhhLGUsYixkKX0pfWZ1bmN0aW9uIHQoYSl7dGhpcy52YWx1ZT1hfWZ1bmN0aW9uIGsoYSl7dGhpcy52YWx1ZT1hfWZ1bmN0aW9uIHooYSl7dGhpcy52YWx1ZT1hfWZ1bmN0aW9uIEEoYSxiKXthLnRoZW4oZnVuY3Rpb24oKXtiLmZ1bGZpbGxlZCgpfSxcbiAgICBmdW5jdGlvbihhKXtiLnJlamVjdGVkKGEpfSl9ZnVuY3Rpb24gcShhKXtyZXR1cm4gYSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGEudGhlbn1mdW5jdGlvbiBtKGUsZCxjLGYsaCl7cmV0dXJuIGEoZSxmdW5jdGlvbihlKXtyZXR1cm4gYihmdW5jdGlvbihiLGMsZil7ZnVuY3Rpb24gaChhKXtuKGEpfWZ1bmN0aW9uIEEoYSl7ayhhKX12YXIgbCxxLEQsbSxrLG4sdCxnO3Q9ZS5sZW5ndGg+Pj4wO2w9TWF0aC5tYXgoMCxNYXRoLm1pbihkLHQpKTtEPVtdO3E9dC1sKzE7bT1bXTtpZihsKXtuPWZ1bmN0aW9uKGEpe20ucHVzaChhKTstLXF8fChrPW49cyxjKG0pKX07az1mdW5jdGlvbihhKXtELnB1c2goYSk7LS1sfHwoaz1uPXMsYihEKSl9O2ZvcihnPTA7Zzx0OysrZylnIGluIGUmJmEoZVtnXSxBLGgsZil9ZWxzZSBiKEQpfSkudGhlbihjLGYsaCl9KX1mdW5jdGlvbiBuKGEsYixlLGQpe3JldHVybiB1KGEscykudGhlbihiLGUsZCl9ZnVuY3Rpb24gdShiLGUsYyl7cmV0dXJuIGEoYixmdW5jdGlvbihiKXtyZXR1cm4gbmV3IGQoZnVuY3Rpb24oZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsaCl7ZnVuY3Rpb24gQShiLHEpe2EoYixlLGMpLnRoZW4oZnVuY3Rpb24oYSl7bFtxXT1hOy0ta3x8ZChsKX0sZixoKX12YXIgbCxxLGssbTtrPXE9Yi5sZW5ndGg+Pj4wO2w9W107aWYoaylmb3IobT0wO208cTttKyspbSBpbiBiP0EoYlttXSxtKTotLWs7ZWxzZSBkKGwpfSl9KX1mdW5jdGlvbiB5KGEpe3JldHVybntzdGF0ZTpcImZ1bGZpbGxlZFwiLHZhbHVlOmF9fWZ1bmN0aW9uIHgoYSl7cmV0dXJue3N0YXRlOlwicmVqZWN0ZWRcIixyZWFzb246YX19ZnVuY3Rpb24gcChhKXsxPT09RS5wdXNoKGEpJiZDKHYpfWZ1bmN0aW9uIHYoKXtmKEUpO0U9W119ZnVuY3Rpb24gcyhhKXtyZXR1cm4gYX1mdW5jdGlvbiBLKGEpe1wiZnVuY3Rpb25cIj09PXR5cGVvZiBCLnJlcG9ydFVuaGFuZGxlZD9CLnJlcG9ydFVuaGFuZGxlZCgpOnAoZnVuY3Rpb24oKXt0aHJvdyBhO30pO3Rocm93IGE7fWEucHJvbWlzZT1iO2EucmVzb2x2ZT1oO2EucmVqZWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhKGIsZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBrKGEpfSl9O1xuICAgIGEuZGVmZXI9ZnVuY3Rpb24oKXt2YXIgYSxlLGQ7YT17cHJvbWlzZTp3LHJlc29sdmU6dyxyZWplY3Q6dyxub3RpZnk6dyxyZXNvbHZlcjp7cmVzb2x2ZTp3LHJlamVjdDp3LG5vdGlmeTp3fX07YS5wcm9taXNlPWU9YihmdW5jdGlvbihiLGMsZil7YS5yZXNvbHZlPWEucmVzb2x2ZXIucmVzb2x2ZT1mdW5jdGlvbihhKXtpZihkKXJldHVybiBoKGEpO2Q9ITA7YihhKTtyZXR1cm4gZX07YS5yZWplY3Q9YS5yZXNvbHZlci5yZWplY3Q9ZnVuY3Rpb24oYSl7aWYoZClyZXR1cm4gaChuZXcgayhhKSk7ZD0hMDtjKGEpO3JldHVybiBlfTthLm5vdGlmeT1hLnJlc29sdmVyLm5vdGlmeT1mdW5jdGlvbihhKXtmKGEpO3JldHVybiBhfX0pO3JldHVybiBhfTthLmpvaW49ZnVuY3Rpb24oKXtyZXR1cm4gdShhcmd1bWVudHMscyl9O2EuYWxsPW47YS5tYXA9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdShhLGIpfTthLnJlZHVjZT1mdW5jdGlvbihiLGUpe3ZhciBkPUcoSCxhcmd1bWVudHMsMSk7cmV0dXJuIGEoYixcbiAgICAgICAgZnVuY3Rpb24oYil7dmFyIGM7Yz1iLmxlbmd0aDtkWzBdPWZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gYShiLGZ1bmN0aW9uKGIpe3JldHVybiBhKGQsZnVuY3Rpb24oYSl7cmV0dXJuIGUoYixhLGYsYyl9KX0pfTtyZXR1cm4gSS5hcHBseShiLGQpfSl9O2Euc2V0dGxlPWZ1bmN0aW9uKGEpe3JldHVybiB1KGEseSx4KX07YS5hbnk9ZnVuY3Rpb24oYSxiLGUsZCl7cmV0dXJuIG0oYSwxLGZ1bmN0aW9uKGEpe3JldHVybiBiP2IoYVswXSk6YVswXX0sZSxkKX07YS5zb21lPW07YS5pc1Byb21pc2U9cTthLmlzUHJvbWlzZUxpa2U9cTtyPWQucHJvdG90eXBlO3IudGhlbj1mdW5jdGlvbihhLGIsZSl7dmFyIGM9dGhpcztyZXR1cm4gbmV3IGQoZnVuY3Rpb24oZCxmLGgpe2MuX3doZW4oZCxoLGEsYixlKX0sdGhpcy5fc3RhdHVzJiZ0aGlzLl9zdGF0dXMub2JzZXJ2ZWQoKSl9O3JbXCJjYXRjaFwiXT1yLm90aGVyd2lzZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKHcsYSl9O3JbXCJmaW5hbGx5XCJdPVxuICAgICAgICByLmVuc3VyZT1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIGgoYSgpKX1yZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYT90aGlzLnRoZW4oYixiKS55aWVsZCh0aGlzKTp0aGlzfTtyLmRvbmU9ZnVuY3Rpb24oYSxiKXt0aGlzLnRoZW4oYSxiKVtcImNhdGNoXCJdKEspfTtyLnlpZWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gYX0pfTtyLnRhcD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKGEpLnlpZWxkKHRoaXMpfTtyLnNwcmVhZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGIpe3JldHVybiBuKGIsZnVuY3Rpb24oYil7cmV0dXJuIGEuYXBwbHkodyxiKX0pfSl9O3IuYWx3YXlzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMudGhlbihhLGEsYil9O0Y9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe31iLnByb3RvdHlwZT1hO3JldHVybiBuZXcgYn07dC5wcm90b3R5cGU9RihyKTtcbiAgICB0LnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHkodGhpcy52YWx1ZSl9O3QucHJvdG90eXBlLl93aGVuPWZ1bmN0aW9uKGEsYixlKXt0cnl7YShcImZ1bmN0aW9uXCI9PT10eXBlb2YgZT9lKHRoaXMudmFsdWUpOnRoaXMudmFsdWUpfWNhdGNoKGQpe2EobmV3IGsoZCkpfX07ay5wcm90b3R5cGU9RihyKTtrLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHgodGhpcy52YWx1ZSl9O2sucHJvdG90eXBlLl93aGVuPWZ1bmN0aW9uKGEsYixlLGQpe3RyeXthKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkP2QodGhpcy52YWx1ZSk6dGhpcyl9Y2F0Y2goYyl7YShuZXcgayhjKSl9fTt6LnByb3RvdHlwZT1GKHIpO3oucHJvdG90eXBlLl93aGVuPWZ1bmN0aW9uKGEsYixlLGQsYyl7dHJ5e2IoXCJmdW5jdGlvblwiPT09dHlwZW9mIGM/Yyh0aGlzLnZhbHVlKTp0aGlzLnZhbHVlKX1jYXRjaChmKXtiKGYpfX07dmFyIHIsRixJLEgsRyxDLEUsQixKLHc7RT1bXTtCPVwidW5kZWZpbmVkXCIhPT1cbiAgICB0eXBlb2YgY29uc29sZT9jb25zb2xlOmE7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBwcm9jZXNzJiZwcm9jZXNzLm5leHRUaWNrKUM9cHJvY2Vzcy5uZXh0VGljaztlbHNlIGlmKHI9XCJmdW5jdGlvblwiPT09dHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXImJk11dGF0aW9uT2JzZXJ2ZXJ8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBXZWJLaXRNdXRhdGlvbk9ic2VydmVyJiZXZWJLaXRNdXRhdGlvbk9ic2VydmVyKUM9ZnVuY3Rpb24oYSxiLGUpe3ZhciBkPWEuY3JlYXRlRWxlbWVudChcImRpdlwiKTsobmV3IGIoZSkpLm9ic2VydmUoZCx7YXR0cmlidXRlczohMH0pO3JldHVybiBmdW5jdGlvbigpe2Quc2V0QXR0cmlidXRlKFwieFwiLFwieFwiKX19KGRvY3VtZW50LHIsdik7ZWxzZSB0cnl7Qz1jKFwidmVydHhcIikucnVuT25Mb29wfHxjKFwidmVydHhcIikucnVuT25Db250ZXh0fWNhdGNoKEwpe0o9c2V0VGltZW91dCxDPWZ1bmN0aW9uKGEpe0ooYSwwKX19Yz1GdW5jdGlvbi5wcm90b3R5cGU7cj1jLmNhbGw7Rz1jLmJpbmQ/XG4gICAgICAgIHIuYmluZChyKTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmFwcGx5KGIsSC5jYWxsKGFyZ3VtZW50cywyKSl9O2M9W107SD1jLnNsaWNlO0k9Yy5yZWR1Y2V8fGZ1bmN0aW9uKGEpe3ZhciBiLGUsZCxjLGY7Zj0wO2I9T2JqZWN0KHRoaXMpO2M9Yi5sZW5ndGg+Pj4wO2U9YXJndW1lbnRzO2lmKDE+PWUubGVuZ3RoKWZvcig7Oyl7aWYoZiBpbiBiKXtkPWJbZisrXTticmVha31pZigrK2Y+PWMpdGhyb3cgbmV3IFR5cGVFcnJvcjt9ZWxzZSBkPWVbMV07Zm9yKDtmPGM7KytmKWYgaW4gYiYmKGQ9YShkLGJbZl0sZixiKSk7cmV0dXJuIGR9O3JldHVybiBhfSl9KShcImZ1bmN0aW9uXCI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZTpmdW5jdGlvbihjKXttb2R1bGUuZXhwb3J0cz1jKHJlcXVpcmUpfSk7dmFyIENyeXB0b0pTPUNyeXB0b0pTfHxmdW5jdGlvbihjLGcpe3ZhciBhPXt9LGI9YS5saWI9e30sZD1iLkJhc2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7fXJldHVybntleHRlbmQ6ZnVuY3Rpb24oYil7YS5wcm90b3R5cGU9dGhpczt2YXIgZT1uZXcgYTtiJiZlLm1peEluKGIpO2UuaGFzT3duUHJvcGVydHkoXCJpbml0XCIpfHwoZS5pbml0PWZ1bmN0aW9uKCl7ZS4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KTtlLmluaXQucHJvdG90eXBlPWU7ZS4kc3VwZXI9dGhpcztyZXR1cm4gZX0sY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5leHRlbmQoKTthLmluaXQuYXBwbHkoYSxhcmd1bWVudHMpO3JldHVybiBhfSxpbml0OmZ1bmN0aW9uKCl7fSxtaXhJbjpmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYodGhpc1tiXT1hW2JdKTthLmhhc093blByb3BlcnR5KFwidG9TdHJpbmdcIikmJih0aGlzLnRvU3RyaW5nPWEudG9TdHJpbmcpfSxcbiAgICAgICAgY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0LnByb3RvdHlwZS5leHRlbmQodGhpcyl9fX0oKSxoPWIuV29yZEFycmF5PWQuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYil7YT10aGlzLndvcmRzPWF8fFtdO3RoaXMuc2lnQnl0ZXM9YiE9Zz9iOjQqYS5sZW5ndGh9LHRvU3RyaW5nOmZ1bmN0aW9uKGEpe3JldHVybihhfHxlKS5zdHJpbmdpZnkodGhpcyl9LGNvbmNhdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLndvcmRzLGU9YS53b3JkcyxkPXRoaXMuc2lnQnl0ZXM7YT1hLnNpZ0J5dGVzO3RoaXMuY2xhbXAoKTtpZihkJTQpZm9yKHZhciBjPTA7YzxhO2MrKyliW2QrYz4+PjJdfD0oZVtjPj4+Ml0+Pj4yNC04KihjJTQpJjI1NSk8PDI0LTgqKChkK2MpJTQpO2Vsc2UgaWYoNjU1MzU8ZS5sZW5ndGgpZm9yKGM9MDtjPGE7Yys9NCliW2QrYz4+PjJdPWVbYz4+PjJdO2Vsc2UgYi5wdXNoLmFwcGx5KGIsZSk7dGhpcy5zaWdCeXRlcys9YTtyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oKXt2YXIgYT1cbiAgICAgICAgdGhpcy53b3JkcyxiPXRoaXMuc2lnQnl0ZXM7YVtiPj4+Ml0mPTQyOTQ5NjcyOTU8PDMyLTgqKGIlNCk7YS5sZW5ndGg9Yy5jZWlsKGIvNCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGE9ZC5jbG9uZS5jYWxsKHRoaXMpO2Eud29yZHM9dGhpcy53b3Jkcy5zbGljZSgwKTtyZXR1cm4gYX0scmFuZG9tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxlPTA7ZTxhO2UrPTQpYi5wdXNoKDQyOTQ5NjcyOTYqYy5yYW5kb20oKXwwKTtyZXR1cm4gbmV3IGguaW5pdChiLGEpfX0pLGY9YS5lbmM9e30sZT1mLkhleD17c3RyaW5naWZ5OmZ1bmN0aW9uKGEpe3ZhciBiPWEud29yZHM7YT1hLnNpZ0J5dGVzO2Zvcih2YXIgZT1bXSxkPTA7ZDxhO2QrKyl7dmFyIGM9YltkPj4+Ml0+Pj4yNC04KihkJTQpJjI1NTtlLnB1c2goKGM+Pj40KS50b1N0cmluZygxNikpO2UucHVzaCgoYyYxNSkudG9TdHJpbmcoMTYpKX1yZXR1cm4gZS5qb2luKFwiXCIpfSxwYXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9YS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZT1bXSxkPTA7ZDxiO2QrPTIpZVtkPj4+M118PXBhcnNlSW50KGEuc3Vic3RyKGQsMiksMTYpPDwyNC00KihkJTgpO3JldHVybiBuZXcgaC5pbml0KGUsYi8yKX19LGw9Zi5MYXRpbjE9e3N0cmluZ2lmeTpmdW5jdGlvbihhKXt2YXIgYj1hLndvcmRzO2E9YS5zaWdCeXRlcztmb3IodmFyIGU9W10sZD0wO2Q8YTtkKyspZS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYltkPj4+Ml0+Pj4yNC04KihkJTQpJjI1NSkpO3JldHVybiBlLmpvaW4oXCJcIil9LHBhcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hLmxlbmd0aCxlPVtdLGQ9MDtkPGI7ZCsrKWVbZD4+PjJdfD0oYS5jaGFyQ29kZUF0KGQpJjI1NSk8PDI0LTgqKGQlNCk7cmV0dXJuIG5ldyBoLmluaXQoZSxiKX19LHQ9Zi5VdGY4PXtzdHJpbmdpZnk6ZnVuY3Rpb24oYSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGwuc3RyaW5naWZ5KGEpKSl9Y2F0Y2goYil7dGhyb3cgRXJyb3IoXCJNYWxmb3JtZWQgVVRGLTggZGF0YVwiKTtcbiAgICB9fSxwYXJzZTpmdW5jdGlvbihhKXtyZXR1cm4gbC5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYSkpKX19LGs9Yi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtPWQuZXh0ZW5kKHtyZXNldDpmdW5jdGlvbigpe3RoaXMuX2RhdGE9bmV3IGguaW5pdDt0aGlzLl9uRGF0YUJ5dGVzPTB9LF9hcHBlbmQ6ZnVuY3Rpb24oYSl7XCJzdHJpbmdcIj09dHlwZW9mIGEmJihhPXQucGFyc2UoYSkpO3RoaXMuX2RhdGEuY29uY2F0KGEpO3RoaXMuX25EYXRhQnl0ZXMrPWEuc2lnQnl0ZXN9LF9wcm9jZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2RhdGEsZT1iLndvcmRzLGQ9Yi5zaWdCeXRlcyxmPXRoaXMuYmxvY2tTaXplLGw9ZC8oNCpmKSxsPWE/Yy5jZWlsKGwpOmMubWF4KChsfDApLXRoaXMuX21pbkJ1ZmZlclNpemUsMCk7YT1sKmY7ZD1jLm1pbig0KmEsZCk7aWYoYSl7Zm9yKHZhciBrPTA7azxhO2srPWYpdGhpcy5fZG9Qcm9jZXNzQmxvY2soZSxrKTtrPWUuc3BsaWNlKDAsYSk7Yi5zaWdCeXRlcy09XG4gICAgICAgIGR9cmV0dXJuIG5ldyBoLmluaXQoayxkKX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYT1kLmNsb25lLmNhbGwodGhpcyk7YS5fZGF0YT10aGlzLl9kYXRhLmNsb25lKCk7cmV0dXJuIGF9LF9taW5CdWZmZXJTaXplOjB9KTtiLkhhc2hlcj1rLmV4dGVuZCh7Y2ZnOmQuZXh0ZW5kKCksaW5pdDpmdW5jdGlvbihhKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQoYSk7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe2sucmVzZXQuY2FsbCh0aGlzKTt0aGlzLl9kb1Jlc2V0KCl9LHVwZGF0ZTpmdW5jdGlvbihhKXt0aGlzLl9hcHBlbmQoYSk7dGhpcy5fcHJvY2VzcygpO3JldHVybiB0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbihhKXthJiZ0aGlzLl9hcHBlbmQoYSk7cmV0dXJuIHRoaXMuX2RvRmluYWxpemUoKX0sYmxvY2tTaXplOjE2LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsZSl7cmV0dXJuKG5ldyBhLmluaXQoZSkpLmZpbmFsaXplKGIpfX0sX2NyZWF0ZUhtYWNIZWxwZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpe3JldHVybihuZXcgei5ITUFDLmluaXQoYSxlKSkuZmluYWxpemUoYil9fX0pO3ZhciB6PWEuYWxnbz17fTtyZXR1cm4gYX0oTWF0aCk7KGZ1bmN0aW9uKCl7dmFyIGM9Q3J5cHRvSlMsZz1jLmxpYi5Xb3JkQXJyYXk7Yy5lbmMuQmFzZTY0PXtzdHJpbmdpZnk6ZnVuY3Rpb24oYSl7dmFyIGI9YS53b3JkcyxkPWEuc2lnQnl0ZXMsYz10aGlzLl9tYXA7YS5jbGFtcCgpO2E9W107Zm9yKHZhciBmPTA7ZjxkO2YrPTMpZm9yKHZhciBlPShiW2Y+Pj4yXT4+PjI0LTgqKGYlNCkmMjU1KTw8MTZ8KGJbZisxPj4+Ml0+Pj4yNC04KigoZisxKSU0KSYyNTUpPDw4fGJbZisyPj4+Ml0+Pj4yNC04KigoZisyKSU0KSYyNTUsbD0wOzQ+bCYmZiswLjc1Kmw8ZDtsKyspYS5wdXNoKGMuY2hhckF0KGU+Pj42KigzLWwpJjYzKSk7aWYoYj1jLmNoYXJBdCg2NCkpZm9yKDthLmxlbmd0aCU0OylhLnB1c2goYik7cmV0dXJuIGEuam9pbihcIlwiKX0scGFyc2U6ZnVuY3Rpb24oYSl7dmFyIGI9YS5sZW5ndGgsZD10aGlzLl9tYXAsYz1kLmNoYXJBdCg2NCk7YyYmKGM9YS5pbmRleE9mKGMpLC0xIT1jJiYoYj1jKSk7Zm9yKHZhciBjPVtdLGY9MCxlPTA7ZTxcbmI7ZSsrKWlmKGUlNCl7dmFyIGw9ZC5pbmRleE9mKGEuY2hhckF0KGUtMSkpPDwyKihlJTQpLHQ9ZC5pbmRleE9mKGEuY2hhckF0KGUpKT4+PjYtMiooZSU0KTtjW2Y+Pj4yXXw9KGx8dCk8PDI0LTgqKGYlNCk7ZisrfXJldHVybiBnLmNyZWF0ZShjLGYpfSxfbWFwOlwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIn19KSgpOyhmdW5jdGlvbigpe3ZhciBjPUNyeXB0b0pTLGc9Yy5lbmMuVXRmODtjLmFsZ28uSE1BQz1jLmxpYi5CYXNlLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihhLGIpe2E9dGhpcy5faGFzaGVyPW5ldyBhLmluaXQ7XCJzdHJpbmdcIj09dHlwZW9mIGImJihiPWcucGFyc2UoYikpO3ZhciBkPWEuYmxvY2tTaXplLGM9NCpkO2Iuc2lnQnl0ZXM+YyYmKGI9YS5maW5hbGl6ZShiKSk7Yi5jbGFtcCgpO2Zvcih2YXIgZj10aGlzLl9vS2V5PWIuY2xvbmUoKSxlPXRoaXMuX2lLZXk9Yi5jbG9uZSgpLGw9Zi53b3Jkcyx0PWUud29yZHMsaz0wO2s8ZDtrKyspbFtrXV49MTU0OTU1NjgyOCx0W2tdXj05MDk1MjI0ODY7Zi5zaWdCeXRlcz1lLnNpZ0J5dGVzPWM7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2hhc2hlcjthLnJlc2V0KCk7YS51cGRhdGUodGhpcy5faUtleSl9LHVwZGF0ZTpmdW5jdGlvbihhKXt0aGlzLl9oYXNoZXIudXBkYXRlKGEpO3JldHVybiB0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbihhKXt2YXIgYj1cbiAgICB0aGlzLl9oYXNoZXI7YT1iLmZpbmFsaXplKGEpO2IucmVzZXQoKTtyZXR1cm4gYi5maW5hbGl6ZSh0aGlzLl9vS2V5LmNsb25lKCkuY29uY2F0KGEpKX19KX0pKCk7KGZ1bmN0aW9uKGMpe3ZhciBnPUNyeXB0b0pTLGE9Zy5saWIsYj1hLldvcmRBcnJheSxkPWEuSGFzaGVyLGE9Zy5hbGdvLGg9W10sZj1bXTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2Zvcih2YXIgZT1jLnNxcnQoYiksZD0yO2Q8PWU7ZCsrKWlmKCEoYiVkKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBiKGEpe3JldHVybiA0Mjk0OTY3Mjk2KihhLShhfDApKXwwfWZvcih2YXIgZT0yLGQ9MDs2ND5kOylhKGUpJiYoOD5kJiYoaFtkXT1iKGMucG93KGUsMC41KSkpLGZbZF09YihjLnBvdyhlLDEvMykpLGQrKyksZSsrfSkoKTt2YXIgZT1bXSxhPWEuU0hBMjU2PWQuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IGIuaW5pdChoLnNsaWNlKDApKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPXRoaXMuX2hhc2gud29yZHMsYz1kWzBdLGg9ZFsxXSxnPWRbMl0sbT1kWzNdLG49ZFs0XSx1PWRbNV0seT1kWzZdLHg9ZFs3XSxwPVxuICAgIDA7NjQ+cDtwKyspe2lmKDE2PnApZVtwXT1hW2IrcF18MDtlbHNle3ZhciB2PWVbcC0xNV0scz1lW3AtMl07ZVtwXT0oKHY8PDI1fHY+Pj43KV4odjw8MTR8dj4+PjE4KV52Pj4+MykrZVtwLTddKygoczw8MTV8cz4+PjE3KV4oczw8MTN8cz4+PjE5KV5zPj4+MTApK2VbcC0xNl19dj14Kygobjw8MjZ8bj4+PjYpXihuPDwyMXxuPj4+MTEpXihuPDw3fG4+Pj4yNSkpKyhuJnVefm4meSkrZltwXStlW3BdO3M9KChjPDwzMHxjPj4+MileKGM8PDE5fGM+Pj4xMyleKGM8PDEwfGM+Pj4yMikpKyhjJmheYyZnXmgmZyk7eD15O3k9dTt1PW47bj1tK3Z8MDttPWc7Zz1oO2g9YztjPXYrc3wwfWRbMF09ZFswXStjfDA7ZFsxXT1kWzFdK2h8MDtkWzJdPWRbMl0rZ3wwO2RbM109ZFszXSttfDA7ZFs0XT1kWzRdK258MDtkWzVdPWRbNV0rdXwwO2RbNl09ZFs2XSt5fDA7ZFs3XT1kWzddK3h8MH0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9kYXRhLGI9YS53b3JkcyxkPTgqdGhpcy5fbkRhdGFCeXRlcyxcbiAgICBlPTgqYS5zaWdCeXRlcztiW2U+Pj41XXw9MTI4PDwyNC1lJTMyO2JbKGUrNjQ+Pj45PDw0KSsxNF09Yy5mbG9vcihkLzQyOTQ5NjcyOTYpO2JbKGUrNjQ+Pj45PDw0KSsxNV09ZDthLnNpZ0J5dGVzPTQqYi5sZW5ndGg7dGhpcy5fcHJvY2VzcygpO3JldHVybiB0aGlzLl9oYXNofSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPWQuY2xvbmUuY2FsbCh0aGlzKTthLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKTtyZXR1cm4gYX19KTtnLlNIQTI1Nj1kLl9jcmVhdGVIZWxwZXIoYSk7Zy5IbWFjU0hBMjU2PWQuX2NyZWF0ZUhtYWNIZWxwZXIoYSl9KShNYXRoKTsoZnVuY3Rpb24oKXt2YXIgYz1DcnlwdG9KUyxnPWMubGliLGE9Zy5CYXNlLGI9Zy5Xb3JkQXJyYXksZz1jLmFsZ28sZD1nLkhNQUMsaD1nLlBCS0RGMj1hLmV4dGVuZCh7Y2ZnOmEuZXh0ZW5kKHtrZXlTaXplOjQsaGFzaGVyOmcuU0hBMSxpdGVyYXRpb25zOjF9KSxpbml0OmZ1bmN0aW9uKGEpe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZChhKX0sY29tcHV0ZTpmdW5jdGlvbihhLGUpe2Zvcih2YXIgYz10aGlzLmNmZyxoPWQuY3JlYXRlKGMuaGFzaGVyLGEpLGc9Yi5jcmVhdGUoKSx6PWIuY3JlYXRlKFsxXSksQT1nLndvcmRzLHE9ei53b3JkcyxtPWMua2V5U2l6ZSxjPWMuaXRlcmF0aW9ucztBLmxlbmd0aDxtOyl7dmFyIG49aC51cGRhdGUoZSkuZmluYWxpemUoeik7aC5yZXNldCgpO2Zvcih2YXIgdT1uLndvcmRzLHk9dS5sZW5ndGgseD1uLHA9MTtwPGM7cCsrKXt4PWguZmluYWxpemUoeCk7aC5yZXNldCgpO2Zvcih2YXIgdj14LndvcmRzLHM9MDtzPHk7cysrKXVbc11ePXZbc119Zy5jb25jYXQobik7XG4gICAgcVswXSsrfWcuc2lnQnl0ZXM9NCptO3JldHVybiBnfX0pO2MuUEJLREYyPWZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gaC5jcmVhdGUoZCkuY29tcHV0ZShhLGIpfX0pKCk7LypcbiBNSVQgTGljZW5zZSAoYykgMjAxMS0yMDEzIENvcHlyaWdodCBUYXZlbmRvIEdtYkguICovXG52YXIgQVVUT0JBSE5KU19WRVJTSU9OPVwiMC44LjJcIixnbG9iYWw9dGhpcztcbihmdW5jdGlvbihjLGcpe1wiZnVuY3Rpb25cIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcIndoZW5cIl0sZnVuY3Rpb24oYSl7cmV0dXJuIGMuYWI9ZyhjLGEpfSk6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBleHBvcnRzP1widW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYoZXhwb3J0cz1tb2R1bGUuZXhwb3J0cz1nKGMsYy53aGVuKSk6Yy5hYj1nKGMsYy53aGVuKX0pKGdsb2JhbCxmdW5jdGlvbihjLGcpe3ZhciBhPXtfdmVyc2lvbjpBVVRPQkFITkpTX1ZFUlNJT059OyhmdW5jdGlvbigpe0FycmF5LnByb3RvdHlwZS5pbmRleE9mfHwoQXJyYXkucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oYSl7aWYobnVsbD09PXRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgZD1PYmplY3QodGhpcyksYz1kLmxlbmd0aD4+PjA7aWYoMD09PWMpcmV0dXJuLTE7dmFyIGY9MDswPGFyZ3VtZW50cy5sZW5ndGgmJihmPU51bWJlcihhcmd1bWVudHNbMV0pLFxuICAgIGYhPT1mP2Y9MDowIT09ZiYmKEluZmluaXR5IT09ZiYmLUluZmluaXR5IT09ZikmJihmPSgwPGZ8fC0xKSpNYXRoLmZsb29yKE1hdGguYWJzKGYpKSkpO2lmKGY+PWMpcmV0dXJuLTE7Zm9yKGY9MDw9Zj9mOk1hdGgubWF4KGMtTWF0aC5hYnMoZiksMCk7ZjxjO2YrKylpZihmIGluIGQmJmRbZl09PT1hKXJldHVybiBmO3JldHVybi0xfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2h8fChBcnJheS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihhLGQpe3ZhciBjLGY7aWYobnVsbD09PXRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcihcIiB0aGlzIGlzIG51bGwgb3Igbm90IGRlZmluZWRcIik7dmFyIGU9T2JqZWN0KHRoaXMpLGw9ZS5sZW5ndGg+Pj4wO2lmKFwiW29iamVjdCBGdW5jdGlvbl1cIiE9PXt9LnRvU3RyaW5nLmNhbGwoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcihhK1wiIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO2QmJihjPWQpO2ZvcihmPTA7ZjxsOyl7dmFyIGc7ZiBpbiBlJiYoZz1lW2ZdLGEuY2FsbChjLFxuICAgIGcsZixlKSk7ZisrfX0pfSkoKTthLl9zbGljZVVzZXJBZ2VudD1mdW5jdGlvbihhLGQsYyl7dmFyIGY9W10sZT1uYXZpZ2F0b3IudXNlckFnZW50O2E9ZS5pbmRleE9mKGEpO2Q9ZS5pbmRleE9mKGQsYSk7MD5kJiYoZD1lLmxlbmd0aCk7Yz1lLnNsaWNlKGEsZCkuc3BsaXQoYyk7ZT1jWzFdLnNwbGl0KFwiLlwiKTtmb3IoZD0wO2Q8ZS5sZW5ndGg7KytkKWYucHVzaChwYXJzZUludChlW2RdLDEwKSk7cmV0dXJue25hbWU6Y1swXSx2ZXJzaW9uOmZ9fTthLmdldEJyb3dzZXI9ZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50O3JldHVybi0xPGIuaW5kZXhPZihcIkNocm9tZVwiKT9hLl9zbGljZVVzZXJBZ2VudChcIkNocm9tZVwiLFwiIFwiLFwiL1wiKTotMTxiLmluZGV4T2YoXCJTYWZhcmlcIik/YS5fc2xpY2VVc2VyQWdlbnQoXCJTYWZhcmlcIixcIiBcIixcIi9cIik6LTE8Yi5pbmRleE9mKFwiRmlyZWZveFwiKT9hLl9zbGljZVVzZXJBZ2VudChcIkZpcmVmb3hcIixcIiBcIixcIi9cIik6LTE8Yi5pbmRleE9mKFwiTVNJRVwiKT9cbiAgICBhLl9zbGljZVVzZXJBZ2VudChcIk1TSUVcIixcIjtcIixcIiBcIik6bnVsbH07YS5nZXRTZXJ2ZXJVcmw9ZnVuY3Rpb24oYSxkKXtyZXR1cm5cImZpbGU6XCI9PT1jLmxvY2F0aW9uLnByb3RvY29sP2Q/ZDpcIndzOi8vMTI3LjAuMC4xL3dzXCI6KFwiaHR0cHM6XCI9PT1jLmxvY2F0aW9uLnByb3RvY29sP1wid3NzOi8vXCI6XCJ3czovL1wiKStjLmxvY2F0aW9uLmhvc3RuYW1lKyhcIlwiIT09Yy5sb2NhdGlvbi5wb3J0P1wiOlwiK2MubG9jYXRpb24ucG9ydDpcIlwiKStcIi9cIisoYT9hOlwid3NcIil9O2EuYnJvd3Nlck5vdFN1cHBvcnRlZE1lc3NhZ2U9XCJCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgV2ViU29ja2V0cyAoUkZDNjQ1NSlcIjthLmRlcml2ZUtleT1mdW5jdGlvbihhLGQpe3JldHVybiBkJiZkLnNhbHQ/Q3J5cHRvSlMuUEJLREYyKGEsZC5zYWx0LHtrZXlTaXplOihkLmtleWxlbnx8MzIpLzQsaXRlcmF0aW9uczpkLml0ZXJhdGlvbnN8fDFFNCxoYXNoZXI6Q3J5cHRvSlMuYWxnby5TSEEyNTZ9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuQmFzZTY0KTpcbiAgICBhfTthLl9pZGNoYXJzPVwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjthLl9pZGxlbj0xNjthLl9zdWJwcm90b2NvbD1cIndhbXBcIjthLl9uZXdpZD1mdW5jdGlvbigpe2Zvcih2YXIgYj1cIlwiLGQ9MDtkPGEuX2lkbGVuO2QrPTEpYis9YS5faWRjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEuX2lkY2hhcnMubGVuZ3RoKSk7cmV0dXJuIGJ9O2EuX25ld2lkRmFzdD1mdW5jdGlvbigpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KX07YS5sb2c9ZnVuY3Rpb24oKXtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe2NvbnNvbGUuZ3JvdXAoXCJMb2cgSXRlbVwiKTtmb3IodmFyIGE9MDthPGFyZ3VtZW50cy5sZW5ndGg7YSs9MSljb25zb2xlLmxvZyhhcmd1bWVudHNbYV0pO2NvbnNvbGUuZ3JvdXBFbmQoKX1lbHNlIGNvbnNvbGUubG9nKGFyZ3VtZW50c1swXSl9O2EuX2RlYnVncnBjPSExO2EuX2RlYnVncHVic3ViPVxuICAgICExO2EuX2RlYnVnd3M9ITE7YS5fZGVidWdjb25uZWN0PSExO2EuZGVidWc9ZnVuY3Rpb24oYixkLGgpe2lmKFwiY29uc29sZVwiaW4gYylhLl9kZWJ1Z3JwYz1iLGEuX2RlYnVncHVic3ViPWIsYS5fZGVidWd3cz1kLGEuX2RlYnVnY29ubmVjdD1oO2Vsc2UgdGhyb3dcImJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBjb25zb2xlIG9iamVjdFwiO307YS52ZXJzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGEuX3ZlcnNpb259O2EuUHJlZml4TWFwPWZ1bmN0aW9uKCl7dGhpcy5faW5kZXg9e307dGhpcy5fcmluZGV4PXt9fTthLlByZWZpeE1hcC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9pbmRleFthXX07YS5QcmVmaXhNYXAucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGQpe3RoaXMuX2luZGV4W2FdPWQ7dGhpcy5fcmluZGV4W2RdPWF9O2EuUHJlZml4TWFwLnByb3RvdHlwZS5zZXREZWZhdWx0PWZ1bmN0aW9uKGEpe3RoaXMuX2luZGV4W1wiXCJdPWE7dGhpcy5fcmluZGV4W2FdPVxuICAgIFwiXCJ9O2EuUHJlZml4TWFwLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5faW5kZXhbYV07ZCYmKGRlbGV0ZSB0aGlzLl9pbmRleFthXSxkZWxldGUgdGhpcy5fcmluZGV4W2RdKX07YS5QcmVmaXhNYXAucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24oYSxkKXt2YXIgYz1hLmluZGV4T2YoXCI6XCIpO2lmKDA8PWMpe3ZhciBmPWEuc3Vic3RyaW5nKDAsYyk7aWYodGhpcy5faW5kZXhbZl0pcmV0dXJuIHRoaXMuX2luZGV4W2ZdK2Euc3Vic3RyaW5nKGMrMSl9cmV0dXJuITA9PT1kP2E6bnVsbH07YS5QcmVmaXhNYXAucHJvdG90eXBlLnNocmluaz1mdW5jdGlvbihhLGQpe2Zvcih2YXIgYz1hLmxlbmd0aDswPGM7Yy09MSl7dmFyIGY9YS5zdWJzdHJpbmcoMCxjKTtpZihmPXRoaXMuX3JpbmRleFtmXSlyZXR1cm4gZitcIjpcIithLnN1YnN0cmluZyhjKX1yZXR1cm4hMD09PWQ/YTpudWxsfTthLl9NRVNTQUdFX1RZUEVJRF9XRUxDT01FPTA7YS5fTUVTU0FHRV9UWVBFSURfUFJFRklYPVxuICAgIDE7YS5fTUVTU0FHRV9UWVBFSURfQ0FMTD0yO2EuX01FU1NBR0VfVFlQRUlEX0NBTExfUkVTVUxUPTM7YS5fTUVTU0FHRV9UWVBFSURfQ0FMTF9FUlJPUj00O2EuX01FU1NBR0VfVFlQRUlEX1NVQlNDUklCRT01O2EuX01FU1NBR0VfVFlQRUlEX1VOU1VCU0NSSUJFPTY7YS5fTUVTU0FHRV9UWVBFSURfUFVCTElTSD03O2EuX01FU1NBR0VfVFlQRUlEX0VWRU5UPTg7YS5DT05ORUNUSU9OX0NMT1NFRD0wO2EuQ09OTkVDVElPTl9MT1NUPTE7YS5DT05ORUNUSU9OX1JFVFJJRVNfRVhDRUVERUQ9MjthLkNPTk5FQ1RJT05fVU5SRUFDSEFCTEU9MzthLkNPTk5FQ1RJT05fVU5TVVBQT1JURUQ9NDthLkNPTk5FQ1RJT05fVU5SRUFDSEFCTEVfU0NIRURVTEVEX1JFQ09OTkVDVD01O2EuQ09OTkVDVElPTl9MT1NUX1NDSEVEVUxFRF9SRUNPTk5FQ1Q9NjthLkRlZmVycmVkPWcuZGVmZXI7YS5fY29uc3RydWN0PWZ1bmN0aW9uKGEsZCl7cmV0dXJuXCJXZWJTb2NrZXRcImluIGM/ZD9uZXcgV2ViU29ja2V0KGEsXG4gICAgZCk6bmV3IFdlYlNvY2tldChhKTpcIk1veldlYlNvY2tldFwiaW4gYz9kP25ldyBNb3pXZWJTb2NrZXQoYSxkKTpuZXcgTW96V2ViU29ja2V0KGEpOm51bGx9O2EuU2Vzc2lvbj1mdW5jdGlvbihiLGQsYyxmKXt2YXIgZT10aGlzO2UuX3dzdXJpPWI7ZS5fb3B0aW9ucz1mO2UuX3dlYnNvY2tldF9vbm9wZW49ZDtlLl93ZWJzb2NrZXRfb25jbG9zZT1jO2UuX3dlYnNvY2tldD1udWxsO2UuX3dlYnNvY2tldF9jb25uZWN0ZWQ9ITE7ZS5fc2Vzc2lvbl9pZD1udWxsO2UuX3dhbXBfdmVyc2lvbj1udWxsO2UuX3NlcnZlcj1udWxsO2UuX2NhbGxzPXt9O2UuX3N1YnNjcmlwdGlvbnM9e307ZS5fcHJlZml4ZXM9bmV3IGEuUHJlZml4TWFwO2UuX3R4Y250PTA7ZS5fcnhjbnQ9MDtlLl93ZWJzb2NrZXQ9ZS5fb3B0aW9ucyYmZS5fb3B0aW9ucy5za2lwU3VicHJvdG9jb2xBbm5vdW5jZT9hLl9jb25zdHJ1Y3QoZS5fd3N1cmkpOmEuX2NvbnN0cnVjdChlLl93c3VyaSxbYS5fc3VicHJvdG9jb2xdKTtcbiAgICBpZighZS5fd2Vic29ja2V0KXtpZih2b2lkIDAhPT1jKXtjKGEuQ09OTkVDVElPTl9VTlNVUFBPUlRFRCk7cmV0dXJufXRocm93IGEuYnJvd3Nlck5vdFN1cHBvcnRlZE1lc3NhZ2U7fWUuX3dlYnNvY2tldC5vbm1lc3NhZ2U9ZnVuY3Rpb24oYil7YS5fZGVidWd3cyYmKGUuX3J4Y250Kz0xLGNvbnNvbGUuZ3JvdXAoXCJXUyBSZWNlaXZlXCIpLGNvbnNvbGUuaW5mbyhlLl93c3VyaStcIiAgW1wiK2UuX3Nlc3Npb25faWQrXCJdXCIpLGNvbnNvbGUubG9nKGUuX3J4Y250KSxjb25zb2xlLmxvZyhiLmRhdGEpLGNvbnNvbGUuZ3JvdXBFbmQoKSk7Yj1KU09OLnBhcnNlKGIuZGF0YSk7aWYoYlsxXWluIGUuX2NhbGxzKXtpZihiWzBdPT09YS5fTUVTU0FHRV9UWVBFSURfQ0FMTF9SRVNVTFQpe3ZhciBkPWUuX2NhbGxzW2JbMV1dLGM9YlsyXTtpZihhLl9kZWJ1Z3JwYyYmdm9pZCAwIT09ZC5fYWJfY2FsbG9iail7Y29uc29sZS5ncm91cChcIldBTVAgQ2FsbFwiLGQuX2FiX2NhbGxvYmpbMl0pO2NvbnNvbGUudGltZUVuZChkLl9hYl90aWQpO1xuICAgICAgICBjb25zb2xlLmdyb3VwKFwiQXJndW1lbnRzXCIpO2Zvcih2YXIgZj0zO2Y8ZC5fYWJfY2FsbG9iai5sZW5ndGg7Zis9MSl7dmFyIGg9ZC5fYWJfY2FsbG9ialtmXTtpZih2b2lkIDAhPT1oKWNvbnNvbGUubG9nKGgpO2Vsc2UgYnJlYWt9Y29uc29sZS5ncm91cEVuZCgpO2NvbnNvbGUuZ3JvdXAoXCJSZXN1bHRcIik7Y29uc29sZS5sb2coYyk7Y29uc29sZS5ncm91cEVuZCgpO2NvbnNvbGUuZ3JvdXBFbmQoKX1kLnJlc29sdmUoYyl9ZWxzZSBpZihiWzBdPT09YS5fTUVTU0FHRV9UWVBFSURfQ0FMTF9FUlJPUil7ZD1lLl9jYWxsc1tiWzFdXTtjPWJbMl07Zj1iWzNdO2g9Yls0XTtpZihhLl9kZWJ1Z3JwYyYmdm9pZCAwIT09ZC5fYWJfY2FsbG9iail7Y29uc29sZS5ncm91cChcIldBTVAgQ2FsbFwiLGQuX2FiX2NhbGxvYmpbMl0pO2NvbnNvbGUudGltZUVuZChkLl9hYl90aWQpO2NvbnNvbGUuZ3JvdXAoXCJBcmd1bWVudHNcIik7Zm9yKHZhciBnPTM7ZzxkLl9hYl9jYWxsb2JqLmxlbmd0aDtnKz0xKXt2YXIgbT1cbiAgICAgICAgZC5fYWJfY2FsbG9ialtnXTtpZih2b2lkIDAhPT1tKWNvbnNvbGUubG9nKG0pO2Vsc2UgYnJlYWt9Y29uc29sZS5ncm91cEVuZCgpO2NvbnNvbGUuZ3JvdXAoXCJFcnJvclwiKTtjb25zb2xlLmxvZyhjKTtjb25zb2xlLmxvZyhmKTt2b2lkIDAhPT1oJiZjb25zb2xlLmxvZyhoKTtjb25zb2xlLmdyb3VwRW5kKCk7Y29uc29sZS5ncm91cEVuZCgpfXZvaWQgMCE9PWg/ZC5yZWplY3Qoe3VyaTpjLGRlc2M6ZixkZXRhaWw6aH0pOmQucmVqZWN0KHt1cmk6YyxkZXNjOmZ9KX1kZWxldGUgZS5fY2FsbHNbYlsxXV19ZWxzZSBpZihiWzBdPT09YS5fTUVTU0FHRV9UWVBFSURfRVZFTlQpe2lmKGQ9ZS5fcHJlZml4ZXMucmVzb2x2ZShiWzFdLCEwKSxkIGluIGUuX3N1YnNjcmlwdGlvbnMpe3ZhciBuPWJbMV0sdT1iWzJdO2EuX2RlYnVncHVic3ViJiYoY29uc29sZS5ncm91cChcIldBTVAgRXZlbnRcIiksY29uc29sZS5pbmZvKGUuX3dzdXJpK1wiICBbXCIrZS5fc2Vzc2lvbl9pZCtcIl1cIiksY29uc29sZS5sb2cobiksXG4gICAgICAgIGNvbnNvbGUubG9nKHUpLGNvbnNvbGUuZ3JvdXBFbmQoKSk7ZS5fc3Vic2NyaXB0aW9uc1tkXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Eobix1KX0pfX1lbHNlIGlmKGJbMF09PT1hLl9NRVNTQUdFX1RZUEVJRF9XRUxDT01FKWlmKG51bGw9PT1lLl9zZXNzaW9uX2lkKXtlLl9zZXNzaW9uX2lkPWJbMV07ZS5fd2FtcF92ZXJzaW9uPWJbMl07ZS5fc2VydmVyPWJbM107aWYoYS5fZGVidWdycGN8fGEuX2RlYnVncHVic3ViKWNvbnNvbGUuZ3JvdXAoXCJXQU1QIFdlbGNvbWVcIiksY29uc29sZS5pbmZvKGUuX3dzdXJpK1wiICBbXCIrZS5fc2Vzc2lvbl9pZCtcIl1cIiksY29uc29sZS5sb2coZS5fd2FtcF92ZXJzaW9uKSxjb25zb2xlLmxvZyhlLl9zZXJ2ZXIpLGNvbnNvbGUuZ3JvdXBFbmQoKTtudWxsIT09ZS5fd2Vic29ja2V0X29ub3BlbiYmZS5fd2Vic29ja2V0X29ub3BlbigpfWVsc2UgdGhyb3dcInByb3RvY29sIGVycm9yICh3ZWxjb21lIG1lc3NhZ2UgcmVjZWl2ZWQgbW9yZSB0aGFuIG9uY2UpXCI7XG4gICAgfTtlLl93ZWJzb2NrZXQub25vcGVuPWZ1bmN0aW9uKGIpe2lmKGUuX3dlYnNvY2tldC5wcm90b2NvbCE9PWEuX3N1YnByb3RvY29sKWlmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgZS5fd2Vic29ja2V0LnByb3RvY29sKWEuX2RlYnVnd3MmJihjb25zb2xlLmdyb3VwKFwiV1MgV2FybmluZ1wiKSxjb25zb2xlLmluZm8oZS5fd3N1cmkpLGNvbnNvbGUubG9nKFwiV2ViU29ja2V0IG9iamVjdCBoYXMgbm8gcHJvdG9jb2wgYXR0cmlidXRlOiBXQU1QIHN1YnByb3RvY29sIGNoZWNrIHNraXBwZWQhXCIpLGNvbnNvbGUuZ3JvdXBFbmQoKSk7ZWxzZSBpZihlLl9vcHRpb25zJiZlLl9vcHRpb25zLnNraXBTdWJwcm90b2NvbENoZWNrKWEuX2RlYnVnd3MmJihjb25zb2xlLmdyb3VwKFwiV1MgV2FybmluZ1wiKSxjb25zb2xlLmluZm8oZS5fd3N1cmkpLGNvbnNvbGUubG9nKFwiU2VydmVyIGRvZXMgbm90IHNwZWFrIFdBTVAsIGJ1dCBzdWJwcm90b2NvbCBjaGVjayBkaXNhYmxlZCBieSBvcHRpb24hXCIpLGNvbnNvbGUubG9nKGUuX3dlYnNvY2tldC5wcm90b2NvbCksXG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKSk7ZWxzZSB0aHJvdyBlLl93ZWJzb2NrZXQuY2xvc2UoMUUzLFwic2VydmVyIGRvZXMgbm90IHNwZWFrIFdBTVBcIiksXCJzZXJ2ZXIgZG9lcyBub3Qgc3BlYWsgV0FNUCAoYnV0ICdcIitlLl93ZWJzb2NrZXQucHJvdG9jb2wrXCInICEpXCI7YS5fZGVidWd3cyYmKGNvbnNvbGUuZ3JvdXAoXCJXQU1QIENvbm5lY3RcIiksY29uc29sZS5pbmZvKGUuX3dzdXJpKSxjb25zb2xlLmxvZyhlLl93ZWJzb2NrZXQucHJvdG9jb2wpLGNvbnNvbGUuZ3JvdXBFbmQoKSk7ZS5fd2Vic29ja2V0X2Nvbm5lY3RlZD0hMH07ZS5fd2Vic29ja2V0Lm9uZXJyb3I9ZnVuY3Rpb24oYSl7fTtlLl93ZWJzb2NrZXQub25jbG9zZT1mdW5jdGlvbihiKXthLl9kZWJ1Z3dzJiYoZS5fd2Vic29ja2V0X2Nvbm5lY3RlZD9jb25zb2xlLmxvZyhcIkF1dG9iYWhuIGNvbm5lY3Rpb24gdG8gXCIrZS5fd3N1cmkrXCIgbG9zdCAoY29kZSBcIitiLmNvZGUrXCIsIHJlYXNvbiAnXCIrYi5yZWFzb24rXCInLCB3YXNDbGVhbiBcIitcbiAgICBiLndhc0NsZWFuK1wiKS5cIik6Y29uc29sZS5sb2coXCJBdXRvYmFobiBjb3VsZCBub3QgY29ubmVjdCB0byBcIitlLl93c3VyaStcIiAoY29kZSBcIitiLmNvZGUrXCIsIHJlYXNvbiAnXCIrYi5yZWFzb24rXCInLCB3YXNDbGVhbiBcIitiLndhc0NsZWFuK1wiKS5cIikpO3ZvaWQgMCE9PWUuX3dlYnNvY2tldF9vbmNsb3NlJiYoZS5fd2Vic29ja2V0X2Nvbm5lY3RlZD9iLndhc0NsZWFuP2UuX3dlYnNvY2tldF9vbmNsb3NlKGEuQ09OTkVDVElPTl9DTE9TRUQsXCJXUy1cIitiLmNvZGUrXCI6IFwiK2IucmVhc29uKTplLl93ZWJzb2NrZXRfb25jbG9zZShhLkNPTk5FQ1RJT05fTE9TVCk6ZS5fd2Vic29ja2V0X29uY2xvc2UoYS5DT05ORUNUSU9OX1VOUkVBQ0hBQkxFKSk7ZS5fd2Vic29ja2V0X2Nvbm5lY3RlZD0hMTtlLl93c3VyaT1udWxsO2UuX3dlYnNvY2tldF9vbm9wZW49bnVsbDtlLl93ZWJzb2NrZXRfb25jbG9zZT1udWxsO2UuX3dlYnNvY2tldD1udWxsfTtlLmxvZz1mdW5jdGlvbigpe2UuX29wdGlvbnMmJlxuICAgIFwic2Vzc2lvbklkZW50XCJpbiBlLl9vcHRpb25zP2NvbnNvbGUuZ3JvdXAoXCJXQU1QIFNlc3Npb24gJ1wiK2UuX29wdGlvbnMuc2Vzc2lvbklkZW50K1wiJyBbXCIrZS5fc2Vzc2lvbl9pZCtcIl1cIik6Y29uc29sZS5ncm91cChcIldBTVAgU2Vzc2lvbiBbXCIrZS5fc2Vzc2lvbl9pZCtcIl1cIik7Zm9yKHZhciBhPTA7YTxhcmd1bWVudHMubGVuZ3RoOysrYSljb25zb2xlLmxvZyhhcmd1bWVudHNbYV0pO2NvbnNvbGUuZ3JvdXBFbmQoKX19O2EuU2Vzc2lvbi5wcm90b3R5cGUuX3NlbmQ9ZnVuY3Rpb24oYil7aWYoIXRoaXMuX3dlYnNvY2tldF9jb25uZWN0ZWQpdGhyb3dcIkF1dG9iYWhuIG5vdCBjb25uZWN0ZWRcIjtzd2l0Y2goITApe2Nhc2UgYy5Qcm90b3R5cGUmJlwidW5kZWZpbmVkXCI9PT10eXBlb2YgdG9wLnJvb3QuX19wcm90b3R5cGVfZGVsZXRlZDpjYXNlIFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiLnRvSlNPTjpiPWIudG9KU09OKCk7YnJlYWs7ZGVmYXVsdDpiPUpTT04uc3RyaW5naWZ5KGIpfXRoaXMuX3dlYnNvY2tldC5zZW5kKGIpO1xuICAgIHRoaXMuX3R4Y250Kz0xO2EuX2RlYnVnd3MmJihjb25zb2xlLmdyb3VwKFwiV1MgU2VuZFwiKSxjb25zb2xlLmluZm8odGhpcy5fd3N1cmkrXCIgIFtcIit0aGlzLl9zZXNzaW9uX2lkK1wiXVwiKSxjb25zb2xlLmxvZyh0aGlzLl90eGNudCksY29uc29sZS5sb2coYiksY29uc29sZS5ncm91cEVuZCgpKX07YS5TZXNzaW9uLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMuX3dlYnNvY2tldF9jb25uZWN0ZWQmJnRoaXMuX3dlYnNvY2tldC5jbG9zZSgpfTthLlNlc3Npb24ucHJvdG90eXBlLnNlc3Npb25pZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZXNzaW9uX2lkfTthLlNlc3Npb24ucHJvdG90eXBlLndzdXJpPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dzdXJpfTthLlNlc3Npb24ucHJvdG90eXBlLnNocmluaz1mdW5jdGlvbihhLGQpe3ZvaWQgMD09PWQmJihkPSEwKTtyZXR1cm4gdGhpcy5fcHJlZml4ZXMuc2hyaW5rKGEsZCl9O2EuU2Vzc2lvbi5wcm90b3R5cGUucmVzb2x2ZT1cbiAgICBmdW5jdGlvbihhLGQpe3ZvaWQgMD09PWQmJihkPSEwKTtyZXR1cm4gdGhpcy5fcHJlZml4ZXMucmVzb2x2ZShhLGQpfTthLlNlc3Npb24ucHJvdG90eXBlLnByZWZpeD1mdW5jdGlvbihiLGQpe3RoaXMuX3ByZWZpeGVzLnNldChiLGQpO2lmKGEuX2RlYnVncnBjfHxhLl9kZWJ1Z3B1YnN1Yiljb25zb2xlLmdyb3VwKFwiV0FNUCBQcmVmaXhcIiksY29uc29sZS5pbmZvKHRoaXMuX3dzdXJpK1wiICBbXCIrdGhpcy5fc2Vzc2lvbl9pZCtcIl1cIiksY29uc29sZS5sb2coYiksY29uc29sZS5sb2coZCksY29uc29sZS5ncm91cEVuZCgpO3RoaXMuX3NlbmQoW2EuX01FU1NBR0VfVFlQRUlEX1BSRUZJWCxiLGRdKX07YS5TZXNzaW9uLnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPW5ldyBhLkRlZmVycmVkLGQ7IShkPWEuX25ld2lkRmFzdCgpLCEoZCBpbiB0aGlzLl9jYWxscykpOyk7dGhpcy5fY2FsbHNbZF09Yjtmb3IodmFyIGM9dGhpcy5fcHJlZml4ZXMuc2hyaW5rKGFyZ3VtZW50c1swXSxcbiAgICAhMCksYz1bYS5fTUVTU0FHRV9UWVBFSURfQ0FMTCxkLGNdLGY9MTtmPGFyZ3VtZW50cy5sZW5ndGg7Zis9MSljLnB1c2goYXJndW1lbnRzW2ZdKTt0aGlzLl9zZW5kKGMpO2EuX2RlYnVncnBjJiYoYi5fYWJfY2FsbG9iaj1jLGIuX2FiX3RpZD10aGlzLl93c3VyaStcIiAgW1wiK3RoaXMuX3Nlc3Npb25faWQrXCJdW1wiK2QrXCJdXCIsY29uc29sZS50aW1lKGIuX2FiX3RpZCksY29uc29sZS5pbmZvKCkpO3JldHVybiBiLnByb21pc2UudGhlbj9iLnByb21pc2U6Yn07YS5TZXNzaW9uLnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24oYixkKXt2YXIgYz10aGlzLl9wcmVmaXhlcy5yZXNvbHZlKGIsITApO2MgaW4gdGhpcy5fc3Vic2NyaXB0aW9uc3x8KGEuX2RlYnVncHVic3ViJiYoY29uc29sZS5ncm91cChcIldBTVAgU3Vic2NyaWJlXCIpLGNvbnNvbGUuaW5mbyh0aGlzLl93c3VyaStcIiAgW1wiK3RoaXMuX3Nlc3Npb25faWQrXCJdXCIpLGNvbnNvbGUubG9nKGIpLGNvbnNvbGUubG9nKGQpLGNvbnNvbGUuZ3JvdXBFbmQoKSksXG4gICAgdGhpcy5fc2VuZChbYS5fTUVTU0FHRV9UWVBFSURfU1VCU0NSSUJFLGJdKSx0aGlzLl9zdWJzY3JpcHRpb25zW2NdPVtdKTtpZigtMT09PXRoaXMuX3N1YnNjcmlwdGlvbnNbY10uaW5kZXhPZihkKSl0aGlzLl9zdWJzY3JpcHRpb25zW2NdLnB1c2goZCk7ZWxzZSB0aHJvd1wiY2FsbGJhY2sgXCIrZCtcIiBhbHJlYWR5IHN1YnNjcmliZWQgZm9yIHRvcGljIFwiK2M7fTthLlNlc3Npb24ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGIsZCl7dmFyIGM9dGhpcy5fcHJlZml4ZXMucmVzb2x2ZShiLCEwKTtpZihjIGluIHRoaXMuX3N1YnNjcmlwdGlvbnMpe3ZhciBmO2lmKHZvaWQgMCE9PWQpe3ZhciBlPXRoaXMuX3N1YnNjcmlwdGlvbnNbY10uaW5kZXhPZihkKTtpZigtMSE9PWUpZj1kLHRoaXMuX3N1YnNjcmlwdGlvbnNbY10uc3BsaWNlKGUsMSk7ZWxzZSB0aHJvd1wibm8gY2FsbGJhY2sgXCIrZCtcIiBzdWJzY3JpYmVkIG9uIHRvcGljIFwiK2M7fWVsc2UgZj10aGlzLl9zdWJzY3JpcHRpb25zW2NdLnNsaWNlKCksXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uc1tjXT1bXTswPT09dGhpcy5fc3Vic2NyaXB0aW9uc1tjXS5sZW5ndGgmJihkZWxldGUgdGhpcy5fc3Vic2NyaXB0aW9uc1tjXSxhLl9kZWJ1Z3B1YnN1YiYmKGNvbnNvbGUuZ3JvdXAoXCJXQU1QIFVuc3Vic2NyaWJlXCIpLGNvbnNvbGUuaW5mbyh0aGlzLl93c3VyaStcIiAgW1wiK3RoaXMuX3Nlc3Npb25faWQrXCJdXCIpLGNvbnNvbGUubG9nKGIpLGNvbnNvbGUubG9nKGYpLGNvbnNvbGUuZ3JvdXBFbmQoKSksdGhpcy5fc2VuZChbYS5fTUVTU0FHRV9UWVBFSURfVU5TVUJTQ1JJQkUsYl0pKX1lbHNlIHRocm93XCJub3Qgc3Vic2NyaWJlZCB0byB0b3BpYyBcIitjO307YS5TZXNzaW9uLnByb3RvdHlwZS5wdWJsaXNoPWZ1bmN0aW9uKCl7dmFyIGI9YXJndW1lbnRzWzBdLGQ9YXJndW1lbnRzWzFdLGM9bnVsbCxmPW51bGwsZT1udWxsLGc9bnVsbDtpZigzPGFyZ3VtZW50cy5sZW5ndGgpe2lmKCEoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSkpdGhyb3dcImludmFsaWQgYXJndW1lbnQgdHlwZShzKVwiO1xuICAgIGlmKCEoYXJndW1lbnRzWzNdaW5zdGFuY2VvZiBBcnJheSkpdGhyb3dcImludmFsaWQgYXJndW1lbnQgdHlwZShzKVwiO2Y9YXJndW1lbnRzWzJdO2U9YXJndW1lbnRzWzNdO2c9W2EuX01FU1NBR0VfVFlQRUlEX1BVQkxJU0gsYixkLGYsZV19ZWxzZSBpZigyPGFyZ3VtZW50cy5sZW5ndGgpaWYoXCJib29sZWFuXCI9PT10eXBlb2YgYXJndW1lbnRzWzJdKWM9YXJndW1lbnRzWzJdLGc9W2EuX01FU1NBR0VfVFlQRUlEX1BVQkxJU0gsYixkLGNdO2Vsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSlmPWFyZ3VtZW50c1syXSxnPVthLl9NRVNTQUdFX1RZUEVJRF9QVUJMSVNILGIsZCxmXTtlbHNlIHRocm93XCJpbnZhbGlkIGFyZ3VtZW50IHR5cGUocylcIjtlbHNlIGc9W2EuX01FU1NBR0VfVFlQRUlEX1BVQkxJU0gsYixkXTthLl9kZWJ1Z3B1YnN1YiYmKGNvbnNvbGUuZ3JvdXAoXCJXQU1QIFB1Ymxpc2hcIiksY29uc29sZS5pbmZvKHRoaXMuX3dzdXJpK1wiICBbXCIrdGhpcy5fc2Vzc2lvbl9pZCtcblwiXVwiKSxjb25zb2xlLmxvZyhiKSxjb25zb2xlLmxvZyhkKSxudWxsIT09Yz9jb25zb2xlLmxvZyhjKTpudWxsIT09ZiYmKGNvbnNvbGUubG9nKGYpLG51bGwhPT1lJiZjb25zb2xlLmxvZyhlKSksY29uc29sZS5ncm91cEVuZCgpKTt0aGlzLl9zZW5kKGcpfTthLlNlc3Npb24ucHJvdG90eXBlLmF1dGhyZXE9ZnVuY3Rpb24oYSxkKXtyZXR1cm4gdGhpcy5jYWxsKFwiaHR0cDovL2FwaS53YW1wLndzL3Byb2NlZHVyZSNhdXRocmVxXCIsYSxkKX07YS5TZXNzaW9uLnByb3RvdHlwZS5hdXRoc2lnbj1mdW5jdGlvbihhLGQpe2R8fChkPVwiXCIpO3JldHVybiBDcnlwdG9KUy5IbWFjU0hBMjU2KGEsZCkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkJhc2U2NCl9O2EuU2Vzc2lvbi5wcm90b3R5cGUuYXV0aD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jYWxsKFwiaHR0cDovL2FwaS53YW1wLndzL3Byb2NlZHVyZSNhdXRoXCIsYSl9O2EuX2Nvbm5lY3Q9ZnVuY3Rpb24oYil7dmFyIGQ9bmV3IGEuU2Vzc2lvbihiLndzdXJpLFxuICAgIGZ1bmN0aW9uKCl7Yi5jb25uZWN0cys9MTtiLnJldHJ5Q291bnQ9MDtiLm9uQ29ubmVjdChkKX0sZnVuY3Rpb24oZCxmKXt2YXIgZT1udWxsO3N3aXRjaChkKXtjYXNlIGEuQ09OTkVDVElPTl9DTE9TRUQ6Yi5vbkhhbmd1cChkLFwiQ29ubmVjdGlvbiB3YXMgY2xvc2VkIHByb3Blcmx5IFtcIitmK1wiXVwiKTticmVhaztjYXNlIGEuQ09OTkVDVElPTl9VTlNVUFBPUlRFRDpiLm9uSGFuZ3VwKGQsXCJCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgV2ViU29ja2V0LlwiKTticmVhaztjYXNlIGEuQ09OTkVDVElPTl9VTlJFQUNIQUJMRTpiLnJldHJ5Q291bnQrPTE7aWYoMD09PWIuY29ubmVjdHMpYi5vbkhhbmd1cChkLFwiQ29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQuXCIpO2Vsc2UgaWYoYi5yZXRyeUNvdW50PD1iLm9wdGlvbnMubWF4UmV0cmllcykoZT1iLm9uSGFuZ3VwKGEuQ09OTkVDVElPTl9VTlJFQUNIQUJMRV9TQ0hFRFVMRURfUkVDT05ORUNULFwiQ29ubmVjdGlvbiB1bnJlYWNoYWJsZSAtIHNjaGVkdWxlZCByZWNvbm5lY3QgdG8gb2NjdXIgaW4gXCIrXG4gICAgYi5vcHRpb25zLnJldHJ5RGVsYXkvMUUzK1wiIHNlY29uZChzKSAtIGF0dGVtcHQgXCIrYi5yZXRyeUNvdW50K1wiIG9mIFwiK2Iub3B0aW9ucy5tYXhSZXRyaWVzK1wiLlwiLHtkZWxheTpiLm9wdGlvbnMucmV0cnlEZWxheSxyZXRyaWVzOmIucmV0cnlDb3VudCxtYXhyZXRyaWVzOmIub3B0aW9ucy5tYXhSZXRyaWVzfSkpPyhhLl9kZWJ1Z2Nvbm5lY3QmJmNvbnNvbGUubG9nKFwiQ29ubmVjdGlvbiB1bnJlYWNoYWJsZSAtIHJldHJ5aW5nIHN0b3BwZWQgYnkgYXBwXCIpLGIub25IYW5ndXAoYS5DT05ORUNUSU9OX1JFVFJJRVNfRVhDRUVERUQsXCJOdW1iZXIgb2YgY29ubmVjdGlvbiByZXRyaWVzIGV4Y2VlZGVkLlwiKSk6KGEuX2RlYnVnY29ubmVjdCYmY29uc29sZS5sb2coXCJDb25uZWN0aW9uIHVucmVhY2hhYmxlIC0gcmV0cnlpbmcgKFwiK2IucmV0cnlDb3VudCtcIikgLi5cIiksYy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5fY29ubmVjdChiKX0sYi5vcHRpb25zLnJldHJ5RGVsYXkpKTtlbHNlIGIub25IYW5ndXAoYS5DT05ORUNUSU9OX1JFVFJJRVNfRVhDRUVERUQsXG4gICAgICAgIFwiTnVtYmVyIG9mIGNvbm5lY3Rpb24gcmV0cmllcyBleGNlZWRlZC5cIik7YnJlYWs7Y2FzZSBhLkNPTk5FQ1RJT05fTE9TVDpiLnJldHJ5Q291bnQrPTE7aWYoYi5yZXRyeUNvdW50PD1iLm9wdGlvbnMubWF4UmV0cmllcykoZT1iLm9uSGFuZ3VwKGEuQ09OTkVDVElPTl9MT1NUX1NDSEVEVUxFRF9SRUNPTk5FQ1QsXCJDb25uZWN0aW9uIGxvc3QgLSBzY2hlZHVsZWQgXCIrYi5yZXRyeUNvdW50K1widGggcmVjb25uZWN0IHRvIG9jY3VyIGluIFwiK2Iub3B0aW9ucy5yZXRyeURlbGF5LzFFMytcIiBzZWNvbmQocykuXCIse2RlbGF5OmIub3B0aW9ucy5yZXRyeURlbGF5LHJldHJpZXM6Yi5yZXRyeUNvdW50LG1heHJldHJpZXM6Yi5vcHRpb25zLm1heFJldHJpZXN9KSk/KGEuX2RlYnVnY29ubmVjdCYmY29uc29sZS5sb2coXCJDb25uZWN0aW9uIGxvc3QgLSByZXRyeWluZyBzdG9wcGVkIGJ5IGFwcFwiKSxiLm9uSGFuZ3VwKGEuQ09OTkVDVElPTl9SRVRSSUVTX0VYQ0VFREVELFwiQ29ubmVjdGlvbiBsb3N0LlwiKSk6XG4gICAgICAgIChhLl9kZWJ1Z2Nvbm5lY3QmJmNvbnNvbGUubG9nKFwiQ29ubmVjdGlvbiBsb3N0IC0gcmV0cnlpbmcgKFwiK2IucmV0cnlDb3VudCtcIikgLi5cIiksYy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5fY29ubmVjdChiKX0sYi5vcHRpb25zLnJldHJ5RGVsYXkpKTtlbHNlIGIub25IYW5ndXAoYS5DT05ORUNUSU9OX1JFVFJJRVNfRVhDRUVERUQsXCJDb25uZWN0aW9uIGxvc3QuXCIpO2JyZWFrO2RlZmF1bHQ6dGhyb3dcInVuaGFuZGxlZCBjbG9zZSBjb2RlIGluIGFiLl9jb25uZWN0XCI7fX0sYi5vcHRpb25zKX07YS5jb25uZWN0PWZ1bmN0aW9uKGIsZCxjLGYpe3ZhciBlPXt9O2Uud3N1cmk9YjtlLm9wdGlvbnM9Zj9mOnt9O3ZvaWQgMD09PWUub3B0aW9ucy5yZXRyeURlbGF5JiYoZS5vcHRpb25zLnJldHJ5RGVsYXk9NUUzKTt2b2lkIDA9PT1lLm9wdGlvbnMubWF4UmV0cmllcyYmKGUub3B0aW9ucy5tYXhSZXRyaWVzPTEwKTt2b2lkIDA9PT1lLm9wdGlvbnMuc2tpcFN1YnByb3RvY29sQ2hlY2smJlxuKGUub3B0aW9ucy5za2lwU3VicHJvdG9jb2xDaGVjaz0hMSk7dm9pZCAwPT09ZS5vcHRpb25zLnNraXBTdWJwcm90b2NvbEFubm91bmNlJiYoZS5vcHRpb25zLnNraXBTdWJwcm90b2NvbEFubm91bmNlPSExKTtpZihkKWUub25Db25uZWN0PWQ7ZWxzZSB0aHJvd1wib25Db25uZWN0IGhhbmRsZXIgcmVxdWlyZWQhXCI7ZS5vbkhhbmd1cD1jP2M6ZnVuY3Rpb24oYixkLGMpe2EuX2RlYnVnY29ubmVjdCYmY29uc29sZS5sb2coYixkLGMpfTtlLmNvbm5lY3RzPTA7ZS5yZXRyeUNvdW50PTA7YS5fY29ubmVjdChlKX07YS5sYXVuY2g9ZnVuY3Rpb24oYixkLGMpe2EuY29ubmVjdChiLndzdXJpLGZ1bmN0aW9uKGMpeyFiLmFwcGtleXx8XCJcIj09PWIuYXBwa2V5P2MuYXV0aHJlcSgpLnRoZW4oZnVuY3Rpb24oKXtjLmF1dGgoKS50aGVuKGZ1bmN0aW9uKGIpe2Q/ZChjKTphLl9kZWJ1Z2Nvbm5lY3QmJmMubG9nKFwiU2Vzc2lvbiBvcGVuZWQuXCIpfSxjLmxvZyl9LGMubG9nKTpjLmF1dGhyZXEoYi5hcHBrZXksXG4gICAgYi5hcHBleHRyYSkudGhlbihmdW5jdGlvbihlKXt2YXIgZz1udWxsO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmFwcHNlY3JldD9nPWIuYXBwc2VjcmV0KGUpOihnPWEuZGVyaXZlS2V5KGIuYXBwc2VjcmV0LEpTT04ucGFyc2UoZSkuYXV0aGV4dHJhKSxnPWMuYXV0aHNpZ24oZSxnKSk7Yy5hdXRoKGcpLnRoZW4oZnVuY3Rpb24oYil7ZD9kKGMpOmEuX2RlYnVnY29ubmVjdCYmYy5sb2coXCJTZXNzaW9uIG9wZW5lZC5cIil9LGMubG9nKX0sYy5sb2cpfSxmdW5jdGlvbihiLGQsZyl7Yz9jKGIsZCxnKTphLl9kZWJ1Z2Nvbm5lY3QmJmEubG9nKFwiU2Vzc2lvbiBjbG9zZWQuXCIsYixkLGcpfSxiLnNlc3Npb25Db25maWcpfTtyZXR1cm4gYX0pO2FiLl9VQV9GSVJFRk9YPS8uKkZpcmVmb3hcXC8oWzAtOStdKikuKi87YWIuX1VBX0NIUk9NRT0vLipDaHJvbWVcXC8oWzAtOStdKikuKi87YWIuX1VBX0NIUk9NRUZSQU1FPS8uKmNocm9tZWZyYW1lXFwvKFswLTldKikuKi87YWIuX1VBX1dFQktJVD0vLipBcHBsZVdlYktpdFxcLyhbMC05Ky5dKil3Ki4qLzthYi5fVUFfV0VCT1M9Ly4qd2ViT1NcXC8oWzAtOSsuXSopdyouKi87YWIuX21hdGNoUmVnZXg9ZnVuY3Rpb24oYyxnKXt2YXIgYT1nLmV4ZWMoYyk7cmV0dXJuIGE/YVsxXTphfTtcbmFiLmxvb2t1cFdzU3VwcG9ydD1mdW5jdGlvbigpe3ZhciBjPW5hdmlnYXRvci51c2VyQWdlbnQ7aWYoLTE8Yy5pbmRleE9mKFwiTVNJRVwiKSl7aWYoLTE8Yy5pbmRleE9mKFwiTVNJRSAxMFwiKSlyZXR1cm5bITAsITAsITBdO2lmKC0xPGMuaW5kZXhPZihcImNocm9tZWZyYW1lXCIpKXt2YXIgZz1wYXJzZUludChhYi5fbWF0Y2hSZWdleChjLGFiLl9VQV9DSFJPTUVGUkFNRSkpO3JldHVybiAxNDw9Zz9bITAsITEsITBdOlshMSwhMSwhMV19aWYoLTE8Yy5pbmRleE9mKFwiTVNJRSA4XCIpfHwtMTxjLmluZGV4T2YoXCJNU0lFIDlcIikpcmV0dXJuWyEwLCEwLCEwXX1lbHNle2lmKC0xPGMuaW5kZXhPZihcIkZpcmVmb3hcIikpe2lmKGc9cGFyc2VJbnQoYWIuX21hdGNoUmVnZXgoYyxhYi5fVUFfRklSRUZPWCkpKXtpZig3PD1nKXJldHVyblshMCwhMSwhMF07aWYoMzw9ZylyZXR1cm5bITAsITAsITBdfXJldHVyblshMSwhMSwhMF19aWYoLTE8Yy5pbmRleE9mKFwiU2FmYXJpXCIpJiYtMT09Yy5pbmRleE9mKFwiQ2hyb21lXCIpKXtpZihnPVxuICAgICAgICBhYi5fbWF0Y2hSZWdleChjLGFiLl9VQV9XRUJLSVQpKXJldHVybi0xPGMuaW5kZXhPZihcIldpbmRvd3NcIikmJlwiNTM0K1wiPT1nfHwtMTxjLmluZGV4T2YoXCJNYWNpbnRvc2hcIikmJihnPWcucmVwbGFjZShcIitcIixcIlwiKS5zcGxpdChcIi5cIiksNTM1PT1wYXJzZUludChnWzBdKSYmMjQ8PXBhcnNlSW50KGdbMV0pfHw1MzU8cGFyc2VJbnQoZ1swXSkpP1shMCwhMSwhMF06LTE8Yy5pbmRleE9mKFwid2ViT1NcIik/KGc9YWIuX21hdGNoUmVnZXgoYyxhYi5fVUFfV0VCT1MpLnNwbGl0KFwiLlwiKSwyPT1wYXJzZUludChnWzBdKT9bITEsITAsITBdOlshMSwhMSwhMV0pOlshMCwhMCwhMF19ZWxzZSBpZigtMTxjLmluZGV4T2YoXCJDaHJvbWVcIikpe2lmKGc9cGFyc2VJbnQoYWIuX21hdGNoUmVnZXgoYyxhYi5fVUFfQ0hST01FKSkpcmV0dXJuIDE0PD1nP1shMCwhMSwhMF06NDw9Zz9bITAsITAsITBdOlshMSwhMSwhMF19ZWxzZSBpZigtMTxjLmluZGV4T2YoXCJBbmRyb2lkXCIpKXtpZigtMTxjLmluZGV4T2YoXCJGaXJlZm94XCIpfHxcbiAgICAtMTxjLmluZGV4T2YoXCJDck1vXCIpKXJldHVyblshMCwhMSwhMF07aWYoLTE8Yy5pbmRleE9mKFwiT3BlcmFcIikpcmV0dXJuWyExLCExLCEwXTtpZigtMTxjLmluZGV4T2YoXCJDck1vXCIpKXJldHVyblshMCwhMCwhMF19ZWxzZSBpZigtMTxjLmluZGV4T2YoXCJpUGhvbmVcIil8fC0xPGMuaW5kZXhPZihcImlQYWRcIil8fC0xPGMuaW5kZXhPZihcImlQb2RcIikpcmV0dXJuWyExLCExLCEwXX1yZXR1cm5bITEsITEsITFdfTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi92ZW5kb3IvZ29zL3dlYi1zb2NrZXQtYnVuZGxlL1Jlc291cmNlcy9wdWJsaWMvanMvdmVuZG9yL2F1dG9iYWhuLm1pbi5qcyIsIi8qIChpZ25vcmVkKSAqL1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIHZlcnR4IChpZ25vcmVkKVxuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/public/build/gos.js b/public/build/gos.js
new file mode 100644
index 0000000..d0df976
--- /dev/null
+++ b/public/build/gos.js
@@ -0,0 +1,189 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "/build/";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./vendor/gos/web-socket-bundle/Resources/public/js/gos_web_socket_client.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./vendor/gos/web-socket-bundle/Resources/public/js/gos_web_socket_client.js":
+/*!***********************************************************************************!*\
+ !*** ./vendor/gos/web-socket-bundle/Resources/public/js/gos_web_socket_client.js ***!
+ \***********************************************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/***/ (function(module, exports) {
+
+var WS = function () {
+ var GosSocket = function GosSocket(uri, config) {
+
+ /**
+ * Holds the uri to connect to
+ * @type {String}
+ * @private
+ */
+ this._uri = uri;
+
+ /**
+ * Hold autobahn session reference
+ * @type {Mixed}
+ * @private
+ */
+ this._session = false;
+
+ /**
+ * Hold event callbacks
+ * @type {Object}
+ * @private
+ */
+ this._listeners = {};
+
+ //calls the Gos Socket connect function.
+ this.connect();
+ };
+
+ GosSocket.prototype.connect = function () {
+ var that = this;
+
+ ab.connect(this._uri,
+
+ //Function on connect
+ function (session) {
+ that.fire({ type: "socket/connect", data: session });
+ },
+
+ //Function on disconnect / error
+ function (code, reason) {
+ that._session = false;
+
+ that.fire({ type: "socket/disconnect", data: { code: code, reason: reason } });
+ });
+ };
+
+ /**
+ * Adds a listener for an event type
+ *
+ * @param {String} type
+ * @param {function} listener
+ */
+ GosSocket.prototype.on = function (type, listener) {
+ if (typeof this._listeners[type] == "undefined") {
+ this._listeners[type] = [];
+ }
+
+ this._listeners[type].push(listener);
+ };
+
+ /**
+ * Fires an event for all listeners.
+ * @param {String} event
+ */
+ GosSocket.prototype.fire = function (event) {
+ if (typeof event == "string") {
+ event = { type: event };
+ }
+ if (!event.target) {
+ event.target = this;
+ }
+
+ if (!event.type) {
+ //falsy
+ throw new Error("Event object missing 'type' property.");
+ }
+
+ if (this._listeners[event.type] instanceof Array) {
+ var listeners = this._listeners[event.type];
+ for (var i = 0, len = listeners.length; i < len; i++) {
+ listeners[i].call(this, event.data);
+ }
+ }
+ };
+
+ /**
+ * Removes a listener from an event
+ *
+ * @param {String} type
+ * @param {function} listener
+ */
+ GosSocket.prototype.off = function (type, listener) {
+ if (this._listeners[type] instanceof Array) {
+ var listeners = this._listeners[type];
+ for (var i = 0, len = listeners.length; i < len; i++) {
+ if (listeners[i] === listener) {
+ listeners.splice(i, 1);
+ break;
+ }
+ }
+ }
+ };
+
+ return {
+ connect: function connect(uri) {
+ return new GosSocket(uri);
+ }
+ };
+}();
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgYjYwMjM3ZDYzNGExZmMxNDI2ODkiLCJ3ZWJwYWNrOi8vLy4vdmVuZG9yL2dvcy93ZWItc29ja2V0LWJ1bmRsZS9SZXNvdXJjZXMvcHVibGljL2pzL2dvc193ZWJfc29ja2V0X2NsaWVudC5qcyJdLCJuYW1lcyI6WyJXUyIsIkdvc1NvY2tldCIsInVyaSIsImNvbmZpZyIsIl91cmkiLCJfc2Vzc2lvbiIsIl9saXN0ZW5lcnMiLCJjb25uZWN0IiwicHJvdG90eXBlIiwidGhhdCIsImFiIiwic2Vzc2lvbiIsImZpcmUiLCJ0eXBlIiwiZGF0YSIsImNvZGUiLCJyZWFzb24iLCJvbiIsImxpc3RlbmVyIiwicHVzaCIsImV2ZW50IiwidGFyZ2V0IiwiRXJyb3IiLCJBcnJheSIsImxpc3RlbmVycyIsImkiLCJsZW4iLCJsZW5ndGgiLCJjYWxsIiwib2ZmIiwic3BsaWNlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUM3REEsSUFBSUEsS0FBTSxZQUNWO0FBQ0ksUUFBSUMsWUFBWSxTQUFaQSxTQUFZLENBQVNDLEdBQVQsRUFBY0MsTUFBZCxFQUFxQjs7QUFFakM7Ozs7O0FBS0EsYUFBS0MsSUFBTCxHQUFZRixHQUFaOztBQUVBOzs7OztBQUtBLGFBQUtH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QS9HUSxFQUFULEMiLCJmaWxlIjoiZ29zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2J1aWxkL1wiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi92ZW5kb3IvZ29zL3dlYi1zb2NrZXQtYnVuZGxlL1Jlc291cmNlcy9wdWJsaWMvanMvZ29zX3dlYl9zb2NrZXRfY2xpZW50LmpzXCIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGI2MDIzN2Q2MzRhMWZjMTQyNjg5IiwidmFyIFdTID0gKGZ1bmN0aW9uKClcbntcbiAgICB2YXIgR29zU29ja2V0ID0gZnVuY3Rpb24odXJpLCBjb25maWcpe1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIb2xkcyB0aGUgdXJpIHRvIGNvbm5lY3QgdG9cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3VyaSA9IHVyaTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSG9sZCBhdXRvYmFobiBzZXNzaW9uIHJlZmVyZW5jZVxuICAgICAgICAgKiBAdHlwZSB7TWl4ZWR9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9zZXNzaW9uID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvbGQgZXZlbnQgY2FsbGJhY2tzXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcblxuICAgICAgICAvL2NhbGxzIHRoZSBHb3MgU29ja2V0IGNvbm5lY3QgZnVuY3Rpb24uXG4gICAgICAgIHRoaXMuY29ubmVjdCgpO1xuICAgIH07XG5cbiAgICBHb3NTb2NrZXQucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgICAgICBhYi5jb25uZWN0KHRoaXMuX3VyaSxcblxuICAgICAgICAgICAgLy9GdW5jdGlvbiBvbiBjb25uZWN0XG4gICAgICAgICAgICBmdW5jdGlvbihzZXNzaW9uKXtcbiAgICAgICAgICAgICAgICB0aGF0LmZpcmUoe3R5cGU6IFwic29ja2V0L2Nvbm5lY3RcIiwgZGF0YTogc2Vzc2lvbiB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vRnVuY3Rpb24gb24gZGlzY29ubmVjdCAvIGVycm9yXG4gICAgICAgICAgICBmdW5jdGlvbihjb2RlLCByZWFzb24pe1xuICAgICAgICAgICAgICAgIHRoYXQuX3Nlc3Npb24gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHRoYXQuZmlyZSh7dHlwZTogXCJzb2NrZXQvZGlzY29ubmVjdFwiLCBkYXRhOiB7Y29kZTogY29kZSwgcmVhc29uOiByZWFzb259fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgYW4gZXZlbnQgdHlwZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIEdvc1NvY2tldC5wcm90b3R5cGUub24gPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcil7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbGlzdGVuZXJzW3R5cGVdID09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdID0gW107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpcmVzIGFuIGV2ZW50IGZvciBhbGwgbGlzdGVuZXJzLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgICAqL1xuICAgIEdvc1NvY2tldC5wcm90b3R5cGUuZmlyZSA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgaWYgKHR5cGVvZiBldmVudCA9PSBcInN0cmluZ1wiKXtcbiAgICAgICAgICAgIGV2ZW50ID0geyB0eXBlOiBldmVudCB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0KXtcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldCA9IHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWV2ZW50LnR5cGUpeyAgLy9mYWxzeVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXZlbnQgb2JqZWN0IG1pc3NpbmcgJ3R5cGUnIHByb3BlcnR5LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbZXZlbnQudHlwZV0gaW5zdGFuY2VvZiBBcnJheSl7XG4gICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xuICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49bGlzdGVuZXJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0uY2FsbCh0aGlzLCBldmVudC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSBhbiBldmVudFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIEdvc1NvY2tldC5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpe1xuICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW3R5cGVdIGluc3RhbmNlb2YgQXJyYXkpe1xuICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbGVuPWxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSA9PT0gbGlzdGVuZXIpe1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29ubmVjdDogZnVuY3Rpb24odXJpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEdvc1NvY2tldCh1cmkpO1xuICAgICAgICB9XG4gICAgfVxuXG59KSgpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3ZlbmRvci9nb3Mvd2ViLXNvY2tldC1idW5kbGUvUmVzb3VyY2VzL3B1YmxpYy9qcy9nb3Nfd2ViX3NvY2tldF9jbGllbnQuanMiXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/public/build/manifest.json b/public/build/manifest.json
new file mode 100644
index 0000000..131ce89
--- /dev/null
+++ b/public/build/manifest.json
@@ -0,0 +1,4 @@
+{
+ "build/autobahn.js": "/build/autobahn.js",
+ "build/gos.js": "/build/gos.js"
+}
\ No newline at end of file
diff --git a/web/favicon.ico b/public/favicon.ico
similarity index 100%
rename from web/favicon.ico
rename to public/favicon.ico
diff --git a/public/index.php b/public/index.php
new file mode 100644
index 0000000..1cb1cc9
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,39 @@
+load(__DIR__ . '/../.env');
+}
+
+$env = $_SERVER['APP_ENV'] ?? 'dev';
+$debug = (bool)($_SERVER['APP_DEBUG'] ?? ('prod' !== $env));
+
+if ($debug) {
+ umask(0000);
+
+ Debug::enable();
+}
+
+if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) {
+ Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);
+}
+
+if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? false) {
+ Request::setTrustedHosts(explode(',', $trustedHosts));
+}
+
+$kernel = new Kernel($env, $debug);
+$request = Request::createFromGlobals();
+$response = $kernel->handle($request);
+$response->send();
+$kernel->terminate($request, $response);
diff --git a/web/robots.txt b/public/robots.txt
similarity index 100%
rename from web/robots.txt
rename to public/robots.txt
diff --git a/src/AppBundle/AppBundle.php b/src/AppBundle/AppBundle.php
deleted file mode 100755
index 05123b6..0000000
--- a/src/AppBundle/AppBundle.php
+++ /dev/null
@@ -1,9 +0,0 @@
-
- */
-class AppExtension extends Extension
-{
- /**
- * {@inheritDoc}
- */
- public function load(array $configs, ContainerBuilder $container)
- {
- $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
- $loader->load('services.yml');
- }
-}
diff --git a/src/AppBundle/Resources/config/services.yml b/src/AppBundle/Resources/config/services.yml
deleted file mode 100644
index d4919dc..0000000
--- a/src/AppBundle/Resources/config/services.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-services:
- acme_hello.topic_sample_service:
- class: AppBundle\Topic\AcmeTopic
- tags:
- - { name: gos_web_socket.topic }
-
- acme_hello.rpc_sample_service:
- class: AppBundle\Rpc\AcmeRpc
- tags:
- - { name: gos_web_socket.rpc }
\ No newline at end of file
diff --git a/src/AppBundle/Controller/DefaultController.php b/src/Controller/DefaultController.php
similarity index 59%
rename from src/AppBundle/Controller/DefaultController.php
rename to src/Controller/DefaultController.php
index 78a2f4d..2b1b781 100755
--- a/src/AppBundle/Controller/DefaultController.php
+++ b/src/Controller/DefaultController.php
@@ -1,9 +1,9 @@
render('AppBundle::index.html.twig');
+ return $this->render('default/index.html.twig');
}
}
diff --git a/app/logs/.gitkeep b/src/Entity/.gitignore
old mode 100755
new mode 100644
similarity index 100%
rename from app/logs/.gitkeep
rename to src/Entity/.gitignore
diff --git a/src/Kernel.php b/src/Kernel.php
new file mode 100644
index 0000000..aa411a6
--- /dev/null
+++ b/src/Kernel.php
@@ -0,0 +1,61 @@
+getProjectDir() . '/var/cache/' . $this->environment;
+ }
+
+ public function getLogDir()
+ {
+ return $this->getProjectDir() . '/var/log';
+ }
+
+ public function registerBundles()
+ {
+ $contents = require $this->getProjectDir() . '/config/bundles.php';
+ foreach ($contents as $class => $envs) {
+ if (isset($envs['all']) || isset($envs[$this->environment])) {
+ yield new $class();
+ }
+ }
+ }
+
+ protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader)
+ {
+ $container->addResource(new FileResource($this->getProjectDir() . '/config/bundles.php'));
+ // Feel free to remove the "container.autowiring.strict_mode" parameter
+ // if you are using symfony/dependency-injection 4.0+ as it's the default behavior
+ $container->setParameter('container.autowiring.strict_mode', true);
+ $container->setParameter('container.dumper.inline_class_loader', true);
+ $confDir = $this->getProjectDir() . '/config';
+
+ $loader->load($confDir . '/{packages}/*' . self::CONFIG_EXTS, 'glob');
+ $loader->load($confDir . '/{packages}/' . $this->environment . '/**/*' . self::CONFIG_EXTS, 'glob');
+ $loader->load($confDir . '/{services}' . self::CONFIG_EXTS, 'glob');
+ $loader->load($confDir . '/{services}_' . $this->environment . self::CONFIG_EXTS, 'glob');
+ }
+
+ protected function configureRoutes(RouteCollectionBuilder $routes)
+ {
+ $confDir = $this->getProjectDir() . '/config';
+
+ $routes->import($confDir . '/{routes}/*' . self::CONFIG_EXTS, '/', 'glob');
+ $routes->import($confDir . '/{routes}/' . $this->environment . '/**/*' . self::CONFIG_EXTS, '/', 'glob');
+ $routes->import($confDir . '/{routes}' . self::CONFIG_EXTS, '/', 'glob');
+ }
+}
diff --git a/src/Repository/.gitignore b/src/Repository/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/src/AppBundle/Rpc/AcmeRpc.php b/src/Rpc/AcmeRpc.php
similarity index 96%
rename from src/AppBundle/Rpc/AcmeRpc.php
rename to src/Rpc/AcmeRpc.php
index bfbe310..06cbafc 100644
--- a/src/AppBundle/Rpc/AcmeRpc.php
+++ b/src/Rpc/AcmeRpc.php
@@ -1,10 +1,10 @@
+
+
+
+ {% block title %}Welcome!{% endblock %}
+ {% block stylesheets %}{% endblock %}
+
+
+
+{% block body %}{% endblock %}
+{% block javascripts %}{% endblock %}
+
+
diff --git a/src/AppBundle/Resources/views/index.html.twig b/templates/default/index.html.twig
similarity index 65%
rename from src/AppBundle/Resources/views/index.html.twig
rename to templates/default/index.html.twig
index 5dd6e57..7924b3e 100755
--- a/src/AppBundle/Resources/views/index.html.twig
+++ b/templates/default/index.html.twig
@@ -8,20 +8,18 @@