]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[trac5495] regen flex/bison
authorFrancis Dupont <fdupont@isc.org>
Tue, 2 Jan 2018 02:11:19 +0000 (02:11 +0000)
committerFrancis Dupont <fdupont@isc.org>
Tue, 2 Jan 2018 02:11:19 +0000 (02:11 +0000)
14 files changed:
src/bin/agent/agent_lexer.cc
src/bin/agent/agent_parser.cc
src/bin/agent/agent_parser.h
src/bin/agent/agent_parser.yy
src/bin/agent/location.hh
src/bin/agent/position.hh
src/bin/agent/stack.hh
src/bin/d2/d2_lexer.cc
src/bin/d2/d2_parser.cc
src/bin/d2/d2_parser.h
src/bin/d2/d2_parser.yy
src/bin/d2/location.hh
src/bin/d2/position.hh
src/bin/d2/stack.hh

index ee60cf6fb2ebd09279d0d25d8942a52a07c88a48..3a386d84a7ced708d298d37fb404477d05aeb114 100644 (file)
@@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg  );
 /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
        (yy_c_buf_p) = yy_cp;
 /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
-#define YY_NUM_RULES 56
-#define YY_END_OF_BUFFER 57
+#define YY_NUM_RULES 58
+#define YY_END_OF_BUFFER 59
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -700,42 +700,43 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static const flex_int16_t yy_accept[302] =
+static const flex_int16_t yy_accept[320] =
     {   0,
-       49,   49,    0,    0,    0,    0,    0,    0,    0,    0,
-       57,   55,   10,   11,   55,    1,   49,   46,   49,   49,
-       55,   48,   47,   55,   55,   55,   55,   55,   42,   43,
-       55,   55,   55,   44,   45,    5,    5,    5,   55,   55,
-       55,   10,   11,    0,    0,   38,    0,    0,    0,    0,
+       51,   51,    0,    0,    0,    0,    0,    0,    0,    0,
+       59,   57,   10,   11,   57,    1,   51,   48,   51,   51,
+       57,   50,   49,   57,   57,   57,   57,   57,   44,   45,
+       57,   57,   57,   46,   47,    5,    5,    5,   57,   57,
+       57,   10,   11,    0,    0,   40,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    1,   49,   49,    0,   48,   49,    3,    2,    6,
-        0,   49,    0,    0,    0,    0,    0,    0,    4,    0,
-        0,    9,    0,   39,    0,    0,    0,    0,    0,   41,
+        0,    1,   51,   51,    0,   50,   51,    3,    2,    6,
+        0,   51,    0,    0,    0,    0,    0,    0,    4,    0,
+        0,    9,    0,   41,    0,    0,    0,    0,    0,   43,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
-        0,    0,    0,    0,    0,    0,    0,    2,    0,    0,
-        0,    0,    0,    0,    0,    8,    0,    0,    0,    0,
-        0,   40,    0,    0,   18,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    2,    0,
+        0,    0,    0,    0,    0,    0,    8,    0,    0,    0,
+        0,    0,   42,    0,    0,    0,   20,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       54,   52,    0,   51,   50,    0,    0,    0,    0,    0,
+        0,    0,    0,   56,   54,    0,   53,   52,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,   53,   50,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   27,    0,
-        0,    0,    0,   21,    0,    0,    0,   35,   36,    0,
-
-        0,    0,    0,   16,   17,   30,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    7,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   32,
-       29,    0,    0,    0,    0,    0,    0,   25,    0,    0,
-        0,    0,    0,   23,   26,   31,    0,    0,    0,    0,
-        0,    0,   37,    0,    0,    0,    0,    0,    0,    0,
-       34,    0,    0,    0,    0,    0,    0,   13,   14,    0,
-        0,    0,    0,    0,    0,   33,    0,    0,   24,    0,
-        0,    0,    0,    0,    0,   19,   20,    0,    0,    0,
-        0,   12,    0,    0,    0,    0,    0,   28,   15,   22,
-
-        0
+        0,    0,   55,   52,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   29,    0,    0,    0,    0,   23,
+
+        0,    0,    0,    0,   37,   38,    0,    0,    0,    0,
+        0,   18,   19,   32,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    7,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   34,
+       31,    0,    0,    0,    0,    0,    0,    0,   27,   16,
+        0,    0,    0,    0,    0,   25,   28,   33,    0,    0,
+        0,    0,    0,    0,    0,   39,    0,    0,    0,    0,
+        0,    0,    0,   36,    0,    0,    0,    0,    0,    0,
+        0,   13,   14,    0,    0,    0,    0,    0,    0,    0,
+       35,    0,    0,   26,    0,    0,    0,    0,    0,    0,
+
+        0,   21,   22,    0,    0,    0,    0,    0,   15,   12,
+        0,    0,    0,    0,    0,   30,   17,   24,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -781,85 +782,89 @@ static const YY_CHAR yy_meta[63] =
         3,    3
     } ;
 
-static const flex_int16_t yy_base[314] =
+static const flex_int16_t yy_base[332] =
     {   0,
         0,    0,   61,   64,   67,    0,   65,   69,   49,   66,
-      277, 1955,   86,  269,  129,    0,  124, 1955,  172,  129,
-       84,  178, 1955,  250,   91,   76,   71,   89, 1955, 1955,
-       96,   91,   95, 1955, 1955, 1955,   87,  250,  196,    0,
-      222,  119,  236,  114,  199, 1955,  205,  215,  222,  209,
+      277, 2102,   86,  269,  129,    0,  124, 2102,  172,  129,
+       84,  178, 2102,  250,   91,   76,   71,   89, 2102, 2102,
+       96,   91,   95, 2102, 2102, 2102,   87,  250,  196,    0,
+      222,  119,  236,  114,  199, 2102,  205,  215,  222,  209,
       235,  252,  273,  279,  287,  297,  304,  310,  317,  323,
-      345,    0,  345,  367,  361,  374,  382, 1955,    0, 1955,
-      144,  215,  128,  134,  119,  171,  185,  135, 1955,  172,
-      204, 1955,  161, 1955,  379,  401,  409,  424,  203,  436,
-      458,  444,  451,  486,  501,  460,  507,  516,  525,  531,
-
-      537,  543,  551,  567,  578,  587,  595,    0,  172,  199,
-      209,  212,  221,  219,  149, 1955,    0,  602,  608,  615,
-      167, 1955,  647,  623, 1955,  645,  630,  690,  696,  702,
-      710,  716,  726,  732,  746,  756,  767,  776,  783,  242,
-     1955, 1955,  275, 1955, 1955,  109,    0,  794,  811,  802,
-      835,  818,  837,  863,  881,  887,  893,  899,  905,  911,
-      917,  929,  942,  948,  959,  965,  973, 1955, 1955,  122,
-        0,  979,  985, 1000, 1015, 1022, 1059, 1036, 1030, 1042,
-     1057, 1087, 1102, 1108, 1114, 1122, 1128, 1138, 1955, 1144,
-     1163, 1175, 1181, 1955,  109,    0, 1191, 1955, 1955, 1200,
-
-     1211, 1217, 1226, 1955, 1955, 1955, 1239, 1256, 1269, 1275,
-     1282, 1291, 1297, 1310, 1321, 1336, 1347, 1955, 1358, 1364,
-     1371, 1377, 1384, 1394, 1401, 1407, 1414, 1421, 1429, 1955,
-     1955, 1442, 1456, 1464, 1470, 1477, 1483, 1955, 1494, 1500,
-     1508, 1525, 1531, 1955, 1955, 1955, 1538, 1548, 1556, 1562,
-     1568, 1575, 1955, 1586, 1593, 1603, 1610, 1623, 1629, 1641,
-     1955, 1647, 1659, 1665, 1677, 1671, 1684, 1955, 1955, 1696,
-     1702, 1712, 1722, 1732, 1738, 1955, 1749, 1757, 1955, 1768,
-     1774, 1785, 1792, 1798, 1804, 1955, 1955, 1810, 1816, 1822,
-     1835, 1955, 1846, 1857, 1866, 1872, 1881, 1955, 1955, 1955,
-
-     1955, 1916, 1921, 1926, 1931, 1936, 1941, 1946, 1949,  132,
-      128,  121,  111
+      345,    0,  345,  367,  361,  374,  387, 2102,    0, 2102,
+      144,  215,  128,  134,  119,  171,  185,  135, 2102,  172,
+      204, 2102,  161, 2102,  392,  405,  416,  422,  203,  435,
+      457,  457,  484,  502,  508,  514,  520,  526,  533,  544,
+
+      550,  556,  563,  572,  581,  591,  598,  608,    0,  172,
+      199,  209,  212,  221,  219,  149, 2102,    0,  618,  626,
+      633,  167, 2102,  665,  661,  639, 2102,  696,  710,  716,
+      722,  731,  737,  747,  753,  762,  773,  783,  792,  800,
+      810,  827,  242, 2102, 2102,  275, 2102, 2102,  109,    0,
+      835,  847,  854,  887,  873,  884,  915,  930,  937,  950,
+      960,  967,  973,  985,  991,  997, 1008, 1016, 1022, 1034,
+     1043, 1052, 2102, 2102,  122,    0, 1065, 1071, 1078, 1087,
+     1095, 1132, 1101, 1109, 1117, 1131, 1161, 1175, 1181, 1187,
+     1196, 1202, 1211, 1217, 2102, 1223, 1232, 1241, 1258, 2102,
+
+     1279,  109,    0, 1288, 2102, 2102, 1294, 1302, 1314, 1324,
+     1332, 2102, 2102, 2102, 1349, 1355, 1374, 1380, 1386, 1392,
+     1398, 1410, 1416, 1429, 1435, 1447, 2102, 1454, 1460, 1466,
+     1472, 1485, 1491, 1503, 1509, 1515, 1521, 1527, 1534, 2102,
+     2102, 1540, 1551, 1564, 1570, 1576, 1586, 1594, 2102, 2102,
+     1600, 1606, 1612, 1630, 1636, 2102, 2102, 2102, 1643, 1654,
+     1661, 1667, 1673, 1680, 1698, 2102, 1708, 1691, 1715, 1721,
+     1728, 1735, 1743, 2102, 1751, 1759, 1770, 1778, 1786, 1800,
+     1813, 2102, 2102, 1821, 1827, 1835, 1841, 1851, 1857, 1863,
+     2102, 1878, 1887, 2102, 1893, 1899, 1913, 1923, 1934, 1940,
+
+     1948, 2102, 2102, 1954, 1960, 1971, 1978, 1990, 2102, 2102,
+     1998, 2006, 2013, 2021, 2028, 2102, 2102, 2102, 2102, 2063,
+     2068, 2073, 2078, 2083, 2088, 2093, 2096,  132,  128,  121,
+      111
     } ;
 
-static const flex_int16_t yy_def[314] =
+static const flex_int16_t yy_def[332] =
     {   0,
-      301,    1,  302,  302,    1,    5,    5,    5,    5,    5,
-      301,  301,  301,  301,  303,  304,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  305,
-      301,  301,  301,  306,  303,  301,  303,  303,  303,  307,
-      303,  303,  303,  303,  303,  303,  303,  303,  303,  303,
-      303,  304,  301,  301,  301,  301,  301,  301,  308,  301,
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-      305,  301,  306,  301,  301,  303,  303,  303,  309,  303,
-      307,  303,  303,  303,  303,  303,  303,  303,  303,  303,
-
-      303,  303,  303,  303,  303,  303,  303,  308,  301,  301,
-      301,  301,  301,  301,  301,  301,  310,  303,  303,  303,
-      309,  301,  307,  303,  301,  303,  303,  303,  303,  303,
-      303,  303,  303,  303,  303,  303,  303,  303,  303,  301,
-      301,  301,  301,  301,  301,  301,  311,  303,  303,  303,
-      307,  303,  303,  303,  303,  303,  303,  303,  303,  303,
-      303,  303,  303,  303,  303,  303,  303,  301,  301,  301,
-      312,  303,  303,  303,  303,  303,  307,  303,  303,  303,
-      303,  303,  303,  303,  303,  303,  303,  303,  301,  303,
-      303,  303,  303,  301,  301,  313,  303,  301,  301,  303,
-
-      303,  303,  303,  301,  301,  301,  303,  303,  303,  303,
-      303,  303,  303,  303,  303,  303,  303,  301,  303,  303,
-      303,  303,  303,  303,  303,  303,  303,  303,  303,  301,
-      301,  303,  303,  303,  303,  303,  303,  301,  303,  303,
-      303,  303,  303,  301,  301,  301,  303,  303,  303,  303,
-      303,  303,  301,  303,  303,  303,  303,  303,  303,  303,
-      301,  303,  303,  303,  303,  303,  303,  301,  301,  303,
-      303,  303,  303,  303,  303,  301,  303,  303,  301,  303,
-      303,  303,  303,  303,  303,  301,  301,  303,  303,  303,
-      303,  301,  303,  303,  303,  303,  303,  301,  301,  301,
-
-        0,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-      301,  301,  301
+      319,    1,  320,  320,    1,    5,    5,    5,    5,    5,
+      319,  319,  319,  319,  321,  322,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  323,
+      319,  319,  319,  324,  321,  319,  321,  321,  321,  325,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
+      321,  322,  319,  319,  319,  319,  319,  319,  326,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      323,  319,  324,  319,  319,  321,  321,  321,  327,  321,
+      325,  321,  321,  321,  321,  321,  321,  321,  321,  321,
+
+      321,  321,  321,  321,  321,  321,  321,  321,  326,  319,
+      319,  319,  319,  319,  319,  319,  319,  328,  321,  321,
+      321,  327,  319,  325,  321,  321,  319,  321,  321,  321,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
+      321,  321,  319,  319,  319,  319,  319,  319,  319,  329,
+      321,  321,  321,  325,  321,  321,  321,  321,  321,  321,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
+      321,  321,  319,  319,  319,  330,  321,  321,  321,  321,
+      321,  325,  321,  321,  321,  321,  321,  321,  321,  321,
+      321,  321,  321,  321,  319,  321,  321,  321,  321,  319,
+
+      321,  319,  331,  321,  319,  319,  321,  321,  321,  321,
+      321,  319,  319,  319,  321,  321,  321,  321,  321,  321,
+      321,  321,  321,  321,  321,  321,  319,  321,  321,  321,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  319,
+      319,  321,  321,  321,  321,  321,  321,  321,  319,  319,
+      321,  321,  321,  321,  321,  319,  319,  319,  321,  321,
+      321,  321,  321,  321,  321,  319,  321,  321,  321,  321,
+      321,  321,  321,  319,  321,  321,  321,  321,  321,  321,
+      321,  319,  319,  321,  321,  321,  321,  321,  321,  321,
+      319,  321,  321,  319,  321,  321,  321,  321,  321,  321,
+
+      321,  319,  319,  321,  321,  321,  321,  321,  319,  319,
+      321,  321,  321,  321,  321,  319,  319,  319,    0,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319
     } ;
 
-static const flex_int16_t yy_nxt[2018] =
+static const flex_int16_t yy_nxt[2165] =
     {   0,
        12,   13,   14,   13,   12,   15,   16,   12,   17,   18,
        19,   20,   21,   22,   22,   22,   22,   23,   24,   12,
@@ -874,218 +879,234 @@ static const flex_int16_t yy_nxt[2018] =
 
        12,   71,   12,   74,   72,   72,   72,   72,   12,   12,
        12,   12,   39,   73,   12,   83,   12,   73,   75,   84,
-       42,   12,   42,   74,   75,  196,   74,   12,   12,   44,
-       44,   44,  171,   76,   46,   63,  147,   64,   64,   64,
+       42,   12,   42,   74,   75,  203,   74,   12,   12,   44,
+       44,   44,  176,   76,   46,   63,  150,   64,   64,   64,
        64,   75,   67,   67,   67,   67,   77,   78,   85,   65,
-      218,  111,   47,   48,   65,  109,   49,   72,   72,   72,
-       72,  110,  195,   50,  170,   65,   84,  111,   51,   52,
-       65,   53,  122,   54,  111,  109,   55,   56,   57,   58,
-       59,  110,   60,   63,   61,   66,   66,   66,   66,   63,
-      114,   66,   66,   66,   66,   85,  146,   65,  109,   44,
-
-       44,   44,  140,   65,   46,   44,   44,   44,  122,  116,
-       46,  115,  110,   65,   90,   44,   44,   44,  112,   65,
-       46,   45,   44,   44,   44,  140,  141,   46,   72,   72,
-       72,   72,  113,   50,  142,   44,   44,   44,   43,   50,
-       46,   82,  140,   45,  142,   80,  141,   45,  141,   50,
-      142,   45,   44,   44,   44,   86,   50,   46,   45,   87,
-      145,   45,   79,   45,   91,  143,   93,  168,  144,   50,
-       70,   43,   88,   44,   44,   44,  301,  301,   46,   44,
-       44,   44,  301,  168,   46,   92,   50,   44,   44,   44,
-      301,  301,   46,   94,  301,  301,   95,   44,   44,   44,
-
-      168,  301,   46,  301,   44,   44,   44,   50,  301,   46,
-       44,   44,   44,   50,  301,   46,  169,   44,   44,   44,
-       96,   50,   46,   44,   44,   44,  301,  301,   46,   97,
-      301,   50,   99,   98,  101,  301,  301,  100,   50,  301,
-      301,  102,  301,  301,   50,   44,   44,   44,  301,  301,
-       46,   50,  301,  301,  104,  301,  301,   50,   67,   67,
-       67,   67,  301,  301,  105,  103,  301,  301,  301,   71,
-       65,   71,  301,  106,   72,   72,   72,   72,   63,   50,
-       64,   64,   64,   64,   83,   63,   65,   66,   66,   66,
-       66,   83,   65,  301,  107,   67,   67,   67,   67,   65,
-
-      301,   44,   44,   44,  301,  301,   46,   65,   65,   44,
-       44,   44,  301,   83,   46,   65,  301,   83,  301,  301,
-      301,   83,  301,   65,   44,   44,   44,  301,   83,   46,
-      301,   83,  301,   83,  117,   50,   44,   44,   44,  301,
-      301,   46,  301,   50,   44,   44,   44,  301,  119,   46,
-      118,   44,   44,   44,  301,  301,  125,  301,   50,  301,
-       44,   44,   44,  301,  301,   46,  301,  120,  301,  301,
-       50,  123,  123,  123,  123,  301,  301,  301,   50,  123,
-      123,  123,  123,  123,  123,   50,   44,   44,   44,  301,
-      301,   46,  301,  124,   50,  123,  123,  123,  123,  123,
-
-      123,   44,   44,   44,  301,  301,   46,   44,   44,   44,
-      301,  301,   46,  301,  301,  128,   44,   44,   44,  301,
-       50,   46,  301,  301,  126,   44,   44,   44,  301,  301,
-       46,   44,   44,   44,  301,   50,   46,   44,   44,   44,
-      127,   50,   46,   44,   44,   44,  301,  301,   46,  301,
-       50,   44,   44,   44,  301,  301,   46,  129,  301,   50,
-      301,  301,  301,  131,  301,   50,  301,   44,   44,   44,
-      130,   50,   46,  301,  132,  301,  301,   50,   44,   44,
-       44,  301,  301,   46,  301,   50,  301,   44,   44,   44,
-      301,  134,   46,  301,  133,   44,   44,   44,  301,  301,
-
-       46,   50,   44,   44,   44,  135,  301,   46,   44,   44,
-       44,  301,   50,   46,  301,   44,   44,   44,  301,  136,
-       46,   50,  301,   44,   44,   44,  138,  301,   46,   50,
-       44,   44,   44,  301,  137,   46,   50,  301,  301,  301,
-      139,  301,   50,  301,  301,   44,   44,   44,  301,   50,
-       46,  301,  301,  301,  301,  301,  148,   50,  150,  149,
-      151,  151,  151,  151,   50,  301,  301,  301,  151,  151,
-      151,  151,  151,  151,  301,  301,  301,  152,  301,   50,
-      301,  154,  301,  301,  151,  151,  151,  151,  151,  151,
-       44,   44,   44,  301,  301,   46,   44,   44,   44,  301,
-
-      153,   46,   44,   44,   44,  301,  301,   46,  301,  301,
-       44,   44,   44,  301,  301,   46,   44,   44,   44,  301,
-      301,   46,  301,  301,   50,  301,   44,   44,   44,  301,
-       50,   46,   44,   44,   44,  301,   50,   46,  301,  301,
-      301,  301,  156,  155,   50,  301,   44,   44,   44,  301,
-       50,   46,  301,  157,  301,  301,   44,   44,   44,  159,
-       50,   46,  158,  301,  301,  301,   50,   44,   44,   44,
-      301,  301,   46,  162,  301,  301,   44,   44,   44,  160,
-       50,   46,  161,   44,   44,   44,  301,  301,   46,  301,
-       50,  301,  301,  164,   44,   44,   44,  163,  301,   46,
-
-      301,   50,   44,   44,   44,  301,  301,   46,  165,  301,
-       50,   44,   44,   44,  301,  301,   46,   50,   44,   44,
-       44,  301,  166,   46,  301,  301,  173,  174,   50,  301,
-      301,  301,  301,  301,  301,  175,   50,   44,   44,   44,
-      167,  301,   46,  301,  301,   50,  172,  176,  177,  177,
-      177,  177,   50,  301,  301,  301,  177,  177,  177,  177,
-      177,  177,  301,   44,   44,   44,  301,  301,   46,  301,
-      178,   50,  177,  177,  177,  177,  177,  177,  180,  181,
-      179,   44,   44,   44,  301,  301,   46,   44,   44,   44,
-      301,  301,   46,   44,   44,   44,  301,   50,   46,   44,
-
-       44,   44,  301,  184,   46,   44,   44,   44,  301,  301,
-       46,   44,   44,   44,  301,   50,   46,   44,   44,   44,
-      301,   50,   46,  301,  301,  182,  301,   50,  301,   44,
-       44,   44,  301,   50,  189,  301,  185,  301,  301,   50,
-      183,  301,   44,   44,   44,   50,  186,   46,   44,   44,
-       44,   50,  301,   46,  301,  301,  187,  301,  188,   44,
-       44,   44,  301,   50,   46,   44,   44,   44,  301,  301,
-       46,  301,  301,   44,   44,   44,   50,  301,  194,   44,
-       44,   44,   50,  301,   46,   44,   44,   44,  301,  301,
-      198,  301,  301,   50,  301,  301,  191,  190,  301,   50,
-
-       44,   44,   44,  301,  301,  199,  193,   50,  301,  301,
-      301,  192,  301,   50,  301,   44,   44,   44,  301,   50,
-       46,  301,   44,   44,   44,  301,  301,   46,  301,  197,
-       44,   44,   44,  301,   50,   46,   44,   44,   44,  301,
-      301,   46,   44,   44,   44,  301,  301,  204,  301,   50,
-      301,  301,  301,  301,  301,  200,   50,   44,   44,   44,
-      301,  301,  205,  301,   50,  301,  301,  301,  301,  301,
-       50,  201,   45,   45,   45,   45,   50,  203,  301,  301,
-       45,   45,   45,   45,   45,   45,  202,   44,   44,   44,
-      301,   50,  206,  301,  301,  301,   45,   45,   45,   45,
-
-       45,   45,   44,   44,   44,  301,  301,   46,   44,   44,
-       44,  301,  207,   46,   44,   44,   44,  301,  301,   46,
-      301,   50,   44,   44,   44,  301,  301,   46,   44,   44,
-       44,  301,  301,   46,  301,  301,   50,  301,   44,   44,
-       44,  301,   50,   46,   44,   44,   44,  301,   50,   46,
-      301,  301,  208,  301,  301,  301,   50,  301,  301,  209,
-      301,  301,   50,   44,   44,   44,  210,  301,   46,  301,
-      301,  301,   50,  301,  211,   44,   44,   44,   50,  301,
-       46,   44,   44,   44,  301,  301,   46,  212,  301,  301,
-      213,   44,   44,   44,  301,  301,   46,   50,  214,  301,
-
-       44,   44,   44,  301,  215,   46,  301,  301,  301,   50,
-      301,   44,   44,   44,  301,   50,   46,   44,   44,   44,
-      216,  301,   46,  301,  301,   50,   44,   44,   44,  301,
-      301,   46,  301,  301,   50,  217,  301,  301,  219,   44,
-       44,   44,  301,  301,   46,   50,  301,  301,  301,  220,
-      301,   50,  301,  301,  221,  301,   44,   44,   44,  301,
-       50,   46,  301,  301,  222,  301,  301,  223,  301,   44,
-       44,   44,  301,   50,   46,   44,   44,   44,  301,  301,
-       46,  301,   44,   44,   44,  301,  224,   46,  301,  301,
-       50,   44,   44,   44,  301,  301,   46,   44,   44,   44,
-
-      301,  301,  230,   50,  301,  301,  225,  301,  301,   50,
-       44,   44,   44,  301,  301,  231,   50,  301,  301,  226,
-      301,   44,   44,   44,  301,   50,   46,  301,  301,  301,
-      301,   50,  229,  227,  301,  228,   44,   44,   44,  301,
-      301,   46,  301,  301,   50,  301,  232,   44,   44,   44,
-      301,  301,   46,  301,  301,   50,  301,  235,   44,   44,
-       44,  301,  301,   46,   44,   44,   44,  301,  236,   46,
-       50,   44,   44,   44,  301,  233,  238,   44,   44,   44,
-      301,   50,   46,  301,   44,   44,   44,  239,  301,   46,
-      234,  301,   50,  301,   44,   44,   44,  301,   50,   46,
-
-      301,   44,   44,   44,  301,   50,   46,   44,   44,   44,
-      301,   50,   46,  301,   44,   44,   44,  237,   50,  244,
-      301,   44,   44,   44,  301,  301,  245,  301,   50,   44,
-       44,   44,  301,  301,  246,   50,  301,  301,  301,  241,
-      240,   50,   44,   44,   44,  301,  301,   46,   50,  301,
-      301,  301,  301,  301,  242,   50,   44,   44,   44,  243,
-      301,   46,  301,   50,   44,   44,   44,  301,  301,   46,
-       44,   44,   44,  301,  301,   46,   50,   44,   44,   44,
-      301,  301,   46,   44,   44,   44,  301,  301,  253,  301,
-       50,  301,  247,  301,   44,   44,   44,  248,   50,   46,
-
-       44,   44,   44,  301,   50,   46,  301,  301,   44,   44,
-       44,   50,  301,   46,  252,  301,  301,   50,  301,  250,
-      301,  301,  249,  301,  251,   44,   44,   44,   50,  301,
-       46,   44,   44,   44,   50,  301,   46,  301,   44,   44,
-       44,  255,   50,   46,  301,  301,  256,  254,   44,   44,
-       44,  301,  301,   46,  301,  301,   44,   44,   44,   50,
-      301,  261,   44,   44,   44,   50,  301,   46,   44,   44,
-       44,  301,   50,   46,  301,   44,   44,   44,  301,  257,
-       46,  301,   50,  301,  301,  258,   44,   44,   44,  259,
-       50,   46,  301,   44,   44,   44,   50,  301,   46,  262,
-
-      260,  301,   50,   44,   44,   44,  301,  301,   46,   50,
-       44,   44,   44,  301,  301,  268,  301,  301,  264,  301,
-       50,  301,  301,   44,   44,   44,  263,   50,  269,   44,
-       44,   44,  301,  301,   46,  301,  265,   50,  301,  301,
-      266,   44,   44,   44,   50,  301,   46,   44,   44,   44,
-      301,  301,   46,  301,  301,  267,  301,   50,  301,   44,
-       44,   44,  301,   50,   46,   44,   44,   44,  301,  301,
-       46,   44,   44,   44,  301,   50,  276,   44,   44,   44,
-      301,   50,   46,  270,   44,   44,   44,  301,  301,   46,
-      301,  301,  301,   50,  271,  272,   44,   44,   44,   50,
-
-      301,   46,   44,   44,   44,   50,  274,  279,  301,  301,
-      273,   50,   44,   44,   44,  301,  275,   46,   50,  301,
-      301,  277,   44,   44,   44,  301,  301,   46,  301,  301,
-       50,  301,   44,   44,   44,  301,   50,   46,   44,   44,
-       44,  278,  301,   46,  301,  301,   50,  301,  301,   44,
-       44,   44,  301,  280,   46,  301,   50,   44,   44,   44,
-      301,  301,   46,  281,  301,  301,   50,  301,   44,   44,
-       44,  301,   50,  286,   44,   44,   44,  301,  301,  287,
-      301,  282,  301,   50,  283,   44,   44,   44,  301,  301,
-       46,   50,   44,   44,   44,  301,  301,   46,   44,   44,
-
-       44,  284,   50,   46,   44,   44,   44,  285,   50,   46,
-       44,   44,   44,  301,  301,  292,   44,   44,   44,   50,
-      301,   46,   44,   44,   44,  301,   50,   46,  301,  301,
-      301,  301,   50,  289,  301,   44,   44,   44,   50,  288,
-       46,  301,  301,  290,   50,  301,   44,   44,   44,  301,
-       50,   46,  301,  291,  301,  301,   50,   44,   44,   44,
-      301,  301,   46,  294,  301,  301,   44,   44,   44,   50,
-      293,  298,   44,   44,   44,  301,  301,  299,  301,  301,
-       50,   44,   44,   44,  301,  301,  300,  301,  295,  301,
-      301,   50,  301,  301,  301,  301,  301,  301,  301,  296,
-
-       50,  301,  301,  301,  301,  301,   50,  301,  301,  301,
-      297,  301,  301,  301,  301,   50,   36,   36,   36,   36,
-       36,   45,   45,   45,   45,   45,   62,  301,   62,   62,
-       62,   81,  301,   81,  301,   81,   83,   83,   83,   83,
-       83,   89,   89,   89,   89,   89,  108,  301,  108,  108,
-      108,  121,  121,  121,   11,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301
+      227,  112,   47,   48,   65,  110,   49,   72,   72,   72,
+       72,  111,  202,   50,  175,   65,   84,  112,   51,   52,
+       65,   53,  123,   54,  112,  110,   55,   56,   57,   58,
+       59,  111,   60,   63,   61,   66,   66,   66,   66,   63,
+      115,   66,   66,   66,   66,   85,  149,   65,  110,   44,
+
+       44,   44,  143,   65,   46,   44,   44,   44,  123,  117,
+       46,  116,  111,   65,   90,   44,   44,   44,  113,   65,
+       46,   45,   44,   44,   44,  143,  144,   46,   72,   72,
+       72,   72,  114,   50,  145,   44,   44,   44,   43,   50,
+       46,   82,  143,   45,  145,   80,  144,   45,  144,   50,
+      145,   45,   44,   44,   44,   86,   50,   46,   45,   87,
+      148,   45,   79,   45,   91,  146,   93,  173,  147,   50,
+       70,   43,   88,   44,   44,   44,  319,  319,   46,   44,
+       44,   44,  319,  173,   46,   92,   50,   44,   44,   44,
+      319,  319,   46,   94,  319,  319,   95,   44,   44,   44,
+
+      173,  319,   46,  319,   44,   44,   44,   50,  319,   46,
+       44,   44,   44,   50,  319,   46,  174,   44,   44,   44,
+       96,   50,   46,   44,   44,   44,  319,  319,   46,   97,
+      319,   50,   99,   98,  101,  319,  319,  100,   50,  319,
+      319,  102,  319,  319,   50,   44,   44,   44,  319,  319,
+       46,   50,  319,  319,  104,  319,  319,   50,   67,   67,
+       67,   67,  319,  319,  105,  103,  319,  319,  319,   71,
+       65,   71,  319,  106,   72,   72,   72,   72,   63,   50,
+       64,   64,   64,   64,  319,   63,   65,   66,   66,   66,
+       66,  319,   65,  319,  107,  319,  319,   83,  108,   65,
+
+       67,   67,   67,   67,   83,   44,   44,   44,   65,  319,
+       46,  319,   65,  319,  319,   65,   44,   44,   44,  319,
+      319,   46,   44,   44,   44,  319,   83,   46,   65,  319,
+       83,  319,  319,  319,   83,   44,   44,   44,  319,   50,
+       46,   83,  319,  319,   83,  319,   83,  118,  319,  319,
+       50,  319,  319,  319,  119,  120,   50,   44,   44,   44,
+      319,  319,   46,  319,  319,  121,  319,  319,  319,   50,
+      124,  124,  124,  124,  319,  319,  319,  319,  124,  124,
+      124,  124,  124,  124,   44,   44,   44,  319,  319,  127,
+      319,   50,  319,  319,  124,  124,  124,  124,  124,  124,
+
+      319,  319,   44,   44,   44,  125,  126,   46,   44,   44,
+       44,  319,  319,   46,   44,   44,   44,  319,   50,   46,
+       44,   44,   44,  319,  319,   46,   44,   44,   44,  319,
+      319,   46,  319,   44,   44,   44,   50,  319,   46,  319,
+      128,  319,   50,  319,   44,   44,   44,  129,   50,   46,
+       44,   44,   44,  319,   50,   46,   44,   44,   44,  319,
+       50,   46,  319,   44,   44,   44,  319,   50,   46,  130,
+      131,  133,   44,   44,   44,  319,  319,   46,   50,  319,
+      132,   44,   44,   44,   50,  319,   46,  134,  319,  319,
+       50,   44,   44,   44,  319,  319,   46,   50,   44,   44,
+
+       44,  319,  319,   46,  136,  319,   50,  135,   44,   44,
+       44,  319,  319,   46,  319,   50,  319,  137,   44,   44,
+       44,  319,  319,   46,  138,   50,   44,   44,   44,  319,
+      140,   46,   50,   44,   44,   44,  319,  139,   46,   44,
+       44,   44,   50,  141,   46,  319,  319,  319,  319,  142,
+      319,  319,   50,  319,  319,  319,  319,  319,  319,  319,
+       50,   44,   44,   44,  319,  319,   46,   50,  319,  319,
+      319,  319,  151,   50,  319,  319,  153,  152,  154,  154,
+      154,  154,  319,  319,  319,  319,  154,  154,  154,  154,
+      154,  154,  319,  156,  319,   50,   44,   44,   44,  319,
+
+      319,   46,  154,  154,  154,  154,  154,  154,  319,  155,
+       44,   44,   44,  319,  319,   46,   44,   44,   44,  319,
+      319,   46,   44,   44,   44,  319,  319,   46,  319,  319,
+       50,   44,   44,   44,  319,  319,   46,   44,   44,   44,
+      319,  319,   46,  319,   50,  319,  319,   44,   44,   44,
+       50,  157,   46,   44,   44,   44,   50,  319,   46,  319,
+      319,  158,   44,   44,   44,   50,  319,   46,  160,  159,
+      319,   50,  319,   44,   44,   44,  319,  319,   46,  319,
+      319,   50,  161,   44,   44,   44,  319,   50,   46,  162,
+      163,  319,   44,   44,   44,  319,   50,   46,  319,  319,
+
+       44,   44,   44,  166,  319,   46,  164,   50,  319,  165,
+       44,   44,   44,  319,  319,   46,  319,   50,  319,  319,
+      168,  319,  319,  319,  167,  319,   50,   44,   44,   44,
+      319,  319,   46,  169,   50,   44,   44,   44,  319,  319,
+       46,  319,  319,  319,   50,  319,  170,   44,   44,   44,
+      319,  319,   46,  319,   44,   44,   44,  319,  319,   46,
+      319,   50,  178,  179,  319,  319,  319,  171,  319,   50,
+      319,  180,  319,   44,   44,   44,  319,  319,   46,  172,
+      319,   50,  319,  319,   44,   44,   44,  177,   50,   46,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  181,
+
+      182,  182,  182,  182,  319,  319,  319,   50,  182,  182,
+      182,  182,  182,  182,  183,   44,   44,   44,   50,  319,
+       46,  319,  319,  319,  182,  182,  182,  182,  182,  182,
+       44,   44,   44,  319,  319,   46,  184,   44,   44,   44,
+      319,  319,   46,  319,  319,  186,  187,  319,  319,   50,
+       44,   44,   44,  319,  319,   46,  319,  319,  185,  319,
+       44,   44,   44,  319,   50,   46,  319,   44,   44,   44,
+      190,   50,   46,   44,   44,   44,  319,  319,   46,  319,
+      319,  188,  319,  319,   50,   44,   44,   44,  319,  319,
+       46,   44,   44,   44,   50,  319,   46,   44,   44,   44,
+
+      319,   50,  195,  189,  191,  319,  319,   50,   44,   44,
+       44,  319,  319,   46,  192,  319,   44,   44,   44,   50,
+      319,   46,   44,   44,   44,   50,  319,   46,  319,  319,
+      193,   50,  194,  319,   44,   44,   44,  319,  319,   46,
+      319,  319,   50,   44,   44,   44,  319,  319,  200,  319,
+       50,  319,   44,   44,   44,  319,   50,   46,  319,  319,
+      319,  319,  201,  196,  197,   44,   44,   44,   50,  319,
+       46,   44,   44,   44,  198,  199,  205,   50,   44,   44,
+       44,  319,  319,  206,  319,  319,   50,   44,   44,   44,
+      319,  319,   46,  319,  319,   44,   44,   44,  319,   50,
+
+       46,   44,   44,   44,  319,   50,   46,  319,  319,   44,
+       44,   44,   50,  319,   46,  204,  319,   44,   44,   44,
+      319,   50,   46,  319,  319,  319,  319,  207,  319,   50,
+      319,   44,   44,   44,  319,   50,  212,  319,  319,  319,
+      319,  319,  319,   50,  208,   45,   45,   45,   45,  319,
+      209,   50,  319,   45,   45,   45,   45,   45,   45,  210,
+      319,   44,   44,   44,  211,   50,  213,  319,  319,   45,
+       45,   45,   45,   45,   45,   44,   44,   44,  319,  319,
+      214,   44,   44,   44,  319,  319,   46,   44,   44,   44,
+      319,  215,   46,  319,  319,   50,   44,   44,   44,  319,
+
+      319,   46,   44,   44,   44,  319,  319,   46,  319,   50,
+      319,   44,   44,   44,  319,   50,   46,   44,   44,   44,
+      319,   50,   46,   44,   44,   44,  319,  319,   46,  319,
+       50,  216,   44,   44,   44,  319,   50,   46,  217,  319,
+      319,   44,   44,   44,  319,   50,   46,  319,  218,  319,
+      319,   50,  319,  319,  219,  319,  319,   50,   44,   44,
+       44,  319,  319,   46,  319,  319,   50,  319,  319,  221,
+      220,  319,  319,  223,  319,   50,  319,  222,  319,   44,
+       44,   44,  319,  319,   46,  319,  224,  319,   44,   44,
+       44,  319,   50,   46,   44,   44,   44,  319,  319,   46,
+
+      319,  319,   44,   44,   44,  319,  319,   46,  319,  319,
+      319,  319,  225,   50,   44,   44,   44,  319,  226,   46,
+      319,  319,   50,  319,   44,   44,   44,  319,   50,   46,
+      319,  319,   44,   44,   44,  228,   50,   46,  319,  319,
+      319,  319,  319,  229,  319,  230,  319,  319,   50,   44,
+       44,   44,  319,  319,   46,   44,   44,   44,   50,  319,
+       46,  319,  319,  319,  319,  319,   50,  319,  231,  319,
+      319,  232,  319,  233,   44,   44,   44,  319,  319,   46,
+       44,   44,   44,   50,  319,   46,   44,   44,   44,   50,
+      319,   46,   44,   44,   44,  319,  234,   46,   44,   44,
+
+       44,  319,  319,  240,  319,  235,  319,  319,   50,  319,
+       44,   44,   44,  319,   50,  241,   44,   44,   44,  319,
+       50,   46,  319,  319,  236,  319,   50,  319,  319,   44,
+       44,   44,   50,  239,   46,   44,   44,   44,  237,  238,
+       46,  319,  319,  319,   50,  245,  242,   44,   44,   44,
+       50,  319,   46,  319,   44,   44,   44,  319,  319,   46,
+       44,   44,   44,   50,  247,   46,   44,   44,   44,   50,
+      243,  249,   44,   44,   44,  319,  319,  250,  319,  319,
+      319,   50,  319,  244,  319,   44,   44,   44,   50,  319,
+       46,   44,   44,   44,   50,  251,   46,  246,  319,  319,
+
+       50,  319,  319,   44,   44,   44,   50,  319,   46,   44,
+       44,   44,  319,  248,   46,   44,   44,   44,  319,   50,
+       46,   44,   44,   44,  319,   50,  256,   44,   44,   44,
+      319,  319,  257,  319,   44,   44,   44,   50,  319,  258,
+       44,   44,   44,   50,  319,   46,  319,  252,  253,   50,
+      319,   44,   44,   44,  319,   50,   46,  319,  319,  319,
+      319,   50,  254,  319,   44,   44,   44,  255,   50,   46,
+       44,   44,   44,  319,   50,   46,   44,   44,   44,  319,
+      319,   46,  319,  319,  319,   50,   44,   44,   44,  319,
+      259,   46,  260,  319,   44,   44,   44,  319,   50,  266,
+
+       44,   44,   44,  319,   50,   46,   44,   44,   44,  319,
+       50,   46,   44,   44,   44,  319,  319,   46,  319,  262,
+       50,  319,  261,  265,  263,  264,  319,  319,   50,  319,
+       44,   44,   44,  319,   50,   46,   44,   44,   44,  319,
+       50,   46,  319,   44,   44,   44,   50,  268,   46,  319,
+      269,  319,  319,  267,   44,   44,   44,  319,  319,   46,
+      319,   44,   44,   44,   50,  319,  274,   44,   44,   44,
+       50,  319,   46,   44,   44,   44,  319,   50,   46,  319,
+       44,   44,   44,  319,  270,   46,  319,  319,   50,  319,
+      271,   44,   44,   44,  272,   50,   46,  319,   44,   44,
+
+       44,   50,  319,   46,  275,  319,  273,   50,   44,   44,
+       44,  319,  319,   46,   50,   44,   44,   44,  319,  319,
+       46,   44,   44,   44,  319,   50,  282,  319,   44,   44,
+       44,  276,   50,  283,  277,   44,   44,   44,  280,  319,
+       46,  278,   50,   44,   44,   44,  319,  319,   46,   50,
+      319,   44,   44,   44,  319,   50,   46,  319,  279,   44,
+       44,   44,   50,  319,   46,  319,  319,  281,  319,   50,
+       44,   44,   44,  319,  319,   46,  319,   50,   44,   44,
+       44,  319,  319,   46,  319,   50,   44,   44,   44,  284,
+      319,   46,  319,   50,  319,  319,  285,  319,  319,  286,
+
+       44,   44,   44,  319,   50,  291,  319,  319,  319,  319,
+      287,  288,   50,   44,   44,   44,  319,  319,   46,  289,
+       50,   44,   44,   44,  319,  290,   46,   44,   44,   44,
+      319,  319,  294,  319,   50,   44,   44,   44,  319,  319,
+       46,   44,   44,   44,  319,  319,   46,   50,  319,  319,
+      292,   44,   44,   44,  319,   50,   46,   44,   44,   44,
+      319,   50,   46,   44,   44,   44,  293,  319,   46,   50,
+      319,  319,  319,  319,  319,   50,  295,  319,   44,   44,
+       44,  319,  296,   46,  319,   50,  319,   44,   44,   44,
+      319,   50,   46,   44,   44,   44,  319,   50,  302,   44,
+
+       44,   44,  319,  319,  303,  319,  298,  319,  297,  299,
+      319,  319,   50,   44,   44,   44,  319,  319,   46,  319,
+      319,   50,  319,   44,   44,   44,  319,   50,   46,  319,
+      300,  319,  319,   50,   44,   44,   44,  301,  319,   46,
+       44,   44,   44,  319,  319,   46,  319,   50,   44,   44,
+       44,  319,  319,   46,   44,   44,   44,   50,  319,  309,
+       44,   44,   44,  319,  319,  310,  319,  304,   50,  319,
+      319,   44,   44,   44,   50,  306,   46,  305,   44,   44,
+       44,  319,   50,   46,  319,  307,  319,  319,   50,  319,
+       44,   44,   44,  319,   50,   46,  319,  308,   44,   44,
+
+       44,  319,  319,   46,  319,   50,   44,   44,   44,  319,
+      319,   46,   50,   44,   44,   44,  319,  319,  316,  312,
+      319,   44,   44,   44,   50,  311,  317,  319,   44,   44,
+       44,  319,   50,  318,  319,  319,  319,  319,  319,  319,
+       50,  319,  319,  313,  319,  319,  319,   50,  319,  319,
+      319,  314,  319,  319,  319,   50,  319,  319,  319,  315,
+      319,  319,   50,   36,   36,   36,   36,   36,   45,   45,
+       45,   45,   45,   62,  319,   62,   62,   62,   81,  319,
+       81,  319,   81,   83,   83,   83,   83,   83,   89,   89,
+       89,   89,   89,  109,  319,  109,  109,  109,  122,  122,
+
+      122,   11,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319
     } ;
 
