diff --git a/core/includes/common.inc b/core/includes/common.inc
index d0e9a2f..065eaa9 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -3,6 +3,7 @@
 use Drupal\Component\Utility\NestedArray;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\Yaml\Yaml;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Database\Database;
 use Drupal\Core\Template\Attribute;
@@ -6522,7 +6523,9 @@ function drupal_array_nested_key_exists(array $array, array $parents) {
  * Parses Drupal module and theme .info files.
  *
  * Info files are NOT for placing arbitrary theme and module-specific settings.
- * Use variable_get() and variable_set() for that.
+ * Use variable_get() and variable_set() for that. Info files are formatted as
+ * YAML. If a key called "version" is set to "VERSION" in any info file, the PHP
+ * constant of the same name will be substituted into the resulting data.
  *
  * Information stored in a module .info file:
  * - name: The real name of the module for display purposes.
@@ -6537,11 +6540,11 @@ function drupal_array_nested_key_exists(array $array, array $parents) {
  * - description: Brief description.
  * - screenshot: Path to screenshot relative to the theme's .info file.
  * - engine: Theme engine; typically phptemplate.
- * - base: Name of a base theme, if applicable; e.g., base = zen.
- * - regions: Listed regions; e.g., region[left] = Left sidebar.
- * - features: Features available; e.g., features[] = logo.
- * - stylesheets: Theme stylesheets; e.g., stylesheets[all][] = my-style.css.
- * - scripts: Theme scripts; e.g., scripts[] = my-script.js.
+ * - base: Name of a base theme, if applicable
+ * - regions: Listed regions
+ * - features: Features available
+ * - stylesheets: Theme stylesheets
+ * - scripts: Theme scripts
  *
  * See bartik.info for an example of a theme .info file.
  *
@@ -6551,7 +6554,7 @@ function drupal_array_nested_key_exists(array $array, array $parents) {
  * @return
  *   The info array.
  *
- * @see drupal_parse_info_format()
+ * @see http://yaml.org/
  */
 function drupal_parse_info_file($filename) {
   $info = &drupal_static(__FUNCTION__, array());
@@ -6561,105 +6564,13 @@ function drupal_parse_info_file($filename) {
       $info[$filename] = array();
     }
     else {
-      $data = file_get_contents($filename);
-      $info[$filename] = drupal_parse_info_format($data);
-    }
-  }
-  return $info[$filename];
-}
-
-/**
- * Parses data in Drupal's .info format.
- *
- * Data should be in an .ini-like format to specify values. White-space
- * generally doesn't matter, except inside values:
- * @code
- *   key = value
- *   key = "value"
- *   key = 'value'
- *   key = "multi-line
- *   value"
- *   key = 'multi-line
- *   value'
- *   key
- *   =
- *   'value'
- * @endcode
- *
- * Arrays are created using a HTTP GET alike syntax:
- * @code
- *   key[] = "numeric array"
- *   key[index] = "associative array"
- *   key[index][] = "nested numeric array"
- *   key[index][index] = "nested associative array"
- * @endcode
- *
- * PHP constants are substituted in, but only when used as the entire value.
- * Comments should start with a semi-colon at the beginning of a line.
- *
- * @param $data
- *   A string to parse.
- *
- * @return
- *   The info array.
- *
- * @see drupal_parse_info_file()
- */
-function drupal_parse_info_format($data) {
-  $info = array();
-  $constants = get_defined_constants();
-
-  if (preg_match_all('
-    @^\s*                           # Start at the beginning of a line, ignoring leading whitespace
-    ((?:
-      [^=;\[\]]|                    # Key names cannot contain equal signs, semi-colons or square brackets,
-      \[[^\[\]]*\]                  # unless they are balanced and not nested
-    )+?)
-    \s*=\s*                         # Key/value pairs are separated by equal signs (ignoring white-space)
-    (?:
-      ("(?:[^"]|(?<=\\\\)")*")|     # Double-quoted string, which may contain slash-escaped quotes/slashes
-      (\'(?:[^\']|(?<=\\\\)\')*\')| # Single-quoted string, which may contain slash-escaped quotes/slashes
-      ([^\r\n]*?)                   # Non-quoted string
-    )\s*$                           # Stop at the next end of a line, ignoring trailing whitespace
-    @msx', $data, $matches, PREG_SET_ORDER)) {
-    foreach ($matches as $match) {
-      // Fetch the key and value string.
-      $i = 0;
-      foreach (array('key', 'value1', 'value2', 'value3') as $var) {
-        $$var = isset($match[++$i]) ? $match[$i] : '';
-      }
-      $value = stripslashes(substr($value1, 1, -1)) . stripslashes(substr($value2, 1, -1)) . $value3;
-
-      // Parse array syntax.
-      $keys = preg_split('/\]?\[/', rtrim($key, ']'));
-      $last = array_pop($keys);
-      $parent = &$info;
-
-      // Create nested arrays.
-      foreach ($keys as $key) {
-        if ($key == '') {
-          $key = count($parent);
-        }
-        if (!isset($parent[$key]) || !is_array($parent[$key])) {
-          $parent[$key] = array();
-        }
-        $parent = &$parent[$key];
+      $info[$filename] = Yaml::parse($filename);
+      if (isset($info[$filename]['version']) && $info[$filename]['version'] == 'VERSION') {
+        $info[$filename]['version'] = VERSION;
       }
-
-      // Handle PHP constants.
-      if (isset($constants[$value])) {
-        $value = $constants[$value];
-      }
-
-      // Insert actual value.
-      if ($last == '') {
-        $last = count($parent);
-      }
-      $parent[$last] = $value;
     }
   }
-
-  return $info;
+  return $info[$filename];
 }
 
 /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/ParseInfoFileUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/ParseInfoFileUnitTest.php
index e6041d8..f8b8a8d 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Common/ParseInfoFileUnitTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Common/ParseInfoFileUnitTest.php
@@ -27,7 +27,7 @@ class ParseInfoFileUnitTest extends UnitTestBase {
   function testParseInfoFile() {
     $info_values = drupal_parse_info_file(drupal_get_path('module', 'system') . '/tests/common_test_info.txt');
     $this->assertEqual($info_values['simple_string'], 'A simple string', t('Simple string value was parsed correctly.'), t('System'));
-    $this->assertEqual($info_values['simple_constant'], WATCHDOG_INFO, t('Constant value was parsed correctly.'), t('System'));
+    $this->assertEqual($info_values['version'], VERSION, t('VERSION value was parsed correctly.'), t('System'));
     $this->assertEqual($info_values['double_colon'], 'dummyClassName::', t('Value containing double-colon was parsed correctly.'), t('System'));
   }
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/InfoFileParserUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/System/InfoFileParserUnitTest.php
index 05f36da..d28a111 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/InfoFileParserUnitTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/InfoFileParserUnitTest.php
@@ -23,17 +23,22 @@ class InfoFileParserUnitTest extends UnitTestBase {
    */
   function testDrupalParseInfoFormat() {
     $config = '
-simple = Value
-quoted = " Value"
-multiline = "Value
+simple: Value
+quoted: " Value"
+multiline: "Value
   Value"
-array[] = Value1
-array[] = Value2
-array_assoc[a] = Value1
-array_assoc[b] = Value2
-array_deep[][][] = Value
-array_deep_assoc[a][b][c] = Value
-array_space[a b] = Value';
+array:
+  - Value1
+  - Value2
+array_assoc:
+  a: Value1
+  b: Value2
+array_deep_assoc
+  a:
+    b:
+      c: Value
+array_space:
+  a b: Value';
 
     $expected = array(
       'simple' => 'Value',
@@ -47,13 +52,6 @@ array_space[a b] = Value';
         'a' => 'Value1',
         'b' => 'Value2',
       ),
-      'array_deep' => array(
-        0 => array(
-          0 => array(
-            0 => 'Value',
-          ),
-        ),
-      ),
       'array_deep_assoc' => array(
         'a' => array(
           'b' => array(
diff --git a/core/modules/update/tests/aaa_update_test.tar.gz b/core/modules/update/tests/aaa_update_test.tar.gz
index 34f96c87f99df3390ad49a469f372a84eec8420a..050d5220a44c1762fc73c11a5c3520efaf356834 100644
GIT binary patch
literal 346
zcmV-g0j2&QiwFRd<X}($1MSq^PQox02XL<Y6z7hFi_vavXN-xG_y+1VX|@g)*+;fE
z>f2iw7(;?wAQ0pKchj}&`gL|{jG6m3H_pzT?cH>A2AuO$DcY2JD0wW0a*KqJLMyHl
z9TOKyNIoKUj>YWry)#`{O7>>W!qoktexX}Y{4maTA7AAkVfNy`SC7iNXil9YoQIb3
zaQsCoNW?thLdPNv@sEXw)rk0SZ19+W9{<`@_Lj!8*^FK`VW)N2$1Jyf)|IU*n>xIH
z@@?C6j;bd2D@#Sw(eRV(TGk(x^&%Rx)?}|{5ypHTnpoC!p>`9!vt^m*HVo%FZ`rjs
z4jaeve~9mCa~#coo`m~fNtI}=!*j@gnF{3pCEVS&%a*a}WWs1d4@J4M>xV~QRUhBe
seVgFBOCp?x^L-S$PLas~000000000000000007ta35H9l+yE#501u_D0{{R3

literal 384
zcmV-`0e}7<iwFpq?UhXc17TrdUv+R~VRU6*bY*jNE_7jX0PRz;PQx$|?d-3(p;Ltt
zJBeLdKv0PetUxD(Dyw!{izcxW2bI6a#sr}V+MyIwk++=hY~R`M>2c2IwHDmSxsjC#
zdj|lv7*gsZ^ASghj~+cj62d5EF^g=SBrzHG=pi1{MqL?R+L5`XVB0x+EKRrUHy>%@
zk$|`KZ{>l?(_-Hljt`b3-|8R7)ap+Y8Z$<z(?7B`OXW{|a2Ni${%6p?5o7pD_LFBI
z0f7kPQAluz36Rk^ipLQFQ7T!%bfck<a-K=JfXQS6v$qc5Iv^pdMX9t=MQ(TRYORaX
zKvsx)Eg>yR@Z*|_yQA`DfHYq`@ull{?@MS=lrB9DHYinVSv@@3to>l$2CbA3(ha=7
zolVhSlY0c%<$urXelvFYpWyhz|IDtP{~7K4{~I{J)GLipI2a%pz?CzYTU^&!_VU@S
e@BVBoZrLz(71*O;=dunRjuo$RU{~V+3;+PE^|;pn

