diff --git a/core/composer.json b/core/composer.json
index 4bedbf0..2cc1671 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -3,20 +3,20 @@
   "description": "Drupal is an open source content management platform powering millions of websites and applications.",
   "license": "GPL-2.0+",
   "require": {
-    "symfony/class-loader": "<2.4",
-    "symfony/dependency-injection": "<2.4",
-    "symfony/event-dispatcher": "<2.4",
-    "symfony/http-foundation": "<2.4",
-    "symfony/http-kernel": "<2.4",
-    "symfony/routing": "<2.4",
-    "symfony/serializer": "<2.4",
-    "symfony/yaml": "<2.4",
-    "twig/twig": "1.*@stable",
-    "doctrine/common": "2.3.*@stable",
-    "guzzle/http": "3.1.*@stable",
-    "kriswallsmith/assetic": "1.1.*@alpha",
-    "symfony-cmf/routing": "1.0.*@dev",
-    "easyrdf/easyrdf": "dev-master"
+    "symfony/class-loader": "2.2.0-BETA1",
+    "symfony/dependency-injection": "2.2.0-BETA1",
+    "symfony/event-dispatcher": "2.2.0-BETA1",
+    "symfony/http-foundation": "2.2.0-BETA1",
+    "symfony/http-kernel": "2.2.0-BETA1",
+    "symfony/routing": "2.2.0-BETA1",
+    "symfony/serializer": "2.2.0-BETA1",
+    "symfony/yaml": "2.2.0-BETA1",
+    "twig/twig": "1.12.1",
+    "doctrine/common": "2.3.0",
+    "guzzle/http": "3.1.0",
+    "kriswallsmith/assetic": "1.1.0-alpha1",
+    "symfony-cmf/routing": "1.0.0-alpha4",
+    "easyrdf/easyrdf": "dev-master#7ea07f2"
   },
   "minimum-stability": "dev"
 }
diff --git a/core/composer.lock b/core/composer.lock
index bd6e3ea..1c81289 100644
--- a/core/composer.lock
+++ b/core/composer.lock
@@ -1,5 +1,5 @@
 {
-    "hash": "9dba4484f19203d80a4d60c987df2e59",
+    "hash": "373fce59ad113656bb1ead94c948b455",
     "packages": [
         {
             "name": "doctrine/common",
@@ -56,7 +56,7 @@
                 {
                     "name": "Johannes Schmitt",
                     "email": "schmittjoh@gmail.com",
-                    "homepage": "http://jmsyst.com",
+                    "homepage": "https://github.com/schmittjoh",
                     "role": "Developer of wrapped JMSSerializerBundle"
                 }
             ],
@@ -76,12 +76,12 @@
             "source": {
                 "type": "git",
                 "url": "git://github.com/njh/easyrdf.git",
-                "reference": "d1c363bd04cd55169fbefe52328e86031c6db3a2"
+                "reference": "7ea07f2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/njh/easyrdf/archive/d1c363bd04cd55169fbefe52328e86031c6db3a2.zip",
-                "reference": "d1c363bd04cd55169fbefe52328e86031c6db3a2",
+                "url": "https://github.com/njh/easyrdf/archive/7ea07f2061000a2c3018f7bba51c653200bd0877.zip",
+                "reference": "7ea07f2",
                 "shasum": ""
             },
             "require": {
@@ -95,7 +95,7 @@
                 "squizlabs/php_codesniffer": ">=1.4.3",
                 "sami/sami": "dev-master"
             },
-            "time": "2013-01-13 01:20:04",
+            "time": "2013-01-19 13:23:52",
             "type": "library",
             "autoload": {
                 "psr-0": {
@@ -380,17 +380,17 @@
         },
         {
             "name": "symfony-cmf/routing",
-            "version": "dev-master",
+            "version": "1.0.0-alpha4",
             "target-dir": "Symfony/Cmf/Component/Routing",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony-cmf/Routing",
-                "reference": "1.0.0-alpha3"
+                "reference": "1.0.0-alpha4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony-cmf/Routing/archive/1.0.0-alpha3.zip",
-                "reference": "1.0.0-alpha3",
+                "url": "https://github.com/symfony-cmf/Routing/archive/1.0.0-alpha4.zip",
+                "reference": "1.0.0-alpha4",
                 "shasum": ""
             },
             "require": {
@@ -398,7 +398,7 @@
                 "symfony/routing": ">=2.1,<2.3-dev",
                 "symfony/http-kernel": ">=2.1,<2.3-dev"
             },
-            "time": "2012-12-16 17:52:57",
+            "time": "2013-01-19 22:29:35",
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -429,17 +429,17 @@
         },
         {
             "name": "symfony/class-loader",
-            "version": "dev-master",
+            "version": "v2.2.0-BETA1",
             "target-dir": "Symfony/Component/ClassLoader",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ClassLoader",
-                "reference": "0730d0f8f99cfeafbc23271f1e87f54da15f1e06"
+                "reference": "v2.2.0-BETA1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/ClassLoader/archive/0730d0f8f99cfeafbc23271f1e87f54da15f1e06.zip",
-                "reference": "0730d0f8f99cfeafbc23271f1e87f54da15f1e06",
+                "url": "https://github.com/symfony/ClassLoader/archive/v2.2.0-BETA1.zip",
+                "reference": "v2.2.0-BETA1",
                 "shasum": ""
             },
             "require": {
@@ -479,17 +479,17 @@
         },
         {
             "name": "symfony/dependency-injection",
-            "version": "dev-master",
+            "version": "v2.2.0-BETA1",
             "target-dir": "Symfony/Component/DependencyInjection",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/DependencyInjection",
-                "reference": "13b47742e1ef22aed78132e5e0930d28571142a4"
+                "reference": "v2.2.0-BETA1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/DependencyInjection/archive/13b47742e1ef22aed78132e5e0930d28571142a4.zip",
-                "reference": "13b47742e1ef22aed78132e5e0930d28571142a4",
+                "url": "https://github.com/symfony/DependencyInjection/archive/v2.2.0-BETA1.zip",
+                "reference": "v2.2.0-BETA1",
                 "shasum": ""
             },
             "require": {
@@ -503,7 +503,7 @@
                 "symfony/yaml": "2.2.*",
                 "symfony/config": "2.2.*"
             },
-            "time": "2013-01-04 16:58:00",
+            "time": "2013-01-08 18:17:41",
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -534,17 +534,17 @@
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "dev-master",
+            "version": "v2.2.0-BETA1",
             "target-dir": "Symfony/Component/EventDispatcher",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/EventDispatcher",
-                "reference": "0fcc9fa82fa3ea7ec2605af2e8137698fbaca3dc"
+                "reference": "v2.2.0-BETA1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/EventDispatcher/archive/0fcc9fa82fa3ea7ec2605af2e8137698fbaca3dc.zip",
-                "reference": "0fcc9fa82fa3ea7ec2605af2e8137698fbaca3dc",
+                "url": "https://github.com/symfony/EventDispatcher/archive/v2.2.0-BETA1.zip",
+                "reference": "v2.2.0-BETA1",
                 "shasum": ""
             },
             "require": {
@@ -588,23 +588,23 @@
         },
         {
             "name": "symfony/http-foundation",
-            "version": "dev-master",
+            "version": "v2.2.0-BETA1",
             "target-dir": "Symfony/Component/HttpFoundation",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/HttpFoundation",
-                "reference": "5aa0119417f1fc8de7513d9432dd2f43f9d9e97b"
+                "reference": "v2.2.0-BETA1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/HttpFoundation/archive/5aa0119417f1fc8de7513d9432dd2f43f9d9e97b.zip",
-                "reference": "5aa0119417f1fc8de7513d9432dd2f43f9d9e97b",
+                "url": "https://github.com/symfony/HttpFoundation/archive/v2.2.0-BETA1.zip",
+                "reference": "v2.2.0-BETA1",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
-            "time": "2013-01-04 17:02:19",
+            "time": "2013-01-08 18:17:41",
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -638,17 +638,17 @@
         },
         {
             "name": "symfony/http-kernel",
-            "version": "dev-master",
+            "version": "v2.2.0-BETA1",
             "target-dir": "Symfony/Component/HttpKernel",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/HttpKernel",
-                "reference": "ce164c088666b80ffc116173065d504055414137"
+                "reference": "v2.2.0-BETA1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/HttpKernel/archive/ce164c088666b80ffc116173065d504055414137.zip",
-                "reference": "ce164c088666b80ffc116173065d504055414137",
+                "url": "https://github.com/symfony/HttpKernel/archive/v2.2.0-BETA1.zip",
+                "reference": "v2.2.0-BETA1",
                 "shasum": ""
             },
             "require": {
@@ -675,7 +675,7 @@
                 "symfony/dependency-injection": "2.2.*",
                 "symfony/finder": "2.2.*"
             },
-            "time": "2013-01-04 16:58:00",
+            "time": "2013-01-08 18:55:25",
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -711,18 +711,18 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Process",
-                "reference": "058ae5038a9623fa64b120a2d10ba81f1ade05c7"
+                "reference": "v2.1.7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/Process/archive/058ae5038a9623fa64b120a2d10ba81f1ade05c7.zip",
-                "reference": "058ae5038a9623fa64b120a2d10ba81f1ade05c7",
+                "url": "https://github.com/symfony/Process/archive/v2.1.7.zip",
+                "reference": "v2.1.7",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
-            "time": "2012-12-06 10:00:55",
+            "time": "2013-01-16 09:27:54",
             "type": "library",
             "autoload": {
                 "psr-0": {
@@ -748,34 +748,34 @@
         },
         {
             "name": "symfony/routing",
-            "version": "dev-master",
+            "version": "v2.2.0-BETA1",
             "target-dir": "Symfony/Component/Routing",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Routing",
-                "reference": "87a66890450658ccac99702ac5e4f002ece9e23e"
+                "reference": "v2.2.0-BETA1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/Routing/archive/87a66890450658ccac99702ac5e4f002ece9e23e.zip",
-                "reference": "87a66890450658ccac99702ac5e4f002ece9e23e",
+                "url": "https://github.com/symfony/Routing/archive/v2.2.0-BETA1.zip",
+                "reference": "v2.2.0-BETA1",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
             "require-dev": {
-                "doctrine/common": ">=2.2,<2.4-dev",
                 "symfony/config": "2.2.*",
                 "symfony/yaml": "2.2.*",
-                "symfony/http-kernel": "2.2.*"
+                "symfony/http-kernel": "2.2.*",
+                "doctrine/common": ">=2.2,<2.4-dev"
             },
             "suggest": {
-                "doctrine/common": ">=2.2,<2.4-dev",
                 "symfony/config": "2.2.*",
-                "symfony/yaml": "2.2.*"
+                "symfony/yaml": "2.2.*",
+                "doctrine/common": ">=2.2,<2.4-dev"
             },
-            "time": "2012-12-28 13:21:48",
+            "time": "2013-01-07 11:20:12",
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -806,23 +806,23 @@
         },
         {
             "name": "symfony/serializer",
-            "version": "dev-master",
+            "version": "v2.2.0-BETA1",
             "target-dir": "Symfony/Component/Serializer",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Serializer",
-                "reference": "ef3d92815bdb07281ee8cbd73b3e3f9e41bdc1a0"
+                "reference": "v2.2.0-BETA1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/Serializer/archive/ef3d92815bdb07281ee8cbd73b3e3f9e41bdc1a0.zip",
-                "reference": "ef3d92815bdb07281ee8cbd73b3e3f9e41bdc1a0",
+                "url": "https://github.com/symfony/Serializer/archive/v2.2.0-BETA1.zip",
+                "reference": "v2.2.0-BETA1",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
-            "time": "2012-12-19 07:09:49",
+            "time": "2013-01-04 16:58:00",
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -853,23 +853,23 @@
         },
         {
             "name": "symfony/yaml",
-            "version": "dev-master",
+            "version": "v2.2.0-BETA1",
             "target-dir": "Symfony/Component/Yaml",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Yaml",
-                "reference": "365b4df7802b9bb93084d2cc9a51fe88b488f956"
+                "reference": "v2.2.0-BETA1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/Yaml/archive/365b4df7802b9bb93084d2cc9a51fe88b488f956.zip",
-                "reference": "365b4df7802b9bb93084d2cc9a51fe88b488f956",
+                "url": "https://github.com/symfony/Yaml/archive/v2.2.0-BETA1.zip",
+                "reference": "v2.2.0-BETA1",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
-            "time": "2012-12-19 07:09:49",
+            "time": "2013-01-05 17:52:40",
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -900,26 +900,26 @@
         },
         {
             "name": "twig/twig",
-            "version": "v1.11.1",
+            "version": "v1.12.1",
             "source": {
                 "type": "git",
                 "url": "git://github.com/fabpot/Twig.git",
-                "reference": "v1.11.1"
+                "reference": "v1.12.1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/fabpot/Twig/archive/v1.11.1.zip",
-                "reference": "v1.11.1",
+                "url": "https://github.com/fabpot/Twig/archive/v1.12.1.zip",
+                "reference": "v1.12.1",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.2.4"
             },
-            "time": "2012-11-11 17:17:59",
+            "time": "2013-01-15 20:03:52",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.11-dev"
+                    "dev-master": "1.12-dev"
                 }
             },
             "autoload": {
@@ -954,11 +954,16 @@
     ],
     "minimum-stability": "dev",
     "stability-flags": {
-        "twig/twig": 0,
-        "doctrine/common": 0,
-        "guzzle/http": 0,
+        "symfony/class-loader": 10,
+        "symfony/dependency-injection": 10,
+        "symfony/event-dispatcher": 10,
+        "symfony/http-foundation": 10,
+        "symfony/http-kernel": 10,
+        "symfony/routing": 10,
+        "symfony/serializer": 10,
+        "symfony/yaml": 10,
         "kriswallsmith/assetic": 15,
-        "symfony-cmf/routing": 20,
+        "symfony-cmf/routing": 15,
         "easyrdf/easyrdf": 20
     }
 }
diff --git a/core/lib/Drupal/Core/Routing/RouteCompiler.php b/core/lib/Drupal/Core/Routing/RouteCompiler.php
index c71c5ca..a8e8c09 100644
--- a/core/lib/Drupal/Core/Routing/RouteCompiler.php
+++ b/core/lib/Drupal/Core/Routing/RouteCompiler.php
@@ -40,14 +40,14 @@ class RouteCompiler extends SymfonyRouteCompiler implements RouteCompilerInterfa
    * @return \Drupal\Core\Routing\CompiledRoute
    *   A CompiledRoute instance.
    */
-  public function compile(Route $route) {
+  public static function compile(Route $route) {
 
     $symfony_compiled = parent::compile($route);
 
     // The Drupal-specific compiled information.
-    $stripped_path = $this->getPathWithoutDefaults($route);
-    $fit = $this->getFit($stripped_path);
-    $pattern_outline = $this->getPatternOutline($stripped_path);
+    $stripped_path = static::getPathWithoutDefaults($route);
+    $fit = static::getFit($stripped_path);
+    $pattern_outline = static::getPatternOutline($stripped_path);
     $num_parts = count(explode('/', trim($pattern_outline, '/')));
 
     return new CompiledRoute(
@@ -79,7 +79,7 @@ public function compile(Route $route) {
    * @return string
    *   The path pattern outline.
    */
-  public function getPatternOutline($path) {
+  public static function getPatternOutline($path) {
     return preg_replace('#\{\w+\}#', '%', $path);
   }
 
@@ -92,7 +92,7 @@ public function getPatternOutline($path) {
    * @return int
    *   The fitness of the path, as an integer.
    */
-  public function getFit($path) {
+  public static function getFit($path) {
     $parts = explode('/', trim($path, '/'), static::MAX_PARTS);
     $number_parts = count($parts);
     // We store the highest index of parts here to save some work in the fit
@@ -124,7 +124,7 @@ public function getFit($path) {
    * @return string
    *   The path string, stripped of placeholders that have default values.
    */
-  protected function getPathWithoutDefaults(Route $route) {
+  protected static function getPathWithoutDefaults(Route $route) {
     $path = $route->getPattern();
     $defaults = $route->getDefaults();
 
diff --git a/core/vendor/autoload.php b/core/vendor/autoload.php
index 517fa0b..9a32426 100644
--- a/core/vendor/autoload.php
+++ b/core/vendor/autoload.php
@@ -4,4 +4,4 @@
 
 require_once __DIR__ . '/composer' . '/autoload_real.php';
 
-return ComposerAutoloaderInitcb954419c7531cdb839507174df5e8bb::getLoader();
+return ComposerAutoloaderInite27cba1e63dea46e24d25f6bc817bd8c::getLoader();
diff --git a/core/vendor/composer/ClassLoader.php b/core/vendor/composer/ClassLoader.php
index a4a0dc5..596c65d 100644
--- a/core/vendor/composer/ClassLoader.php
+++ b/core/vendor/composer/ClassLoader.php
@@ -75,31 +75,64 @@ public function addClassMap(array $classMap)
     }
 
     /**
-     * Registers a set of classes
+     * Registers a set of classes, merging with any others previously set.
      *
-     * @param string       $prefix The classes prefix
-     * @param array|string $paths  The location(s) of the classes
+     * @param string       $prefix  The classes prefix
+     * @param array|string $paths   The location(s) of the classes
+     * @param bool         $prepend Prepend the location(s)
      */
-    public function add($prefix, $paths)
+    public function add($prefix, $paths, $prepend = false)
     {
         if (!$prefix) {
-            foreach ((array) $paths as $path) {
-                $this->fallbackDirs[] = $path;
+            if ($prepend) {
+                $this->fallbackDirs = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirs
+                );
+            } else {
+                $this->fallbackDirs = array_merge(
+                    $this->fallbackDirs,
+                    (array) $paths
+                );
             }
 
             return;
         }
-        if (isset($this->prefixes[$prefix])) {
+        if (!isset($this->prefixes[$prefix])) {
+            $this->prefixes[$prefix] = (array) $paths;
+
+            return;
+        }
+        if ($prepend) {
+            $this->prefixes[$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixes[$prefix]
+            );
+        } else {
             $this->prefixes[$prefix] = array_merge(
                 $this->prefixes[$prefix],
                 (array) $paths
             );
-        } else {
-            $this->prefixes[$prefix] = (array) $paths;
         }
     }
 
     /**
+     * Registers a set of classes, replacing any others previously set.
+     *
+     * @param string       $prefix  The classes prefix
+     * @param array|string $paths   The location(s) of the classes
+     */
+    public function set($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirs = (array) $paths;
+
+            return;
+        }
+        $this->prefixes[$prefix] = (array) $paths;
+    }
+
+    /**
      * Turns on searching the include path for class files.
      *
      * @param bool $useIncludePath
diff --git a/core/vendor/composer/autoload_real.php b/core/vendor/composer/autoload_real.php
index a7159a2..c278ca7 100644
--- a/core/vendor/composer/autoload_real.php
+++ b/core/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
 
 // autoload_real.php generated by Composer
 
-class ComposerAutoloaderInitcb954419c7531cdb839507174df5e8bb
+class ComposerAutoloaderInite27cba1e63dea46e24d25f6bc817bd8c
 {
     private static $loader;
 
@@ -19,9 +19,9 @@ public static function getLoader()
             return self::$loader;
         }
 
-        spl_autoload_register(array('ComposerAutoloaderInitcb954419c7531cdb839507174df5e8bb', 'loadClassLoader'));
+        spl_autoload_register(array('ComposerAutoloaderInite27cba1e63dea46e24d25f6bc817bd8c', 'loadClassLoader'));
         self::$loader = $loader = new \Composer\Autoload\ClassLoader();
-        spl_autoload_unregister(array('ComposerAutoloaderInitcb954419c7531cdb839507174df5e8bb', 'loadClassLoader'));
+        spl_autoload_unregister(array('ComposerAutoloaderInite27cba1e63dea46e24d25f6bc817bd8c', 'loadClassLoader'));
 
         $vendorDir = dirname(__DIR__);
         $baseDir = dirname($vendorDir);
diff --git a/core/vendor/composer/installed.json b/core/vendor/composer/installed.json
index 4822cd3..a0d263e 100644
--- a/core/vendor/composer/installed.json
+++ b/core/vendor/composer/installed.json
@@ -56,7 +56,7 @@
             {
                 "name": "Johannes Schmitt",
                 "email": "schmittjoh@gmail.com",
-                "homepage": "http://jmsyst.com",
+                "homepage": "https://github.com/schmittjoh",
                 "role": "Developer of wrapped JMSSerializerBundle"
             }
         ],
@@ -72,27 +72,27 @@
     },
     {
         "name": "twig/twig",
-        "version": "v1.11.1",
-        "version_normalized": "1.11.1.0",
+        "version": "v1.12.1",
+        "version_normalized": "1.12.1.0",
         "source": {
             "type": "git",
             "url": "git://github.com/fabpot/Twig.git",
-            "reference": "v1.11.1"
+            "reference": "v1.12.1"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/fabpot/Twig/archive/v1.11.1.zip",
-            "reference": "v1.11.1",
+            "url": "https://github.com/fabpot/Twig/archive/v1.12.1.zip",
+            "reference": "v1.12.1",
             "shasum": ""
         },
         "require": {
             "php": ">=5.2.4"
         },
-        "time": "2012-11-11 17:17:59",
+        "time": "2013-01-15 20:03:52",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.11-dev"
+                "dev-master": "1.12-dev"
             }
         },
         "installation-source": "dist",
@@ -129,18 +129,18 @@
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/Process",
-            "reference": "058ae5038a9623fa64b120a2d10ba81f1ade05c7"
+            "reference": "v2.1.7"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/Process/archive/058ae5038a9623fa64b120a2d10ba81f1ade05c7.zip",
-            "reference": "058ae5038a9623fa64b120a2d10ba81f1ade05c7",
+            "url": "https://github.com/symfony/Process/archive/v2.1.7.zip",
+            "reference": "v2.1.7",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
-        "time": "2012-12-06 10:00:55",
+        "time": "2013-01-16 09:27:54",
         "type": "library",
         "installation-source": "source",
         "autoload": {
@@ -229,89 +229,82 @@
         ]
     },
     {
-        "name": "symfony-cmf/routing",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
-        "target-dir": "Symfony/Cmf/Component/Routing",
+        "name": "guzzle/common",
+        "version": "v3.1.0",
+        "version_normalized": "3.1.0.0",
+        "target-dir": "Guzzle/Common",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony-cmf/Routing",
-            "reference": "1.0.0-alpha3"
+            "url": "git://github.com/guzzle/common.git",
+            "reference": "v3.1.0"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony-cmf/Routing/archive/1.0.0-alpha3.zip",
-            "reference": "1.0.0-alpha3",
+            "url": "https://github.com/guzzle/common/archive/v3.1.0.zip",
+            "reference": "v3.1.0",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.2",
-            "symfony/routing": ">=2.1,<2.3-dev",
-            "symfony/http-kernel": ">=2.1,<2.3-dev"
+            "symfony/event-dispatcher": ">=2.1"
         },
-        "time": "2012-12-16 17:52:57",
+        "time": "2013-01-13 05:14:34",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.0-dev"
+                "dev-master": "3.0-dev"
             }
         },
-        "installation-source": "source",
+        "installation-source": "dist",
         "autoload": {
             "psr-0": {
-                "Symfony\\Cmf\\Component\\Routing": ""
+                "Guzzle\\Common": ""
             }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
             "MIT"
         ],
-        "authors": [
-            {
-                "name": "Symfony CMF Community",
-                "homepage": "https://github.com/symfony-cmf/Routing/contributors"
-            }
-        ],
-        "description": "Extends the Symfony2 routing component for dynamic routes and chaining several routers",
-        "homepage": "http://cmf.symfony.com",
+        "description": "Common libraries used by Guzzle",
+        "homepage": "http://guzzlephp.org/",
         "keywords": [
-            "database",
-            "routing"
+            "event",
+            "exception",
+            "common",
+            "collection"
         ]
     },
     {
-        "name": "symfony/class-loader",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
-        "target-dir": "Symfony/Component/ClassLoader",
+        "name": "guzzle/stream",
+        "version": "v3.1.0",
+        "version_normalized": "3.1.0.0",
+        "target-dir": "Guzzle/Stream",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/ClassLoader",
-            "reference": "0730d0f8f99cfeafbc23271f1e87f54da15f1e06"
+            "url": "https://github.com/guzzle/stream",
+            "reference": "v3.1.0"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/ClassLoader/archive/0730d0f8f99cfeafbc23271f1e87f54da15f1e06.zip",
-            "reference": "0730d0f8f99cfeafbc23271f1e87f54da15f1e06",
+            "url": "https://github.com/guzzle/stream/archive/v3.1.0.zip",
+            "reference": "v3.1.0",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
-        },
-        "require-dev": {
-            "symfony/finder": "2.2.*"
+            "php": ">=5.3.2",
+            "guzzle/common": "self.version"
         },
-        "time": "2013-01-04 16:58:00",
+        "time": "2012-12-07 16:45:11",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.2-dev"
+                "dev-master": "3.0-dev"
             }
         },
-        "installation-source": "source",
+        "installation-source": "dist",
         "autoload": {
             "psr-0": {
-                "Symfony\\Component\\ClassLoader\\": ""
+                "Guzzle\\Stream": ""
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -320,55 +313,99 @@
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
             }
         ],
-        "description": "Symfony ClassLoader Component",
-        "homepage": "http://symfony.com"
+        "description": "Guzzle stream wrapper component",
+        "homepage": "http://guzzlephp.org/",
+        "keywords": [
+            "stream",
+            "Guzzle",
+            "component"
+        ]
     },
     {
-        "name": "symfony/dependency-injection",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
-        "target-dir": "Symfony/Component/DependencyInjection",
+        "name": "guzzle/parser",
+        "version": "v3.1.0",
+        "version_normalized": "3.1.0.0",
+        "target-dir": "Guzzle/Parser",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/DependencyInjection",
-            "reference": "13b47742e1ef22aed78132e5e0930d28571142a4"
+            "url": "git://github.com/guzzle/parser.git",
+            "reference": "v3.1.0"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/DependencyInjection/archive/13b47742e1ef22aed78132e5e0930d28571142a4.zip",
-            "reference": "13b47742e1ef22aed78132e5e0930d28571142a4",
+            "url": "https://github.com/guzzle/parser/archive/v3.1.0.zip",
+            "reference": "v3.1.0",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "php": ">=5.3.2"
         },
-        "require-dev": {
-            "symfony/yaml": "2.2.*",
-            "symfony/config": "2.2.*"
+        "time": "2013-01-12 21:43:21",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.0-dev"
+            }
         },
-        "suggest": {
-            "symfony/yaml": "2.2.*",
-            "symfony/config": "2.2.*"
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Guzzle\\Parser": ""
+            }
         },
-        "time": "2013-01-04 16:58:00",
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "description": "Interchangeable parsers used by Guzzle",
+        "homepage": "http://guzzlephp.org/",
+        "keywords": [
+            "http",
+            "url",
+            "message",
+            "cookie",
+            "URI Template"
+        ]
+    },
+    {
+        "name": "guzzle/http",
+        "version": "v3.1.0",
+        "version_normalized": "3.1.0.0",
+        "target-dir": "Guzzle/Http",
+        "source": {
+            "type": "git",
+            "url": "git://github.com/guzzle/http.git",
+            "reference": "v3.1.0"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://github.com/guzzle/http/archive/v3.1.0.zip",
+            "reference": "v3.1.0",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.2",
+            "ext-curl": "*",
+            "guzzle/common": "self.version",
+            "guzzle/parser": "self.version",
+            "guzzle/stream": "self.version"
+        },
+        "time": "2013-01-13 05:09:32",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.2-dev"
+                "dev-master": "3.0-dev"
             }
         },
-        "installation-source": "source",
+        "installation-source": "dist",
         "autoload": {
             "psr-0": {
-                "Symfony\\Component\\DependencyInjection\\": ""
+                "Guzzle\\Http": ""
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -377,44 +414,41 @@
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
             }
         ],
-        "description": "Symfony DependencyInjection Component",
-        "homepage": "http://symfony.com"
+        "description": "HTTP libraries used by Guzzle",
+        "homepage": "http://guzzlephp.org/",
+        "keywords": [
+            "curl",
+            "http",
+            "http client",
+            "client",
+            "Guzzle"
+        ]
     },
     {
-        "name": "symfony/event-dispatcher",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
-        "target-dir": "Symfony/Component/EventDispatcher",
+        "name": "symfony/http-foundation",
+        "version": "v2.2.0-BETA1",
+        "version_normalized": "2.2.0.0-beta1",
+        "target-dir": "Symfony/Component/HttpFoundation",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/EventDispatcher",
-            "reference": "0fcc9fa82fa3ea7ec2605af2e8137698fbaca3dc"
+            "url": "https://github.com/symfony/HttpFoundation",
+            "reference": "v2.2.0-BETA1"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/EventDispatcher/archive/0fcc9fa82fa3ea7ec2605af2e8137698fbaca3dc.zip",
-            "reference": "0fcc9fa82fa3ea7ec2605af2e8137698fbaca3dc",
+            "url": "https://github.com/symfony/HttpFoundation/archive/v2.2.0-BETA1.zip",
+            "reference": "v2.2.0-BETA1",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
-        "require-dev": {
-            "symfony/dependency-injection": "2.2.*"
-        },
-        "suggest": {
-            "symfony/dependency-injection": "2.2.*",
-            "symfony/http-kernel": "2.2.*"
-        },
-        "time": "2013-01-04 17:02:19",
+        "time": "2013-01-08 18:17:41",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -424,8 +458,11 @@
         "installation-source": "source",
         "autoload": {
             "psr-0": {
-                "Symfony\\Component\\EventDispatcher\\": ""
-            }
+                "Symfony\\Component\\HttpFoundation\\": ""
+            },
+            "classmap": [
+                "Symfony/Component/HttpFoundation/Resources/stubs"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -441,28 +478,35 @@
                 "homepage": "http://symfony.com/contributors"
             }
         ],
-        "description": "Symfony EventDispatcher Component",
+        "description": "Symfony HttpFoundation Component",
         "homepage": "http://symfony.com"
     },
     {
-        "name": "symfony/http-foundation",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
-        "target-dir": "Symfony/Component/HttpFoundation",
+        "name": "symfony/event-dispatcher",
+        "version": "v2.2.0-BETA1",
+        "version_normalized": "2.2.0.0-beta1",
+        "target-dir": "Symfony/Component/EventDispatcher",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/HttpFoundation",
-            "reference": "5aa0119417f1fc8de7513d9432dd2f43f9d9e97b"
+            "url": "https://github.com/symfony/EventDispatcher",
+            "reference": "v2.2.0-BETA1"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/HttpFoundation/archive/5aa0119417f1fc8de7513d9432dd2f43f9d9e97b.zip",
-            "reference": "5aa0119417f1fc8de7513d9432dd2f43f9d9e97b",
+            "url": "https://github.com/symfony/EventDispatcher/archive/v2.2.0-BETA1.zip",
+            "reference": "v2.2.0-BETA1",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
+        "require-dev": {
+            "symfony/dependency-injection": "2.2.*"
+        },
+        "suggest": {
+            "symfony/dependency-injection": "2.2.*",
+            "symfony/http-kernel": "2.2.*"
+        },
         "time": "2013-01-04 17:02:19",
         "type": "library",
         "extra": {
@@ -473,11 +517,8 @@
         "installation-source": "source",
         "autoload": {
             "psr-0": {
-                "Symfony\\Component\\HttpFoundation\\": ""
-            },
-            "classmap": [
-                "Symfony/Component/HttpFoundation/Resources/stubs"
-            ]
+                "Symfony\\Component\\EventDispatcher\\": ""
+            }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -493,23 +534,23 @@
                 "homepage": "http://symfony.com/contributors"
             }
         ],
-        "description": "Symfony HttpFoundation Component",
+        "description": "Symfony EventDispatcher Component",
         "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/http-kernel",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
+        "version": "v2.2.0-BETA1",
+        "version_normalized": "2.2.0.0-beta1",
         "target-dir": "Symfony/Component/HttpKernel",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/HttpKernel",
-            "reference": "ce164c088666b80ffc116173065d504055414137"
+            "reference": "v2.2.0-BETA1"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/HttpKernel/archive/ce164c088666b80ffc116173065d504055414137.zip",
-            "reference": "ce164c088666b80ffc116173065d504055414137",
+            "url": "https://github.com/symfony/HttpKernel/archive/v2.2.0-BETA1.zip",
+            "reference": "v2.2.0-BETA1",
             "shasum": ""
         },
         "require": {
@@ -536,7 +577,7 @@
             "symfony/dependency-injection": "2.2.*",
             "symfony/finder": "2.2.*"
         },
-        "time": "2013-01-04 16:58:00",
+        "time": "2013-01-08 18:55:25",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -568,35 +609,35 @@
     },
     {
         "name": "symfony/routing",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
+        "version": "v2.2.0-BETA1",
+        "version_normalized": "2.2.0.0-beta1",
         "target-dir": "Symfony/Component/Routing",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/Routing",
-            "reference": "87a66890450658ccac99702ac5e4f002ece9e23e"
+            "reference": "v2.2.0-BETA1"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/Routing/archive/87a66890450658ccac99702ac5e4f002ece9e23e.zip",
-            "reference": "87a66890450658ccac99702ac5e4f002ece9e23e",
+            "url": "https://github.com/symfony/Routing/archive/v2.2.0-BETA1.zip",
+            "reference": "v2.2.0-BETA1",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
         "require-dev": {
-            "doctrine/common": ">=2.2,<2.4-dev",
             "symfony/config": "2.2.*",
             "symfony/yaml": "2.2.*",
-            "symfony/http-kernel": "2.2.*"
+            "symfony/http-kernel": "2.2.*",
+            "doctrine/common": ">=2.2,<2.4-dev"
         },
         "suggest": {
-            "doctrine/common": ">=2.2,<2.4-dev",
             "symfony/config": "2.2.*",
-            "symfony/yaml": "2.2.*"
+            "symfony/yaml": "2.2.*",
+            "doctrine/common": ">=2.2,<2.4-dev"
         },
-        "time": "2012-12-28 13:21:48",
+        "time": "2013-01-07 11:20:12",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -627,35 +668,37 @@
         "homepage": "http://symfony.com"
     },
     {
-        "name": "symfony/serializer",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
-        "target-dir": "Symfony/Component/Serializer",
+        "name": "symfony-cmf/routing",
+        "version": "1.0.0-alpha4",
+        "version_normalized": "1.0.0.0-alpha4",
+        "target-dir": "Symfony/Cmf/Component/Routing",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/Serializer",
-            "reference": "ef3d92815bdb07281ee8cbd73b3e3f9e41bdc1a0"
+            "url": "https://github.com/symfony-cmf/Routing",
+            "reference": "1.0.0-alpha4"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/Serializer/archive/ef3d92815bdb07281ee8cbd73b3e3f9e41bdc1a0.zip",
-            "reference": "ef3d92815bdb07281ee8cbd73b3e3f9e41bdc1a0",
+            "url": "https://github.com/symfony-cmf/Routing/archive/1.0.0-alpha4.zip",
+            "reference": "1.0.0-alpha4",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "php": ">=5.3.2",
+            "symfony/routing": ">=2.1,<2.3-dev",
+            "symfony/http-kernel": ">=2.1,<2.3-dev"
         },
-        "time": "2012-12-19 07:09:49",
+        "time": "2013-01-19 22:29:35",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.2-dev"
+                "dev-master": "1.0-dev"
             }
         },
         "installation-source": "source",
         "autoload": {
             "psr-0": {
-                "Symfony\\Component\\Serializer\\": ""
+                "Symfony\\Cmf\\Component\\Routing": ""
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -664,37 +707,40 @@
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
+                "name": "Symfony CMF Community",
+                "homepage": "https://github.com/symfony-cmf/Routing/contributors"
             }
         ],
-        "description": "Symfony Serializer Component",
-        "homepage": "http://symfony.com"
+        "description": "Extends the Symfony2 routing component for dynamic routes and chaining several routers",
+        "homepage": "http://cmf.symfony.com",
+        "keywords": [
+            "database",
+            "routing"
+        ]
     },
     {
-        "name": "symfony/yaml",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
-        "target-dir": "Symfony/Component/Yaml",
+        "name": "symfony/class-loader",
+        "version": "v2.2.0-BETA1",
+        "version_normalized": "2.2.0.0-beta1",
+        "target-dir": "Symfony/Component/ClassLoader",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/Yaml",
-            "reference": "365b4df7802b9bb93084d2cc9a51fe88b488f956"
+            "url": "https://github.com/symfony/ClassLoader",
+            "reference": "v2.2.0-BETA1"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/Yaml/archive/365b4df7802b9bb93084d2cc9a51fe88b488f956.zip",
-            "reference": "365b4df7802b9bb93084d2cc9a51fe88b488f956",
+            "url": "https://github.com/symfony/ClassLoader/archive/v2.2.0-BETA1.zip",
+            "reference": "v2.2.0-BETA1",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
-        "time": "2012-12-19 07:09:49",
+        "require-dev": {
+            "symfony/finder": "2.2.*"
+        },
+        "time": "2013-01-04 16:58:00",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -704,7 +750,7 @@
         "installation-source": "source",
         "autoload": {
             "psr-0": {
-                "Symfony\\Component\\Yaml\\": ""
+                "Symfony\\Component\\ClassLoader\\": ""
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -721,86 +767,88 @@
                 "homepage": "http://symfony.com/contributors"
             }
         ],
-        "description": "Symfony Yaml Component",
+        "description": "Symfony ClassLoader Component",
         "homepage": "http://symfony.com"
     },
     {
-        "name": "guzzle/common",
-        "version": "v3.1.0",
-        "version_normalized": "3.1.0.0",
-        "target-dir": "Guzzle/Common",
+        "name": "symfony/yaml",
+        "version": "v2.2.0-BETA1",
+        "version_normalized": "2.2.0.0-beta1",
+        "target-dir": "Symfony/Component/Yaml",
         "source": {
             "type": "git",
-            "url": "git://github.com/guzzle/common.git",
-            "reference": "v3.1.0"
+            "url": "https://github.com/symfony/Yaml",
+            "reference": "v2.2.0-BETA1"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/guzzle/common/archive/v3.1.0.zip",
-            "reference": "v3.1.0",
+            "url": "https://github.com/symfony/Yaml/archive/v2.2.0-BETA1.zip",
+            "reference": "v2.2.0-BETA1",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.2",
-            "symfony/event-dispatcher": ">=2.1"
+            "php": ">=5.3.3"
         },
-        "time": "2013-01-13 05:14:34",
+        "time": "2013-01-05 17:52:40",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "3.0-dev"
+                "dev-master": "2.2-dev"
             }
         },
-        "installation-source": "dist",
+        "installation-source": "source",
         "autoload": {
             "psr-0": {
-                "Guzzle\\Common": ""
+                "Symfony\\Component\\Yaml\\": ""
             }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
             "MIT"
         ],
-        "description": "Common libraries used by Guzzle",
-        "homepage": "http://guzzlephp.org/",
-        "keywords": [
-            "event",
-            "exception",
-            "common",
-            "collection"
-        ]
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "http://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony Yaml Component",
+        "homepage": "http://symfony.com"
     },
     {
-        "name": "guzzle/stream",
-        "version": "v3.1.0",
-        "version_normalized": "3.1.0.0",
-        "target-dir": "Guzzle/Stream",
+        "name": "symfony/serializer",
+        "version": "v2.2.0-BETA1",
+        "version_normalized": "2.2.0.0-beta1",
+        "target-dir": "Symfony/Component/Serializer",
         "source": {
             "type": "git",
-            "url": "https://github.com/guzzle/stream",
-            "reference": "v3.1.0"
+            "url": "https://github.com/symfony/Serializer",
+            "reference": "v2.2.0-BETA1"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/guzzle/stream/archive/v3.1.0.zip",
-            "reference": "v3.1.0",
+            "url": "https://github.com/symfony/Serializer/archive/v2.2.0-BETA1.zip",
+            "reference": "v2.2.0-BETA1",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.2",
-            "guzzle/common": "self.version"
+            "php": ">=5.3.3"
         },
-        "time": "2012-12-07 16:45:11",
+        "time": "2013-01-04 16:58:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "3.0-dev"
+                "dev-master": "2.2-dev"
             }
         },
-        "installation-source": "dist",
+        "installation-source": "source",
         "autoload": {
             "psr-0": {
-                "Guzzle\\Stream": ""
+                "Symfony\\Component\\Serializer\\": ""
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -809,99 +857,55 @@
         ],
         "authors": [
             {
-                "name": "Michael Dowling",
-                "email": "mtdowling@gmail.com",
-                "homepage": "https://github.com/mtdowling"
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "http://symfony.com/contributors"
             }
         ],
-        "description": "Guzzle stream wrapper component",
-        "homepage": "http://guzzlephp.org/",
-        "keywords": [
-            "stream",
-            "Guzzle",
-            "component"
-        ]
+        "description": "Symfony Serializer Component",
+        "homepage": "http://symfony.com"
     },
     {
-        "name": "guzzle/parser",
-        "version": "v3.1.0",
-        "version_normalized": "3.1.0.0",
-        "target-dir": "Guzzle/Parser",
+        "name": "symfony/dependency-injection",
+        "version": "v2.2.0-BETA1",
+        "version_normalized": "2.2.0.0-beta1",
+        "target-dir": "Symfony/Component/DependencyInjection",
         "source": {
             "type": "git",
-            "url": "git://github.com/guzzle/parser.git",
-            "reference": "v3.1.0"
+            "url": "https://github.com/symfony/DependencyInjection",
+            "reference": "v2.2.0-BETA1"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/guzzle/parser/archive/v3.1.0.zip",
-            "reference": "v3.1.0",
+            "url": "https://github.com/symfony/DependencyInjection/archive/v2.2.0-BETA1.zip",
+            "reference": "v2.2.0-BETA1",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.2"
-        },
-        "time": "2013-01-12 21:43:21",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "3.0-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-0": {
-                "Guzzle\\Parser": ""
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "description": "Interchangeable parsers used by Guzzle",
-        "homepage": "http://guzzlephp.org/",
-        "keywords": [
-            "http",
-            "url",
-            "message",
-            "cookie",
-            "URI Template"
-        ]
-    },
-    {
-        "name": "guzzle/http",
-        "version": "v3.1.0",
-        "version_normalized": "3.1.0.0",
-        "target-dir": "Guzzle/Http",
-        "source": {
-            "type": "git",
-            "url": "git://github.com/guzzle/http.git",
-            "reference": "v3.1.0"
+            "php": ">=5.3.3"
         },
-        "dist": {
-            "type": "zip",
-            "url": "https://github.com/guzzle/http/archive/v3.1.0.zip",
-            "reference": "v3.1.0",
-            "shasum": ""
+        "require-dev": {
+            "symfony/yaml": "2.2.*",
+            "symfony/config": "2.2.*"
         },
-        "require": {
-            "php": ">=5.3.2",
-            "ext-curl": "*",
-            "guzzle/common": "self.version",
-            "guzzle/parser": "self.version",
-            "guzzle/stream": "self.version"
+        "suggest": {
+            "symfony/yaml": "2.2.*",
+            "symfony/config": "2.2.*"
         },
-        "time": "2013-01-13 05:09:32",
+        "time": "2013-01-08 18:17:41",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "3.0-dev"
+                "dev-master": "2.2-dev"
             }
         },
-        "installation-source": "dist",
+        "installation-source": "source",
         "autoload": {
             "psr-0": {
-                "Guzzle\\Http": ""
+                "Symfony\\Component\\DependencyInjection\\": ""
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -910,20 +914,16 @@
         ],
         "authors": [
             {
-                "name": "Michael Dowling",
-                "email": "mtdowling@gmail.com",
-                "homepage": "https://github.com/mtdowling"
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "http://symfony.com/contributors"
             }
         ],
-        "description": "HTTP libraries used by Guzzle",
-        "homepage": "http://guzzlephp.org/",
-        "keywords": [
-            "curl",
-            "http",
-            "http client",
-            "client",
-            "Guzzle"
-        ]
+        "description": "Symfony DependencyInjection Component",
+        "homepage": "http://symfony.com"
     },
     {
         "name": "easyrdf/easyrdf",
@@ -932,12 +932,12 @@
         "source": {
             "type": "git",
             "url": "git://github.com/njh/easyrdf.git",
-            "reference": "d1c363bd04cd55169fbefe52328e86031c6db3a2"
+            "reference": "7ea07f2"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/njh/easyrdf/archive/d1c363bd04cd55169fbefe52328e86031c6db3a2.zip",
-            "reference": "d1c363bd04cd55169fbefe52328e86031c6db3a2",
+            "url": "https://github.com/njh/easyrdf/archive/7ea07f2061000a2c3018f7bba51c653200bd0877.zip",
+            "reference": "7ea07f2",
             "shasum": ""
         },
         "require": {
@@ -951,7 +951,7 @@
             "squizlabs/php_codesniffer": ">=1.4.3",
             "sami/sami": "dev-master"
         },
-        "time": "2013-01-13 01:20:04",
+        "time": "2013-01-19 13:23:52",
         "type": "library",
         "installation-source": "source",
         "autoload": {
diff --git a/core/vendor/easyrdf/easyrdf/.gitignore b/core/vendor/easyrdf/easyrdf/.gitignore
index 83892d7..0322862 100644
--- a/core/vendor/easyrdf/easyrdf/.gitignore
+++ b/core/vendor/easyrdf/easyrdf/.gitignore
@@ -1,5 +1,5 @@
 doap.rdf
-docs
+docs/api
 samicache
 lib/arc/
 reports
diff --git a/core/vendor/easyrdf/easyrdf/Makefile b/core/vendor/easyrdf/easyrdf/Makefile
index fe45368..a757d82 100644
--- a/core/vendor/easyrdf/easyrdf/Makefile
+++ b/core/vendor/easyrdf/easyrdf/Makefile
@@ -9,6 +9,12 @@ PHPCS = vendor/bin/phpcs
 PHPCS_FLAGS = --standard=./config/phpcs_ruleset.xml --encoding=utf8 --extensions=php
 SAMI = vendor/bin/sami.php
 
+# Composer doesn't work with bsdtar - try and use GNU tar
+TAR = $(shell which gtar || which gnutar || which tar)
+
+# Disable copying extended attributes and resource forks on Mac OS X
+export COPYFILE_DISABLE=true
+
 EXAMPLE_FILES = examples/*.php
 SOURCE_FILES = lib/EasyRdf.php \
                lib/EasyRdf/*.php \
@@ -21,15 +27,17 @@ TEST_SUPPORT = Makefile test/cli_example_wrapper.php \
                test/EasyRdf/Http/MockClient.php \
                test/EasyRdf/Serialiser/NtriplesArray.php \
                test/fixtures/*
-DOC_FILES = composer.json \
-            doap.rdf \
-            docs/api \
-            README.md \
-            LICENSE.md \
-            CHANGELOG.md
+DOC_FILES = docs/*.md \
+            docs/api
+INFO_FILES = composer.json \
+             doap.rdf \
+             README.md \
+             LICENSE.md \
+             CHANGELOG.md
 
 DISTFILES = $(EXAMPLE_FILES) $(SOURCE_FILES) $(TEST_FILES) \
-            $(TEST_SUPPORT) $(DOC_FILES)
+            $(TEST_SUPPORT) $(INFO_FILES) $(DOC_FILES)
+
 
 .DEFAULT: help
 all: help
@@ -52,7 +60,7 @@ test-lib: $(PHPUNIT)
 	mkdir -p reports
 	$(PHP) $(PHPUNIT) $(PHPUNIT_FLAGS) --testsuite "EasyRdf Library"
 
-# TARGET:coverage            Run the library tests and generate a code coverage report
+# TARGET:coverage            Run library tests and generate coverage report
 .PHONY: coverage
 coverage: $(PHPUNIT)
 	mkdir -p reports/coverage
@@ -65,7 +73,7 @@ apidocs: $(SAMI)
 
 docs/api: apidocs
 
-doap.rdf: doap.php composer.json
+doap.rdf: doap.php composer.json vendor/autoload.php
 	$(PHP) doap.php > doap.rdf
 
 # TARGET:cs                  Check the code style of the PHP source code
@@ -80,23 +88,30 @@ lint: $(EXAMPLE_FILES) $(SOURCE_FILES) $(TEST_FILES)
 	  $(PHP) -l $$file || exit -1; \
 	done
 
-# TARGET:dist                Build tarball for distribution
+# TARGET:dist                Build archives for distribution
 .PHONY: dist
-dist: $(distdir)
-	tar zcf $(distdir).tar.gz $(distdir)
+dist: $(distdir).tar.gz
 	rm -Rf $(distdir)
-	@echo "Created $(distdir).tar.gz"
+	@echo "Done."
+
+%.tar.gz: %
+	$(TAR) zcf $@ $^
 
 $(distdir): $(DISTFILES)
+	$(gatherfiles)
+
+define gatherfiles
 	@for file in $^; do  \
-		dir=$(distdir)/`dirname "$$file"`; \
+		dir=$@/`dirname "$$file"`; \
 		test -d "$$dir" || mkdir -p "$$dir" || exit -1; \
-		cp -Rfp "$$file" "$(distdir)/$$file" || exit -1; \
+		cp -Rfp "$$file" "$@/$$file" || exit -1; \
 	done
+endef
 
 # TARGET:clean               Delete any temporary and generated files
 .PHONY: clean
 clean:
+	find . -name '.DS_Store' -type f -delete
 	-rm -Rf $(distdir) reports vendor
 	-rm -Rf docs/api samicache
 	-rm -f composer.phar composer.lock
@@ -131,6 +146,7 @@ composer-install: composer.phar
 composer-update: clean composer.phar
 	$(PHP) composer.phar $(COMPOSER_FLAGS) update --dev
 
+vendor/autoload.php: composer-install
 vendor/bin/phpunit: composer-install
 vendor/bin/phpcs: composer-install
 vendor/bin/sami.php: composer-install
diff --git a/core/vendor/easyrdf/easyrdf/README.md b/core/vendor/easyrdf/easyrdf/README.md
index 3a71ccd..182b1a5 100644
--- a/core/vendor/easyrdf/easyrdf/README.md
+++ b/core/vendor/easyrdf/easyrdf/README.md
@@ -64,31 +64,6 @@ Features
 * Comes with a number of examples
 
 
-Property Paths
---------------
-
-EasyRdf supports querying the data in a graph using basic property paths.
-This is a small subset of the property paths described in [SPARQL 1.1 query language].
-
-
-You may use the caret character (^) to get an inverse property, for example:
-
-    $person = $homepage->get('^foaf:homepage');
-
-You can use the pipe character (|) to get alternate properties, for example:
-
-    $title = $document->get('dc:title|dc11:title');
-
-You can use a forward slash (/) to follow a property sequence, for example to get
-the names of all my friends:
-
-    $names = $me->all('foaf:knows/foaf:name');
-
-Finally, in order to use a full property URI, enclose it in angle brackets:
-
-    $name = $me->get('<http://xmlns.com/foaf/0.1/name>');
-
-
 More Examples
 -------------
 
diff --git a/core/vendor/easyrdf/easyrdf/composer.json b/core/vendor/easyrdf/easyrdf/composer.json
index 8ce254e..c93d98d 100644
--- a/core/vendor/easyrdf/easyrdf/composer.json
+++ b/core/vendor/easyrdf/easyrdf/composer.json
@@ -1,7 +1,7 @@
 {
     "name": "easyrdf/easyrdf",
     "description": "EasyRdf is a PHP library designed to make it easy to consume and produce RDF.",
-    "version": "0.8.0",
+    "version": "0.8.0-beta.1",
     "type": "library",
     "keywords": ["RDF", "Semantic Web", "Linked Data", "Turtle", "RDFa"],
     "homepage": "http://www.easyrdf.org/",
diff --git a/core/vendor/easyrdf/easyrdf/doap.php b/core/vendor/easyrdf/easyrdf/doap.php
index 60274ff..ff9f190 100644
--- a/core/vendor/easyrdf/easyrdf/doap.php
+++ b/core/vendor/easyrdf/easyrdf/doap.php
@@ -1,9 +1,8 @@
 <?php
-    set_include_path(get_include_path() . PATH_SEPARATOR . './lib/');
-    require_once "EasyRdf.php";
+    require_once "vendor/autoload.php";
 
     // Load some properties from the composer file
-    $composer = json_decode(file_get_contents('composer.json'));
+    $composer = json_decode(file_get_contents(__DIR__."/composer.json"));
 
     // Start building up a RDF graph
     $doap = new EasyRdf_Graph($composer->homepage.'doap.rdf');
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/ConfigurableUrlMatcher.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/ConfigurableUrlMatcher.php
index e1e17b5..40b7711 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/ConfigurableUrlMatcher.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/ConfigurableUrlMatcher.php
@@ -36,17 +36,19 @@ public function finalMatch(RouteCollection $collection, Request $request)
         $attributes = $matcher->match($request->getPathInfo());
 
         // cleanup route attributes
-        if (! isset($attributes['_route']) || ! $attributes['_route'] instanceof Route) {
-            $name = $attributes['_route'];
-            $route = $collection->get($attributes['_route']);
-            $attributes['_route'] = $route;
+        if (! isset($attributes[RouteObjectInterface::ROUTE_OBJECT])
+            || ! $attributes[RouteObjectInterface::ROUTE_OBJECT] instanceof Route
+        ) {
+            $name = $attributes['_route']; // this is the field coming from symfony core
+            $route = $collection->get($name);
+            $attributes[RouteObjectInterface::ROUTE_OBJECT] = $route;
 
             if ($route instanceof RouteObjectInterface && is_string($route->getRouteKey())) {
                 $name = $route->getRouteKey();
             }
 
-            if (empty($attributes['_route_name']) && is_string($name)) {
-                $attributes['_route_name'] = $name;
+            if (is_string($name)) {
+                $attributes[RouteObjectInterface::ROUTE_NAME] = $name;
             }
         }
 
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/UrlMatcher.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/UrlMatcher.php
index 09bb2c4..aac6fe7 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/UrlMatcher.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/UrlMatcher.php
@@ -39,8 +39,8 @@ protected function getAttributes(Route $route, $name, array $attributes)
         if ($route instanceof RouteObjectInterface && is_string($route->getRouteKey())) {
             $name = $route->getRouteKey();
         }
-        $attributes['_route_name'] = $name;
-        $attributes['_route'] = $route;
+        $attributes[RouteObjectInterface::ROUTE_NAME] = $name;
+        $attributes[RouteObjectInterface::ROUTE_OBJECT] = $route;
         return $this->mergeDefaults($attributes, $route->getDefaults());
     }
 }
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ProviderBasedGenerator.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ProviderBasedGenerator.php
index 6492667..1c353f8 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ProviderBasedGenerator.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ProviderBasedGenerator.php
@@ -6,6 +6,7 @@
 use Symfony\Component\Routing\Exception\RouteNotFoundException;
 
 use Symfony\Component\Routing\Generator\UrlGenerator;
+use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\Log\LoggerInterface;
 
 use Symfony\Cmf\Component\Routing\RouteProviderInterface;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteObjectInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteObjectInterface.php
index 496e3cc..cd455e1 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteObjectInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteObjectInterface.php
@@ -17,6 +17,16 @@
 interface RouteObjectInterface
 {
     /**
+     * Field name that will hold the route name that was matched.
+     */
+    const ROUTE_NAME = '_route';
+
+    /**
+     * Field name of the route object that was matched.
+     */
+    const ROUTE_OBJECT = '_route_object';
+
+    /**
      * Constant for the field that is given to the ControllerAliasMapper.
      * The value must be configured in the controllers_by_alias mapping.
      *
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteContentEnhancerTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteContentEnhancerTest.php
index df9008a..f097e85 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteContentEnhancerTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteContentEnhancerTest.php
@@ -5,6 +5,7 @@
 use Symfony\Component\HttpFoundation\Request;
 
 use Symfony\Cmf\Component\Routing\Enhancer\RouteContentEnhancer;
+use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 
 use Symfony\Cmf\Component\Routing\Test\CmfUnitTestCase;
 
@@ -22,7 +23,7 @@ public function setUp()
         $this->document = $this->buildMock('Symfony\\Cmf\\Component\\Routing\\Tests\\Enhancer\\RouteObject',
                                             array('getRouteContent', 'getRouteDefaults', 'getUrl'));
 
-        $this->mapper = new RouteContentEnhancer('_route', '_content');
+        $this->mapper = new RouteContentEnhancer(RouteObjectInterface::ROUTE_OBJECT, '_content');
 
         $this->request = Request::create('/test');
     }
@@ -34,8 +35,8 @@ public function testContent()
             ->method('getRouteContent')
             ->will($this->returnValue($targetDocument));
 
-        $defaults = array('_route' => $this->document);
-        $expected = array('_route' => $this->document, '_content' => $targetDocument);
+        $defaults = array(RouteObjectInterface::ROUTE_OBJECT => $this->document);
+        $expected = array(RouteObjectInterface::ROUTE_OBJECT => $this->document, '_content' => $targetDocument);
 
         $this->assertEquals($expected, $this->mapper->enhance($defaults, $this->request));
     }
@@ -47,7 +48,7 @@ public function testFieldAlreadyThere()
             ->method('getRouteContent')
         ;
 
-        $defaults = array('_route' => $this->document, '_content' => 'foo');
+        $defaults = array(RouteObjectInterface::ROUTE_OBJECT => $this->document, '_content' => 'foo');
 
         $this->assertEquals($defaults, $this->mapper->enhance($defaults, $this->request));
     }
@@ -58,13 +59,13 @@ public function testNoContent()
             ->method('getRouteContent')
             ->will($this->returnValue(null));
 
-        $defaults = array('_route' => $this->document);
+        $defaults = array(RouteObjectInterface::ROUTE_OBJECT => $this->document);
         $this->assertEquals($defaults, $this->mapper->enhance($defaults, $this->request));
     }
 
     public function testNoCmfRoute()
     {
-        $defaults = array('_route' => $this->buildMock('Symfony\\Component\\Routing\\Route'));
+        $defaults = array(RouteObjectInterface::ROUTE_OBJECT => $this->buildMock('Symfony\\Component\\Routing\\Route'));
         $this->assertEquals($defaults, $this->mapper->enhance($defaults, $this->request));
     }
 }
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/ConfigurableUrlMatcherTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/ConfigurableUrlMatcherTest.php
index 18bcae7..1d672ad 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/ConfigurableUrlMatcherTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/ConfigurableUrlMatcherTest.php
@@ -51,7 +51,12 @@ public function testMatch()
             ->method('getDefaults')
             ->will($this->returnValue(array('foo' => 'bar')))
         ;
+        $this->routeDocument->expects($this->any())
+            ->method('getRouteKey')
+            ->will($this->returnValue('/routes/company/more'))
+        ;
 
+        // add some other routes to the collection
         $mockCompiled = $this->buildMock('Symfony\\Component\\Routing\\CompiledRoute');
         $mockCompiled->expects($this->any())
             ->method('getStaticPrefix')
@@ -62,6 +67,7 @@ public function testMatch()
             ->method('compile')
             ->will($this->returnValue($mockCompiled))
         ;
+
         $routeCollection = new RouteCollection();
         $routeCollection->add('some', $mockRoute);
         $routeCollection->add('_company_more', $this->routeDocument);
@@ -69,9 +75,10 @@ public function testMatch()
 
         $results = $this->matcher->finalMatch($routeCollection, $this->request);
 
+        // the matched route returns a key
         $expected = array(
-            '_route_name' => '_company_more',
-            '_route' => $this->routeDocument,
+            RouteObjectInterface::ROUTE_NAME => '/routes/company/more',
+            RouteObjectInterface::ROUTE_OBJECT => $this->routeDocument,
             'foo' => 'bar',
         );
 
@@ -118,9 +125,10 @@ public function testMatchNoRouteObject()
 
         $results = $this->matcher->finalMatch($routeCollection, $this->request);
 
+        // the matched route does not return a key
         $expected = array(
-            '_route_name' => '_company_more',
-            '_route' => $this->routeDocument,
+            RouteObjectInterface::ROUTE_NAME => '_company_more',
+            RouteObjectInterface::ROUTE_OBJECT => $this->routeDocument,
             'foo' => 'bar',
         );
 
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/UrlMatcherTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/UrlMatcherTest.php
index 08a1dec..66e99d1 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/UrlMatcherTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/UrlMatcherTest.php
@@ -89,8 +89,8 @@ public function doTestMatchRouteKey($routeKey)
         $results = $this->matcher->finalMatch($routeCollection, $this->request);
 
         $expected = array(
-            '_route_name' => ($routeKey) ? $routeKey : '_company_more',
-            '_route' => $this->routeDocument,
+            RouteObjectInterface::ROUTE_NAME => ($routeKey) ? $routeKey : '_company_more',
+            RouteObjectInterface::ROUTE_OBJECT => $this->routeDocument,
             'foo' => 'bar',
         );
 
@@ -138,8 +138,8 @@ public function testMatchNoRouteObject()
         $results = $this->matcher->finalMatch($routeCollection, $this->request);
 
         $expected = array(
-            '_route_name' => '_company_more',
-            '_route' => $this->routeDocument,
+            RouteObjectInterface::ROUTE_NAME => '_company_more',
+            RouteObjectInterface::ROUTE_OBJECT => $this->routeDocument,
             'foo' => 'bar',
         );
 
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php
index c69d078..6fad9a2 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php
@@ -89,7 +89,7 @@ private function processArguments(array $arguments, $inMethodCall = false)
 
                 // resolve invalid behavior
                 if ($exists && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
-                    $arguments[$k] = new Reference($id);
+                    $arguments[$k] = new Reference($id, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, $argument->isStrict());
                 } elseif (!$exists && ContainerInterface::NULL_ON_INVALID_REFERENCE === $invalidBehavior) {
                     $arguments[$k] = null;
                 } elseif (!$exists && ContainerInterface::IGNORE_ON_INVALID_REFERENCE === $invalidBehavior) {
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
index eb099d2..22aabf2 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
@@ -203,7 +203,7 @@ private function addServiceInlinedDefinitions($id, $definition)
                 $nbOccurrences->offsetSet($definition, 1);
             } else {
                 $i = $nbOccurrences->offsetGet($definition);
-                $nbOccurrences->offsetSet($definition, $i+1);
+                $nbOccurrences->offsetSet($definition, $i + 1);
             }
         }
 
@@ -214,7 +214,7 @@ private function addServiceInlinedDefinitions($id, $definition)
             $processed->offsetSet($sDefinition);
 
             $class = $this->dumpValue($sDefinition->getClass());
-            if ($nbOccurrences->offsetGet($sDefinition) > 1 || count($sDefinition->getMethodCalls()) > 0 || $sDefinition->getProperties() || null !== $sDefinition->getConfigurator() || false !== strpos($class, '$')) {
+            if ($nbOccurrences->offsetGet($sDefinition) > 1 || $sDefinition->getMethodCalls() || $sDefinition->getProperties() || null !== $sDefinition->getConfigurator() || false !== strpos($class, '$')) {
                 $name = $this->getNextVariableName();
                 $variableMap->offsetSet($sDefinition, new Variable($name));
 
@@ -229,26 +229,9 @@ private function addServiceInlinedDefinitions($id, $definition)
                     throw new ServiceCircularReferenceException($id, array($id));
                 }
 
-                $arguments = array();
-                foreach ($sDefinition->getArguments() as $argument) {
-                    $arguments[] = $this->dumpValue($argument);
-                }
-
-                if (null !== $sDefinition->getFactoryMethod()) {
-                    if (null !== $sDefinition->getFactoryClass()) {
-                        $code .= sprintf("        \$%s = call_user_func(array(%s, '%s')%s);\n", $name, $this->dumpValue($sDefinition->getFactoryClass()), $sDefinition->getFactoryMethod(), count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
-                    } elseif (null !== $sDefinition->getFactoryService()) {
-                        $code .= sprintf("        \$%s = %s->%s(%s);\n", $name, $this->getServiceCall($sDefinition->getFactoryService()), $sDefinition->getFactoryMethod(), implode(', ', $arguments));
-                    } else {
-                        throw new RuntimeException('Factory service or factory class must be defined in service definition for '.$id);
-                    }
-                } elseif (false !== strpos($class, '$')) {
-                    $code .= sprintf("        \$class = %s;\n        \$%s = new \$class(%s);\n", $class, $name, implode(', ', $arguments));
-                } else {
-                    $code .= sprintf("        \$%s = new \\%s(%s);\n", $name, substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
-                }
+                $code .= $this->addNewInstance($id, $sDefinition, '$'.$name, ' = ');
 
-                if (!$this->hasReference($id, $sDefinition->getMethodCalls()) && !$this->hasReference($id, $sDefinition->getProperties())) {
+                if (!$this->hasReference($id, $sDefinition->getMethodCalls(), true) && !$this->hasReference($id, $sDefinition->getProperties(), true)) {
                     $code .= $this->addServiceMethodCalls(null, $sDefinition, $name);
                     $code .= $this->addServiceProperties(null, $sDefinition, $name);
                     $code .= $this->addServiceConfigurator(null, $sDefinition, $name);
@@ -297,11 +280,6 @@ private function addServiceInstance($id, $definition)
             throw new InvalidArgumentException(sprintf('"%s" is not a valid class name for the "%s" service.', $class, $id));
         }
 
-        $arguments = array();
-        foreach ($definition->getArguments() as $value) {
-            $arguments[] = $this->dumpValue($value);
-        }
-
         $simple = $this->isSimpleInstance($id, $definition);
 
         $instantiation = '';
@@ -320,19 +298,7 @@ private function addServiceInstance($id, $definition)
             $instantiation .= ' = ';
         }
 
-        if (null !== $definition->getFactoryMethod()) {
-            if (null !== $definition->getFactoryClass()) {
-                $code = sprintf("        $return{$instantiation}call_user_func(array(%s, '%s')%s);\n", $this->dumpValue($definition->getFactoryClass()), $definition->getFactoryMethod(), $arguments ? ', '.implode(', ', $arguments) : '');
-            } elseif (null !== $definition->getFactoryService()) {
-                $code = sprintf("        $return{$instantiation}%s->%s(%s);\n", $this->getServiceCall($definition->getFactoryService()), $definition->getFactoryMethod(), implode(', ', $arguments));
-            } else {
-                throw new RuntimeException('Factory method requires a factory service or factory class in service definition for '.$id);
-            }
-        } elseif (false !== strpos($class, '$')) {
-            $code = sprintf("        \$class = %s;\n\n        $return{$instantiation}new \$class(%s);\n", $class, implode(', ', $arguments));
-        } else {
-            $code = sprintf("        $return{$instantiation}new \\%s(%s);\n", substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
-        }
+        $code = $this->addNewInstance($id, $definition, $return, $instantiation);
 
         if (!$simple) {
             $code .= "\n";
@@ -417,16 +383,14 @@ private function addServiceInlinedDefinitionsSetup($id, $definition)
             }
             $processed->offsetSet($iDefinition);
 
-            if (!$this->hasReference($id, $iDefinition->getMethodCalls())) {
+            if (!$this->hasReference($id, $iDefinition->getMethodCalls(), true) && !$this->hasReference($id, $iDefinition->getProperties(), true)) {
                 continue;
             }
 
-            if ($iDefinition->getMethodCalls()) {
-                $code .= $this->addServiceMethodCalls(null, $iDefinition, (string) $this->definitionVariables->offsetGet($iDefinition));
-            }
-            if ($iDefinition->getConfigurator()) {
-                $code .= $this->addServiceConfigurator(null, $iDefinition, (string) $this->definitionVariables->offsetGet($iDefinition));
-            }
+            $name = (string) $this->definitionVariables->offsetGet($iDefinition);
+            $code .= $this->addServiceMethodCalls(null, $iDefinition, $name);
+            $code .= $this->addServiceProperties(null, $iDefinition, $name);
+            $code .= $this->addServiceConfigurator(null, $iDefinition, $name);
         }
 
         if ('' !== $code) {
@@ -613,6 +577,34 @@ private function addServices()
         return $publicServices.$aliasServices.$privateServices;
     }
 
+    private function addNewInstance($id, Definition $definition, $return, $instantiation)
+    {
+        $class = $this->dumpValue($definition->getClass());
+
+        $arguments = array();
+        foreach ($definition->getArguments() as $value) {
+            $arguments[] = $this->dumpValue($value);
+        }
+
+        if (null !== $definition->getFactoryMethod()) {
+            if (null !== $definition->getFactoryClass()) {
+                return sprintf("        $return{$instantiation}call_user_func(array(%s, '%s')%s);\n", $this->dumpValue($definition->getFactoryClass()), $definition->getFactoryMethod(), $arguments ? ', '.implode(', ', $arguments) : '');
+            }
+
+            if (null !== $definition->getFactoryService()) {
+                return sprintf("        $return{$instantiation}%s->%s(%s);\n", $this->getServiceCall($definition->getFactoryService()), $definition->getFactoryMethod(), implode(', ', $arguments));
+            }
+
+            throw new RuntimeException('Factory method requires a factory service or factory class in service definition for '.$id);
+        }
+
+        if (false !== strpos($class, '$')) {
+            return sprintf("        \$class = %s;\n\n        $return{$instantiation}new \$class(%s);\n", $class, implode(', ', $arguments));
+        }
+
+        return sprintf("        $return{$instantiation}new \\%s(%s);\n", substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
+    }
+
     /**
      * Adds the class headers.
      *
@@ -965,17 +957,26 @@ private function getDefinitionsFromArguments(array $arguments)
      *
      * @return Boolean
      */
-    private function hasReference($id, array $arguments)
+    private function hasReference($id, array $arguments, $deep = false)
     {
         foreach ($arguments as $argument) {
             if (is_array($argument)) {
-                if ($this->hasReference($id, $argument)) {
+                if ($this->hasReference($id, $argument, $deep)) {
                     return true;
                 }
             } elseif ($argument instanceof Reference) {
                 if ($id === (string) $argument) {
                     return true;
                 }
+
+                if ($deep) {
+                    $service = $this->container->getDefinition((string) $argument);
+                    $arguments = array_merge($service->getMethodCalls(), $service->getArguments(), $service->getProperties());
+
+                    if ($this->hasReference($id, $arguments, $deep)) {
+                        return true;
+                    }
+                }
             }
         }
 
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.php b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.php
index cbf9934..e71835e 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.php
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.php
@@ -31,7 +31,7 @@ public function testProcess()
     }
 
     /**
-     * @expectedException Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
+     * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
      */
     public function testProcessThrowsExceptionOnInvalidReference()
     {
@@ -46,7 +46,7 @@ public function testProcessThrowsExceptionOnInvalidReference()
     }
 
     /**
-     * @expectedException Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
+     * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
      */
     public function testProcessThrowsExceptionOnInvalidReferenceFromInlinedDefinition()
     {
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInvalidReferencesPassTest.php b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInvalidReferencesPassTest.php
index a18ba73..7205886 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInvalidReferencesPassTest.php
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInvalidReferencesPassTest.php
@@ -61,6 +61,20 @@ public function testProcessRemovesPropertiesOnInvalid()
         $this->assertEquals(array(), $def->getProperties());
     }
 
+    public function testStrictFlagIsPreserved()
+    {
+        $container = new ContainerBuilder();
+        $container->register('bar');
+        $def = $container
+            ->register('foo')
+            ->addArgument(new Reference('bar', ContainerInterface::NULL_ON_INVALID_REFERENCE, false))
+        ;
+
+        $this->process($container);
+
+        $this->assertFalse($def->getArgument(0)->isStrict());
+    }
+
     protected function process(ContainerBuilder $container)
     {
         $pass = new ResolveInvalidReferencesPass();
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php
index 46ea75d..89f7ae1 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php
@@ -96,7 +96,7 @@ public function testMethodCalls()
     }
 
     /**
-     * @expectedException Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+     * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
      * @expectedExceptionMessage Method name cannot be empty.
      */
     public function testExceptionOnEmptyMethodCall()
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
index 2697852..72d587f 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
@@ -98,10 +98,17 @@ public function testAddParameters()
 
     public function testAddService()
     {
+        // without compilation
         $container = include self::$fixturesPath.'/containers/container9.php';
         $dumper = new PhpDumper($container);
         $this->assertEquals(str_replace('%path%', str_replace('\\','\\\\',self::$fixturesPath.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR), file_get_contents(self::$fixturesPath.'/php/services9.php')), $dumper->dump(), '->dump() dumps services');
 
+        // with compilation
+        $container = include self::$fixturesPath.'/containers/container9.php';
+        $container->compile();
+        $dumper = new PhpDumper($container);
+        $this->assertEquals(str_replace('%path%', str_replace('\\','\\\\',self::$fixturesPath.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR), file_get_contents(self::$fixturesPath.'/php/services9_compiled.php')), $dumper->dump(), '->dump() dumps services');
+
         $dumper = new PhpDumper($container = new ContainerBuilder());
         $container->register('foo', 'FooClass')->addArgument(new \stdClass());
         try {
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container9.php b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container9.php
index 663f2a7..71d29f2 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container9.php
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container9.php
@@ -14,9 +14,8 @@
     addTag('foo', array('bar' => 'bar'))->
     setFactoryClass('FooClass')->
     setFactoryMethod('getInstance')->
-    setArguments(array('foo', new Reference('foo.baz'), array('%foo%' => 'foo is %foo%', 'bar' => '%foo%'), true, new Reference('service_container')))->
+    setArguments(array('foo', new Reference('foo.baz'), array('%foo%' => 'foo is %foo%', 'foobar' => '%foo%'), true, new Reference('service_container')))->
     setProperties(array('foo' => 'bar', 'moo' => new Reference('foo.baz')))->
-    setScope('prototype')->
     addMethodCall('setBar', array(new Reference('bar')))->
     addMethodCall('initialize')->
     setConfigurator('sc_configure')
@@ -33,7 +32,10 @@
     setFactoryMethod('getInstance')->
     setConfigurator(array('%baz_class%', 'configureStatic1'))
 ;
-$container->register('foo_bar', '%foo_class%');
+$container->
+    register('foo_bar', '%foo_class%')->
+    setScope('prototype')
+;
 $container->getParameterBag()->clear();
 $container->getParameterBag()->add(array(
     'baz_class' => 'BazClass',
@@ -50,9 +52,24 @@
     addMethodCall('setBar', array(new Reference('foobaz', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)))
 ;
 $container->
-    register('factory_service')->
+    register('factory_service', 'Bar')->
     setFactoryService('foo.baz')->
     setFactoryMethod('getInstance')
 ;
 
+$container
+    ->register('foo_with_inline', 'Foo')
+    ->addMethodCall('setBar', array(new Reference('inlined')))
+;
+$container
+    ->register('inlined', 'Bar')
+    ->setProperty('pub', 'pub')
+    ->addMethodCall('setBaz', array(new Reference('baz')))
+    ->setPublic(false)
+;
+$container
+    ->register('baz', 'Baz')
+    ->addMethodCall('setFoo', array(new Reference('foo_with_inline')))
+;
+
 return $container;
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services9.dot b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services9.dot
index fdff221..73608e2 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services9.dot
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services9.dot
@@ -3,12 +3,15 @@ digraph sc {
   node [fontsize="11" fontname="Arial" shape="record"];
   edge [fontsize="9" fontname="Arial" color="grey" arrowhead="open" arrowsize="0.5"];
 
-  node_foo [label="foo (alias_for_foo)\nFooClass\n", shape=record, fillcolor="#eeeeee", style="dotted"];
+  node_foo [label="foo (alias_for_foo)\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
   node_bar [label="bar\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
   node_foo_baz [label="foo.baz\nBazClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
-  node_foo_bar [label="foo_bar\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
+  node_foo_bar [label="foo_bar\nFooClass\n", shape=record, fillcolor="#eeeeee", style="dotted"];
   node_method_call1 [label="method_call1\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
-  node_factory_service [label="factory_service\n\n", shape=record, fillcolor="#eeeeee", style="filled"];
+  node_factory_service [label="factory_service\nBar\n", shape=record, fillcolor="#eeeeee", style="filled"];
+  node_foo_with_inline [label="foo_with_inline\nFoo\n", shape=record, fillcolor="#eeeeee", style="filled"];
+  node_inlined [label="inlined\nBar\n", shape=record, fillcolor="#eeeeee", style="filled"];
+  node_baz [label="baz\nBaz\n", shape=record, fillcolor="#eeeeee", style="filled"];
   node_service_container [label="service_container\nSymfony\\Component\\DependencyInjection\\ContainerBuilder\n", shape=record, fillcolor="#9999ff", style="filled"];
   node_foo2 [label="foo2\n\n", shape=record, fillcolor="#ff9999", style="filled"];
   node_foo3 [label="foo3\n\n", shape=record, fillcolor="#ff9999", style="filled"];
@@ -22,4 +25,7 @@ digraph sc {
   node_method_call1 -> node_foo2 [label="setBar()" style="dashed"];
   node_method_call1 -> node_foo3 [label="setBar()" style="dashed"];
   node_method_call1 -> node_foobaz [label="setBar()" style="dashed"];
+  node_foo_with_inline -> node_inlined [label="setBar()" style="dashed"];
+  node_inlined -> node_baz [label="setBaz()" style="dashed"];
+  node_baz -> node_foo_with_inline [label="setFoo()" style="dashed"];
 }
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/classes.php b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/classes.php
index 514df23..fb6d4cf 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/classes.php
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/classes.php
@@ -7,10 +7,23 @@ function sc_configure($instance)
 
 class BarClass
 {
+    protected $baz;
+
+    public function setBaz(BazClass $baz)
+    {
+        $this->baz = $baz;
+    }
 }
 
 class BazClass
 {
+    protected $foo;
+
+    public function setFoo(Foo $foo)
+    {
+        $this->foo = $foo;
+    }
+
     public function configure($instance)
     {
         $instance->configure();
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php
index a0d2ece..80d24c5 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php
@@ -44,12 +44,29 @@ protected function getBarService()
     }
 
     /**
+     * Gets the 'baz' service.
+     *
+     * This service is shared.
+     * This method always returns the same instance of the service.
+     *
+     * @return Baz A Baz instance.
+     */
+    protected function getBazService()
+    {
+        $this->services['baz'] = $instance = new \Baz();
+
+        $instance->setFoo($this->get('foo_with_inline'));
+
+        return $instance;
+    }
+
+    /**
      * Gets the 'factory_service' service.
      *
      * This service is shared.
      * This method always returns the same instance of the service.
      *
-     * @return Object An instance returned by foo.baz::getInstance().
+     * @return Bar A Bar instance.
      */
     protected function getFactoryServiceService()
     {
@@ -59,13 +76,16 @@ protected function getFactoryServiceService()
     /**
      * Gets the 'foo' service.
      *
+     * This service is shared.
+     * This method always returns the same instance of the service.
+     *
      * @return FooClass A FooClass instance.
      */
     protected function getFooService()
     {
         $a = $this->get('foo.baz');
 
-        $instance = call_user_func(array('FooClass', 'getInstance'), 'foo', $a, array($this->getParameter('foo') => 'foo is '.$this->getParameter('foo').'', 'bar' => $this->getParameter('foo')), true, $this);
+        $this->services['foo'] = $instance = call_user_func(array('FooClass', 'getInstance'), 'foo', $a, array($this->getParameter('foo') => 'foo is '.$this->getParameter('foo').'', 'foobar' => $this->getParameter('foo')), true, $this);
 
         $instance->setBar($this->get('bar'));
         $instance->initialize();
@@ -96,16 +116,30 @@ protected function getFoo_BazService()
     /**
      * Gets the 'foo_bar' service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
      * @return Object A %foo_class% instance.
      */
     protected function getFooBarService()
     {
         $class = $this->getParameter('foo_class');
 
-        return $this->services['foo_bar'] = new $class();
+        return new $class();
+    }
+
+    /**
+     * Gets the 'foo_with_inline' service.
+     *
+     * This service is shared.
+     * This method always returns the same instance of the service.
+     *
+     * @return Foo A Foo instance.
+     */
+    protected function getFooWithInlineService()
+    {
+        $this->services['foo_with_inline'] = $instance = new \Foo();
+
+        $instance->setBar($this->get('inlined'));
+
+        return $instance;
     }
 
     /**
@@ -145,6 +179,28 @@ protected function getAliasForFooService()
     }
 
     /**
+     * Gets the 'inlined' service.
+     *
+     * This service is shared.
+     * This method always returns the same instance of the service.
+     *
+     * This service is private.
+     * If you want to be able to request this service from the container directly,
+     * make it public, otherwise you might end up with broken code.
+     *
+     * @return Bar A Bar instance.
+     */
+    protected function getInlinedService()
+    {
+        $this->services['inlined'] = $instance = new \Bar();
+
+        $instance->setBaz($this->get('baz'));
+        $instance->pub = 'pub';
+
+        return $instance;
+    }
+
+    /**
      * Gets the default parameters.
      *
      * @return array An array of the default parameters
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php
similarity index 57%
copy from core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php
copy to core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php
index a0d2ece..5903b8a 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php
@@ -8,7 +8,7 @@
 use Symfony\Component\DependencyInjection\Exception\RuntimeException;
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\DependencyInjection\Parameter;
-use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
 
 /**
  * ProjectServiceContainer
@@ -23,7 +23,16 @@ class ProjectServiceContainer extends Container
      */
     public function __construct()
     {
-        parent::__construct(new ParameterBag($this->getDefaultParameters()));
+        $this->parameters = $this->getDefaultParameters();
+
+        $this->services =
+        $this->scopedServices =
+        $this->scopeStacks = array();
+
+        $this->set('service_container', $this);
+
+        $this->scopes = array();
+        $this->scopeChildren = array();
     }
 
     /**
@@ -44,12 +53,29 @@ protected function getBarService()
     }
 
     /**
+     * Gets the 'baz' service.
+     *
+     * This service is shared.
+     * This method always returns the same instance of the service.
+     *
+     * @return Baz A Baz instance.
+     */
+    protected function getBazService()
+    {
+        $this->services['baz'] = $instance = new \Baz();
+
+        $instance->setFoo($this->get('foo_with_inline'));
+
+        return $instance;
+    }
+
+    /**
      * Gets the 'factory_service' service.
      *
      * This service is shared.
      * This method always returns the same instance of the service.
      *
-     * @return Object An instance returned by foo.baz::getInstance().
+     * @return Bar A Bar instance.
      */
     protected function getFactoryServiceService()
     {
@@ -59,13 +85,16 @@ protected function getFactoryServiceService()
     /**
      * Gets the 'foo' service.
      *
+     * This service is shared.
+     * This method always returns the same instance of the service.
+     *
      * @return FooClass A FooClass instance.
      */
     protected function getFooService()
     {
         $a = $this->get('foo.baz');
 
-        $instance = call_user_func(array('FooClass', 'getInstance'), 'foo', $a, array($this->getParameter('foo') => 'foo is '.$this->getParameter('foo').'', 'bar' => $this->getParameter('foo')), true, $this);
+        $this->services['foo'] = $instance = call_user_func(array('FooClass', 'getInstance'), 'foo', $a, array('bar' => 'foo is bar', 'foobar' => 'bar'), true, $this);
 
         $instance->setBar($this->get('bar'));
         $instance->initialize();
@@ -82,13 +111,13 @@ protected function getFooService()
      * This service is shared.
      * This method always returns the same instance of the service.
      *
-     * @return Object A %baz_class% instance.
+     * @return BazClass A BazClass instance.
      */
     protected function getFoo_BazService()
     {
-        $this->services['foo.baz'] = $instance = call_user_func(array($this->getParameter('baz_class'), 'getInstance'));
+        $this->services['foo.baz'] = $instance = call_user_func(array('BazClass', 'getInstance'));
 
-        call_user_func(array($this->getParameter('baz_class'), 'configureStatic1'), $instance);
+        call_user_func(array('BazClass', 'configureStatic1'), $instance);
 
         return $instance;
     }
@@ -96,16 +125,33 @@ protected function getFoo_BazService()
     /**
      * Gets the 'foo_bar' service.
      *
+     * @return FooClass A FooClass instance.
+     */
+    protected function getFooBarService()
+    {
+        return new \FooClass();
+    }
+
+    /**
+     * Gets the 'foo_with_inline' service.
+     *
      * This service is shared.
      * This method always returns the same instance of the service.
      *
-     * @return Object A %foo_class% instance.
+     * @return Foo A Foo instance.
      */
-    protected function getFooBarService()
+    protected function getFooWithInlineService()
     {
-        $class = $this->getParameter('foo_class');
+        $a = new \Bar();
+
+        $this->services['foo_with_inline'] = $instance = new \Foo();
+
+        $a->setBaz($this->get('baz'));
+        $a->pub = 'pub';
 
-        return $this->services['foo_bar'] = new $class();
+        $instance->setBar($a);
+
+        return $instance;
     }
 
     /**
@@ -123,13 +169,7 @@ protected function getMethodCall1Service()
         $this->services['method_call1'] = $instance = new \FooClass();
 
         $instance->setBar($this->get('foo'));
-        $instance->setBar($this->get('foo2', ContainerInterface::NULL_ON_INVALID_REFERENCE));
-        if ($this->has('foo3')) {
-            $instance->setBar($this->get('foo3', ContainerInterface::NULL_ON_INVALID_REFERENCE));
-        }
-        if ($this->has('foobaz')) {
-            $instance->setBar($this->get('foobaz', ContainerInterface::NULL_ON_INVALID_REFERENCE));
-        }
+        $instance->setBar(NULL);
 
         return $instance;
     }
@@ -145,6 +185,47 @@ protected function getAliasForFooService()
     }
 
     /**
+     * {@inheritdoc}
+     */
+    public function getParameter($name)
+    {
+        $name = strtolower($name);
+
+        if (!array_key_exists($name, $this->parameters)) {
+            throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
+        }
+
+        return $this->parameters[$name];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasParameter($name)
+    {
+        return array_key_exists(strtolower($name), $this->parameters);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setParameter($name, $value)
+    {
+        throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getParameterBag()
+    {
+        if (null === $this->parameterBag) {
+            $this->parameterBag = new FrozenParameterBag($this->parameters);
+        }
+
+        return $this->parameterBag;
+    }
+    /**
      * Gets the default parameters.
      *
      * @return array An array of the default parameters
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml
index a73fb3e..58eb6d7 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml
@@ -6,14 +6,14 @@
     <parameter key="foo">bar</parameter>
   </parameters>
   <services>
-    <service id="foo" class="FooClass" factory-method="getInstance" scope="prototype">
+    <service id="foo" class="FooClass" factory-method="getInstance">
       <tag name="foo" foo="foo"/>
       <tag name="foo" bar="bar"/>
       <argument>foo</argument>
       <argument type="service" id="foo.baz"/>
       <argument type="collection">
         <argument key="%foo%">foo is %foo%</argument>
-        <argument key="bar">%foo%</argument>
+        <argument key="foobar">%foo%</argument>
       </argument>
       <argument>true</argument>
       <argument type="service" id="service_container"/>
@@ -34,7 +34,7 @@
     <service id="foo.baz" class="%baz_class%" factory-method="getInstance">
       <configurator class="%baz_class%" method="configureStatic1"/>
     </service>
-    <service id="foo_bar" class="%foo_class%"/>
+    <service id="foo_bar" class="%foo_class%" scope="prototype"/>
     <service id="method_call1" class="FooClass">
       <file>%path%foo.php</file>
       <call method="setBar">
@@ -50,7 +50,23 @@
         <argument type="service" id="foobaz" on-invalid="ignore"/>
       </call>
     </service>
-    <service id="factory_service" factory-method="getInstance" factory-service="foo.baz"/>
+    <service id="factory_service" class="Bar" factory-method="getInstance" factory-service="foo.baz"/>
+    <service id="foo_with_inline" class="Foo">
+      <call method="setBar">
+        <argument type="service" id="inlined"/>
+      </call>
+    </service>
+    <service id="inlined" class="Bar" public="false">
+      <property name="pub">pub</property>
+      <call method="setBaz">
+        <argument type="service" id="baz"/>
+      </call>
+    </service>
+    <service id="baz" class="Baz">
+      <call method="setFoo">
+        <argument type="service" id="foo_with_inline"/>
+      </call>
+    </service>
     <service id="alias_for_foo" alias="foo"/>
   </services>
 </container>
diff --git a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml
index 0fd2ae3..fcbb83f 100644
--- a/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml
+++ b/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml
@@ -10,13 +10,12 @@ services:
             - { name: foo, foo: foo }
             - { name: foo, bar: bar }
         factory_method: getInstance
-        arguments: [foo, '@foo.baz', { '%foo%': 'foo is %foo%', bar: '%foo%' }, true, '@service_container']
+        arguments: [foo, '@foo.baz', { '%foo%': 'foo is %foo%', foobar: '%foo%' }, true, '@service_container']
         properties: { foo: bar, moo: '@foo.baz' }
         calls:
             - [setBar, ['@bar']]
             - [initialize, {  }]
 
-        scope: prototype
         configurator: sc_configure
     bar:
         class: FooClass
@@ -28,6 +27,7 @@ services:
         configurator: ['%baz_class%', configureStatic1]
     foo_bar:
         class: %foo_class%
+        scope: prototype
     method_call1:
         class: FooClass
         file: %path%foo.php
@@ -38,6 +38,23 @@ services:
             - [setBar, ['@?foobaz']]
 
     factory_service:
+        class: Bar
         factory_method: getInstance
         factory_service: foo.baz
+    foo_with_inline:
+        class: Foo
+        calls:
+            - [setBar, ['@inlined']]
+
+    inlined:
+        class: Bar
+        properties: { pub: pub }
+        calls:
+            - [setBaz, ['@baz']]
+
+    baz:
+        class: Baz
+        calls:
+            - [setFoo, ['@foo_with_inline']]
+
     alias_for_foo: @foo
diff --git a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/CHANGELOG.md b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/CHANGELOG.md
index 13ed8dd..c83695f 100644
--- a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/CHANGELOG.md
+++ b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/CHANGELOG.md
@@ -8,6 +8,7 @@ CHANGELOG
  * added Request::getRealMethod() to get the "real" HTTP method (getMethod() returns the "intended" HTTP method)
  * disabled _method request parameter support by default (call Request::enableHttpMethodParameterOverride() to enable it)
  * Request::splitHttpAcceptHeader() method is deprecated and will be removed in 2.3
+ * Deprecated Flashbag::count() and \Countable interface, will be removed in 2.3
 
 2.1.0
 -----
diff --git a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php
index 3da63dd..958e84c 100644
--- a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php
+++ b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php
@@ -45,7 +45,7 @@ public function __construct($cmd = 'file -b --mime %s 2>/dev/null')
      */
     public static function isSupported()
     {
-        return !defined('PHP_WINDOWS_VERSION_BUILD');
+        return !defined('PHP_WINDOWS_VERSION_BUILD') && function_exists('passthru') && function_exists('escapeshellarg');
     }
 
     /**
diff --git a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
index 3b5d144..d886df1 100644
--- a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
+++ b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
@@ -1404,7 +1404,8 @@ public function getAcceptableContentTypes()
      * Returns true if the request is a XMLHttpRequest.
      *
      * It works if your JavaScript library set an X-Requested-With HTTP header.
-     * It is known to work with Prototype, Mootools, jQuery.
+     * It is known to work with common JavaScript frameworks:
+     * @link http://en.wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript
      *
      * @return Boolean true if the request is an XMLHttpRequest, false otherwise
      *
diff --git a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php
index ce9308e..5bb43bc 100644
--- a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php
+++ b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php
@@ -177,10 +177,17 @@ public function getIterator()
     /**
      * Returns the number of flashes.
      *
+     * This method does not work.
+     *
+     * @deprecated in 2.2, removed in 2.3
+     * @see https://github.com/symfony/symfony/issues/6408
+     *
      * @return int The number of flashes
      */
     public function count()
     {
+        trigger_error(sprintf('%s() is deprecated since 2.2 and will be removed in 2.3', __METHOD__), E_USER_DEPRECATED);
+
         return count($this->flashes);
     }
 }
diff --git a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php
index 94a075a..7fd2f5e 100644
--- a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php
+++ b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php
@@ -103,7 +103,7 @@ public function testGetClientOriginalExtension()
     }
 
     /**
-     * @expectedException Symfony\Component\HttpFoundation\File\Exception\FileException
+     * @expectedException \Symfony\Component\HttpFoundation\File\Exception\FileException
      */
     public function testMoveLocalFileIsNotAllowed()
     {
diff --git a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php
index d7d12e5..208a5e7 100644
--- a/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php
+++ b/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php
@@ -135,6 +135,7 @@ public function testPeekAll()
 
     /**
      * @covers Symfony\Component\HttpFoundation\Session\Flash\FlashBag::count
+     * @expectedException \PHPUnit_Framework_Error_Deprecated
      */
     public function testCount()
     {
@@ -163,6 +164,6 @@ public function testGetIterator()
         }
 
         $this->assertEquals(count($flashes), $i);
-        $this->assertEquals(0, count($this->bag));
+        $this->assertEquals(0, count($this->bag->all()));
     }
 }
diff --git a/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Kernel.php b/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Kernel.php
index 46440a3..cfcfb80 100644
--- a/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Kernel.php
+++ b/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Kernel.php
@@ -62,12 +62,12 @@
     protected $classes;
     protected $errorReportingLevel;
 
-    const VERSION         = '2.2.0-DEV';
+    const VERSION         = '2.2.0-BETA1';
     const VERSION_ID      = '20100';
     const MAJOR_VERSION   = '2';
     const MINOR_VERSION   = '2';
     const RELEASE_VERSION = '0';
-    const EXTRA_VERSION   = 'DEV';
+    const EXTRA_VERSION   = 'BETA1';
 
     /**
      * Constructor.
diff --git a/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php b/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php
index 701e7a7..367e3e2 100644
--- a/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php
+++ b/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php
@@ -136,7 +136,7 @@ public function testHandleWhenAListenerReturnsAResponse()
     }
 
     /**
-     * @expectedException Symfony\Component\HttpKernel\Exception\NotFoundHttpException
+     * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
      */
     public function testHandleWhenNoControllerIsFound()
     {
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/.gitattributes b/core/vendor/symfony/process/Symfony/Component/Process/.gitattributes
deleted file mode 100644
index 8048151..0000000
--- a/core/vendor/symfony/process/Symfony/Component/Process/.gitattributes
+++ /dev/null
@@ -1,2 +0,0 @@
-/Tests export-ignore
-phpunit.xml.dist export-ignore
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/Exception/ProcessFailedException.php b/core/vendor/symfony/process/Symfony/Component/Process/Exception/ProcessFailedException.php
index a4540c0..f778a36 100755
--- a/core/vendor/symfony/process/Symfony/Component/Process/Exception/ProcessFailedException.php
+++ b/core/vendor/symfony/process/Symfony/Component/Process/Exception/ProcessFailedException.php
@@ -30,8 +30,10 @@ public function __construct(Process $process)
 
         parent::__construct(
             sprintf(
-                'The command "%s" failed.'."\n\nOutput:\n================\n".$process->getOutput()."\n\nError Output:\n================\n".$process->getErrorOutput(),
-                $process->getCommandLine()
+                'The command "%s" failed.'."\n\nOutput:\n================\n%s\n\nError Output:\n================\n%s",
+                $process->getCommandLine(),
+                $process->getOutput(),
+                $process->getErrorOutput()
             )
         );
 
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/ExecutableFinder.php b/core/vendor/symfony/process/Symfony/Component/Process/ExecutableFinder.php
index 087c94b..5cc99c7 100644
--- a/core/vendor/symfony/process/Symfony/Component/Process/ExecutableFinder.php
+++ b/core/vendor/symfony/process/Symfony/Component/Process/ExecutableFinder.php
@@ -19,22 +19,23 @@
  */
 class ExecutableFinder
 {
-    private static $isWindows;
-
     private $suffixes = array('.exe', '.bat', '.cmd', '.com');
 
-    public function __construct()
-    {
-        if (null === self::$isWindows) {
-            self::$isWindows = 0 === stripos(PHP_OS, 'win');
-        }
-    }
-
+    /**
+     * Replaces default suffixes of executable.
+     *
+     * @param array $suffixes
+     */
     public function setSuffixes(array $suffixes)
     {
         $this->suffixes = $suffixes;
     }
 
+    /**
+     * Adds new possible suffix to check for executable.
+     *
+     * @param string $suffix
+     */
     public function addSuffix($suffix)
     {
         $this->suffixes[] = $suffix;
@@ -78,7 +79,7 @@ public function find($name, $default = null, array $extraDirs = array())
         }
         foreach ($suffixes as $suffix) {
             foreach ($dirs as $dir) {
-                if (is_file($file = $dir.DIRECTORY_SEPARATOR.$name.$suffix) && (self::$isWindows || is_executable($file))) {
+                if (is_file($file = $dir.DIRECTORY_SEPARATOR.$name.$suffix) && (defined('PHP_WINDOWS_VERSION_BUILD') || is_executable($file))) {
                     return $file;
                 }
             }
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/LICENSE b/core/vendor/symfony/process/Symfony/Component/Process/LICENSE
index cdffe7a..88a57f8 100644
--- a/core/vendor/symfony/process/Symfony/Component/Process/LICENSE
+++ b/core/vendor/symfony/process/Symfony/Component/Process/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2012 Fabien Potencier
+Copyright (c) 2004-2013 Fabien Potencier
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/PhpProcess.php b/core/vendor/symfony/process/Symfony/Component/Process/PhpProcess.php
index 2bd5600..7a9fd08 100644
--- a/core/vendor/symfony/process/Symfony/Component/Process/PhpProcess.php
+++ b/core/vendor/symfony/process/Symfony/Component/Process/PhpProcess.php
@@ -55,16 +55,9 @@ public function setPhpBinary($php)
     }
 
     /**
-     * Runs the process.
-     *
-     * @param Closure|string|array $callback A PHP callback to run whenever there is some
-     *                                       output available on STDOUT or STDERR
-     *
-     * @return integer The exit status code
-     *
-     * @api
+     * {@inheritdoc}
      */
-    public function run($callback = null)
+    public function start($callback = null)
     {
         if (null === $this->getCommandLine()) {
             if (false === $php = $this->executableFinder->find()) {
@@ -73,6 +66,6 @@ public function run($callback = null)
             $this->setCommandLine($php);
         }
 
-        return parent::run($callback);
+        parent::start($callback);
     }
 }
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/Process.php b/core/vendor/symfony/process/Symfony/Component/Process/Process.php
index ba76255..4af26e8 100644
--- a/core/vendor/symfony/process/Symfony/Component/Process/Process.php
+++ b/core/vendor/symfony/process/Symfony/Component/Process/Process.php
@@ -127,7 +127,7 @@ public function __construct($commandline, $cwd = null, array $env = null, $stdin
         }
 
         $this->commandline = $commandline;
-        $this->cwd = null === $cwd ? getcwd() : $cwd;
+        $this->cwd = $cwd;
         if (null !== $env) {
             $this->env = array();
             foreach ($env as $key => $value) {
@@ -159,8 +159,8 @@ public function __destruct()
      * The STDOUT and STDERR are also available after the process is finished
      * via the getOutput() and getErrorOutput() methods.
      *
-     * @param Closure|string|array $callback A PHP callback to run whenever there is some
-     *                                       output available on STDOUT or STDERR
+     * @param callback|null $callback A PHP callback to run whenever there is some
+     *                                output available on STDOUT or STDERR
      *
      * @return integer The exit status code
      *
@@ -190,8 +190,8 @@ public function run($callback = null)
      * with true as a second parameter then the callback will get all data occurred
      * in (and since) the start call.
      *
-     * @param Closure|string|array $callback A PHP callback to run whenever there is some
-     *                                       output available on STDOUT or STDERR
+     * @param callback|null $callback A PHP callback to run whenever there is some
+     *                                output available on STDOUT or STDERR
      *
      * @throws \RuntimeException When process can't be launch or is stopped
      * @throws \RuntimeException When process is already running
@@ -318,11 +318,12 @@ public function start($callback = null)
      * from the output in real-time while writing the standard input to the process.
      * It allows to have feedback from the independent process during execution.
      *
-     * @param mixed $callback A valid PHP callback
+     * @param callback|null $callback A valid PHP callback
      *
-     * @return int The exitcode of the process
+     * @return integer The exitcode of the process
      *
-     * @throws \RuntimeException
+     * @throws \RuntimeException When process timed out
+     * @throws \RuntimeException When process stopped after receiving signal
      */
     public function wait($callback = null)
     {
@@ -338,10 +339,13 @@ public function wait($callback = null)
                 $w = null;
                 $e = null;
 
-                $n = @stream_select($r, $w, $e, $this->timeout);
+                if (false === $n = @stream_select($r, $w, $e, $this->timeout)) {
+                    $lastError = error_get_last();
 
-                if (false === $n) {
-                    $this->pipes = array();
+                    // stream_select returns false when the `select` system call is interrupted by an incoming signal
+                    if (isset($lastError['message']) && false === stripos($lastError['message'], 'interrupted system call')) {
+                        $this->pipes = array();
+                    }
 
                     continue;
                 }
@@ -452,8 +456,6 @@ public function getExitCode()
      *
      * @return string A string representation for the exit status code
      *
-     * @throws RuntimeException In case --enable-sigchild is activated and the sigchild compatibility mode is disabled
-     *
      * @see http://tldp.org/LDP/abs/html/exitcodes.html
      * @see http://en.wikipedia.org/wiki/Unix_signal
      */
@@ -469,8 +471,6 @@ public function getExitCodeText()
      *
      * @return Boolean true if the process ended successfully, false otherwise
      *
-     * @throws RuntimeException In case --enable-sigchild is activated and the sigchild compatibility mode is disabled
-     *
      * @api
      */
     public function isSuccessful()
@@ -573,11 +573,9 @@ public function isRunning()
     /**
      * Stops the process.
      *
-     * @param float $timeout The timeout in seconds
+     * @param integer|float $timeout The timeout in seconds
      *
      * @return integer The exit-code of the process
-     *
-     * @throws \RuntimeException if the process got signaled
      */
     public function stop($timeout=10)
     {
@@ -693,6 +691,13 @@ public function setTimeout($timeout)
      */
     public function getWorkingDirectory()
     {
+        // This is for BC only
+        if (null === $this->cwd) {
+            // getcwd() will return false if any one of the parent directories does not have
+            // the readable or search mode set, even if the current directory does
+            return getcwd() ?: null;
+        }
+
         return $this->cwd;
     }
 
@@ -818,9 +823,9 @@ public function setEnhanceSigchildCompatibility($enhance)
      * The callbacks adds all occurred output to the specific buffer and calls
      * the user callback (if present) with the received output.
      *
-     * @param mixed $callback The user defined PHP callback
+     * @param callback|null $callback The user defined PHP callback
      *
-     * @return mixed A PHP callable
+     * @return callback A PHP callable
      */
     protected function buildCallback($callback)
     {
@@ -860,6 +865,9 @@ protected function updateStatus()
         }
     }
 
+    /**
+     * Updates the current error output of the process (STDERR).
+     */
     protected function updateErrorOutput()
     {
         if (isset($this->pipes[self::STDERR]) && is_resource($this->pipes[self::STDERR])) {
@@ -867,6 +875,9 @@ protected function updateErrorOutput()
         }
     }
 
+    /**
+     * Updates the current output of the process (STDOUT).
+     */
     protected function updateOutput()
     {
         if (defined('PHP_WINDOWS_VERSION_BUILD') && isset($this->fileHandles[self::STDOUT]) && is_resource($this->fileHandles[self::STDOUT])) {
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/Tests/AbstractProcessTest.php b/core/vendor/symfony/process/Symfony/Component/Process/Tests/AbstractProcessTest.php
index d83c1f3..51d51f4 100644
--- a/core/vendor/symfony/process/Symfony/Component/Process/Tests/AbstractProcessTest.php
+++ b/core/vendor/symfony/process/Symfony/Component/Process/Tests/AbstractProcessTest.php
@@ -11,13 +11,13 @@
 
 namespace Symfony\Component\Process\Tests;
 
+use Symfony\Component\Process\Process;
+
 /**
  * @author Robert Schönthal <seroscho@googlemail.com>
  */
 abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
 {
-    protected abstract function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array());
-
     /**
      * @expectedException \InvalidArgumentException
      */
@@ -233,11 +233,14 @@ public function testProcessWithTermSignal()
             $this->markTestSkipped('Windows does not support POSIX signals');
         }
 
+        // SIGTERM is only defined if pcntl extension is present
+        $termSignal = defined('SIGTERM') ? SIGTERM : 15;
 
         $process = $this->getProcess('php -r "while (true) {}"');
         $process->start();
         $process->stop();
-        $this->assertEquals(SIGTERM, $process->getTermSignal());
+
+        $this->assertEquals($termSignal, $process->getTermSignal());
     }
 
     public function testPhpDeadlock()
@@ -297,4 +300,16 @@ public function methodProvider()
 
         return $defaults;
     }
+
+    /**
+     * @param string  $commandline
+     * @param null    $cwd
+     * @param array   $env
+     * @param null    $stdin
+     * @param integer $timeout
+     * @param array   $options
+     *
+     * @return Process
+     */
+    abstract protected function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array());
 }
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/Tests/PhpExecutableFinderTest.php b/core/vendor/symfony/process/Symfony/Component/Process/Tests/PhpExecutableFinderTest.php
index c632e31..99c4a1e 100644
--- a/core/vendor/symfony/process/Symfony/Component/Process/Tests/PhpExecutableFinderTest.php
+++ b/core/vendor/symfony/process/Symfony/Component/Process/Tests/PhpExecutableFinderTest.php
@@ -21,7 +21,7 @@ class PhpExecutableFinderTest extends \PHPUnit_Framework_TestCase
     /**
      * tests find() with the env var PHP_PATH
      */
-    public function testFindWithPHP_PATH()
+    public function testFindWithPhpPath()
     {
         if (defined('PHP_BINARY')) {
             $this->markTestSkipped('The PHP binary is easily available as of PHP 5.4');
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/Tests/PhpProcessTest.php b/core/vendor/symfony/process/Symfony/Component/Process/Tests/PhpProcessTest.php
new file mode 100644
index 0000000..7bcdd2f
--- /dev/null
+++ b/core/vendor/symfony/process/Symfony/Component/Process/Tests/PhpProcessTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Symfony\Component\Process\Tests;
+
+use Symfony\Component\Process\PhpProcess;
+
+class PhpProcessTest extends \PHPUnit_Framework_TestCase
+{
+
+    public function testNonBlockingWorks()
+    {
+        $expected = 'hello world!';
+        $process = new PhpProcess(<<<PHP
+<?php echo '$expected';
+PHP
+        );
+        $process->start();
+        $process->wait();
+        $this->assertEquals($expected, $process->getOutput());
+    }
+}
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/Tests/SigchildDisabledProcessTest.php b/core/vendor/symfony/process/Symfony/Component/Process/Tests/SigchildDisabledProcessTest.php
index 4a321ad..67fc002 100644
--- a/core/vendor/symfony/process/Symfony/Component/Process/Tests/SigchildDisabledProcessTest.php
+++ b/core/vendor/symfony/process/Symfony/Component/Process/Tests/SigchildDisabledProcessTest.php
@@ -13,15 +13,6 @@
 
 class SigchildDisabledProcessTest extends AbstractProcessTest
 {
-
-    protected function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array())
-    {
-        $process = new ProcessInSigchildEnvironment($commandline, $cwd, $env, $stdin, $timeout, $options);
-        $process->setEnhanceSigchildCompatibility(false);
-
-        return $process;
-    }
-
     /**
      * @expectedException Symfony\Component\Process\Exception\RuntimeException
      */
@@ -96,4 +87,15 @@ public function testIsNotSuccessful()
     {
         parent::testIsNotSuccessful();
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array())
+    {
+        $process = new ProcessInSigchildEnvironment($commandline, $cwd, $env, $stdin, $timeout, $options);
+        $process->setEnhanceSigchildCompatibility(false);
+
+        return $process;
+    }
 }
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/Tests/SigchildEnabledProcessTest.php b/core/vendor/symfony/process/Symfony/Component/Process/Tests/SigchildEnabledProcessTest.php
index 4c04ff1..fb9b6f8 100644
--- a/core/vendor/symfony/process/Symfony/Component/Process/Tests/SigchildEnabledProcessTest.php
+++ b/core/vendor/symfony/process/Symfony/Component/Process/Tests/SigchildEnabledProcessTest.php
@@ -13,15 +13,6 @@
 
 class SigchildEnabledProcessTest extends AbstractProcessTest
 {
-
-    protected function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array())
-    {
-        $process = new ProcessInSigchildEnvironment($commandline, $cwd, $env, $stdin, $timeout, $options);
-        $process->setEnhanceSigchildCompatibility(true);
-
-        return $process;
-    }
-
     /**
      * @expectedException Symfony\Component\Process\Exception\RuntimeException
      */
@@ -62,4 +53,14 @@ public function testExitCodeText()
         $this->assertInternalType('string', $process->getExitCodeText());
     }
 
+    /**
+     * {@inheritdoc}
+     */
+    protected function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array())
+    {
+        $process = new ProcessInSigchildEnvironment($commandline, $cwd, $env, $stdin, $timeout, $options);
+        $process->setEnhanceSigchildCompatibility(true);
+
+        return $process;
+    }
 }
diff --git a/core/vendor/symfony/process/Symfony/Component/Process/Tests/SimpleProcessTest.php b/core/vendor/symfony/process/Symfony/Component/Process/Tests/SimpleProcessTest.php
index 8742a69..17dea3f 100644
--- a/core/vendor/symfony/process/Symfony/Component/Process/Tests/SimpleProcessTest.php
+++ b/core/vendor/symfony/process/Symfony/Component/Process/Tests/SimpleProcessTest.php
@@ -15,20 +15,14 @@
 
 class SimpleProcessTest extends AbstractProcessTest
 {
+    private $enabledSigchild = false;
 
-    protected function skipIfPHPSigchild()
+    public function setUp()
     {
         ob_start();
         phpinfo(INFO_GENERAL);
 
-        if (false !== strpos(ob_get_clean(), '--enable-sigchild')) {
-            $this->markTestSkipped('Your PHP has been compiled with --enable-sigchild, this test can not be executed');
-        }
-    }
-
-    protected function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array())
-    {
-        return new Process($commandline, $cwd, $env, $stdin, $timeout, $options);
+        $this->enabledSigchild = false !== strpos(ob_get_clean(), '--enable-sigchild');
     }
 
     public function testGetExitCode()
@@ -84,4 +78,19 @@ public function testIsNotSuccessful()
         $this->skipIfPHPSigchild();
         parent::testIsNotSuccessful();
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array())
+    {
+        return new Process($commandline, $cwd, $env, $stdin, $timeout, $options);
+    }
+
+    private function skipIfPHPSigchild()
+    {
+        if ($this->enabledSigchild) {
+            $this->markTestSkipped('Your PHP has been compiled with --enable-sigchild, this test can not be executed');
+        }
+    }
 }
diff --git a/core/vendor/symfony/routing/Symfony/Component/Routing/CHANGELOG.md b/core/vendor/symfony/routing/Symfony/Component/Routing/CHANGELOG.md
index af5f753..14b9065 100644
--- a/core/vendor/symfony/routing/Symfony/Component/Routing/CHANGELOG.md
+++ b/core/vendor/symfony/routing/Symfony/Component/Routing/CHANGELOG.md
@@ -79,6 +79,8 @@ CHANGELOG
    pass the requirements (otherwise it would break your link anyway).
  * There is no restriction on the route name anymore. So non-alphanumeric characters
    are now also allowed.
+ * [BC BREAK] `RouteCompilerInterface::compile(Route $route)` was made static
+   (only relevant if you implemented your own RouteCompiler).
 
 2.1.0
 -----
diff --git a/core/vendor/symfony/routing/Symfony/Component/Routing/LICENSE b/core/vendor/symfony/routing/Symfony/Component/Routing/LICENSE
index cdffe7a..88a57f8 100644
--- a/core/vendor/symfony/routing/Symfony/Component/Routing/LICENSE
+++ b/core/vendor/symfony/routing/Symfony/Component/Routing/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2012 Fabien Potencier
+Copyright (c) 2004-2013 Fabien Potencier
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/core/vendor/symfony/routing/Symfony/Component/Routing/Route.php b/core/vendor/symfony/routing/Symfony/Component/Routing/Route.php
index 241c8ef..701cf52 100644
--- a/core/vendor/symfony/routing/Symfony/Component/Routing/Route.php
+++ b/core/vendor/symfony/routing/Symfony/Component/Routing/Route.php
@@ -50,8 +50,6 @@ class Route implements \Serializable
      */
     private $compiled;
 
-    private static $compilers = array();
-
     /**
      * Constructor.
      *
@@ -421,6 +419,9 @@ public function setRequirement($key, $regex)
      *
      * @return CompiledRoute A CompiledRoute instance
      *
+     * @throws \LogicException If the Route cannot be compiled because the
+     *                         path or hostname pattern is invalid
+     *
      * @see RouteCompiler which is responsible for the compilation process
      */
     public function compile()
@@ -431,11 +432,7 @@ public function compile()
 
         $class = $this->getOption('compiler_class');
 
-        if (!isset(self::$compilers[$class])) {
-            self::$compilers[$class] = new $class;
-        }
-
-        return $this->compiled = self::$compilers[$class]->compile($this);
+        return $this->compiled = $class::compile($this);
     }
 
     private function sanitizeRequirement($key, $regex)
diff --git a/core/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php b/core/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php
index 991ce09..70ebe77 100644
--- a/core/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php
+++ b/core/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php
@@ -35,7 +35,7 @@ class RouteCompiler implements RouteCompilerInterface
      * @throws \DomainException If a variable name is numeric because PHP raises an error for such
      *                          subpatterns in PCRE and thus would break matching, e.g. "(?P<123>.+)".
      */
-    public function compile(Route $route)
+    public static function compile(Route $route)
     {
         $staticPrefix = null;
         $hostnameVariables = array();
@@ -47,7 +47,7 @@ public function compile(Route $route)
         $hostnameTokens = array();
 
         if ('' !== $hostnamePattern = $route->getHostnamePattern()) {
-            $result = $this->compilePattern($route, $hostnamePattern, true);
+            $result = self::compilePattern($route, $hostnamePattern, true);
 
             $hostnameVariables = $result['variables'];
             $variables = array_merge($variables, $hostnameVariables);
@@ -58,7 +58,7 @@ public function compile(Route $route)
 
         $pattern = $route->getPattern();
 
-        $result = $this->compilePattern($route, $pattern, false);
+        $result = self::compilePattern($route, $pattern, false);
 
         $staticPrefix = $result['staticPrefix'];
 
@@ -80,7 +80,7 @@ public function compile(Route $route)
         );
     }
 
-    private function compilePattern(Route $route, $pattern, $isHostname)
+    private static function compilePattern(Route $route, $pattern, $isHostname)
     {
         $tokens = array();
         $variables = array();
@@ -122,7 +122,7 @@ private function compilePattern(Route $route, $pattern, $isHostname)
                 // If {page} would also match the separating dot, {_format} would never match as {page} will eagerly consume everything.
                 // Also even if {_format} was not optional the requirement prevents that {page} matches something that was originally
                 // part of {_format} when generating the URL, e.g. _format = 'mobile.html'.
-                $nextSeparator = $this->findNextSeparator($followingPattern);
+                $nextSeparator = self::findNextSeparator($followingPattern);
                 $regexp = sprintf(
                     '[^%s%s]+',
                     preg_quote($defaultSeparator, self::REGEX_DELIMITER),
@@ -162,7 +162,7 @@ private function compilePattern(Route $route, $pattern, $isHostname)
         // compute the matching regexp
         $regexp = '';
         for ($i = 0, $nbToken = count($tokens); $i < $nbToken; $i++) {
-            $regexp .= $this->computeRegexp($tokens, $i, $firstOptional);
+            $regexp .= self::computeRegexp($tokens, $i, $firstOptional);
         }
 
         return array(
@@ -180,7 +180,7 @@ private function compilePattern(Route $route, $pattern, $isHostname)
      *
      * @return string The next static character that functions as separator (or empty string when none available)
      */
-    private function findNextSeparator($pattern)
+    private static function findNextSeparator($pattern)
     {
         if ('' == $pattern) {
             // return empty string if pattern is empty or false (false which can be returned by substr)
@@ -201,7 +201,7 @@ private function findNextSeparator($pattern)
      *
      * @return string The regexp pattern for a single token
      */
-    private function computeRegexp(array $tokens, $index, $firstOptional)
+    private static function computeRegexp(array $tokens, $index, $firstOptional)
     {
         $token = $tokens[$index];
         if ('text' === $token[0]) {
diff --git a/core/vendor/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php b/core/vendor/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php
index f72e9e5..36e131c 100644
--- a/core/vendor/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php
+++ b/core/vendor/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php
@@ -24,6 +24,9 @@
      * @param Route $route A Route instance
      *
      * @return CompiledRoute A CompiledRoute instance
+     *
+     * @throws \LogicException If the Route cannot be compiled because the
+     *                         path or hostname pattern is invalid
      */
-    public function compile(Route $route);
+    public static function compile(Route $route);
 }
diff --git a/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php b/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php
index 6a86736..ab5f4cd 100644
--- a/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php
+++ b/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php
@@ -89,7 +89,7 @@ public function testDumpWithoutRoutes()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\RouteNotFoundException
+     * @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException
      */
     public function testGenerateNonExistingRoute()
     {
diff --git a/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php b/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php
index a3f50b6..7b6495f 100644
--- a/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php
+++ b/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php
@@ -75,7 +75,7 @@ public function testRelativeUrlWithNullParameter()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\InvalidParameterException
+     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
      */
     public function testRelativeUrlWithNullParameterButNotOptional()
     {
@@ -161,7 +161,7 @@ public function testGlobalParameterHasHigherPriorityThanDefault()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\RouteNotFoundException
+     * @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException
      */
     public function testGenerateWithoutRoutes()
     {
@@ -170,7 +170,7 @@ public function testGenerateWithoutRoutes()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\MissingMandatoryParametersException
+     * @expectedException \Symfony\Component\Routing\Exception\MissingMandatoryParametersException
      */
     public function testGenerateForRouteWithoutMandatoryParameter()
     {
@@ -179,7 +179,7 @@ public function testGenerateForRouteWithoutMandatoryParameter()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\InvalidParameterException
+     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
      */
     public function testGenerateForRouteWithInvalidOptionalParameter()
     {
@@ -188,7 +188,7 @@ public function testGenerateForRouteWithInvalidOptionalParameter()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\InvalidParameterException
+     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
      */
     public function testGenerateForRouteWithInvalidParameter()
     {
@@ -228,7 +228,7 @@ public function testGenerateForRouteWithInvalidParameterButDisabledRequirementsC
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\InvalidParameterException
+     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
      */
     public function testGenerateForRouteWithInvalidMandatoryParameter()
     {
@@ -237,7 +237,7 @@ public function testGenerateForRouteWithInvalidMandatoryParameter()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\InvalidParameterException
+     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
      */
     public function testRequiredParamAndEmptyPassed()
     {
@@ -366,7 +366,7 @@ public function testDefaultRequirementOfVariable()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\InvalidParameterException
+     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
      */
     public function testDefaultRequirementOfVariableDisallowsSlash()
     {
@@ -375,7 +375,7 @@ public function testDefaultRequirementOfVariableDisallowsSlash()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\InvalidParameterException
+     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
      */
     public function testDefaultRequirementOfVariableDisallowsNextSeparator()
     {
@@ -406,7 +406,7 @@ public function testWithHostnameSameAsContextAndAbsolute()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\InvalidParameterException
+     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
      */
     public function testUrlWithInvalidParameterInHostname()
     {
@@ -415,7 +415,7 @@ public function testUrlWithInvalidParameterInHostname()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\InvalidParameterException
+     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
      */
     public function testUrlWithInvalidParameterInHostnameWhenParamHasADefaultValue()
     {
@@ -424,7 +424,7 @@ public function testUrlWithInvalidParameterInHostnameWhenParamHasADefaultValue()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\InvalidParameterException
+     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
      */
     public function testUrlWithInvalidParameterEqualsDefaultValueInHostname()
     {
diff --git a/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php b/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php
index b8ab264..2ad4fc8 100644
--- a/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php
+++ b/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php
@@ -28,7 +28,7 @@ public function testRedirectWhenNoSlash()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\ResourceNotFoundException
+     * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
      */
     public function testRedirectWhenNoSlashForNonSafeMethod()
     {
diff --git a/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php b/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php
index 18e11eb..4cf3241 100644
--- a/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php
+++ b/core/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php
@@ -295,7 +295,7 @@ public function testDefaultRequirementOfVariable()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\ResourceNotFoundException
+     * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
      */
     public function testDefaultRequirementOfVariableDisallowsSlash()
     {
@@ -307,7 +307,7 @@ public function testDefaultRequirementOfVariableDisallowsSlash()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\ResourceNotFoundException
+     * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
      */
     public function testDefaultRequirementOfVariableDisallowsNextSeparator()
     {
@@ -319,7 +319,7 @@ public function testDefaultRequirementOfVariableDisallowsNextSeparator()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\ResourceNotFoundException
+     * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
      */
     public function testSchemeRequirement()
     {
@@ -378,7 +378,7 @@ public function testWithHostnameOnRouteCollection()
     }
 
     /**
-     * @expectedException Symfony\Component\Routing\Exception\ResourceNotFoundException
+     * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
      */
     public function testWithOutHostnameHostnameDoesNotMatch()
     {
diff --git a/core/vendor/symfony/serializer/Symfony/Component/Serializer/LICENSE b/core/vendor/symfony/serializer/Symfony/Component/Serializer/LICENSE
index cdffe7a..88a57f8 100644
--- a/core/vendor/symfony/serializer/Symfony/Component/Serializer/LICENSE
+++ b/core/vendor/symfony/serializer/Symfony/Component/Serializer/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2012 Fabien Potencier
+Copyright (c) 2004-2013 Fabien Potencier
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/core/vendor/symfony/yaml/Symfony/Component/Yaml/LICENSE b/core/vendor/symfony/yaml/Symfony/Component/Yaml/LICENSE
index cdffe7a..88a57f8 100644
--- a/core/vendor/symfony/yaml/Symfony/Component/Yaml/LICENSE
+++ b/core/vendor/symfony/yaml/Symfony/Component/Yaml/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2012 Fabien Potencier
+Copyright (c) 2004-2013 Fabien Potencier
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/core/vendor/symfony/yaml/Symfony/Component/Yaml/Tests/ParserTest.php b/core/vendor/symfony/yaml/Symfony/Component/Yaml/Tests/ParserTest.php
index e27482a..88848be 100644
--- a/core/vendor/symfony/yaml/Symfony/Component/Yaml/Tests/ParserTest.php
+++ b/core/vendor/symfony/yaml/Symfony/Component/Yaml/Tests/ParserTest.php
@@ -143,7 +143,7 @@ public function testNonUtf8Exception()
 
     /**
      *
-     * @expectedException Symfony\Component\Yaml\Exception\ParseException
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
      *
      */
     public function testUnindentedCollectionException()
@@ -161,7 +161,7 @@ public function testUnindentedCollectionException()
     }
 
     /**
-     * @expectedException Symfony\Component\Yaml\Exception\ParseException
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
      */
     public function testSequenceInAMapping()
     {
@@ -174,7 +174,7 @@ public function testSequenceInAMapping()
     }
 
     /**
-     * @expectedException Symfony\Component\Yaml\Exception\ParseException
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
      */
     public function testMappingInASequence()
     {
diff --git a/core/vendor/twig/twig/.editorconfig b/core/vendor/twig/twig/.editorconfig
new file mode 100644
index 0000000..270f1d1
--- /dev/null
+++ b/core/vendor/twig/twig/.editorconfig
@@ -0,0 +1,18 @@
+; top-most EditorConfig file
+root = true
+
+; Unix-style newlines
+[*]
+end_of_line = LF
+
+[*.php]
+indent_style = space
+indent_size = 4
+
+[*.test]
+indent_style = space
+indent_size = 4
+
+[*.rst]
+indent_style = space
+indent_size = 4
diff --git a/core/vendor/twig/twig/CHANGELOG b/core/vendor/twig/twig/CHANGELOG
index dcfab94..25513cf 100644
--- a/core/vendor/twig/twig/CHANGELOG
+++ b/core/vendor/twig/twig/CHANGELOG
@@ -1,3 +1,25 @@
+* 1.12.1 (2013-01-15)
+
+ * added support for object instances as the second argument of the constant function
+ * relaxed globals management to avoid a BC break
+ * added support for {{ some_string[:2] }}
+
+* 1.12.0 (2013-01-08)
+
+ * added verbatim as an alias for the raw tag to avoid confusion with the raw filter
+ * fixed registration of tests and functions as anonymous functions
+ * fixed globals management
+
+* 1.12.0-RC1 (2012-12-29)
+
+ * added an include function (does the same as the include tag but in a more flexible way)
+ * added the ability to use any PHP callable to define filters, functions, and tests
+ * added a syntax error when using a loop variable that is not defined
+ * added the ability to set default values for macro arguments
+ * added support for named arguments for filters, tests, and functions
+ * moved filters/functions/tests syntax errors to the parser
+ * added support for extended ternary operator syntaxes
+
 * 1.11.1 (2012-11-11)
 
  * fixed debug info line numbering (was off by 2)
diff --git a/core/vendor/twig/twig/LICENSE b/core/vendor/twig/twig/LICENSE
index 5063d8d..3384cc5 100644
--- a/core/vendor/twig/twig/LICENSE
+++ b/core/vendor/twig/twig/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2009 by the Twig Team, see AUTHORS for more details.
+Copyright (c) 2009-2013 by the Twig Team, see AUTHORS for more details.
 
 Some rights reserved.
 
diff --git a/core/vendor/twig/twig/bin/create_pear_package.php b/core/vendor/twig/twig/bin/create_pear_package.php
deleted file mode 100644
index 4899927..0000000
--- a/core/vendor/twig/twig/bin/create_pear_package.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-if (!isset($argv[1]))
-{
-    die('You must provide the version (1.0.0)');
-}
-
-if (!isset($argv[2]))
-{
-    die('You must provide the stability (alpha, beta, or stable)');
-}
-
-$context = array(
-    'date'          => date('Y-m-d'),
-    'time'          => date('H:m:00'),
-    'version'       => $argv[1],
-    'api_version'   => $argv[1],
-    'stability'     => $argv[2],
-    'api_stability' => $argv[2],
-);
-
-$context['files'] = '';
-$path = realpath(dirname(__FILE__).'/../lib/Twig');
-foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::LEAVES_ONLY) as $file)
-{
-    if (preg_match('/\.php$/', $file))
-    {
-        $name = str_replace($path.'/', '', $file);
-        $context['files'] .= '        <file install-as="Twig/'.$name.'" name="'.$name.'" role="php" />'."\n";
-    }
-}
-
-$template = file_get_contents(dirname(__FILE__).'/../package.xml.tpl');
-$content = preg_replace_callback('/\{\{\s*([a-zA-Z0-9_]+)\s*\}\}/', 'replace_parameters', $template);
-file_put_contents(dirname(__FILE__).'/../package.xml', $content);
-
-function replace_parameters($matches)
-{
-    global $context;
-
-    return isset($context[$matches[1]]) ? $context[$matches[1]] : null;
-}
diff --git a/core/vendor/twig/twig/composer.json b/core/vendor/twig/twig/composer.json
index 3bbc5ca..5530d28 100644
--- a/core/vendor/twig/twig/composer.json
+++ b/core/vendor/twig/twig/composer.json
@@ -25,7 +25,7 @@
     },
     "extra": {
         "branch-alias": {
-            "dev-master": "1.11-dev"
+            "dev-master": "1.12-dev"
         }
     }
 }
diff --git a/core/vendor/twig/twig/doc/advanced.rst b/core/vendor/twig/twig/doc/advanced.rst
index 4be84ed..06ad771 100644
--- a/core/vendor/twig/twig/doc/advanced.rst
+++ b/core/vendor/twig/twig/doc/advanced.rst
@@ -1,6 +1,12 @@
 Extending Twig
 ==============
 
+.. caution::
+
+    This section describes how to extend Twig as of **Twig 1.12**. If you are
+    using an older version, read the :doc:`legacy<advanced_legacy>` chapter
+    instead.
+
 Twig can be extended in many ways; you can add extra tags, filters, tests,
 operators, global variables, and functions. You can even extend the parser
 itself with node visitors.
@@ -14,11 +20,10 @@ itself with node visitors.
 
 .. caution::
 
-    When extending Twig by calling methods on the Twig environment instance,
-    Twig won't be able to recompile your templates when the PHP code is
-    updated. To see your changes in real-time, either disable template caching
-    or package your code into an extension (see the next section of this
-    chapter).
+    When extending Twig without creating an extension, Twig won't be able to
+    recompile your templates when the PHP code is updated. To see your changes
+    in real-time, either disable template caching or package your code into an
+    extension (see the next section of this chapter).
 
 Before extending Twig, you must understand the differences between all the
 different possible extension points and when to use them.
@@ -75,9 +80,9 @@ extension point to use. And you can use it anywhere an expression is accepted:
 
 .. code-block:: jinja
 
-    {{ 'some text' ~ ipsum(40) ~ 'some more text' }}
+    {{ 'some text' ~ lipsum(40) ~ 'some more text' }}
 
-    {% set ipsum = ipsum(40) %}
+    {% set lipsum = lipsum(40) %}
 
 Last but not the least, you can also use a *global* object with a method able
 to generate lorem ipsum text:
@@ -121,151 +126,113 @@ You can then use the ``text`` variable anywhere in a template:
 Filters
 -------
 
-A filter is a regular PHP function or an object method that takes the left
-side of the filter (before the pipe ``|``) as first argument and the extra
-arguments passed to the filter (within parentheses ``()``) as extra arguments.
-
-Defining a filter is as easy as associating the filter name with a PHP
-callable. For instance, let's say you have the following code in a template:
-
-.. code-block:: jinja
-
-    {{ 'TWIG'|lower }}
-
-When compiling this template to PHP, Twig looks for the PHP callable
-associated with the ``lower`` filter. The ``lower`` filter is a built-in Twig
-filter, and it is simply mapped to the PHP ``strtolower()`` function. After
-compilation, the generated PHP code is roughly equivalent to:
-
-.. code-block:: html+php
-
-    <?php echo strtolower('TWIG') ?>
-
-As you can see, the ``'TWIG'`` string is passed as a first argument to the PHP
-function.
-
-A filter can also take extra arguments like in the following example:
-
-.. code-block:: jinja
-
-    {{ now|date('d/m/Y') }}
-
-In this case, the extra arguments are passed to the function after the main
-argument, and the compiled code is equivalent to:
+Creating a filter is as simple as associating a name with a PHP callable::
 
-.. code-block:: html+php
-
-    <?php echo twig_date_format_filter($now, 'd/m/Y') ?>
-
-Let's see how to create a new filter.
-
-In this section, we will create a ``rot13`` filter, which should return the
-`rot13`_ transformation of a string. Here is an example of its usage and the
-expected output:
+    // an anonymous function
+    $filter = new Twig_SimpleFilter('rot13', function ($string) {
+        return str_rot13($string);
+    });
 
-.. code-block:: jinja
+    // or a simple PHP function
+    $filter = new Twig_SimpleFilter('rot13', 'str_rot13');
 
-    {{ "Twig"|rot13 }}
+    // or a class method
+    $filter = new Twig_SimpleFilter('rot13', array('SomeClass', 'rot13Filter'));
 
-    {# should displays Gjvt #}
+The first argument passed to the ``Twig_SimpleFilter`` constructor is the name
+of the filter you will use in templates and the second one is the PHP callable
+to associate with it.
 
-Adding a filter is as simple as calling the ``addFilter()`` method on the
-``Twig_Environment`` instance::
+Then, add the filter to your Twig environment::
 
     $twig = new Twig_Environment($loader);
-    $twig->addFilter('rot13', new Twig_Filter_Function('str_rot13'));
-
-The second argument of ``addFilter()`` is an instance of ``Twig_Filter``.
-Here, we use ``Twig_Filter_Function`` as the filter is a PHP function. The
-first argument passed to the ``Twig_Filter_Function`` constructor is the name
-of the PHP function to call, here ``str_rot13``, a native PHP function.
+    $twig->addFilter($filter);
 
-Let's say I now want to be able to add a prefix before the converted string:
+And here is how to use it in a template:
 
 .. code-block:: jinja
 
-    {{ "Twig"|rot13('prefix_') }}
+    {{ 'Twig'|rot13 }}
 
-    {# should displays prefix_Gjvt #}
+    {# will output Gjvt #}
 
-As the PHP ``str_rot13()`` function does not support this requirement, let's
-create a new PHP function::
+When called by Twig, the PHP callable receives the left side of the filter
+(before the pipe ``|``) as the first argument and the extra arguments passed
+to the filter (within parentheses ``()``) as extra arguments.
 
-    function project_compute_rot13($string, $prefix = '')
-    {
-        return $prefix.str_rot13($string);
-    }
+For instance, the following code:
 
-As you can see, the ``prefix`` argument of the filter is passed as an extra
-argument to the ``project_compute_rot13()`` function.
-
-Adding this filter is as easy as before::
+.. code-block:: jinja
 
-    $twig->addFilter('rot13', new Twig_Filter_Function('project_compute_rot13'));
+    {{ 'TWIG'|lower }}
+    {{ now|date('d/m/Y') }}
 
-For better encapsulation, a filter can also be defined as a static method of a
-class. The ``Twig_Filter_Function`` class can also be used to register such
-static methods as filters::
+is compiled to something like the following::
 
-    $twig->addFilter('rot13', new Twig_Filter_Function('SomeClass::rot13Filter'));
+    <?php echo strtolower('TWIG') ?>
+    <?php echo twig_date_format_filter($now, 'd/m/Y') ?>
 
-.. tip::
+The ``Twig_SimpleFilter`` class takes an array of options as its last
+argument::
 
-    In an extension, you can also define a filter as a static method of the
-    extension class.
+    $filter = new Twig_SimpleFilter('rot13', 'str_rot13', $options);
 
 Environment aware Filters
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The ``Twig_Filter`` classes take options as their last argument. For instance,
-if you want access to the current environment instance in your filter, set the
-``needs_environment`` option to ``true``::
-
-    $filter = new Twig_Filter_Function('str_rot13', array('needs_environment' => true));
-
-Twig will then pass the current environment as the first argument to the
-filter call::
+If you want to access the current environment instance in your filter, set the
+``needs_environment`` option to ``true``; Twig will pass the current
+environment as the first argument to the filter call::
 
-    function twig_compute_rot13(Twig_Environment $env, $string)
-    {
+    $filter = new Twig_SimpleFilter('rot13', function (Twig_Environment $env, $string) {
         // get the current charset for instance
         $charset = $env->getCharset();
 
         return str_rot13($string);
-    }
+    }, array('needs_environment' => true));
+
+Context aware Filters
+~~~~~~~~~~~~~~~~~~~~~
+
+If you want to access the current context in your filter, set the
+``needs_context`` option to ``true``; Twig will pass the current context as
+the first argument to the filter call (or the second one if
+``needs_environment`` is also set to ``true``)::
+
+    $filter = new Twig_SimpleFilter('rot13', function ($context, $string) {
+        // ...
+    }, array('needs_context' => true));
+
+    $filter = new Twig_SimpleFilter('rot13', function (Twig_Environment $env, $context, $string) {
+        // ...
+    }, array('needs_context' => true, 'needs_environment' => true));
 
 Automatic Escaping
 ~~~~~~~~~~~~~~~~~~
 
 If automatic escaping is enabled, the output of the filter may be escaped
 before printing. If your filter acts as an escaper (or explicitly outputs html
-or javascript code), you will want the raw output to be printed. In such a
+or JavaScript code), you will want the raw output to be printed. In such a
 case, set the ``is_safe`` option::
 
-    $filter = new Twig_Filter_Function('nl2br', array('is_safe' => array('html')));
+    $filter = new Twig_SimpleFilter('nl2br', 'nl2br', array('is_safe' => array('html')));
 
 Some filters may need to work on input that is already escaped or safe, for
 example when adding (safe) html tags to originally unsafe output. In such a
 case, set the ``pre_escape`` option to escape the input data before it is run
 through your filter::
 
-    $filter = new Twig_Filter_Function('somefilter', array('pre_escape' => 'html', 'is_safe' => array('html')));
+    $filter = new Twig_SimpleFilter('somefilter', 'somefilter', array('pre_escape' => 'html', 'is_safe' => array('html')));
 
 Dynamic Filters
 ~~~~~~~~~~~~~~~
 
-.. versionadded:: 1.5
-    Dynamic filters support was added in Twig 1.5.
-
 A filter name containing the special ``*`` character is a dynamic filter as
 the ``*`` can be any string::
 
-    $twig->addFilter('*_path', new Twig_Filter_Function('twig_path'));
-
-    function twig_path($name, $arguments)
-    {
+    $filter = new Twig_SimpleFilter('*_path', function ($name, $arguments) {
         // ...
-    }
+    });
 
 The following filters will be matched by the above defined dynamic filter:
 
@@ -274,83 +241,43 @@ The following filters will be matched by the above defined dynamic filter:
 
 A dynamic filter can define more than one dynamic parts::
 
-    $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path'));
-
-    function twig_path($name, $suffix, $arguments)
-    {
+    $filter = new Twig_SimpleFilter('*_path', function ($name, $suffix, $arguments) {
         // ...
-    }
+    });
 
 The filter will receive all dynamic part values before the normal filters
-arguments. For instance, a call to ``'foo'|a_path_b()`` will result in the
-following PHP call: ``twig_path('a', 'b', 'foo')``.
+arguments, but after the environment and the context. For instance, a call to
+``'foo'|a_path_b()`` will result in the following arguments to be passed to
+the filter: ``('a', 'b', 'foo')``.
 
 Functions
 ---------
 
-A function is a regular PHP function or an object method that can be called from
-templates.
-
-.. code-block:: jinja
-
-    {{ constant("DATE_W3C") }}
+Functions are defined in the exact same way as filters, but you need to create
+an instance of ``Twig_SimpleFunction``::
 
-When compiling this template to PHP, Twig looks for the PHP callable
-associated with the ``constant`` function. The ``constant`` function is a built-in Twig
-function, and it is simply mapped to the PHP ``constant()`` function. After
-compilation, the generated PHP code is roughly equivalent to:
-
-.. code-block:: html+php
-
-    <?php echo constant('DATE_W3C') ?>
-
-Adding a function is similar to adding a filter. This can be done by calling the
-``addFunction()`` method on the ``Twig_Environment`` instance::
-
-    $twig = new Twig_Environment($loader);
-    $twig->addFunction('functionName', new Twig_Function_Function('someFunction'));
-
-You can also expose extension methods as functions in your templates::
-
-    // $this is an object that implements Twig_ExtensionInterface.
     $twig = new Twig_Environment($loader);
-    $twig->addFunction('otherFunction', new Twig_Function_Method($this, 'someMethod'));
-
-Functions also support ``needs_environment`` and ``is_safe`` parameters.
-
-Dynamic Functions
-~~~~~~~~~~~~~~~~~
-
-.. versionadded:: 1.5
-    Dynamic functions support was added in Twig 1.5.
-
-A function name containing the special ``*`` character is a dynamic function
-as the ``*`` can be any string::
-
-    $twig->addFunction('*_path', new Twig_Function_Function('twig_path'));
-
-    function twig_path($name, $arguments)
-    {
+    $function = new Twig_SimpleFunction('function_name', function () {
         // ...
-    }
+    });
+    $twig->addFunction($function);
 
-The following functions will be matched by the above defined dynamic function:
+Functions support the same features as filters, except for the ``pre_escape``
+and ``preserves_safety`` options.
 
-* ``product_path``
-* ``category_path``
-
-A dynamic function can define more than one dynamic parts::
+Tests
+-----
 
-    $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path'));
+Tests are defined in the exact same way as filters and functions, but you need
+to create an instance of ``Twig_SimpleTest``::
 
-    function twig_path($name, $suffix, $arguments)
-    {
+    $twig = new Twig_Environment($loader);
+    $test = new Twig_SimpleTest('test_name', function () {
         // ...
-    }
+    });
+    $twig->addTest($test);
 
-The function will receive all dynamic part values before the normal functions
-arguments. For instance, a call to ``a_path_b('foo')`` will result in the
-following PHP call: ``twig_path('a', 'b', 'foo')``.
+Tests do not support any options.
 
 Tags
 ----
@@ -517,7 +444,7 @@ to host all the specific tags and filters you want to add to Twig.
 .. tip::
 
     When packaging your code into an extension, Twig is smart enough to
-    recompile your templates whenever you make a change to it (when the
+    recompile your templates whenever you make a change to it (when
     ``auto_reload`` is enabled).
 
 .. note::
@@ -663,7 +590,7 @@ method::
         public function getFunctions()
         {
             return array(
-                'lipsum' => new Twig_Function_Function('generate_lipsum'),
+                new Twig_SimpleFunction('lipsum', 'generate_lipsum'),
             );
         }
 
@@ -682,94 +609,13 @@ environment::
         public function getFilters()
         {
             return array(
-                'rot13' => new Twig_Filter_Function('str_rot13'),
+                new Twig_SimpleFilter('rot13', 'str_rot13'),
             );
         }
 
         // ...
     }
 
-As you can see in the above code, the ``getFilters()`` method returns an array
-where keys are the name of the filters (``rot13``) and the values the
-definition of the filter (``new Twig_Filter_Function('str_rot13')``).
-
-As seen in the previous chapter, you can also define filters as static methods
-on the extension class::
-
-$twig->addFilter('rot13', new Twig_Filter_Function('Project_Twig_Extension::rot13Filter'));
-
-You can also use ``Twig_Filter_Method`` instead of ``Twig_Filter_Function``
-when defining a filter to use a method::
-
-    class Project_Twig_Extension extends Twig_Extension
-    {
-        public function getFilters()
-        {
-            return array(
-                'rot13' => new Twig_Filter_Method($this, 'rot13Filter'),
-            );
-        }
-
-        public function rot13Filter($string)
-        {
-            return str_rot13($string);
-        }
-
-        // ...
-    }
-
-The first argument of the ``Twig_Filter_Method`` constructor is always
-``$this``, the current extension object. The second one is the name of the
-method to call.
-
-Using methods for filters is a great way to package your filter without
-polluting the global namespace. This also gives the developer more flexibility
-at the cost of a small overhead.
-
-Overriding default Filters
-..........................
-
-If some default core filters do not suit your needs, you can easily override
-them by creating your own core extension. Of course, you don't need to copy
-and paste the whole core extension code of Twig. Instead, you can just extends
-it and override the filter(s) you want by overriding the ``getFilters()``
-method::
-
-    class MyCoreExtension extends Twig_Extension_Core
-    {
-        public function getFilters()
-        {
-            return array_merge(parent::getFilters(), array(
-                'date' => new Twig_Filter_Method($this, 'dateFilter'),
-                // ...
-            ));
-        }
-
-        public function dateFilter($timestamp, $format = 'F j, Y H:i')
-        {
-            return '...'.twig_date_format_filter($timestamp, $format);
-        }
-
-        // ...
-    }
-
-Here, we override the ``date`` filter with a custom one. Using this new core
-extension is as simple as registering the ``MyCoreExtension`` extension by
-calling the ``addExtension()`` method on the environment instance::
-
-    $twig = new Twig_Environment($loader);
-    $twig->addExtension(new MyCoreExtension());
-
-But I can already hear some people wondering how it can work as the Core
-extension is loaded by default. That's true, but the trick is that both
-extensions share the same unique identifier (``core`` - defined in the
-``getName()`` method). By registering an extension with the same name as an
-existing one, you have actually overridden the default one, even if it is
-already registered::
-
-    $twig->addExtension(new Twig_Extension_Core());
-    $twig->addExtension(new MyCoreExtension());
-
 Tags
 ~~~~
 
@@ -825,19 +671,59 @@ The ``getTests()`` methods allows to add new test functions::
         public function getTests()
         {
             return array(
-                'even' => new Twig_Test_Function('twig_test_even'),
+                new Twig_SimpleTest('even', 'twig_test_even'),
             );
         }
 
         // ...
     }
 
+Overloading
+-----------
+
+To overload an already defined filter, test, operator, global variable, or
+function, define it again **as late as possible**::
+
+    $twig = new Twig_Environment($loader);
+    $twig->addFilter(new Twig_SimpleFilter('date', function ($timestamp, $format = 'F j, Y H:i') {
+        // do something different from the built-in date filter
+    }));
+
+Here, we have overloaded the built-in ``date`` filter with a custom one.
+
+That also works with an extension::
+
+    class MyCoreExtension extends Twig_Extension
+    {
+        public function getFilters()
+        {
+            return array(
+                new Twig_SimpleFilter('date', array($this, 'dateFilter')),
+            );
+        }
+
+        public function dateFilter($timestamp, $format = 'F j, Y H:i')
+        {
+            // do something different from the built-in date filter
+        }
+
+        public function getName()
+        {
+            return 'project';
+        }
+    }
+
+    $twig = new Twig_Environment($loader);
+    $twig->addExtension(new MyCoreExtension());
+
+.. caution::
+
+    Note that overloading the built-in Twig elements is not recommended as it
+    might be confusing.
+
 Testing an Extension
 --------------------
 
-.. versionadded:: 1.10
-    Support for functional tests was added in Twig 1.10.
-
 Functional Tests
 ~~~~~~~~~~~~~~~~
 
diff --git a/core/vendor/twig/twig/doc/advanced.rst b/core/vendor/twig/twig/doc/advanced_legacy.rst
similarity index 96%
copy from core/vendor/twig/twig/doc/advanced.rst
copy to core/vendor/twig/twig/doc/advanced_legacy.rst
index 4be84ed..8dbc525 100644
--- a/core/vendor/twig/twig/doc/advanced.rst
+++ b/core/vendor/twig/twig/doc/advanced_legacy.rst
@@ -1,6 +1,12 @@
 Extending Twig
 ==============
 
+.. caution::
+
+    This section describes how to extends Twig for versions **older than
+    1.12**. If you are using a newer version, read the :doc:`newer<advanced>`
+    chapter instead.
+
 Twig can be extended in many ways; you can add extra tags, filters, tests,
 operators, global variables, and functions. You can even extend the parser
 itself with node visitors.
@@ -730,19 +736,17 @@ Overriding default Filters
 ..........................
 
 If some default core filters do not suit your needs, you can easily override
-them by creating your own core extension. Of course, you don't need to copy
-and paste the whole core extension code of Twig. Instead, you can just extends
-it and override the filter(s) you want by overriding the ``getFilters()``
-method::
+them by creating your own extension. Just use the same names as the one you
+want to override::
 
-    class MyCoreExtension extends Twig_Extension_Core
+    class MyCoreExtension extends Twig_Extension
     {
         public function getFilters()
         {
-            return array_merge(parent::getFilters(), array(
+            return array(
                 'date' => new Twig_Filter_Method($this, 'dateFilter'),
                 // ...
-            ));
+            );
         }
 
         public function dateFilter($timestamp, $format = 'F j, Y H:i')
@@ -750,26 +754,19 @@ method::
             return '...'.twig_date_format_filter($timestamp, $format);
         }
 
-        // ...
+        public function getName()
+        {
+            return 'project';
+        }
     }
 
-Here, we override the ``date`` filter with a custom one. Using this new core
-extension is as simple as registering the ``MyCoreExtension`` extension by
-calling the ``addExtension()`` method on the environment instance::
+Here, we override the ``date`` filter with a custom one. Using this extension
+is as simple as registering the ``MyCoreExtension`` extension by calling the
+``addExtension()`` method on the environment instance::
 
     $twig = new Twig_Environment($loader);
     $twig->addExtension(new MyCoreExtension());
 
-But I can already hear some people wondering how it can work as the Core
-extension is loaded by default. That's true, but the trick is that both
-extensions share the same unique identifier (``core`` - defined in the
-``getName()`` method). By registering an extension with the same name as an
-existing one, you have actually overridden the default one, even if it is
-already registered::
-
-    $twig->addExtension(new Twig_Extension_Core());
-    $twig->addExtension(new MyCoreExtension());
-
 Tags
 ~~~~
 
diff --git a/core/vendor/twig/twig/doc/api.rst b/core/vendor/twig/twig/doc/api.rst
index fbcc8bc..9160c3f 100644
--- a/core/vendor/twig/twig/doc/api.rst
+++ b/core/vendor/twig/twig/doc/api.rst
@@ -317,10 +317,7 @@ Twig comes bundled with the following extensions:
 * *Twig_Extension_Optimizer*: Optimizers the node tree before compilation.
 
 The core, escaper, and optimizer extensions do not need to be added to the
-Twig environment, as they are registered by default. You can disable an
-already registered extension::
-
-    $twig->removeExtension('escaper');
+Twig environment, as they are registered by default.
 
 Built-in Extensions
 -------------------
@@ -354,7 +351,7 @@ The ``core`` extension defines all the core features of Twig:
   * ``do``
   * ``embed``
   * ``flush``
-  * ``raw``
+  * ``verbatim``
   * ``sandbox``
   * ``use``
 
diff --git a/core/vendor/twig/twig/doc/deprecated.rst b/core/vendor/twig/twig/doc/deprecated.rst
new file mode 100644
index 0000000..f0a3a0f
--- /dev/null
+++ b/core/vendor/twig/twig/doc/deprecated.rst
@@ -0,0 +1,98 @@
+Deprecated Features
+===================
+
+This document lists all deprecated features in Twig. Deprecated features are
+kept for backward compatibility and removed in the next major release (a
+feature that was deprecated in Twig 1.x is removed in Twig 2.0).
+
+Token Parsers
+-------------
+
+* As of Twig 1.x, the token parser broker sub-system is deprecated. The
+  following class and interface will be removed in 2.0:
+
+  * ``Twig_TokenParserBrokerInterface``
+  * ``Twig_TokenParserBroker``
+
+Extensions
+----------
+
+* As of Twig 1.x, the ability to remove an extension is deprecated and the
+  ``Twig_Environment::removeExtension()`` method will be removed in 2.0.
+
+PEAR
+----
+
+PEAR support will be discontinued in Twig 2.0, and no PEAR packages will be
+provided. Use Composer instead.
+
+Filters
+-------
+
+* As of Twig 1.x, use ``Twig_SimpleFilter`` to add a filter. The following
+  classes and interfaces will be removed in 2.0:
+
+  * ``Twig_FilterInterface``
+  * ``Twig_FilterCallableInterface``
+  * ``Twig_Filter``
+  * ``Twig_Filter_Function``
+  * ``Twig_Filter_Method``
+  * ``Twig_Filter_Node``
+
+* As of Twig 2.x, the ``Twig_SimpleFilter`` class is deprecated and will be
+  removed in Twig 3.x (use ``Twig_Filter`` instead). In Twig 2.x,
+  ``Twig_SimpleFilter`` is just an alias for ``Twig_Filter``.
+
+Functions
+---------
+
+* As of Twig 1.x, use ``Twig_SimpleFunction`` to add a function. The following
+  classes and interfaces will be removed in 2.0:
+
+  * ``Twig_FunctionInterface``
+  * ``Twig_FunctionCallableInterface``
+  * ``Twig_Function``
+  * ``Twig_Function_Function``
+  * ``Twig_Function_Method``
+  * ``Twig_Function_Node``
+
+* As of Twig 2.x, the ``Twig_SimpleFunction`` class is deprecated and will be
+  removed in Twig 3.x (use ``Twig_Function`` instead). In Twig 2.x,
+  ``Twig_SimpleFunction`` is just an alias for ``Twig_Function``.
+
+Tests
+-----
+
+* As of Twig 1.x, use ``Twig_SimpleTest`` to add a test. The following classes
+  and interfaces will be removed in 2.0:
+
+  * ``Twig_TestInterface``
+  * ``Twig_TestCallableInterface``
+  * ``Twig_Test``
+  * ``Twig_Test_Function``
+  * ``Twig_Test_Method``
+  * ``Twig_Test_Node``
+
+* As of Twig 2.x, the ``Twig_SimpleTest`` class is deprecated and will be
+  removed in Twig 3.x (use ``Twig_Test`` instead). In Twig 2.x,
+  ``Twig_SimpleTest`` is just an alias for ``Twig_Test``.
+
+Interfaces
+----------
+
+* As of Twig 2.x, the following interfaces are deprecated and empty (they will
+  be removed in Twig 3.0):
+
+* ``Twig_CompilerInterface``     (use ``Twig_Compiler`` instead)
+* ``Twig_LexerInterface``        (use ``Twig_Lexer`` instead)
+* ``Twig_NodeInterface``         (use ``Twig_Node`` instead)
+* ``Twig_ParserInterface``       (use ``Twig_Parser`` instead)
+* ``Twig_ExistsLoaderInterface`` (merged with ``Twig_LoaderInterface``)
+* ``Twig_TemplateInterface``     (use ``Twig_Template`` instead)
+
+Globals
+-------
+
+* As of Twig 2.x, the ability to register a global variable after the runtime
+  or the extensions have been initialized is not possible anymore (but
+  changing the value of an already registered global is possible).
diff --git a/core/vendor/twig/twig/doc/filters/convert_encoding.rst b/core/vendor/twig/twig/doc/filters/convert_encoding.rst
index 2febab2..1b0eb60 100644
--- a/core/vendor/twig/twig/doc/filters/convert_encoding.rst
+++ b/core/vendor/twig/twig/doc/filters/convert_encoding.rst
@@ -18,5 +18,11 @@ is the input charset:
     them must be installed. In case both are installed, `mbstring`_ is used by
     default (Twig before 1.8.1 uses `iconv`_ by default).
 
+Arguments
+---------
+
+ * ``from``: The input charset
+ * ``to``:   The output charset
+
 .. _`iconv`:    http://php.net/iconv
 .. _`mbstring`: http://php.net/mbstring
diff --git a/core/vendor/twig/twig/doc/filters/date.rst b/core/vendor/twig/twig/doc/filters/date.rst
index 39ad732..8e2f31f 100644
--- a/core/vendor/twig/twig/doc/filters/date.rst
+++ b/core/vendor/twig/twig/doc/filters/date.rst
@@ -77,6 +77,12 @@ The default timezone can also be set globally by calling ``setTimezone()``:
     $twig = new Twig_Environment($loader);
     $twig->getExtension('core')->setTimezone('Europe/Paris');
 
+Arguments
+---------
+
+ * ``format``:   The date format
+ * ``timezone``: The date timezone
+
 .. _`strtotime`:    http://www.php.net/strtotime
 .. _`DateTime`:     http://www.php.net/DateTime
 .. _`DateInterval`: http://www.php.net/DateInterval
diff --git a/core/vendor/twig/twig/doc/filters/date_modify.rst b/core/vendor/twig/twig/doc/filters/date_modify.rst
index ae12c52..6a5c73d 100644
--- a/core/vendor/twig/twig/doc/filters/date_modify.rst
+++ b/core/vendor/twig/twig/doc/filters/date_modify.rst
@@ -14,5 +14,10 @@ The ``date_modify`` filter accepts strings (it must be in a format supported
 by the `strtotime`_ function) or `DateTime`_ instances. You can easily combine
 it with the :doc:`date<date>` filter for formatting.
 
+Arguments
+---------
+
+ * ``modifier``: The modifier
+
 .. _`strtotime`: http://www.php.net/strtotime
 .. _`DateTime`:  http://www.php.net/DateTime
diff --git a/core/vendor/twig/twig/doc/filters/default.rst b/core/vendor/twig/twig/doc/filters/default.rst
index 4055ead..46ed963 100644
--- a/core/vendor/twig/twig/doc/filters/default.rst
+++ b/core/vendor/twig/twig/doc/filters/default.rst
@@ -26,3 +26,8 @@ undefined:
 
     Read the documentation for the :doc:`defined<../tests/defined>` and
     :doc:`empty<../tests/empty>` tests to learn more about their semantics.
+
+Arguments
+---------
+
+ * ``default``: The default value
diff --git a/core/vendor/twig/twig/doc/filters/escape.rst b/core/vendor/twig/twig/doc/filters/escape.rst
index ddb2bbb..5ade7d7 100644
--- a/core/vendor/twig/twig/doc/filters/escape.rst
+++ b/core/vendor/twig/twig/doc/filters/escape.rst
@@ -74,7 +74,7 @@ The ``escape`` filter supports the following escaping strategies:
         {% endautoescape %}
 
     When using a variable as the escaping strategy, you should disable
-    automatic escaping::
+    automatic escaping:
 
     .. code-block:: jinja
 
@@ -84,4 +84,10 @@ The ``escape`` filter supports the following escaping strategies:
             {{ var|escape(strategy)|raw }} {# won't be double-escaped #}
         {% endautoescape %}
 
+Arguments
+---------
+
+ * ``strategy``: The escaping strategy
+ * ``charset``:  The string charset
+
 .. _`htmlspecialchars`: http://php.net/htmlspecialchars
diff --git a/core/vendor/twig/twig/doc/filters/join.rst b/core/vendor/twig/twig/doc/filters/join.rst
index eec2045..f495242 100644
--- a/core/vendor/twig/twig/doc/filters/join.rst
+++ b/core/vendor/twig/twig/doc/filters/join.rst
@@ -16,3 +16,8 @@ define it with the optional first parameter:
 
     {{ [1, 2, 3]|join('|') }}
     {# returns 1|2|3 #}
+
+Arguments
+---------
+
+ * ``glue``: The separator
diff --git a/core/vendor/twig/twig/doc/filters/json_encode.rst b/core/vendor/twig/twig/doc/filters/json_encode.rst
index c7d19b3..374f519 100644
--- a/core/vendor/twig/twig/doc/filters/json_encode.rst
+++ b/core/vendor/twig/twig/doc/filters/json_encode.rst
@@ -11,4 +11,9 @@ The ``json_encode`` filter returns the JSON representation of a string:
 
     Internally, Twig uses the PHP `json_encode`_ function.
 
+Arguments
+---------
+
+ * ``options``: The options
+
 .. _`json_encode`: http://php.net/json_encode
diff --git a/core/vendor/twig/twig/doc/filters/number_format.rst b/core/vendor/twig/twig/doc/filters/number_format.rst
index b591b1e..fedacd9 100644
--- a/core/vendor/twig/twig/doc/filters/number_format.rst
+++ b/core/vendor/twig/twig/doc/filters/number_format.rst
@@ -35,4 +35,11 @@ These defaults can be easily changed through the core extension:
 The defaults set for ``number_format`` can be over-ridden upon each call using the
 additional parameters.
 
+Arguments
+---------
+
+ * ``decimal``:       The number of decimal points to display
+ * ``decimal_point``: The character(s) to use for the decimal point
+ * ``decimal_sep``:   The character(s) to use for the thousands separator
+
 .. _`number_format`: http://php.net/number_format
diff --git a/core/vendor/twig/twig/doc/filters/replace.rst b/core/vendor/twig/twig/doc/filters/replace.rst
index cc603fa..e961f23 100644
--- a/core/vendor/twig/twig/doc/filters/replace.rst
+++ b/core/vendor/twig/twig/doc/filters/replace.rst
@@ -11,4 +11,9 @@ The ``replace`` filter formats a given string by replacing the placeholders
     {# returns I like foo and bar
        if the foo parameter equals to the foo string. #}
 
+Arguments
+---------
+
+ * ``replace_pairs``: The placeholder values
+
 .. seealso:: :doc:`format<format>`
diff --git a/core/vendor/twig/twig/doc/filters/slice.rst b/core/vendor/twig/twig/doc/filters/slice.rst
index 80a4293..7a9ada0 100644
--- a/core/vendor/twig/twig/doc/filters/slice.rst
+++ b/core/vendor/twig/twig/doc/filters/slice.rst
@@ -34,6 +34,12 @@ As syntactic sugar, you can also use the ``[]`` notation:
 
     {{ '1234'[1:2] }}
 
+    {# you can omit the first argument -- which is the same as 0 #}
+    {{ '1234'[:2] }} {# will display "12" #}
+
+    {# you can omit the last argument -- which will select everything till the end #}
+    {{ '1234'[2:] }} {# will display "34 #}
+
 The ``slice`` filter works as the `array_slice`_ PHP function for arrays and
 `substr`_ for strings.
 
@@ -52,6 +58,13 @@ up until the end of the variable.
 
     It also works with objects implementing the `Traversable`_ interface.
 
+Arguments
+---------
+
+ * ``start``:         The start of the slice
+ * ``length``:        The size of the slice
+ * ``preserve_keys``: Whether to preserve key or not (when the input is an array)
+
 .. _`Traversable`: http://php.net/manual/en/class.traversable.php
 .. _`array_slice`: http://php.net/array_slice
 .. _`substr`:      http://php.net/substr
diff --git a/core/vendor/twig/twig/doc/filters/split.rst b/core/vendor/twig/twig/doc/filters/split.rst
index 9b9e4e6..7cd2ca5 100644
--- a/core/vendor/twig/twig/doc/filters/split.rst
+++ b/core/vendor/twig/twig/doc/filters/split.rst
@@ -25,7 +25,7 @@ You can also pass a ``limit`` argument:
 .. code-block:: jinja
 
     {{ "one,two,three,four,five"|split(',', 3) }}
-    {# returns [one, two, "three,four,five"] #}
+    {# returns ['one', 'two', 'three,four,five'] #}
 
 If the ``delimiter`` is an empty string, then value will be split by equal
 chunks. Length is set by the ``limit`` argument (one character by default).
@@ -33,15 +33,21 @@ chunks. Length is set by the ``limit`` argument (one character by default).
 .. code-block:: jinja
 
     {{ "123"|split('') }}
-    {# returns [1, 2, 3] #}
+    {# returns ['1', '2', '3'] #}
 
     {{ "aabbcc"|split('', 2) }}
-    {# returns [aa, bb, cc] #}
+    {# returns ['aa', 'bb', 'cc'] #}
 
 .. note::
 
     Internally, Twig uses the PHP `explode`_ or `str_split`_ (if delimiter is
     empty) functions for string splitting.
 
+Arguments
+---------
+
+ * ``delimiter``: The delimiter
+ * ``limit``:     The limit argument
+
 .. _`explode`:   http://php.net/explode
 .. _`str_split`: http://php.net/str_split
diff --git a/core/vendor/twig/twig/doc/filters/trim.rst b/core/vendor/twig/twig/doc/filters/trim.rst
index f1215f6..f38afd5 100644
--- a/core/vendor/twig/twig/doc/filters/trim.rst
+++ b/core/vendor/twig/twig/doc/filters/trim.rst
@@ -21,4 +21,9 @@ and end of a string:
 
     Internally, Twig uses the PHP `trim`_ function.
 
+Arguments
+---------
+
+ * ``character_mask``: The characters to strip
+
 .. _`trim`: http://php.net/trim
diff --git a/core/vendor/twig/twig/doc/functions/constant.rst b/core/vendor/twig/twig/doc/functions/constant.rst
index 5b247b3..bea0e9f 100644
--- a/core/vendor/twig/twig/doc/functions/constant.rst
+++ b/core/vendor/twig/twig/doc/functions/constant.rst
@@ -1,9 +1,18 @@
 ``constant``
 ============
 
+.. versionadded: 1.12.1
+    constant now accepts object instances as the second argument.
+
 ``constant`` returns the constant value for a given string:
 
 .. code-block:: jinja
 
     {{ some_date|date(constant('DATE_W3C')) }}
     {{ constant('Namespace\\Classname::CONSTANT_NAME') }}
+
+As of 1.12.1 you can read constants from object instances as well:
+
+.. code-block:: jinja
+
+    {{ constant('RSS', date) }}
diff --git a/core/vendor/twig/twig/doc/functions/cycle.rst b/core/vendor/twig/twig/doc/functions/cycle.rst
index fe11d68..0015cae 100644
--- a/core/vendor/twig/twig/doc/functions/cycle.rst
+++ b/core/vendor/twig/twig/doc/functions/cycle.rst
@@ -18,3 +18,8 @@ The array can contain any number of values:
     {% for i in 0..10 %}
         {{ cycle(fruits, i) }}
     {% endfor %}
+
+Arguments
+---------
+
+ * ``position``: The cycle position
diff --git a/core/vendor/twig/twig/doc/functions/date.rst b/core/vendor/twig/twig/doc/functions/date.rst
index c1a011c..fd67fc5 100644
--- a/core/vendor/twig/twig/doc/functions/date.rst
+++ b/core/vendor/twig/twig/doc/functions/date.rst
@@ -43,4 +43,10 @@ If no argument is passed, the function returns the current date:
         $twig = new Twig_Environment($loader);
         $twig->getExtension('core')->setTimezone('Europe/Paris');
 
+Arguments
+---------
+
+ * ``date``:     The date
+ * ``timezone``: The timezone
+
 .. _`date`: http://www.php.net/date
diff --git a/core/vendor/twig/twig/doc/functions/dump.rst b/core/vendor/twig/twig/doc/functions/dump.rst
index 8ff0c05..1500b0f 100644
--- a/core/vendor/twig/twig/doc/functions/dump.rst
+++ b/core/vendor/twig/twig/doc/functions/dump.rst
@@ -60,5 +60,10 @@ dumped:
 
     Internally, Twig uses the PHP `var_dump`_ function.
 
+Arguments
+---------
+
+ * ``context``: The context to dump
+
 .. _`XDebug`:   http://xdebug.org/docs/display
 .. _`var_dump`: http://php.net/var_dump
diff --git a/core/vendor/twig/twig/doc/functions/include.rst b/core/vendor/twig/twig/doc/functions/include.rst
new file mode 100644
index 0000000..eaddfe6
--- /dev/null
+++ b/core/vendor/twig/twig/doc/functions/include.rst
@@ -0,0 +1,80 @@
+``include``
+===========
+
+.. versionadded:: 1.12
+    The include function was added in Twig 1.12.
+
+The ``include`` function returns the rendered content of a template:
+
+.. code-block:: jinja
+
+    {{ include('template.html') }}
+    {{ include(some_var) }}
+
+Included templates have access to the variables of the active context.
+
+If you are using the filesystem loader, the templates are looked for in the
+paths defined by it.
+
+The context is passed by default to the template but you can also pass
+additional variables:
+
+.. code-block:: jinja
+
+    {# template.html will have access to the variables from the current context and the additional ones provided #}
+    {{ include('template.html', {foo: 'bar'}) }}
+
+You can disable access to the context by setting ``with_context`` to
+``false``:
+
+.. code-block:: jinja
+
+    {# only the foo variable will be accessible #}
+    {{ include('template.html', {foo: 'bar'}, with_context = false) }}
+
+.. code-block:: jinja
+
+    {# no variables will be accessible #}
+    {{ include('template.html', with_context = false) }}
+
+And if the expression evaluates to a ``Twig_Template`` object, Twig will use it
+directly::
+
+    // {{ include(template) }}
+
+    $template = $twig->loadTemplate('some_template.twig');
+
+    $twig->loadTemplate('template.twig')->display(array('template' => $template));
+
+When you set the ``ignore_missing`` flag, Twig will return an empty string if
+the template does not exist:
+
+.. code-block:: jinja
+
+    {{ include('sidebar.html', ignore_missing = true) }}
+
+You can also provide a list of templates that are checked for existence before
+inclusion. The first template that exists will be rendered:
+
+.. code-block:: jinja
+
+    {{ include(['page_detailed.html', 'page.html']) }}
+
+If ``ignore_missing`` is set, it will fall back to rendering nothing if none
+of the templates exist, otherwise it will throw an exception.
+
+When including a template created by an end user, you should consider
+sandboxing it:
+
+.. code-block:: jinja
+
+    {{ include('page.html', sandboxed = true) }}
+
+Arguments
+---------
+
+ * ``template``:       The template to render
+ * ``variables``:      The variables to pass to the template
+ * ``with_context``:   Whether to pass the current context variables or not
+ * ``ignore_missing``: Whether to ignore missing templates or not
+ * ``sandboxed``:      Whether to sandbox the template or not
diff --git a/core/vendor/twig/twig/doc/functions/index.rst b/core/vendor/twig/twig/doc/functions/index.rst
index 4d9a003..c5ac896 100644
--- a/core/vendor/twig/twig/doc/functions/index.rst
+++ b/core/vendor/twig/twig/doc/functions/index.rst
@@ -14,3 +14,4 @@ Functions
     dump
     date
     template_from_string
+    include
diff --git a/core/vendor/twig/twig/doc/functions/random.rst b/core/vendor/twig/twig/doc/functions/random.rst
index 104493d..a5a916b 100644
--- a/core/vendor/twig/twig/doc/functions/random.rst
+++ b/core/vendor/twig/twig/doc/functions/random.rst
@@ -21,4 +21,9 @@ parameter type:
     {{ random() }}                              {# example output: 15386094 (works as native PHP `mt_rand`_ function) #}
     {{ random(5) }}                             {# example output: 3 #}
 
+Arguments
+---------
+
+ * ``values``: The values
+
 .. _`mt_rand`: http://php.net/mt_rand
diff --git a/core/vendor/twig/twig/doc/functions/range.rst b/core/vendor/twig/twig/doc/functions/range.rst
index c9bdd96..b1fa547 100644
--- a/core/vendor/twig/twig/doc/functions/range.rst
+++ b/core/vendor/twig/twig/doc/functions/range.rst
@@ -35,4 +35,11 @@ function (with a step of 1):
 
     The ``range`` function works as the native PHP `range`_ function.
 
+Arguments
+---------
+
+ * ``low``:  The first value of the sequence.
+ * ``high``: The highest possible value of the sequence.
+ * ``step``: The increment between elements of the sequence.
+
 .. _`range`: http://php.net/range
diff --git a/core/vendor/twig/twig/doc/functions/template_from_string.rst b/core/vendor/twig/twig/doc/functions/template_from_string.rst
index 0b3b0b4..6df650e 100644
--- a/core/vendor/twig/twig/doc/functions/template_from_string.rst
+++ b/core/vendor/twig/twig/doc/functions/template_from_string.rst
@@ -25,3 +25,8 @@ The ``template_from_string`` function loads a template from a string:
     Even if you will probably always use the ``template_from_string`` function
     with the ``include`` tag, you can use it with any tag or function that
     takes a template as an argument (like the ``embed`` or ``extends`` tags).
+
+Arguments
+---------
+
+ * ``template``: The template
diff --git a/core/vendor/twig/twig/doc/index.rst b/core/vendor/twig/twig/doc/index.rst
index 56012f7..3e5166c 100644
--- a/core/vendor/twig/twig/doc/index.rst
+++ b/core/vendor/twig/twig/doc/index.rst
@@ -15,3 +15,4 @@ Twig
     filters/index
     functions/index
     tests/index
+    deprecated
diff --git a/core/vendor/twig/twig/doc/tags/include.rst b/core/vendor/twig/twig/doc/tags/include.rst
index 1440c50..d839968 100644
--- a/core/vendor/twig/twig/doc/tags/include.rst
+++ b/core/vendor/twig/twig/doc/tags/include.rst
@@ -19,23 +19,23 @@ You can add additional variables by passing them after the ``with`` keyword:
 
 .. code-block:: jinja
 
-    {# the foo template will have access to the variables from the current context and the foo one #}
-    {% include 'foo' with {'foo': 'bar'} %}
+    {# template.html will have access to the variables from the current context and the additional ones provided #}
+    {% include 'template.html' with {'foo': 'bar'} %}
 
     {% set vars = {'foo': 'bar'} %}
-    {% include 'foo' with vars %}
+    {% include 'template.html' with vars %}
 
 You can disable access to the context by appending the ``only`` keyword:
 
 .. code-block:: jinja
 
     {# only the foo variable will be accessible #}
-    {% include 'foo' with {'foo': 'bar'} only %}
+    {% include 'template.html' with {'foo': 'bar'} only %}
 
 .. code-block:: jinja
 
-    {# no variable will be accessible #}
-    {% include 'foo' only %}
+    {# no variables will be accessible #}
+    {% include 'template.html' only %}
 
 .. tip::
 
@@ -68,9 +68,9 @@ placed just after the template name. Here some valid examples:
 
 .. code-block:: jinja
 
-    {% include "sidebar.html" ignore missing %}
-    {% include "sidebar.html" ignore missing with {'foo': 'bar} %}
-    {% include "sidebar.html" ignore missing only %}
+    {% include 'sidebar.html' ignore missing %}
+    {% include 'sidebar.html' ignore missing with {'foo': 'bar'} %}
+    {% include 'sidebar.html' ignore missing only %}
 
 .. versionadded:: 1.2
     The possibility to pass an array of templates has been added in Twig 1.2.
diff --git a/core/vendor/twig/twig/doc/tags/index.rst b/core/vendor/twig/twig/doc/tags/index.rst
index fe0a00f..6dbc550 100644
--- a/core/vendor/twig/twig/doc/tags/index.rst
+++ b/core/vendor/twig/twig/doc/tags/index.rst
@@ -17,7 +17,7 @@ Tags
     use
     spaceless
     autoescape
-    raw
+    verbatim
     flush
     do
     sandbox
diff --git a/core/vendor/twig/twig/doc/tags/raw.rst b/core/vendor/twig/twig/doc/tags/raw.rst
deleted file mode 100644
index 4136c70..0000000
--- a/core/vendor/twig/twig/doc/tags/raw.rst
+++ /dev/null
@@ -1,16 +0,0 @@
-``raw``
-=======
-
-The ``raw`` tag marks sections as being raw text that should not be parsed.
-For example to put Twig syntax as example into a template you can use this
-snippet:
-
-.. code-block:: jinja
-
-    {% raw %}
-        <ul>
-        {% for item in seq %}
-            <li>{{ item }}</li>
-        {% endfor %}
-        </ul>
-    {% endraw %}
diff --git a/core/vendor/twig/twig/doc/templates.rst b/core/vendor/twig/twig/doc/templates.rst
index 104dcad..a23fcb6 100644
--- a/core/vendor/twig/twig/doc/templates.rst
+++ b/core/vendor/twig/twig/doc/templates.rst
@@ -57,6 +57,7 @@ Many IDEs support syntax highlighting and auto-completion for Twig:
 * *Coda 2* via the `other Twig syntax mode`_
 * *Komodo* and *Komodo Edit* via the Twig highlight/syntax check mode
 * *Notepad++* via the `Notepad++ Twig Highlighter`_
+* *Emacs* via `web-mode.el`_
 
 Variables
 ---------
@@ -190,6 +191,56 @@ progression of integers:
 Go to the :doc:`functions<functions/index>` page to learn more about the
 built-in functions.
 
+Named Arguments
+---------------
+
+.. versionadded:: 1.12
+    Support for named arguments was added in Twig 1.12.
+
+Arguments for filters and functions can also be passed as *named arguments*:
+
+.. code-block:: jinja
+
+    {% for i in range(low=1, high=10, step=2) %}
+        {{ i }},
+    {% endfor %}
+
+Using named arguments makes your templates more explicit about the meaning of
+the values you pass as arguments:
+
+.. code-block:: jinja
+
+    {{ data|convert_encoding('UTF-8', 'iso-2022-jp') }}
+
+    {# versus #}
+
+    {{ data|convert_encoding(from='iso-2022-jp', to='UTF-8') }}
+
+Named arguments also allow you to skip some arguments for which you don't want
+to change the default value::
+
+.. code-block:: jinja
+
+    {# the first argument is the date format, which defaults to the global date format if null is passed #}
+    {{ "now"|date(null, "Europe/Paris") }}
+
+    {# or skip the format value by using a named argument for the timezone #}
+    {{ "now"|date(timezone="Europe/Paris") }}
+
+You can also use both positional and named arguments in one call, which is not
+recommended as it can be confusing:
+
+.. code-block:: jinja
+
+    {# both work #}
+    {{ "now"|date('d/m/Y H:i', timezone="Europe/Paris") }}
+    {{ "now"|date(timezone="Europe/Paris", 'd/m/Y H:i') }}
+
+.. tip::
+
+    Each function and filter documentation page has a section where the names
+    of all arguments are listed when supported.
+
 Control Structure
 -----------------
 
@@ -438,11 +489,15 @@ expression:
 
     {{ '{{' }}
 
-For bigger sections it makes sense to mark a block :doc:`raw<tags/raw>`.
+For bigger sections it makes sense to mark a block
+:doc:`verbatim<tags/verbatim>`.
 
 Macros
 ------
 
+.. versionadded:: 1.12
+    Support for default argument values was added in Twig 1.12.
+
 Macros are comparable with functions in regular programming languages. They
 are useful to reuse often used HTML fragments to not repeat yourself.
 
@@ -478,6 +533,15 @@ current namespace via the :doc:`from<tags/from>` tag and optionally alias them:
         <dd>{{ input_field('password', '', 'password') }}</dd>
     </dl>
 
+A default value can also be defined for macro arguments when not provided in a
+macro call:
+
+.. code-block:: jinja
+
+    {% macro input(name, value = "", type = "text", size = 20) %}
+        <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}" />
+    {% endmacro %}
+
 Expressions
 -----------
 
@@ -659,6 +723,9 @@ tests.
 Other Operators
 ~~~~~~~~~~~~~~~
 
+.. versionadded:: 1.12.0
+    Support for the extended ternary operator was added in Twig 1.12.0.
+
 The following operators are very useful but don't fit into any of the other
 categories:
 
@@ -674,7 +741,15 @@ categories:
 
 * ``.``, ``[]``: Gets an attribute of an object.
 
-* ``?:``: The PHP ternary operator: ``{{ foo ? 'yes' : 'no' }}``
+* ``?:``: The ternary operator:
+
+  .. code-block:: jinja
+
+      {{ foo ? 'yes' : 'no' }}
+
+      {# as of Twig 1.12.0 #}
+      {{ foo ?: 'no' }} == {{ foo ? foo : 'no' }}
+      {{ foo ? 'yes' }} == {{ foo ? 'yes' : '' }}
 
 String Interpolation
 ~~~~~~~~~~~~~~~~~~~~
@@ -759,3 +834,4 @@ Extension<creating_extensions>` chapter.
 .. _`Twig syntax mode`:           https://github.com/bobthecow/Twig-HTML.mode
 .. _`other Twig syntax mode`:     https://github.com/muxx/Twig-HTML.mode
 .. _`Notepad++ Twig Highlighter`: https://github.com/Banane9/notepadplusplus-twig
+.. _`web-mode.el`:                http://web-mode.org/
diff --git a/core/vendor/twig/twig/ext/twig/php_twig.h b/core/vendor/twig/twig/ext/twig/php_twig.h
index 0cba858..1508b0e 100644
--- a/core/vendor/twig/twig/ext/twig/php_twig.h
+++ b/core/vendor/twig/twig/ext/twig/php_twig.h
@@ -15,7 +15,7 @@
 #ifndef PHP_TWIG_H
 #define PHP_TWIG_H
 
-#define PHP_TWIG_VERSION "1.11.1"
+#define PHP_TWIG_VERSION "1.12.1"
 
 #include "php.h"
 
diff --git a/core/vendor/twig/twig/ext/twig/twig.c b/core/vendor/twig/twig/ext/twig/twig.c
index 1fea683..f871d1e 100644
--- a/core/vendor/twig/twig/ext/twig/twig.c
+++ b/core/vendor/twig/twig/ext/twig/twig.c
@@ -1030,7 +1030,7 @@ PHP_FUNCTION(twig_template_get_attributes)
 	// ret can be null, if e.g. the called method throws an exception
 	if (ret) {
 		if (TWIG_INSTANCE_OF_USERLAND(object, "Twig_TemplateInterface" TSRMLS_CC)) {
-			if (Z_STRVAL_P(ret) == "") {
+			if (Z_STRLEN_P(ret) == 0) {
 				free_ret = 1;
 			} else {
 				zval *charset = TWIG_CALL_USER_FUNC_ARRAY(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "getCharset", NULL TSRMLS_CC);
diff --git a/core/vendor/twig/twig/lib/Twig/Compiler.php b/core/vendor/twig/twig/lib/Twig/Compiler.php
index c1ab250..95b1869 100644
--- a/core/vendor/twig/twig/lib/Twig/Compiler.php
+++ b/core/vendor/twig/twig/lib/Twig/Compiler.php
@@ -256,7 +256,7 @@ public function indent($step = 1)
      */
     public function outdent($step = 1)
     {
-        // can't outdent by more steps that the current indentation level
+        // can't outdent by more steps than the current indentation level
         if ($this->indentation < $step) {
             throw new LogicException('Unable to call outdent() as the indentation would become negative');
         }
diff --git a/core/vendor/twig/twig/lib/Twig/CompilerInterface.php b/core/vendor/twig/twig/lib/Twig/CompilerInterface.php
index 89d87e6..db848a0 100644
--- a/core/vendor/twig/twig/lib/Twig/CompilerInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/CompilerInterface.php
@@ -14,6 +14,7 @@
  *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 interface Twig_CompilerInterface
 {
diff --git a/core/vendor/twig/twig/lib/Twig/Environment.php b/core/vendor/twig/twig/lib/Twig/Environment.php
index 39e2c76..eabbf0a 100644
--- a/core/vendor/twig/twig/lib/Twig/Environment.php
+++ b/core/vendor/twig/twig/lib/Twig/Environment.php
@@ -17,7 +17,7 @@
  */
 class Twig_Environment
 {
-    const VERSION = '1.11.1';
+    const VERSION = '1.12.1';
 
     protected $charset;
     protected $loader;
@@ -36,6 +36,7 @@ class Twig_Environment
     protected $functions;
     protected $globals;
     protected $runtimeInitialized;
+    protected $extensionInitialized;
     protected $loadedTemplates;
     protected $strictVariables;
     protected $unaryOperators;
@@ -102,24 +103,17 @@ public function __construct(Twig_LoaderInterface $loader = null, $options = arra
         $this->charset            = $options['charset'];
         $this->baseTemplateClass  = $options['base_template_class'];
         $this->autoReload         = null === $options['auto_reload'] ? $this->debug : (bool) $options['auto_reload'];
-        $this->extensions         = array(
-            'core'      => new Twig_Extension_Core(),
-            'escaper'   => new Twig_Extension_Escaper($options['autoescape']),
-            'optimizer' => new Twig_Extension_Optimizer($options['optimizations']),
-        );
         $this->strictVariables    = (bool) $options['strict_variables'];
         $this->runtimeInitialized = false;
         $this->setCache($options['cache']);
         $this->functionCallbacks = array();
         $this->filterCallbacks = array();
-        $this->staging = array(
-            'functions'     => array(),
-            'filters'       => array(),
-            'tests'         => array(),
-            'token_parsers' => array(),
-            'visitors'      => array(),
-            'globals'       => array(),
-        );
+
+        $this->addExtension(new Twig_Extension_Core());
+        $this->addExtension(new Twig_Extension_Escaper($options['autoescape']));
+        $this->addExtension(new Twig_Extension_Optimizer($options['optimizations']));
+        $this->extensionInitialized = false;
+        $this->staging = new Twig_Extension_Staging();
     }
 
     /**
@@ -629,29 +623,29 @@ public function getExtension($name)
      */
     public function addExtension(Twig_ExtensionInterface $extension)
     {
+        if ($this->extensionInitialized) {
+            throw new LogicException(sprintf('Unable to register extension "%s" as extensions have already been initialized.', $extension->getName()));
+        }
+
         $this->extensions[$extension->getName()] = $extension;
-        $this->parsers = null;
-        $this->visitors = null;
-        $this->filters = null;
-        $this->tests = null;
-        $this->functions = null;
-        $this->globals = null;
     }
 
     /**
      * Removes an extension by name.
      *
+     * This method is deprecated and you should not use it.
+     *
      * @param string $name The extension name
+     *
+     * @deprecated since 1.12 (to be removed in 2.0)
      */
     public function removeExtension($name)
     {
+        if ($this->extensionInitialized) {
+            throw new LogicException(sprintf('Unable to remove extension "%s" as extensions have already been initialized.', $name));
+        }
+
         unset($this->extensions[$name]);
-        $this->parsers = null;
-        $this->visitors = null;
-        $this->filters = null;
-        $this->tests = null;
-        $this->functions = null;
-        $this->globals = null;
     }
 
     /**
@@ -683,8 +677,11 @@ public function getExtensions()
      */
     public function addTokenParser(Twig_TokenParserInterface $parser)
     {
-        $this->staging['token_parsers'][] = $parser;
-        $this->parsers = null;
+        if ($this->extensionInitialized) {
+            throw new LogicException('Unable to add a token parser as extensions have already been initialized.');
+        }
+
+        $this->staging->addTokenParser($parser);
     }
 
     /**
@@ -694,27 +691,8 @@ public function addTokenParser(Twig_TokenParserInterface $parser)
      */
     public function getTokenParsers()
     {
-        if (null === $this->parsers) {
-            $this->parsers = new Twig_TokenParserBroker();
-
-            if (isset($this->staging['token_parsers'])) {
-                foreach ($this->staging['token_parsers'] as $parser) {
-                    $this->parsers->addTokenParser($parser);
-                }
-            }
-
-            foreach ($this->getExtensions() as $extension) {
-                $parsers = $extension->getTokenParsers();
-                foreach ($parsers as $parser) {
-                    if ($parser instanceof Twig_TokenParserInterface) {
-                        $this->parsers->addTokenParser($parser);
-                    } elseif ($parser instanceof Twig_TokenParserBrokerInterface) {
-                        $this->parsers->addTokenParserBroker($parser);
-                    } else {
-                        throw new LogicException('getTokenParsers() must return an array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances');
-                    }
-                }
-            }
+        if (!$this->extensionInitialized) {
+            $this->initExtensions();
         }
 
         return $this->parsers;
@@ -746,8 +724,11 @@ public function getTags()
      */
     public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
     {
-        $this->staging['visitors'][] = $visitor;
-        $this->visitors = null;
+        if ($this->extensionInitialized) {
+            throw new LogicException('Unable to add a node visitor as extensions have already been initialized.', $extension->getName());
+        }
+
+        $this->staging->addNodeVisitor($visitor);
     }
 
     /**
@@ -757,14 +738,8 @@ public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
      */
     public function getNodeVisitors()
     {
-        if (null === $this->visitors) {
-            foreach ($this->getExtensions() as $extension) {
-                foreach ($extension->getNodeVisitors() as $visitor) {
-                    $this->addNodeVisitor($visitor);
-                }
-            }
-
-            $this->visitors = $this->staging['visitors'];
+        if (!$this->extensionInitialized) {
+            $this->initExtensions();
         }
 
         return $this->visitors;
@@ -773,13 +748,25 @@ public function getNodeVisitors()
     /**
      * Registers a Filter.
      *
-     * @param string               $name   The filter name
-     * @param Twig_FilterInterface $filter A Twig_FilterInterface instance
+     * @param string|Twig_SimpleFilter               $name   The filter name or a Twig_SimpleFilter instance
+     * @param Twig_FilterInterface|Twig_SimpleFilter $filter A Twig_FilterInterface instance or a Twig_SimpleFilter instance
      */
-    public function addFilter($name, Twig_FilterInterface $filter)
+    public function addFilter($name, $filter = null)
     {
-        $this->staging['filters'][$name] = $filter;
-        $this->filters = null;
+        if ($this->extensionInitialized) {
+            throw new LogicException(sprintf('Unable to add filter "%s" as extensions have already been initialized.', $name));
+        }
+
+        if (!$name instanceof Twig_SimpleFilter && !($filter instanceof Twig_SimpleFilter || $filter instanceof Twig_FilterInterface)) {
+            throw new LogicException('A filter must be an instance of Twig_FilterInterface or Twig_SimpleFilter');
+        }
+
+        if ($name instanceof Twig_SimpleFilter) {
+            $filter = $name;
+            $name = $filter->getName();
+        }
+
+        $this->staging->addFilter($name, $filter);
     }
 
     /**
@@ -790,12 +777,12 @@ public function addFilter($name, Twig_FilterInterface $filter)
      *
      * @param string $name The filter name
      *
-     * @return Twig_Filter|false A Twig_Filter instance or false if the filter does not exists
+     * @return Twig_Filter|false A Twig_Filter instance or false if the filter does not exist
      */
     public function getFilter($name)
     {
-        if (null === $this->filters) {
-            $this->getFilters();
+        if (!$this->extensionInitialized) {
+            $this->initExtensions();
         }
 
         if (isset($this->filters[$name])) {
@@ -840,14 +827,8 @@ public function registerUndefinedFilterCallback($callable)
      */
     public function getFilters()
     {
-        if (null === $this->filters) {
-            foreach ($this->getExtensions() as $extension) {
-                foreach ($extension->getFilters() as $name => $filter) {
-                    $this->addFilter($name, $filter);
-                }
-            }
-
-            $this->filters = $this->staging['filters'];
+        if (!$this->extensionInitialized) {
+            $this->initExtensions();
         }
 
         return $this->filters;
@@ -856,13 +837,25 @@ public function getFilters()
     /**
      * Registers a Test.
      *
-     * @param string             $name The test name
-     * @param Twig_TestInterface $test A Twig_TestInterface instance
+     * @param string|Twig_SimpleTest             $name The test name or a Twig_SimpleTest instance
+     * @param Twig_TestInterface|Twig_SimpleTest $test A Twig_TestInterface instance or a Twig_SimpleTest instance
      */
-    public function addTest($name, Twig_TestInterface $test)
+    public function addTest($name, $test = null)
     {
-        $this->staging['tests'][$name] = $test;
-        $this->tests = null;
+        if ($this->extensionInitialized) {
+            throw new LogicException(sprintf('Unable to add test "%s" as extensions have already been initialized.', $name));
+        }
+
+        if (!$name instanceof Twig_SimpleTest && !($test instanceof Twig_SimpleTest || $test instanceof Twig_TestInterface)) {
+            throw new LogicException('A test must be an instance of Twig_TestInterface or Twig_SimpleTest');
+        }
+
+        if ($name instanceof Twig_SimpleTest) {
+            $test = $name;
+            $name = $test->getName();
+        }
+
+        $this->staging->addTest($name, $test);
     }
 
     /**
@@ -872,29 +865,55 @@ public function addTest($name, Twig_TestInterface $test)
      */
     public function getTests()
     {
-        if (null === $this->tests) {
-            foreach ($this->getExtensions() as $extension) {
-                foreach ($extension->getTests() as $name => $test) {
-                    $this->addTest($name, $test);
-                }
-            }
-
-            $this->tests = $this->staging['tests'];
+        if (!$this->extensionInitialized) {
+            $this->initExtensions();
         }
 
         return $this->tests;
     }
 
     /**
+     * Gets a test by name.
+     *
+     * @param string $name The test name
+     *
+     * @return Twig_Test|false A Twig_Test instance or false if the test does not exist
+     */
+    public function getTest($name)
+    {
+        if (!$this->extensionInitialized) {
+            $this->initExtensions();
+        }
+
+        if (isset($this->tests[$name])) {
+            return $this->tests[$name];
+        }
+
+        return false;
+    }
+
+    /**
      * Registers a Function.
      *
-     * @param string                 $name     The function name
-     * @param Twig_FunctionInterface $function A Twig_FunctionInterface instance
+     * @param string|Twig_SimpleFunction                 $name     The function name or a Twig_SimpleFunction instance
+     * @param Twig_FunctionInterface|Twig_SimpleFunction $function A Twig_FunctionInterface instance or a Twig_SimpleFunction instance
      */
-    public function addFunction($name, Twig_FunctionInterface $function)
+    public function addFunction($name, $function = null)
     {
-        $this->staging['functions'][$name] = $function;
-        $this->functions = null;
+        if ($this->extensionInitialized) {
+            throw new LogicException(sprintf('Unable to add function "%s" as extensions have already been initialized.', $name));
+        }
+
+        if (!$name instanceof Twig_SimpleFunction && !($function instanceof Twig_SimpleFunction || $function instanceof Twig_FunctionInterface)) {
+            throw new LogicException('A function must be an instance of Twig_FunctionInterface or Twig_SimpleFunction');
+        }
+
+        if ($name instanceof Twig_SimpleFunction) {
+            $function = $name;
+            $name = $function->getName();
+        }
+
+        $this->staging->addFunction($name, $function);
     }
 
     /**
@@ -905,12 +924,12 @@ public function addFunction($name, Twig_FunctionInterface $function)
      *
      * @param string $name function name
      *
-     * @return Twig_Function|false A Twig_Function instance or false if the function does not exists
+     * @return Twig_Function|false A Twig_Function instance or false if the function does not exist
      */
     public function getFunction($name)
     {
-        if (null === $this->functions) {
-            $this->getFunctions();
+        if (!$this->extensionInitialized) {
+            $this->initExtensions();
         }
 
         if (isset($this->functions[$name])) {
@@ -955,14 +974,8 @@ public function registerUndefinedFunctionCallback($callable)
      */
     public function getFunctions()
     {
-        if (null === $this->functions) {
-            foreach ($this->getExtensions() as $extension) {
-                foreach ($extension->getFunctions() as $name => $function) {
-                    $this->addFunction($name, $function);
-                }
-            }
-
-            $this->functions = $this->staging['functions'];
+        if (!$this->extensionInitialized) {
+            $this->initExtensions();
         }
 
         return $this->functions;
@@ -971,13 +984,32 @@ public function getFunctions()
     /**
      * Registers a Global.
      *
+     * New globals can be added before compiling or rendering a template;
+     * but after, you can only update existing globals.
+     *
      * @param string $name  The global name
      * @param mixed  $value The global value
      */
     public function addGlobal($name, $value)
     {
-        $this->staging['globals'][$name] = $value;
-        $this->globals = null;
+        if ($this->extensionInitialized || $this->runtimeInitialized) {
+            if (null === $this->globals) {
+                $this->initGlobals();
+            }
+
+            /* This condition must be uncommented in Twig 2.0
+            if (!array_key_exists($name, $this->globals)) {
+                throw new LogicException(sprintf('Unable to add global "%s" as the runtime or the extensions have already been initialized.', $name));
+            }
+            */
+        }
+
+        if ($this->extensionInitialized || $this->runtimeInitialized) {
+            // update the value
+            $this->globals[$name] = $value;
+        } else {
+            $this->staging->addGlobal($name, $value);
+        }
     }
 
     /**
@@ -987,11 +1019,8 @@ public function addGlobal($name, $value)
      */
     public function getGlobals()
     {
-        if (null === $this->globals) {
-            $this->globals = isset($this->staging['globals']) ? $this->staging['globals'] : array();
-            foreach ($this->getExtensions() as $extension) {
-                $this->globals = array_merge($this->globals, $extension->getGlobals());
-            }
+        if (null === $this->globals || !($this->runtimeInitialized || $this->extensionInitialized)) {
+            $this->initGlobals();
         }
 
         return $this->globals;
@@ -1024,8 +1053,8 @@ public function mergeGlobals(array $context)
      */
     public function getUnaryOperators()
     {
-        if (null === $this->unaryOperators) {
-            $this->initOperators();
+        if (!$this->extensionInitialized) {
+            $this->initExtensions();
         }
 
         return $this->unaryOperators;
@@ -1038,8 +1067,8 @@ public function getUnaryOperators()
      */
     public function getBinaryOperators()
     {
-        if (null === $this->binaryOperators) {
-            $this->initOperators();
+        if (!$this->extensionInitialized) {
+            $this->initExtensions();
         }
 
         return $this->binaryOperators;
@@ -1059,17 +1088,92 @@ public function computeAlternatives($name, $items)
         return array_keys($alternatives);
     }
 
-    protected function initOperators()
+    protected function initGlobals()
+    {
+        $this->globals = array();
+        foreach ($this->extensions as $extension) {
+            $this->globals = array_merge($this->globals, $extension->getGlobals());
+        }
+        $this->globals = array_merge($this->globals, $this->staging->getGlobals());
+    }
+
+    protected function initExtensions()
     {
+        if ($this->extensionInitialized) {
+            return;
+        }
+
+        $this->extensionInitialized = true;
+        $this->parsers = new Twig_TokenParserBroker();
+        $this->filters = array();
+        $this->functions = array();
+        $this->tests = array();
+        $this->visitors = array();
         $this->unaryOperators = array();
         $this->binaryOperators = array();
-        foreach ($this->getExtensions() as $extension) {
-            $operators = $extension->getOperators();
 
-            if (!$operators) {
-                continue;
+        foreach ($this->extensions as $extension) {
+            $this->initExtension($extension);
+        }
+        $this->initExtension($this->staging);
+    }
+
+    protected function initExtension(Twig_ExtensionInterface $extension)
+    {
+        // filters
+        foreach ($extension->getFilters() as $name => $filter) {
+            if ($name instanceof Twig_SimpleFilter) {
+                $filter = $name;
+                $name = $filter->getName();
+            } elseif ($filter instanceof Twig_SimpleFilter) {
+                $name = $filter->getName();
+            }
+
+            $this->filters[$name] = $filter;
+        }
+
+        // functions
+        foreach ($extension->getFunctions() as $name => $function) {
+            if ($name instanceof Twig_SimpleFunction) {
+                $function = $name;
+                $name = $function->getName();
+            } elseif ($function instanceof Twig_SimpleFunction) {
+                $name = $function->getName();
+            }
+
+            $this->functions[$name] = $function;
+        }
+
+        // tests
+        foreach ($extension->getTests() as $name => $test) {
+            if ($name instanceof Twig_SimpleTest) {
+                $test = $name;
+                $name = $test->getName();
+            } elseif ($test instanceof Twig_SimpleTest) {
+                $name = $test->getName();
+            }
+
+            $this->tests[$name] = $test;
+        }
+
+        // token parsers
+        foreach ($extension->getTokenParsers() as $parser) {
+            if ($parser instanceof Twig_TokenParserInterface) {
+                $this->parsers->addTokenParser($parser);
+            } elseif ($parser instanceof Twig_TokenParserBrokerInterface) {
+                $this->parsers->addTokenParserBroker($parser);
+            } else {
+                throw new LogicException('getTokenParsers() must return an array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances');
             }
+        }
+
+        // node visitors
+        foreach ($extension->getNodeVisitors() as $visitor) {
+            $this->visitors[] = $visitor;
+        }
 
+        // operators
+        if ($operators = $extension->getOperators()) {
             if (2 !== count($operators)) {
                 throw new InvalidArgumentException(sprintf('"%s::getOperators()" does not return a valid operators array.', get_class($extension)));
             }
diff --git a/core/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php b/core/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php
index 0e08a1d..95fbeb0 100644
--- a/core/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php
@@ -14,6 +14,7 @@
  *
  * @package    twig
  * @author     Florin Patan <florinpatan@gmail.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 interface Twig_ExistsLoaderInterface
 {
diff --git a/core/vendor/twig/twig/lib/Twig/ExpressionParser.php b/core/vendor/twig/twig/lib/Twig/ExpressionParser.php
index 3309bb5..7b9114a 100644
--- a/core/vendor/twig/twig/lib/Twig/ExpressionParser.php
+++ b/core/vendor/twig/twig/lib/Twig/ExpressionParser.php
@@ -89,9 +89,19 @@ protected function parseConditionalExpression($expr)
     {
         while ($this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, '?')) {
             $this->parser->getStream()->next();
-            $expr2 = $this->parseExpression();
-            $this->parser->getStream()->expect(Twig_Token::PUNCTUATION_TYPE, ':', 'The ternary operator must have a default value');
-            $expr3 = $this->parseExpression();
+            if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, ':')) {
+                $expr2 = $this->parseExpression();
+                if ($this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, ':')) {
+                    $this->parser->getStream()->next();
+                    $expr3 = $this->parseExpression();
+                } else {
+                    $expr3 = new Twig_Node_Expression_Constant('', $this->parser->getCurrentToken()->getLine());
+                }
+            } else {
+                $this->parser->getStream()->next();
+                $expr2 = $expr;
+                $expr3 = $this->parseExpression();
+            }
 
             $expr = new Twig_Node_Expression_Conditional($expr, $expr2, $expr3, $this->parser->getCurrentToken()->getLine());
         }
@@ -287,9 +297,9 @@ public function parsePostfixExpression($node)
 
     public function getFunctionNode($name, $line)
     {
-        $args = $this->parseArguments();
         switch ($name) {
             case 'parent':
+                $args = $this->parseArguments();
                 if (!count($this->parser->getBlockStack())) {
                     throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden', $line, $this->parser->getFilename());
                 }
@@ -300,8 +310,9 @@ public function getFunctionNode($name, $line)
 
                 return new Twig_Node_Expression_Parent($this->parser->peekBlockStack(), $line);
             case 'block':
-                return new Twig_Node_Expression_BlockReference($args->getNode(0), false, $line);
+                return new Twig_Node_Expression_BlockReference($this->parseArguments()->getNode(0), false, $line);
             case 'attribute':
+                $args = $this->parseArguments();
                 if (count($args) < 2) {
                     throw new Twig_Error_Syntax('The "attribute" function takes at least two arguments (the variable and the attributes)', $line, $this->parser->getFilename());
                 }
@@ -310,7 +321,7 @@ public function getFunctionNode($name, $line)
             default:
                 if (null !== $alias = $this->parser->getImportedSymbol('function', $name)) {
                     $arguments = new Twig_Node_Expression_Array(array(), $line);
-                    foreach ($args as $n) {
+                    foreach ($this->parseArguments() as $n) {
                         $arguments->addElement($n);
                     }
 
@@ -320,7 +331,8 @@ public function getFunctionNode($name, $line)
                     return $node;
                 }
 
-                $class = $this->getFunctionNodeClass($name);
+                $args = $this->parseArguments(true);
+                $class = $this->getFunctionNodeClass($name, $line);
 
                 return new $class($name, $args, $line);
         }
@@ -353,22 +365,42 @@ public function parseSubscriptExpression($node)
             } else {
                 throw new Twig_Error_Syntax('Expected name or number', $lineno, $this->parser->getFilename());
             }
+
+            if ($node instanceof Twig_Node_Expression_Name && null !== $alias = $this->parser->getImportedSymbol('template', $node->getAttribute('name'))) {
+                if (!$arg instanceof Twig_Node_Expression_Constant) {
+                    throw new Twig_Error_Syntax(sprintf('Dynamic macro names are not supported (called on "%s")', $node->getAttribute('name')), $token->getLine(), $this->parser->getFilename());
+                }
+
+                $node = new Twig_Node_Expression_MethodCall($node, 'get'.$arg->getAttribute('value'), $arguments, $lineno);
+                $node->setAttribute('safe', true);
+
+                return $node;
+            }
         } else {
             $type = Twig_TemplateInterface::ARRAY_CALL;
 
-            $arg = $this->parseExpression();
-
             // slice?
+            $slice = false;
+            if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ':')) {
+                $slice = true;
+                $arg = new Twig_Node_Expression_Constant(0, $token->getLine());
+            } else {
+                $arg = $this->parseExpression();
+            }
+
             if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ':')) {
+                $slice = true;
                 $stream->next();
+            }
 
+            if ($slice) {
                 if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
                     $length = new Twig_Node_Expression_Constant(null, $token->getLine());
                 } else {
                     $length = $this->parseExpression();
                 }
 
-                $class = $this->getFilterNodeClass('slice');
+                $class = $this->getFilterNodeClass('slice', $token->getLine());
                 $arguments = new Twig_Node(array($arg, $length));
                 $filter = new $class($node, new Twig_Node_Expression_Constant('slice', $token->getLine()), $arguments, $token->getLine());
 
@@ -380,13 +412,6 @@ public function parseSubscriptExpression($node)
             $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']');
         }
 
-        if ($node instanceof Twig_Node_Expression_Name && null !== $alias = $this->parser->getImportedSymbol('template', $node->getAttribute('name'))) {
-            $node = new Twig_Node_Expression_MethodCall($node, 'get'.$arg->getAttribute('value'), $arguments, $lineno);
-            $node->setAttribute('safe', true);
-
-            return $node;
-        }
-
         return new Twig_Node_Expression_GetAttr($node, $arg, $arguments, $type, $lineno);
     }
 
@@ -406,10 +431,10 @@ public function parseFilterExpressionRaw($node, $tag = null)
             if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
                 $arguments = new Twig_Node();
             } else {
-                $arguments = $this->parseArguments();
+                $arguments = $this->parseArguments(true);
             }
 
-            $class = $this->getFilterNodeClass($name->getAttribute('value'));
+            $class = $this->getFilterNodeClass($name->getAttribute('value'), $token->getLine());
 
             $node = new $class($node, $name, $arguments, $token->getLine(), $tag);
 
@@ -423,17 +448,62 @@ public function parseFilterExpressionRaw($node, $tag = null)
         return $node;
     }
 
-    public function parseArguments()
+    /**
+     * Parses arguments.
+     *
+     * @param Boolean $namedArguments Whether to allow named arguments or not
+     * @param Boolean $definition     Whether we are parsing arguments for a function definition
+     */
+    public function parseArguments($namedArguments = false, $definition = false)
     {
         $args = array();
         $stream = $this->parser->getStream();
 
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, '(', 'A list of arguments must be opened by a parenthesis');
+        $stream->expect(Twig_Token::PUNCTUATION_TYPE, '(', 'A list of arguments must begin with an opening parenthesis');
         while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ')')) {
             if (!empty($args)) {
                 $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'Arguments must be separated by a comma');
             }
-            $args[] = $this->parseExpression();
+
+            if ($definition) {
+                $token = $stream->expect(Twig_Token::NAME_TYPE, null, 'An argument must be a name');
+                $value = new Twig_Node_Expression_Name($token->getValue(), $this->parser->getCurrentToken()->getLine());
+            } else {
+                $value = $this->parseExpression();
+            }
+
+            $name = null;
+            if ($namedArguments && $stream->test(Twig_Token::OPERATOR_TYPE, '=')) {
+                $token = $stream->next();
+                if (!$value instanceof Twig_Node_Expression_Name) {
+                    throw new Twig_Error_Syntax(sprintf('A parameter name must be a string, "%s" given', get_class($value)), $token->getLine(), $this->parser->getFilename());
+                }
+                $name = $value->getAttribute('name');
+
+                if ($definition) {
+                    $value = $this->parsePrimaryExpression();
+
+                    if (!$this->checkConstantExpression($value)) {
+                        throw new Twig_Error_Syntax(sprintf('A default value for an argument must be a constant (a boolean, a string, a number, or an array).'), $token->getLine(), $this->parser->getFilename());
+                    }
+                } else {
+                    $value = $this->parseExpression();
+                }
+            }
+
+            if ($definition) {
+                if (null === $name) {
+                    $name = $value->getAttribute('name');
+                    $value = new Twig_Node_Expression_Constant(null, $this->parser->getCurrentToken()->getLine());
+                }
+                $args[$name] = $value;
+            } else {
+                if (null === $name) {
+                    $args[] = $value;
+                } else {
+                    $args[$name] = $value;
+                }
+            }
         }
         $stream->expect(Twig_Token::PUNCTUATION_TYPE, ')', 'A list of arguments must be closed by a parenthesis');
 
@@ -473,23 +543,59 @@ public function parseMultitargetExpression()
         return new Twig_Node($targets);
     }
 
-    protected function getFunctionNodeClass($name)
+    protected function getFunctionNodeClass($name, $line)
+    {
+        $env = $this->parser->getEnvironment();
+
+        if (false === $function = $env->getFunction($name)) {
+            $message = sprintf('The function "%s" does not exist', $name);
+            if ($alternatives = $env->computeAlternatives($name, array_keys($env->getFunctions()))) {
+                $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
+            }
+
+            throw new Twig_Error_Syntax($message, $line, $this->parser->getFilename());
+        }
+
+        if ($function instanceof Twig_SimpleFunction) {
+            return $function->getNodeClass();
+        }
+
+        return $function instanceof Twig_Function_Node ? $function->getClass() : 'Twig_Node_Expression_Function';
+    }
+
+    protected function getFilterNodeClass($name, $line)
     {
-        $functionMap = $this->parser->getEnvironment()->getFunctions();
-        if (isset($functionMap[$name]) && $functionMap[$name] instanceof Twig_Function_Node) {
-            return $functionMap[$name]->getClass();
+        $env = $this->parser->getEnvironment();
+
+        if (false === $filter = $env->getFilter($name)) {
+            $message = sprintf('The filter "%s" does not exist', $name);
+            if ($alternatives = $env->computeAlternatives($name, array_keys($env->getFilters()))) {
+                $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
+            }
+
+            throw new Twig_Error_Syntax($message, $line, $this->parser->getFilename());
+        }
+
+        if ($filter instanceof Twig_SimpleFilter) {
+            return $filter->getNodeClass();
         }
 
-        return 'Twig_Node_Expression_Function';
+        return $filter instanceof Twig_Filter_Node ? $filter->getClass() : 'Twig_Node_Expression_Filter';
     }
 
-    protected function getFilterNodeClass($name)
+    // checks that the node only contains "constant" elements
+    protected function checkConstantExpression(Twig_NodeInterface $node)
     {
-        $filterMap = $this->parser->getEnvironment()->getFilters();
-        if (isset($filterMap[$name]) && $filterMap[$name] instanceof Twig_Filter_Node) {
-            return $filterMap[$name]->getClass();
+        if (!($node instanceof Twig_Node_Expression_Constant || $node instanceof Twig_Node_Expression_Array)) {
+            return false;
+        }
+
+        foreach ($node as $n) {
+            if (!$this->checkConstantExpression($n)) {
+                return false;
+            }
         }
 
-        return 'Twig_Node_Expression_Filter';
+        return true;
     }
 }
diff --git a/core/vendor/twig/twig/lib/Twig/Extension/Core.php b/core/vendor/twig/twig/lib/Twig/Extension/Core.php
index 3db899f..2110120 100644
--- a/core/vendor/twig/twig/lib/Twig/Extension/Core.php
+++ b/core/vendor/twig/twig/lib/Twig/Extension/Core.php
@@ -126,47 +126,45 @@ public function getFilters()
     {
         $filters = array(
             // formatting filters
-            'date'          => new Twig_Filter_Function('twig_date_format_filter', array('needs_environment' => true)),
-            'date_modify'   => new Twig_Filter_Function('twig_date_modify_filter', array('needs_environment' => true)),
-            'format'        => new Twig_Filter_Function('sprintf'),
-            'replace'       => new Twig_Filter_Function('strtr'),
-            'number_format' => new Twig_Filter_Function('twig_number_format_filter', array('needs_environment' => true)),
-            'abs'           => new Twig_Filter_Function('abs'),
+            new Twig_SimpleFilter('date', 'twig_date_format_filter', array('needs_environment' => true)),
+            new Twig_SimpleFilter('date_modify', 'twig_date_modify_filter', array('needs_environment' => true)),
+            new Twig_SimpleFilter('format', 'sprintf'),
+            new Twig_SimpleFilter('replace', 'strtr'),
+            new Twig_SimpleFilter('number_format', 'twig_number_format_filter', array('needs_environment' => true)),
+            new Twig_SimpleFilter('abs', 'abs'),
 
             // encoding
-            'url_encode'       => new Twig_Filter_Function('twig_urlencode_filter'),
-            'json_encode'      => new Twig_Filter_Function('twig_jsonencode_filter'),
-            'convert_encoding' => new Twig_Filter_Function('twig_convert_encoding'),
+            new Twig_SimpleFilter('url_encode', 'twig_urlencode_filter'),
+            new Twig_SimpleFilter('json_encode', 'twig_jsonencode_filter'),
+            new Twig_SimpleFilter('convert_encoding', 'twig_convert_encoding'),
 
             // string filters
-            'title'      => new Twig_Filter_Function('twig_title_string_filter', array('needs_environment' => true)),
-            'capitalize' => new Twig_Filter_Function('twig_capitalize_string_filter', array('needs_environment' => true)),
-            'upper'      => new Twig_Filter_Function('strtoupper'),
-            'lower'      => new Twig_Filter_Function('strtolower'),
-            'striptags'  => new Twig_Filter_Function('strip_tags'),
-            'trim'       => new Twig_Filter_Function('trim'),
-            'nl2br'      => new Twig_Filter_Function('nl2br', array('pre_escape' => 'html', 'is_safe' => array('html'))),
+            new Twig_SimpleFilter('title', 'twig_title_string_filter', array('needs_environment' => true)),
+            new Twig_SimpleFilter('capitalize', 'twig_capitalize_string_filter', array('needs_environment' => true)),
+            new Twig_SimpleFilter('upper', 'strtoupper'),
+            new Twig_SimpleFilter('lower', 'strtolower'),
+            new Twig_SimpleFilter('striptags', 'strip_tags'),
+            new Twig_SimpleFilter('trim', 'trim'),
+            new Twig_SimpleFilter('nl2br', 'nl2br', array('pre_escape' => 'html', 'is_safe' => array('html'))),
 
             // array helpers
-            'join'    => new Twig_Filter_Function('twig_join_filter'),
-            'split'   => new Twig_Filter_Function('twig_split_filter'),
-            'sort'    => new Twig_Filter_Function('twig_sort_filter'),
-            'merge'   => new Twig_Filter_Function('twig_array_merge'),
+            new Twig_SimpleFilter('join', 'twig_join_filter'),
+            new Twig_SimpleFilter('split', 'twig_split_filter'),
+            new Twig_SimpleFilter('sort', 'twig_sort_filter'),
+            new Twig_SimpleFilter('merge', 'twig_array_merge'),
 
             // string/array filters
-            'reverse' => new Twig_Filter_Function('twig_reverse_filter', array('needs_environment' => true)),
-            'length'  => new Twig_Filter_Function('twig_length_filter', array('needs_environment' => true)),
-            'slice'   => new Twig_Filter_Function('twig_slice', array('needs_environment' => true)),
+            new Twig_SimpleFilter('reverse', 'twig_reverse_filter', array('needs_environment' => true)),
+            new Twig_SimpleFilter('length', 'twig_length_filter', array('needs_environment' => true)),
+            new Twig_SimpleFilter('slice', 'twig_slice', array('needs_environment' => true)),
 
             // iteration and runtime
-            'default' => new Twig_Filter_Node('Twig_Node_Expression_Filter_Default'),
-            '_default' => new Twig_Filter_Function('_twig_default_filter'),
-
-            'keys'    => new Twig_Filter_Function('twig_get_array_keys_filter'),
+            new Twig_SimpleFilter('default', '_twig_default_filter', array('node_class' => 'Twig_Node_Expression_Filter_Default')),
+            new Twig_SimpleFilter('keys', 'twig_get_array_keys_filter'),
 
             // escaping
-            'escape' => new Twig_Filter_Function('twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')),
-            'e'      => new Twig_Filter_Function('twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')),
+            new Twig_SimpleFilter('escape', 'twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')),
+            new Twig_SimpleFilter('e', 'twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')),
         );
 
         if (function_exists('mb_get_info')) {
@@ -185,11 +183,12 @@ public function getFilters()
     public function getFunctions()
     {
         return array(
-            'range'    => new Twig_Function_Function('range'),
-            'constant' => new Twig_Function_Function('constant'),
-            'cycle'    => new Twig_Function_Function('twig_cycle'),
-            'random'   => new Twig_Function_Function('twig_random', array('needs_environment' => true)),
-            'date'     => new Twig_Function_Function('twig_date_converter', array('needs_environment' => true)),
+            new Twig_SimpleFunction('range', 'range'),
+            new Twig_SimpleFunction('constant', 'twig_constant'),
+            new Twig_SimpleFunction('cycle', 'twig_cycle'),
+            new Twig_SimpleFunction('random', 'twig_random', array('needs_environment' => true)),
+            new Twig_SimpleFunction('date', 'twig_date_converter', array('needs_environment' => true)),
+            new Twig_SimpleFunction('include', 'twig_include', array('needs_environment' => true, 'needs_context' => true)),
         );
     }
 
@@ -201,16 +200,16 @@ public function getFunctions()
     public function getTests()
     {
         return array(
-            'even'        => new Twig_Test_Node('Twig_Node_Expression_Test_Even'),
-            'odd'         => new Twig_Test_Node('Twig_Node_Expression_Test_Odd'),
-            'defined'     => new Twig_Test_Node('Twig_Node_Expression_Test_Defined'),
-            'sameas'      => new Twig_Test_Node('Twig_Node_Expression_Test_Sameas'),
-            'none'        => new Twig_Test_Node('Twig_Node_Expression_Test_Null'),
-            'null'        => new Twig_Test_Node('Twig_Node_Expression_Test_Null'),
-            'divisibleby' => new Twig_Test_Node('Twig_Node_Expression_Test_Divisibleby'),
-            'constant'    => new Twig_Test_Node('Twig_Node_Expression_Test_Constant'),
-            'empty'       => new Twig_Test_Function('twig_test_empty'),
-            'iterable'    => new Twig_Test_Function('twig_test_iterable'),
+            new Twig_SimpleTest('even', null, array('node_class' => 'Twig_Node_Expression_Test_Even')),
+            new Twig_SimpleTest('odd', null, array('node_class' => 'Twig_Node_Expression_Test_Odd')),
+            new Twig_SimpleTest('defined', null, array('node_class' => 'Twig_Node_Expression_Test_Defined')),
+            new Twig_SimpleTest('sameas', null, array('node_class' => 'Twig_Node_Expression_Test_Sameas')),
+            new Twig_SimpleTest('none', null, array('node_class' => 'Twig_Node_Expression_Test_Null')),
+            new Twig_SimpleTest('null', null, array('node_class' => 'Twig_Node_Expression_Test_Null')),
+            new Twig_SimpleTest('divisibleby', null, array('node_class' => 'Twig_Node_Expression_Test_Divisibleby')),
+            new Twig_SimpleTest('constant', null, array('node_class' => 'Twig_Node_Expression_Test_Constant')),
+            new Twig_SimpleTest('empty', 'twig_test_empty'),
+            new Twig_SimpleTest('iterable', 'twig_test_iterable'),
         );
     }
 
@@ -267,22 +266,32 @@ public function parseTestExpression(Twig_Parser $parser, $node)
         $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
         $arguments = null;
         if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
-            $arguments = $parser->getExpressionParser()->parseArguments();
+            $arguments = $parser->getExpressionParser()->parseArguments(true);
         }
 
-        $class = $this->getTestNodeClass($parser->getEnvironment(), $name);
+        $class = $this->getTestNodeClass($parser, $name, $node->getLine());
 
         return new $class($node, $name, $arguments, $parser->getCurrentToken()->getLine());
     }
 
-    protected function getTestNodeClass(Twig_Environment $env, $name)
+    protected function getTestNodeClass(Twig_Parser $parser, $name, $line)
     {
+        $env = $parser->getEnvironment();
         $testMap = $env->getTests();
-        if (isset($testMap[$name]) && $testMap[$name] instanceof Twig_Test_Node) {
-            return $testMap[$name]->getClass();
+        if (!isset($testMap[$name])) {
+            $message = sprintf('The test "%s" does not exist', $name);
+            if ($alternatives = $env->computeAlternatives($name, array_keys($env->getTests()))) {
+                $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
+            }
+
+            throw new Twig_Error_Syntax($message, $line, $parser->getFilename());
+        }
+
+        if ($testMap[$name] instanceof Twig_SimpleTest) {
+            return $testMap[$name]->getNodeClass();
         }
 
-        return 'Twig_Node_Expression_Test';
+        return $testMap[$name] instanceof Twig_Test_Node ? $testMap[$name]->getClass() : 'Twig_Node_Expression_Test';
     }
 
     /**
@@ -299,18 +308,18 @@ public function getName()
 /**
  * Cycles over a value.
  *
- * @param ArrayAccess|array $values An array or an ArrayAccess instance
- * @param integer           $i      The cycle value
+ * @param ArrayAccess|array $values   An array or an ArrayAccess instance
+ * @param integer           $position The cycle position
  *
  * @return string The next value in the cycle
  */
-function twig_cycle($values, $i)
+function twig_cycle($values, $position)
 {
     if (!is_array($values) && !$values instanceof ArrayAccess) {
         return $values;
     }
 
-    return $values[$i % count($values)];
+    return $values[$position % count($values)];
 }
 
 /**
@@ -404,7 +413,7 @@ function twig_date_format_filter(Twig_Environment $env, $date, $format = null, $
  * Returns a new date object modified
  *
  * <pre>
- *   {{ post.published_at|modify("-1day")|date("m/d/Y") }}
+ *   {{ post.published_at|date_modify("-1day")|date("m/d/Y") }}
  * </pre>
  *
  * @param Twig_Environment  $env      A Twig_Environment instance
@@ -773,18 +782,16 @@ function twig_sort_filter($array)
 /* used internally */
 function twig_in_filter($value, $compare)
 {
-    $strict = is_object($value);
-
     if (is_array($compare)) {
-        return in_array($value, $compare, $strict);
+        return in_array($value, $compare, is_object($value));
     } elseif (is_string($compare)) {
-        if (!strlen((string) $value)) {
+        if (!strlen($value)) {
             return empty($compare);
         }
 
         return false !== strpos($compare, (string) $value);
-    } elseif (is_object($compare) && $compare instanceof Traversable) {
-        return in_array($value, iterator_to_array($compare, false), $strict);
+    } elseif ($compare instanceof Traversable) {
+        return in_array($value, iterator_to_array($compare, false), is_object($value));
     }
 
     return false;
@@ -1191,7 +1198,7 @@ function twig_test_empty($value)
         return 0 == count($value);
     }
 
-    return false === $value || (empty($value) && '0' != $value);
+    return '' === $value || false === $value || null === $value || array() === $value;
 }
 
 /**
@@ -1212,3 +1219,58 @@ function twig_test_iterable($value)
 {
     return $value instanceof Traversable || is_array($value);
 }
+
+/**
+ * Renders a template.
+ *
+ * @param string  template       The template to render
+ * @param array   variables      The variables to pass to the template
+ * @param Boolean with_context   Whether to pass the current context variables or not
+ * @param Boolean ignore_missing Whether to ignore missing templates or not
+ * @param Boolean sandboxed      Whether to sandbox the template or not
+ *
+ * @return string The rendered template
+ */
+function twig_include(Twig_Environment $env, $context, $template, $variables = array(), $withContext = true, $ignoreMissing = false, $sandboxed = false)
+{
+    if ($withContext) {
+        $variables = array_merge($context, $variables);
+    }
+
+    if ($isSandboxed = $sandboxed && $env->hasExtension('sandbox')) {
+        $sandbox = $env->getExtension('sandbox');
+        if (!$alreadySandboxed = $sandbox->isSandboxed()) {
+            $sandbox->enableSandbox();
+        }
+    }
+
+    try {
+        return $env->resolveTemplate($template)->display($variables);
+    } catch (Twig_Error_Loader $e) {
+        if (!$ignoreMissing) {
+            throw $e;
+        }
+    }
+
+    if ($isSandboxed && !$alreadySandboxed) {
+        $sandbox->disableSandbox();
+    }
+}
+
+/**
+ * Provides the ability to get constants from instances as well as class/global constants.
+ *
+ * @param string      $constant The name of the constant
+ * @param null|object $object   The object to get the constant from
+ *
+ * @return string
+ */
+function twig_constant($constant, $object = null)
+{
+    if (!$object) {
+        return constant($constant);
+    }
+    $class = get_class($object);
+
+    return constant($class.'::'.$constant);
+}
diff --git a/core/vendor/twig/twig/lib/Twig/Extension/Debug.php b/core/vendor/twig/twig/lib/Twig/Extension/Debug.php
index 3dc4d2d..97007fb 100644
--- a/core/vendor/twig/twig/lib/Twig/Extension/Debug.php
+++ b/core/vendor/twig/twig/lib/Twig/Extension/Debug.php
@@ -27,7 +27,7 @@ public function getFunctions()
         ;
 
         return array(
-            'dump' => new Twig_Function_Function('twig_var_dump', array('is_safe' => $isDumpOutputHtmlSafe ? array('html') : array(), 'needs_context' => true, 'needs_environment' => true)),
+            new Twig_SimpleFunction('dump', 'twig_var_dump', array('is_safe' => $isDumpOutputHtmlSafe ? array('html') : array(), 'needs_context' => true, 'needs_environment' => true)),
         );
     }
 
diff --git a/core/vendor/twig/twig/lib/Twig/Extension/Escaper.php b/core/vendor/twig/twig/lib/Twig/Extension/Escaper.php
index db1a50e..c9a7f68 100644
--- a/core/vendor/twig/twig/lib/Twig/Extension/Escaper.php
+++ b/core/vendor/twig/twig/lib/Twig/Extension/Escaper.php
@@ -45,7 +45,7 @@ public function getNodeVisitors()
     public function getFilters()
     {
         return array(
-            'raw' => new Twig_Filter_Function('twig_raw_filter', array('is_safe' => array('all'))),
+            new Twig_SimpleFilter('raw', 'twig_raw_filter', array('is_safe' => array('all'))),
         );
     }
 
diff --git a/core/vendor/twig/twig/lib/Twig/Extension/Staging.php b/core/vendor/twig/twig/lib/Twig/Extension/Staging.php
new file mode 100644
index 0000000..f67fc65
--- /dev/null
+++ b/core/vendor/twig/twig/lib/Twig/Extension/Staging.php
@@ -0,0 +1,114 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) 2012 Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Internal class.
+ *
+ * This class is used by Twig_Environment as a staging area and must not be used directly.
+ *
+ * @package twig
+ * @author  Fabien Potencier <fabien@symfony.com>
+ */
+class Twig_Extension_Staging extends Twig_Extension
+{
+    protected $functions = array();
+    protected $filters = array();
+    protected $visitors = array();
+    protected $tokenParsers = array();
+    protected $globals = array();
+    protected $tests = array();
+
+    public function addFunction($name, $function)
+    {
+        $this->functions[$name] = $function;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFunctions()
+    {
+        return $this->functions;
+    }
+
+    public function addFilter($name, $filter)
+    {
+        $this->filters[$name] = $filter;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFilters()
+    {
+        return $this->filters;
+    }
+
+    public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
+    {
+        $this->visitors[] = $visitor;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getNodeVisitors()
+    {
+        return $this->visitors;
+    }
+
+    public function addTokenParser(Twig_TokenParserInterface $parser)
+    {
+        $this->tokenParsers[] = $parser;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTokenParsers()
+    {
+        return $this->tokenParsers;
+    }
+
+    public function addGlobal($name, $value)
+    {
+        $this->globals[$name] = $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getGlobals()
+    {
+        return $this->globals;
+    }
+
+    public function addTest($name, $test)
+    {
+        $this->tests[$name] = $test;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTests()
+    {
+        return $this->tests;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'staging';
+    }
+}
diff --git a/core/vendor/twig/twig/lib/Twig/Extension/StringLoader.php b/core/vendor/twig/twig/lib/Twig/Extension/StringLoader.php
index 90caf28..d5b881b 100644
--- a/core/vendor/twig/twig/lib/Twig/Extension/StringLoader.php
+++ b/core/vendor/twig/twig/lib/Twig/Extension/StringLoader.php
@@ -16,7 +16,7 @@ class Twig_Extension_StringLoader extends Twig_Extension
     public function getFunctions()
     {
         return array(
-            'template_from_string' => new Twig_Function_Function('twig_template_from_string', array('needs_environment' => true)),
+            new Twig_SimpleFunction('template_from_string', 'twig_template_from_string', array('needs_environment' => true)),
         );
     }
 
diff --git a/core/vendor/twig/twig/lib/Twig/Filter.php b/core/vendor/twig/twig/lib/Twig/Filter.php
index 1a4806c..879ef67 100644
--- a/core/vendor/twig/twig/lib/Twig/Filter.php
+++ b/core/vendor/twig/twig/lib/Twig/Filter.php
@@ -12,10 +12,13 @@
 /**
  * Represents a template filter.
  *
+ * Use Twig_SimpleFilter instead.
+ *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
-abstract class Twig_Filter implements Twig_FilterInterface
+abstract class Twig_Filter implements Twig_FilterInterface, Twig_FilterCallableInterface
 {
     protected $options;
     protected $arguments = array();
@@ -27,6 +30,7 @@ public function __construct(array $options = array())
             'needs_context'     => false,
             'pre_escape'        => null,
             'preserves_safety'  => null,
+            'callable'          => null,
         ), $options);
     }
 
@@ -72,4 +76,9 @@ public function getPreEscape()
     {
         return $this->options['pre_escape'];
     }
+
+    public function getCallable()
+    {
+        return $this->options['callable'];
+    }
 }
diff --git a/core/vendor/twig/twig/lib/Twig/Filter/Function.php b/core/vendor/twig/twig/lib/Twig/Filter/Function.php
index 1de078b..ae1f961 100644
--- a/core/vendor/twig/twig/lib/Twig/Filter/Function.php
+++ b/core/vendor/twig/twig/lib/Twig/Filter/Function.php
@@ -12,8 +12,11 @@
 /**
  * Represents a function template filter.
  *
+ * Use Twig_SimpleFilter instead.
+ *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 class Twig_Filter_Function extends Twig_Filter
 {
@@ -21,6 +24,8 @@ class Twig_Filter_Function extends Twig_Filter
 
     public function __construct($function, array $options = array())
     {
+        $options['callable'] = $function;
+
         parent::__construct($options);
 
         $this->function = $function;
diff --git a/core/vendor/twig/twig/lib/Twig/Filter/Method.php b/core/vendor/twig/twig/lib/Twig/Filter/Method.php
index a680f61..074371a 100644
--- a/core/vendor/twig/twig/lib/Twig/Filter/Method.php
+++ b/core/vendor/twig/twig/lib/Twig/Filter/Method.php
@@ -12,8 +12,11 @@
 /**
  * Represents a method template filter.
  *
+ * Use Twig_SimpleFilter instead.
+ *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 class Twig_Filter_Method extends Twig_Filter
 {
@@ -22,6 +25,8 @@ class Twig_Filter_Method extends Twig_Filter
 
     public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array())
     {
+        $options['callable'] = array($extension, $method);
+
         parent::__construct($options);
 
         $this->extension = $extension;
diff --git a/core/vendor/twig/twig/lib/Twig/Filter/Node.php b/core/vendor/twig/twig/lib/Twig/Filter/Node.php
index 7481c05..4d27c93 100644
--- a/core/vendor/twig/twig/lib/Twig/Filter/Node.php
+++ b/core/vendor/twig/twig/lib/Twig/Filter/Node.php
@@ -12,8 +12,11 @@
 /**
  * Represents a template filter as a node.
  *
+ * Use Twig_SimpleFilter instead.
+ *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 class Twig_Filter_Node extends Twig_Filter
 {
diff --git a/core/vendor/twig/twig/lib/Twig/TestInterface.php b/core/vendor/twig/twig/lib/Twig/FilterCallableInterface.php
similarity index 53%
copy from core/vendor/twig/twig/lib/Twig/TestInterface.php
copy to core/vendor/twig/twig/lib/Twig/FilterCallableInterface.php
index 96db428..97c7610 100644
--- a/core/vendor/twig/twig/lib/Twig/TestInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/FilterCallableInterface.php
@@ -3,24 +3,22 @@
 /*
  * This file is part of Twig.
  *
- * (c) 2010 Fabien Potencier
+ * (c) 2012 Fabien Potencier
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
 /**
- * Represents a template test.
+ * Represents a callable template filter.
+ *
+ * Use Twig_SimpleFilter instead.
  *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
-interface Twig_TestInterface
+interface Twig_FilterCallableInterface
 {
-    /**
-     * Compiles a test.
-     *
-     * @return string The PHP code for the test
-     */
-    public function compile();
+    public function getCallable();
 }
diff --git a/core/vendor/twig/twig/lib/Twig/FilterInterface.php b/core/vendor/twig/twig/lib/Twig/FilterInterface.php
index 0a07c7c..0c7f0a4 100644
--- a/core/vendor/twig/twig/lib/Twig/FilterInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/FilterInterface.php
@@ -12,8 +12,11 @@
 /**
  * Represents a template filter.
  *
+ * Use Twig_SimpleFilter instead.
+ *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 interface Twig_FilterInterface
 {
diff --git a/core/vendor/twig/twig/lib/Twig/Function.php b/core/vendor/twig/twig/lib/Twig/Function.php
index cd7643f..b30c30e 100644
--- a/core/vendor/twig/twig/lib/Twig/Function.php
+++ b/core/vendor/twig/twig/lib/Twig/Function.php
@@ -12,10 +12,13 @@
 /**
  * Represents a template function.
  *
+ * Use Twig_SimpleFunction instead.
+ *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
-abstract class Twig_Function implements Twig_FunctionInterface
+abstract class Twig_Function implements Twig_FunctionInterface, Twig_FunctionCallableInterface
 {
     protected $options;
     protected $arguments = array();
@@ -25,6 +28,7 @@ public function __construct(array $options = array())
         $this->options = array_merge(array(
             'needs_environment' => false,
             'needs_context'     => false,
+            'callable'          => null,
         ), $options);
     }
 
@@ -60,4 +64,9 @@ public function getSafe(Twig_Node $functionArgs)
 
         return array();
     }
+
+    public function getCallable()
+    {
+        return $this->options['callable'];
+    }
 }
diff --git a/core/vendor/twig/twig/lib/Twig/Function/Function.php b/core/vendor/twig/twig/lib/Twig/Function/Function.php
index 3237d8c..7e5c9c2 100644
--- a/core/vendor/twig/twig/lib/Twig/Function/Function.php
+++ b/core/vendor/twig/twig/lib/Twig/Function/Function.php
@@ -13,8 +13,11 @@
 /**
  * Represents a function template function.
  *
+ * Use Twig_SimpleFunction instead.
+ *
  * @package    twig
  * @author     Arnaud Le Blanc <arnaud.lb@gmail.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 class Twig_Function_Function extends Twig_Function
 {
@@ -22,6 +25,8 @@ class Twig_Function_Function extends Twig_Function
 
     public function __construct($function, array $options = array())
     {
+        $options['callable'] = $function;
+
         parent::__construct($options);
 
         $this->function = $function;
diff --git a/core/vendor/twig/twig/lib/Twig/Function/Method.php b/core/vendor/twig/twig/lib/Twig/Function/Method.php
index 8838618..a13741e 100644
--- a/core/vendor/twig/twig/lib/Twig/Function/Method.php
+++ b/core/vendor/twig/twig/lib/Twig/Function/Method.php
@@ -13,8 +13,11 @@
 /**
  * Represents a method template function.
  *
+ * Use Twig_SimpleFunction instead.
+ *
  * @package    twig
  * @author     Arnaud Le Blanc <arnaud.lb@gmail.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 class Twig_Function_Method extends Twig_Function
 {
@@ -23,6 +26,8 @@ class Twig_Function_Method extends Twig_Function
 
     public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array())
     {
+        $options['callable'] = array($extension, $method);
+
         parent::__construct($options);
 
         $this->extension = $extension;
diff --git a/core/vendor/twig/twig/lib/Twig/Function/Node.php b/core/vendor/twig/twig/lib/Twig/Function/Node.php
index df937e5..068c5fd 100644
--- a/core/vendor/twig/twig/lib/Twig/Function/Node.php
+++ b/core/vendor/twig/twig/lib/Twig/Function/Node.php
@@ -12,8 +12,11 @@
 /**
  * Represents a template function as a node.
  *
+ * Use Twig_SimpleFunction instead.
+ *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 class Twig_Function_Node extends Twig_Function
 {
diff --git a/core/vendor/twig/twig/lib/Twig/TestInterface.php b/core/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php
similarity index 52%
copy from core/vendor/twig/twig/lib/Twig/TestInterface.php
copy to core/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php
index 96db428..dfd6f75 100644
--- a/core/vendor/twig/twig/lib/Twig/TestInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php
@@ -3,24 +3,22 @@
 /*
  * This file is part of Twig.
  *
- * (c) 2010 Fabien Potencier
+ * (c) 2012 Fabien Potencier
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
 /**
- * Represents a template test.
+ * Represents a callable template function.
+ *
+ * Use Twig_SimpleFunction instead.
  *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
-interface Twig_TestInterface
+interface Twig_FunctionCallableInterface
 {
-    /**
-     * Compiles a test.
-     *
-     * @return string The PHP code for the test
-     */
-    public function compile();
+    public function getCallable();
 }
diff --git a/core/vendor/twig/twig/lib/Twig/FunctionInterface.php b/core/vendor/twig/twig/lib/Twig/FunctionInterface.php
index d652ac3..1c03cbd 100644
--- a/core/vendor/twig/twig/lib/Twig/FunctionInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/FunctionInterface.php
@@ -13,8 +13,11 @@
 /**
  * Represents a template function.
  *
+ * Use Twig_SimpleFunction instead.
+ *
  * @package    twig
  * @author     Arnaud Le Blanc <arnaud.lb@gmail.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 interface Twig_FunctionInterface
 {
diff --git a/core/vendor/twig/twig/lib/Twig/Lexer.php b/core/vendor/twig/twig/lib/Twig/Lexer.php
index d77071d..3be7215 100644
--- a/core/vendor/twig/twig/lib/Twig/Lexer.php
+++ b/core/vendor/twig/twig/lib/Twig/Lexer.php
@@ -61,10 +61,10 @@ public function __construct(Twig_Environment $env, array $options = array())
         $this->regexes = array(
             'lex_var'             => '/\s*'.preg_quote($this->options['whitespace_trim'].$this->options['tag_variable'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_variable'][1], '/').'/A',
             'lex_block'           => '/\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')\n?/A',
-            'lex_raw_data'        => '/('.preg_quote($this->options['tag_block'][0].$this->options['whitespace_trim'], '/').'|'.preg_quote($this->options['tag_block'][0], '/').')\s*endraw\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/s',
+            'lex_raw_data'        => '/('.preg_quote($this->options['tag_block'][0].$this->options['whitespace_trim'], '/').'|'.preg_quote($this->options['tag_block'][0], '/').')\s*(?:end%s)\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/s',
             'operator'            => $this->getOperatorRegex(),
             'lex_comment'         => '/(?:'.preg_quote($this->options['whitespace_trim'], '/').preg_quote($this->options['tag_comment'][1], '/').'\s*|'.preg_quote($this->options['tag_comment'][1], '/').')\n?/s',
-            'lex_block_raw'       => '/\s*raw\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/As',
+            'lex_block_raw'       => '/\s*(raw|verbatim)\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/As',
             'lex_block_line'      => '/\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1], '/').'/As',
             'lex_tokens_start'    => '/('.preg_quote($this->options['tag_variable'][0], '/').'|'.preg_quote($this->options['tag_block'][0], '/').'|'.preg_quote($this->options['tag_comment'][0], '/').')('.preg_quote($this->options['whitespace_trim'], '/').')?/s',
             'interpolation_start' => '/'.preg_quote($this->options['interpolation'][0], '/').'\s*/A',
@@ -178,7 +178,7 @@ protected function lexData()
                 // raw data?
                 if (preg_match($this->regexes['lex_block_raw'], $this->code, $match, null, $this->cursor)) {
                     $this->moveCursor($match[0]);
-                    $this->lexRawData();
+                    $this->lexRawData($match[1]);
                 // {% line \d+ %}
                 } elseif (preg_match($this->regexes['lex_block_line'], $this->code, $match, null, $this->cursor)) {
                     $this->moveCursor($match[0]);
@@ -286,10 +286,10 @@ protected function lexExpression()
         }
     }
 
-    protected function lexRawData()
+    protected function lexRawData($tag)
     {
-        if (!preg_match($this->regexes['lex_raw_data'], $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) {
-            throw new Twig_Error_Syntax(sprintf('Unexpected end of file: Unclosed "block"'), $this->lineno, $this->filename);
+        if (!preg_match(str_replace('%s', $tag, $this->regexes['lex_raw_data']), $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) {
+            throw new Twig_Error_Syntax(sprintf('Unexpected end of file: Unclosed "%s" block', $tag), $this->lineno, $this->filename);
         }
 
         $text = substr($this->code, $this->cursor, $match[0][1] - $this->cursor);
diff --git a/core/vendor/twig/twig/lib/Twig/LexerInterface.php b/core/vendor/twig/twig/lib/Twig/LexerInterface.php
index 9c3d3d2..6fd4db5 100644
--- a/core/vendor/twig/twig/lib/Twig/LexerInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/LexerInterface.php
@@ -14,6 +14,7 @@
  *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 interface Twig_LexerInterface
 {
diff --git a/core/vendor/twig/twig/lib/Twig/Node/Expression/Call.php b/core/vendor/twig/twig/lib/Twig/Node/Expression/Call.php
new file mode 100644
index 0000000..a97b3b5
--- /dev/null
+++ b/core/vendor/twig/twig/lib/Twig/Node/Expression/Call.php
@@ -0,0 +1,171 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) 2012 Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+abstract class Twig_Node_Expression_Call extends Twig_Node_Expression
+{
+    protected function compileCallable(Twig_Compiler $compiler)
+    {
+        $callable = $this->getAttribute('callable');
+
+        $closingParenthesis = false;
+        if ($callable) {
+            if (is_string($callable)) {
+                $compiler->raw($callable);
+            } elseif (is_array($callable) && $callable[0] instanceof Twig_ExtensionInterface) {
+                $compiler->raw(sprintf('$this->env->getExtension(\'%s\')->%s', $callable[0]->getName(), $callable[1]));
+            } else {
+                $type = ucfirst($this->getAttribute('type'));
+                $compiler->raw(sprintf('call_user_func_array($this->env->get%s(\'%s\')->getCallable(), array', $type, $this->getAttribute('name')));
+                $closingParenthesis = true;
+            }
+        } else {
+            $compiler->raw($this->getAttribute('thing')->compile());
+        }
+
+        $this->compileArguments($compiler);
+
+        if ($closingParenthesis) {
+            $compiler->raw(')');
+        }
+    }
+
+    protected function compileArguments(Twig_Compiler $compiler)
+    {
+        $compiler->raw('(');
+
+        $first = true;
+
+        if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
+            $compiler->raw('$this->env');
+            $first = false;
+        }
+
+        if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
+            if (!$first) {
+                $compiler->raw(', ');
+            }
+            $compiler->raw('$context');
+            $first = false;
+        }
+
+        if ($this->hasAttribute('arguments')) {
+            foreach ($this->getAttribute('arguments') as $argument) {
+                if (!$first) {
+                    $compiler->raw(', ');
+                }
+                $compiler->string($argument);
+                $first = false;
+            }
+        }
+
+        if ($this->hasNode('node')) {
+            if (!$first) {
+                $compiler->raw(', ');
+            }
+            $compiler->subcompile($this->getNode('node'));
+            $first = false;
+        }
+
+        if ($this->hasNode('arguments') && null !== $this->getNode('arguments')) {
+            $callable = $this->hasAttribute('callable') ? $this->getAttribute('callable') : null;
+
+            $arguments = $this->getArguments($callable, $this->getNode('arguments'));
+
+            foreach ($arguments as $node) {
+                if (!$first) {
+                    $compiler->raw(', ');
+                }
+                $compiler->subcompile($node);
+                $first = false;
+            }
+        }
+
+        $compiler->raw(')');
+    }
+
+    protected function getArguments($callable, $arguments)
+    {
+        $parameters = array();
+        $named = false;
+        foreach ($arguments as $name => $node) {
+            if (!is_int($name)) {
+                $named = true;
+                $name = $this->normalizeName($name);
+            }
+            $parameters[$name] = $node;
+        }
+
+        if (!$named) {
+            return $parameters;
+        }
+
+        if (!$callable) {
+            throw new LogicException(sprintf('Named arguments are not supported for %s "%s".', $this->getAttribute('type'), $this->getAttribute('name')));
+        }
+
+        // manage named arguments
+        if (is_array($callable)) {
+            $r = new ReflectionMethod($callable[0], $callable[1]);
+        } elseif (is_object($callable) && !$callable instanceof Closure) {
+            $r = new ReflectionObject($callable);
+            $r = $r->getMethod('__invoke');
+        } else {
+            $r = new ReflectionFunction($callable);
+        }
+
+        $definition = $r->getParameters();
+        if ($this->hasNode('node')) {
+            array_shift($definition);
+        }
+        if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
+            array_shift($definition);
+        }
+        if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
+            array_shift($definition);
+        }
+        if ($this->hasAttribute('arguments') && null !== $this->getAttribute('arguments')) {
+            foreach ($this->getAttribute('arguments') as $argument) {
+                array_shift($definition);
+            }
+        }
+
+        $arguments = array();
+        $pos = 0;
+        foreach ($definition as $param) {
+            $name = $this->normalizeName($param->name);
+
+            if (array_key_exists($name, $parameters)) {
+                $arguments[] = $parameters[$name];
+                unset($parameters[$name]);
+            } elseif (array_key_exists($pos, $parameters)) {
+                $arguments[] = $parameters[$pos];
+                unset($parameters[$pos]);
+                ++$pos;
+            } elseif ($param->isDefaultValueAvailable()) {
+                $arguments[] = new Twig_Node_Expression_Constant($param->getDefaultValue(), -1);
+            } elseif ($param->isOptional()) {
+                break;
+            } else {
+                throw new Twig_Error_Syntax(sprintf('Value for argument "%s" is required for %s "%s".', $name, $this->getAttribute('type'), $this->getAttribute('name')));
+            }
+        }
+
+        foreach (array_keys($parameters) as $name) {
+            throw new Twig_Error_Syntax(sprintf('Unknown argument "%s" for %s "%s".', $name, $this->getAttribute('type'), $this->getAttribute('name')));
+        }
+
+        return $arguments;
+    }
+
+    protected function normalizeName($name)
+    {
+        return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), $name));
+    }
+}
diff --git a/core/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php b/core/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php
index eb9cd31..207b062 100644
--- a/core/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php
+++ b/core/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php
@@ -9,7 +9,7 @@
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
-class Twig_Node_Expression_Filter extends Twig_Node_Expression
+class Twig_Node_Expression_Filter extends Twig_Node_Expression_Call
 {
     public function __construct(Twig_NodeInterface $node, Twig_Node_Expression_Constant $filterName, Twig_NodeInterface $arguments, $lineno, $tag = null)
     {
@@ -19,43 +19,18 @@ public function __construct(Twig_NodeInterface $node, Twig_Node_Expression_Const
     public function compile(Twig_Compiler $compiler)
     {
         $name = $this->getNode('filter')->getAttribute('value');
-
-        if (false === $filter = $compiler->getEnvironment()->getFilter($name)) {
-            $message = sprintf('The filter "%s" does not exist', $name);
-            if ($alternatives = $compiler->getEnvironment()->computeAlternatives($name, array_keys($compiler->getEnvironment()->getFilters()))) {
-                $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
-            }
-
-            throw new Twig_Error_Syntax($message, $this->getLine(), $compiler->getFilename());
-        }
-
-        $this->compileFilter($compiler, $filter);
-    }
-
-    protected function compileFilter(Twig_Compiler $compiler, Twig_FilterInterface $filter)
-    {
-        $compiler
-            ->raw($filter->compile().'(')
-            ->raw($filter->needsEnvironment() ? '$this->env, ' : '')
-            ->raw($filter->needsContext() ? '$context, ' : '')
-        ;
-
-        foreach ($filter->getArguments() as $argument) {
-            $compiler
-                ->string($argument)
-                ->raw(', ')
-            ;
-        }
-
-        $compiler->subcompile($this->getNode('node'));
-
-        foreach ($this->getNode('arguments') as $node) {
-            $compiler
-                ->raw(', ')
-                ->subcompile($node)
-            ;
+        $filter = $compiler->getEnvironment()->getFilter($name);
+
+        $this->setAttribute('name', $name);
+        $this->setAttribute('type', 'filter');
+        $this->setAttribute('thing', $filter);
+        $this->setAttribute('needs_environment', $filter->needsEnvironment());
+        $this->setAttribute('needs_context', $filter->needsContext());
+        $this->setAttribute('arguments', $filter->getArguments());
+        if ($filter instanceof Twig_FilterCallableInterface || $filter instanceof Twig_SimpleFilter) {
+            $this->setAttribute('callable', $filter->getCallable());
         }
 
-        $compiler->raw(')');
+        $this->compileCallable($compiler);
     }
 }
diff --git a/core/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php b/core/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php
index 1cb3342..fccd39a 100644
--- a/core/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php
+++ b/core/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php
@@ -23,7 +23,7 @@ class Twig_Node_Expression_Filter_Default extends Twig_Node_Expression_Filter
 {
     public function __construct(Twig_NodeInterface $node, Twig_Node_Expression_Constant $filterName, Twig_NodeInterface $arguments, $lineno, $tag = null)
     {
-        $default = new Twig_Node_Expression_Filter($node, new Twig_Node_Expression_Constant('_default', $node->getLine()), $arguments, $node->getLine());
+        $default = new Twig_Node_Expression_Filter($node, new Twig_Node_Expression_Constant('default', $node->getLine()), $arguments, $node->getLine());
 
         if ('default' === $filterName->getAttribute('value') && ($node instanceof Twig_Node_Expression_Name || $node instanceof Twig_Node_Expression_GetAttr)) {
             $test = new Twig_Node_Expression_Test_Defined(clone $node, 'defined', new Twig_Node(), $node->getLine());
diff --git a/core/vendor/twig/twig/lib/Twig/Node/Expression/Function.php b/core/vendor/twig/twig/lib/Twig/Node/Expression/Function.php
index 5640377..3e1f6b5 100644
--- a/core/vendor/twig/twig/lib/Twig/Node/Expression/Function.php
+++ b/core/vendor/twig/twig/lib/Twig/Node/Expression/Function.php
@@ -8,7 +8,7 @@
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
-class Twig_Node_Expression_Function extends Twig_Node_Expression
+class Twig_Node_Expression_Function extends Twig_Node_Expression_Call
 {
     public function __construct($name, Twig_NodeInterface $arguments, $lineno)
     {
@@ -18,49 +18,18 @@ public function __construct($name, Twig_NodeInterface $arguments, $lineno)
     public function compile(Twig_Compiler $compiler)
     {
         $name = $this->getAttribute('name');
-
-        if (false === $function = $compiler->getEnvironment()->getFunction($name)) {
-            $message = sprintf('The function "%s" does not exist', $name);
-            if ($alternatives = $compiler->getEnvironment()->computeAlternatives($name, array_keys($compiler->getEnvironment()->getFunctions()))) {
-                $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
-            }
-
-            throw new Twig_Error_Syntax($message, $this->getLine(), $compiler->getFilename());
-        }
-
-        $compiler->raw($function->compile().'(');
-
-        $first = true;
-
-        if ($function->needsEnvironment()) {
-            $compiler->raw('$this->env');
-            $first = false;
-        }
-
-        if ($function->needsContext()) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $compiler->raw('$context');
-            $first = false;
-        }
-
-        foreach ($function->getArguments() as $argument) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $compiler->string($argument);
-            $first = false;
-        }
-
-        foreach ($this->getNode('arguments') as $node) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $compiler->subcompile($node);
-            $first = false;
+        $function = $compiler->getEnvironment()->getFunction($name);
+
+        $this->setAttribute('name', $name);
+        $this->setAttribute('type', 'function');
+        $this->setAttribute('thing', $function);
+        $this->setAttribute('needs_environment', $function->needsEnvironment());
+        $this->setAttribute('needs_context', $function->needsContext());
+        $this->setAttribute('arguments', $function->getArguments());
+        if ($function instanceof Twig_FunctionCallableInterface || $function instanceof Twig_SimpleFunction) {
+            $this->setAttribute('callable', $function->getCallable());
         }
 
-        $compiler->raw(')');
+        $this->compileCallable($compiler);
     }
 }
diff --git a/core/vendor/twig/twig/lib/Twig/Node/Expression/Test.php b/core/vendor/twig/twig/lib/Twig/Node/Expression/Test.php
index 076e39d..639f501 100644
--- a/core/vendor/twig/twig/lib/Twig/Node/Expression/Test.php
+++ b/core/vendor/twig/twig/lib/Twig/Node/Expression/Test.php
@@ -8,7 +8,7 @@
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
-class Twig_Node_Expression_Test extends Twig_Node_Expression
+class Twig_Node_Expression_Test extends Twig_Node_Expression_Call
 {
     public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno)
     {
@@ -18,37 +18,15 @@ public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface
     public function compile(Twig_Compiler $compiler)
     {
         $name = $this->getAttribute('name');
-        $testMap = $compiler->getEnvironment()->getTests();
-        if (!isset($testMap[$name])) {
-            $message = sprintf('The test "%s" does not exist', $name);
-            if ($alternatives = $compiler->getEnvironment()->computeAlternatives($name, array_keys($compiler->getEnvironment()->getTests()))) {
-                $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
-            }
+        $test = $compiler->getEnvironment()->getTest($name);
 
-            throw new Twig_Error_Syntax($message, $this->getLine(), $compiler->getFilename());
+        $this->setAttribute('name', $name);
+        $this->setAttribute('type', 'test');
+        $this->setAttribute('thing', $test);
+        if ($test instanceof Twig_TestCallableInterface || $test instanceof Twig_SimpleTest) {
+            $this->setAttribute('callable', $test->getCallable());
         }
 
-        $name = $this->getAttribute('name');
-        $node = $this->getNode('node');
-
-        $compiler
-            ->raw($testMap[$name]->compile().'(')
-            ->subcompile($node)
-        ;
-
-        if (null !== $this->getNode('arguments')) {
-            $compiler->raw(', ');
-
-            $max = count($this->getNode('arguments')) - 1;
-            foreach ($this->getNode('arguments') as $i => $arg) {
-                $compiler->subcompile($arg);
-
-                if ($i != $max) {
-                    $compiler->raw(', ');
-                }
-            }
-        }
-
-        $compiler->raw(')');
+        $this->compileCallable($compiler);
     }
 }
diff --git a/core/vendor/twig/twig/lib/Twig/Node/Macro.php b/core/vendor/twig/twig/lib/Twig/Node/Macro.php
index 8bb5d9d..347e4b2 100644
--- a/core/vendor/twig/twig/lib/Twig/Node/Macro.php
+++ b/core/vendor/twig/twig/lib/Twig/Node/Macro.php
@@ -29,14 +29,27 @@ public function __construct($name, Twig_NodeInterface $body, Twig_NodeInterface
      */
     public function compile(Twig_Compiler $compiler)
     {
-        $arguments = array();
-        foreach ($this->getNode('arguments') as $argument) {
-            $arguments[] = '$_'.$argument->getAttribute('name').' = null';
+        $compiler
+            ->addDebugInfo($this)
+            ->write(sprintf("public function get%s(", $this->getAttribute('name')))
+        ;
+
+        $count = count($this->getNode('arguments'));
+        $pos = 0;
+        foreach ($this->getNode('arguments') as $name => $default) {
+            $compiler
+                ->raw('$_'.$name.' = ')
+                ->subcompile($default)
+            ;
+
+            if (++$pos < $count) {
+                $compiler->raw(', ');
+            }
         }
 
         $compiler
-            ->addDebugInfo($this)
-            ->write(sprintf("public function get%s(%s)\n", $this->getAttribute('name'), implode(', ', $arguments)), "{\n")
+            ->raw(")\n")
+            ->write("{\n")
             ->indent()
         ;
 
@@ -48,11 +61,11 @@ public function compile(Twig_Compiler $compiler)
                 ->indent()
             ;
 
-            foreach ($this->getNode('arguments') as $argument) {
+            foreach ($this->getNode('arguments') as $name => $default) {
                 $compiler
                     ->write('')
-                    ->string($argument->getAttribute('name'))
-                    ->raw(' => $_'.$argument->getAttribute('name'))
+                    ->string($name)
+                    ->raw(' => $_'.$name)
                     ->raw(",\n")
                 ;
             }
diff --git a/core/vendor/twig/twig/lib/Twig/NodeInterface.php b/core/vendor/twig/twig/lib/Twig/NodeInterface.php
index e77782f..44b953b 100644
--- a/core/vendor/twig/twig/lib/Twig/NodeInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/NodeInterface.php
@@ -14,6 +14,7 @@
  *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 interface Twig_NodeInterface extends Countable, IteratorAggregate
 {
diff --git a/core/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php b/core/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php
index cc9a58b..0d749fe 100644
--- a/core/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php
+++ b/core/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php
@@ -107,22 +107,18 @@ protected function preEscapeFilterNode(Twig_Node_Expression_Filter $filter, Twig
     {
         $name = $filter->getNode('filter')->getAttribute('value');
 
-        if (false !== $f = $env->getFilter($name)) {
-            $type = $f->getPreEscape();
-            if (null === $type) {
-                return $filter;
-            }
-
-            $node = $filter->getNode('node');
-            if ($this->isSafeFor($type, $node, $env)) {
-                return $filter;
-            }
-
-            $filter->setNode('node', $this->getEscaperFilter($type, $node));
+        $type = $env->getFilter($name)->getPreEscape();
+        if (null === $type) {
+            return $filter;
+        }
 
+        $node = $filter->getNode('node');
+        if ($this->isSafeFor($type, $node, $env)) {
             return $filter;
         }
 
+        $filter->setNode('node', $this->getEscaperFilter($type, $node));
+
         return $filter;
     }
 
diff --git a/core/vendor/twig/twig/lib/Twig/ParserInterface.php b/core/vendor/twig/twig/lib/Twig/ParserInterface.php
index 4de3999..2783a68 100644
--- a/core/vendor/twig/twig/lib/Twig/ParserInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/ParserInterface.php
@@ -12,8 +12,9 @@
 /**
  * Interface implemented by parser classes.
  *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
+ * @package    twig
+ * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 interface Twig_ParserInterface
 {
diff --git a/core/vendor/twig/twig/lib/Twig/Filter.php b/core/vendor/twig/twig/lib/Twig/SimpleFilter.php
similarity index 65%
copy from core/vendor/twig/twig/lib/Twig/Filter.php
copy to core/vendor/twig/twig/lib/Twig/SimpleFilter.php
index 1a4806c..7089a9d 100644
--- a/core/vendor/twig/twig/lib/Twig/Filter.php
+++ b/core/vendor/twig/twig/lib/Twig/SimpleFilter.php
@@ -3,7 +3,7 @@
 /*
  * This file is part of Twig.
  *
- * (c) 2009 Fabien Potencier
+ * (c) 2009-2012 Fabien Potencier
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
@@ -15,21 +15,43 @@
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
  */
-abstract class Twig_Filter implements Twig_FilterInterface
+class Twig_SimpleFilter
 {
+    protected $name;
+    protected $callable;
     protected $options;
     protected $arguments = array();
 
-    public function __construct(array $options = array())
+    public function __construct($name, $callable, array $options = array())
     {
+        $this->name = $name;
+        $this->callable = $callable;
         $this->options = array_merge(array(
             'needs_environment' => false,
             'needs_context'     => false,
+            'is_safe'           => null,
+            'is_safe_callback'  => null,
             'pre_escape'        => null,
             'preserves_safety'  => null,
+            'node_class'        => 'Twig_Node_Expression_Filter',
         ), $options);
     }
 
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function getCallable()
+    {
+        return $this->callable;
+    }
+
+    public function getNodeClass()
+    {
+        return $this->options['node_class'];
+    }
+
     public function setArguments($arguments)
     {
         $this->arguments = $arguments;
@@ -52,11 +74,11 @@ public function needsContext()
 
     public function getSafe(Twig_Node $filterArgs)
     {
-        if (isset($this->options['is_safe'])) {
+        if (null !== $this->options['is_safe']) {
             return $this->options['is_safe'];
         }
 
-        if (isset($this->options['is_safe_callback'])) {
+        if (null !== $this->options['is_safe_callback']) {
             return call_user_func($this->options['is_safe_callback'], $filterArgs);
         }
 
diff --git a/core/vendor/twig/twig/lib/Twig/Function.php b/core/vendor/twig/twig/lib/Twig/SimpleFunction.php
similarity index 60%
copy from core/vendor/twig/twig/lib/Twig/Function.php
copy to core/vendor/twig/twig/lib/Twig/SimpleFunction.php
index cd7643f..9924154 100644
--- a/core/vendor/twig/twig/lib/Twig/Function.php
+++ b/core/vendor/twig/twig/lib/Twig/SimpleFunction.php
@@ -3,7 +3,7 @@
 /*
  * This file is part of Twig.
  *
- * (c) 2010 Fabien Potencier
+ * (c) 2010-2012 Fabien Potencier
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
@@ -15,19 +15,41 @@
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
  */
-abstract class Twig_Function implements Twig_FunctionInterface
+class Twig_SimpleFunction
 {
+    protected $name;
+    protected $callable;
     protected $options;
     protected $arguments = array();
 
-    public function __construct(array $options = array())
+    public function __construct($name, $callable, array $options = array())
     {
+        $this->name = $name;
+        $this->callable = $callable;
         $this->options = array_merge(array(
             'needs_environment' => false,
             'needs_context'     => false,
+            'is_safe'           => null,
+            'is_safe_callback'  => null,
+            'node_class'        => 'Twig_Node_Expression_Function',
         ), $options);
     }
 
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function getCallable()
+    {
+        return $this->callable;
+    }
+
+    public function getNodeClass()
+    {
+        return $this->options['node_class'];
+    }
+
     public function setArguments($arguments)
     {
         $this->arguments = $arguments;
@@ -50,11 +72,11 @@ public function needsContext()
 
     public function getSafe(Twig_Node $functionArgs)
     {
-        if (isset($this->options['is_safe'])) {
+        if (null !== $this->options['is_safe']) {
             return $this->options['is_safe'];
         }
 
-        if (isset($this->options['is_safe_callback'])) {
+        if (null !== $this->options['is_safe_callback']) {
             return call_user_func($this->options['is_safe_callback'], $functionArgs);
         }
 
diff --git a/core/vendor/twig/twig/lib/Twig/SimpleTest.php b/core/vendor/twig/twig/lib/Twig/SimpleTest.php
new file mode 100644
index 0000000..7502c79
--- /dev/null
+++ b/core/vendor/twig/twig/lib/Twig/SimpleTest.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) 2010-2012 Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Represents a template test.
+ *
+ * @package    twig
+ * @author     Fabien Potencier <fabien@symfony.com>
+ */
+class Twig_SimpleTest
+{
+    protected $name;
+    protected $callable;
+    protected $options;
+
+    public function __construct($name, $callable, array $options = array())
+    {
+        $this->name = $name;
+        $this->callable = $callable;
+        $this->options = array_merge(array(
+            'node_class' => 'Twig_Node_Expression_Test',
+        ), $options);
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function getCallable()
+    {
+        return $this->callable;
+    }
+
+    public function getNodeClass()
+    {
+        return $this->options['node_class'];
+    }
+}
diff --git a/core/vendor/twig/twig/lib/Twig/TemplateInterface.php b/core/vendor/twig/twig/lib/Twig/TemplateInterface.php
index 5d7b027..d2a2c39 100644
--- a/core/vendor/twig/twig/lib/Twig/TemplateInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/TemplateInterface.php
@@ -12,8 +12,9 @@
 /**
  * Interface implemented by all compiled templates.
  *
- * @package twig
- * @author  Fabien Potencier <fabien@symfony.com>
+ * @package    twig
+ * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 interface Twig_TemplateInterface
 {
diff --git a/core/vendor/twig/twig/lib/Twig/Test.php b/core/vendor/twig/twig/lib/Twig/Test.php
new file mode 100644
index 0000000..7fef1b4
--- /dev/null
+++ b/core/vendor/twig/twig/lib/Twig/Test.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) 2012 Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Represents a template test.
+ *
+ * @package    twig
+ * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
+ */
+abstract class Twig_Test implements Twig_TestInterface, Twig_TestCallableInterface
+{
+    protected $options;
+    protected $arguments = array();
+
+    public function __construct(array $options = array())
+    {
+        $this->options = array_merge(array(
+            'callable' => null,
+        ), $options);
+    }
+
+    public function getCallable()
+    {
+        return $this->options['callable'];
+    }
+}
diff --git a/core/vendor/twig/twig/lib/Twig/Test/Function.php b/core/vendor/twig/twig/lib/Twig/Test/Function.php
index 1240a0f..d0ff490 100644
--- a/core/vendor/twig/twig/lib/Twig/Test/Function.php
+++ b/core/vendor/twig/twig/lib/Twig/Test/Function.php
@@ -14,13 +14,18 @@
  *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
-class Twig_Test_Function implements Twig_TestInterface
+class Twig_Test_Function extends Twig_Test
 {
     protected $function;
 
-    public function __construct($function)
+    public function __construct($function, array $options = array())
     {
+        $options['callable'] = $function;
+
+        parent::__construct($options);
+
         $this->function = $function;
     }
 
diff --git a/core/vendor/twig/twig/lib/Twig/Test/Method.php b/core/vendor/twig/twig/lib/Twig/Test/Method.php
index a8d1d9b..5a5f37f 100644
--- a/core/vendor/twig/twig/lib/Twig/Test/Method.php
+++ b/core/vendor/twig/twig/lib/Twig/Test/Method.php
@@ -14,14 +14,19 @@
  *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
-class Twig_Test_Method implements Twig_TestInterface
+class Twig_Test_Method extends Twig_Test
 {
     protected $extension;
     protected $method;
 
-    public function __construct(Twig_ExtensionInterface $extension, $method)
+    public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array())
     {
+        $options['callable'] = array($extension, $method);
+
+        parent::__construct($options);
+
         $this->extension = $extension;
         $this->method = $method;
     }
diff --git a/core/vendor/twig/twig/lib/Twig/Test/Node.php b/core/vendor/twig/twig/lib/Twig/Test/Node.php
index 47a978e..eee48f9 100644
--- a/core/vendor/twig/twig/lib/Twig/Test/Node.php
+++ b/core/vendor/twig/twig/lib/Twig/Test/Node.php
@@ -14,13 +14,16 @@
  *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
-class Twig_Test_Node implements Twig_TestInterface
+class Twig_Test_Node extends Twig_Test
 {
     protected $class;
 
-    public function __construct($class)
+    public function __construct($class, array $options = array())
     {
+        parent::__construct($options);
+
         $this->class = $class;
     }
 
diff --git a/core/vendor/twig/twig/lib/Twig/TestInterface.php b/core/vendor/twig/twig/lib/Twig/TestCallableInterface.php
similarity index 55%
copy from core/vendor/twig/twig/lib/Twig/TestInterface.php
copy to core/vendor/twig/twig/lib/Twig/TestCallableInterface.php
index 96db428..18a9ca2 100644
--- a/core/vendor/twig/twig/lib/Twig/TestInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/TestCallableInterface.php
@@ -3,24 +3,20 @@
 /*
  * This file is part of Twig.
  *
- * (c) 2010 Fabien Potencier
+ * (c) 2012 Fabien Potencier
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
 /**
- * Represents a template test.
+ * Represents a callable template test.
  *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
-interface Twig_TestInterface
+interface Twig_TestCallableInterface
 {
-    /**
-     * Compiles a test.
-     *
-     * @return string The PHP code for the test
-     */
-    public function compile();
+    public function getCallable();
 }
diff --git a/core/vendor/twig/twig/lib/Twig/TestInterface.php b/core/vendor/twig/twig/lib/Twig/TestInterface.php
index 96db428..c1a2118 100644
--- a/core/vendor/twig/twig/lib/Twig/TestInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/TestInterface.php
@@ -14,6 +14,7 @@
  *
  * @package    twig
  * @author     Fabien Potencier <fabien@symfony.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 interface Twig_TestInterface
 {
diff --git a/core/vendor/twig/twig/lib/Twig/TokenParser/For.php b/core/vendor/twig/twig/lib/Twig/TokenParser/For.php
index 2cbb580..98a6d07 100644
--- a/core/vendor/twig/twig/lib/Twig/TokenParser/For.php
+++ b/core/vendor/twig/twig/lib/Twig/TokenParser/For.php
@@ -33,25 +33,26 @@ class Twig_TokenParser_For extends Twig_TokenParser
     public function parse(Twig_Token $token)
     {
         $lineno = $token->getLine();
+        $stream = $this->parser->getStream();
         $targets = $this->parser->getExpressionParser()->parseAssignmentExpression();
-        $this->parser->getStream()->expect(Twig_Token::OPERATOR_TYPE, 'in');
+        $stream->expect(Twig_Token::OPERATOR_TYPE, 'in');
         $seq = $this->parser->getExpressionParser()->parseExpression();
 
         $ifexpr = null;
-        if ($this->parser->getStream()->test(Twig_Token::NAME_TYPE, 'if')) {
-            $this->parser->getStream()->next();
+        if ($stream->test(Twig_Token::NAME_TYPE, 'if')) {
+            $stream->next();
             $ifexpr = $this->parser->getExpressionParser()->parseExpression();
         }
 
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+        $stream->expect(Twig_Token::BLOCK_END_TYPE);
         $body = $this->parser->subparse(array($this, 'decideForFork'));
-        if ($this->parser->getStream()->next()->getValue() == 'else') {
-            $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+        if ($stream->next()->getValue() == 'else') {
+            $stream->expect(Twig_Token::BLOCK_END_TYPE);
             $else = $this->parser->subparse(array($this, 'decideForEnd'), true);
         } else {
             $else = null;
         }
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+        $stream->expect(Twig_Token::BLOCK_END_TYPE);
 
         if (count($targets) > 1) {
             $keyTarget = $targets->getNode(0);
@@ -64,6 +65,11 @@ public function parse(Twig_Token $token)
             $valueTarget = new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'), $valueTarget->getLine());
         }
 
+        if ($ifexpr) {
+            $this->checkLoopUsageCondition($stream, $ifexpr);
+            $this->checkLoopUsageBody($stream, $body);
+        }
+
         return new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, $lineno, $this->getTag());
     }
 
@@ -77,6 +83,47 @@ public function decideForEnd(Twig_Token $token)
         return $token->test('endfor');
     }
 
+    // the loop variable cannot be used in the condition
+    protected function checkLoopUsageCondition(Twig_TokenStream $stream, Twig_NodeInterface $node)
+    {
+        if ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name && 'loop' == $node->getNode('node')->getAttribute('name')) {
+            throw new Twig_Error_Syntax('The "loop" variable cannot be used in a looping condition', $node->getLine(), $stream->getFilename());
+        }
+
+        foreach ($node as $n) {
+            if (!$n) {
+                continue;
+            }
+
+            $this->checkLoopUsageCondition($stream, $n);
+        }
+    }
+
+    // check usage of non-defined loop-items
+    // it does not catch all problems (for instance when a for is included into another or when the variable is used in an include)
+    protected function checkLoopUsageBody(Twig_TokenStream $stream, Twig_NodeInterface $node)
+    {
+        if ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name && 'loop' == $node->getNode('node')->getAttribute('name')) {
+            $attribute = $node->getNode('attribute');
+            if ($attribute instanceof Twig_Node_Expression_Constant && in_array($attribute->getAttribute('value'), array('length', 'revindex0', 'revindex', 'last'))) {
+                throw new Twig_Error_Syntax(sprintf('The "loop.%s" variable is not defined when looping with a condition', $attribute->getAttribute('value')), $node->getLine(), $stream->getFilename());
+            }
+        }
+
+        // should check for parent.loop.XXX usage
+        if ($node instanceof Twig_Node_For) {
+            return;
+        }
+
+        foreach ($node as $n) {
+            if (!$n) {
+                continue;
+            }
+
+            $this->checkLoopUsageBody($stream, $n);
+        }
+    }
+
     /**
      * Gets the tag name associated with this token parser.
      *
diff --git a/core/vendor/twig/twig/lib/Twig/TokenParser/Macro.php b/core/vendor/twig/twig/lib/Twig/TokenParser/Macro.php
index de10059..c2a0336 100644
--- a/core/vendor/twig/twig/lib/Twig/TokenParser/Macro.php
+++ b/core/vendor/twig/twig/lib/Twig/TokenParser/Macro.php
@@ -33,7 +33,7 @@ public function parse(Twig_Token $token)
         $stream = $this->parser->getStream();
         $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
 
-        $arguments = $this->parser->getExpressionParser()->parseArguments();
+        $arguments = $this->parser->getExpressionParser()->parseArguments(true, true);
 
         $stream->expect(Twig_Token::BLOCK_END_TYPE);
         $this->parser->pushLocalScope();
diff --git a/core/vendor/twig/twig/lib/Twig/TokenParserBroker.php b/core/vendor/twig/twig/lib/Twig/TokenParserBroker.php
index f2c27ee..23474de 100644
--- a/core/vendor/twig/twig/lib/Twig/TokenParserBroker.php
+++ b/core/vendor/twig/twig/lib/Twig/TokenParserBroker.php
@@ -13,8 +13,9 @@
 /**
  * Default implementation of a token parser broker.
  *
- * @package twig
- * @author  Arnaud Le Blanc <arnaud.lb@gmail.com>
+ * @package    twig
+ * @author     Arnaud Le Blanc <arnaud.lb@gmail.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 class Twig_TokenParserBroker implements Twig_TokenParserBrokerInterface
 {
@@ -55,6 +56,19 @@ public function addTokenParser(Twig_TokenParserInterface $parser)
     }
 
     /**
+     * Removes a TokenParser.
+     *
+     * @param Twig_TokenParserInterface $parser A Twig_TokenParserInterface instance
+     */
+    public function removeTokenParser(Twig_TokenParserInterface $parser)
+    {
+        $name = $parser->getTag();
+        if (isset($this->parsers[$name]) && $parser === $this->parsers[$name]) {
+            unset($this->parsers[$name]);
+        }
+    }
+
+    /**
      * Adds a TokenParserBroker.
      *
      * @param Twig_TokenParserBroker $broker A Twig_TokenParserBroker instance
@@ -65,6 +79,18 @@ public function addTokenParserBroker(Twig_TokenParserBroker $broker)
     }
 
     /**
+     * Removes a TokenParserBroker.
+     *
+     * @param Twig_TokenParserBroker $broker A Twig_TokenParserBroker instance
+     */
+    public function removeTokenParserBroker(Twig_TokenParserBroker $broker)
+    {
+        if (false !== $pos = array_search($broker, $this->brokers)) {
+            unset($this->brokers[$pos]);
+        }
+    }
+
+    /**
      * Gets a suitable TokenParser for a tag.
      *
      * First looks in parsers, then in brokers.
diff --git a/core/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php b/core/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php
index b8e3c23..ac7e7cd 100644
--- a/core/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php
+++ b/core/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php
@@ -15,8 +15,9 @@
  *
  * Token parser brokers allows to implement custom logic in the process of resolving a token parser for a given tag name.
  *
- * @package twig
- * @author  Arnaud Le Blanc <arnaud.lb@gmail.com>
+ * @package    twig
+ * @author     Arnaud Le Blanc <arnaud.lb@gmail.com>
+ * @deprecated since 1.12 (to be removed in 2.0)
  */
 interface Twig_TokenParserBrokerInterface
 {
diff --git a/core/vendor/twig/twig/lib/Twig/TokenStream.php b/core/vendor/twig/twig/lib/Twig/TokenStream.php
index 292c11f..fcb10eb 100644
--- a/core/vendor/twig/twig/lib/Twig/TokenStream.php
+++ b/core/vendor/twig/twig/lib/Twig/TokenStream.php
@@ -58,7 +58,7 @@ public function injectTokens(array $tokens)
     public function next()
     {
         if (!isset($this->tokens[++$this->current])) {
-            throw new Twig_Error_Syntax('Unexpected end of template', $this->token[$this->current - 1]->getLine(), $this->filename);
+            throw new Twig_Error_Syntax('Unexpected end of template', $this->tokens[$this->current - 1]->getLine(), $this->filename);
         }
 
         return $this->tokens[$this->current - 1];
@@ -97,7 +97,7 @@ public function expect($type, $value = null, $message = null)
     public function look($number = 1)
     {
         if (!isset($this->tokens[$this->current + $number])) {
-            throw new Twig_Error_Syntax('Unexpected end of template', $this->token[$this->current + $number - 1]->getLine(), $this->filename);
+            throw new Twig_Error_Syntax('Unexpected end of template', $this->tokens[$this->current + $number - 1]->getLine(), $this->filename);
         }
 
         return $this->tokens[$this->current + $number];
diff --git a/core/vendor/twig/twig/package.xml.tpl b/core/vendor/twig/twig/package.xml.tpl
deleted file mode 100644
index f9a9b89..0000000
--- a/core/vendor/twig/twig/package.xml.tpl
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package packagerversion="1.8.0" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
-    http://pear.php.net/dtd/tasks-1.0.xsd
-    http://pear.php.net/dtd/package-2.0
-    http://pear.php.net/dtd/package-2.0.xsd">
- <name>Twig</name>
- <channel>pear.twig-project.org</channel>
- <summary>Twig is a PHP template engine.</summary>
- <description>
-   Twig is a template language for PHP, released under the new BSD license
-   (code and documentation).
-
-   Twig uses a syntax similar to the Django and Jinja template languages which
-   inspired the Twig runtime environment.
- </description>
- <lead>
-  <name>Fabien Potencier</name>
-  <user>fabpot</user>
-  <email>fabien.potencier@symfony-project.org</email>
-  <active>yes</active>
- </lead>
- <lead>
-  <name>Armin Ronacher</name>
-  <user>armin</user>
-  <email>armin.ronacher@active-4.com</email>
-  <active>no</active>
- </lead>
- <date>{{ date }}</date>
- <time>{{ time }}</time>
- <version>
-  <release>{{ version }}</release>
-  <api>{{ api_version }}</api>
- </version>
- <stability>
-  <release>{{ stability }}</release>
-  <api>{{ stability }}</api>
- </stability>
- <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
- <notes>-</notes>
- <contents>
-   <dir name="/">
-     <file name="AUTHORS" role="doc" />
-     <file name="CHANGELOG" role="doc" />
-     <file name="LICENSE" role="doc" />
-     <file name="README.markdown" role="doc" />
-     <dir name="lib">
-      <dir name="Twig">
-{{ files }}
-      </dir>
-     </dir>
-   </dir>
- </contents>
- <dependencies>
-  <required>
-   <php>
-    <min>5.2.4</min>
-   </php>
-   <pearinstaller>
-    <min>1.4.0</min>
-   </pearinstaller>
-  </required>
- </dependencies>
- <phprelease />
-</package>
diff --git a/core/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php b/core/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php
index 76731ea..fc2cef8 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php
+++ b/core/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php
@@ -32,4 +32,241 @@ public function escapingStrategyCallback($filename)
     {
         return $filename;
     }
+
+    public function testGlobals()
+    {
+        // globals can be added after calling getGlobals
+        $twig = new Twig_Environment(new Twig_Loader_String());
+        $twig->addGlobal('foo', 'foo');
+        $globals = $twig->getGlobals();
+        $twig->addGlobal('foo', 'bar');
+        $globals = $twig->getGlobals();
+        $this->assertEquals('bar', $globals['foo']);
+
+        // globals can be modified after runtime init
+        $twig = new Twig_Environment(new Twig_Loader_String());
+        $twig->addGlobal('foo', 'foo');
+        $globals = $twig->getGlobals();
+        $twig->initRuntime();
+        $twig->addGlobal('foo', 'bar');
+        $globals = $twig->getGlobals();
+        $this->assertEquals('bar', $globals['foo']);
+
+        // globals can be modified after extensions init
+        $twig = new Twig_Environment(new Twig_Loader_String());
+        $twig->addGlobal('foo', 'foo');
+        $globals = $twig->getGlobals();
+        $twig->getFunctions();
+        $twig->addGlobal('foo', 'bar');
+        $globals = $twig->getGlobals();
+        $this->assertEquals('bar', $globals['foo']);
+
+        // globals can be modified after extensions and runtime init
+        $twig = new Twig_Environment(new Twig_Loader_String());
+        $twig->addGlobal('foo', 'foo');
+        $globals = $twig->getGlobals();
+        $twig->getFunctions();
+        $twig->initRuntime();
+        $twig->addGlobal('foo', 'bar');
+        $globals = $twig->getGlobals();
+        $this->assertEquals('bar', $globals['foo']);
+
+        /* to be uncomment in Twig 2.0
+        // globals cannot be added after runtime init
+        $twig = new Twig_Environment(new Twig_Loader_String());
+        $twig->addGlobal('foo', 'foo');
+        $globals = $twig->getGlobals();
+        $twig->initRuntime();
+        try {
+            $twig->addGlobal('bar', 'bar');
+            $this->fail();
+        } catch (LogicException $e) {
+            $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
+        }
+
+        // globals cannot be added after extensions init
+        $twig = new Twig_Environment(new Twig_Loader_String());
+        $twig->addGlobal('foo', 'foo');
+        $globals = $twig->getGlobals();
+        $twig->getFunctions();
+        try {
+            $twig->addGlobal('bar', 'bar');
+            $this->fail();
+        } catch (LogicException $e) {
+            $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
+        }
+
+        // globals cannot be added after extensions and runtime init
+        $twig = new Twig_Environment(new Twig_Loader_String());
+        $twig->addGlobal('foo', 'foo');
+        $globals = $twig->getGlobals();
+        $twig->getFunctions();
+        $twig->initRuntime();
+        try {
+            $twig->addGlobal('bar', 'bar');
+            $this->fail();
+        } catch (LogicException $e) {
+            $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
+        }
+
+        // test adding globals after initRuntime without call to getGlobals
+        $twig = new Twig_Environment(new Twig_Loader_String());
+        $twig->initRuntime();
+        try {
+            $twig->addGlobal('bar', 'bar');
+            $this->fail();
+        } catch (LogicException $e) {
+            $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
+        }
+        */
+    }
+
+    public function testExtensionsAreNotInitializedWhenRenderingACompiledTemplate()
+    {
+        $options = array('cache' => sys_get_temp_dir().'/twig', 'auto_reload' => false, 'debug' => false);
+
+        // force compilation
+        $twig = new Twig_Environment(new Twig_Loader_String(), $options);
+        $cache = $twig->getCacheFilename('{{ foo }}');
+        if (!is_dir(dirname($cache))) {
+            mkdir(dirname($cache), 0777, true);
+        }
+        file_put_contents($cache, $twig->compileSource('{{ foo }}', '{{ foo }}'));
+
+        // check that extensions won't be initialized when rendering a template that is already in the cache
+        $twig = $this
+            ->getMockBuilder('Twig_Environment')
+            ->setConstructorArgs(array(new Twig_Loader_String(), $options))
+            ->setMethods(array('initExtensions'))
+            ->getMock()
+        ;
+
+        $twig->expects($this->never())->method('initExtensions');
+
+        // render template
+        $output = $twig->render('{{ foo }}', array('foo' => 'bar'));
+        $this->assertEquals('bar', $output);
+
+        unlink($cache);
+    }
+
+    public function testAddExtension()
+    {
+        $twig = new Twig_Environment(new Twig_Loader_String());
+        $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension());
+
+        $this->assertArrayHasKey('test', $twig->getTags());
+        $this->assertArrayHasKey('foo_filter', $twig->getFilters());
+        $this->assertArrayHasKey('foo_function', $twig->getFunctions());
+        $this->assertArrayHasKey('foo_test', $twig->getTests());
+        $this->assertArrayHasKey('foo_unary', $twig->getUnaryOperators());
+        $this->assertArrayHasKey('foo_binary', $twig->getBinaryOperators());
+        $this->assertArrayHasKey('foo_global', $twig->getGlobals());
+        $visitors = $twig->getNodeVisitors();
+        $this->assertEquals('Twig_Tests_EnvironmentTest_NodeVisitor', get_class($visitors[2]));
+    }
+
+    public function testRemoveExtension()
+    {
+        $twig = new Twig_Environment(new Twig_Loader_String());
+        $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension());
+        $twig->removeExtension('test');
+
+        $this->assertFalse(array_key_exists('test', $twig->getTags()));
+        $this->assertFalse(array_key_exists('foo_filter', $twig->getFilters()));
+        $this->assertFalse(array_key_exists('foo_function', $twig->getFunctions()));
+        $this->assertFalse(array_key_exists('foo_test', $twig->getTests()));
+        $this->assertFalse(array_key_exists('foo_unary', $twig->getUnaryOperators()));
+        $this->assertFalse(array_key_exists('foo_binary', $twig->getBinaryOperators()));
+        $this->assertFalse(array_key_exists('foo_global', $twig->getGlobals()));
+        $this->assertCount(2, $twig->getNodeVisitors());
+    }
+}
+
+class Twig_Tests_EnvironmentTest_Extension extends Twig_Extension
+{
+    public function getTokenParsers()
+    {
+        return array(
+            new Twig_Tests_EnvironmentTest_TokenParser(),
+        );
+    }
+
+    public function getNodeVisitors()
+    {
+        return array(
+            new Twig_Tests_EnvironmentTest_NodeVisitor(),
+        );
+    }
+
+    public function getFilters()
+    {
+        return array(
+            'foo_filter' => new Twig_Filter_Function('foo_filter'),
+        );
+    }
+
+    public function getTests()
+    {
+        return array(
+            'foo_test' => new Twig_Test_Function('foo_test'),
+        );
+    }
+
+    public function getFunctions()
+    {
+        return array(
+            'foo_function' => new Twig_Function_Function('foo_function'),
+        );
+    }
+
+    public function getOperators()
+    {
+        return array(
+            array('foo_unary' => array()),
+            array('foo_binary' => array()),
+        );
+    }
+
+    public function getGlobals()
+    {
+        return array(
+            'foo_global' => 'foo_global',
+        );
+    }
+
+    public function getName()
+    {
+        return 'test';
+    }
+}
+
+class Twig_Tests_EnvironmentTest_TokenParser extends Twig_TokenParser
+{
+    public function parse(Twig_Token $token)
+    {
+    }
+
+    public function getTag()
+    {
+        return 'test';
+    }
+}
+
+class Twig_Tests_EnvironmentTest_NodeVisitor implements Twig_NodeVisitorInterface
+{
+    public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
+    {
+        return $node;
+    }
+
+    public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
+    {
+        return $node;
+    }
+
+    public function getPriority()
+    {
+        return 0;
+    }
 }
diff --git a/core/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php b/core/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php
index b3f300f..8ec6537 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php
+++ b/core/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php
@@ -214,4 +214,119 @@ public function getTestsForString()
             ),
         );
     }
+
+    /**
+     * @expectedException Twig_Error_Syntax
+     */
+    public function testAttributeCallDoesNotSupportNamedArguments()
+    {
+        $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
+        $parser = new Twig_Parser($env);
+
+        $parser->parse($env->tokenize('{{ foo.bar(name="Foo") }}', 'index'));
+    }
+
+    /**
+     * @expectedException Twig_Error_Syntax
+     */
+    public function testMacroCallDoesNotSupportNamedArguments()
+    {
+        $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
+        $parser = new Twig_Parser($env);
+
+        $parser->parse($env->tokenize('{% from _self import foo %}{% macro foo() %}{% endmacro %}{{ foo(name="Foo") }}', 'index'));
+    }
+
+    /**
+     * @expectedException        Twig_Error_Syntax
+     * @expectedExceptionMessage An argument must be a name. Unexpected token "string" of value "a" ("name" expected) in "index" at line 1
+     */
+    public function testMacroDefinitionDoesNotSupportNonNameVariableName()
+    {
+        $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
+        $parser = new Twig_Parser($env);
+
+        $parser->parse($env->tokenize('{% macro foo("a") %}{% endmacro %}', 'index'));
+    }
+
+    /**
+     * @expectedException        Twig_Error_Syntax
+     * @expectedExceptionMessage A default value for an argument must be a constant (a boolean, a string, a number, or an array) in "index" at line 1
+     * @dataProvider             getMacroDefinitionDoesNotSupportNonConstantDefaultValues
+     */
+    public function testMacroDefinitionDoesNotSupportNonConstantDefaultValues($template)
+    {
+        $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
+        $parser = new Twig_Parser($env);
+
+        $parser->parse($env->tokenize($template, 'index'));
+    }
+
+    public function getMacroDefinitionDoesNotSupportNonConstantDefaultValues()
+    {
+        return array(
+            array('{% macro foo(name = "a #{foo} a") %}{% endmacro %}'),
+            array('{% macro foo(name = [["b", "a #{foo} a"]]) %}{% endmacro %}'),
+        );
+    }
+
+    /**
+     * @dataProvider getMacroDefinitionSupportsConstantDefaultValues
+     */
+    public function testMacroDefinitionSupportsConstantDefaultValues($template)
+    {
+        $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
+        $parser = new Twig_Parser($env);
+
+        $parser->parse($env->tokenize($template, 'index'));
+    }
+
+    public function getMacroDefinitionSupportsConstantDefaultValues()
+    {
+        return array(
+            array('{% macro foo(name = "aa") %}{% endmacro %}'),
+            array('{% macro foo(name = 12) %}{% endmacro %}'),
+            array('{% macro foo(name = true) %}{% endmacro %}'),
+            array('{% macro foo(name = ["a"]) %}{% endmacro %}'),
+            array('{% macro foo(name = [["a"]]) %}{% endmacro %}'),
+            array('{% macro foo(name = {a: "a"}) %}{% endmacro %}'),
+            array('{% macro foo(name = {a: {b: "a"}}) %}{% endmacro %}'),
+        );
+    }
+
+    /**
+     * @expectedException        Twig_Error_Syntax
+     * @expectedExceptionMessage The function "cycl" does not exist. Did you mean "cycle" in "index" at line 1
+     */
+    public function testUnknownFunction()
+    {
+        $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
+        $parser = new Twig_Parser($env);
+
+        $parser->parse($env->tokenize('{{ cycl() }}', 'index'));
+    }
+
+    /**
+     * @expectedException        Twig_Error_Syntax
+     * @expectedExceptionMessage The filter "lowe" does not exist. Did you mean "lower" in "index" at line 1
+     */
+    public function testUnknownFilter()
+    {
+        $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
+        $parser = new Twig_Parser($env);
+
+        $parser->parse($env->tokenize('{{ 1|lowe }}', 'index'));
+    }
+
+    /**
+     * @expectedException        Twig_Error_Syntax
+     * @expectedExceptionMessage The test "nul" does not exist. Did you mean "null" in "index" at line 1
+     */
+    public function testUnknownTest()
+    {
+        $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
+        $parser = new Twig_Parser($env);
+
+        $parser->parse($env->tokenize('{{ 1 is nul }}', 'index'));
+    }
 }
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test
new file mode 100644
index 0000000..fdc660f
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test
@@ -0,0 +1,10 @@
+--TEST--
+Twig supports the ternary operator
+--TEMPLATE--
+{{ 1 ? 'YES' }}
+{{ 0 ? 'YES' }}
+--DATA--
+return array()
+--EXPECT--
+YES
+
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test
new file mode 100644
index 0000000..9057e83
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test
@@ -0,0 +1,10 @@
+--TEST--
+Twig supports the ternary operator
+--TEMPLATE--
+{{ 'YES' ?: 'NO' }}
+{{ 0 ?: 'NO' }}
+--DATA--
+return array()
+--EXPECT--
+YES
+NO
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test
new file mode 100644
index 0000000..6ca2049
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test
@@ -0,0 +1,15 @@
+--TEST--
+"date" filter
+--TEMPLATE--
+{{ date|date(format='d/m/Y H:i:s P', timezone='America/Chicago') }}
+{{ date|date(timezone='America/Chicago', format='d/m/Y H:i:s P') }}
+{{ date|date(timezone='America/Chicago', 'd/m/Y H:i:s P') }}
+{{ date|date('d/m/Y H:i:s P', timezone='America/Chicago') }}
+--DATA--
+date_default_timezone_set('UTC');
+return array('date' => mktime(13, 45, 0, 10, 4, 2010))
+--EXPECT--
+04/10/2010 08:45:00 -05:00
+04/10/2010 08:45:00 -05:00
+04/10/2010 08:45:00 -05:00
+04/10/2010 08:45:00 -05:00
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test
index 3c5f410..7948ac4 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test
@@ -4,9 +4,15 @@
 {{ [1, 2, 3, 4]|reverse|join('') }}
 {{ '1234évènement'|reverse }}
 {{ arr|reverse|join('') }}
+{{ {'a': 'c', 'b': 'a'}|reverse()|join(',') }}
+{{ {'a': 'c', 'b': 'a'}|reverse(preserveKeys=true)|join(glue=',') }}
+{{ {'a': 'c', 'b': 'a'}|reverse(preserve_keys=true)|join(glue=',') }}
 --DATA--
 return array('arr' => new ArrayObject(array(1, 2, 3, 4)))
 --EXPECT--
 4321
 tnemenèvé4321
 4321
+a,c
+a,c
+a,c
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test
index bb32dfb..b37ad65 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test
@@ -18,6 +18,7 @@
 {{ [1, 2, 3, 4][1:]|join('') }}
 {{ '1234'|slice(1) }}
 {{ '1234'[1:] }}
+{{ '1234'[:1] }}
 --DATA--
 return array('start' => 1, 'length' => 2, 'arr' => new ArrayObject(array(1, 2, 3, 4)))
 --EXPECT--
@@ -38,3 +39,4 @@
 234
 234
 234
+1
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test
index 6d4b374..6312879 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test
@@ -1,12 +1,10 @@
 --TEST--
 "constant" function
 --TEMPLATE--
-{% if constant('DATE_W3C') == expect %}
-true
-{% else %}
-false
-{% endif %}
+{{ constant('DATE_W3C') == expect ? 'true' : 'false' }}
+{{ constant('ARRAY_AS_PROPS', object) }}
 --DATA--
-return array('expect' => DATE_W3C);
+return array('expect' => DATE_W3C, 'object' => new ArrayObject(array('hi')));
 --EXPECT--
 true
+2
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test
new file mode 100644
index 0000000..b9dd9e3
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test
@@ -0,0 +1,11 @@
+--TEST--
+"date" function
+--TEMPLATE--
+{{ date(date, "America/New_York")|date('d/m/Y H:i:s P', false) }}
+{{ date(timezone="America/New_York", date=date)|date('d/m/Y H:i:s P', false) }}
+--DATA--
+date_default_timezone_set('UTC');
+return array('date' => mktime(13, 45, 0, 10, 4, 2010))
+--EXPECT--
+04/10/2010 09:45:00 -04:00
+04/10/2010 09:45:00 -04:00
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test
new file mode 100644
index 0000000..a434182
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test
@@ -0,0 +1,17 @@
+--TEST--
+"include" function
+--TEMPLATE--
+FOO
+{{ include("foo.twig") }}
+
+BAR
+--TEMPLATE(foo.twig)--
+FOOBAR
+--DATA--
+return array()
+--EXPECT--
+FOO
+
+FOOBAR
+
+BAR
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test
new file mode 100644
index 0000000..aba30ce
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test
@@ -0,0 +1,17 @@
+--TEST--
+"include" function allows expressions for the template to include
+--TEMPLATE--
+FOO
+{{ include(foo) }}
+
+BAR
+--TEMPLATE(foo.twig)--
+FOOBAR
+--DATA--
+return array('foo' => 'foo.twig')
+--EXPECT--
+FOO
+
+FOOBAR
+
+BAR
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test
new file mode 100644
index 0000000..43a2ccc
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test
@@ -0,0 +1,10 @@
+--TEST--
+"include" function
+--TEMPLATE--
+{{ include(["foo.twig", "bar.twig"], ignore_missing = true) }}
+{{ include("foo.twig", ignore_missing = true) }}
+{{ include("foo.twig", ignore_missing = true, variables = {}) }}
+{{ include("foo.twig", ignore_missing = true, variables = {}, with_context = true) }}
+--DATA--
+return array()
+--EXPECT--
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test
new file mode 100644
index 0000000..4d2f6cf
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test
@@ -0,0 +1,8 @@
+--TEST--
+"include" function
+--TEMPLATE--
+{{ include("foo.twig") }}
+--DATA--
+return array();
+--EXCEPTION--
+Twig_Error_Loader: Template "foo.twig" is not defined in "index.twig" at line 2.
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test
new file mode 100644
index 0000000..78fddc7
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test
@@ -0,0 +1,16 @@
+--TEST--
+"include" function
+--TEMPLATE--
+{% extends "base.twig" %}
+
+{% block content %}
+    {{ parent() }}
+{% endblock %}
+--TEMPLATE(base.twig)--
+{% block content %}
+    {{ include("foo.twig") }}
+{% endblock %}
+--DATA--
+return array();
+--EXCEPTION--
+Twig_Error_Loader: Template "foo.twig" is not defined in "base.twig" at line 3.
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test
new file mode 100644
index 0000000..788a2ab
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test
@@ -0,0 +1,10 @@
+--TEST--
+"include" tag sandboxed
+--TEMPLATE--
+{{ include("foo.twig", sandboxed = true) }}
+--TEMPLATE(foo.twig)--
+{{ foo|e }}
+--DATA--
+return array()
+--EXCEPTION--
+Twig_Sandbox_SecurityError: Filter "e" is not allowed in "index.twig" at line 2.
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test
new file mode 100644
index 0000000..18d405a
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test
@@ -0,0 +1,10 @@
+--TEST--
+"include" function accepts Twig_Template instance
+--TEMPLATE--
+{{ include(foo) }} FOO
+--TEMPLATE(foo.twig)--
+BAR
+--DATA--
+return array('foo' => $twig->loadTemplate('foo.twig'))
+--EXPECT--
+BAR FOO
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test
new file mode 100644
index 0000000..1a81006
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test
@@ -0,0 +1,12 @@
+--TEST--
+"include" function
+--TEMPLATE--
+{{ include(["foo.twig", "bar.twig"]) }}
+{{- include(["bar.twig", "foo.twig"]) }}
+--TEMPLATE(foo.twig)--
+foo
+--DATA--
+return array()
+--EXPECT--
+foo
+foo
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test
new file mode 100644
index 0000000..35611fb
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test
@@ -0,0 +1,16 @@
+--TEST--
+"include" function accept variables and with_context
+--TEMPLATE--
+{{ include("foo.twig") }}
+{{- include("foo.twig", with_context = false) }}
+{{- include("foo.twig", {'foo1': 'bar'}) }}
+{{- include("foo.twig", {'foo1': 'bar'}, with_context = false) }}
+--TEMPLATE(foo.twig)--
+{% for k, v in _context %}{{ k }},{% endfor %}
+--DATA--
+return array('foo' => 'bar')
+--EXPECT--
+foo,global,_parent,
+global,_parent,
+foo,global,foo1,_parent,
+foo1,global,_parent,
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test
new file mode 100644
index 0000000..b2ace94
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test
@@ -0,0 +1,12 @@
+--TEST--
+"include" function accept variables
+--TEMPLATE--
+{{ include("foo.twig", {'foo': 'bar'}) }}
+{{- include("foo.twig", vars) }}
+--TEMPLATE(foo.twig)--
+{{ foo }}
+--DATA--
+return array('vars' => array('foo' => 'bar'))
+--EXPECT--
+bar
+bar
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test
new file mode 100644
index 0000000..e0377c8
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test
@@ -0,0 +1,8 @@
+--TEST--
+"range" function
+--TEMPLATE--
+{{ range(low=0+1, high=10+0, step=2)|join(',') }}
+--DATA--
+return array()
+--EXPECT--
+1,3,5,7,9
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test
new file mode 100644
index 0000000..4ccff7b
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test
@@ -0,0 +1,16 @@
+--TEST--
+macro
+--TEMPLATE--
+{% from _self import test %}
+
+{% macro test(a, b = 'bar') -%}
+{{ a }}{{ b }}
+{%- endmacro %}
+
+{{ test('foo') }}
+{{ test('bar', 'foo') }}
+--DATA--
+return array();
+--EXPECT--
+foobar
+barfoo
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test
index 9e4eb9b..380531f 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test
+++ b/core/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test
@@ -2,13 +2,13 @@
 "for" tag takes a condition
 --TEMPLATE--
 {% for i in 1..5 if i is odd -%}
-    {{ loop.index }}.{{ i }}
+    {{ loop.index }}.{{ i }}{{ foo.bar }}
 {% endfor %}
 --DATA--
-return array()
+return array('foo' => array('bar' => 'X'))
 --CONFIG--
 return array('strict_variables' => false)
 --EXPECT--
-1.1
-2.3
-3.5
+1.1X
+2.3X
+3.5X
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php
index d37dd22..8089b9c 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php
+++ b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php
@@ -35,19 +35,6 @@ public function testCompile($node, $source, $environment = null)
         parent::testCompile($node, $source, $environment);
     }
 
-    /**
-     * @covers Twig_Node_Expression_Filter::compile
-     * @expectedException Twig_Error_Syntax
-     * @expectedExceptionMessage The filter "lowe" does not exist. Did you mean "lower" at line 1
-     */
-    public function testCompileUnknownFilter()
-    {
-        $expr = new Twig_Node_Expression_Constant('foo', 1);
-        $node = $this->createFilter($expr, 'lowe', array(new Twig_Node_Expression_Constant('bar', 1), new Twig_Node_Expression_Constant('foobar', 1)));
-
-        $node->compile($this->getCompiler());
-    }
-
     public function getTests()
     {
         $tests = array();
@@ -62,18 +49,69 @@ public function getTests()
             $tests[] = array($node, 'twig_number_format_filter($this->env, strtoupper("foo"), 2, ".", ",")');
         }
 
+        // named arguments
+        $date = new Twig_Node_Expression_Constant(0, 1);
+        $node = $this->createFilter($date, 'date', array(
+            'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1),
+            'format'   => new Twig_Node_Expression_Constant('d/m/Y H:i:s P', 1),
+        ));
+        $tests[] = array($node, 'twig_date_format_filter($this->env, 0, "d/m/Y H:i:s P", "America/Chicago")');
+
+        // skip an optional argument
+        $date = new Twig_Node_Expression_Constant(0, 1);
+        $node = $this->createFilter($date, 'date', array(
+            'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1),
+        ));
+        $tests[] = array($node, 'twig_date_format_filter($this->env, 0, null, "America/Chicago")');
+
+        // underscores vs camelCase for named arguments
+        $string = new Twig_Node_Expression_Constant('abc', 1);
+        $node = $this->createFilter($string, 'reverse', array(
+            'preserve_keys' => new Twig_Node_Expression_Constant(true, 1),
+        ));
+        $tests[] = array($node, 'twig_reverse_filter($this->env, "abc", true)');
+        $node = $this->createFilter($string, 'reverse', array(
+            'preserveKeys' => new Twig_Node_Expression_Constant(true, 1),
+        ));
+        $tests[] = array($node, 'twig_reverse_filter($this->env, "abc", true)');
+
+        // filter as an anonymous function
+        if (version_compare(phpversion(), '5.3.0', '>=')) {
+            $node = $this->createFilter(new Twig_Node_Expression_Constant('foo', 1), 'anonymous');
+            $tests[] = array($node, 'call_user_func_array($this->env->getFilter(\'anonymous\')->getCallable(), array("foo"))');
+        }
+
         return $tests;
     }
 
     /**
-     * @covers Twig_Node_Expression_Filter::compile
      * @expectedException        Twig_Error_Syntax
-     * @expectedExceptionMessage The filter "uppe" does not exist. Did you mean "upper" at line 1
+     * @expectedExceptionMessage Unknown argument "foobar" for filter "date".
      */
-    public function testUnknownFilter()
+    public function testCompileWithWrongNamedArgumentName()
     {
-        $node = $this->createFilter(new Twig_Node_Expression_Constant('foo', 1), 'uppe');
-        $node->compile($this->getCompiler());
+        $date = new Twig_Node_Expression_Constant(0, 1);
+        $node = $this->createFilter($date, 'date', array(
+            'foobar' => new Twig_Node_Expression_Constant('America/Chicago', 1),
+        ));
+
+        $compiler = $this->getCompiler();
+        $compiler->compile($node);
+    }
+
+    /**
+     * @expectedException        Twig_Error_Syntax
+     * @expectedExceptionMessage Value for argument "from" is required for filter "replace".
+     */
+    public function testCompileWithMissingNamedArgument()
+    {
+        $value = new Twig_Node_Expression_Constant(0, 1);
+        $node = $this->createFilter($value, 'replace', array(
+            'to' => new Twig_Node_Expression_Constant('foo', 1),
+        ));
+
+        $compiler = $this->getCompiler();
+        $compiler->compile($node);
     }
 
     protected function createFilter($node, $name, array $arguments = array())
@@ -83,4 +121,13 @@ protected function createFilter($node, $name, array $arguments = array())
 
         return new Twig_Node_Expression_Filter($node, $name, $arguments, 1);
     }
+
+    protected function getEnvironment()
+    {
+        if (version_compare(phpversion(), '5.3.0', '>=')) {
+            return include 'PHP53/FilterInclude.php';
+        }
+
+        return parent::getEnvironment();
+    }
 }
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php
index 13f4823..431dc38 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php
+++ b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php
@@ -33,17 +33,6 @@ public function testCompile($node, $source, $environment = null)
         parent::testCompile($node, $source, $environment);
     }
 
-    /**
-     * @covers Twig_Node_Expression_Filter::compile
-     * @expectedException        Twig_Error_Syntax
-     * @expectedExceptionMessage The function "cycl" does not exist. Did you mean "cycle" at line 1
-     */
-    public function testUnknownFunction()
-    {
-        $node = $this->createFunction('cycl', array());
-        $node->compile($this->getCompiler());
-    }
-
     public function getTests()
     {
         $environment = new Twig_Environment();
@@ -78,6 +67,19 @@ public function getTests()
         $node = $this->createFunction('foobar', array(new Twig_Node_Expression_Constant('bar', 1)));
         $tests[] = array($node, 'foobar($this->env, $context, "bar")', $environment);
 
+        // named arguments
+        $node = $this->createFunction('date', array(
+            'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1),
+            'date'     => new Twig_Node_Expression_Constant(0, 1),
+        ));
+        $tests[] = array($node, 'twig_date_converter($this->env, 0, "America/Chicago")');
+
+        // function as an anonymous function
+        if (version_compare(phpversion(), '5.3.0', '>=')) {
+            $node = $this->createFunction('anonymous', array(new Twig_Node_Expression_Constant('foo', 1)));
+            $tests[] = array($node, 'call_user_func_array($this->env->getFunction(\'anonymous\')->getCallable(), array("foo"))');
+        }
+
         return $tests;
     }
 
@@ -85,4 +87,13 @@ protected function createFunction($name, array $arguments = array())
     {
         return new Twig_Node_Expression_Function($name, new Twig_Node($arguments), 1);
     }
+
+    protected function getEnvironment()
+    {
+        if (version_compare(phpversion(), '5.3.0', '>=')) {
+            return include 'PHP53/FunctionInclude.php';
+        }
+
+        return parent::getEnvironment();
+    }
 }
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php
new file mode 100644
index 0000000..15e3aa9
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php
@@ -0,0 +1,6 @@
+<?php
+
+$env = new Twig_Environment();
+$env->addFilter(new Twig_SimpleFilter('anonymous', function () {}));
+
+return $env;
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php
new file mode 100644
index 0000000..d2170ed
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php
@@ -0,0 +1,6 @@
+<?php
+
+$env = new Twig_Environment();
+$env->addFunction(new Twig_SimpleFunction('anonymous', function () {}));
+
+return $env;
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php
new file mode 100644
index 0000000..6366286
--- /dev/null
+++ b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php
@@ -0,0 +1,6 @@
+<?php
+
+$env = new Twig_Environment();
+$env->addTest(new Twig_SimpleTest('anonymous', function () {}));
+
+return $env;
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php
index 4d0cf41..0664150 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php
+++ b/core/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php
@@ -41,25 +41,28 @@ public function getTests()
 
         $expr = new Twig_Node_Expression_Constant('foo', 1);
         $node = new Twig_Node_Expression_Test_Null($expr, 'null', new Twig_Node(array()), 1);
-
         $tests[] = array($node, '(null === "foo")');
 
+        // test as an anonymous function
+        if (version_compare(phpversion(), '5.3.0', '>=')) {
+            $node = $this->createTest(new Twig_Node_Expression_Constant('foo', 1), 'anonymous', array(new Twig_Node_Expression_Constant('foo', 1)));
+            $tests[] = array($node, 'call_user_func_array($this->env->getTest(\'anonymous\')->getCallable(), array("foo", "foo"))');
+        }
+
         return $tests;
     }
 
-    /**
-     * @covers Twig_Node_Expression_Filter::compile
-     * @expectedException        Twig_Error_Syntax
-     * @expectedExceptionMessage The test "nul" does not exist. Did you mean "null" at line 1
-     */
-    public function testUnknownTest()
+    protected function createTest($node, $name, array $arguments = array())
     {
-        $node = $this->createTest(new Twig_Node_Expression_Constant('foo', 1), 'nul');
-        $node->compile($this->getCompiler());
+        return new Twig_Node_Expression_Test($node, $name, new Twig_Node($arguments), 1);
     }
 
-    protected function createTest($node, $name, array $arguments = array())
+    protected function getEnvironment()
     {
-        return new Twig_Node_Expression_Test($node, $name, new Twig_Node($arguments), 1);
+        if (version_compare(phpversion(), '5.3.0', '>=')) {
+            return include 'PHP53/TestInclude.php';
+        }
+
+        return parent::getEnvironment();
     }
 }
diff --git a/core/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php b/core/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php
index 39e8131..4d2f641 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php
+++ b/core/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php
@@ -37,16 +37,20 @@ public function testCompile($node, $source, $environment = null)
     public function getTests()
     {
         $body = new Twig_Node_Text('foo', 1);
-        $arguments = new Twig_Node(array(new Twig_Node_Expression_Name('foo', 1)), array(), 1);
+        $arguments = new Twig_Node(array(
+            'foo' => new Twig_Node_Expression_Constant(null, 1),
+            'bar' => new Twig_Node_Expression_Constant('Foo', 1),
+        ), array(), 1);
         $node = new Twig_Node_Macro('foo', $body, $arguments, 1);
 
         return array(
             array($node, <<<EOF
 // line 1
-public function getfoo(\$_foo = null)
+public function getfoo(\$_foo = null, \$_bar = "Foo")
 {
     \$context = \$this->env->mergeGlobals(array(
         "foo" => \$_foo,
+        "bar" => \$_bar,
     ));
 
     \$blocks = array();
diff --git a/core/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php b/core/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
index a55d98e..d35740d 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
+++ b/core/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
@@ -13,7 +13,6 @@ class Twig_Tests_NodeVisitor_OptimizerTest extends PHPUnit_Framework_TestCase
     public function testRenderBlockOptimizer()
     {
         $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
-        $env->addExtension(new Twig_Extension_Optimizer());
 
         $stream = $env->parse($env->tokenize('{{ block("foo") }}', 'index'));
 
@@ -26,7 +25,6 @@ public function testRenderBlockOptimizer()
     public function testRenderParentBlockOptimizer()
     {
         $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
-        $env->addExtension(new Twig_Extension_Optimizer());
 
         $stream = $env->parse($env->tokenize('{% extends "foo" %}{% block content %}{{ parent() }}{% endblock %}', 'index'));
 
@@ -43,7 +41,6 @@ public function testRenderVariableBlockOptimizer()
         }
 
         $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
-        $env->addExtension(new Twig_Extension_Optimizer());
         $stream = $env->parse($env->tokenize('{{ block(name|lower) }}', 'index'));
 
         $node = $stream->getNode('body')->getNode(0)->getNode(1);
@@ -58,7 +55,6 @@ public function testRenderVariableBlockOptimizer()
     public function testForOptimizer($template, $expected)
     {
         $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false));
-        $env->addExtension(new Twig_Extension_Optimizer());
 
         $stream = $env->parse($env->tokenize($template, 'index'));
 
diff --git a/core/vendor/twig/twig/test/Twig/Tests/TemplateTest.php b/core/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
index 75103d1..448bdf8 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
+++ b/core/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
@@ -62,6 +62,84 @@ public function getAttributeExceptions()
     }
 
     /**
+     * @dataProvider getGetAttributeWithSandbox
+     */
+    public function testGetAttributeWithSandbox($object, $item, $allowed, $useExt)
+    {
+        $twig = new Twig_Environment();
+        $policy = new Twig_Sandbox_SecurityPolicy(array(), array(), array(/*methid*/), array(/*peop*/), array());
+        $twig->addExtension(new Twig_Extension_Sandbox($policy, !$allowed));
+        $template = new Twig_TemplateTest($twig, $useExt);
+
+        try {
+            $template->getAttribute($object, $item, array(), 'any');
+
+            if (!$allowed) {
+                $this->fail();
+            }
+        } catch (Twig_Sandbox_SecurityError $e) {
+            if ($allowed) {
+                $this->fail();
+            }
+
+            $this->assertContains('is not allowed', $e->getMessage());
+        }
+    }
+
+    public function getGetAttributeWithSandbox()
+    {
+        $tests = array(
+            array(new Twig_TemplatePropertyObject(), 'defined', false, false),
+            array(new Twig_TemplatePropertyObject(), 'defined', true, false),
+            array(new Twig_TemplateMethodObject(), 'defined', false, false),
+            array(new Twig_TemplateMethodObject(), 'defined', true, false),
+        );
+
+        if (function_exists('twig_template_get_attributes')) {
+            foreach (array_slice($tests, 0) as $test) {
+                $test[3] = true;
+                $tests[] = $test;
+            }
+        }
+
+        return $tests;
+    }
+
+    /**
+     * @dataProvider getGetAttributeWithTemplateAsObject
+     */
+    public function testGetAttributeWithTemplateAsObject($useExt)
+    {
+        $template = new Twig_TemplateTest(new Twig_Environment(), $useExt);
+        $template1 = new Twig_TemplateTest(new Twig_Environment(), false);
+
+        $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'string'));
+        $this->assertEquals('some_string', $template->getAttribute($template1, 'string'));
+
+        $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'true'));
+        $this->assertEquals('1', $template->getAttribute($template1, 'true'));
+
+        $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'zero'));
+        $this->assertEquals('0', $template->getAttribute($template1, 'zero'));
+
+        $this->assertNotInstanceof('Twig_Markup', $template->getAttribute($template1, 'empty'));
+        $this->assertSame('', $template->getAttribute($template1, 'empty'));
+    }
+
+    public function getGetAttributeWithTemplateAsObject()
+    {
+        $bools = array(
+            array(false),
+        );
+
+        if (function_exists('twig_template_get_attributes')) {
+            $bools[] = array(true);
+        }
+
+        return $bools;
+    }
+
+    /**
      * @dataProvider getGetAttributeTests
      */
     public function testGetAttribute($defined, $value, $object, $item, $arguments, $type, $useExt = false)
@@ -120,6 +198,7 @@ public function getGetAttributeTests()
             'zero'    => 0,
             'null'    => null,
             '1'       => 1,
+            'bar'     => true,
         );
 
         $objectArray         = new Twig_TemplateArrayAccessObject();
@@ -144,6 +223,7 @@ public function getGetAttributeTests()
             array(true,  1,         1),
             array(true,  1,         1.0),
             array(true,  null,      'null'),
+            array(true,  true,      'bar'),
         );
         $testObjects = array(
             // array(object, type of fetch)
@@ -243,6 +323,26 @@ public function __construct(Twig_Environment $env, $useExtGetAttribute = false)
         Twig_Template::clearCache();
     }
 
+    public function getZero()
+    {
+        return 0;
+    }
+
+    public function getEmpty()
+    {
+        return '';
+    }
+
+    public function getString()
+    {
+        return 'some_string';
+    }
+
+    public function getTrue()
+    {
+        return true;
+    }
+
     public function getTemplateName()
     {
     }
@@ -279,6 +379,7 @@ class Twig_TemplateArrayAccessObject implements ArrayAccess
         'zero'    => 0,
         'null'    => null,
         '1'       => 1,
+        'bar'     => true,
     );
 
     public function offsetExists($name)
@@ -308,6 +409,7 @@ class Twig_TemplateMagicPropertyObject
         'zero'    => 0,
         'null'    => null,
         '1'       => 1,
+        'bar'     => true,
     );
 
     protected $protected = 'protected';
@@ -328,6 +430,7 @@ class Twig_TemplatePropertyObject
     public $defined = 'defined';
     public $zero    = 0;
     public $null    = null;
+    public $bar     = true;
 
     protected $protected = 'protected';
 }
@@ -385,6 +488,11 @@ public function getNull()
         return null;
     }
 
+    public function isBar()
+    {
+        return true;
+    }
+
     protected function getProtected()
     {
         return 'protected';
diff --git a/core/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php b/core/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
index 4edb8c3..fd4ec63 100644
--- a/core/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
+++ b/core/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
@@ -38,4 +38,33 @@ public function testNext()
         }
         $this->assertEquals('1, 2, 3, 4, 5, 6, 7', implode(', ', $repr), '->next() advances the pointer and returns the current token');
     }
+
+    /**
+     * @expectedException Twig_Error_Syntax
+     * @expectedMessage   Unexpected end of template
+     */
+    public function testEndOfTemplateNext()
+    {
+        $stream = new Twig_TokenStream(array(
+            new Twig_Token(Twig_Token::BLOCK_START_TYPE, 1, 1),
+        ));
+        while (!$stream->isEOF()) {
+            $stream->next();
+        }
+    }
+
+    /**
+     * @expectedException Twig_Error_Syntax
+     * @expectedMessage   Unexpected end of template
+     */
+    public function testEndOfTemplateLook()
+    {
+        $stream = new Twig_TokenStream(array(
+            new Twig_Token(Twig_Token::BLOCK_START_TYPE, 1, 1),
+        ));
+        while (!$stream->isEOF()) {
+            $stream->look();
+            $stream->next();
+        }
+    }
 }