-static const flex_int16_t yy_chk[2018] =
+static const flex_int16_t yy_chk[2165] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -1099,216 +1120,232 @@ static const flex_int16_t yy_chk[2018] =
        37,   21,    5,    5,    9,    5,   21,   26,    5,   25,
 
         5,   25,    5,   27,   25,   25,   25,   25,    5,    5,
-        7,   10,    5,   26,    8,  313,    5,   31,   28,   44,
-       42,    5,   42,   32,   33,  312,   27,    5,    5,   15,
-       15,   15,  311,   31,   15,   17,  310,   17,   17,   17,
+        7,   10,    5,   26,    8,  331,    5,   31,   28,   44,
+       42,    5,   42,   32,   33,  330,   27,    5,    5,   15,
+       15,   15,  329,   31,   15,   17,  328,   17,   17,   17,
        17,   28,   20,   20,   20,   20,   32,   33,   44,   17,
-      195,   75,   15,   15,   20,   73,   15,   71,   71,   71,
-       71,   74,  170,   15,  146,   17,   83,   78,   15,   15,
-       20,   15,  121,   15,   75,   73,   15,   15,   15,   15,
+      202,   75,   15,   15,   20,   73,   15,   71,   71,   71,
+       71,   74,  175,   15,  149,   17,   83,   78,   15,   15,
+       20,   15,  122,   15,   75,   73,   15,   15,   15,   15,
        15,   74,   15,   19,   15,   19,   19,   19,   19,   22,
-       78,   22,   22,   22,   22,   83,  115,   19,   76,   45,
+       78,   22,   22,   22,   22,   83,  116,   19,   76,   45,
 
-       45,   45,  109,   22,   45,   47,   47,   47,   89,   81,
+       45,   45,  110,   22,   45,   47,   47,   47,   89,   81,
        47,   80,   77,   19,   50,   48,   48,   48,   76,   22,
-       48,   50,   49,   49,   49,  109,  110,   49,   72,   72,
-       72,   72,   77,   45,  111,   51,   51,   51,   43,   47,
-       51,   41,  112,   50,  114,   39,  110,   50,  113,   48,
-      111,   50,   52,   52,   52,   47,   49,   52,   50,   48,
-      114,   50,   38,   50,   50,  112,   52,  140,  113,   51,
+       48,   50,   49,   49,   49,  110,  111,   49,   72,   72,
+       72,   72,   77,   45,  112,   51,   51,   51,   43,   47,
+       51,   41,  113,   50,  115,   39,  111,   50,  114,   48,
+      112,   50,   52,   52,   52,   47,   49,   52,   50,   48,
+      115,   50,   38,   50,   50,  113,   52,  143,  114,   51,
        24,   14,   49,   53,   53,   53,   11,    0,   53,   54,
-       54,   54,    0,  140,   54,   51,   52,   55,   55,   55,
+       54,   54,    0,  143,   54,   51,   52,   55,   55,   55,
         0,    0,   55,   52,    0,    0,   52,   56,   56,   56,
 
-      143,    0,   56,    0,   57,   57,   57,   53,    0,   57,
-       58,   58,   58,   54,    0,   58,  143,   59,   59,   59,
+      146,    0,   56,    0,   57,   57,   57,   53,    0,   57,
+       58,   58,   58,   54,    0,   58,  146,   59,   59,   59,
        53,   55,   59,   60,   60,   60,    0,    0,   60,   54,
         0,   56,   55,   54,   56,    0,    0,   55,   57,    0,
         0,   57,    0,    0,   58,   61,   61,   61,    0,    0,
        61,   59,    0,    0,   59,    0,    0,   60,   63,   63,
        63,   63,    0,    0,   60,   58,    0,    0,    0,   65,
        63,   65,    0,   60,   65,   65,   65,   65,   64,   61,
-       64,   64,   64,   64,   85,   66,   63,   66,   66,   66,
-       66,   85,   64,    0,   61,   67,   67,   67,   67,   66,
-
-        0,   86,   86,   86,    0,    0,   86,   67,   64,   87,
-       87,   87,    0,   85,   87,   66,    0,   85,    0,    0,
-        0,   85,    0,   67,   88,   88,   88,    0,   85,   88,
-        0,   85,    0,   85,   85,   86,   90,   90,   90,    0,
-        0,   90,    0,   87,   92,   92,   92,    0,   87,   92,
-       86,   93,   93,   93,    0,    0,   93,    0,   88,    0,
-       96,   96,   96,    0,    0,   96,    0,   88,    0,    0,
-       90,   91,   91,   91,   91,    0,    0,    0,   92,   91,
-       91,   91,   91,   91,   91,   93,   94,   94,   94,    0,
-        0,   94,    0,   92,   96,   91,   91,   91,   91,   91,
-
-       91,   95,   95,   95,    0,    0,   95,   97,   97,   97,
-        0,    0,   97,    0,    0,   96,   98,   98,   98,    0,
-       94,   98,    0,    0,   94,   99,   99,   99,    0,    0,
-       99,  100,  100,  100,    0,   95,  100,  101,  101,  101,
-       95,   97,  101,  102,  102,  102,    0,    0,  102,    0,
-       98,  103,  103,  103,    0,    0,  103,   97,    0,   99,
-        0,    0,    0,   99,    0,  100,    0,  104,  104,  104,
-       98,  101,  104,    0,  100,    0,    0,  102,  105,  105,
-      105,    0,    0,  105,    0,  103,    0,  106,  106,  106,
-        0,  102,  106,    0,  101,  107,  107,  107,    0,    0,
-
-      107,  104,  118,  118,  118,  103,    0,  118,  119,  119,
-      119,    0,  105,  119,    0,  120,  120,  120,    0,  104,
-      120,  106,    0,  124,  124,  124,  106,    0,  124,  107,
-      127,  127,  127,    0,  105,  127,  118,    0,    0,    0,
-      107,    0,  119,    0,    0,  126,  126,  126,    0,  120,
-      126,    0,    0,    0,    0,    0,  118,  124,  120,  119,
-      123,  123,  123,  123,  127,    0,    0,    0,  123,  123,
-      123,  123,  123,  123,    0,    0,    0,  124,    0,  126,
-        0,  127,    0,    0,  123,  123,  123,  123,  123,  123,
-      128,  128,  128,    0,    0,  128,  129,  129,  129,    0,
-
-      126,  129,  130,  130,  130,    0,    0,  130,    0,    0,
-      131,  131,  131,    0,    0,  131,  132,  132,  132,    0,
-        0,  132,    0,    0,  128,    0,  133,  133,  133,    0,
-      129,  133,  134,  134,  134,    0,  130,  134,    0,    0,
-        0,    0,  129,  128,  131,    0,  135,  135,  135,    0,
-      132,  135,    0,  130,    0,    0,  136,  136,  136,  132,
-      133,  136,  131,    0,    0,    0,  134,  137,  137,  137,
-        0,    0,  137,  134,    0,    0,  138,  138,  138,  133,
-      135,  138,  133,  139,  139,  139,    0,    0,  139,    0,
-      136,    0,    0,  136,  148,  148,  148,  135,    0,  148,
-
-        0,  137,  150,  150,  150,    0,    0,  150,  137,    0,
-      138,  149,  149,  149,    0,    0,  149,  139,  152,  152,
-      152,    0,  138,  152,    0,    0,  149,  149,  148,    0,
-        0,    0,    0,    0,    0,  149,  150,  153,  153,  153,
-      139,    0,  153,    0,    0,  149,  148,  150,  151,  151,
-      151,  151,  152,    0,    0,    0,  151,  151,  151,  151,
-      151,  151,    0,  154,  154,  154,    0,    0,  154,    0,
-      152,  153,  151,  151,  151,  151,  151,  151,  154,  154,
-      153,  155,  155,  155,    0,    0,  155,  156,  156,  156,
-        0,    0,  156,  157,  157,  157,    0,  154,  157,  158,
-
-      158,  158,    0,  157,  158,  159,  159,  159,    0,    0,
-      159,  160,  160,  160,    0,  155,  160,  161,  161,  161,
-        0,  156,  161,    0,    0,  155,    0,  157,    0,  162,
-      162,  162,    0,  158,  162,    0,  158,    0,    0,  159,
-      156,    0,  163,  163,  163,  160,  159,  163,  164,  164,
-      164,  161,    0,  164,    0,    0,  160,    0,  161,  165,
-      165,  165,    0,  162,  165,  166,  166,  166,    0,    0,
-      166,    0,    0,  167,  167,  167,  163,    0,  167,  172,
-      172,  172,  164,    0,  172,  173,  173,  173,    0,    0,
-      173,    0,    0,  165,    0,    0,  164,  163,    0,  166,
-
-      174,  174,  174,    0,    0,  174,  166,  167,    0,    0,
-        0,  165,    0,  172,    0,  175,  175,  175,    0,  173,
-      175,    0,  176,  176,  176,    0,    0,  176,    0,  172,
-      179,  179,  179,    0,  174,  179,  178,  178,  178,    0,
-        0,  178,  180,  180,  180,    0,    0,  180,    0,  175,
-        0,    0,    0,    0,    0,  175,  176,  181,  181,  181,
-        0,    0,  181,    0,  179,    0,    0,    0,    0,    0,
-      178,  176,  177,  177,  177,  177,  180,  179,    0,    0,
-      177,  177,  177,  177,  177,  177,  178,  182,  182,  182,
-        0,  181,  182,    0,    0,    0,  177,  177,  177,  177,
-
-      177,  177,  183,  183,  183,    0,    0,  183,  184,  184,
-      184,    0,  183,  184,  185,  185,  185,    0,    0,  185,
-        0,  182,  186,  186,  186,    0,    0,  186,  187,  187,
-      187,    0,    0,  187,    0,    0,  183,    0,  188,  188,
-      188,    0,  184,  188,  190,  190,  190,    0,  185,  190,
-        0,    0,  184,    0,    0,    0,  186,    0,    0,  184,
-        0,    0,  187,  191,  191,  191,  185,    0,  191,    0,
-        0,    0,  188,    0,  186,  192,  192,  192,  190,    0,
-      192,  193,  193,  193,    0,    0,  193,  187,    0,    0,
-      188,  197,  197,  197,    0,    0,  197,  191,  190,    0,
-
-      200,  200,  200,    0,  191,  200,    0,    0,    0,  192,
-        0,  201,  201,  201,    0,  193,  201,  202,  202,  202,
-      192,    0,  202,    0,    0,  197,  203,  203,  203,    0,
-        0,  203,    0,    0,  200,  193,    0,    0,  197,  207,
-      207,  207,    0,    0,  207,  201,    0,    0,    0,  200,
-        0,  202,    0,    0,  201,    0,  208,  208,  208,    0,
-      203,  208,    0,    0,  202,    0,    0,  203,    0,  209,
-      209,  209,    0,  207,  209,  210,  210,  210,    0,    0,
-      210,    0,  211,  211,  211,    0,  207,  211,    0,    0,
-      208,  212,  212,  212,    0,    0,  212,  213,  213,  213,
-
-        0,    0,  213,  209,    0,    0,  208,    0,    0,  210,
-      214,  214,  214,    0,    0,  214,  211,    0,    0,  209,
-        0,  215,  215,  215,    0,  212,  215,    0,    0,    0,
-        0,  213,  212,  210,    0,  211,  216,  216,  216,    0,
-        0,  216,    0,    0,  214,    0,  214,  217,  217,  217,
-        0,    0,  217,    0,    0,  215,    0,  217,  219,  219,
-      219,    0,    0,  219,  220,  220,  220,    0,  219,  220,
-      216,  221,  221,  221,    0,  215,  221,  222,  222,  222,
-        0,  217,  222,    0,  223,  223,  223,  222,    0,  223,
-      216,    0,  219,    0,  224,  224,  224,    0,  220,  224,
-
-        0,  225,  225,  225,    0,  221,  225,  226,  226,  226,
-        0,  222,  226,    0,  227,  227,  227,  220,  223,  227,
-        0,  228,  228,  228,    0,    0,  228,    0,  224,  229,
-      229,  229,    0,    0,  229,  225,    0,    0,    0,  224,
-      223,  226,  232,  232,  232,    0,    0,  232,  227,    0,
-        0,    0,    0,    0,  225,  228,  233,  233,  233,  226,
-        0,  233,    0,  229,  234,  234,  234,    0,    0,  234,
-      235,  235,  235,    0,    0,  235,  232,  236,  236,  236,
-        0,    0,  236,  237,  237,  237,    0,    0,  237,    0,
-      233,    0,  232,    0,  239,  239,  239,  233,  234,  239,
-
-      240,  240,  240,    0,  235,  240,    0,    0,  241,  241,
-      241,  236,    0,  241,  236,    0,    0,  237,    0,  235,
-        0,    0,  234,    0,  235,  242,  242,  242,  239,    0,
-      242,  243,  243,  243,  240,    0,  243,    0,  247,  247,
-      247,  240,  241,  247,    0,    0,  241,  239,  248,  248,
-      248,    0,    0,  248,    0,    0,  249,  249,  249,  242,
-        0,  249,  250,  250,  250,  243,    0,  250,  251,  251,
-      251,    0,  247,  251,    0,  252,  252,  252,    0,  242,
-      252,    0,  248,    0,    0,  243,  254,  254,  254,  247,
-      249,  254,    0,  255,  255,  255,  250,    0,  255,  250,
-
-      248,    0,  251,  256,  256,  256,    0,    0,  256,  252,
-      257,  257,  257,    0,    0,  257,    0,    0,  252,    0,
-      254,    0,    0,  258,  258,  258,  251,  255,  258,  259,
-      259,  259,    0,    0,  259,    0,  254,  256,    0,    0,
-      255,  260,  260,  260,  257,    0,  260,  262,  262,  262,
-        0,    0,  262,    0,    0,  256,    0,  258,    0,  263,
-      263,  263,    0,  259,  263,  264,  264,  264,    0,    0,
-      264,  266,  266,  266,    0,  260,  266,  265,  265,  265,
-        0,  262,  265,  259,  267,  267,  267,    0,    0,  267,
-        0,    0,    0,  263,  260,  262,  270,  270,  270,  264,
-
-        0,  270,  271,  271,  271,  266,  264,  271,    0,    0,
-      263,  265,  272,  272,  272,    0,  265,  272,  267,    0,
-        0,  267,  273,  273,  273,    0,    0,  273,    0,    0,
-      270,    0,  274,  274,  274,    0,  271,  274,  275,  275,
-      275,  270,    0,  275,    0,    0,  272,    0,    0,  277,
-      277,  277,    0,  272,  277,    0,  273,  278,  278,  278,
-        0,    0,  278,  273,    0,    0,  274,    0,  280,  280,
-      280,    0,  275,  280,  281,  281,  281,    0,    0,  281,
-        0,  274,    0,  277,  275,  282,  282,  282,    0,    0,
-      282,  278,  283,  283,  283,    0,    0,  283,  284,  284,
-
-      284,  277,  280,  284,  285,  285,  285,  278,  281,  285,
-      288,  288,  288,    0,    0,  288,  289,  289,  289,  282,
-        0,  289,  290,  290,  290,    0,  283,  290,    0,    0,
-        0,    0,  284,  283,    0,  291,  291,  291,  285,  282,
-      291,    0,    0,  284,  288,    0,  293,  293,  293,    0,
-      289,  293,    0,  285,    0,    0,  290,  294,  294,  294,
-        0,    0,  294,  290,    0,    0,  295,  295,  295,  291,
-      289,  295,  296,  296,  296,    0,    0,  296,    0,    0,
-      293,  297,  297,  297,    0,    0,  297,    0,  291,    0,
-        0,  294,    0,    0,    0,    0,    0,    0,    0,  293,
-
-      295,    0,    0,    0,    0,    0,  296,    0,    0,    0,
-      294,    0,    0,    0,    0,  297,  302,  302,  302,  302,
-      302,  303,  303,  303,  303,  303,  304,    0,  304,  304,
-      304,  305,    0,  305,    0,  305,  306,  306,  306,  306,
-      306,  307,  307,  307,  307,  307,  308,    0,  308,  308,
-      308,  309,  309,  309,  301,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-
-      301,  301,  301,  301,  301,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301
+       64,   64,   64,   64,    0,   66,   63,   66,   66,   66,
+       66,    0,   64,    0,   61,    0,    0,   85,   61,   66,
+
+       67,   67,   67,   67,   85,   86,   86,   86,   64,    0,
+       86,    0,   67,    0,    0,   66,   87,   87,   87,    0,
+        0,   87,   88,   88,   88,    0,   85,   88,   67,    0,
+       85,    0,    0,    0,   85,   90,   90,   90,    0,   86,
+       90,   85,    0,    0,   85,    0,   85,   85,    0,    0,
+       87,    0,    0,    0,   86,   87,   88,   92,   92,   92,
+        0,    0,   92,    0,    0,   88,    0,    0,    0,   90,
+       91,   91,   91,   91,    0,    0,    0,    0,   91,   91,
+       91,   91,   91,   91,   93,   93,   93,    0,    0,   93,
+        0,   92,    0,    0,   91,   91,   91,   91,   91,   91,
+
+        0,    0,   94,   94,   94,   92,   92,   94,   95,   95,
+       95,    0,    0,   95,   96,   96,   96,    0,   93,   96,
+       97,   97,   97,    0,    0,   97,   98,   98,   98,    0,
+        0,   98,    0,   99,   99,   99,   94,    0,   99,    0,
+       94,    0,   95,    0,  100,  100,  100,   95,   96,  100,
+      101,  101,  101,    0,   97,  101,  102,  102,  102,    0,
+       98,  102,    0,  103,  103,  103,    0,   99,  103,   96,
+       97,   99,  104,  104,  104,    0,    0,  104,  100,    0,
+       98,  105,  105,  105,  101,    0,  105,  100,    0,    0,
+      102,  106,  106,  106,    0,    0,  106,  103,  107,  107,
+
+      107,    0,    0,  107,  102,    0,  104,  101,  108,  108,
+      108,    0,    0,  108,    0,  105,    0,  103,  119,  119,
+      119,    0,    0,  119,  104,  106,  120,  120,  120,    0,
+      106,  120,  107,  121,  121,  121,    0,  105,  121,  126,
+      126,  126,  108,  107,  126,    0,    0,    0,    0,  108,
+        0,    0,  119,    0,    0,    0,    0,    0,    0,    0,
+      120,  125,  125,  125,    0,    0,  125,  121,    0,    0,
+        0,    0,  119,  126,    0,    0,  121,  120,  124,  124,
+      124,  124,    0,    0,    0,    0,  124,  124,  124,  124,
+      124,  124,    0,  126,    0,  125,  128,  128,  128,    0,
+
+        0,  128,  124,  124,  124,  124,  124,  124,    0,  125,
+      129,  129,  129,    0,    0,  129,  130,  130,  130,    0,
+        0,  130,  131,  131,  131,    0,    0,  131,    0,    0,
+      128,  132,  132,  132,    0,    0,  132,  133,  133,  133,
+        0,    0,  133,    0,  129,    0,    0,  134,  134,  134,
+      130,  128,  134,  135,  135,  135,  131,    0,  135,    0,
+        0,  129,  136,  136,  136,  132,    0,  136,  131,  130,
+        0,  133,    0,  137,  137,  137,    0,    0,  137,    0,
+        0,  134,  132,  138,  138,  138,    0,  135,  138,  133,
+      134,    0,  139,  139,  139,    0,  136,  139,    0,    0,
+
+      140,  140,  140,  136,    0,  140,  135,  137,    0,  135,
+      141,  141,  141,    0,    0,  141,    0,  138,    0,    0,
+      138,    0,    0,    0,  137,    0,  139,  142,  142,  142,
+        0,    0,  142,  139,  140,  151,  151,  151,    0,    0,
+      151,    0,    0,    0,  141,    0,  140,  152,  152,  152,
+        0,    0,  152,    0,  153,  153,  153,    0,    0,  153,
+        0,  142,  152,  152,    0,    0,    0,  141,    0,  151,
+        0,  152,    0,  155,  155,  155,    0,    0,  155,  142,
+        0,  152,    0,    0,  156,  156,  156,  151,  153,  156,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  153,
+
+      154,  154,  154,  154,    0,    0,    0,  155,  154,  154,
+      154,  154,  154,  154,  155,  157,  157,  157,  156,    0,
+      157,    0,    0,    0,  154,  154,  154,  154,  154,  154,
+      158,  158,  158,    0,    0,  158,  156,  159,  159,  159,
+        0,    0,  159,    0,    0,  158,  158,    0,    0,  157,
+      160,  160,  160,    0,    0,  160,    0,    0,  157,    0,
+      161,  161,  161,    0,  158,  161,    0,  162,  162,  162,
+      161,  159,  162,  163,  163,  163,    0,    0,  163,    0,
+        0,  159,    0,    0,  160,  164,  164,  164,    0,    0,
+      164,  165,  165,  165,  161,    0,  165,  166,  166,  166,
+
+        0,  162,  166,  160,  162,    0,    0,  163,  167,  167,
+      167,    0,    0,  167,  163,    0,  168,  168,  168,  164,
+        0,  168,  169,  169,  169,  165,    0,  169,    0,    0,
+      164,  166,  165,    0,  170,  170,  170,    0,    0,  170,
+        0,    0,  167,  171,  171,  171,    0,    0,  171,    0,
+      168,    0,  172,  172,  172,    0,  169,  172,    0,    0,
+        0,    0,  172,  167,  168,  177,  177,  177,  170,    0,
+      177,  178,  178,  178,  169,  170,  178,  171,  179,  179,
+      179,    0,    0,  179,    0,    0,  172,  180,  180,  180,
+        0,    0,  180,    0,    0,  181,  181,  181,    0,  177,
+
+      181,  183,  183,  183,    0,  178,  183,    0,    0,  184,
+      184,  184,  179,    0,  184,  177,    0,  185,  185,  185,
+        0,  180,  185,    0,    0,    0,    0,  180,    0,  181,
+        0,  186,  186,  186,    0,  183,  186,    0,    0,    0,
+        0,    0,    0,  184,  181,  182,  182,  182,  182,    0,
+      183,  185,    0,  182,  182,  182,  182,  182,  182,  184,
+        0,  187,  187,  187,  185,  186,  187,    0,    0,  182,
+      182,  182,  182,  182,  182,  188,  188,  188,    0,    0,
+      188,  189,  189,  189,    0,    0,  189,  190,  190,  190,
+        0,  189,  190,    0,    0,  187,  191,  191,  191,    0,
+
+        0,  191,  192,  192,  192,    0,    0,  192,    0,  188,
+        0,  193,  193,  193,    0,  189,  193,  194,  194,  194,
+        0,  190,  194,  196,  196,  196,    0,    0,  196,    0,
+      191,  190,  197,  197,  197,    0,  192,  197,  190,    0,
+        0,  198,  198,  198,    0,  193,  198,    0,  191,    0,
+        0,  194,    0,    0,  192,    0,    0,  196,  199,  199,
+      199,    0,    0,  199,    0,    0,  197,    0,    0,  194,
+      193,    0,    0,  197,    0,  198,    0,  196,    0,  201,
+      201,  201,    0,    0,  201,    0,  198,    0,  204,  204,
+      204,    0,  199,  204,  207,  207,  207,    0,    0,  207,
+
+        0,    0,  208,  208,  208,    0,    0,  208,    0,    0,
+        0,    0,  199,  201,  209,  209,  209,    0,  201,  209,
+        0,    0,  204,    0,  210,  210,  210,    0,  207,  210,
+        0,    0,  211,  211,  211,  204,  208,  211,    0,    0,
+        0,    0,    0,  207,    0,  208,    0,    0,  209,  215,
+      215,  215,    0,    0,  215,  216,  216,  216,  210,    0,
+      216,    0,    0,    0,    0,    0,  211,    0,  209,    0,
+        0,  210,    0,  211,  217,  217,  217,    0,    0,  217,
+      218,  218,  218,  215,    0,  218,  219,  219,  219,  216,
+        0,  219,  220,  220,  220,    0,  215,  220,  221,  221,
+
+      221,    0,    0,  221,    0,  216,    0,    0,  217,    0,
+      222,  222,  222,    0,  218,  222,  223,  223,  223,    0,
+      219,  223,    0,    0,  217,    0,  220,    0,    0,  224,
+      224,  224,  221,  220,  224,  225,  225,  225,  218,  219,
+      225,    0,    0,    0,  222,  225,  222,  226,  226,  226,
+      223,    0,  226,    0,  228,  228,  228,    0,    0,  228,
+      229,  229,  229,  224,  228,  229,  230,  230,  230,  225,
+      223,  230,  231,  231,  231,    0,    0,  231,    0,    0,
+        0,  226,    0,  224,    0,  232,  232,  232,  228,    0,
+      232,  233,  233,  233,  229,  232,  233,  226,    0,    0,
+
+      230,    0,    0,  234,  234,  234,  231,    0,  234,  235,
+      235,  235,    0,  229,  235,  236,  236,  236,    0,  232,
+      236,  237,  237,  237,    0,  233,  237,  238,  238,  238,
+        0,    0,  238,    0,  239,  239,  239,  234,    0,  239,
+      242,  242,  242,  235,    0,  242,    0,  233,  234,  236,
+        0,  243,  243,  243,    0,  237,  243,    0,    0,    0,
+        0,  238,  235,    0,  244,  244,  244,  236,  239,  244,
+      245,  245,  245,    0,  242,  245,  246,  246,  246,    0,
+        0,  246,    0,    0,    0,  243,  247,  247,  247,    0,
+      242,  247,  243,    0,  248,  248,  248,    0,  244,  248,
+
+      251,  251,  251,    0,  245,  251,  252,  252,  252,    0,
+      246,  252,  253,  253,  253,    0,    0,  253,    0,  245,
+      247,    0,  244,  247,  245,  246,    0,    0,  248,    0,
+      254,  254,  254,    0,  251,  254,  255,  255,  255,    0,
+      252,  255,    0,  259,  259,  259,  253,  252,  259,    0,
+      253,    0,    0,  251,  260,  260,  260,    0,    0,  260,
+        0,  261,  261,  261,  254,    0,  261,  262,  262,  262,
+      255,    0,  262,  263,  263,  263,    0,  259,  263,    0,
+      264,  264,  264,    0,  254,  264,    0,    0,  260,    0,
+      255,  268,  268,  268,  259,  261,  268,    0,  265,  265,
+
+      265,  262,    0,  265,  262,    0,  260,  263,  267,  267,
+      267,    0,    0,  267,  264,  269,  269,  269,    0,    0,
+      269,  270,  270,  270,    0,  268,  270,    0,  271,  271,
+      271,  263,  265,  271,  264,  272,  272,  272,  268,    0,
+      272,  265,  267,  273,  273,  273,    0,    0,  273,  269,
+        0,  275,  275,  275,    0,  270,  275,    0,  267,  276,
+      276,  276,  271,    0,  276,    0,    0,  269,    0,  272,
+      277,  277,  277,    0,    0,  277,    0,  273,  278,  278,
+      278,    0,    0,  278,    0,  275,  279,  279,  279,  272,
+        0,  279,    0,  276,    0,    0,  273,    0,    0,  275,
+
+      280,  280,  280,    0,  277,  280,    0,    0,    0,    0,
+      276,  277,  278,  281,  281,  281,    0,    0,  281,  278,
+      279,  284,  284,  284,    0,  279,  284,  285,  285,  285,
+        0,    0,  285,    0,  280,  286,  286,  286,    0,    0,
+      286,  287,  287,  287,    0,    0,  287,  281,    0,    0,
+      281,  288,  288,  288,    0,  284,  288,  289,  289,  289,
+        0,  285,  289,  290,  290,  290,  284,    0,  290,  286,
+        0,    0,    0,    0,    0,  287,  286,    0,  292,  292,
+      292,    0,  287,  292,    0,  288,    0,  293,  293,  293,
+        0,  289,  293,  295,  295,  295,    0,  290,  295,  296,
+
+      296,  296,    0,    0,  296,    0,  289,    0,  288,  290,
+        0,    0,  292,  297,  297,  297,    0,    0,  297,    0,
+        0,  293,    0,  298,  298,  298,    0,  295,  298,    0,
+      292,    0,    0,  296,  299,  299,  299,  293,    0,  299,
+      300,  300,  300,    0,    0,  300,    0,  297,  301,  301,
+      301,    0,    0,  301,  304,  304,  304,  298,    0,  304,
+      305,  305,  305,    0,    0,  305,    0,  297,  299,    0,
+        0,  306,  306,  306,  300,  299,  306,  298,  307,  307,
+      307,    0,  301,  307,    0,  300,    0,    0,  304,    0,
+      308,  308,  308,    0,  305,  308,    0,  301,  311,  311,
+
+      311,    0,    0,  311,    0,  306,  312,  312,  312,    0,
+        0,  312,  307,  313,  313,  313,    0,    0,  313,  307,
+        0,  314,  314,  314,  308,  306,  314,    0,  315,  315,
+      315,    0,  311,  315,    0,    0,    0,    0,    0,    0,
+      312,    0,    0,  308,    0,    0,    0,  313,    0,    0,
+        0,  311,    0,    0,    0,  314,    0,    0,    0,  312,
+        0,    0,  315,  320,  320,  320,  320,  320,  321,  321,
+      321,  321,  321,  322,    0,  322,  322,  322,  323,    0,
+      323,    0,  323,  324,  324,  324,  324,  324,  325,  325,
+      325,  325,  325,  326,    0,  326,  326,  326,  327,  327,
+
+      327,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
+      319,  319,  319,  319
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1317,14 +1354,14 @@ static char *yy_last_accepting_cpos;
 extern int yy_flex_debug;
 int yy_flex_debug = 1;
 
-static const flex_int16_t yy_rule_linenum[56] =
+static const flex_int16_t yy_rule_linenum[58] =
     {   0,
       133,  135,  137,  142,  143,  148,  149,  150,  162,  165,
-      170,  177,  186,  195,  204,  213,  222,  231,  240,  249,
-      258,  267,  276,  285,  294,  303,  312,  321,  330,  339,
-      348,  357,  366,  375,  384,  393,  402,  411,  510,  515,
-      520,  525,  526,  527,  528,  529,  530,  532,  550,  563,
-      568,  572,  574,  576,  578
+      170,  177,  186,  195,  204,  215,  226,  235,  244,  253,
+      262,  271,  280,  289,  298,  307,  316,  325,  334,  343,
+      352,  361,  370,  379,  388,  397,  406,  415,  424,  433,
+      532,  537,  542,  547,  548,  549,  550,  551,  552,  554,
+      572,  585,  590,  594,  596,  598,  600
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1336,7 +1373,7 @@ static const flex_int16_t yy_rule_linenum[56] =
 #define YY_RESTORE_YY_MORE_OFFSET
 char *yytext;
 #line 1 "agent_lexer.ll"
-/* Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC")
 
    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -1379,7 +1416,7 @@ using isc::agent::AgentParser;
 
 /* To avoid the call to exit... oops! */
 #define YY_FATAL_ERROR(msg) isc::agent::ParserContext::fatal(msg)
-#line 1382 "agent_lexer.cc"
+#line 1419 "agent_lexer.cc"
 /* noyywrap disables automatic rewinding for the next file to parse. Since we
    always parse only a single string, there's no need to do any wraps. And
    using yywrap requires linking with -lfl, which provides the default yywrap
@@ -1405,8 +1442,8 @@ using isc::agent::AgentParser;
    by moving it ahead by yyleng bytes. yyleng specifies the length of the
    currently matched token. */
 #define YY_USER_ACTION  driver.loc_.columns(yyleng);
-#line 1408 "agent_lexer.cc"
-#line 1409 "agent_lexer.cc"
+#line 1445 "agent_lexer.cc"
+#line 1446 "agent_lexer.cc"
 
 #define INITIAL 0
 #define COMMENT 1
@@ -1720,7 +1757,7 @@ YY_DECL
     }
 
 
-#line 1723 "agent_lexer.cc"
+#line 1760 "agent_lexer.cc"
 
        while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
@@ -1749,13 +1786,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 302 )
+                               if ( yy_current_state >= 320 )
                                        yy_c = yy_meta[yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
                        ++yy_cp;
                        }
-               while ( yy_current_state != 301 );
+               while ( yy_current_state != 319 );
                yy_cp = (yy_last_accepting_cpos);
                yy_current_state = (yy_last_accepting_state);
 
@@ -1774,13 +1811,13 @@ do_action:      /* This label is used only to access EOF actions. */
                        {
                        if ( yy_act == 0 )
                                fprintf( stderr, "--scanner backing up\n" );
-                       else if ( yy_act < 56 )
+                       else if ( yy_act < 58 )
                                fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
                                         (long)yy_rule_linenum[yy_act], yytext );
-                       else if ( yy_act == 56 )
+                       else if ( yy_act == 58 )
                                fprintf( stderr, "--accepting default rule (\"%s\")\n",
                                         yytext );
-                       else if ( yy_act == 57 )
+                       else if ( yy_act == 59 )
                                fprintf( stderr, "--(end of buffer or a NUL)\n" );
                        else
                                fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
@@ -1923,6 +1960,34 @@ YY_RULE_SETUP
 case 15:
 YY_RULE_SETUP
 #line 204 "agent_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case ParserContext::AGENT:
+    case ParserContext::SERVER:
+    case ParserContext::LOGGERS:
+        return AgentParser::make_USER_CONTEXT(driver.loc_);
+    default:
+        return AgentParser::make_STRING("user-context", driver.loc_);
+    }
+}
+       YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 215 "agent_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case ParserContext::AGENT:
+    case ParserContext::SERVER:
+    case ParserContext::LOGGERS:
+        return AgentParser::make_COMMENT(driver.loc_);
+    default:
+        return AgentParser::make_STRING("comment", driver.loc_);
+    }
+}
+       YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 226 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::AGENT:
@@ -1932,9 +1997,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 16:
+case 18:
 YY_RULE_SETUP
-#line 213 "agent_lexer.ll"
+#line 235 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::CONTROL_SOCKETS:
@@ -1944,9 +2009,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 17:
+case 19:
 YY_RULE_SETUP
-#line 222 "agent_lexer.ll"
+#line 244 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::CONTROL_SOCKETS:
@@ -1956,9 +2021,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 18:
+case 20:
 YY_RULE_SETUP
-#line 231 "agent_lexer.ll"
+#line 253 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::CONTROL_SOCKETS:
@@ -1968,9 +2033,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 19:
+case 21:
 YY_RULE_SETUP
-#line 240 "agent_lexer.ll"
+#line 262 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::SERVER:
@@ -1980,9 +2045,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 20:
+case 22:
 YY_RULE_SETUP
-#line 249 "agent_lexer.ll"
+#line 271 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::SERVER:
@@ -1992,9 +2057,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 21:
+case 23:
 YY_RULE_SETUP
-#line 258 "agent_lexer.ll"
+#line 280 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::SOCKET_TYPE:
@@ -2004,9 +2069,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 22:
+case 24:
 YY_RULE_SETUP
-#line 267 "agent_lexer.ll"
+#line 289 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::AGENT:
@@ -2016,9 +2081,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 23:
+case 25:
 YY_RULE_SETUP
-#line 276 "agent_lexer.ll"
+#line 298 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::HOOKS_LIBRARIES:
@@ -2028,9 +2093,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 24:
+case 26:
 YY_RULE_SETUP
-#line 285 "agent_lexer.ll"
+#line 307 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::HOOKS_LIBRARIES:
@@ -2040,9 +2105,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 25:
+case 27:
 YY_RULE_SETUP
-#line 294 "agent_lexer.ll"
+#line 316 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::CONFIG:
@@ -2052,9 +2117,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 26:
+case 28:
 YY_RULE_SETUP
-#line 303 "agent_lexer.ll"
+#line 325 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::LOGGING:
@@ -2064,9 +2129,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 27:
+case 29:
 YY_RULE_SETUP
-#line 312 "agent_lexer.ll"
+#line 334 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::LOGGERS:
@@ -2076,9 +2141,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 28:
+case 30:
 YY_RULE_SETUP
-#line 321 "agent_lexer.ll"
+#line 343 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::LOGGERS:
@@ -2088,9 +2153,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 29:
+case 31:
 YY_RULE_SETUP
-#line 330 "agent_lexer.ll"
+#line 352 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::OUTPUT_OPTIONS:
@@ -2100,9 +2165,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 30:
+case 32:
 YY_RULE_SETUP
-#line 339 "agent_lexer.ll"
+#line 361 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::OUTPUT_OPTIONS:
@@ -2112,9 +2177,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 31:
+case 33:
 YY_RULE_SETUP
-#line 348 "agent_lexer.ll"
+#line 370 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::OUTPUT_OPTIONS:
@@ -2124,9 +2189,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 32:
+case 34:
 YY_RULE_SETUP
-#line 357 "agent_lexer.ll"
+#line 379 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::OUTPUT_OPTIONS:
@@ -2136,9 +2201,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 33:
+case 35:
 YY_RULE_SETUP
-#line 366 "agent_lexer.ll"
+#line 388 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::LOGGERS:
@@ -2148,9 +2213,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 34:
+case 36:
 YY_RULE_SETUP
-#line 375 "agent_lexer.ll"
+#line 397 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::LOGGERS:
@@ -2160,9 +2225,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 35:
+case 37:
 YY_RULE_SETUP
-#line 384 "agent_lexer.ll"
+#line 406 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::CONFIG:
@@ -2172,9 +2237,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 36:
+case 38:
 YY_RULE_SETUP
-#line 393 "agent_lexer.ll"
+#line 415 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::CONFIG:
@@ -2184,9 +2249,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 37:
+case 39:
 YY_RULE_SETUP
-#line 402 "agent_lexer.ll"
+#line 424 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::CONFIG:
@@ -2196,9 +2261,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 38:
+case 40:
 YY_RULE_SETUP
-#line 411 "agent_lexer.ll"
+#line 433 "agent_lexer.ll"
 {
     /* A string has been matched. It contains the actual string and single quotes.
        We need to get those quotes out of the way and just use its content, e.g.
@@ -2298,65 +2363,65 @@ YY_RULE_SETUP
     return AgentParser::make_STRING(decoded, driver.loc_);
 }
        YY_BREAK
-case 39:
-/* rule 39 can match eol */
+case 41:
+/* rule 41 can match eol */
 YY_RULE_SETUP
-#line 510 "agent_lexer.ll"
+#line 532 "agent_lexer.ll"
 {
     /* Bad string with a forbidden control character inside */
     driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
 }
        YY_BREAK
-case 40:
-/* rule 40 can match eol */
+case 42:
+/* rule 42 can match eol */
 YY_RULE_SETUP
-#line 515 "agent_lexer.ll"
+#line 537 "agent_lexer.ll"
 {
     /* Bad string with a bad escape inside */
     driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
 }
        YY_BREAK
-case 41:
+case 43:
 YY_RULE_SETUP
-#line 520 "agent_lexer.ll"
+#line 542 "agent_lexer.ll"
 {
     /* Bad string with an open escape at the end */
     driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
 }
        YY_BREAK
-case 42:
+case 44:
 YY_RULE_SETUP
-#line 525 "agent_lexer.ll"
+#line 547 "agent_lexer.ll"
 { return AgentParser::make_LSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 43:
+case 45:
 YY_RULE_SETUP
-#line 526 "agent_lexer.ll"
+#line 548 "agent_lexer.ll"
 { return AgentParser::make_RSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 44:
+case 46:
 YY_RULE_SETUP
-#line 527 "agent_lexer.ll"
+#line 549 "agent_lexer.ll"
 { return AgentParser::make_LCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 45:
+case 47:
 YY_RULE_SETUP
-#line 528 "agent_lexer.ll"
+#line 550 "agent_lexer.ll"
 { return AgentParser::make_RCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 46:
+case 48:
 YY_RULE_SETUP
-#line 529 "agent_lexer.ll"
+#line 551 "agent_lexer.ll"
 { return AgentParser::make_COMMA(driver.loc_); }
        YY_BREAK
-case 47:
+case 49:
 YY_RULE_SETUP
-#line 530 "agent_lexer.ll"
+#line 552 "agent_lexer.ll"
 { return AgentParser::make_COLON(driver.loc_); }
        YY_BREAK
-case 48:
+case 50:
 YY_RULE_SETUP
-#line 532 "agent_lexer.ll"
+#line 554 "agent_lexer.ll"
 {
     /* An integer was found. */
     std::string tmp(yytext);
@@ -2375,9 +2440,9 @@ YY_RULE_SETUP
     return AgentParser::make_INTEGER(integer, driver.loc_);
 }
        YY_BREAK
-case 49:
+case 51:
 YY_RULE_SETUP
-#line 550 "agent_lexer.ll"
+#line 572 "agent_lexer.ll"
 {
     /* A floating point was found. */
     std::string tmp(yytext);
@@ -2391,43 +2456,43 @@ YY_RULE_SETUP
     return AgentParser::make_FLOAT(fp, driver.loc_);
 }
        YY_BREAK
-case 50:
+case 52:
 YY_RULE_SETUP
-#line 563 "agent_lexer.ll"
+#line 585 "agent_lexer.ll"
 {
     string tmp(yytext);
     return AgentParser::make_BOOLEAN(tmp == "true", driver.loc_);
 }
        YY_BREAK
-case 51:
+case 53:
 YY_RULE_SETUP
-#line 568 "agent_lexer.ll"
+#line 590 "agent_lexer.ll"
 {
    return AgentParser::make_NULL_TYPE(driver.loc_);
 }
        YY_BREAK
-case 52:
+case 54:
 YY_RULE_SETUP
-#line 572 "agent_lexer.ll"
+#line 594 "agent_lexer.ll"
 driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
        YY_BREAK
-case 53:
+case 55:
 YY_RULE_SETUP
-#line 574 "agent_lexer.ll"
+#line 596 "agent_lexer.ll"
 driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
        YY_BREAK
-case 54:
+case 56:
 YY_RULE_SETUP
-#line 576 "agent_lexer.ll"
+#line 598 "agent_lexer.ll"
 driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
        YY_BREAK
-case 55:
+case 57:
 YY_RULE_SETUP
-#line 578 "agent_lexer.ll"
+#line 600 "agent_lexer.ll"
 driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 580 "agent_lexer.ll"
+#line 602 "agent_lexer.ll"
 {
     if (driver.states_.empty()) {
         return AgentParser::make_END(driver.loc_);
@@ -2451,12 +2516,12 @@ case YY_STATE_EOF(INITIAL):
     BEGIN(DIR_EXIT);
 }
        YY_BREAK
-case 56:
+case 58:
 YY_RULE_SETUP
-#line 603 "agent_lexer.ll"
+#line 625 "agent_lexer.ll"
 ECHO;
        YY_BREAK
-#line 2459 "agent_lexer.cc"
+#line 2524 "agent_lexer.cc"
 
        case YY_END_OF_BUFFER:
                {
@@ -2775,7 +2840,7 @@ static int yy_get_next_buffer (void)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 302 )
+                       if ( yy_current_state >= 320 )
                                yy_c = yy_meta[yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -2808,11 +2873,11 @@ static int yy_get_next_buffer (void)
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 302 )
+               if ( yy_current_state >= 320 )
                        yy_c = yy_meta[yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-       yy_is_jam = (yy_current_state == 301);
+       yy_is_jam = (yy_current_state == 319);
 
                return yy_is_jam ? 0 : yy_current_state;
 }
@@ -3561,7 +3626,7 @@ void yyfree (void * ptr )
 
 /* %ok-for-header */
 
-#line 603 "agent_lexer.ll"
+#line 625 "agent_lexer.ll"
 
 
 using namespace isc::dhcp;
index 9d00e198fb8b120b09f9fbbaec341a34b4ec5b3f..02b16745465f6b984a79412a23600c9446c41963 100644 (file)
@@ -253,24 +253,25 @@ namespace isc { namespace agent {
   {
       switch (that.type_get ())
     {
-      case 51: // value
-      case 100: // socket_type_value
+      case 53: // value
+      case 56: // map_value
+      case 107: // socket_type_value
         value.move< ElementPtr > (that.value);
         break;
 
-      case 42: // "boolean"
+      case 44: // "boolean"
         value.move< bool > (that.value);
         break;
 
-      case 41: // "floating point"
+      case 43: // "floating point"
         value.move< double > (that.value);
         break;
 
-      case 40: // "integer"
+      case 42: // "integer"
         value.move< int64_t > (that.value);
         break;
 
-      case 39: // "constant string"
+      case 41: // "constant string"
         value.move< std::string > (that.value);
         break;
 
@@ -289,24 +290,25 @@ namespace isc { namespace agent {
     state = that.state;
       switch (that.type_get ())
     {
-      case 51: // value
-      case 100: // socket_type_value
+      case 53: // value
+      case 56: // map_value
+      case 107: // socket_type_value
         value.copy< ElementPtr > (that.value);
         break;
 
-      case 42: // "boolean"
+      case 44: // "boolean"
         value.copy< bool > (that.value);
         break;
 
-      case 41: // "floating point"
+      case 43: // "floating point"
         value.copy< double > (that.value);
         break;
 
-      case 40: // "integer"
+      case 42: // "integer"
         value.copy< int64_t > (that.value);
         break;
 
-      case 39: // "constant string"
+      case 41: // "constant string"
         value.copy< std::string > (that.value);
         break;
 
@@ -346,46 +348,53 @@ namespace isc { namespace agent {
         << yysym.location << ": ";
     switch (yytype)
     {
-            case 39: // "constant string"
+            case 41: // "constant string"
 
-#line 99 "agent_parser.yy" // lalr1.cc:636
+#line 103 "agent_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< std::string > (); }
-#line 354 "agent_parser.cc" // lalr1.cc:636
+#line 356 "agent_parser.cc" // lalr1.cc:636
         break;
 
-      case 40: // "integer"
+      case 42: // "integer"
 
-#line 99 "agent_parser.yy" // lalr1.cc:636
+#line 103 "agent_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< int64_t > (); }
-#line 361 "agent_parser.cc" // lalr1.cc:636
+#line 363 "agent_parser.cc" // lalr1.cc:636
         break;
 
-      case 41: // "floating point"
+      case 43: // "floating point"
 
-#line 99 "agent_parser.yy" // lalr1.cc:636
+#line 103 "agent_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< double > (); }
-#line 368 "agent_parser.cc" // lalr1.cc:636
+#line 370 "agent_parser.cc" // lalr1.cc:636
         break;
 
-      case 42: // "boolean"
+      case 44: // "boolean"
 
-#line 99 "agent_parser.yy" // lalr1.cc:636
+#line 103 "agent_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< bool > (); }
-#line 375 "agent_parser.cc" // lalr1.cc:636
+#line 377 "agent_parser.cc" // lalr1.cc:636
         break;
 
-      case 51: // value
+      case 53: // value
 
-#line 99 "agent_parser.yy" // lalr1.cc:636
+#line 103 "agent_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 382 "agent_parser.cc" // lalr1.cc:636
+#line 384 "agent_parser.cc" // lalr1.cc:636
         break;
 
-      case 100: // socket_type_value
+      case 56: // map_value
 
-#line 99 "agent_parser.yy" // lalr1.cc:636
+#line 103 "agent_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 389 "agent_parser.cc" // lalr1.cc:636
+#line 391 "agent_parser.cc" // lalr1.cc:636
+        break;
+
+      case 107: // socket_type_value
+
+#line 103 "agent_parser.yy" // lalr1.cc:636
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 398 "agent_parser.cc" // lalr1.cc:636
         break;
 
 
@@ -585,24 +594,25 @@ namespace isc { namespace agent {
          when using variants.  */
         switch (yyr1_[yyn])
     {
-      case 51: // value
-      case 100: // socket_type_value
+      case 53: // value
+      case 56: // map_value
+      case 107: // socket_type_value
         yylhs.value.build< ElementPtr > ();
         break;
 
-      case 42: // "boolean"
+      case 44: // "boolean"
         yylhs.value.build< bool > ();
         break;
 
-      case 41: // "floating point"
+      case 43: // "floating point"
         yylhs.value.build< double > ();
         break;
 
-      case 40: // "integer"
+      case 42: // "integer"
         yylhs.value.build< int64_t > ();
         break;
 
-      case 39: // "constant string"
+      case 41: // "constant string"
         yylhs.value.build< std::string > ();
         break;
 
@@ -624,200 +634,206 @@ namespace isc { namespace agent {
           switch (yyn)
             {
   case 2:
-#line 110 "agent_parser.yy" // lalr1.cc:859
+#line 114 "agent_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.NO_KEYWORDS; }
-#line 630 "agent_parser.cc" // lalr1.cc:859
+#line 640 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 4:
-#line 111 "agent_parser.yy" // lalr1.cc:859
+#line 115 "agent_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.CONFIG; }
-#line 636 "agent_parser.cc" // lalr1.cc:859
+#line 646 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 6:
-#line 112 "agent_parser.yy" // lalr1.cc:859
+#line 116 "agent_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.AGENT; }
-#line 642 "agent_parser.cc" // lalr1.cc:859
+#line 652 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 8:
-#line 120 "agent_parser.yy" // lalr1.cc:859
+#line 124 "agent_parser.yy" // lalr1.cc:859
     {
     // Parse the Control-agent map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 652 "agent_parser.cc" // lalr1.cc:859
+#line 662 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 9:
-#line 124 "agent_parser.yy" // lalr1.cc:859
+#line 128 "agent_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 660 "agent_parser.cc" // lalr1.cc:859
+#line 670 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 10:
-#line 131 "agent_parser.yy" // lalr1.cc:859
+#line 135 "agent_parser.yy" // lalr1.cc:859
     {
     // Push back the JSON value on the stack
     ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ());
 }
-#line 669 "agent_parser.cc" // lalr1.cc:859
+#line 679 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 11:
-#line 137 "agent_parser.yy" // lalr1.cc:859
+#line 141 "agent_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); }
-#line 675 "agent_parser.cc" // lalr1.cc:859
+#line 685 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 12:
-#line 138 "agent_parser.yy" // lalr1.cc:859
+#line 142 "agent_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); }
-#line 681 "agent_parser.cc" // lalr1.cc:859
+#line 691 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 13:
-#line 139 "agent_parser.yy" // lalr1.cc:859
+#line 143 "agent_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); }
-#line 687 "agent_parser.cc" // lalr1.cc:859
+#line 697 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 14:
-#line 140 "agent_parser.yy" // lalr1.cc:859
+#line 144 "agent_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); }
-#line 693 "agent_parser.cc" // lalr1.cc:859
+#line 703 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 15:
-#line 141 "agent_parser.yy" // lalr1.cc:859
+#line 145 "agent_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
-#line 699 "agent_parser.cc" // lalr1.cc:859
+#line 709 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 16:
-#line 142 "agent_parser.yy" // lalr1.cc:859
+#line 146 "agent_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 705 "agent_parser.cc" // lalr1.cc:859
+#line 715 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 17:
-#line 143 "agent_parser.yy" // lalr1.cc:859
+#line 147 "agent_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 711 "agent_parser.cc" // lalr1.cc:859
+#line 721 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 18:
-#line 147 "agent_parser.yy" // lalr1.cc:859
+#line 151 "agent_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 722 "agent_parser.cc" // lalr1.cc:859
+#line 732 "agent_parser.cc" // lalr1.cc:859
     break;
 
   case 19:
-#line 152 "agent_parser.yy" // lalr1.cc:859
+#line 156 "agent_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 732 "agent_parser.cc" // lalr1.cc:859
+#line 742 "agent_parser.cc" // lalr1.cc:859
+    break;
+
+  case 20:
+#line 162 "agent_parser.yy" // lalr1.cc:859
+    { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
+#line 748 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 22:
-#line 170 "agent_parser.yy" // lalr1.cc:859
+  case 23:
+#line 176 "agent_parser.yy" // lalr1.cc:859
     {
                   // map containing a single entry
                   ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 741 "agent_parser.cc" // lalr1.cc:859
+#line 757 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 23:
-#line 174 "agent_parser.yy" // lalr1.cc:859
+  case 24:
+#line 180 "agent_parser.yy" // lalr1.cc:859
     {
                   // map consisting of a shorter map followed by
                   // comma and string:value
                   ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 751 "agent_parser.cc" // lalr1.cc:859
+#line 767 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 24:
-#line 181 "agent_parser.yy" // lalr1.cc:859
+  case 25:
+#line 187 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 760 "agent_parser.cc" // lalr1.cc:859
+#line 776 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 25:
-#line 184 "agent_parser.yy" // lalr1.cc:859
+  case 26:
+#line 190 "agent_parser.yy" // lalr1.cc:859
     {
 }
-#line 767 "agent_parser.cc" // lalr1.cc:859
+#line 783 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 28:
-#line 191 "agent_parser.yy" // lalr1.cc:859
+  case 29:
+#line 197 "agent_parser.yy" // lalr1.cc:859
     {
                   // List consisting of a single element.
                   ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 776 "agent_parser.cc" // lalr1.cc:859
+#line 792 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 29:
-#line 195 "agent_parser.yy" // lalr1.cc:859
+  case 30:
+#line 201 "agent_parser.yy" // lalr1.cc:859
     {
                   // List ending with , and a value.
                   ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 785 "agent_parser.cc" // lalr1.cc:859
+#line 801 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 30:
-#line 208 "agent_parser.yy" // lalr1.cc:859
+  case 31:
+#line 214 "agent_parser.yy" // lalr1.cc:859
     {
     const std::string& where = ctx.contextName();
     const std::string& keyword = yystack_[1].value.as< std::string > ();
     error(yystack_[1].location,
           "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
 }
-#line 796 "agent_parser.cc" // lalr1.cc:859
+#line 812 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 31:
-#line 217 "agent_parser.yy" // lalr1.cc:859
+  case 32:
+#line 223 "agent_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 807 "agent_parser.cc" // lalr1.cc:859
+#line 823 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 32:
-#line 222 "agent_parser.yy" // lalr1.cc:859
+  case 33:
+#line 228 "agent_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 817 "agent_parser.cc" // lalr1.cc:859
+#line 833 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 41:
-#line 243 "agent_parser.yy" // lalr1.cc:859
+  case 42:
+#line 249 "agent_parser.yy" // lalr1.cc:859
     {
 
     // Let's create a MapElement that will represent it, add it to the
@@ -829,480 +845,552 @@ namespace isc { namespace agent {
     ctx.stack_.push_back(m);
     ctx.enter(ctx.AGENT);
 }
-#line 833 "agent_parser.cc" // lalr1.cc:859
+#line 849 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 42:
-#line 253 "agent_parser.yy" // lalr1.cc:859
+  case 43:
+#line 259 "agent_parser.yy" // lalr1.cc:859
     {
     // Ok, we're done with parsing control-agent. Let's take the map
     // off the stack.
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 844 "agent_parser.cc" // lalr1.cc:859
+#line 860 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 50:
-#line 273 "agent_parser.yy" // lalr1.cc:859
+  case 53:
+#line 281 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 852 "agent_parser.cc" // lalr1.cc:859
+#line 868 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 51:
-#line 275 "agent_parser.yy" // lalr1.cc:859
+  case 54:
+#line 283 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("http-host", host);
     ctx.leave();
 }
-#line 862 "agent_parser.cc" // lalr1.cc:859
+#line 878 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 52:
-#line 281 "agent_parser.yy" // lalr1.cc:859
+  case 55:
+#line 289 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("http-port", prf);
 }
-#line 871 "agent_parser.cc" // lalr1.cc:859
+#line 887 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 53:
-#line 287 "agent_parser.yy" // lalr1.cc:859
+  case 56:
+#line 294 "agent_parser.yy" // lalr1.cc:859
+    {
+    ctx.enter(ctx.NO_KEYWORD);
+}
+#line 895 "agent_parser.cc" // lalr1.cc:859
+    break;
+
+  case 57:
+#line 296 "agent_parser.yy" // lalr1.cc:859
+    {
+    ElementPtr parent = ctx.stack_.back();
+    ElementPtr user_context = yystack_[0].value.as< ElementPtr > ();
+    ConstElementPtr old = parent->get("user-context");
+
+    // Handle already existing user context
+    if (old) {
+        // Check if it was a comment or a duplicate
+        if ((old->size() != 1) || !old->contains("comment")) {
+            std::stringstream msg;
+            msg << "duplicate user-context entries (previous at "
+                << old->getPosition().str() << ")";
+            error(yystack_[3].location, msg.str());
+        }
+        // Merge the comment
+        user_context->set("comment", old->get("comment"));
+    }
+
+    // Set the user context
+    parent->set("user-context", user_context);
+    ctx.leave();
+}
+#line 922 "agent_parser.cc" // lalr1.cc:859
+    break;
+
+  case 58:
+#line 319 "agent_parser.yy" // lalr1.cc:859
+    {
+    ctx.enter(ctx.NO_KEYWORD);
+}
+#line 930 "agent_parser.cc" // lalr1.cc:859
+    break;
+
+  case 59:
+#line 321 "agent_parser.yy" // lalr1.cc:859
+    {
+    ElementPtr parent = ctx.stack_.back();
+    ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location)));
+    ElementPtr comment(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
+    user_context->set("comment", comment);
+
+    // Handle already existing user context
+    ConstElementPtr old = parent->get("user-context");
+    if (old) {
+        // Check for duplicate comment
+        if (old->contains("comment")) {
+            std::stringstream msg;
+            msg << "duplicate user-context/comment entries (previous at "
+                << old->getPosition().str() << ")";
+            error(yystack_[3].location, msg.str());
+        }
+        // Merge the user context in the comment
+        merge(user_context, old);
+    }
+
+    // Set the user context
+    parent->set("user-context", user_context);
+    ctx.leave();
+}
+#line 959 "agent_parser.cc" // lalr1.cc:859
+    break;
+
+  case 60:
+#line 347 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hooks-libraries", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOOKS_LIBRARIES);
 }
-#line 882 "agent_parser.cc" // lalr1.cc:859
+#line 970 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 54:
-#line 292 "agent_parser.yy" // lalr1.cc:859
+  case 61:
+#line 352 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 891 "agent_parser.cc" // lalr1.cc:859
+#line 979 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 59:
-#line 305 "agent_parser.yy" // lalr1.cc:859
+  case 66:
+#line 365 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 901 "agent_parser.cc" // lalr1.cc:859
+#line 989 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 60:
-#line 309 "agent_parser.yy" // lalr1.cc:859
+  case 67:
+#line 369 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 909 "agent_parser.cc" // lalr1.cc:859
+#line 997 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 66:
-#line 322 "agent_parser.yy" // lalr1.cc:859
+  case 73:
+#line 382 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 917 "agent_parser.cc" // lalr1.cc:859
+#line 1005 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 67:
-#line 324 "agent_parser.yy" // lalr1.cc:859
+  case 74:
+#line 384 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("library", lib);
     ctx.leave();
 }
-#line 927 "agent_parser.cc" // lalr1.cc:859
+#line 1015 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 68:
-#line 330 "agent_parser.yy" // lalr1.cc:859
+  case 75:
+#line 390 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 935 "agent_parser.cc" // lalr1.cc:859
+#line 1023 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 69:
-#line 332 "agent_parser.yy" // lalr1.cc:859
+  case 76:
+#line 392 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 944 "agent_parser.cc" // lalr1.cc:859
+#line 1032 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 70:
-#line 340 "agent_parser.yy" // lalr1.cc:859
+  case 77:
+#line 400 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[2].location)));
     ctx.stack_.back()->set("control-sockets", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.CONTROL_SOCKETS);
 }
-#line 955 "agent_parser.cc" // lalr1.cc:859
+#line 1043 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 71:
-#line 345 "agent_parser.yy" // lalr1.cc:859
+  case 78:
+#line 405 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 964 "agent_parser.cc" // lalr1.cc:859
+#line 1052 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 78:
-#line 366 "agent_parser.yy" // lalr1.cc:859
+  case 85:
+#line 426 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp4", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SERVER);
 }
-#line 975 "agent_parser.cc" // lalr1.cc:859
+#line 1063 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 79:
-#line 371 "agent_parser.yy" // lalr1.cc:859
+  case 86:
+#line 431 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 984 "agent_parser.cc" // lalr1.cc:859
+#line 1072 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 80:
-#line 377 "agent_parser.yy" // lalr1.cc:859
+  case 87:
+#line 437 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp6", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SERVER);
 }
-#line 995 "agent_parser.cc" // lalr1.cc:859
+#line 1083 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 81:
-#line 382 "agent_parser.yy" // lalr1.cc:859
+  case 88:
+#line 442 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1004 "agent_parser.cc" // lalr1.cc:859
+#line 1092 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 82:
-#line 388 "agent_parser.yy" // lalr1.cc:859
+  case 89:
+#line 448 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("d2", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SERVER);
 }
-#line 1015 "agent_parser.cc" // lalr1.cc:859
+#line 1103 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 83:
-#line 393 "agent_parser.yy" // lalr1.cc:859
+  case 90:
+#line 453 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1024 "agent_parser.cc" // lalr1.cc:859
+#line 1112 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 88:
-#line 409 "agent_parser.yy" // lalr1.cc:859
+  case 98:
+#line 472 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1032 "agent_parser.cc" // lalr1.cc:859
+#line 1120 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 89:
-#line 411 "agent_parser.yy" // lalr1.cc:859
+  case 99:
+#line 474 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-name", name);
     ctx.leave();
 }
-#line 1042 "agent_parser.cc" // lalr1.cc:859
+#line 1130 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 90:
-#line 418 "agent_parser.yy" // lalr1.cc:859
+  case 100:
+#line 481 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.SOCKET_TYPE);
 }
-#line 1050 "agent_parser.cc" // lalr1.cc:859
+#line 1138 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 91:
-#line 420 "agent_parser.yy" // lalr1.cc:859
+  case 101:
+#line 483 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("socket-type", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1059 "agent_parser.cc" // lalr1.cc:859
+#line 1147 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 92:
-#line 426 "agent_parser.yy" // lalr1.cc:859
+  case 102:
+#line 489 "agent_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("unix", ctx.loc2pos(yystack_[0].location))); }
-#line 1065 "agent_parser.cc" // lalr1.cc:859
+#line 1153 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 93:
-#line 432 "agent_parser.yy" // lalr1.cc:859
+  case 103:
+#line 495 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1073 "agent_parser.cc" // lalr1.cc:859
+#line 1161 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 94:
-#line 434 "agent_parser.yy" // lalr1.cc:859
+  case 104:
+#line 497 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1082 "agent_parser.cc" // lalr1.cc:859
+#line 1170 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 95:
-#line 439 "agent_parser.yy" // lalr1.cc:859
+  case 105:
+#line 502 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1090 "agent_parser.cc" // lalr1.cc:859
+#line 1178 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 96:
-#line 441 "agent_parser.yy" // lalr1.cc:859
+  case 106:
+#line 504 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1099 "agent_parser.cc" // lalr1.cc:859
+#line 1187 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 97:
-#line 446 "agent_parser.yy" // lalr1.cc:859
+  case 107:
+#line 509 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1107 "agent_parser.cc" // lalr1.cc:859
+#line 1195 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 98:
-#line 448 "agent_parser.yy" // lalr1.cc:859
+  case 108:
+#line 511 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1116 "agent_parser.cc" // lalr1.cc:859
+#line 1204 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 99:
-#line 458 "agent_parser.yy" // lalr1.cc:859
+  case 109:
+#line 521 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("Logging", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.LOGGING);
 }
-#line 1127 "agent_parser.cc" // lalr1.cc:859
+#line 1215 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 100:
-#line 463 "agent_parser.yy" // lalr1.cc:859
+  case 110:
+#line 526 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1136 "agent_parser.cc" // lalr1.cc:859
+#line 1224 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 104:
-#line 480 "agent_parser.yy" // lalr1.cc:859
+  case 114:
+#line 543 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("loggers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.LOGGERS);
 }
-#line 1147 "agent_parser.cc" // lalr1.cc:859
+#line 1235 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 105:
-#line 485 "agent_parser.yy" // lalr1.cc:859
+  case 115:
+#line 548 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1156 "agent_parser.cc" // lalr1.cc:859
+#line 1244 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 108:
-#line 497 "agent_parser.yy" // lalr1.cc:859
+  case 118:
+#line 560 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(l);
     ctx.stack_.push_back(l);
 }
-#line 1166 "agent_parser.cc" // lalr1.cc:859
+#line 1254 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 109:
-#line 501 "agent_parser.yy" // lalr1.cc:859
+  case 119:
+#line 564 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1174 "agent_parser.cc" // lalr1.cc:859
+#line 1262 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 117:
-#line 516 "agent_parser.yy" // lalr1.cc:859
+  case 129:
+#line 581 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1182 "agent_parser.cc" // lalr1.cc:859
+#line 1270 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 118:
-#line 518 "agent_parser.yy" // lalr1.cc:859
+  case 130:
+#line 583 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("name", name);
     ctx.leave();
 }
-#line 1192 "agent_parser.cc" // lalr1.cc:859
+#line 1280 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 119:
-#line 524 "agent_parser.yy" // lalr1.cc:859
+  case 131:
+#line 589 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("debuglevel", dl);
 }
-#line 1201 "agent_parser.cc" // lalr1.cc:859
+#line 1289 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 120:
-#line 529 "agent_parser.yy" // lalr1.cc:859
+  case 132:
+#line 594 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1209 "agent_parser.cc" // lalr1.cc:859
+#line 1297 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 121:
-#line 531 "agent_parser.yy" // lalr1.cc:859
+  case 133:
+#line 596 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("severity", sev);
     ctx.leave();
 }
-#line 1219 "agent_parser.cc" // lalr1.cc:859
+#line 1307 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 122:
-#line 537 "agent_parser.yy" // lalr1.cc:859
+  case 134:
+#line 602 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output_options", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OUTPUT_OPTIONS);
 }
-#line 1230 "agent_parser.cc" // lalr1.cc:859
+#line 1318 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 123:
-#line 542 "agent_parser.yy" // lalr1.cc:859
+  case 135:
+#line 607 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1239 "agent_parser.cc" // lalr1.cc:859
+#line 1327 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 126:
-#line 551 "agent_parser.yy" // lalr1.cc:859
+  case 138:
+#line 616 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1249 "agent_parser.cc" // lalr1.cc:859
+#line 1337 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 127:
-#line 555 "agent_parser.yy" // lalr1.cc:859
+  case 139:
+#line 620 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1257 "agent_parser.cc" // lalr1.cc:859
+#line 1345 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 134:
-#line 569 "agent_parser.yy" // lalr1.cc:859
+  case 146:
+#line 634 "agent_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1265 "agent_parser.cc" // lalr1.cc:859
+#line 1353 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 135:
-#line 571 "agent_parser.yy" // lalr1.cc:859
+  case 147:
+#line 636 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output", sev);
     ctx.leave();
 }
-#line 1275 "agent_parser.cc" // lalr1.cc:859
+#line 1363 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 136:
-#line 577 "agent_parser.yy" // lalr1.cc:859
+  case 148:
+#line 642 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("flush", flush);
 }
-#line 1284 "agent_parser.cc" // lalr1.cc:859
+#line 1372 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 137:
-#line 582 "agent_parser.yy" // lalr1.cc:859
+  case 149:
+#line 647 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxsize", maxsize);
 }
-#line 1293 "agent_parser.cc" // lalr1.cc:859
+#line 1381 "agent_parser.cc" // lalr1.cc:859
     break;
 
-  case 138:
-#line 587 "agent_parser.yy" // lalr1.cc:859
+  case 150:
+#line 652 "agent_parser.yy" // lalr1.cc:859
     {
     ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxver", maxver);
 }
-#line 1302 "agent_parser.cc" // lalr1.cc:859
+#line 1390 "agent_parser.cc" // lalr1.cc:859
     break;
 
 
-#line 1306 "agent_parser.cc" // lalr1.cc:859
+#line 1394 "agent_parser.cc" // lalr1.cc:859
             default:
               break;
             }
@@ -1557,190 +1645,202 @@ namespace isc { namespace agent {
   }
 
 
-  const signed char AgentParser::yypact_ninf_ = -77;
+  const signed char AgentParser::yypact_ninf_ = -68;
 
   const signed char AgentParser::yytable_ninf_ = -1;
 
   const short int
   AgentParser::yypact_[] =
   {
-      45,   -77,   -77,   -77,     6,     0,     7,    17,   -77,   -77,
-     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,
-     -77,   -77,   -77,   -77,     0,   -17,    -8,     8,   -77,    30,
-      61,    82,    68,    84,   -77,   -77,   -77,   -77,   -77,    85,
-     -77,     5,   -77,   -77,   -77,   -77,   -77,   -77,   -77,    86,
-      87,   -77,   -77,    15,   -77,   -77,   -77,   -77,   -77,   -77,
-       0,     0,   -77,    53,    89,    90,    91,    92,    93,   -77,
-      -8,   -77,    94,    48,    95,    96,     8,   -77,   -77,   -77,
-     100,    98,    99,     0,     0,     0,   -77,    69,   -77,   -77,
-     102,   -77,     0,     8,    75,   -77,   -77,   -77,   -77,    -4,
-     103,   -77,    43,   -77,    49,   -77,   -77,   -77,   -77,   -77,
-     -77,    50,   -77,   -77,   -77,   -77,   -77,   105,   106,   -77,
-     -77,   108,    75,   -77,   109,   110,   111,    -4,   -77,    -5,
-     -77,   103,   112,   -77,   113,   114,   115,   -77,   -77,   -77,
-     -77,    51,   -77,   -77,   -77,   -77,   116,   -14,   -14,   -14,
-     120,   121,    34,   -77,   -77,    72,   -77,   -77,   -77,    60,
-     -77,   -77,   -77,    62,    63,    77,     0,   -77,     4,   116,
-     -77,   122,   123,   -14,   -77,   -77,   -77,   -77,   -77,   -77,
-     -77,   124,   -77,   -77,    64,   -77,   -77,   -77,   -77,   -77,
-     -77,    79,   117,   -77,   125,   126,    97,   127,     4,   -77,
-     -77,   -77,   -77,    80,   128,   -77,   101,   -77,   -77,   131,
-     -77,   -77,    74,   -77,    18,   131,   -77,   -77,   130,   135,
-     137,    71,   -77,   -77,   -77,   -77,   -77,   -77,   140,   104,
-     107,   118,    18,   -77,   129,   -77,   -77,   -77,   -77,   -77
+      59,   -68,   -68,   -68,     6,     8,     9,    34,   -68,   -68,
+     -68,   -68,   -68,   -68,   -68,   -68,   -68,   -68,   -68,   -68,
+     -68,   -68,   -68,   -68,     8,   -29,    -5,    -4,   -68,    41,
+      51,    98,    85,   100,   -68,   -68,   -68,   -68,   -68,   101,
+     -68,    11,   -68,   -68,   -68,   -68,   -68,   -68,   -68,   102,
+     -68,   -68,   103,   -68,   -68,    21,   -68,   -68,   -68,   -68,
+     -68,   -68,   -68,   -68,     8,     8,   -68,    63,   104,   105,
+     106,   107,   109,   -68,    -5,   -68,   111,    74,   113,   114,
+     112,   116,    -4,   -68,   -68,   -68,   117,   115,   118,     8,
+       8,     8,   -68,    83,   -68,   119,    87,   -68,   122,   -68,
+       8,    -4,    97,   -68,   -68,   -68,   -68,   -68,   -68,   -68,
+       5,   123,   -68,    64,   -68,    65,   -68,   -68,   -68,   -68,
+     -68,   -68,    71,   -68,   -68,   -68,   -68,   -68,   125,   126,
+     -68,   -68,   128,    97,   -68,   129,   130,   131,     5,   -68,
+      37,   -68,   123,   132,   -68,   133,   134,   135,   -68,   -68,
+     -68,   -68,    78,   -68,   -68,   -68,   -68,   136,    14,    14,
+      14,   140,   141,    42,   -68,   -68,    32,   -68,   -68,   -68,
+     -68,   -68,   -68,    79,   -68,   -68,   -68,    80,    82,    95,
+       8,   -68,    12,   136,   -68,   142,   143,    14,   -68,   -68,
+     -68,   -68,   -68,   -68,   -68,   144,   -68,   -68,   -68,   -68,
+      86,   -68,   -68,   -68,   -68,   -68,   -68,   108,   138,   -68,
+     146,   147,    96,   148,    12,   -68,   -68,   -68,   -68,   120,
+     149,   -68,   121,   -68,   -68,   156,   -68,   -68,    89,   -68,
+      30,   156,   -68,   -68,   151,   160,   161,    88,   -68,   -68,
+     -68,   -68,   -68,   -68,   162,   124,   127,   137,    30,   -68,
+     139,   -68,   -68,   -68,   -68,   -68
   };
 
   const unsigned char
   AgentParser::yydefact_[] =
   {
-       0,     2,     4,     6,     0,     0,     0,     0,     1,    24,
+       0,     2,     4,     6,     0,     0,     0,     0,     1,    25,
       18,    15,    14,    11,    12,    13,     3,    10,    16,    17,
-      31,     5,     8,     7,    26,    20,     0,     0,    28,     0,
-      27,     0,     0,    21,    41,    99,    93,    95,    97,     0,
-      40,     0,    33,    35,    37,    38,    39,    36,    50,     0,
-       0,    53,    49,     0,    43,    45,    46,    48,    47,    25,
-       0,     0,    19,     0,     0,     0,     0,     0,     0,    30,
-       0,    32,     0,     0,     0,     0,     0,     9,    29,    22,
-       0,     0,     0,     0,     0,     0,    34,     0,    52,    70,
-       0,    44,     0,     0,     0,    94,    96,    98,    51,     0,
-      55,    23,     0,   104,     0,   101,   103,    78,    80,    82,
-      77,     0,    72,    74,    75,    76,    59,     0,    56,    57,
-      42,     0,     0,   100,     0,     0,     0,     0,    71,     0,
-      54,     0,     0,   102,     0,     0,     0,    73,    66,    68,
-      63,     0,    61,    64,    65,    58,     0,     0,     0,     0,
-       0,     0,     0,    60,   108,     0,   106,    88,    90,     0,
-      84,    86,    87,     0,     0,     0,     0,    62,     0,     0,
-     105,     0,     0,     0,    79,    81,    83,    67,    69,   117,
-     122,     0,   120,   116,     0,   110,   112,   114,   115,   113,
-     107,     0,     0,    85,     0,     0,     0,     0,     0,   109,
-      89,    92,    91,     0,     0,   119,     0,   111,   118,     0,
-     121,   126,     0,   124,     0,     0,   123,   134,     0,     0,
-       0,     0,   128,   130,   131,   132,   133,   125,     0,     0,
-       0,     0,     0,   127,     0,   136,   137,   138,   129,   135
+      32,     5,     8,     7,    27,    21,     0,     0,    29,     0,
+      28,     0,     0,    22,    42,   109,   103,   105,   107,     0,
+      41,     0,    34,    36,    38,    39,    40,    37,    53,     0,
+      56,    58,     0,    60,    52,     0,    44,    46,    47,    50,
+      51,    49,    48,    26,     0,     0,    19,     0,     0,     0,
+       0,     0,     0,    31,     0,    33,     0,     0,     0,     0,
+       0,     0,     0,     9,    30,    23,     0,     0,     0,     0,
+       0,     0,    35,     0,    55,     0,     0,    77,     0,    45,
+       0,     0,     0,   104,   106,   108,    54,    20,    57,    59,
+       0,    62,    24,     0,   114,     0,   111,   113,    85,    87,
+      89,    84,     0,    79,    81,    82,    83,    66,     0,    63,
+      64,    43,     0,     0,   110,     0,     0,     0,     0,    78,
+       0,    61,     0,     0,   112,     0,     0,     0,    80,    73,
+      75,    70,     0,    68,    71,    72,    65,     0,     0,     0,
+       0,     0,     0,     0,    67,   118,     0,   116,    98,   100,
+      97,    95,    96,     0,    91,    93,    94,     0,     0,     0,
+       0,    69,     0,     0,   115,     0,     0,     0,    86,    88,
+      90,    74,    76,   129,   134,     0,   132,   128,   126,   127,
+       0,   120,   122,   124,   125,   123,   117,     0,     0,    92,
+       0,     0,     0,     0,     0,   119,    99,   102,   101,     0,
+       0,   131,     0,   121,   130,     0,   133,   138,     0,   136,
+       0,     0,   135,   146,     0,     0,     0,     0,   140,   142,
+     143,   144,   145,   137,     0,     0,     0,     0,     0,   139,
+       0,   148,   149,   150,   141,   147
   };
 
   const signed char
   AgentParser::yypgoto_[] =
   {
-     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -23,   -77,
-     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -26,   -77,   -77,
-     -77,    65,   -77,   -77,    39,    73,   -77,   -77,   -77,   -77,
-     -77,   -77,   -77,    14,   -77,   -77,    -2,   -77,   -77,   -77,
-     -77,   -77,   -77,   -77,    21,   -77,   -77,   -77,   -77,   -77,
-     -77,   -64,   -22,   -77,   -77,   -77,   -77,   -77,   -77,   -77,
-     -77,   -77,   -77,   -77,   -77,   -77,   -77,    31,   -77,   -77,
-     -77,   -15,   -77,   -77,   -46,   -77,   -77,   -77,   -77,   -77,
-     -77,   -77,   -77,   -60,   -77,   -77,   -76,   -77,   -77,   -77,
-     -77,   -77
+     -68,   -68,   -68,   -68,   -68,   -68,   -68,   -68,   -20,    44,
+     -68,   -68,   -68,   -68,   -68,   -68,   -68,   -68,   -26,   -68,
+     -68,   -68,    93,   -68,   -68,    52,    90,   -68,   -68,   -68,
+     -25,   -68,   -24,   -68,   -68,   -68,   -68,   -68,    28,   -68,
+     -68,    10,   -68,   -68,   -68,   -68,   -68,   -68,   -68,    33,
+     -68,   -68,   -68,   -68,   -68,   -68,   -59,   -13,   -68,   -68,
+     -68,   -68,   -68,   -68,   -68,   -68,   -68,   -68,   -68,   -68,
+     -68,   -68,    43,   -68,   -68,   -68,    -8,   -68,   -68,   -37,
+     -68,   -68,   -68,   -68,   -68,   -68,   -68,   -68,   -53,   -68,
+     -68,   -67,   -68,   -68,   -68,   -68,   -68
   };
 
   const short int
   AgentParser::yydefgoto_[] =
   {
       -1,     4,     5,     6,     7,    23,    27,    16,    17,    18,
-      25,    32,    33,    19,    24,    29,    30,    52,    21,    26,
-      41,    42,    43,    64,    53,    54,    55,    72,    56,    57,
-      75,   117,   118,   119,   129,   141,   142,   143,   150,   144,
-     151,    58,    99,   111,   112,   113,   124,   114,   125,   115,
-     126,   159,   160,   161,   171,   162,   172,   202,    44,    66,
-      45,    67,    46,    68,    47,    65,   104,   105,   106,   121,
-     155,   156,   168,   184,   185,   186,   194,   187,   188,   197,
-     189,   195,   212,   213,   214,   221,   222,   223,   228,   224,
-     225,   226
+      25,   108,    32,    33,    19,    24,    29,    30,   170,    21,
+      26,    41,    42,    43,    68,    55,    56,    57,    76,    58,
+     171,    78,   172,    79,    61,    81,   128,   129,   130,   140,
+     152,   153,   154,   161,   155,   162,    62,   110,   122,   123,
+     124,   135,   125,   136,   126,   137,   173,   174,   175,   185,
+     176,   186,   218,    44,    70,    45,    71,    46,    72,    47,
+      69,   115,   116,   117,   132,   166,   167,   182,   200,   201,
+     202,   210,   203,   204,   213,   205,   211,   228,   229,   230,
+     237,   238,   239,   244,   240,   241,   242
   };
 
   const unsigned char
   AgentParser::yytable_[] =
   {
-      40,    28,    34,   157,   158,     9,     8,    10,    70,    11,
-     107,   108,   109,    71,    20,    35,   138,   139,    76,    48,
-      49,    50,    31,    77,    22,    36,    37,    38,    51,   179,
-     180,    39,   181,   182,    39,    39,    59,    78,    79,    12,
-      13,    14,    15,    39,    40,   217,    76,    39,   218,   219,
-     220,   120,   122,   127,   152,   138,   139,   123,   128,   153,
-      95,    96,    97,   173,    60,   173,   173,   198,   174,   101,
-     175,   176,   199,   110,   232,   169,    62,   215,   170,   233,
-     216,     1,     2,     3,   163,   164,    61,    63,    88,    69,
-      73,    74,    80,    81,    82,    83,    84,    85,    87,   103,
-      90,   110,    89,   140,    92,    93,    94,   100,    98,   131,
-     116,   130,   132,   134,   135,   136,   177,   146,   200,   208,
-     147,   148,   149,   154,   165,   166,   191,   192,   196,   203,
-     204,   206,   102,   209,   229,    86,   201,   205,   211,   230,
-     210,   231,   183,   178,   234,   145,   235,   236,   137,    91,
-     167,   193,   207,   133,   190,   227,   238,     0,   237,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   239,     0,
-       0,     0,   183
+      40,    54,    59,    60,    28,    34,     8,    48,    49,    50,
+      51,    52,    31,     9,    74,    10,    20,    11,    53,    75,
+      35,   118,   119,   120,    82,    50,    51,    50,    51,    83,
+      36,    37,    38,   168,   169,   183,    39,    39,   184,   193,
+     194,    22,   195,   196,    84,    85,    39,    63,    40,    12,
+      13,    14,    15,    39,    64,    39,    54,    59,    60,   233,
+     149,   150,   234,   235,   236,   149,   150,    82,   133,   103,
+     104,   105,   131,   134,   138,    54,    59,    60,    39,   139,
+     112,   163,   187,   187,   121,   187,   164,   188,   189,   214,
+     190,   248,   231,    66,   215,   232,   249,     1,     2,     3,
+     177,   178,    65,    67,    86,    73,    77,    80,    87,    88,
+      89,    90,   121,    91,   151,    93,    94,    95,    96,    97,
+      98,   100,   101,   114,   106,   102,    10,   111,   109,   142,
+     127,   141,   143,   145,   146,   147,   191,   157,   221,   107,
+     158,   159,   160,   165,   179,   180,   207,   208,   212,   216,
+     219,   220,   222,   113,   225,   245,   197,   198,   199,   217,
+     192,   224,   226,   227,   246,   247,   250,    92,   251,   252,
+     156,   148,    99,   181,   209,   206,   144,   223,   243,   253,
+     255,   254,     0,     0,     0,     0,     0,     0,   197,   198,
+     199
   };
 
   const short int
   AgentParser::yycheck_[] =
   {
-      26,    24,    10,    17,    18,     5,     0,     7,     3,     9,
-      14,    15,    16,     8,     7,    23,    21,    22,     3,    11,
-      12,    13,    39,     8,     7,    33,    34,    35,    20,    25,
-      26,    39,    28,    29,    39,    39,     6,    60,    61,    39,
-      40,    41,    42,    39,    70,    27,     3,    39,    30,    31,
-      32,     8,     3,     3,     3,    21,    22,     8,     8,     8,
-      83,    84,    85,     3,     3,     3,     3,     3,     8,    92,
-       8,     8,     8,    99,     3,     3,     8,     3,     6,     8,
-       6,    36,    37,    38,   148,   149,     4,     3,    40,     4,
-       4,     4,    39,     4,     4,     4,     4,     4,     4,    24,
-       4,   127,     7,   129,     4,     7,     7,     5,    39,     3,
-       7,     6,     4,     4,     4,     4,    39,     5,    39,    39,
-       7,     7,     7,     7,     4,     4,     4,     4,     4,     4,
-       4,     4,    93,     5,     4,    70,    19,    40,     7,     4,
-      39,     4,   168,   166,     4,   131,    42,    40,   127,    76,
-     152,   173,   198,   122,   169,   215,   232,    -1,    40,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,
-      -1,    -1,   198
+      26,    27,    27,    27,    24,    10,     0,    11,    12,    13,
+      14,    15,    41,     5,     3,     7,     7,     9,    22,     8,
+      25,    16,    17,    18,     3,    13,    14,    13,    14,     8,
+      35,    36,    37,    19,    20,     3,    41,    41,     6,    27,
+      28,     7,    30,    31,    64,    65,    41,     6,    74,    41,
+      42,    43,    44,    41,     3,    41,    82,    82,    82,    29,
+      23,    24,    32,    33,    34,    23,    24,     3,     3,    89,
+      90,    91,     8,     8,     3,   101,   101,   101,    41,     8,
+     100,     3,     3,     3,   110,     3,     8,     8,     8,     3,
+       8,     3,     3,     8,     8,     6,     8,    38,    39,    40,
+     159,   160,     4,     3,    41,     4,     4,     4,     4,     4,
+       4,     4,   138,     4,   140,     4,    42,     4,     4,     7,
+       4,     4,     7,    26,    41,     7,     7,     5,    41,     3,
+       7,     6,     4,     4,     4,     4,    41,     5,    42,    95,
+       7,     7,     7,     7,     4,     4,     4,     4,     4,    41,
+       4,     4,     4,   101,     5,     4,   182,   182,   182,    21,
+     180,    41,    41,     7,     4,     4,     4,    74,    44,    42,
+     142,   138,    82,   163,   187,   183,   133,   214,   231,    42,
+      41,   248,    -1,    -1,    -1,    -1,    -1,    -1,   214,   214,
+     214
   };
 
   const unsigned char
   AgentParser::yystos_[] =
   {
-       0,    36,    37,    38,    44,    45,    46,    47,     0,     5,
-       7,     9,    39,    40,    41,    42,    50,    51,    52,    56,
-       7,    61,     7,    48,    57,    53,    62,    49,    51,    58,
-      59,    39,    54,    55,    10,    23,    33,    34,    35,    39,
-      60,    63,    64,    65,   101,   103,   105,   107,    11,    12,
-      13,    20,    60,    67,    68,    69,    71,    72,    84,     6,
-       3,     4,     8,     3,    66,   108,   102,   104,   106,     4,
-       3,     8,    70,     4,     4,    73,     3,     8,    51,    51,
-      39,     4,     4,     4,     4,     4,    64,     4,    40,     7,
-       4,    68,     4,     7,     7,    51,    51,    51,    39,    85,
-       5,    51,    67,    24,   109,   110,   111,    14,    15,    16,
-      60,    86,    87,    88,    90,    92,     7,    74,    75,    76,
-       8,   112,     3,     8,    89,    91,    93,     3,     8,    77,
-       6,     3,     4,   110,     4,     4,     4,    87,    21,    22,
-      60,    78,    79,    80,    82,    76,     5,     7,     7,     7,
-      81,    83,     3,     8,     7,   113,   114,    17,    18,    94,
-      95,    96,    98,    94,    94,     4,     4,    79,   115,     3,
-       6,    97,    99,     3,     8,     8,     8,    39,    51,    25,
-      26,    28,    29,    60,   116,   117,   118,   120,   121,   123,
-     114,     4,     4,    95,   119,   124,     4,   122,     3,     8,
-      39,    19,   100,     4,     4,    40,     4,   117,    39,     5,
-      39,     7,   125,   126,   127,     3,     6,    27,    30,    31,
-      32,   128,   129,   130,   132,   133,   134,   126,   131,     4,
-       4,     4,     3,     8,     4,    42,    40,    40,   129,    39
+       0,    38,    39,    40,    46,    47,    48,    49,     0,     5,
+       7,     9,    41,    42,    43,    44,    52,    53,    54,    59,
+       7,    64,     7,    50,    60,    55,    65,    51,    53,    61,
+      62,    41,    57,    58,    10,    25,    35,    36,    37,    41,
+      63,    66,    67,    68,   108,   110,   112,   114,    11,    12,
+      13,    14,    15,    22,    63,    70,    71,    72,    74,    75,
+      77,    79,    91,     6,     3,     4,     8,     3,    69,   115,
+     109,   111,   113,     4,     3,     8,    73,     4,    76,    78,
+       4,    80,     3,     8,    53,    53,    41,     4,     4,     4,
+       4,     4,    67,     4,    42,     4,     4,     7,     4,    71,
+       4,     7,     7,    53,    53,    53,    41,    54,    56,    41,
+      92,     5,    53,    70,    26,   116,   117,   118,    16,    17,
+      18,    63,    93,    94,    95,    97,    99,     7,    81,    82,
+      83,     8,   119,     3,     8,    96,    98,   100,     3,     8,
+      84,     6,     3,     4,   117,     4,     4,     4,    94,    23,
+      24,    63,    85,    86,    87,    89,    83,     5,     7,     7,
+       7,    88,    90,     3,     8,     7,   120,   121,    19,    20,
+      63,    75,    77,   101,   102,   103,   105,   101,   101,     4,
+       4,    86,   122,     3,     6,   104,   106,     3,     8,     8,
+       8,    41,    53,    27,    28,    30,    31,    63,    75,    77,
+     123,   124,   125,   127,   128,   130,   121,     4,     4,   102,
+     126,   131,     4,   129,     3,     8,    41,    21,   107,     4,
+       4,    42,     4,   124,    41,     5,    41,     7,   132,   133,
+     134,     3,     6,    29,    32,    33,    34,   135,   136,   137,
+     139,   140,   141,   133,   138,     4,     4,     4,     3,     8,
+       4,    44,    42,    42,   136,    41
   };
 
   const unsigned char
   AgentParser::yyr1_[] =
   {
-       0,    43,    45,    44,    46,    44,    47,    44,    49,    48,
-      50,    51,    51,    51,    51,    51,    51,    51,    53,    52,
-      54,    54,    55,    55,    57,    56,    58,    58,    59,    59,
-      60,    62,    61,    63,    63,    64,    64,    64,    64,    64,
-      64,    66,    65,    67,    67,    68,    68,    68,    68,    68,
-      70,    69,    71,    73,    72,    74,    74,    75,    75,    77,
-      76,    78,    78,    78,    79,    79,    81,    80,    83,    82,
-      85,    84,    86,    86,    87,    87,    87,    87,    89,    88,
-      91,    90,    93,    92,    94,    94,    95,    95,    97,    96,
-      99,    98,   100,   102,   101,   104,   103,   106,   105,   108,
-     107,   109,   109,   110,   112,   111,   113,   113,   115,   114,
-     116,   116,   117,   117,   117,   117,   117,   119,   118,   120,
-     122,   121,   124,   123,   125,   125,   127,   126,   128,   128,
-     129,   129,   129,   129,   131,   130,   132,   133,   134
+       0,    45,    47,    46,    48,    46,    49,    46,    51,    50,
+      52,    53,    53,    53,    53,    53,    53,    53,    55,    54,
+      56,    57,    57,    58,    58,    60,    59,    61,    61,    62,
+      62,    63,    65,    64,    66,    66,    67,    67,    67,    67,
+      67,    67,    69,    68,    70,    70,    71,    71,    71,    71,
+      71,    71,    71,    73,    72,    74,    76,    75,    78,    77,
+      80,    79,    81,    81,    82,    82,    84,    83,    85,    85,
+      85,    86,    86,    88,    87,    90,    89,    92,    91,    93,
+      93,    94,    94,    94,    94,    96,    95,    98,    97,   100,
+      99,   101,   101,   102,   102,   102,   102,   102,   104,   103,
+     106,   105,   107,   109,   108,   111,   110,   113,   112,   115,
+     114,   116,   116,   117,   119,   118,   120,   120,   122,   121,
+     123,   123,   124,   124,   124,   124,   124,   124,   124,   126,
+     125,   127,   129,   128,   131,   130,   132,   132,   134,   133,
+     135,   135,   136,   136,   136,   136,   138,   137,   139,   140,
+     141
   };
 
   const unsigned char
@@ -1748,18 +1848,20 @@ namespace isc { namespace agent {
   {
        0,     2,     0,     3,     0,     3,     0,     3,     0,     4,
        1,     1,     1,     1,     1,     1,     1,     1,     0,     4,
-       0,     1,     3,     5,     0,     4,     0,     1,     1,     3,
-       2,     0,     4,     1,     3,     1,     1,     1,     1,     1,
-       1,     0,     6,     1,     3,     1,     1,     1,     1,     1,
-       0,     4,     3,     0,     6,     0,     1,     1,     3,     0,
-       4,     1,     3,     1,     1,     1,     0,     4,     0,     4,
-       0,     6,     1,     3,     1,     1,     1,     1,     0,     6,
-       0,     6,     0,     6,     1,     3,     1,     1,     0,     4,
+       1,     0,     1,     3,     5,     0,     4,     0,     1,     1,
+       3,     2,     0,     4,     1,     3,     1,     1,     1,     1,
+       1,     1,     0,     6,     1,     3,     1,     1,     1,     1,
+       1,     1,     1,     0,     4,     3,     0,     4,     0,     4,
+       0,     6,     0,     1,     1,     3,     0,     4,     1,     3,
+       1,     1,     1,     0,     4,     0,     4,     0,     6,     1,
+       3,     1,     1,     1,     1,     0,     6,     0,     6,     0,
+       6,     1,     3,     1,     1,     1,     1,     1,     0,     4,
        0,     4,     1,     0,     4,     0,     4,     0,     4,     0,
        6,     1,     3,     1,     0,     6,     1,     3,     0,     4,
-       1,     3,     1,     1,     1,     1,     1,     0,     4,     3,
-       0,     4,     0,     6,     1,     3,     0,     4,     1,     3,
-       1,     1,     1,     1,     0,     4,     3,     3,     3
+       1,     3,     1,     1,     1,     1,     1,     1,     1,     0,
+       4,     3,     0,     4,     0,     6,     1,     3,     0,     4,
+       1,     3,     1,     1,     1,     1,     0,     4,     3,     3,
+       3
   };
 
 
@@ -1771,53 +1873,57 @@ namespace isc { namespace agent {
   {
   "\"end of file\"", "error", "$undefined", "\",\"", "\":\"", "\"[\"",
   "\"]\"", "\"{\"", "\"}\"", "\"null\"", "\"Control-agent\"",
-  "\"http-host\"", "\"http-port\"", "\"control-sockets\"", "\"dhcp4\"",
-  "\"dhcp6\"", "\"d2\"", "\"socket-name\"", "\"socket-type\"", "\"unix\"",
-  "\"hooks-libraries\"", "\"library\"", "\"parameters\"", "\"Logging\"",
-  "\"loggers\"", "\"name\"", "\"output_options\"", "\"output\"",
-  "\"debuglevel\"", "\"severity\"", "\"flush\"", "\"maxsize\"",
-  "\"maxver\"", "\"Dhcp4\"", "\"Dhcp6\"", "\"DhcpDdns\"", "START_JSON",
-  "START_AGENT", "START_SUB_AGENT", "\"constant string\"", "\"integer\"",
+  "\"http-host\"", "\"http-port\"", "\"user-context\"", "\"comment\"",
+  "\"control-sockets\"", "\"dhcp4\"", "\"dhcp6\"", "\"d2\"",
+  "\"socket-name\"", "\"socket-type\"", "\"unix\"", "\"hooks-libraries\"",
+  "\"library\"", "\"parameters\"", "\"Logging\"", "\"loggers\"",
+  "\"name\"", "\"output_options\"", "\"output\"", "\"debuglevel\"",
+  "\"severity\"", "\"flush\"", "\"maxsize\"", "\"maxver\"", "\"Dhcp4\"",
+  "\"Dhcp6\"", "\"DhcpDdns\"", "START_JSON", "START_AGENT",
+  "START_SUB_AGENT", "\"constant string\"", "\"integer\"",
   "\"floating point\"", "\"boolean\"", "$accept", "start", "$@1", "$@2",
-  "$@3", "sub_agent", "$@4", "json", "value", "map", "$@5", "map_content",
-  "not_empty_map", "list_generic", "$@6", "list_content", "not_empty_list",
-  "unknown_map_entry", "agent_syntax_map", "$@7", "global_objects",
-  "global_object", "agent_object", "$@8", "global_params", "global_param",
-  "http_host", "$@9", "http_port", "hooks_libraries", "$@10",
+  "$@3", "sub_agent", "$@4", "json", "value", "map", "$@5", "map_value",
+  "map_content", "not_empty_map", "list_generic", "$@6", "list_content",
+  "not_empty_list", "unknown_map_entry", "agent_syntax_map", "$@7",
+  "global_objects", "global_object", "agent_object", "$@8",
+  "global_params", "global_param", "http_host", "$@9", "http_port",
+  "user_context", "$@10", "comment", "$@11", "hooks_libraries", "$@12",
   "hooks_libraries_list", "not_empty_hooks_libraries_list",
-  "hooks_library", "$@11", "hooks_params", "hooks_param", "library",
-  "$@12", "parameters", "$@13", "control_sockets", "$@14",
+  "hooks_library", "$@13", "hooks_params", "hooks_param", "library",
+  "$@14", "parameters", "$@15", "control_sockets", "$@16",
   "control_sockets_params", "control_socket", "dhcp4_server_socket",
-  "$@15", "dhcp6_server_socket", "$@16", "d2_server_socket", "$@17",
-  "control_socket_params", "control_socket_param", "socket_name", "$@18",
-  "socket_type", "$@19", "socket_type_value", "dhcp4_json_object", "$@20",
-  "dhcp6_json_object", "$@21", "dhcpddns_json_object", "$@22",
-  "logging_object", "$@23", "logging_params", "logging_param", "loggers",
-  "$@24", "loggers_entries", "logger_entry", "$@25", "logger_params",
-  "logger_param", "name", "$@26", "debuglevel", "severity", "$@27",
-  "output_options_list", "$@28", "output_options_list_content",
-  "output_entry", "$@29", "output_params_list", "output_params", "output",
-  "$@30", "flush", "maxsize", "maxver", YY_NULLPTR
+  "$@17", "dhcp6_server_socket", "$@18", "d2_server_socket", "$@19",
+  "control_socket_params", "control_socket_param", "socket_name", "$@20",
+  "socket_type", "$@21", "socket_type_value", "dhcp4_json_object", "$@22",
+  "dhcp6_json_object", "$@23", "dhcpddns_json_object", "$@24",
+  "logging_object", "$@25", "logging_params", "logging_param", "loggers",
+  "$@26", "loggers_entries", "logger_entry", "$@27", "logger_params",
+  "logger_param", "name", "$@28", "debuglevel", "severity", "$@29",
+  "output_options_list", "$@30", "output_options_list_content",
+  "output_entry", "$@31", "output_params_list", "output_params", "output",
+  "$@32", "flush", "maxsize", "maxver", YY_NULLPTR
   };
 
 #if AGENT_DEBUG
   const unsigned short int
   AgentParser::yyrline_[] =
   {
-       0,   110,   110,   110,   111,   111,   112,   112,   120,   120,
-     131,   137,   138,   139,   140,   141,   142,   143,   147,   147,
-     161,   162,   170,   174,   181,   181,   187,   188,   191,   195,
-     208,   217,   217,   229,   230,   234,   235,   236,   237,   238,
-     239,   243,   243,   260,   261,   266,   267,   268,   269,   270,
-     273,   273,   281,   287,   287,   297,   298,   301,   302,   305,
-     305,   313,   314,   315,   318,   319,   322,   322,   330,   330,
-     340,   340,   353,   354,   359,   360,   361,   362,   366,   366,
-     377,   377,   388,   388,   399,   400,   404,   405,   409,   409,
-     418,   418,   426,   432,   432,   439,   439,   446,   446,   458,
-     458,   471,   472,   476,   480,   480,   492,   493,   497,   497,
-     505,   506,   509,   510,   511,   512,   513,   516,   516,   524,
-     529,   529,   537,   537,   547,   548,   551,   551,   559,   560,
-     563,   564,   565,   566,   569,   569,   577,   582,   587
+       0,   114,   114,   114,   115,   115,   116,   116,   124,   124,
+     135,   141,   142,   143,   144,   145,   146,   147,   151,   151,
+     162,   167,   168,   176,   180,   187,   187,   193,   194,   197,
+     201,   214,   223,   223,   235,   236,   240,   241,   242,   243,
+     244,   245,   249,   249,   266,   267,   272,   273,   274,   275,
+     276,   277,   278,   281,   281,   289,   294,   294,   319,   319,
+     347,   347,   357,   358,   361,   362,   365,   365,   373,   374,
+     375,   378,   379,   382,   382,   390,   390,   400,   400,   413,
+     414,   419,   420,   421,   422,   426,   426,   437,   437,   448,
+     448,   459,   460,   464,   465,   466,   467,   468,   472,   472,
+     481,   481,   489,   495,   495,   502,   502,   509,   509,   521,
+     521,   534,   535,   539,   543,   543,   555,   556,   560,   560,
+     568,   569,   572,   573,   574,   575,   576,   577,   578,   581,
+     581,   589,   594,   594,   602,   602,   612,   613,   616,   616,
+     624,   625,   628,   629,   630,   631,   634,   634,   642,   647,
+     652
   };
 
   // Print the state stack on the debug stream.
@@ -1852,8 +1958,8 @@ namespace isc { namespace agent {
 
 #line 14 "agent_parser.yy" // lalr1.cc:1167
 } } // isc::agent
-#line 1856 "agent_parser.cc" // lalr1.cc:1167
-#line 592 "agent_parser.yy" // lalr1.cc:1168
+#line 1962 "agent_parser.cc" // lalr1.cc:1167
+#line 657 "agent_parser.yy" // lalr1.cc:1168
 
 
 void
index 73de79bb9730311606c24a9318e33106b069c5ab..921e5ea1a0e32cd6abd72a90036f2ef319ab72b2 100644 (file)
@@ -304,6 +304,7 @@ namespace isc { namespace agent {
     union union_type
     {
       // value
+      // map_value
       // socket_type_value
       char dummy1[sizeof(ElementPtr)];
 
@@ -351,36 +352,38 @@ namespace isc { namespace agent {
         TOKEN_CONTROL_AGENT = 265,
         TOKEN_HTTP_HOST = 266,
         TOKEN_HTTP_PORT = 267,
-        TOKEN_CONTROL_SOCKETS = 268,
-        TOKEN_DHCP4_SERVER = 269,
-        TOKEN_DHCP6_SERVER = 270,
-        TOKEN_D2_SERVER = 271,
-        TOKEN_SOCKET_NAME = 272,
-        TOKEN_SOCKET_TYPE = 273,
-        TOKEN_UNIX = 274,
-        TOKEN_HOOKS_LIBRARIES = 275,
-        TOKEN_LIBRARY = 276,
-        TOKEN_PARAMETERS = 277,
-        TOKEN_LOGGING = 278,
-        TOKEN_LOGGERS = 279,
-        TOKEN_NAME = 280,
-        TOKEN_OUTPUT_OPTIONS = 281,
-        TOKEN_OUTPUT = 282,
-        TOKEN_DEBUGLEVEL = 283,
-        TOKEN_SEVERITY = 284,
-        TOKEN_FLUSH = 285,
-        TOKEN_MAXSIZE = 286,
-        TOKEN_MAXVER = 287,
-        TOKEN_DHCP4 = 288,
-        TOKEN_DHCP6 = 289,
-        TOKEN_DHCPDDNS = 290,
-        TOKEN_START_JSON = 291,
-        TOKEN_START_AGENT = 292,
-        TOKEN_START_SUB_AGENT = 293,
-        TOKEN_STRING = 294,
-        TOKEN_INTEGER = 295,
-        TOKEN_FLOAT = 296,
-        TOKEN_BOOLEAN = 297
+        TOKEN_USER_CONTEXT = 268,
+        TOKEN_COMMENT = 269,
+        TOKEN_CONTROL_SOCKETS = 270,
+        TOKEN_DHCP4_SERVER = 271,
+        TOKEN_DHCP6_SERVER = 272,
+        TOKEN_D2_SERVER = 273,
+        TOKEN_SOCKET_NAME = 274,
+        TOKEN_SOCKET_TYPE = 275,
+        TOKEN_UNIX = 276,
+        TOKEN_HOOKS_LIBRARIES = 277,
+        TOKEN_LIBRARY = 278,
+        TOKEN_PARAMETERS = 279,
+        TOKEN_LOGGING = 280,
+        TOKEN_LOGGERS = 281,
+        TOKEN_NAME = 282,
+        TOKEN_OUTPUT_OPTIONS = 283,
+        TOKEN_OUTPUT = 284,
+        TOKEN_DEBUGLEVEL = 285,
+        TOKEN_SEVERITY = 286,
+        TOKEN_FLUSH = 287,
+        TOKEN_MAXSIZE = 288,
+        TOKEN_MAXVER = 289,
+        TOKEN_DHCP4 = 290,
+        TOKEN_DHCP6 = 291,
+        TOKEN_DHCPDDNS = 292,
+        TOKEN_START_JSON = 293,
+        TOKEN_START_AGENT = 294,
+        TOKEN_START_SUB_AGENT = 295,
+        TOKEN_STRING = 296,
+        TOKEN_INTEGER = 297,
+        TOKEN_FLOAT = 298,
+        TOKEN_BOOLEAN = 299
       };
     };
 
@@ -539,6 +542,14 @@ namespace isc { namespace agent {
     symbol_type
     make_HTTP_PORT (const location_type& l);
 
+    static inline
+    symbol_type
+    make_USER_CONTEXT (const location_type& l);
+
+    static inline
+    symbol_type
+    make_COMMENT (const location_type& l);
+
     static inline
     symbol_type
     make_CONTROL_SOCKETS (const location_type& l);
@@ -864,12 +875,12 @@ namespace isc { namespace agent {
     enum
     {
       yyeof_ = 0,
-      yylast_ = 172,     ///< Last index in yytable_.
-      yynnts_ = 92,  ///< Number of nonterminal symbols.
+      yylast_ = 190,     ///< Last index in yytable_.
+      yynnts_ = 97,  ///< Number of nonterminal symbols.
       yyfinal_ = 8, ///< Termination state number.
       yyterror_ = 1,
       yyerrcode_ = 256,
-      yyntokens_ = 43  ///< Number of tokens.
+      yyntokens_ = 45  ///< Number of tokens.
     };
 
 
@@ -915,9 +926,9 @@ namespace isc { namespace agent {
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44
     };
-    const unsigned int user_token_number_max_ = 297;
+    const unsigned int user_token_number_max_ = 299;
     const token_number_type undef_token_ = 2;
 
     if (static_cast<int>(t) <= yyeof_)
@@ -950,24 +961,25 @@ namespace isc { namespace agent {
   {
       switch (other.type_get ())
     {
-      case 51: // value
-      case 100: // socket_type_value
+      case 53: // value
+      case 56: // map_value
+      case 107: // socket_type_value
         value.copy< ElementPtr > (other.value);
         break;
 
-      case 42: // "boolean"
+      case 44: // "boolean"
         value.copy< bool > (other.value);
         break;
 
-      case 41: // "floating point"
+      case 43: // "floating point"
         value.copy< double > (other.value);
         break;
 
-      case 40: // "integer"
+      case 42: // "integer"
         value.copy< int64_t > (other.value);
         break;
 
-      case 39: // "constant string"
+      case 41: // "constant string"
         value.copy< std::string > (other.value);
         break;
 
@@ -988,24 +1000,25 @@ namespace isc { namespace agent {
     (void) v;
       switch (this->type_get ())
     {
-      case 51: // value
-      case 100: // socket_type_value
+      case 53: // value
+      case 56: // map_value
+      case 107: // socket_type_value
         value.copy< ElementPtr > (v);
         break;
 
-      case 42: // "boolean"
+      case 44: // "boolean"
         value.copy< bool > (v);
         break;
 
-      case 41: // "floating point"
+      case 43: // "floating point"
         value.copy< double > (v);
         break;
 
-      case 40: // "integer"
+      case 42: // "integer"
         value.copy< int64_t > (v);
         break;
 
-      case 39: // "constant string"
+      case 41: // "constant string"
         value.copy< std::string > (v);
         break;
 
@@ -1085,24 +1098,25 @@ namespace isc { namespace agent {
     // Type destructor.
     switch (yytype)
     {
-      case 51: // value
-      case 100: // socket_type_value
+      case 53: // value
+      case 56: // map_value
+      case 107: // socket_type_value
         value.template destroy< ElementPtr > ();
         break;
 
-      case 42: // "boolean"
+      case 44: // "boolean"
         value.template destroy< bool > ();
         break;
 
-      case 41: // "floating point"
+      case 43: // "floating point"
         value.template destroy< double > ();
         break;
 
-      case 40: // "integer"
+      case 42: // "integer"
         value.template destroy< int64_t > ();
         break;
 
-      case 39: // "constant string"
+      case 41: // "constant string"
         value.template destroy< std::string > ();
         break;
 
@@ -1129,24 +1143,25 @@ namespace isc { namespace agent {
     super_type::move(s);
       switch (this->type_get ())
     {
-      case 51: // value
-      case 100: // socket_type_value
+      case 53: // value
+      case 56: // map_value
+      case 107: // socket_type_value
         value.move< ElementPtr > (s.value);
         break;
 
-      case 42: // "boolean"
+      case 44: // "boolean"
         value.move< bool > (s.value);
         break;
 
-      case 41: // "floating point"
+      case 43: // "floating point"
         value.move< double > (s.value);
         break;
 
-      case 40: // "integer"
+      case 42: // "integer"
         value.move< int64_t > (s.value);
         break;
 
-      case 39: // "constant string"
+      case 41: // "constant string"
         value.move< std::string > (s.value);
         break;
 
@@ -1209,7 +1224,7 @@ namespace isc { namespace agent {
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,   297
+     295,   296,   297,   298,   299
     };
     return static_cast<token_type> (yytoken_number_[type]);
   }
@@ -1280,6 +1295,18 @@ namespace isc { namespace agent {
     return symbol_type (token::TOKEN_HTTP_PORT, l);
   }
 
+  AgentParser::symbol_type
+  AgentParser::make_USER_CONTEXT (const location_type& l)
+  {
+    return symbol_type (token::TOKEN_USER_CONTEXT, l);
+  }
+
+  AgentParser::symbol_type
+  AgentParser::make_COMMENT (const location_type& l)
+  {
+    return symbol_type (token::TOKEN_COMMENT, l);
+  }
+
   AgentParser::symbol_type
   AgentParser::make_CONTROL_SOCKETS (const location_type& l)
   {
@@ -1463,7 +1490,7 @@ namespace isc { namespace agent {
 
 #line 14 "agent_parser.yy" // lalr1.cc:377
 } } // isc::agent
-#line 1467 "agent_parser.h" // lalr1.cc:377
+#line 1494 "agent_parser.h" // lalr1.cc:377
 
 
 
index a7cc9177432cea8f77c31000306462d8659df230..243a1006efb70ab1dd3ff31de64ad7d1797b6232 100644 (file)
@@ -97,6 +97,7 @@ using namespace std;
 %token <bool> BOOLEAN "boolean"
 
 %type <ElementPtr> value
+%type <ElementPtr> map_value
 %type <ElementPtr> socket_type_value
 
 %printer { yyoutput << $$; } <*>;
index 1ff93833aac6bc2bbc1b1f6c419b9b51769972c5..034a90b4315efd259b3e09a14f7c604cb7185019 100644 (file)
@@ -1,4 +1,4 @@
-// Generated 201710081556
+// Generated 201801020210
 // A Bison parser, made by GNU Bison 3.0.4.
 
 // Locations for Bison parsers in C++
index 7489fab8b29d12bb63eb63a7ee372d88405f15bd..68522f0b3b70f2ca00fb54b8711ae521670790bc 100644 (file)
@@ -1,4 +1,4 @@
-// Generated 201710081556
+// Generated 201801020210
 // A Bison parser, made by GNU Bison 3.0.4.
 
 // Positions for Bison parsers in C++
index 7be223c9574ac5d9de11aaeb3a620632e822a715..1071a2487d128a0c40fdb0eba11959c3d116d849 100644 (file)
@@ -1,4 +1,4 @@
-// Generated 201710081556
+// Generated 201801020210
 // A Bison parser, made by GNU Bison 3.0.4.
 
 // Stack handling for Bison parsers in C++
index 7d01771cfa01e517fa83d6b29ccbdd8d36f4db33..915f94cab71dc6bba6eb9a90dc6c0dc7f1464dba 100644 (file)
@@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg  );
 /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
        (yy_c_buf_p) = yy_cp;
 /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
-#define YY_NUM_RULES 62
-#define YY_END_OF_BUFFER 63
+#define YY_NUM_RULES 64
+#define YY_END_OF_BUFFER 65
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -700,48 +700,50 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static const flex_int16_t yy_accept[367] =
+static const flex_int16_t yy_accept[388] =
     {   0,
-       55,   55,    0,    0,    0,    0,    0,    0,    0,    0,
-       63,   61,   10,   11,   61,    1,   55,   52,   55,   55,
-       61,   54,   53,   61,   61,   61,   61,   61,   48,   49,
-       61,   61,   61,   50,   51,    5,    5,    5,   61,   61,
-       61,   10,   11,    0,    0,   44,    0,    0,    0,    0,
+       57,   57,    0,    0,    0,    0,    0,    0,    0,    0,
+       65,   63,   10,   11,   63,    1,   57,   54,   57,   57,
+       63,   56,   55,   63,   63,   63,   63,   63,   50,   51,
+       63,   63,   63,   52,   53,    5,    5,    5,   63,   63,
+       63,   10,   11,    0,    0,   46,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    1,   55,   55,
-        0,   54,   55,    3,    2,    6,    0,   55,    0,    0,
-        0,    0,    0,    0,    4,    0,    0,    9,    0,   45,
-        0,    0,    0,    0,    0,    0,    0,    0,   47,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    1,
+       57,   57,    0,   56,   57,    3,    2,    6,    0,   57,
+        0,    0,    0,    0,    0,    0,    4,    0,    0,    9,
+        0,   47,    0,    0,    0,    0,    0,    0,    0,    0,
 
+       49,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    2,
-        0,    0,    0,    0,    0,    0,    0,    8,    0,    0,
-        0,    0,    0,    0,    0,    0,   46,    0,    0,    0,
+        0,    0,    0,    2,    0,    0,    0,    0,    0,    0,
+        0,    8,    0,    0,    0,    0,    0,    0,    0,    0,
+       48,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,   62,   60,    0,   59,   58,
+        0,    0,    0,    0,    0,    0,   19,   18,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   60,
-       58,    0,   57,   56,    0,    0,    0,    0,    0,    0,
-       19,   18,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   59,   56,    0,    0,    0,    0,
 
-        0,    0,   20,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   38,    0,
-        0,    0,   14,    0,    0,    0,    0,    0,    0,    0,
-       41,   42,    0,    0,    0,    0,    0,    0,    0,   35,
+        0,    0,   61,   58,    0,    0,    0,    0,    0,    0,
+       20,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   40,    0,    0,
+        0,   14,    0,    0,    0,    0,    0,    0,    0,    0,
+       43,   44,    0,    0,    0,    0,    0,    0,    0,    0,
+       37,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    7,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    7,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   37,
-        0,    0,   34,    0,    0,   30,    0,    0,    0,    0,
-       31,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       32,   36,    0,    0,    0,    0,    0,    0,    0,   12,
-
-        0,    0,    0,    0,    0,    0,   26,    0,   24,    0,
-        0,    0,    0,   40,    0,    0,   28,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,   27,    0,    0,
-       39,    0,    0,    0,    0,   13,   17,    0,    0,    0,
-        0,    0,   29,    0,   25,    0,    0,    0,    0,    0,
-       23,    0,   21,   16,    0,   22,   43,    0,    0,    0,
-       33,    0,    0,    0,   15,    0
+        0,    0,   39,    0,    0,   36,    0,    0,   32,    0,
+        0,    0,    0,    0,   33,    0,   22,    0,    0,    0,
+
+        0,    0,    0,    0,    0,   34,   38,    0,    0,    0,
+        0,    0,    0,    0,    0,   12,    0,    0,    0,    0,
+        0,    0,   28,    0,   26,    0,    0,    0,    0,   42,
+        0,    0,    0,   30,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   29,    0,    0,    0,   41,    0,
+        0,    0,    0,   13,   17,    0,    0,    0,    0,    0,
+        0,   31,    0,   27,    0,    0,    0,    0,    0,    0,
+       25,    0,   23,   16,    0,   24,   21,   45,    0,    0,
+        0,   35,    0,    0,    0,   15,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -787,97 +789,103 @@ static const YY_CHAR yy_meta[67] =
         3,    3,    3,    3,    3,    3
     } ;
 
-static const flex_int16_t yy_base[378] =
+static const flex_int16_t yy_base[399] =
     {   0,
         0,    0,   65,   68,   71,    0,   69,   73,   54,   70,
-      684,  685,   89,  680,  137,    0,  192,  685,  197,  200,
-       86,  212,  685,  662,   97,   74,   63,   69,  685,  685,
-       83,   68,   78,  685,  685,  685,  124,  668,  627,    0,
-      660,  128,  675,  212,  234,  685,  623,  629,  172,  621,
-      196,  196,  257,  623,  187,  191,  619,  617,  627,  616,
-      629,   91,  609,  613,  622,  621,  209,    0,  281,  289,
-      239,  305,  293,  685,    0,  685,  257,  308,  182,  195,
-      208,  224,  248,  276,  685,  622,  657,  685,  228,  685,
-      321,  609,  619,  282,  614,  295,  297,  653,    0,  367,
-
-      612,  604,  615,  609,  597,  594,  596,  594,  639,  586,
-      602,  585,  594,  589,  586,  587,  582,  218,  593,    0,
-      296,  303,  307,  306,  310,  315,  589,  685,    0,  581,
-      583,  312,  591,  630,  629,  628,  685,  399,  579,  575,
-      572,  586,  618,  571,  566,  568,  585,  613,  577,  285,
-      578,  610,  565,  561,  574,  561,  572,  569,  323,  685,
-      685,  331,  685,  685,  555,    0,  557,  331,  606,  563,
-      685,  685,  431,  554,  598,  562,  550,  549,  558,  564,
-      550,  559,  548,  556,  551,  554,  591,  315,  537,  589,
-      538,  549,  536,  580,  685,  685,  547,    0,  535,  582,
-
-      581,  543,  685,  532,  463,  536,  540,  531,  523,  536,
-      573,  522,  537,  533,  535,  518,  509,  516,  685,  517,
-      514,  511,  685,  511,  509,  518,  515,  520,    0,  512,
-      685,  685,  509,  515,  502,  505,  514,  546,  500,  685,
-      512,  502,  497,  500,  494,  506,  543,  492,  493,  241,
-      502,  539,  486,  499,  685,  531,  478,  516,  473,  463,
-      442,  460,  440,  488,  454,  453,  452,  489,  488,  685,
-      441,  434,  685,  437,  479,  685,  420,  419,  441,  474,
-      685,  418,  429,  424,  419,  422,  422,  458,  406,  456,
-      685,  685,  421,  406,  404,  415,  445,  393,  403,  685,
-
-      442,  390,  386,  378,  379,  391,  685,  376,  685,  374,
-      389,  372,  386,  685,  422,  383,  685,  373,  413,  361,
-      346,  364,  410,  400,  351,  356,  349,  685,  348,  343,
-      685,  393,  340,  391,  339,  685,  685,  344,  340,  330,
-      328,  379,  685,  336,  685,  372,  370,  320,  366,  365,
-      685,  317,  685,  685,  311,  685,  685,  320,  338,  289,
-      685,  241,  206,  253,  685,  685,  508,  513,  518,  523,
-      528,  533,  536,  216,  130,  115,   87
+      706,  707,   89,  702,  137,    0,  192,  707,  197,  200,
+       86,  212,  707,  684,   97,   74,   63,   69,  707,  707,
+       83,   68,   78,  707,  707,  707,  124,  690,  649,    0,
+      682,  128,  697,  212,  234,  707,  645,  651,  172,  643,
+      196,  196,  257,  645,  641,  187,  191,  640,  638,  648,
+      637,  650,   91,  630,  634,  643,  642,  209,  210,    0,
+      281,  289,  308,  314,  293,  707,    0,  707,  232,  257,
+      182,  224,  219,  283,  284,  285,  707,  643,  678,  707,
+      294,  707,  330,  630,  640,  291,  635,  296,  301,  674,
+
+        0,  376,  633,  626,  624,  635,  629,  617,  614,  616,
+      614,  659,  606,  622,  605,  614,  609,  606,  607,  602,
+      299,  613,  616,    0,  305,  312,  255,  309,  318,  324,
+      608,  707,    0,  600,  602,  319,  610,  649,  648,  647,
+      707,  408,  598,  599,  593,  590,  604,  636,  589,  584,
+      586,  603,  631,  595,  290,  596,  628,  583,  579,  592,
+      579,  590,  587,  576,  329,  707,  707,  330,  707,  707,
+      572,    0,  574,  337,  623,  580,  707,  707,  440,  571,
+      582,  614,  578,  566,  565,  574,  580,  566,  575,  564,
+      572,  567,  570,  607,  205,  553,  605,  554,  565,  552,
+
+      596,  595,  707,  707,  562,    0,  550,  597,  596,  558,
+      707,  547,  472,  551,  545,  554,  545,  537,  550,  587,
+      536,  551,  547,  549,  532,  523,  530,  707,  531,  528,
+      525,  707,  525,  523,  532,  529,  536,  533,    0,  525,
+      707,  707,  522,  528,  515,  514,  517,  526,  558,  512,
+      707,  524,  514,  509,  512,  506,  518,  555,  504,  505,
+      354,  514,  551,  498,  511,  500,  707,  542,  495,  545,
+      497,  525,  477,  464,  470,  450,  498,  464,  463,  462,
+      499,  498,  707,  451,  444,  707,  447,  489,  707,  436,
+      429,  438,  450,  483,  707,  427,  707,  438,  433,  428,
+
+      431,  431,  467,  415,  465,  707,  707,  430,  415,  413,
+      424,  454,  402,  400,  411,  707,  441,  398,  394,  386,
+      387,  399,  707,  384,  707,  382,  397,  380,  394,  707,
+      430,  391,  384,  707,  374,  420,  368,  346,  362,  408,
+      407,  358,  363,  357,  707,  347,  355,  350,  707,  400,
+      347,  398,  339,  707,  707,  344,  340,  330,  327,  326,
+      376,  707,  333,  707,  374,  373,  325,  371,  370,  364,
+      707,  313,  707,  707,  307,  707,  707,  707,  221,  258,
+      205,  707,  196,  185,  217,  707,  707,  517,  522,  527,
+      532,  537,  542,  545,  216,  130,  115,   87
+
     } ;
 
-static const flex_int16_t yy_def[378] =
+static const flex_int16_t yy_def[399] =
     {   0,
-      366,    1,  367,  367,    1,    5,    5,    5,    5,    5,
-      366,  366,  366,  366,  366,  368,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  369,
-      366,  366,  366,  370,   15,  366,   45,   45,   45,   45,
-       45,   45,  371,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,  368,  366,  366,
-      366,  366,  366,  366,  372,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  369,  366,  370,  366,
-      366,   45,   45,   45,   45,   45,   45,  373,   45,  371,
-
+      387,    1,  388,  388,    1,    5,    5,    5,    5,    5,
+      387,  387,  387,  387,  387,  389,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  390,
+      387,  387,  387,  391,   15,  387,   45,   45,   45,   45,
+       45,   45,  392,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,  389,
+      387,  387,  387,  387,  387,  387,  393,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  390,  387,
+      391,  387,  387,   45,   45,   45,   45,   45,   45,  394,
+
+       45,  392,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,  393,  387,  387,  387,  387,  387,  387,
+      387,  387,  395,   45,   45,   45,   45,   45,   45,  394,
+      387,  392,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45,  372,
-      366,  366,  366,  366,  366,  366,  366,  366,  374,   45,
-       45,   45,   45,   45,   45,  373,  366,  371,   45,   45,
+       45,   45,   45,   45,  387,  387,  387,  387,  387,  387,
+      387,  396,   45,   45,   45,   45,  387,  387,  392,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,  366,  366,
-      366,  366,  366,  366,  366,  375,   45,   45,   45,   45,
-      366,  366,  371,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,  366,  366,  366,  376,   45,   45,
 
-       45,   45,  366,   45,  371,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,  366,   45,
-       45,   45,  366,   45,   45,   45,   45,  366,  377,   45,
-      366,  366,   45,   45,   45,   45,   45,   45,   45,  366,
+       45,   45,  387,  387,  387,  397,   45,   45,   45,   45,
+      387,   45,  392,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,  387,   45,   45,
+       45,  387,   45,   45,   45,   45,   45,  387,  398,   45,
+      387,  387,   45,   45,   45,   45,   45,   45,   45,   45,
+      387,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,  387,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,  366,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45,  366,
-       45,   45,  366,   45,   45,  366,   45,   45,   45,   45,
-      366,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-      366,  366,   45,   45,   45,   45,   45,   45,   45,  366,
-
-       45,   45,   45,   45,   45,   45,  366,   45,  366,   45,
-       45,   45,   45,  366,   45,   45,  366,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,  366,   45,   45,
-      366,   45,   45,   45,   45,  366,  366,   45,   45,   45,
-       45,   45,  366,   45,  366,   45,   45,   45,   45,   45,
-      366,   45,  366,  366,   45,  366,  366,   45,   45,   45,
-      366,   45,   45,   45,  366,    0,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366
+       45,   45,  387,   45,   45,  387,   45,   45,  387,   45,
+       45,   45,   45,   45,  387,   45,  387,   45,   45,   45,
+
+       45,   45,   45,   45,   45,  387,  387,   45,   45,   45,
+       45,   45,   45,   45,   45,  387,   45,   45,   45,   45,
+       45,   45,  387,   45,  387,   45,   45,   45,   45,  387,
+       45,   45,   45,  387,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,  387,   45,   45,   45,  387,   45,
+       45,   45,   45,  387,  387,   45,   45,   45,   45,   45,
+       45,  387,   45,  387,   45,   45,   45,   45,   45,   45,
+      387,   45,  387,  387,   45,  387,  387,  387,   45,   45,
+       45,  387,   45,   45,   45,  387,    0,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387
+
     } ;
 
-static const flex_int16_t yy_nxt[752] =
+static const flex_int16_t yy_nxt[774] =
     {   0,
        12,   13,   14,   13,   12,   15,   16,   12,   17,   18,
        19,   20,   21,   22,   22,   22,   23,   24,   12,   12,
@@ -888,83 +896,85 @@ static const flex_int16_t yy_nxt[752] =
        12,   12,   12,   12,   34,   35,   37,   14,   37,   37,
        14,   37,   38,   41,   40,   38,   12,   12,   40,   12,
        12,   12,   12,   12,   12,   12,   12,   12,   12,   41,
-       42,   89,   42,   74,   79,   12,   12,   80,   75,   12,
+       42,   91,   42,   76,   81,   12,   12,   82,   77,   12,
 
-       81,   12,   80,   79,   12,   77,   12,   77,   12,   81,
-       78,   78,   78,   79,   12,   12,   12,   12,   39,  229,
-       12,   80,   82,   12,   81,   42,   83,   42,   12,   42,
-      113,   42,  114,   84,  198,   12,   12,   44,   44,   44,
+       83,   12,   82,   81,   12,   79,   12,   79,   12,   83,
+       80,   80,   80,   81,   12,   12,   12,   12,   39,  239,
+       12,   82,   84,   12,   83,   42,   85,   42,   12,   42,
+      116,   42,  117,   86,  206,   12,   12,   44,   44,   44,
        45,   45,   46,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   47,
        48,   45,   45,   49,   50,   45,   45,   45,   45,   45,
-       51,   52,   45,   53,   45,   45,   54,   45,   45,   55,
-       45,   56,   45,   57,   58,   49,   59,   60,   61,   62,
-       63,   64,   65,   66,   67,   52,   45,   45,   45,   45,
-
-       45,   45,   45,   69,   94,   70,   70,   70,   69,  121,
-       72,   72,   72,   73,   73,   73,   71,   90,   96,   97,
-      166,   71,  122,   69,   71,   72,   72,   72,   94,  102,
-      103,   96,  121,   90,  104,   71,   71,   96,   97,  105,
-       71,  106,  123,   71,  107,  122,  273,   77,   91,   77,
-       96,  121,   78,   78,   78,   71,   45,   45,  365,  156,
-       45,   45,   99,  364,   91,  119,  123,   45,   45,   45,
-       78,   78,   78,   45,  124,  122,   45,  157,   45,  274,
+       51,   52,   45,   53,   45,   45,   54,   45,   55,   56,
+       45,   57,   45,   58,   59,   49,   60,   61,   62,   63,
+       64,   65,   66,   67,   68,   69,   45,   45,   45,   45,
+
+       45,   45,   45,   71,   96,   72,   72,   72,   71,  125,
+       74,   74,   74,   75,   75,   75,   73,   92,   98,   99,
+      172,   73,  386,   71,   73,   74,   74,   74,   96,  105,
+      106,   98,  125,   99,  107,   73,   73,   98,   99,  108,
+       73,  109,  385,   73,  110,   80,   80,   80,   93,  229,
+       98,  126,   99,  127,  384,   73,   45,   45,  383,  230,
+       45,   45,  101,  382,  381,  122,  123,   45,   45,   45,
+       80,   80,   80,   45,  126,   45,   45,  127,   45,  167,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   73,   73,   73,   45,  125,  363,
-
-       69,   45,   70,   70,   70,   71,   73,   73,   73,   45,
-      123,  132,   45,   71,   45,  100,   69,   71,   72,   72,
-       72,   78,   78,   78,   71,  134,   89,  135,  159,   71,
-      160,  161,   71,   89,  126,  132,   71,  160,  159,  161,
-      169,  185,  362,  361,  186,  200,  201,  195,   71,  134,
-      161,  135,  159,  160,  202,  195,  333,   89,  164,  220,
-      163,   89,  162,  360,  169,   89,  195,  359,  358,  221,
-      357,  356,  355,   89,  196,  354,   89,  353,   89,  129,
-      138,  138,  138,  352,  351,  350,  349,  138,  138,  138,
-      138,  138,  138,  348,  347,  346,  345,  344,  343,  342,
-
-      341,  340,  334,  339,  338,  337,  138,  138,  138,  138,
-      138,  138,  173,  173,  173,  336,  335,  332,  331,  173,
-      173,  173,  173,  173,  173,  330,  329,  328,  327,  326,
-      325,  324,  323,  322,  321,  320,  319,  318,  173,  173,
-      173,  173,  173,  173,  205,  205,  205,  317,  316,  315,
-      314,  205,  205,  205,  205,  205,  205,  313,  312,  311,
+       45,   45,   45,   45,   75,   75,   75,   45,  167,   92,
+
+       71,   45,   72,   72,   72,   73,   75,   75,   75,   45,
+      125,  126,   45,   73,   45,  102,   79,   73,   79,  127,
+      136,   80,   80,   80,   73,   71,  138,   74,   74,   74,
+       93,  139,   73,  128,  129,   91,   73,  165,   73,  166,
+      161,  165,   91,  130,  136,  166,  192,  175,  167,  193,
+      138,  208,  209,  203,  203,  139,  351,   73,  162,  286,
+      210,  165,  166,  380,  379,  168,   91,  170,  169,  378,
+       91,  175,  203,  204,   91,  377,  376,  375,  374,  373,
+      372,  371,   91,  370,  369,   91,  368,   91,  133,  142,
+      142,  142,  287,  367,  366,  365,  142,  142,  142,  142,
+
+      142,  142,  352,  364,  363,  362,  361,  360,  359,  358,
+      357,  356,  355,  354,  353,  142,  142,  142,  142,  142,
+      142,  179,  179,  179,  350,  349,  348,  347,  179,  179,
+      179,  179,  179,  179,  346,  345,  344,  343,  342,  341,
+      340,  339,  338,  337,  336,  335,  334,  179,  179,  179,
+      179,  179,  179,  213,  213,  213,  333,  332,  331,  330,
+      213,  213,  213,  213,  213,  213,  329,  328,  327,  326,
+      325,  324,  323,  322,  321,  320,  319,  318,  317,  213,
+      213,  213,  213,  213,  213,   45,   45,   45,  316,  315,
+      314,  313,   45,   45,   45,   45,   45,   45,  312,  311,
+
       310,  309,  308,  307,  306,  305,  304,  303,  302,  301,
-      205,  205,  205,  205,  205,  205,   45,   45,   45,  300,
-      299,  298,  297,   45,   45,   45,   45,   45,   45,  296,
-      295,  294,  293,  292,  291,  290,  289,  288,  287,  286,
-
-      285,  284,   45,   45,   45,   45,   45,   45,   36,   36,
-       36,   36,   36,   68,  283,   68,   68,   68,   87,  282,
-       87,  281,   87,   89,   89,   89,   89,   89,   98,   98,
-       98,   98,   98,  120,  280,  120,  120,  120,  136,  136,
-      136,  279,  278,  277,  276,  275,  272,  271,  270,  269,
-      268,  267,  266,  265,  264,  263,  262,  261,  260,  259,
-      258,  257,  256,  255,  254,  253,  252,  251,  250,  249,
-      248,  247,  246,  245,  244,  243,  242,  241,  240,  239,
-      238,  237,  236,  235,  234,  233,  232,  231,  230,  228,
-      227,  226,  225,  224,  223,  222,  219,  218,  217,  216,
-
-      215,  214,  213,  212,  211,  210,  209,  208,  207,  206,
-      204,  203,  199,  197,  194,  193,  192,  191,  190,  189,
-      188,  187,  184,  183,  182,  181,  180,  179,  178,  177,
-      176,  175,  174,  137,  172,  171,  170,  168,  167,  165,
-      158,  155,  154,  153,  152,  151,  150,  149,  148,  147,
-      146,  145,  144,  143,  142,  141,  140,  139,  137,  133,
-      131,  130,  128,  127,  118,  117,  116,  115,  112,  111,
-      110,  109,  108,  101,   95,   93,   92,   43,   88,   86,
-       85,   76,   43,  366,   11,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-      366
+      300,   45,   45,   45,   45,   45,   45,   36,   36,   36,
+       36,   36,   70,  299,   70,   70,   70,   89,  298,   89,
+      297,   89,   91,   91,   91,   91,   91,  100,  100,  100,
+      100,  100,  124,  296,  124,  124,  124,  140,  140,  140,
+      295,  294,  293,  292,  291,  290,  289,  288,  285,  284,
+      283,  282,  281,  280,  279,  278,  277,  276,  275,  274,
+      273,  272,  271,  270,  269,  268,  267,  266,  265,  264,
+      263,  262,  261,  260,  259,  258,  257,  256,  255,  254,
+      253,  252,  251,  250,  249,  248,  247,  246,  245,  244,
+
+      243,  242,  241,  240,  238,  237,  236,  235,  234,  233,
+      232,  231,  228,  227,  226,  225,  224,  223,  222,  221,
+      220,  219,  218,  217,  216,  215,  214,  212,  211,  207,
+      205,  202,  201,  200,  199,  198,  197,  196,  195,  194,
+      191,  190,  189,  188,  187,  186,  185,  184,  183,  182,
+      181,  180,  141,  178,  177,  176,  174,  173,  171,  164,
+      163,  160,  159,  158,  157,  156,  155,  154,  153,  152,
+      151,  150,  149,  148,  147,  146,  145,  144,  143,  141,
+      137,  135,  134,  132,  131,  121,  120,  119,  118,  115,
+      114,  113,  112,  111,  104,  103,   97,   95,   94,   43,
+
+       90,   88,   87,   78,   43,  387,   11,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387
     } ;
 
-static const flex_int16_t yy_chk[752] =
+static const flex_int16_t yy_chk[774] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -975,12 +985,12 @@ static const flex_int16_t yy_chk[752] =
         1,    1,    1,    1,    1,    1,    3,    3,    3,    4,
         4,    4,    3,    9,    7,    4,    5,    5,    8,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,   10,
-       13,  377,   13,   21,   26,    5,    5,   27,   21,    5,
+       13,  398,   13,   21,   26,    5,    5,   27,   21,    5,
 
        28,    9,   32,   31,    5,   25,    5,   25,    5,   33,
-       25,   25,   25,   26,    5,    5,    7,   10,    5,  376,
+       25,   25,   25,   26,    5,    5,    7,   10,    5,  397,
         8,   27,   31,    5,   28,   37,   32,   37,    5,   42,
-       62,   42,   62,   33,  375,    5,    5,   15,   15,   15,
+       63,   42,   63,   33,  396,    5,    5,   15,   15,   15,
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
@@ -988,67 +998,69 @@ static const flex_int16_t yy_chk[752] =
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
 
-       15,   15,   15,   17,   49,   17,   17,   17,   19,   79,
+       15,   15,   15,   17,   49,   17,   17,   17,   19,   81,
        19,   19,   19,   20,   20,   20,   17,   44,   51,   52,
-      374,   19,   80,   22,   20,   22,   22,   22,   49,   55,
-       55,   67,   79,   89,   55,   17,   22,   51,   52,   55,
-       19,   56,   81,   20,   56,   80,  250,   71,   44,   71,
-       67,   82,   71,   71,   71,   22,   45,   45,  364,  118,
-       45,   45,   53,  363,   89,   67,   81,   45,   45,   53,
-       77,   77,   77,   45,   82,   83,   45,  118,   45,  250,
+      395,   19,  385,   22,   20,   22,   22,   22,   49,   56,
+       56,   68,   81,   69,   56,   17,   22,   51,   52,   56,
+       19,   57,  384,   20,   57,   79,   79,   79,   44,  195,
+       68,   82,   69,   83,  383,   22,   45,   45,  381,  195,
+       45,   45,   53,  380,  379,   68,   69,   45,   45,   53,
+       80,   80,   80,   45,   82,   45,   45,   83,   45,  127,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   53,   69,   69,   69,   53,   83,  362,
-
-       70,   53,   70,   70,   70,   69,   73,   73,   73,   53,
-       84,   94,   53,   70,   53,   53,   72,   73,   72,   72,
-       72,   78,   78,   78,   69,   96,   91,   97,  121,   72,
-      122,  123,   70,   91,   84,   94,   73,  125,  124,  126,
-      132,  150,  360,  359,  150,  168,  168,  159,   72,   96,
-      123,   97,  121,  122,  168,  162,  321,   91,  126,  188,
-      125,   91,  124,  358,  132,   91,  159,  355,  352,  188,
-      350,  349,  348,   91,  162,  347,   91,  346,   91,   91,
-      100,  100,  100,  344,  342,  341,  340,  100,  100,  100,
-      100,  100,  100,  339,  338,  335,  334,  333,  332,  330,
-
-      329,  327,  321,  326,  325,  324,  100,  100,  100,  100,
-      100,  100,  138,  138,  138,  323,  322,  320,  319,  138,
-      138,  138,  138,  138,  138,  318,  316,  315,  313,  312,
-      311,  310,  308,  306,  305,  304,  303,  302,  138,  138,
-      138,  138,  138,  138,  173,  173,  173,  301,  299,  298,
-      297,  173,  173,  173,  173,  173,  173,  296,  295,  294,
-      293,  290,  289,  288,  287,  286,  285,  284,  283,  282,
-      173,  173,  173,  173,  173,  173,  205,  205,  205,  280,
-      279,  278,  277,  205,  205,  205,  205,  205,  205,  275,
-      274,  272,  271,  269,  268,  267,  266,  265,  264,  263,
-
-      262,  261,  205,  205,  205,  205,  205,  205,  367,  367,
-      367,  367,  367,  368,  260,  368,  368,  368,  369,  259,
-      369,  258,  369,  370,  370,  370,  370,  370,  371,  371,
-      371,  371,  371,  372,  257,  372,  372,  372,  373,  373,
-      373,  256,  254,  253,  252,  251,  249,  248,  247,  246,
-      245,  244,  243,  242,  241,  239,  238,  237,  236,  235,
-      234,  233,  230,  228,  227,  226,  225,  224,  222,  221,
-      220,  218,  217,  216,  215,  214,  213,  212,  211,  210,
-      209,  208,  207,  206,  204,  202,  201,  200,  199,  197,
-      194,  193,  192,  191,  190,  189,  187,  186,  185,  184,
-
-      183,  182,  181,  180,  179,  178,  177,  176,  175,  174,
-      170,  169,  167,  165,  158,  157,  156,  155,  154,  153,
-      152,  151,  149,  148,  147,  146,  145,  144,  143,  142,
-      141,  140,  139,  136,  135,  134,  133,  131,  130,  127,
-      119,  117,  116,  115,  114,  113,  112,  111,  110,  109,
-      108,  107,  106,  105,  104,  103,  102,  101,   98,   95,
-       93,   92,   87,   86,   66,   65,   64,   63,   61,   60,
-       59,   58,   57,   54,   50,   48,   47,   43,   41,   39,
-       38,   24,   14,   11,  366,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
-      366
+       45,   45,   45,   53,   71,   71,   71,   53,  127,   91,
+
+       72,   53,   72,   72,   72,   71,   75,   75,   75,   53,
+       84,   85,   53,   72,   53,   53,   73,   75,   73,   86,
+       96,   73,   73,   73,   71,   74,   98,   74,   74,   74,
+       91,   99,   72,   84,   85,   93,   75,  125,   74,  126,
+      121,  128,   93,   86,   96,  129,  155,  136,  130,  155,
+       98,  174,  174,  165,  168,   99,  338,   74,  121,  261,
+      174,  125,  126,  375,  372,  128,   93,  130,  129,  370,
+       93,  136,  165,  168,   93,  369,  368,  367,  366,  365,
+      363,  361,   93,  360,  359,   93,  358,   93,   93,  102,
+      102,  102,  261,  357,  356,  353,  102,  102,  102,  102,
+
+      102,  102,  338,  352,  351,  350,  348,  347,  346,  344,
+      343,  342,  341,  340,  339,  102,  102,  102,  102,  102,
+      102,  142,  142,  142,  337,  336,  335,  333,  142,  142,
+      142,  142,  142,  142,  332,  331,  329,  328,  327,  326,
+      324,  322,  321,  320,  319,  318,  317,  142,  142,  142,
+      142,  142,  142,  179,  179,  179,  315,  314,  313,  312,
+      179,  179,  179,  179,  179,  179,  311,  310,  309,  308,
+      305,  304,  303,  302,  301,  300,  299,  298,  296,  179,
+      179,  179,  179,  179,  179,  213,  213,  213,  294,  293,
+      292,  291,  213,  213,  213,  213,  213,  213,  290,  288,
+
+      287,  285,  284,  282,  281,  280,  279,  278,  277,  276,
+      275,  213,  213,  213,  213,  213,  213,  388,  388,  388,
+      388,  388,  389,  274,  389,  389,  389,  390,  273,  390,
+      272,  390,  391,  391,  391,  391,  391,  392,  392,  392,
+      392,  392,  393,  271,  393,  393,  393,  394,  394,  394,
+      270,  269,  268,  266,  265,  264,  263,  262,  260,  259,
+      258,  257,  256,  255,  254,  253,  252,  250,  249,  248,
+      247,  246,  245,  244,  243,  240,  238,  237,  236,  235,
+      234,  233,  231,  230,  229,  227,  226,  225,  224,  223,
+      222,  221,  220,  219,  218,  217,  216,  215,  214,  212,
+
+      210,  209,  208,  207,  205,  202,  201,  200,  199,  198,
+      197,  196,  194,  193,  192,  191,  190,  189,  188,  187,
+      186,  185,  184,  183,  182,  181,  180,  176,  175,  173,
+      171,  164,  163,  162,  161,  160,  159,  158,  157,  156,
+      154,  153,  152,  151,  150,  149,  148,  147,  146,  145,
+      144,  143,  140,  139,  138,  137,  135,  134,  131,  123,
+      122,  120,  119,  118,  117,  116,  115,  114,  113,  112,
+      111,  110,  109,  108,  107,  106,  105,  104,  103,  100,
+       97,   95,   94,   89,   88,   67,   66,   65,   64,   62,
+       61,   60,   59,   58,   55,   54,   50,   48,   47,   43,
+
+       41,   39,   38,   24,   14,   11,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  387
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1057,15 +1069,15 @@ static char *yy_last_accepting_cpos;
 extern int yy_flex_debug;
 int yy_flex_debug = 1;
 
-static const flex_int16_t yy_rule_linenum[62] =
+static const flex_int16_t yy_rule_linenum[64] =
     {   0,
       133,  135,  137,  142,  143,  148,  149,  150,  162,  165,
       170,  176,  185,  196,  207,  216,  225,  234,  244,  254,
-      264,  273,  282,  292,  302,  312,  323,  332,  342,  352,
-      363,  372,  381,  390,  399,  408,  417,  426,  439,  448,
-      457,  466,  475,  485,  584,  589,  594,  599,  600,  601,
-      602,  603,  604,  606,  624,  637,  642,  646,  648,  650,
-      652
+      264,  280,  296,  305,  314,  324,  334,  344,  355,  364,
+      374,  384,  395,  404,  413,  422,  431,  440,  449,  458,
+      471,  480,  489,  498,  507,  517,  616,  621,  626,  631,
+      632,  633,  634,  635,  636,  638,  656,  669,  674,  678,
+      680,  682,  684
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1077,7 +1089,7 @@ static const flex_int16_t yy_rule_linenum[62] =
 #define YY_RESTORE_YY_MORE_OFFSET
 char *yytext;
 #line 1 "d2_lexer.ll"
-/* Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC")
 
    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -1116,7 +1128,7 @@ unsigned int comment_start_line = 0;
 
 /* To avoid the call to exit... oops! */
 #define YY_FATAL_ERROR(msg) isc::d2::D2ParserContext::fatal(msg)
-#line 1119 "d2_lexer.cc"
+#line 1131 "d2_lexer.cc"
 /* noyywrap disables automatic rewinding for the next file to parse. Since we
    always parse only a single string, there's no need to do any wraps. And
    using yywrap requires linking with -lfl, which provides the default yywrap
@@ -1142,8 +1154,8 @@ unsigned int comment_start_line = 0;
    by moving it ahead by yyleng bytes. yyleng specifies the length of the
    currently matched token. */
 #define YY_USER_ACTION  driver.loc_.columns(yyleng);
-#line 1145 "d2_lexer.cc"
-#line 1146 "d2_lexer.cc"
+#line 1157 "d2_lexer.cc"
+#line 1158 "d2_lexer.cc"
 
 #define INITIAL 0
 #define COMMENT 1
@@ -1461,7 +1473,7 @@ YY_DECL
     }
 
 
-#line 1464 "d2_lexer.cc"
+#line 1476 "d2_lexer.cc"
 
        while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
@@ -1490,13 +1502,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 367 )
+                               if ( yy_current_state >= 388 )
                                        yy_c = yy_meta[yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
                        ++yy_cp;
                        }
-               while ( yy_current_state != 366 );
+               while ( yy_current_state != 387 );
                yy_cp = (yy_last_accepting_cpos);
                yy_current_state = (yy_last_accepting_state);
 
@@ -1515,13 +1527,13 @@ do_action:      /* This label is used only to access EOF actions. */
                        {
                        if ( yy_act == 0 )
                                fprintf( stderr, "--scanner backing up\n" );
-                       else if ( yy_act < 62 )
+                       else if ( yy_act < 64 )
                                fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
                                         (long)yy_rule_linenum[yy_act], yytext );
-                       else if ( yy_act == 62 )
+                       else if ( yy_act == 64 )
                                fprintf( stderr, "--accepting default rule (\"%s\")\n",
                                         yytext );
-                       else if ( yy_act == 63 )
+                       else if ( yy_act == 65 )
                                fprintf( stderr, "--(end of buffer or a NUL)\n" );
                        else
                                fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
@@ -1743,6 +1755,44 @@ YY_RULE_SETUP
 case 21:
 YY_RULE_SETUP
 #line 264 "d2_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case isc::d2::D2ParserContext::DHCPDDNS:
+    case isc::d2::D2ParserContext::DDNS_DOMAIN:
+    case isc::d2::D2ParserContext::DDNS_DOMAINS:
+    case isc::d2::D2ParserContext::DNS_SERVER:
+    case isc::d2::D2ParserContext::DNS_SERVERS:
+    case isc::d2::D2ParserContext::TSIG_KEY:
+    case isc::d2::D2ParserContext::TSIG_KEYS:
+    case isc::d2::D2ParserContext::LOGGERS:
+        return isc::d2::D2Parser::make_USER_CONTEXT(driver.loc_);
+    default:
+        return isc::d2::D2Parser::make_STRING("user-context", driver.loc_);
+    }
+}
+       YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 280 "d2_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case isc::d2::D2ParserContext::DHCPDDNS:
+    case isc::d2::D2ParserContext::DDNS_DOMAIN:
+    case isc::d2::D2ParserContext::DDNS_DOMAINS:
+    case isc::d2::D2ParserContext::DNS_SERVER:
+    case isc::d2::D2ParserContext::DNS_SERVERS:
+    case isc::d2::D2ParserContext::TSIG_KEY:
+    case isc::d2::D2ParserContext::TSIG_KEYS:
+    case isc::d2::D2ParserContext::LOGGERS:
+        return isc::d2::D2Parser::make_COMMENT(driver.loc_);
+    default:
+        return isc::d2::D2Parser::make_STRING("comment", driver.loc_);
+    }
+}
+       YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 296 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1752,9 +1802,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 22:
+case 24:
 YY_RULE_SETUP
-#line 273 "d2_lexer.ll"
+#line 305 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1764,9 +1814,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 23:
+case 25:
 YY_RULE_SETUP
-#line 282 "d2_lexer.ll"
+#line 314 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::FORWARD_DDNS:
@@ -1777,9 +1827,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 24:
+case 26:
 YY_RULE_SETUP
-#line 292 "d2_lexer.ll"
+#line 324 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DDNS_DOMAIN:
@@ -1790,9 +1840,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 25:
+case 27:
 YY_RULE_SETUP
-#line 302 "d2_lexer.ll"
+#line 334 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DDNS_DOMAIN:
@@ -1803,9 +1853,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 26:
+case 28:
 YY_RULE_SETUP
-#line 312 "d2_lexer.ll"
+#line 344 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DNS_SERVER:
@@ -1816,9 +1866,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 27:
+case 29:
 YY_RULE_SETUP
-#line 323 "d2_lexer.ll"
+#line 355 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1828,9 +1878,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 28:
+case 30:
 YY_RULE_SETUP
-#line 332 "d2_lexer.ll"
+#line 364 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::TSIG_KEY:
@@ -1841,9 +1891,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 29:
+case 31:
 YY_RULE_SETUP
-#line 342 "d2_lexer.ll"
+#line 374 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::TSIG_KEY:
@@ -1854,9 +1904,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 30:
+case 32:
 YY_RULE_SETUP
-#line 352 "d2_lexer.ll"
+#line 384 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::TSIG_KEY:
@@ -1867,9 +1917,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 31:
+case 33:
 YY_RULE_SETUP
-#line 363 "d2_lexer.ll"
+#line 395 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::CONFIG:
@@ -1879,9 +1929,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 32:
+case 34:
 YY_RULE_SETUP
-#line 372 "d2_lexer.ll"
+#line 404 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::LOGGING:
@@ -1891,9 +1941,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 33:
+case 35:
 YY_RULE_SETUP
-#line 381 "d2_lexer.ll"
+#line 413 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::LOGGERS:
@@ -1903,9 +1953,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 34:
+case 36:
 YY_RULE_SETUP
-#line 390 "d2_lexer.ll"
+#line 422 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::OUTPUT_OPTIONS:
@@ -1915,9 +1965,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 35:
+case 37:
 YY_RULE_SETUP
-#line 399 "d2_lexer.ll"
+#line 431 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::OUTPUT_OPTIONS:
@@ -1927,9 +1977,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 36:
+case 38:
 YY_RULE_SETUP
-#line 408 "d2_lexer.ll"
+#line 440 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::OUTPUT_OPTIONS:
@@ -1939,9 +1989,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 37:
+case 39:
 YY_RULE_SETUP
-#line 417 "d2_lexer.ll"
+#line 449 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::OUTPUT_OPTIONS:
@@ -1951,9 +2001,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 38:
+case 40:
 YY_RULE_SETUP
-#line 426 "d2_lexer.ll"
+#line 458 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::LOGGERS:
@@ -1967,9 +2017,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 39:
+case 41:
 YY_RULE_SETUP
-#line 439 "d2_lexer.ll"
+#line 471 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::LOGGERS:
@@ -1979,9 +2029,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 40:
+case 42:
 YY_RULE_SETUP
-#line 448 "d2_lexer.ll"
+#line 480 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::LOGGERS:
@@ -1991,9 +2041,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 41:
+case 43:
 YY_RULE_SETUP
-#line 457 "d2_lexer.ll"
+#line 489 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::CONFIG:
@@ -2003,9 +2053,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 42:
+case 44:
 YY_RULE_SETUP
-#line 466 "d2_lexer.ll"
+#line 498 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::CONFIG:
@@ -2015,9 +2065,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 43:
+case 45:
 YY_RULE_SETUP
-#line 475 "d2_lexer.ll"
+#line 507 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::CONFIG:
@@ -2027,9 +2077,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 44:
+case 46:
 YY_RULE_SETUP
-#line 485 "d2_lexer.ll"
+#line 517 "d2_lexer.ll"
 {
     /* A string has been matched. It contains the actual string and single quotes.
        We need to get those quotes out of the way and just use its content, e.g.
@@ -2129,65 +2179,65 @@ YY_RULE_SETUP
     return isc::d2::D2Parser::make_STRING(decoded, driver.loc_);
 }
        YY_BREAK
-case 45:
-/* rule 45 can match eol */
+case 47:
+/* rule 47 can match eol */
 YY_RULE_SETUP
-#line 584 "d2_lexer.ll"
+#line 616 "d2_lexer.ll"
 {
     /* Bad string with a forbidden control character inside */
     driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
 }
        YY_BREAK
-case 46:
-/* rule 46 can match eol */
+case 48:
+/* rule 48 can match eol */
 YY_RULE_SETUP
-#line 589 "d2_lexer.ll"
+#line 621 "d2_lexer.ll"
 {
     /* Bad string with a bad escape inside */
     driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
 }
        YY_BREAK
-case 47:
+case 49:
 YY_RULE_SETUP
-#line 594 "d2_lexer.ll"
+#line 626 "d2_lexer.ll"
 {
     /* Bad string with an open escape at the end */
     driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
 }
        YY_BREAK
-case 48:
+case 50:
 YY_RULE_SETUP
-#line 599 "d2_lexer.ll"
+#line 631 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_LSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 49:
+case 51:
 YY_RULE_SETUP
-#line 600 "d2_lexer.ll"
+#line 632 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_RSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 50:
+case 52:
 YY_RULE_SETUP
-#line 601 "d2_lexer.ll"
+#line 633 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_LCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 51:
+case 53:
 YY_RULE_SETUP
-#line 602 "d2_lexer.ll"
+#line 634 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_RCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 52:
+case 54:
 YY_RULE_SETUP
-#line 603 "d2_lexer.ll"
+#line 635 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_COMMA(driver.loc_); }
        YY_BREAK
-case 53:
+case 55:
 YY_RULE_SETUP
-#line 604 "d2_lexer.ll"
+#line 636 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_COLON(driver.loc_); }
        YY_BREAK
-case 54:
+case 56:
 YY_RULE_SETUP
-#line 606 "d2_lexer.ll"
+#line 638 "d2_lexer.ll"
 {
     /* An integer was found. */
     std::string tmp(yytext);
@@ -2206,9 +2256,9 @@ YY_RULE_SETUP
     return isc::d2::D2Parser::make_INTEGER(integer, driver.loc_);
 }
        YY_BREAK
-case 55:
+case 57:
 YY_RULE_SETUP
-#line 624 "d2_lexer.ll"
+#line 656 "d2_lexer.ll"
 {
     /* A floating point was found. */
     std::string tmp(yytext);
@@ -2222,43 +2272,43 @@ YY_RULE_SETUP
     return isc::d2::D2Parser::make_FLOAT(fp, driver.loc_);
 }
        YY_BREAK
-case 56:
+case 58:
 YY_RULE_SETUP
-#line 637 "d2_lexer.ll"
+#line 669 "d2_lexer.ll"
 {
     string tmp(yytext);
     return isc::d2::D2Parser::make_BOOLEAN(tmp == "true", driver.loc_);
 }
        YY_BREAK
-case 57:
+case 59:
 YY_RULE_SETUP
-#line 642 "d2_lexer.ll"
+#line 674 "d2_lexer.ll"
 {
    return isc::d2::D2Parser::make_NULL_TYPE(driver.loc_);
 }
        YY_BREAK
-case 58:
+case 60:
 YY_RULE_SETUP
-#line 646 "d2_lexer.ll"
+#line 678 "d2_lexer.ll"
 driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
        YY_BREAK
-case 59:
+case 61:
 YY_RULE_SETUP
-#line 648 "d2_lexer.ll"
+#line 680 "d2_lexer.ll"
 driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
        YY_BREAK
-case 60:
+case 62:
 YY_RULE_SETUP
-#line 650 "d2_lexer.ll"
+#line 682 "d2_lexer.ll"
 driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
        YY_BREAK
-case 61:
+case 63:
 YY_RULE_SETUP
-#line 652 "d2_lexer.ll"
+#line 684 "d2_lexer.ll"
 driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 654 "d2_lexer.ll"
+#line 686 "d2_lexer.ll"
 {
     if (driver.states_.empty()) {
         return isc::d2::D2Parser::make_END(driver.loc_);
@@ -2282,12 +2332,12 @@ case YY_STATE_EOF(INITIAL):
     BEGIN(DIR_EXIT);
 }
        YY_BREAK
-case 62:
+case 64:
 YY_RULE_SETUP
-#line 677 "d2_lexer.ll"
+#line 709 "d2_lexer.ll"
 ECHO;
        YY_BREAK
-#line 2290 "d2_lexer.cc"
+#line 2340 "d2_lexer.cc"
 
        case YY_END_OF_BUFFER:
                {
@@ -2606,7 +2656,7 @@ static int yy_get_next_buffer (void)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 367 )
+                       if ( yy_current_state >= 388 )
                                yy_c = yy_meta[yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -2639,11 +2689,11 @@ static int yy_get_next_buffer (void)
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 367 )
+               if ( yy_current_state >= 388 )
                        yy_c = yy_meta[yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-       yy_is_jam = (yy_current_state == 366);
+       yy_is_jam = (yy_current_state == 387);
 
                return yy_is_jam ? 0 : yy_current_state;
 }
@@ -3392,7 +3442,7 @@ void yyfree (void * ptr )
 
 /* %ok-for-header */
 
-#line 677 "d2_lexer.ll"
+#line 709 "d2_lexer.ll"
 
 
 using namespace isc::dhcp;
index b4405c679d94379406a0d3b3a95088dcbcdcb89a..11d8cbc5e6bdc7e8149422bc26a11ede2f1c6b71 100644 (file)
@@ -253,24 +253,25 @@ namespace isc { namespace d2 {
   {
       switch (that.type_get ())
     {
-      case 66: // value
-      case 93: // ncr_protocol_value
+      case 68: // value
+      case 72: // map_value
+      case 96: // ncr_protocol_value
         value.move< ElementPtr > (that.value);
         break;
 
-      case 54: // "boolean"
+      case 56: // "boolean"
         value.move< bool > (that.value);
         break;
 
-      case 53: // "floating point"
+      case 55: // "floating point"
         value.move< double > (that.value);
         break;
 
-      case 52: // "integer"
+      case 54: // "integer"
         value.move< int64_t > (that.value);
         break;
 
-      case 51: // "constant string"
+      case 53: // "constant string"
         value.move< std::string > (that.value);
         break;
 
@@ -289,24 +290,25 @@ namespace isc { namespace d2 {
     state = that.state;
       switch (that.type_get ())
     {
-      case 66: // value
-      case 93: // ncr_protocol_value
+      case 68: // value
+      case 72: // map_value
+      case 96: // ncr_protocol_value
         value.copy< ElementPtr > (that.value);
         break;
 
-      case 54: // "boolean"
+      case 56: // "boolean"
         value.copy< bool > (that.value);
         break;
 
-      case 53: // "floating point"
+      case 55: // "floating point"
         value.copy< double > (that.value);
         break;
 
-      case 52: // "integer"
+      case 54: // "integer"
         value.copy< int64_t > (that.value);
         break;
 
-      case 51: // "constant string"
+      case 53: // "constant string"
         value.copy< std::string > (that.value);
         break;
 
@@ -346,46 +348,53 @@ namespace isc { namespace d2 {
         << yysym.location << ": ";
     switch (yytype)
     {
-            case 51: // "constant string"
+            case 53: // "constant string"
 
-#line 108 "d2_parser.yy" // lalr1.cc:636
+#line 111 "d2_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< std::string > (); }
-#line 354 "d2_parser.cc" // lalr1.cc:636
+#line 356 "d2_parser.cc" // lalr1.cc:636
         break;
 
-      case 52: // "integer"
+      case 54: // "integer"
 
-#line 108 "d2_parser.yy" // lalr1.cc:636
+#line 111 "d2_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< int64_t > (); }
-#line 361 "d2_parser.cc" // lalr1.cc:636
+#line 363 "d2_parser.cc" // lalr1.cc:636
         break;
 
-      case 53: // "floating point"
+      case 55: // "floating point"
 
-#line 108 "d2_parser.yy" // lalr1.cc:636
+#line 111 "d2_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< double > (); }
-#line 368 "d2_parser.cc" // lalr1.cc:636
+#line 370 "d2_parser.cc" // lalr1.cc:636
         break;
 
-      case 54: // "boolean"
+      case 56: // "boolean"
 
-#line 108 "d2_parser.yy" // lalr1.cc:636
+#line 111 "d2_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< bool > (); }
-#line 375 "d2_parser.cc" // lalr1.cc:636
+#line 377 "d2_parser.cc" // lalr1.cc:636
         break;
 
-      case 66: // value
+      case 68: // value
 
-#line 108 "d2_parser.yy" // lalr1.cc:636
+#line 111 "d2_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 382 "d2_parser.cc" // lalr1.cc:636
+#line 384 "d2_parser.cc" // lalr1.cc:636
         break;
 
-      case 93: // ncr_protocol_value
+      case 72: // map_value
 
-#line 108 "d2_parser.yy" // lalr1.cc:636
+#line 111 "d2_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 389 "d2_parser.cc" // lalr1.cc:636
+#line 391 "d2_parser.cc" // lalr1.cc:636
+        break;
+
+      case 96: // ncr_protocol_value
+
+#line 111 "d2_parser.yy" // lalr1.cc:636
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 398 "d2_parser.cc" // lalr1.cc:636
         break;
 
 
@@ -585,24 +594,25 @@ namespace isc { namespace d2 {
          when using variants.  */
         switch (yyr1_[yyn])
     {
-      case 66: // value
-      case 93: // ncr_protocol_value
+      case 68: // value
+      case 72: // map_value
+      case 96: // ncr_protocol_value
         yylhs.value.build< ElementPtr > ();
         break;
 
-      case 54: // "boolean"
+      case 56: // "boolean"
         yylhs.value.build< bool > ();
         break;
 
-      case 53: // "floating point"
+      case 55: // "floating point"
         yylhs.value.build< double > ();
         break;
 
-      case 52: // "integer"
+      case 54: // "integer"
         yylhs.value.build< int64_t > ();
         break;
 
-      case 51: // "constant string"
+      case 53: // "constant string"
         yylhs.value.build< std::string > ();
         break;
 
@@ -624,275 +634,281 @@ namespace isc { namespace d2 {
           switch (yyn)
             {
   case 2:
-#line 117 "d2_parser.yy" // lalr1.cc:859
+#line 120 "d2_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.NO_KEYWORD; }
-#line 630 "d2_parser.cc" // lalr1.cc:859
+#line 640 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 4:
-#line 118 "d2_parser.yy" // lalr1.cc:859
+#line 121 "d2_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.CONFIG; }
-#line 636 "d2_parser.cc" // lalr1.cc:859
+#line 646 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 6:
-#line 119 "d2_parser.yy" // lalr1.cc:859
+#line 122 "d2_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.DHCPDDNS; }
-#line 642 "d2_parser.cc" // lalr1.cc:859
+#line 652 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 8:
-#line 120 "d2_parser.yy" // lalr1.cc:859
+#line 123 "d2_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.TSIG_KEY; }
-#line 648 "d2_parser.cc" // lalr1.cc:859
+#line 658 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 10:
-#line 121 "d2_parser.yy" // lalr1.cc:859
+#line 124 "d2_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.TSIG_KEYS; }
-#line 654 "d2_parser.cc" // lalr1.cc:859
+#line 664 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 12:
-#line 122 "d2_parser.yy" // lalr1.cc:859
+#line 125 "d2_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.DDNS_DOMAIN; }
-#line 660 "d2_parser.cc" // lalr1.cc:859
+#line 670 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 14:
-#line 123 "d2_parser.yy" // lalr1.cc:859
+#line 126 "d2_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.DDNS_DOMAINS; }
-#line 666 "d2_parser.cc" // lalr1.cc:859
+#line 676 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 16:
-#line 124 "d2_parser.yy" // lalr1.cc:859
+#line 127 "d2_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.DNS_SERVERS; }
-#line 672 "d2_parser.cc" // lalr1.cc:859
+#line 682 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 18:
-#line 125 "d2_parser.yy" // lalr1.cc:859
+#line 128 "d2_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.DNS_SERVERS; }
-#line 678 "d2_parser.cc" // lalr1.cc:859
+#line 688 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 20:
-#line 133 "d2_parser.yy" // lalr1.cc:859
+#line 136 "d2_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); }
-#line 684 "d2_parser.cc" // lalr1.cc:859
+#line 694 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 21:
-#line 134 "d2_parser.yy" // lalr1.cc:859
+#line 137 "d2_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); }
-#line 690 "d2_parser.cc" // lalr1.cc:859
+#line 700 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 22:
-#line 135 "d2_parser.yy" // lalr1.cc:859
+#line 138 "d2_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); }
-#line 696 "d2_parser.cc" // lalr1.cc:859
+#line 706 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 23:
-#line 136 "d2_parser.yy" // lalr1.cc:859
+#line 139 "d2_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); }
-#line 702 "d2_parser.cc" // lalr1.cc:859
+#line 712 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 24:
-#line 137 "d2_parser.yy" // lalr1.cc:859
+#line 140 "d2_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
-#line 708 "d2_parser.cc" // lalr1.cc:859
+#line 718 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 25:
-#line 138 "d2_parser.yy" // lalr1.cc:859
+#line 141 "d2_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 714 "d2_parser.cc" // lalr1.cc:859
+#line 724 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 26:
-#line 139 "d2_parser.yy" // lalr1.cc:859
+#line 142 "d2_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 720 "d2_parser.cc" // lalr1.cc:859
+#line 730 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 27:
-#line 142 "d2_parser.yy" // lalr1.cc:859
+#line 145 "d2_parser.yy" // lalr1.cc:859
     {
     // Push back the JSON value on the stack
     ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ());
 }
-#line 729 "d2_parser.cc" // lalr1.cc:859
+#line 739 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 28:
-#line 147 "d2_parser.yy" // lalr1.cc:859
+#line 150 "d2_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 740 "d2_parser.cc" // lalr1.cc:859
+#line 750 "d2_parser.cc" // lalr1.cc:859
     break;
 
   case 29:
-#line 152 "d2_parser.yy" // lalr1.cc:859
+#line 155 "d2_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 750 "d2_parser.cc" // lalr1.cc:859
+#line 760 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 32:
-#line 163 "d2_parser.yy" // lalr1.cc:859
+  case 30:
+#line 161 "d2_parser.yy" // lalr1.cc:859
+    { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
+#line 766 "d2_parser.cc" // lalr1.cc:859
+    break;
+
+  case 33:
+#line 168 "d2_parser.yy" // lalr1.cc:859
     {
                   // map containing a single entry
                   ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 759 "d2_parser.cc" // lalr1.cc:859
+#line 775 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 33:
-#line 167 "d2_parser.yy" // lalr1.cc:859
+  case 34:
+#line 172 "d2_parser.yy" // lalr1.cc:859
     {
                   // map consisting of a shorter map followed by
                   // comma and string:value
                   ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 769 "d2_parser.cc" // lalr1.cc:859
+#line 785 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 34:
-#line 174 "d2_parser.yy" // lalr1.cc:859
+  case 35:
+#line 179 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 778 "d2_parser.cc" // lalr1.cc:859
+#line 794 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 35:
-#line 177 "d2_parser.yy" // lalr1.cc:859
+  case 36:
+#line 182 "d2_parser.yy" // lalr1.cc:859
     {
     // list parsing complete. Put any sanity checking here
 }
-#line 786 "d2_parser.cc" // lalr1.cc:859
+#line 802 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 38:
-#line 185 "d2_parser.yy" // lalr1.cc:859
+  case 39:
+#line 190 "d2_parser.yy" // lalr1.cc:859
     {
                   // List consisting of a single element.
                   ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 795 "d2_parser.cc" // lalr1.cc:859
+#line 811 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 39:
-#line 189 "d2_parser.yy" // lalr1.cc:859
+  case 40:
+#line 194 "d2_parser.yy" // lalr1.cc:859
     {
                   // List ending with , and a value.
                   ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 804 "d2_parser.cc" // lalr1.cc:859
+#line 820 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 40:
-#line 200 "d2_parser.yy" // lalr1.cc:859
+  case 41:
+#line 205 "d2_parser.yy" // lalr1.cc:859
     {
     const std::string& where = ctx.contextName();
     const std::string& keyword = yystack_[1].value.as< std::string > ();
     error(yystack_[1].location,
           "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
 }
-#line 815 "d2_parser.cc" // lalr1.cc:859
+#line 831 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 41:
-#line 210 "d2_parser.yy" // lalr1.cc:859
+  case 42:
+#line 215 "d2_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 826 "d2_parser.cc" // lalr1.cc:859
+#line 842 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 42:
-#line 215 "d2_parser.yy" // lalr1.cc:859
+  case 43:
+#line 220 "d2_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 836 "d2_parser.cc" // lalr1.cc:859
+#line 852 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 51:
-#line 237 "d2_parser.yy" // lalr1.cc:859
+  case 52:
+#line 242 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("DhcpDdns", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.DHCPDDNS);
 }
-#line 847 "d2_parser.cc" // lalr1.cc:859
+#line 863 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 52:
-#line 242 "d2_parser.yy" // lalr1.cc:859
+  case 53:
+#line 247 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 856 "d2_parser.cc" // lalr1.cc:859
+#line 872 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 53:
-#line 247 "d2_parser.yy" // lalr1.cc:859
+  case 54:
+#line 252 "d2_parser.yy" // lalr1.cc:859
     {
     // Parse the dhcpddns map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 866 "d2_parser.cc" // lalr1.cc:859
+#line 882 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 54:
-#line 251 "d2_parser.yy" // lalr1.cc:859
+  case 55:
+#line 256 "d2_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 874 "d2_parser.cc" // lalr1.cc:859
+#line 890 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 66:
-#line 271 "d2_parser.yy" // lalr1.cc:859
+  case 69:
+#line 278 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 882 "d2_parser.cc" // lalr1.cc:859
+#line 898 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 67:
-#line 273 "d2_parser.yy" // lalr1.cc:859
+  case 70:
+#line 280 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-address", s);
     ctx.leave();
 }
-#line 892 "d2_parser.cc" // lalr1.cc:859
+#line 908 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 68:
-#line 279 "d2_parser.yy" // lalr1.cc:859
+  case 71:
+#line 286 "d2_parser.yy" // lalr1.cc:859
     {
     if (yystack_[0].value.as< int64_t > () <= 0 || yystack_[0].value.as< int64_t > () >= 65536 ) {
         error(yystack_[0].location, "port must be greater than zero but less than 65536");
@@ -900,11 +916,11 @@ namespace isc { namespace d2 {
     ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("port", i);
 }
-#line 904 "d2_parser.cc" // lalr1.cc:859
+#line 920 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 69:
-#line 287 "d2_parser.yy" // lalr1.cc:859
+  case 72:
+#line 294 "d2_parser.yy" // lalr1.cc:859
     {
     if (yystack_[0].value.as< int64_t > () <= 0) {
         error(yystack_[0].location, "dns-server-timeout must be greater than zero");
@@ -913,178 +929,250 @@ namespace isc { namespace d2 {
         ctx.stack_.back()->set("dns-server-timeout", i);
     }
 }
-#line 917 "d2_parser.cc" // lalr1.cc:859
+#line 933 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 70:
-#line 296 "d2_parser.yy" // lalr1.cc:859
+  case 73:
+#line 303 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NCR_PROTOCOL);
 }
-#line 925 "d2_parser.cc" // lalr1.cc:859
+#line 941 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 71:
-#line 298 "d2_parser.yy" // lalr1.cc:859
+  case 74:
+#line 305 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 934 "d2_parser.cc" // lalr1.cc:859
+#line 950 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 72:
-#line 304 "d2_parser.yy" // lalr1.cc:859
+  case 75:
+#line 311 "d2_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); }
-#line 940 "d2_parser.cc" // lalr1.cc:859
+#line 956 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 73:
-#line 305 "d2_parser.yy" // lalr1.cc:859
+  case 76:
+#line 312 "d2_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); }
-#line 946 "d2_parser.cc" // lalr1.cc:859
+#line 962 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 74:
-#line 308 "d2_parser.yy" // lalr1.cc:859
+  case 77:
+#line 315 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NCR_FORMAT);
 }
-#line 954 "d2_parser.cc" // lalr1.cc:859
+#line 970 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 75:
-#line 310 "d2_parser.yy" // lalr1.cc:859
+  case 78:
+#line 317 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ncr-format", json);
     ctx.leave();
 }
-#line 964 "d2_parser.cc" // lalr1.cc:859
+#line 980 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 76:
-#line 316 "d2_parser.yy" // lalr1.cc:859
+  case 79:
+#line 323 "d2_parser.yy" // lalr1.cc:859
+    {
+    ctx.enter(ctx.NO_KEYWORD);
+}
+#line 988 "d2_parser.cc" // lalr1.cc:859
+    break;
+
+  case 80:
+#line 325 "d2_parser.yy" // lalr1.cc:859
+    {
+    ElementPtr parent = ctx.stack_.back();
+    ElementPtr user_context = yystack_[0].value.as< ElementPtr > ();
+    ConstElementPtr old = parent->get("user-context");
+
+    // Handle already existing user context
+    if (old) {
+        // Check if it was a comment or a duplicate
+        if ((old->size() != 1) || !old->contains("comment")) {
+            std::stringstream msg;
+            msg << "duplicate user-context entries (previous at "
+                << old->getPosition().str() << ")";
+            error(yystack_[3].location, msg.str());
+        }
+        // Merge the comment
+        user_context->set("comment", old->get("comment"));
+    }
+
+    // Set the user context
+    parent->set("user-context", user_context);
+    ctx.leave();
+}
+#line 1015 "d2_parser.cc" // lalr1.cc:859
+    break;
+
+  case 81:
+#line 348 "d2_parser.yy" // lalr1.cc:859
+    {
+    ctx.enter(ctx.NO_KEYWORD);
+}
+#line 1023 "d2_parser.cc" // lalr1.cc:859
+    break;
+
+  case 82:
+#line 350 "d2_parser.yy" // lalr1.cc:859
+    {
+    ElementPtr parent = ctx.stack_.back();
+    ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location)));
+    ElementPtr comment(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
+    user_context->set("comment", comment);
+
+    // Handle already existing user context
+    ConstElementPtr old = parent->get("user-context");
+    if (old) {
+        // Check for duplicate comment
+        if (old->contains("comment")) {
+            std::stringstream msg;
+            msg << "duplicate user-context/comment entries (previous at "
+                << old->getPosition().str() << ")";
+            error(yystack_[3].location, msg.str());
+        }
+        // Merge the user context in the comment
+        merge(user_context, old);
+    }
+
+    // Set the user context
+    parent->set("user-context", user_context);
+    ctx.leave();
+}
+#line 1052 "d2_parser.cc" // lalr1.cc:859
+    break;
+
+  case 83:
+#line 375 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("forward-ddns", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.FORWARD_DDNS);
 }
-#line 975 "d2_parser.cc" // lalr1.cc:859
+#line 1063 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 77:
-#line 321 "d2_parser.yy" // lalr1.cc:859
+  case 84:
+#line 380 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 984 "d2_parser.cc" // lalr1.cc:859
+#line 1072 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 78:
-#line 326 "d2_parser.yy" // lalr1.cc:859
+  case 85:
+#line 385 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reverse-ddns", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.REVERSE_DDNS);
 }
-#line 995 "d2_parser.cc" // lalr1.cc:859
+#line 1083 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 79:
-#line 331 "d2_parser.yy" // lalr1.cc:859
+  case 86:
+#line 390 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1004 "d2_parser.cc" // lalr1.cc:859
+#line 1092 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 86:
-#line 350 "d2_parser.yy" // lalr1.cc:859
+  case 93:
+#line 409 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ddns-domains", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.DDNS_DOMAINS);
 }
-#line 1015 "d2_parser.cc" // lalr1.cc:859
+#line 1103 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 87:
-#line 355 "d2_parser.yy" // lalr1.cc:859
+  case 94:
+#line 414 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1024 "d2_parser.cc" // lalr1.cc:859
+#line 1112 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 88:
-#line 360 "d2_parser.yy" // lalr1.cc:859
+  case 95:
+#line 419 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 1033 "d2_parser.cc" // lalr1.cc:859
+#line 1121 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 89:
-#line 363 "d2_parser.yy" // lalr1.cc:859
+  case 96:
+#line 422 "d2_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1041 "d2_parser.cc" // lalr1.cc:859
+#line 1129 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 94:
-#line 375 "d2_parser.yy" // lalr1.cc:859
+  case 101:
+#line 434 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1051 "d2_parser.cc" // lalr1.cc:859
+#line 1139 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 95:
-#line 379 "d2_parser.yy" // lalr1.cc:859
+  case 102:
+#line 438 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1059 "d2_parser.cc" // lalr1.cc:859
+#line 1147 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 96:
-#line 383 "d2_parser.yy" // lalr1.cc:859
+  case 103:
+#line 442 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1068 "d2_parser.cc" // lalr1.cc:859
+#line 1156 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 97:
-#line 386 "d2_parser.yy" // lalr1.cc:859
+  case 104:
+#line 445 "d2_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1076 "d2_parser.cc" // lalr1.cc:859
+#line 1164 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 104:
-#line 401 "d2_parser.yy" // lalr1.cc:859
+  case 113:
+#line 462 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1084 "d2_parser.cc" // lalr1.cc:859
+#line 1172 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 105:
-#line 403 "d2_parser.yy" // lalr1.cc:859
+  case 114:
+#line 464 "d2_parser.yy" // lalr1.cc:859
     {
     if (yystack_[0].value.as< std::string > () == "") {
         error(yystack_[1].location, "Ddns domain name cannot be blank");
@@ -1094,110 +1182,110 @@ namespace isc { namespace d2 {
     ctx.stack_.back()->set("name", name);
     ctx.leave();
 }
-#line 1098 "d2_parser.cc" // lalr1.cc:859
+#line 1186 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 106:
-#line 413 "d2_parser.yy" // lalr1.cc:859
+  case 115:
+#line 474 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1106 "d2_parser.cc" // lalr1.cc:859
+#line 1194 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 107:
-#line 415 "d2_parser.yy" // lalr1.cc:859
+  case 116:
+#line 476 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr elem(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("key-name", name);
     ctx.leave();
 }
-#line 1117 "d2_parser.cc" // lalr1.cc:859
+#line 1205 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 108:
-#line 425 "d2_parser.yy" // lalr1.cc:859
+  case 117:
+#line 486 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dns-servers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.DNS_SERVERS);
 }
-#line 1128 "d2_parser.cc" // lalr1.cc:859
+#line 1216 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 109:
-#line 430 "d2_parser.yy" // lalr1.cc:859
+  case 118:
+#line 491 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1137 "d2_parser.cc" // lalr1.cc:859
+#line 1225 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 110:
-#line 435 "d2_parser.yy" // lalr1.cc:859
+  case 119:
+#line 496 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 1146 "d2_parser.cc" // lalr1.cc:859
+#line 1234 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 111:
-#line 438 "d2_parser.yy" // lalr1.cc:859
+  case 120:
+#line 499 "d2_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1154 "d2_parser.cc" // lalr1.cc:859
+#line 1242 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 114:
-#line 446 "d2_parser.yy" // lalr1.cc:859
+  case 123:
+#line 507 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1164 "d2_parser.cc" // lalr1.cc:859
+#line 1252 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 115:
-#line 450 "d2_parser.yy" // lalr1.cc:859
+  case 124:
+#line 511 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1172 "d2_parser.cc" // lalr1.cc:859
+#line 1260 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 116:
-#line 454 "d2_parser.yy" // lalr1.cc:859
+  case 125:
+#line 515 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1181 "d2_parser.cc" // lalr1.cc:859
+#line 1269 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 117:
-#line 457 "d2_parser.yy" // lalr1.cc:859
+  case 126:
+#line 518 "d2_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1189 "d2_parser.cc" // lalr1.cc:859
+#line 1277 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 124:
-#line 471 "d2_parser.yy" // lalr1.cc:859
+  case 135:
+#line 534 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1197 "d2_parser.cc" // lalr1.cc:859
+#line 1285 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 125:
-#line 473 "d2_parser.yy" // lalr1.cc:859
+  case 136:
+#line 536 "d2_parser.yy" // lalr1.cc:859
     {
     if (yystack_[0].value.as< std::string > () != "") {
         error(yystack_[1].location, "hostname is not yet supported");
@@ -1207,29 +1295,29 @@ namespace isc { namespace d2 {
     ctx.stack_.back()->set("hostname", name);
     ctx.leave();
 }
-#line 1211 "d2_parser.cc" // lalr1.cc:859
+#line 1299 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 126:
-#line 483 "d2_parser.yy" // lalr1.cc:859
+  case 137:
+#line 546 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1219 "d2_parser.cc" // lalr1.cc:859
+#line 1307 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 127:
-#line 485 "d2_parser.yy" // lalr1.cc:859
+  case 138:
+#line 548 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-address", s);
     ctx.leave();
 }
-#line 1229 "d2_parser.cc" // lalr1.cc:859
+#line 1317 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 128:
-#line 491 "d2_parser.yy" // lalr1.cc:859
+  case 139:
+#line 554 "d2_parser.yy" // lalr1.cc:859
     {
     if (yystack_[0].value.as< int64_t > () <= 0 || yystack_[0].value.as< int64_t > () >= 65536 ) {
         error(yystack_[0].location, "port must be greater than zero but less than 65536");
@@ -1237,92 +1325,92 @@ namespace isc { namespace d2 {
     ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("port", i);
 }
-#line 1241 "d2_parser.cc" // lalr1.cc:859
+#line 1329 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 129:
-#line 505 "d2_parser.yy" // lalr1.cc:859
+  case 140:
+#line 568 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("tsig-keys", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.TSIG_KEYS);
 }
-#line 1252 "d2_parser.cc" // lalr1.cc:859
+#line 1340 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 130:
-#line 510 "d2_parser.yy" // lalr1.cc:859
+  case 141:
+#line 573 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1261 "d2_parser.cc" // lalr1.cc:859
+#line 1349 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 131:
-#line 515 "d2_parser.yy" // lalr1.cc:859
+  case 142:
+#line 578 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 1270 "d2_parser.cc" // lalr1.cc:859
+#line 1358 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 132:
-#line 518 "d2_parser.yy" // lalr1.cc:859
+  case 143:
+#line 581 "d2_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1278 "d2_parser.cc" // lalr1.cc:859
+#line 1366 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 137:
-#line 530 "d2_parser.yy" // lalr1.cc:859
+  case 148:
+#line 593 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1288 "d2_parser.cc" // lalr1.cc:859
+#line 1376 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 138:
-#line 534 "d2_parser.yy" // lalr1.cc:859
+  case 149:
+#line 597 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1296 "d2_parser.cc" // lalr1.cc:859
+#line 1384 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 139:
-#line 538 "d2_parser.yy" // lalr1.cc:859
+  case 150:
+#line 601 "d2_parser.yy" // lalr1.cc:859
     {
     // Parse tsig key list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1306 "d2_parser.cc" // lalr1.cc:859
+#line 1394 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 140:
-#line 542 "d2_parser.yy" // lalr1.cc:859
+  case 151:
+#line 605 "d2_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1314 "d2_parser.cc" // lalr1.cc:859
+#line 1402 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 148:
-#line 558 "d2_parser.yy" // lalr1.cc:859
+  case 161:
+#line 623 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1322 "d2_parser.cc" // lalr1.cc:859
+#line 1410 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 149:
-#line 560 "d2_parser.yy" // lalr1.cc:859
+  case 162:
+#line 625 "d2_parser.yy" // lalr1.cc:859
     {
     if (yystack_[0].value.as< std::string > () == "") {
         error(yystack_[1].location, "TSIG key name cannot be blank");
@@ -1332,19 +1420,19 @@ namespace isc { namespace d2 {
     ctx.stack_.back()->set("name", name);
     ctx.leave();
 }
-#line 1336 "d2_parser.cc" // lalr1.cc:859
+#line 1424 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 150:
-#line 570 "d2_parser.yy" // lalr1.cc:859
+  case 163:
+#line 635 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1344 "d2_parser.cc" // lalr1.cc:859
+#line 1432 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 151:
-#line 572 "d2_parser.yy" // lalr1.cc:859
+  case 164:
+#line 637 "d2_parser.yy" // lalr1.cc:859
     {
     if (yystack_[0].value.as< std::string > () == "") {
         error(yystack_[1].location, "TSIG key algorithm cannot be blank");
@@ -1353,11 +1441,11 @@ namespace isc { namespace d2 {
     ctx.stack_.back()->set("algorithm", elem);
     ctx.leave();
 }
-#line 1357 "d2_parser.cc" // lalr1.cc:859
+#line 1445 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 152:
-#line 581 "d2_parser.yy" // lalr1.cc:859
+  case 165:
+#line 646 "d2_parser.yy" // lalr1.cc:859
     {
     if (yystack_[0].value.as< int64_t > () < 0 || (yystack_[0].value.as< int64_t > () > 0  && (yystack_[0].value.as< int64_t > () % 8 != 0))) {
         error(yystack_[0].location, "TSIG key digest-bits must either be zero or a positive, multiple of eight");
@@ -1365,19 +1453,19 @@ namespace isc { namespace d2 {
     ElementPtr elem(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("digest-bits", elem);
 }
-#line 1369 "d2_parser.cc" // lalr1.cc:859
+#line 1457 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 153:
-#line 589 "d2_parser.yy" // lalr1.cc:859
+  case 166:
+#line 654 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1377 "d2_parser.cc" // lalr1.cc:859
+#line 1465 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 154:
-#line 591 "d2_parser.yy" // lalr1.cc:859
+  case 167:
+#line 656 "d2_parser.yy" // lalr1.cc:859
     {
     if (yystack_[0].value.as< std::string > () == "") {
         error(yystack_[1].location, "TSIG key secret cannot be blank");
@@ -1386,248 +1474,248 @@ namespace isc { namespace d2 {
     ctx.stack_.back()->set("secret", elem);
     ctx.leave();
 }
-#line 1390 "d2_parser.cc" // lalr1.cc:859
+#line 1478 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 155:
-#line 604 "d2_parser.yy" // lalr1.cc:859
+  case 168:
+#line 669 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1398 "d2_parser.cc" // lalr1.cc:859
+#line 1486 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 156:
-#line 606 "d2_parser.yy" // lalr1.cc:859
+  case 169:
+#line 671 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1407 "d2_parser.cc" // lalr1.cc:859
+#line 1495 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 157:
-#line 611 "d2_parser.yy" // lalr1.cc:859
+  case 170:
+#line 676 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1415 "d2_parser.cc" // lalr1.cc:859
+#line 1503 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 158:
-#line 613 "d2_parser.yy" // lalr1.cc:859
+  case 171:
+#line 678 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1424 "d2_parser.cc" // lalr1.cc:859
+#line 1512 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 159:
-#line 618 "d2_parser.yy" // lalr1.cc:859
+  case 172:
+#line 683 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1432 "d2_parser.cc" // lalr1.cc:859
+#line 1520 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 160:
-#line 620 "d2_parser.yy" // lalr1.cc:859
+  case 173:
+#line 685 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1441 "d2_parser.cc" // lalr1.cc:859
+#line 1529 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 161:
-#line 630 "d2_parser.yy" // lalr1.cc:859
+  case 174:
+#line 695 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("Logging", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.LOGGING);
 }
-#line 1452 "d2_parser.cc" // lalr1.cc:859
+#line 1540 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 162:
-#line 635 "d2_parser.yy" // lalr1.cc:859
+  case 175:
+#line 700 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1461 "d2_parser.cc" // lalr1.cc:859
+#line 1549 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 166:
-#line 652 "d2_parser.yy" // lalr1.cc:859
+  case 179:
+#line 717 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("loggers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.LOGGERS);
 }
-#line 1472 "d2_parser.cc" // lalr1.cc:859
+#line 1560 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 167:
-#line 657 "d2_parser.yy" // lalr1.cc:859
+  case 180:
+#line 722 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1481 "d2_parser.cc" // lalr1.cc:859
+#line 1569 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 170:
-#line 669 "d2_parser.yy" // lalr1.cc:859
+  case 183:
+#line 734 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(l);
     ctx.stack_.push_back(l);
 }
-#line 1491 "d2_parser.cc" // lalr1.cc:859
+#line 1579 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 171:
-#line 673 "d2_parser.yy" // lalr1.cc:859
+  case 184:
+#line 738 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1499 "d2_parser.cc" // lalr1.cc:859
+#line 1587 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 179:
-#line 688 "d2_parser.yy" // lalr1.cc:859
+  case 194:
+#line 755 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1507 "d2_parser.cc" // lalr1.cc:859
+#line 1595 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 180:
-#line 690 "d2_parser.yy" // lalr1.cc:859
+  case 195:
+#line 757 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("name", name);
     ctx.leave();
 }
-#line 1517 "d2_parser.cc" // lalr1.cc:859
+#line 1605 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 181:
-#line 696 "d2_parser.yy" // lalr1.cc:859
+  case 196:
+#line 763 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("debuglevel", dl);
 }
-#line 1526 "d2_parser.cc" // lalr1.cc:859
+#line 1614 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 182:
-#line 700 "d2_parser.yy" // lalr1.cc:859
+  case 197:
+#line 767 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1534 "d2_parser.cc" // lalr1.cc:859
+#line 1622 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 183:
-#line 702 "d2_parser.yy" // lalr1.cc:859
+  case 198:
+#line 769 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("severity", sev);
     ctx.leave();
 }
-#line 1544 "d2_parser.cc" // lalr1.cc:859
+#line 1632 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 184:
-#line 708 "d2_parser.yy" // lalr1.cc:859
+  case 199:
+#line 775 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output_options", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OUTPUT_OPTIONS);
 }
-#line 1555 "d2_parser.cc" // lalr1.cc:859
+#line 1643 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 185:
-#line 713 "d2_parser.yy" // lalr1.cc:859
+  case 200:
+#line 780 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1564 "d2_parser.cc" // lalr1.cc:859
+#line 1652 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 188:
-#line 722 "d2_parser.yy" // lalr1.cc:859
+  case 203:
+#line 789 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1574 "d2_parser.cc" // lalr1.cc:859
+#line 1662 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 189:
-#line 726 "d2_parser.yy" // lalr1.cc:859
+  case 204:
+#line 793 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1582 "d2_parser.cc" // lalr1.cc:859
+#line 1670 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 196:
-#line 740 "d2_parser.yy" // lalr1.cc:859
+  case 211:
+#line 807 "d2_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1590 "d2_parser.cc" // lalr1.cc:859
+#line 1678 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 197:
-#line 742 "d2_parser.yy" // lalr1.cc:859
+  case 212:
+#line 809 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output", sev);
     ctx.leave();
 }
-#line 1600 "d2_parser.cc" // lalr1.cc:859
+#line 1688 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 198:
-#line 748 "d2_parser.yy" // lalr1.cc:859
+  case 213:
+#line 815 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("flush", flush);
 }
-#line 1609 "d2_parser.cc" // lalr1.cc:859
+#line 1697 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 199:
-#line 753 "d2_parser.yy" // lalr1.cc:859
+  case 214:
+#line 820 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxsize", maxsize);
 }
-#line 1618 "d2_parser.cc" // lalr1.cc:859
+#line 1706 "d2_parser.cc" // lalr1.cc:859
     break;
 
-  case 200:
-#line 758 "d2_parser.yy" // lalr1.cc:859
+  case 215:
+#line 825 "d2_parser.yy" // lalr1.cc:859
     {
     ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxver", maxver);
 }
-#line 1627 "d2_parser.cc" // lalr1.cc:859
+#line 1715 "d2_parser.cc" // lalr1.cc:859
     break;
 
 
-#line 1631 "d2_parser.cc" // lalr1.cc:859
+#line 1719 "d2_parser.cc" // lalr1.cc:859
             default:
               break;
             }
@@ -1882,48 +1970,49 @@ namespace isc { namespace d2 {
   }
 
 
-  const signed char D2Parser::yypact_ninf_ = -111;
+  const signed char D2Parser::yypact_ninf_ = -90;
 
   const signed char D2Parser::yytable_ninf_ = -1;
 
   const short int
   D2Parser::yypact_[] =
   {
-      20,  -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,
-      24,    -2,    35,    51,    96,    31,   100,   101,   102,   103,
-    -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,
-    -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,
-    -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,    -2,    59,
-       2,     3,    10,   104,     4,   105,    -6,   106,  -111,   109,
-     114,   115,   110,   117,  -111,  -111,  -111,  -111,  -111,   119,
-    -111,     8,  -111,  -111,  -111,  -111,  -111,  -111,  -111,   121,
-     122,  -111,  -111,  -111,  -111,  -111,  -111,    19,  -111,  -111,
-    -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,   123,  -111,
-    -111,  -111,    25,  -111,  -111,  -111,  -111,  -111,  -111,   125,
-     118,  -111,  -111,  -111,  -111,  -111,    68,  -111,  -111,  -111,
-    -111,  -111,   127,   126,  -111,  -111,   124,  -111,  -111,    69,
-    -111,  -111,  -111,  -111,  -111,    29,  -111,  -111,    -2,    -2,
-    -111,    83,   131,   132,   133,   134,   135,  -111,     2,  -111,
-     136,    92,    93,   142,   143,   144,   145,   146,     3,  -111,
-     147,   107,   148,   149,    10,  -111,    10,  -111,   104,   150,
-     151,   152,     4,  -111,     4,  -111,   105,   153,   108,   154,
-      -6,  -111,    -6,   106,  -111,  -111,  -111,   157,    -2,    -2,
-      -2,   155,   156,  -111,   113,  -111,  -111,    77,   158,   159,
-     160,   163,  -111,   120,  -111,   129,   130,  -111,    71,  -111,
-     137,   164,   138,  -111,    72,  -111,   139,  -111,   140,  -111,
-      75,  -111,    -2,  -111,  -111,  -111,     3,   141,  -111,  -111,
-    -111,  -111,  -111,   -14,   -14,   104,  -111,  -111,  -111,  -111,
-    -111,   106,  -111,  -111,  -111,  -111,  -111,  -111,    78,  -111,
-      79,  -111,  -111,  -111,  -111,    81,  -111,  -111,  -111,    82,
-     166,    94,  -111,   161,   141,  -111,   169,   -14,  -111,  -111,
-    -111,  -111,   165,  -111,   171,  -111,   170,   105,  -111,    98,
-    -111,   172,    22,   170,  -111,  -111,  -111,  -111,   178,  -111,
-    -111,    85,  -111,  -111,  -111,  -111,  -111,  -111,   181,   182,
-     162,   183,    22,  -111,   167,   187,  -111,   168,  -111,  -111,
-     186,  -111,  -111,    99,  -111,     7,   186,  -111,  -111,   190,
-     191,   192,    91,  -111,  -111,  -111,  -111,  -111,  -111,   193,
-     173,   174,   176,     7,  -111,   179,  -111,  -111,  -111,  -111,
-    -111
+      47,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+      12,     2,     1,    23,    33,    11,    38,    58,    64,    73,
+     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,     2,   -25,
+       8,     9,    15,    96,    37,   115,    21,   116,   -90,   124,
+     113,   127,   130,   137,   -90,   -90,   -90,   -90,   -90,   146,
+     -90,    19,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   148,
+     150,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,    46,
+     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+     -90,   -90,   152,   -90,   -90,   -90,   -90,   -90,    76,   -90,
+     -90,   -90,   -90,   -90,   -90,   151,   155,   -90,   -90,   -90,
+     -90,   -90,   -90,   -90,    77,   -90,   -90,   -90,   -90,   -90,
+     153,   157,   -90,   -90,   161,   -90,   -90,   -90,   -90,    78,
+     -90,   -90,   -90,   -90,   -90,   118,   -90,   -90,     2,     2,
+     -90,   108,   162,   163,   164,   165,   166,   -90,     8,   -90,
+     167,   119,   120,   168,   171,   172,   173,   174,   175,   176,
+       9,   -90,   177,   128,   179,   180,    15,   -90,    15,   -90,
+      96,   181,   182,   183,    37,   -90,    37,   -90,   115,   184,
+     135,   186,    21,   -90,    21,   116,   -90,   -90,   -90,   187,
+       2,     2,     2,   185,   188,   -90,   140,   -90,   -90,    70,
+     178,   189,   141,   190,   195,   198,   -90,   154,   -90,   156,
+     158,   -90,    79,   -90,   159,   199,   160,   -90,    97,   -90,
+     169,   -90,   170,   -90,    98,   -90,     2,   -90,   -90,   -90,
+       9,   191,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+     -12,   -12,    96,   -90,   -90,   -90,   -90,   -90,   116,   -90,
+     -90,   -90,   -90,   -90,   -90,    99,   -90,   101,   -90,   -90,
+     -90,   -90,   109,   -90,   -90,   -90,   110,   200,   126,   -90,
+     201,   191,   -90,   204,   -12,   -90,   -90,   -90,   -90,   205,
+     -90,   209,   -90,   208,   115,   -90,   143,   -90,   210,    30,
+     208,   -90,   -90,   -90,   -90,   213,   -90,   -90,   -90,   -90,
+     111,   -90,   -90,   -90,   -90,   -90,   -90,   214,   215,   192,
+     216,    30,   -90,   194,   219,   -90,   197,   -90,   -90,   218,
+     -90,   -90,   145,   -90,    34,   218,   -90,   -90,   217,   223,
+     224,   112,   -90,   -90,   -90,   -90,   -90,   -90,   225,   196,
+     202,   203,    34,   -90,   206,   -90,   -90,   -90,   -90,   -90
   };
 
   const unsigned char
@@ -1931,205 +2020,214 @@ namespace isc { namespace d2 {
   {
        0,     2,     4,     6,     8,    10,    12,    14,    16,    18,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       1,    34,    28,    24,    23,    20,    21,    22,    27,     3,
-      25,    26,    41,     5,    53,     7,   139,     9,   131,    11,
-      96,    13,    88,    15,   116,    17,   110,    19,    36,    30,
-       0,     0,     0,   133,     0,    90,     0,     0,    38,     0,
-      37,     0,     0,    31,   155,   157,   159,    51,   161,     0,
-      50,     0,    43,    48,    45,    47,    49,    46,    66,     0,
-       0,    70,    74,    76,    78,   129,    65,     0,    55,    57,
-      58,    59,    60,    61,    62,    63,    64,   150,     0,   153,
-     148,   147,     0,   141,   143,   144,   145,   146,   137,     0,
-     134,   135,   106,   108,   104,   103,     0,    98,   100,   101,
-     102,    94,     0,    91,    92,   126,     0,   124,   123,     0,
-     118,   120,   121,   122,   114,     0,   112,    35,     0,     0,
-      29,     0,     0,     0,     0,     0,     0,    40,     0,    42,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    54,
-       0,     0,     0,     0,     0,   140,     0,   132,     0,     0,
-       0,     0,     0,    97,     0,    89,     0,     0,     0,     0,
-       0,   117,     0,     0,   111,    39,    32,     0,     0,     0,
-       0,     0,     0,    44,     0,    68,    69,     0,     0,     0,
-       0,     0,    56,     0,   152,     0,     0,   142,     0,   136,
-       0,     0,     0,    99,     0,    93,     0,   128,     0,   119,
-       0,   113,     0,   156,   158,   160,     0,     0,    67,    72,
-      73,    71,    75,    80,    80,   133,   151,   154,   149,   138,
-     107,     0,   105,    95,   127,   125,   115,    33,     0,   166,
-       0,   163,   165,    86,    85,     0,    81,    82,    84,     0,
-       0,     0,    52,     0,     0,   162,     0,     0,    77,    79,
-     130,   109,     0,   164,     0,    83,     0,    90,   170,     0,
-     168,     0,     0,     0,   167,    87,   179,   184,     0,   182,
-     178,     0,   172,   174,   176,   177,   175,   169,     0,     0,
-       0,     0,     0,   171,     0,     0,   181,     0,   173,   180,
-       0,   183,   188,     0,   186,     0,     0,   185,   196,     0,
-       0,     0,     0,   190,   192,   193,   194,   195,   187,     0,
-       0,     0,     0,     0,   189,     0,   198,   199,   200,   191,
-     197
+       1,    35,    28,    24,    23,    20,    21,    22,    27,     3,
+      25,    26,    42,     5,    54,     7,   150,     9,   142,    11,
+     103,    13,    95,    15,   125,    17,   119,    19,    37,    31,
+       0,     0,     0,   144,     0,    97,     0,     0,    39,     0,
+      38,     0,     0,    32,   168,   170,   172,    52,   174,     0,
+      51,     0,    44,    49,    46,    48,    50,    47,    69,     0,
+       0,    73,    77,    79,    81,    83,    85,   140,    68,     0,
+      56,    58,    59,    60,    61,    62,    66,    67,    63,    64,
+      65,   163,     0,   166,   161,   160,   158,   159,     0,   152,
+     154,   155,   156,   157,   148,     0,   145,   146,   115,   117,
+     113,   112,   110,   111,     0,   105,   107,   108,   109,   101,
+       0,    98,    99,   137,     0,   135,   134,   132,   133,     0,
+     127,   129,   130,   131,   123,     0,   121,    36,     0,     0,
+      29,     0,     0,     0,     0,     0,     0,    41,     0,    43,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    55,     0,     0,     0,     0,     0,   151,     0,   143,
+       0,     0,     0,     0,     0,   104,     0,    96,     0,     0,
+       0,     0,     0,   126,     0,     0,   120,    40,    33,     0,
+       0,     0,     0,     0,     0,    45,     0,    71,    72,     0,
+       0,     0,     0,     0,     0,     0,    57,     0,   165,     0,
+       0,   153,     0,   147,     0,     0,     0,   106,     0,   100,
+       0,   139,     0,   128,     0,   122,     0,   169,   171,   173,
+       0,     0,    70,    75,    76,    74,    78,    30,    80,    82,
+      87,    87,   144,   164,   167,   162,   149,   116,     0,   114,
+     102,   138,   136,   124,    34,     0,   179,     0,   176,   178,
+      93,    92,     0,    88,    89,    91,     0,     0,     0,    53,
+       0,     0,   175,     0,     0,    84,    86,   141,   118,     0,
+     177,     0,    90,     0,    97,   183,     0,   181,     0,     0,
+       0,   180,    94,   194,   199,     0,   197,   193,   191,   192,
+       0,   185,   187,   189,   190,   188,   182,     0,     0,     0,
+       0,     0,   184,     0,     0,   196,     0,   186,   195,     0,
+     198,   203,     0,   201,     0,     0,   200,   211,     0,     0,
+       0,     0,   205,   207,   208,   209,   210,   202,     0,     0,
+       0,     0,     0,   204,     0,   213,   214,   215,   206,   212
   };
 
   const signed char
   D2Parser::yypgoto_[] =
   {
-    -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,
-    -111,   -47,  -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,
-    -111,   -50,  -111,  -111,  -111,    50,  -111,  -111,  -111,  -111,
-     -27,    42,  -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,
-    -111,  -111,  -111,  -111,  -111,   -33,  -111,   -65,  -111,  -111,
-    -111,  -111,   -74,  -111,    28,  -111,  -111,  -111,    32,    33,
-    -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,   -34,    26,
-    -111,  -111,  -111,    30,    36,  -111,  -111,  -111,  -111,  -111,
-    -111,  -111,  -111,  -111,   -25,  -111,    40,  -111,  -111,  -111,
-      45,    49,  -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,
-    -111,  -111,  -111,  -111,  -111,  -111,  -111,  -111,   -49,  -111,
-    -111,  -111,   -63,  -111,  -111,   -81,  -111,  -111,  -111,  -111,
-    -111,  -111,  -111,  -111,   -94,  -111,  -111,  -110,  -111,  -111,
-    -111,  -111,  -111
+     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+     -90,   -38,   -90,    20,   -90,   -90,   -90,   -90,   -90,   -90,
+     -90,   -90,   -50,   -90,   -90,   -90,    72,   -90,   -90,   -90,
+     -90,    -8,    63,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+     -90,   -90,   -51,   -90,   -39,   -90,   -90,   -90,   -90,   -90,
+     -16,   -90,   -48,   -90,   -90,   -90,   -90,   -57,   -90,    50,
+     -90,   -90,   -90,    53,    56,   -90,   -90,   -90,   -90,   -90,
+     -90,   -90,   -90,   -17,    48,   -90,   -90,   -90,    51,    52,
+     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -10,
+     -90,    71,   -90,   -90,   -90,    75,    82,   -90,   -90,   -90,
+     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+     -90,   -90,   -90,   -27,   -90,   -90,   -90,   -45,   -90,   -90,
+     -60,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -73,
+     -90,   -90,   -89,   -90,   -90,   -90,   -90,   -90
   };
 
   const short int
   D2Parser::yydefgoto_[] =
   {
       -1,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    28,    29,    30,    49,    62,    63,    31,    48,    59,
-      60,    86,    33,    50,    71,    72,    73,   145,    35,    51,
-      87,    88,    89,   150,    90,    91,    92,   153,   231,    93,
-     154,    94,   155,    95,   156,   255,   256,   257,   258,   266,
-      43,    55,   122,   123,   124,   174,    41,    54,   116,   117,
-     118,   171,   119,   169,   120,   170,    47,    57,   135,   136,
-     182,    45,    56,   129,   130,   131,   179,   132,   177,   133,
-      96,   157,    39,    53,   109,   110,   111,   166,    37,    52,
-     102,   103,   104,   163,   105,   160,   106,   107,   162,    74,
-     142,    75,   143,    76,   144,    77,   146,   250,   251,   252,
-     263,   279,   280,   282,   291,   292,   293,   298,   294,   295,
-     301,   296,   299,   313,   314,   315,   322,   323,   324,   329,
-     325,   326,   327
+      19,    28,    29,    30,    49,   248,    62,    63,    31,    48,
+      59,    60,    88,    33,    50,    71,    72,    73,   155,    35,
+      51,    89,    90,    91,   160,    92,    93,    94,   163,   245,
+      95,   164,    96,   165,    97,   166,    98,   167,    99,   168,
+     272,   273,   274,   275,   283,    43,    55,   130,   131,   132,
+     186,    41,    54,   124,   125,   126,   183,   127,   181,   128,
+     182,    47,    57,   145,   146,   194,    45,    56,   139,   140,
+     141,   191,   142,   189,   143,   100,   169,    39,    53,   115,
+     116,   117,   178,    37,    52,   108,   109,   110,   175,   111,
+     172,   112,   113,   174,    74,   152,    75,   153,    76,   154,
+      77,   156,   267,   268,   269,   280,   296,   297,   299,   310,
+     311,   312,   317,   313,   314,   320,   315,   318,   332,   333,
+     334,   341,   342,   343,   348,   344,   345,   346
   };
 
   const unsigned short int
   D2Parser::yytable_[] =
   {
-      70,    58,   101,    21,   115,    22,   128,    23,   125,   126,
-     253,   148,    64,    65,    66,    67,   149,    78,    79,    80,
-      81,   127,   158,    82,    20,    83,    84,   159,   164,   112,
-     113,    85,   183,   165,    68,   184,    38,    69,   114,    97,
-      98,    99,    32,   318,   100,    69,   319,   320,   321,    24,
-      25,    26,    27,    69,    69,    69,   286,   287,    34,   288,
-     289,    69,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,   172,   180,    69,   164,   172,   173,   181,   180,   239,
-     243,   158,   264,   246,   267,   267,   262,   265,   302,   268,
-     269,   185,   186,   303,   333,   229,   230,   183,    70,   334,
-     271,   283,   316,    36,   284,   317,    42,    40,    46,    44,
-      61,   108,   121,   134,   101,   137,   101,   138,   140,   139,
-     141,   168,   115,   147,   115,   151,   152,   161,   178,   176,
-     128,   167,   128,   175,   187,   188,   189,   190,   191,   192,
-     194,   223,   224,   225,   195,   196,   197,   198,   199,   200,
-     201,   203,   205,   206,   210,   211,   212,   216,   218,   204,
-     217,   222,   226,   227,   228,   272,   233,   234,   235,   241,
-     276,   236,   270,   274,   249,   247,   277,   278,   285,   232,
-     237,   238,   300,   254,   254,   304,   305,   307,   240,   242,
-     244,   245,   310,   312,   330,   331,   332,   335,   193,   248,
-     202,   259,   275,   281,   215,   213,   214,   261,   209,   221,
-     260,   208,   220,   207,   306,   273,   219,   254,   309,   311,
-     297,   308,   328,   339,     0,     0,   337,   336,   338,     0,
-     340,     0,   290,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   290
+      70,   106,   105,   122,   121,   137,   136,    21,    32,    22,
+      58,    23,    20,   107,   270,   123,    38,   138,    64,    65,
+      66,    67,   158,    78,    79,    80,    81,   159,    61,    82,
+      34,    83,    84,    85,    86,   133,   134,    83,    84,    87,
+      36,    69,    68,    83,    84,    40,   101,   102,   103,   170,
+     135,   104,    83,    84,   171,    24,    25,    26,    27,    83,
+      84,    69,    69,    42,   118,   119,   303,   304,    69,   305,
+     306,    44,   337,   120,    69,   338,   339,   340,    46,   176,
+     184,   192,   176,    69,   177,   185,   193,   256,   243,   244,
+      69,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+     184,   192,   170,   114,   281,   260,   263,   279,    70,   282,
+     197,   198,   284,   284,   321,   352,   148,   285,   286,   322,
+     353,   195,   129,   144,   196,   106,   105,   106,   105,   195,
+     147,   149,   288,   122,   121,   122,   121,   107,   150,   107,
+     151,   137,   136,   137,   136,   123,   300,   123,   335,   301,
+     157,   336,   161,   138,   162,   138,   173,   179,   180,   187,
+     188,   199,   237,   238,   239,   190,   200,   201,   202,   203,
+     204,   206,   209,   207,   208,   210,   211,   212,   213,   214,
+     215,   217,   218,   219,   220,   224,   225,   226,   230,   231,
+     232,   236,   240,   242,   249,   241,    22,   250,   264,   246,
+     271,   271,   251,   252,   258,   289,   287,   253,   291,   254,
+     293,   255,   257,   259,   294,   295,   302,   319,   323,   324,
+     326,   349,   261,   262,   329,   331,   266,   350,   351,   354,
+     205,   247,   265,   216,   271,   276,   292,   298,   229,   228,
+     227,   278,   277,   235,   233,   234,   325,   328,   308,   307,
+     330,   223,   355,   222,   290,   316,   356,   357,   221,   359,
+     309,   327,   347,   358,     0,     0,     0,     0,     0,     0,
+     308,   307,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   309
   };
 
   const short int
   D2Parser::yycheck_[] =
   {
-      50,    48,    52,     5,    54,     7,    56,     9,    14,    15,
-      24,     3,    10,    11,    12,    13,     8,    14,    15,    16,
-      17,    27,     3,    20,     0,    22,    23,     8,     3,    25,
-      26,    28,     3,     8,    32,     6,     5,    51,    34,    29,
-      30,    31,     7,    36,    34,    51,    39,    40,    41,    51,
-      52,    53,    54,    51,    51,    51,    34,    35,     7,    37,
-      38,    51,    42,    43,    44,    45,    46,    47,    48,    49,
-      50,     3,     3,    51,     3,     3,     8,     8,     3,     8,
-       8,     3,     3,     8,     3,     3,     8,     8,     3,     8,
-       8,   138,   139,     8,     3,    18,    19,     3,   148,     8,
-       6,     3,     3,     7,     6,     6,     5,     7,     5,     7,
-      51,     7,     7,     7,   164,     6,   166,     3,     8,     4,
-       3,     3,   172,     4,   174,     4,     4,     4,     4,     3,
-     180,     6,   182,     6,    51,     4,     4,     4,     4,     4,
-       4,   188,   189,   190,    52,    52,     4,     4,     4,     4,
-       4,     4,     4,     4,     4,     4,     4,     4,     4,    52,
-      52,     4,     7,     7,    51,     4,     7,     7,     5,     5,
-       5,    51,     6,     4,    33,   222,     5,     7,     6,    21,
-      51,    51,     4,   233,   234,     4,     4,     4,    51,    51,
-      51,    51,     5,     7,     4,     4,     4,     4,   148,   226,
-     158,   234,   267,   277,   176,   172,   174,   241,   168,   183,
-     235,   166,   182,   164,    52,   264,   180,   267,    51,    51,
-     283,   302,   316,   333,    -1,    -1,    52,    54,    52,    -1,
-      51,    -1,   282,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   302
+      50,    52,    52,    54,    54,    56,    56,     5,     7,     7,
+      48,     9,     0,    52,    26,    54,     5,    56,    10,    11,
+      12,    13,     3,    14,    15,    16,    17,     8,    53,    20,
+       7,    22,    23,    24,    25,    14,    15,    22,    23,    30,
+       7,    53,    34,    22,    23,     7,    31,    32,    33,     3,
+      29,    36,    22,    23,     8,    53,    54,    55,    56,    22,
+      23,    53,    53,     5,    27,    28,    36,    37,    53,    39,
+      40,     7,    38,    36,    53,    41,    42,    43,     5,     3,
+       3,     3,     3,    53,     8,     8,     8,     8,    18,    19,
+      53,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+       3,     3,     3,     7,     3,     8,     8,     8,   158,     8,
+     148,   149,     3,     3,     3,     3,     3,     8,     8,     8,
+       8,     3,     7,     7,     6,   176,   176,   178,   178,     3,
+       6,     4,     6,   184,   184,   186,   186,   176,     8,   178,
+       3,   192,   192,   194,   194,   184,     3,   186,     3,     6,
+       4,     6,     4,   192,     4,   194,     4,     6,     3,     6,
+       3,    53,   200,   201,   202,     4,     4,     4,     4,     4,
+       4,     4,     4,    54,    54,     4,     4,     4,     4,     4,
+       4,     4,    54,     4,     4,     4,     4,     4,     4,    54,
+       4,     4,     7,    53,    53,     7,     7,     7,   236,    21,
+     250,   251,     7,     5,     5,     4,     6,    53,     4,    53,
+       5,    53,    53,    53,     5,     7,     6,     4,     4,     4,
+       4,     4,    53,    53,     5,     7,    35,     4,     4,     4,
+     158,   211,   240,   170,   284,   251,   284,   294,   188,   186,
+     184,   258,   252,   195,   192,   194,    54,    53,   299,   299,
+      53,   180,    56,   178,   281,   300,    54,    54,   176,    53,
+     299,   321,   335,   352,    -1,    -1,    -1,    -1,    -1,    -1,
+     321,   321,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   321
   };
 
   const unsigned char
   D2Parser::yystos_[] =
   {
-       0,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-       0,     5,     7,     9,    51,    52,    53,    54,    66,    67,
-      68,    72,     7,    77,     7,    83,     7,   143,     5,   137,
-       7,   111,     5,   105,     7,   126,     5,   121,    73,    69,
-      78,    84,   144,   138,   112,   106,   127,   122,    66,    74,
-      75,    51,    70,    71,    10,    11,    12,    13,    32,    51,
-      76,    79,    80,    81,   154,   156,   158,   160,    14,    15,
-      16,    17,    20,    22,    23,    28,    76,    85,    86,    87,
-      89,    90,    91,    94,    96,    98,   135,    29,    30,    31,
-      34,    76,   145,   146,   147,   149,   151,   152,     7,   139,
-     140,   141,    25,    26,    34,    76,   113,   114,   115,   117,
-     119,     7,   107,   108,   109,    14,    15,    27,    76,   128,
-     129,   130,   132,   134,     7,   123,   124,     6,     3,     4,
-       8,     3,   155,   157,   159,    82,   161,     4,     3,     8,
-      88,     4,     4,    92,    95,    97,    99,   136,     3,     8,
-     150,     4,   153,   148,     3,     8,   142,     6,     3,   118,
-     120,   116,     3,     8,   110,     6,     3,   133,     4,   131,
-       3,     8,   125,     3,     6,    66,    66,    51,     4,     4,
-       4,     4,     4,    80,     4,    52,    52,     4,     4,     4,
-       4,     4,    86,     4,    52,     4,     4,   146,   145,   141,
-       4,     4,     4,   114,   113,   109,     4,    52,     4,   129,
-     128,   124,     4,    66,    66,    66,     7,     7,    51,    18,
-      19,    93,    21,     7,     7,     5,    51,    51,    51,     8,
-      51,     5,    51,     8,    51,    51,     8,    66,    85,    33,
-     162,   163,   164,    24,    76,   100,   101,   102,   103,   100,
-     139,   123,     8,   165,     3,     8,   104,     3,     8,     8,
-       6,     6,     4,   163,     4,   102,     5,     5,     7,   166,
-     167,   107,   168,     3,     6,     6,    34,    35,    37,    38,
-      76,   169,   170,   171,   173,   174,   176,   167,   172,   177,
-       4,   175,     3,     8,     4,     4,    52,     4,   170,    51,
-       5,    51,     7,   178,   179,   180,     3,     6,    36,    39,
-      40,    41,   181,   182,   183,   185,   186,   187,   179,   184,
-       4,     4,     4,     3,     8,     4,    54,    52,    52,   182,
-      51
+       0,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+       0,     5,     7,     9,    53,    54,    55,    56,    68,    69,
+      70,    75,     7,    80,     7,    86,     7,   150,     5,   144,
+       7,   118,     5,   112,     7,   133,     5,   128,    76,    71,
+      81,    87,   151,   145,   119,   113,   134,   129,    68,    77,
+      78,    53,    73,    74,    10,    11,    12,    13,    34,    53,
+      79,    82,    83,    84,   161,   163,   165,   167,    14,    15,
+      16,    17,    20,    22,    23,    24,    25,    30,    79,    88,
+      89,    90,    92,    93,    94,    97,    99,   101,   103,   105,
+     142,    31,    32,    33,    36,    79,    99,   101,   152,   153,
+     154,   156,   158,   159,     7,   146,   147,   148,    27,    28,
+      36,    79,    99,   101,   120,   121,   122,   124,   126,     7,
+     114,   115,   116,    14,    15,    29,    79,    99,   101,   135,
+     136,   137,   139,   141,     7,   130,   131,     6,     3,     4,
+       8,     3,   162,   164,   166,    85,   168,     4,     3,     8,
+      91,     4,     4,    95,    98,   100,   102,   104,   106,   143,
+       3,     8,   157,     4,   160,   155,     3,     8,   149,     6,
+       3,   125,   127,   123,     3,     8,   117,     6,     3,   140,
+       4,   138,     3,     8,   132,     3,     6,    68,    68,    53,
+       4,     4,     4,     4,     4,    83,     4,    54,    54,     4,
+       4,     4,     4,     4,     4,     4,    89,     4,    54,     4,
+       4,   153,   152,   148,     4,     4,     4,   121,   120,   116,
+       4,    54,     4,   136,   135,   131,     4,    68,    68,    68,
+       7,     7,    53,    18,    19,    96,    21,    70,    72,    53,
+       7,     7,     5,    53,    53,    53,     8,    53,     5,    53,
+       8,    53,    53,     8,    68,    88,    35,   169,   170,   171,
+      26,    79,   107,   108,   109,   110,   107,   146,   130,     8,
+     172,     3,     8,   111,     3,     8,     8,     6,     6,     4,
+     170,     4,   109,     5,     5,     7,   173,   174,   114,   175,
+       3,     6,     6,    36,    37,    39,    40,    79,    99,   101,
+     176,   177,   178,   180,   181,   183,   174,   179,   184,     4,
+     182,     3,     8,     4,     4,    54,     4,   177,    53,     5,
+      53,     7,   185,   186,   187,     3,     6,    38,    41,    42,
+      43,   188,   189,   190,   192,   193,   194,   186,   191,     4,
+       4,     4,     3,     8,     4,    56,    54,    54,   189,    53
   };
 
   const unsigned char
   D2Parser::yyr1_[] =
   {
-       0,    55,    57,    56,    58,    56,    59,    56,    60,    56,
-      61,    56,    62,    56,    63,    56,    64,    56,    65,    56,
-      66,    66,    66,    66,    66,    66,    66,    67,    69,    68,
-      70,    70,    71,    71,    73,    72,    74,    74,    75,    75,
-      76,    78,    77,    79,    79,    80,    80,    80,    80,    80,
-      80,    82,    81,    84,    83,    85,    85,    86,    86,    86,
-      86,    86,    86,    86,    86,    86,    88,    87,    89,    90,
-      92,    91,    93,    93,    95,    94,    97,    96,    99,    98,
-     100,   100,   101,   101,   102,   102,   104,   103,   106,   105,
-     107,   107,   108,   108,   110,   109,   112,   111,   113,   113,
-     114,   114,   114,   114,   116,   115,   118,   117,   120,   119,
-     122,   121,   123,   123,   125,   124,   127,   126,   128,   128,
-     129,   129,   129,   129,   131,   130,   133,   132,   134,   136,
-     135,   138,   137,   139,   139,   140,   140,   142,   141,   144,
-     143,   145,   145,   146,   146,   146,   146,   146,   148,   147,
-     150,   149,   151,   153,   152,   155,   154,   157,   156,   159,
-     158,   161,   160,   162,   162,   163,   165,   164,   166,   166,
-     168,   167,   169,   169,   170,   170,   170,   170,   170,   172,
-     171,   173,   175,   174,   177,   176,   178,   178,   180,   179,
-     181,   181,   182,   182,   182,   182,   184,   183,   185,   186,
-     187
+       0,    57,    59,    58,    60,    58,    61,    58,    62,    58,
+      63,    58,    64,    58,    65,    58,    66,    58,    67,    58,
+      68,    68,    68,    68,    68,    68,    68,    69,    71,    70,
+      72,    73,    73,    74,    74,    76,    75,    77,    77,    78,
+      78,    79,    81,    80,    82,    82,    83,    83,    83,    83,
+      83,    83,    85,    84,    87,    86,    88,    88,    89,    89,
+      89,    89,    89,    89,    89,    89,    89,    89,    89,    91,
+      90,    92,    93,    95,    94,    96,    96,    98,    97,   100,
+      99,   102,   101,   104,   103,   106,   105,   107,   107,   108,
+     108,   109,   109,   111,   110,   113,   112,   114,   114,   115,
+     115,   117,   116,   119,   118,   120,   120,   121,   121,   121,
+     121,   121,   121,   123,   122,   125,   124,   127,   126,   129,
+     128,   130,   130,   132,   131,   134,   133,   135,   135,   136,
+     136,   136,   136,   136,   136,   138,   137,   140,   139,   141,
+     143,   142,   145,   144,   146,   146,   147,   147,   149,   148,
+     151,   150,   152,   152,   153,   153,   153,   153,   153,   153,
+     153,   155,   154,   157,   156,   158,   160,   159,   162,   161,
+     164,   163,   166,   165,   168,   167,   169,   169,   170,   172,
+     171,   173,   173,   175,   174,   176,   176,   177,   177,   177,
+     177,   177,   177,   177,   179,   178,   180,   182,   181,   184,
+     183,   185,   185,   187,   186,   188,   188,   189,   189,   189,
+     189,   191,   190,   192,   193,   194
   };
 
   const unsigned char
@@ -2138,24 +2236,25 @@ namespace isc { namespace d2 {
        0,     2,     0,     3,     0,     3,     0,     3,     0,     3,
        0,     3,     0,     3,     0,     3,     0,     3,     0,     3,
        1,     1,     1,     1,     1,     1,     1,     1,     0,     4,
-       0,     1,     3,     5,     0,     4,     0,     1,     1,     3,
-       2,     0,     4,     1,     3,     1,     1,     1,     1,     1,
-       1,     0,     6,     0,     4,     1,     3,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     0,     4,     3,     3,
-       0,     4,     1,     1,     0,     4,     0,     6,     0,     6,
-       0,     1,     1,     3,     1,     1,     0,     6,     0,     4,
-       0,     1,     1,     3,     0,     4,     0,     4,     1,     3,
-       1,     1,     1,     1,     0,     4,     0,     4,     0,     6,
-       0,     4,     1,     3,     0,     4,     0,     4,     1,     3,
-       1,     1,     1,     1,     0,     4,     0,     4,     3,     0,
-       6,     0,     4,     0,     1,     1,     3,     0,     4,     0,
-       4,     1,     3,     1,     1,     1,     1,     1,     0,     4,
-       0,     4,     3,     0,     4,     0,     4,     0,     4,     0,
-       4,     0,     6,     1,     3,     1,     0,     6,     1,     3,
-       0,     4,     1,     3,     1,     1,     1,     1,     1,     0,
-       4,     3,     0,     4,     0,     6,     1,     3,     0,     4,
-       1,     3,     1,     1,     1,     1,     0,     4,     3,     3,
-       3
+       1,     0,     1,     3,     5,     0,     4,     0,     1,     1,
+       3,     2,     0,     4,     1,     3,     1,     1,     1,     1,
+       1,     1,     0,     6,     0,     4,     1,     3,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     0,
+       4,     3,     3,     0,     4,     1,     1,     0,     4,     0,
+       4,     0,     4,     0,     6,     0,     6,     0,     1,     1,
+       3,     1,     1,     0,     6,     0,     4,     0,     1,     1,
+       3,     0,     4,     0,     4,     1,     3,     1,     1,     1,
+       1,     1,     1,     0,     4,     0,     4,     0,     6,     0,
+       4,     1,     3,     0,     4,     0,     4,     1,     3,     1,
+       1,     1,     1,     1,     1,     0,     4,     0,     4,     3,
+       0,     6,     0,     4,     0,     1,     1,     3,     0,     4,
+       0,     4,     1,     3,     1,     1,     1,     1,     1,     1,
+       1,     0,     4,     0,     4,     3,     0,     4,     0,     4,
+       0,     4,     0,     4,     0,     6,     1,     3,     1,     0,
+       6,     1,     3,     0,     4,     1,     3,     1,     1,     1,
+       1,     1,     1,     1,     0,     4,     3,     0,     4,     0,
+       6,     1,     3,     0,     4,     1,     3,     1,     1,     1,
+       1,     0,     4,     3,     3,     3
   };
 
 
@@ -2169,71 +2268,73 @@ namespace isc { namespace d2 {
   "\"]\"", "\"{\"", "\"}\"", "\"null\"", "\"Dhcp6\"", "\"Dhcp4\"",
   "\"Control-agent\"", "\"DhcpDdns\"", "\"ip-address\"", "\"port\"",
   "\"dns-server-timeout\"", "\"ncr-protocol\"", "\"UDP\"", "\"TCP\"",
-  "\"ncr-format\"", "\"JSON\"", "\"forward-ddns\"", "\"reverse-ddns\"",
-  "\"ddns-domains\"", "\"key-name\"", "\"dns-servers\"", "\"hostname\"",
-  "\"tsig-keys\"", "\"algorithm\"", "\"digest-bits\"", "\"secret\"",
-  "\"Logging\"", "\"loggers\"", "\"name\"", "\"output_options\"",
-  "\"output\"", "\"debuglevel\"", "\"severity\"", "\"flush\"",
-  "\"maxsize\"", "\"maxver\"", "TOPLEVEL_JSON", "TOPLEVEL_DHCPDDNS",
-  "SUB_DHCPDDNS", "SUB_TSIG_KEY", "SUB_TSIG_KEYS", "SUB_DDNS_DOMAIN",
-  "SUB_DDNS_DOMAINS", "SUB_DNS_SERVER", "SUB_DNS_SERVERS",
-  "\"constant string\"", "\"integer\"", "\"floating point\"",
-  "\"boolean\"", "$accept", "start", "$@1", "$@2", "$@3", "$@4", "$@5",
-  "$@6", "$@7", "$@8", "$@9", "value", "sub_json", "map2", "$@10",
-  "map_content", "not_empty_map", "list_generic", "$@11", "list_content",
-  "not_empty_list", "unknown_map_entry", "syntax_map", "$@12",
-  "global_objects", "global_object", "dhcpddns_object", "$@13",
-  "sub_dhcpddns", "$@14", "dhcpddns_params", "dhcpddns_param",
-  "ip_address", "$@15", "port", "dns_server_timeout", "ncr_protocol",
-  "$@16", "ncr_protocol_value", "ncr_format", "$@17", "forward_ddns",
-  "$@18", "reverse_ddns", "$@19", "ddns_mgr_params",
-  "not_empty_ddns_mgr_params", "ddns_mgr_param", "ddns_domains", "$@20",
-  "sub_ddns_domains", "$@21", "ddns_domain_list",
-  "not_empty_ddns_domain_list", "ddns_domain", "$@22", "sub_ddns_domain",
-  "$@23", "ddns_domain_params", "ddns_domain_param", "ddns_domain_name",
-  "$@24", "ddns_domain_key_name", "$@25", "dns_servers", "$@26",
-  "sub_dns_servers", "$@27", "dns_server_list", "dns_server", "$@28",
-  "sub_dns_server", "$@29", "dns_server_params", "dns_server_param",
-  "dns_server_hostname", "$@30", "dns_server_ip_address", "$@31",
-  "dns_server_port", "tsig_keys", "$@32", "sub_tsig_keys", "$@33",
-  "tsig_keys_list", "not_empty_tsig_keys_list", "tsig_key", "$@34",
-  "sub_tsig_key", "$@35", "tsig_key_params", "tsig_key_param",
-  "tsig_key_name", "$@36", "tsig_key_algorithm", "$@37",
-  "tsig_key_digest_bits", "tsig_key_secret", "$@38", "dhcp6_json_object",
-  "$@39", "dhcp4_json_object", "$@40", "control_agent_json_object", "$@41",
-  "logging_object", "$@42", "logging_params", "logging_param", "loggers",
-  "$@43", "loggers_entries", "logger_entry", "$@44", "logger_params",
-  "logger_param", "name", "$@45", "debuglevel", "severity", "$@46",
-  "output_options_list", "$@47", "output_options_list_content",
-  "output_entry", "$@48", "output_params_list", "output_params", "output",
-  "$@49", "flush", "maxsize", "maxver", YY_NULLPTR
+  "\"ncr-format\"", "\"JSON\"", "\"user-context\"", "\"comment\"",
+  "\"forward-ddns\"", "\"reverse-ddns\"", "\"ddns-domains\"",
+  "\"key-name\"", "\"dns-servers\"", "\"hostname\"", "\"tsig-keys\"",
+  "\"algorithm\"", "\"digest-bits\"", "\"secret\"", "\"Logging\"",
+  "\"loggers\"", "\"name\"", "\"output_options\"", "\"output\"",
+  "\"debuglevel\"", "\"severity\"", "\"flush\"", "\"maxsize\"",
+  "\"maxver\"", "TOPLEVEL_JSON", "TOPLEVEL_DHCPDDNS", "SUB_DHCPDDNS",
+  "SUB_TSIG_KEY", "SUB_TSIG_KEYS", "SUB_DDNS_DOMAIN", "SUB_DDNS_DOMAINS",
+  "SUB_DNS_SERVER", "SUB_DNS_SERVERS", "\"constant string\"",
+  "\"integer\"", "\"floating point\"", "\"boolean\"", "$accept", "start",
+  "$@1", "$@2", "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9", "value",
+  "sub_json", "map2", "$@10", "map_value", "map_content", "not_empty_map",
+  "list_generic", "$@11", "list_content", "not_empty_list",
+  "unknown_map_entry", "syntax_map", "$@12", "global_objects",
+  "global_object", "dhcpddns_object", "$@13", "sub_dhcpddns", "$@14",
+  "dhcpddns_params", "dhcpddns_param", "ip_address", "$@15", "port",
+  "dns_server_timeout", "ncr_protocol", "$@16", "ncr_protocol_value",
+  "ncr_format", "$@17", "user_context", "$@18", "comment", "$@19",
+  "forward_ddns", "$@20", "reverse_ddns", "$@21", "ddns_mgr_params",
+  "not_empty_ddns_mgr_params", "ddns_mgr_param", "ddns_domains", "$@22",
+  "sub_ddns_domains", "$@23", "ddns_domain_list",
+  "not_empty_ddns_domain_list", "ddns_domain", "$@24", "sub_ddns_domain",
+  "$@25", "ddns_domain_params", "ddns_domain_param", "ddns_domain_name",
+  "$@26", "ddns_domain_key_name", "$@27", "dns_servers", "$@28",
+  "sub_dns_servers", "$@29", "dns_server_list", "dns_server", "$@30",
+  "sub_dns_server", "$@31", "dns_server_params", "dns_server_param",
+  "dns_server_hostname", "$@32", "dns_server_ip_address", "$@33",
+  "dns_server_port", "tsig_keys", "$@34", "sub_tsig_keys", "$@35",
+  "tsig_keys_list", "not_empty_tsig_keys_list", "tsig_key", "$@36",
+  "sub_tsig_key", "$@37", "tsig_key_params", "tsig_key_param",
+  "tsig_key_name", "$@38", "tsig_key_algorithm", "$@39",
+  "tsig_key_digest_bits", "tsig_key_secret", "$@40", "dhcp6_json_object",
+  "$@41", "dhcp4_json_object", "$@42", "control_agent_json_object", "$@43",
+  "logging_object", "$@44", "logging_params", "logging_param", "loggers",
+  "$@45", "loggers_entries", "logger_entry", "$@46", "logger_params",
+  "logger_param", "name", "$@47", "debuglevel", "severity", "$@48",
+  "output_options_list", "$@49", "output_options_list_content",
+  "output_entry", "$@50", "output_params_list", "output_params", "output",
+  "$@51", "flush", "maxsize", "maxver", YY_NULLPTR
   };
 
 #if D2_PARSER_DEBUG
   const unsigned short int
   D2Parser::yyrline_[] =
   {
-       0,   117,   117,   117,   118,   118,   119,   119,   120,   120,
-     121,   121,   122,   122,   123,   123,   124,   124,   125,   125,
-     133,   134,   135,   136,   137,   138,   139,   142,   147,   147,
-     159,   160,   163,   167,   174,   174,   181,   182,   185,   189,
-     200,   210,   210,   222,   223,   227,   228,   229,   230,   231,
-     232,   237,   237,   247,   247,   255,   256,   260,   261,   262,
-     263,   264,   265,   266,   267,   268,   271,   271,   279,   287,
-     296,   296,   304,   305,   308,   308,   316,   316,   326,   326,
-     336,   337,   340,   341,   344,   345,   350,   350,   360,   360,
-     367,   368,   371,   372,   375,   375,   383,   383,   390,   391,
-     394,   395,   396,   397,   401,   401,   413,   413,   425,   425,
-     435,   435,   442,   443,   446,   446,   454,   454,   461,   462,
-     465,   466,   467,   468,   471,   471,   483,   483,   491,   505,
-     505,   515,   515,   522,   523,   526,   527,   530,   530,   538,
-     538,   547,   548,   551,   552,   553,   554,   555,   558,   558,
-     570,   570,   581,   589,   589,   604,   604,   611,   611,   618,
-     618,   630,   630,   643,   644,   648,   652,   652,   664,   665,
-     669,   669,   677,   678,   681,   682,   683,   684,   685,   688,
-     688,   696,   700,   700,   708,   708,   718,   719,   722,   722,
-     730,   731,   734,   735,   736,   737,   740,   740,   748,   753,
-     758
+       0,   120,   120,   120,   121,   121,   122,   122,   123,   123,
+     124,   124,   125,   125,   126,   126,   127,   127,   128,   128,
+     136,   137,   138,   139,   140,   141,   142,   145,   150,   150,
+     161,   164,   165,   168,   172,   179,   179,   186,   187,   190,
+     194,   205,   215,   215,   227,   228,   232,   233,   234,   235,
+     236,   237,   242,   242,   252,   252,   260,   261,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   278,
+     278,   286,   294,   303,   303,   311,   312,   315,   315,   323,
+     323,   348,   348,   375,   375,   385,   385,   395,   396,   399,
+     400,   403,   404,   409,   409,   419,   419,   426,   427,   430,
+     431,   434,   434,   442,   442,   449,   450,   453,   454,   455,
+     456,   457,   458,   462,   462,   474,   474,   486,   486,   496,
+     496,   503,   504,   507,   507,   515,   515,   522,   523,   526,
+     527,   528,   529,   530,   531,   534,   534,   546,   546,   554,
+     568,   568,   578,   578,   585,   586,   589,   590,   593,   593,
+     601,   601,   610,   611,   614,   615,   616,   617,   618,   619,
+     620,   623,   623,   635,   635,   646,   654,   654,   669,   669,
+     676,   676,   683,   683,   695,   695,   708,   709,   713,   717,
+     717,   729,   730,   734,   734,   742,   743,   746,   747,   748,
+     749,   750,   751,   752,   755,   755,   763,   767,   767,   775,
+     775,   785,   786,   789,   789,   797,   798,   801,   802,   803,
+     804,   807,   807,   815,   820,   825
   };
 
   // Print the state stack on the debug stream.
@@ -2268,8 +2369,8 @@ namespace isc { namespace d2 {
 
 #line 14 "d2_parser.yy" // lalr1.cc:1167
 } } // isc::d2
-#line 2272 "d2_parser.cc" // lalr1.cc:1167
-#line 763 "d2_parser.yy" // lalr1.cc:1168
+#line 2373 "d2_parser.cc" // lalr1.cc:1167
+#line 830 "d2_parser.yy" // lalr1.cc:1168
 
 
 void
index 6e158a689292c109151fbcfe39d1fcc04ff7cb6d..41df8d11baabd10538accbdc0dd7c2067a980de4 100644 (file)
@@ -305,6 +305,7 @@ namespace isc { namespace d2 {
     union union_type
     {
       // value
+      // map_value
       // ncr_protocol_value
       char dummy1[sizeof(ElementPtr)];
 
@@ -361,39 +362,41 @@ namespace isc { namespace d2 {
         TOKEN_TCP = 274,
         TOKEN_NCR_FORMAT = 275,
         TOKEN_JSON = 276,
-        TOKEN_FORWARD_DDNS = 277,
-        TOKEN_REVERSE_DDNS = 278,
-        TOKEN_DDNS_DOMAINS = 279,
-        TOKEN_KEY_NAME = 280,
-        TOKEN_DNS_SERVERS = 281,
-        TOKEN_HOSTNAME = 282,
-        TOKEN_TSIG_KEYS = 283,
-        TOKEN_ALGORITHM = 284,
-        TOKEN_DIGEST_BITS = 285,
-        TOKEN_SECRET = 286,
-        TOKEN_LOGGING = 287,
-        TOKEN_LOGGERS = 288,
-        TOKEN_NAME = 289,
-        TOKEN_OUTPUT_OPTIONS = 290,
-        TOKEN_OUTPUT = 291,
-        TOKEN_DEBUGLEVEL = 292,
-        TOKEN_SEVERITY = 293,
-        TOKEN_FLUSH = 294,
-        TOKEN_MAXSIZE = 295,
-        TOKEN_MAXVER = 296,
-        TOKEN_TOPLEVEL_JSON = 297,
-        TOKEN_TOPLEVEL_DHCPDDNS = 298,
-        TOKEN_SUB_DHCPDDNS = 299,
-        TOKEN_SUB_TSIG_KEY = 300,
-        TOKEN_SUB_TSIG_KEYS = 301,
-        TOKEN_SUB_DDNS_DOMAIN = 302,
-        TOKEN_SUB_DDNS_DOMAINS = 303,
-        TOKEN_SUB_DNS_SERVER = 304,
-        TOKEN_SUB_DNS_SERVERS = 305,
-        TOKEN_STRING = 306,
-        TOKEN_INTEGER = 307,
-        TOKEN_FLOAT = 308,
-        TOKEN_BOOLEAN = 309
+        TOKEN_USER_CONTEXT = 277,
+        TOKEN_COMMENT = 278,
+        TOKEN_FORWARD_DDNS = 279,
+        TOKEN_REVERSE_DDNS = 280,
+        TOKEN_DDNS_DOMAINS = 281,
+        TOKEN_KEY_NAME = 282,
+        TOKEN_DNS_SERVERS = 283,
+        TOKEN_HOSTNAME = 284,
+        TOKEN_TSIG_KEYS = 285,
+        TOKEN_ALGORITHM = 286,
+        TOKEN_DIGEST_BITS = 287,
+        TOKEN_SECRET = 288,
+        TOKEN_LOGGING = 289,
+        TOKEN_LOGGERS = 290,
+        TOKEN_NAME = 291,
+        TOKEN_OUTPUT_OPTIONS = 292,
+        TOKEN_OUTPUT = 293,
+        TOKEN_DEBUGLEVEL = 294,
+        TOKEN_SEVERITY = 295,
+        TOKEN_FLUSH = 296,
+        TOKEN_MAXSIZE = 297,
+        TOKEN_MAXVER = 298,
+        TOKEN_TOPLEVEL_JSON = 299,
+        TOKEN_TOPLEVEL_DHCPDDNS = 300,
+        TOKEN_SUB_DHCPDDNS = 301,
+        TOKEN_SUB_TSIG_KEY = 302,
+        TOKEN_SUB_TSIG_KEYS = 303,
+        TOKEN_SUB_DDNS_DOMAIN = 304,
+        TOKEN_SUB_DDNS_DOMAINS = 305,
+        TOKEN_SUB_DNS_SERVER = 306,
+        TOKEN_SUB_DNS_SERVERS = 307,
+        TOKEN_STRING = 308,
+        TOKEN_INTEGER = 309,
+        TOKEN_FLOAT = 310,
+        TOKEN_BOOLEAN = 311
       };
     };
 
@@ -588,6 +591,14 @@ namespace isc { namespace d2 {
     symbol_type
     make_JSON (const location_type& l);
 
+    static inline
+    symbol_type
+    make_USER_CONTEXT (const location_type& l);
+
+    static inline
+    symbol_type
+    make_COMMENT (const location_type& l);
+
     static inline
     symbol_type
     make_FORWARD_DDNS (const location_type& l);
@@ -925,12 +936,12 @@ namespace isc { namespace d2 {
     enum
     {
       yyeof_ = 0,
-      yylast_ = 252,     ///< Last index in yytable_.
-      yynnts_ = 133,  ///< Number of nonterminal symbols.
+      yylast_ = 282,     ///< Last index in yytable_.
+      yynnts_ = 138,  ///< Number of nonterminal symbols.
       yyfinal_ = 20, ///< Termination state number.
       yyterror_ = 1,
       yyerrcode_ = 256,
-      yyntokens_ = 55  ///< Number of tokens.
+      yyntokens_ = 57  ///< Number of tokens.
     };
 
 
@@ -977,9 +988,10 @@ namespace isc { namespace d2 {
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56
     };
-    const unsigned int user_token_number_max_ = 309;
+    const unsigned int user_token_number_max_ = 311;
     const token_number_type undef_token_ = 2;
 
     if (static_cast<int>(t) <= yyeof_)
@@ -1012,24 +1024,25 @@ namespace isc { namespace d2 {
   {
       switch (other.type_get ())
     {
-      case 66: // value
-      case 93: // ncr_protocol_value
+      case 68: // value
+      case 72: // map_value
+      case 96: // ncr_protocol_value
         value.copy< ElementPtr > (other.value);
         break;
 
-      case 54: // "boolean"
+      case 56: // "boolean"
         value.copy< bool > (other.value);
         break;
 
-      case 53: // "floating point"
+      case 55: // "floating point"
         value.copy< double > (other.value);
         break;
 
-      case 52: // "integer"
+      case 54: // "integer"
         value.copy< int64_t > (other.value);
         break;
 
-      case 51: // "constant string"
+      case 53: // "constant string"
         value.copy< std::string > (other.value);
         break;
 
@@ -1050,24 +1063,25 @@ namespace isc { namespace d2 {
     (void) v;
       switch (this->type_get ())
     {
-      case 66: // value
-      case 93: // ncr_protocol_value
+      case 68: // value
+      case 72: // map_value
+      case 96: // ncr_protocol_value
         value.copy< ElementPtr > (v);
         break;
 
-      case 54: // "boolean"
+      case 56: // "boolean"
         value.copy< bool > (v);
         break;
 
-      case 53: // "floating point"
+      case 55: // "floating point"
         value.copy< double > (v);
         break;
 
-      case 52: // "integer"
+      case 54: // "integer"
         value.copy< int64_t > (v);
         break;
 
-      case 51: // "constant string"
+      case 53: // "constant string"
         value.copy< std::string > (v);
         break;
 
@@ -1147,24 +1161,25 @@ namespace isc { namespace d2 {
     // Type destructor.
     switch (yytype)
     {
-      case 66: // value
-      case 93: // ncr_protocol_value
+      case 68: // value
+      case 72: // map_value
+      case 96: // ncr_protocol_value
         value.template destroy< ElementPtr > ();
         break;
 
-      case 54: // "boolean"
+      case 56: // "boolean"
         value.template destroy< bool > ();
         break;
 
-      case 53: // "floating point"
+      case 55: // "floating point"
         value.template destroy< double > ();
         break;
 
-      case 52: // "integer"
+      case 54: // "integer"
         value.template destroy< int64_t > ();
         break;
 
-      case 51: // "constant string"
+      case 53: // "constant string"
         value.template destroy< std::string > ();
         break;
 
@@ -1191,24 +1206,25 @@ namespace isc { namespace d2 {
     super_type::move(s);
       switch (this->type_get ())
     {
-      case 66: // value
-      case 93: // ncr_protocol_value
+      case 68: // value
+      case 72: // map_value
+      case 96: // ncr_protocol_value
         value.move< ElementPtr > (s.value);
         break;
 
-      case 54: // "boolean"
+      case 56: // "boolean"
         value.move< bool > (s.value);
         break;
 
-      case 53: // "floating point"
+      case 55: // "floating point"
         value.move< double > (s.value);
         break;
 
-      case 52: // "integer"
+      case 54: // "integer"
         value.move< int64_t > (s.value);
         break;
 
-      case 51: // "constant string"
+      case 53: // "constant string"
         value.move< std::string > (s.value);
         break;
 
@@ -1272,7 +1288,7 @@ namespace isc { namespace d2 {
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
      295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
-     305,   306,   307,   308,   309
+     305,   306,   307,   308,   309,   310,   311
     };
     return static_cast<token_type> (yytoken_number_[type]);
   }
@@ -1397,6 +1413,18 @@ namespace isc { namespace d2 {
     return symbol_type (token::TOKEN_JSON, l);
   }
 
+  D2Parser::symbol_type
+  D2Parser::make_USER_CONTEXT (const location_type& l)
+  {
+    return symbol_type (token::TOKEN_USER_CONTEXT, l);
+  }
+
+  D2Parser::symbol_type
+  D2Parser::make_COMMENT (const location_type& l)
+  {
+    return symbol_type (token::TOKEN_COMMENT, l);
+  }
+
   D2Parser::symbol_type
   D2Parser::make_FORWARD_DDNS (const location_type& l)
   {
@@ -1598,7 +1626,7 @@ namespace isc { namespace d2 {
 
 #line 14 "d2_parser.yy" // lalr1.cc:377
 } } // isc::d2
-#line 1602 "d2_parser.h" // lalr1.cc:377
+#line 1630 "d2_parser.h" // lalr1.cc:377
 
 
 
index 8ab35cdcf25efac0c475c61c5cdad242ba610861..5dfc152cb79a7bc6fd1f423a34f9d736e4f0126c 100644 (file)
@@ -105,6 +105,7 @@ using namespace std;
 %token <bool> BOOLEAN "boolean"
 
 %type <ElementPtr> value
+%type <ElementPtr> map_value
 %type <ElementPtr> ncr_protocol_value
 
 %printer { yyoutput << $$; } <*>;
index bc06cb796d4078005a78154f79c54e076e344da6..af0721b418d25bd5f4d9acc94acb8bb09bde9b81 100644 (file)
@@ -1,4 +1,4 @@
-// Generated 201710081556
+// Generated 201801020209
 // A Bison parser, made by GNU Bison 3.0.4.
 
 // Locations for Bison parsers in C++
index 52c77cd3ef3f7e34b2f51ca382064c0440f8cc8e..0b5c09b80ab528a8185609cbf3b1a67315a05ab0 100644 (file)
@@ -1,4 +1,4 @@
-// Generated 201710081556
+// Generated 201801020209
 // A Bison parser, made by GNU Bison 3.0.4.
 
 // Positions for Bison parsers in C++
index 3dbf3ab8ea715f8c353a56040a5dd7d4fd44fc62..cbe2b9cc7325a90cd52612ada43d2e756ac2e1db 100644 (file)
@@ -1,4 +1,4 @@
-// Generated 201710081556
+// Generated 201801020209
 // A Bison parser, made by GNU Bison 3.0.4.
 
 // Stack handling for Bison parsers in C++