summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancis Dupont <fdupont@isc.org>2018-10-17 21:52:15 +0200
committerFrancis Dupont <fdupont@isc.org>2018-10-17 21:52:15 +0200
commit6bbb2c239fdca627164ef9c289973a549ef8eff5 (patch)
tree50215e893ac5219951cada277b25cb836de7b4cc
parent3aaecb8b44498a18d9888f2f6ffde3413d460e0d (diff)
parentf31f89a5aa632be3328c7461d5bae1b610462444 (diff)
[5-netconf-extend-syntax_rebased] Addressed rebase conflicts65-libyang-subnet_base65-libyang-models-fix_base153-netconf-agent_base
-rw-r--r--doc/examples/netconf/simple-dhcp4.json16
-rw-r--r--src/bin/netconf/location.hh2
-rw-r--r--src/bin/netconf/netconf_cfg_mgr.cc33
-rw-r--r--src/bin/netconf/netconf_cfg_mgr.h22
-rw-r--r--src/bin/netconf/netconf_config.cc14
-rw-r--r--src/bin/netconf/netconf_config.h60
-rw-r--r--src/bin/netconf/netconf_lexer.cc1481
-rw-r--r--src/bin/netconf/netconf_lexer.ll30
-rw-r--r--src/bin/netconf/netconf_parser.cc895
-rw-r--r--src/bin/netconf/netconf_parser.h169
-rw-r--r--src/bin/netconf/netconf_parser.yy27
-rw-r--r--src/bin/netconf/position.hh2
-rw-r--r--src/bin/netconf/simple_parser.cc33
-rw-r--r--src/bin/netconf/simple_parser.h9
-rw-r--r--src/bin/netconf/stack.hh2
-rw-r--r--src/bin/netconf/tests/netconf_cfg_mgr_unittests.cc156
-rw-r--r--src/bin/netconf/tests/netconf_controller_unittests.cc2
-rw-r--r--src/bin/netconf/tests/netconf_tests.sh.in132
-rw-r--r--src/bin/netconf/tests/parser_unittests.cc31
-rw-r--r--src/bin/netconf/tests/testdata/get_config.json25
20 files changed, 1949 insertions, 1192 deletions
diff --git a/doc/examples/netconf/simple-dhcp4.json b/doc/examples/netconf/simple-dhcp4.json
index 5a869c5585..5258a2182d 100644
--- a/doc/examples/netconf/simple-dhcp4.json
+++ b/doc/examples/netconf/simple-dhcp4.json
@@ -4,6 +4,16 @@
{
"Netconf":
{
+ // Three flags control netconf (default values are true):
+ // - "boot-update" about the YANG configuration load when
+ // netconf boots.
+ // - "subscribe-changes" about the subscription to notifications
+ // when the running YANG module is changed.
+ // - "validate-changes" alloes to validate or not changes.
+ "boot-update": true,
+ "subscribe-changes": true,
+ "validate-changes": true,
+
// This map specifies how each server is managed:
// the YANG model to use and the control channel.
"managed-servers":
@@ -16,6 +26,12 @@
// DHCPv4 server is kea-dhcp4-server model.
"model": "kea-dhcp4-server",
+ // The three control flags can be defined in this scope too
+ // and takes precedence over global and default values.
+ "boot-update": false,
+ "subscribe-changes": false,
+ "validate-changes": false,
+
// Currently three control channel types are supported:
// - "stdout" which output the configuration on the standard
// output (this is mainly for testing purposes, but you can
diff --git a/src/bin/netconf/location.hh b/src/bin/netconf/location.hh
index f44548e0d2..5369188d2e 100644
--- a/src/bin/netconf/location.hh
+++ b/src/bin/netconf/location.hh
@@ -1,4 +1,4 @@
-// Generated 201809281126
+// Generated 201810092120
// A Bison parser, made by GNU Bison 3.0.5.
// Locations for Bison parsers in C++
diff --git a/src/bin/netconf/netconf_cfg_mgr.cc b/src/bin/netconf/netconf_cfg_mgr.cc
index 2e52efc40a..5cddc3a5c2 100644
--- a/src/bin/netconf/netconf_cfg_mgr.cc
+++ b/src/bin/netconf/netconf_cfg_mgr.cc
@@ -21,12 +21,29 @@ namespace isc {
namespace netconf {
NetconfConfig::NetconfConfig()
- : servers_map_(new CfgServersMap()) {
+ : configured_globals_(Element::createMap()),
+ servers_map_(new CfgServersMap()) {
}
NetconfConfig::NetconfConfig(const NetconfConfig& orig)
- : ConfigBase(), servers_map_(orig.servers_map_),
- hooks_config_(orig.hooks_config_) {
+ : ConfigBase(), configured_globals_(orig.configured_globals_),
+ servers_map_(orig.servers_map_), hooks_config_(orig.hooks_config_) {
+}
+
+void
+NetconfConfig::extractConfiguredGlobals(ConstElementPtr config) {
+ if (config->getType() != Element::map) {
+ isc_throw(BadValue,
+ "extractConfiguredGlobals must be given a map element");
+ }
+
+ const std::map<std::string, ConstElementPtr>& values = config->mapValue();
+ for (auto value = values.begin(); value != values.end(); ++value) {
+ if (value->second->getType() != Element::list &&
+ value->second->getType() != Element::map) {
+ addConfiguredGlobal(value->first, value->second);
+ }
+ }
}
NetconfCfgMgr::NetconfCfgMgr()
@@ -81,9 +98,13 @@ NetconfCfgMgr::parse(isc::data::ConstElementPtr config_set,
NetconfConfigPtr ctx = getNetconfConfig();
- // Set the defaults
+ // Preserve all scalar global parameters.
+ ctx->extractConfiguredGlobals(config_set);
+
+ // Set the defaults and derive parameters.
ElementPtr cfg = boost::const_pointer_cast<Element>(config_set);
NetconfSimpleParser::setAllDefaults(cfg);
+ NetconfSimpleParser::deriveParameters(cfg);
// And parse the configuration.
ConstElementPtr answer;
@@ -121,13 +142,13 @@ NetconfCfgMgr::parse(isc::data::ConstElementPtr config_set,
return (answer);
}
-
-
ElementPtr
NetconfConfig::toElement() const {
ElementPtr netconf = Element::createMap();
// Set user-context
contextToElement(netconf);
+ // Add in explicitly configured globals.
+ netconf->setValue(configured_globals_->mapValue());
// Set hooks-libraries
netconf->set("hooks-libraries", hooks_config_.toElement());
// Set managed-servers
diff --git a/src/bin/netconf/netconf_cfg_mgr.h b/src/bin/netconf/netconf_cfg_mgr.h
index 131f4e696b..d1e40597cb 100644
--- a/src/bin/netconf/netconf_cfg_mgr.h
+++ b/src/bin/netconf/netconf_cfg_mgr.h
@@ -35,6 +35,25 @@ public:
/// @brief Default constructor
NetconfConfig();
+ /// @brief Returns pointer to configured global parameters.
+ ///
+ /// @todo revisit this at the toElement first use.
+ isc::data::ConstElementPtr getConfiguredGlobals() const {
+ return (isc::data::ConstElementPtr(configured_globals_));
+ }
+
+ /// @brief Saves scalar elements from the global scope of a configuration.
+ void extractConfiguredGlobals(isc::data::ConstElementPtr config);
+
+ /// @brief Adds a parameter to the collection configured globals.
+ ///
+ /// @param name std::string name of the global to add.
+ /// @param value ElementPtr containing the value of the global.
+ void addConfiguredGlobal(const std::string& name,
+ isc::data::ConstElementPtr value) {
+ configured_globals_->set(name, value);
+ }
+
/// @brief Returns non-const reference to the managed servers map.
///
/// @return non-const reference to the managed servers map.
@@ -88,6 +107,9 @@ private:
/// @param rhs Context to be assigned.
NetconfConfig& operator=(const NetconfConfig& rhs);
+ /// @brief Stores the global parameters specified via configuration.
+ isc::data::ElementPtr configured_globals_;
+
/// @brief CfgServers map.
CfgServersMapPtr servers_map_;
diff --git a/src/bin/netconf/netconf_config.cc b/src/bin/netconf/netconf_config.cc
index 0784d15aed..79f68ffa34 100644
--- a/src/bin/netconf/netconf_config.cc
+++ b/src/bin/netconf/netconf_config.cc
@@ -79,7 +79,8 @@ CfgControlSocket::toElement() const {
// *********************** CfgServer *************************
CfgServer::CfgServer(const string& model, CfgControlSocketPtr ctrl_sock)
- : model_(model), control_socket_(ctrl_sock) {
+ : model_(model), boot_update_(true), subscribe_changes_(true),
+ validate_changes_(true), control_socket_(ctrl_sock) {
}
CfgServer::~CfgServer() {
@@ -114,6 +115,12 @@ CfgServer::toElement() const {
contextToElement(result);
// Set model
result->set("model", Element::create(model_));
+ // Set boot-update
+ result->set("boot-update", Element::create(boot_update_));
+ // Set subscribe-changes
+ result->set("subscribe-changes", Element::create(subscribe_changes_));
+ // Set validate-changes
+ result->set("validate-changes", Element::create(validate_changes_));
// Set control-socket
if (control_socket_) {
result->set("control-socket", control_socket_->toElement());
@@ -192,6 +199,11 @@ ServerConfigParser::parse(ConstElementPtr server_config) {
<< server_config->getPosition() << ")");
}
+ // Add flags.
+ result->setBootUpdate(getBoolean(server_config, "boot-update"));
+ result->setSubscribeChanges(getBoolean(server_config, "subscribe-changes"));
+ result->setValidateChanges(getBoolean(server_config, "validate-changes"));
+
// Add user-context.
if (user_context) {
result->setContext(user_context);
diff --git a/src/bin/netconf/netconf_config.h b/src/bin/netconf/netconf_config.h
index 43bf1c11af..34620c6368 100644
--- a/src/bin/netconf/netconf_config.h
+++ b/src/bin/netconf/netconf_config.h
@@ -172,6 +172,48 @@ public:
return (control_socket_);
}
+ /// @brief Getter which returns the boot-update flag.
+ ///
+ /// @return returns the boot-update flag as a bool.
+ bool getBootUpdate() const {
+ return (boot_update_);
+ }
+
+ /// @brief Set the boot-update flag.
+ ///
+ /// @param boot_update The boot-update flag.
+ void setBootUpdate(bool boot_update) {
+ boot_update_ = boot_update;
+ }
+
+ /// @brief Getter which returns the subscribe-changes flag.
+ ///
+ /// @return returns the subscribe-changes flag as a bool.
+ bool getSubscribeChanges() const {
+ return (subscribe_changes_);
+ }
+
+ /// @brief Set the subscribe-changes flag.
+ ///
+ /// @param subscribe_changes The subscribe-changes flag.
+ void setSubscribeChanges(bool subscribe_changes) {
+ subscribe_changes_ = subscribe_changes;
+ }
+
+ /// @brief Getter which returns the validate-changes flag.
+ ///
+ /// @return returns the validate-changes flag as a bool.
+ bool getValidateChanges() const {
+ return (validate_changes_);
+ }
+
+ /// @brief Set the validate-changes flag.
+ ///
+ /// @param validate_changes The validate-changes flag.
+ void setValidateChanges(bool validate_changes) {
+ validate_changes_ = validate_changes;
+ }
+
/// @brief Returns a text representation for the server.
std::string toText() const;
@@ -184,6 +226,24 @@ private:
/// @brief The model name.
const std::string model_;
+ /// @brief The boot-update flag.
+ ///
+ /// If true (the defaul) Kea server configuration is updated at (netconf
+ /// agent) boot time.
+ bool boot_update_;
+
+ /// @brief The subscribe-changes flag.
+ ///
+ /// If true (the deault) the netconf agent subscribes module changes
+ /// so will be notified when the YANG running configuration is changed.
+ bool subscribe_changes_;
+
+ /// @brief The validate-changes flag.
+ ///
+ /// If true (the deault) the netconf agent validates module changes
+ /// and can reject bad configurations.
+ bool validate_changes_;
+
/// @brief The control socket.
CfgControlSocketPtr control_socket_;
};
diff --git a/src/bin/netconf/netconf_lexer.cc b/src/bin/netconf/netconf_lexer.cc
index e21369136c..5f55acdc7e 100644
--- a/src/bin/netconf/netconf_lexer.cc
+++ b/src/bin/netconf/netconf_lexer.cc
@@ -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 59
-#define YY_END_OF_BUFFER 60
+#define YY_NUM_RULES 62
+#define YY_END_OF_BUFFER 63
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -700,43 +700,48 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static const flex_int16_t yy_accept[321] =
+static const flex_int16_t yy_accept[367] =
{ 0,
- 52, 52, 0, 0, 0, 0, 0, 0, 0, 0,
- 60, 58, 10, 11, 58, 1, 52, 49, 52, 52,
- 58, 51, 50, 58, 58, 58, 58, 58, 45, 46,
- 58, 58, 58, 47, 48, 5, 5, 5, 58, 58,
- 58, 10, 11, 0, 0, 41, 0, 0, 0, 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,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 52, 52, 0, 51, 52, 3, 2, 6, 0,
- 52, 0, 0, 0, 0, 0, 0, 4, 0, 0,
- 9, 0, 42, 0, 0, 0, 0, 44, 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, 47,
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, 43, 0, 19, 0, 0, 18, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 57, 55, 0,
- 54, 53, 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, 46, 0, 0,
+ 22, 0, 0, 21, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 56, 53,
+ 0, 0, 0, 0, 0, 60, 58, 0, 57, 56,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 23, 0, 0, 0, 0, 0, 0, 33,
-
- 0, 0, 0, 0, 0, 22, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 17, 36, 0, 0, 0,
- 0, 0, 0, 20, 0, 0, 0, 0, 0, 0,
- 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 38, 35, 0, 0, 0, 0, 24, 0, 31,
- 12, 14, 0, 0, 0, 29, 32, 0, 37, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 39, 0,
- 0, 0, 30, 0, 0, 27, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 59,
+ 56, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 26, 0, 0, 0, 0, 0,
+ 0, 36, 0, 0, 0, 0, 0, 0, 25, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 19,
+ 20, 39, 0, 0, 0, 0, 0, 0, 23, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 41,
+ 38, 0, 0, 0, 0, 27, 0, 0, 0, 34,
+ 12, 0, 14, 0, 0, 0, 32, 35, 0, 40,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 43, 0, 0, 0,
- 0, 26, 25, 0, 0, 0, 0, 0, 13, 0,
- 0, 0, 0, 21, 0, 0, 34, 28, 15, 0
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 42, 0,
+ 0, 0, 33, 0, 0, 30, 0, 0, 0, 15,
+ 0, 0, 0, 0, 29, 28, 0, 0, 0, 0,
+ 0, 0, 0, 0, 13, 0, 0, 0, 0, 0,
+ 0, 0, 24, 0, 0, 37, 0, 0, 31, 18,
+ 0, 0, 0, 17, 16, 0
} ;
static const YY_CHAR yy_ec[256] =
@@ -781,89 +786,97 @@ static const YY_CHAR yy_meta[61] =
5, 3, 5, 5, 3, 3, 3, 3, 3, 3
} ;
-static const flex_int16_t yy_base[334] =
+static const flex_int16_t yy_base[380] =
{ 0,
0, 0, 59, 62, 65, 0, 63, 67, 47, 64,
- 277, 2083, 84, 269, 125, 0, 105, 2083, 120, 125,
- 85, 166, 2083, 250, 139, 65, 69, 82, 2083, 2083,
- 80, 84, 118, 2083, 2083, 2083, 92, 253, 211, 0,
- 235, 110, 243, 97, 183, 2083, 190, 196, 194, 207,
- 218, 251, 261, 267, 273, 279, 285, 301, 318, 324,
- 0, 326, 363, 338, 369, 374, 2083, 0, 2083, 345,
- 380, 121, 168, 157, 169, 179, 172, 2083, 196, 198,
- 2083, 137, 2083, 133, 398, 404, 170, 330, 444, 410,
- 416, 422, 469, 485, 444, 491, 498, 506, 432, 513,
-
- 519, 526, 532, 547, 554, 561, 569, 580, 587, 0,
- 189, 186, 177, 208, 204, 198, 116, 2083, 0, 604,
- 615, 155, 2083, 640, 2083, 627, 633, 2083, 639, 667,
- 681, 689, 695, 702, 709, 723, 717, 735, 746, 759,
- 775, 781, 787, 793, 800, 816, 204, 2083, 2083, 225,
- 2083, 2083, 105, 0, 822, 828, 864, 835, 857, 851,
- 893, 910, 916, 922, 928, 934, 944, 956, 969, 977,
- 989, 995, 1005, 1011, 1018, 1024, 1030, 1039, 2083, 2083,
- 118, 0, 1053, 1063, 1098, 1092, 1125, 1073, 1140, 1146,
- 1153, 1159, 2083, 1165, 1174, 1181, 1187, 1193, 1199, 2083,
-
- 1207, 1216, 1228, 1235, 1245, 2083, 1251, 64, 0, 1261,
- 1268, 1274, 1280, 1289, 2083, 2083, 2083, 1309, 1315, 1329,
- 1335, 1343, 1351, 2083, 1357, 1363, 1376, 1392, 1385, 1398,
- 2083, 1404, 1411, 1418, 1432, 1439, 1447, 1453, 1460, 1467,
- 1473, 2083, 2083, 1481, 1495, 1501, 1507, 2083, 1514, 2083,
- 2083, 2083, 1520, 1530, 1536, 2083, 2083, 1542, 2083, 1548,
- 1576, 1582, 1589, 1598, 1605, 1611, 1617, 1627, 1634, 1646,
- 1656, 1668, 2083, 1674, 1681, 1689, 1696, 1709, 1722, 1731,
- 1737, 1743, 1750, 1756, 1771, 1779, 1789, 1796, 2083, 1804,
- 1813, 1824, 2083, 1830, 1837, 2083, 1846, 1858, 1874, 1880,
-
- 1886, 2083, 2083, 1894, 1900, 1908, 1922, 1929, 2083, 1936,
- 1943, 1955, 1964, 2083, 1976, 1983, 2083, 2083, 2083, 2083,
- 2016, 2023, 2030, 2037, 2044, 2051, 2058, 2062, 2067, 2069,
- 2071, 2073, 2075
+ 291, 2481, 84, 286, 125, 0, 105, 2481, 120, 125,
+ 85, 169, 2481, 262, 139, 65, 69, 82, 2481, 2481,
+ 80, 84, 118, 2481, 2481, 2481, 92, 269, 230, 0,
+ 256, 110, 270, 97, 186, 2481, 193, 199, 197, 210,
+ 219, 234, 255, 263, 269, 278, 284, 291, 297, 303,
+ 320, 338, 0, 345, 363, 375, 381, 385, 2481, 0,
+ 2481, 332, 349, 121, 144, 128, 152, 171, 160, 2481,
+ 222, 248, 2481, 198, 2481, 169, 405, 411, 209, 417,
+ 451, 428, 439, 450, 478, 493, 499, 506, 512, 518,
+
+ 532, 540, 546, 552, 574, 586, 594, 602, 608, 614,
+ 622, 628, 648, 661, 0, 177, 181, 184, 189, 207,
+ 204, 130, 2481, 0, 667, 673, 155, 2481, 698, 695,
+ 2481, 683, 723, 2481, 739, 748, 756, 762, 768, 776,
+ 782, 810, 819, 827, 833, 839, 847, 853, 862, 875,
+ 895, 903, 909, 917, 222, 2481, 2481, 223, 2481, 2481,
+ 103, 0, 924, 931, 967, 937, 992, 1008, 943, 1014,
+ 1020, 1032, 1042, 1049, 1055, 1065, 1071, 1077, 1088, 1099,
+ 1110, 1121, 1127, 1134, 1143, 1149, 1155, 1169, 1183, 2481,
+ 2481, 104, 0, 1190, 1197, 1232, 1204, 1211, 1218, 1230,
+
+ 1259, 1276, 1282, 1288, 2481, 1294, 1300, 1310, 1316, 1322,
+ 1328, 2481, 1334, 1351, 1357, 1363, 1369, 1375, 2481, 1391,
+ 1397, 64, 0, 1403, 1409, 1437, 1445, 1451, 1459, 2481,
+ 2481, 2481, 1470, 1479, 1487, 1499, 1507, 1516, 2481, 1522,
+ 1528, 1540, 1557, 1550, 1563, 1569, 1576, 2481, 1583, 1597,
+ 1609, 1618, 1625, 1631, 1637, 1643, 1651, 1660, 1666, 2481,
+ 2481, 1672, 1686, 1694, 1700, 2481, 1706, 1712, 1722, 2481,
+ 2481, 1728, 2481, 1734, 1767, 1773, 2481, 2481, 1779, 2481,
+ 1786, 1792, 1802, 1812, 1820, 1827, 1836, 1848, 1855, 1861,
+ 1869, 1883, 1889, 1897, 1903, 1909, 2481, 1918, 1925, 1943,
+
+ 1951, 1965, 1971, 1977, 1985, 1991, 2000, 2010, 2019, 2025,
+ 2036, 2044, 2053, 2064, 2072, 2079, 2086, 2092, 2481, 2098,
+ 2105, 2112, 2481, 2133, 2140, 2481, 2149, 2156, 2162, 2481,
+ 2168, 2174, 2182, 2210, 2481, 2481, 2218, 2224, 2230, 2236,
+ 2243, 2258, 2264, 2271, 2481, 2278, 2284, 2292, 2299, 2312,
+ 2320, 2327, 2481, 2333, 2340, 2481, 2346, 2355, 2481, 2481,
+ 2362, 2368, 2375, 2481, 2481, 2481, 2414, 2421, 2428, 2435,
+ 2442, 2449, 2456, 2460, 2465, 2467, 2469, 2471, 2473
} ;
-static const flex_int16_t yy_def[334] =
+static const flex_int16_t yy_def[380] =
{ 0,
- 320, 1, 321, 321, 1, 5, 5, 5, 5, 5,
- 320, 320, 320, 320, 322, 323, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 324,
- 320, 320, 320, 325, 322, 320, 322, 322, 326, 322,
- 322, 322, 322, 322, 322, 322, 322, 322, 322, 322,
- 323, 320, 320, 320, 320, 320, 320, 327, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 324,
- 320, 325, 320, 328, 322, 322, 329, 322, 326, 322,
- 322, 322, 322, 322, 322, 322, 322, 322, 322, 322,
-
- 322, 322, 322, 322, 322, 322, 322, 322, 322, 327,
- 320, 320, 320, 320, 320, 320, 320, 320, 330, 322,
- 322, 329, 320, 326, 320, 322, 322, 320, 322, 322,
- 322, 322, 322, 322, 322, 322, 322, 322, 322, 322,
- 322, 322, 322, 322, 322, 322, 320, 320, 320, 320,
- 320, 320, 320, 331, 322, 322, 326, 322, 322, 322,
- 322, 322, 322, 322, 322, 322, 322, 322, 322, 322,
- 322, 322, 322, 322, 322, 322, 322, 322, 320, 320,
- 320, 332, 322, 322, 326, 322, 322, 322, 322, 322,
- 322, 322, 320, 322, 322, 322, 322, 322, 322, 320,
-
- 322, 322, 322, 322, 322, 320, 322, 320, 333, 322,
- 322, 322, 322, 322, 320, 320, 320, 322, 322, 322,
- 322, 322, 322, 320, 322, 322, 322, 322, 322, 322,
- 320, 322, 322, 322, 322, 322, 322, 322, 322, 322,
- 322, 320, 320, 322, 322, 322, 322, 320, 322, 320,
- 320, 320, 322, 322, 322, 320, 320, 322, 320, 322,
- 322, 322, 322, 322, 322, 322, 322, 322, 322, 322,
- 322, 322, 320, 322, 322, 322, 322, 322, 322, 322,
- 322, 322, 322, 322, 322, 322, 322, 322, 320, 322,
- 322, 322, 320, 322, 322, 320, 322, 322, 322, 322,
-
- 322, 320, 320, 322, 322, 322, 322, 322, 320, 322,
- 322, 322, 322, 320, 322, 322, 320, 320, 320, 0,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320
+ 366, 1, 367, 367, 1, 5, 5, 5, 5, 5,
+ 366, 366, 366, 366, 368, 369, 366, 366, 366, 366,
+ 366, 366, 366, 366, 366, 366, 366, 366, 366, 366,
+ 366, 366, 366, 366, 366, 366, 366, 366, 366, 370,
+ 366, 366, 366, 371, 368, 366, 368, 368, 372, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 369, 366, 366, 366, 366, 366, 366, 373,
+ 366, 366, 366, 366, 366, 366, 366, 366, 366, 366,
+ 366, 370, 366, 371, 366, 374, 368, 368, 375, 368,
+ 372, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 373, 366, 366, 366, 366, 366,
+ 366, 366, 366, 376, 368, 368, 375, 366, 372, 368,
+ 366, 368, 368, 366, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 366, 366, 366, 366, 366, 366,
+ 366, 377, 368, 368, 372, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 366,
+ 366, 366, 378, 368, 368, 372, 368, 368, 368, 368,
+
+ 368, 368, 368, 368, 366, 368, 368, 368, 368, 368,
+ 368, 366, 368, 368, 368, 368, 368, 368, 366, 368,
+ 368, 366, 379, 368, 368, 368, 368, 368, 368, 366,
+ 366, 366, 368, 368, 368, 368, 368, 368, 366, 368,
+ 368, 368, 368, 368, 368, 368, 368, 366, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 366,
+ 366, 368, 368, 368, 368, 366, 368, 368, 368, 366,
+ 366, 368, 366, 368, 368, 368, 366, 366, 368, 366,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 366, 368, 368, 368,
+
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 366, 368,
+ 368, 368, 366, 368, 368, 366, 368, 368, 368, 366,
+ 368, 368, 368, 368, 366, 366, 368, 368, 368, 368,
+ 368, 368, 368, 368, 366, 368, 368, 368, 368, 368,
+ 368, 368, 366, 368, 368, 366, 368, 368, 366, 366,
+ 368, 368, 368, 366, 366, 0, 366, 366, 366, 366,
+ 366, 366, 366, 366, 366, 366, 366, 366, 366
} ;
-static const flex_int16_t yy_nxt[2144] =
+static const flex_int16_t yy_nxt[2542] =
{ 0,
12, 13, 14, 13, 12, 15, 16, 12, 17, 18,
19, 20, 21, 22, 22, 22, 22, 23, 24, 12,
@@ -873,237 +886,281 @@ static const flex_int16_t yy_nxt[2144] =
12, 12, 33, 12, 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, 12, 41, 42, 72, 42, 12, 12,
- 12, 12, 67, 42, 12, 42, 12, 68, 12, 73,
-
- 72, 72, 83, 231, 12, 12, 12, 12, 39, 74,
- 12, 42, 12, 42, 73, 75, 62, 12, 63, 63,
- 63, 63, 73, 12, 12, 44, 44, 44, 64, 84,
- 46, 62, 74, 65, 65, 65, 65, 76, 66, 66,
- 66, 66, 83, 64, 64, 74, 111, 70, 64, 70,
- 47, 48, 71, 71, 71, 71, 208, 49, 181, 64,
- 123, 153, 50, 51, 64, 52, 111, 53, 77, 84,
- 54, 55, 56, 57, 58, 123, 59, 62, 60, 65,
- 65, 65, 65, 44, 44, 44, 119, 113, 46, 64,
- 44, 44, 44, 112, 111, 46, 44, 44, 44, 88,
-
- 149, 46, 113, 118, 112, 64, 45, 44, 44, 44,
- 113, 148, 46, 112, 114, 49, 149, 147, 44, 44,
- 44, 149, 49, 46, 115, 116, 45, 179, 49, 148,
- 45, 148, 92, 117, 45, 86, 147, 152, 85, 49,
- 147, 45, 90, 179, 45, 43, 45, 89, 179, 151,
- 49, 44, 44, 44, 81, 91, 46, 93, 79, 150,
- 94, 44, 44, 44, 180, 78, 46, 44, 44, 44,
- 69, 43, 46, 44, 44, 44, 320, 320, 46, 44,
- 44, 44, 320, 49, 46, 44, 44, 44, 320, 320,
- 46, 320, 320, 49, 320, 320, 95, 320, 320, 49,
-
- 320, 44, 44, 44, 320, 49, 46, 320, 100, 96,
- 98, 49, 320, 97, 102, 99, 320, 49, 44, 44,
- 44, 101, 320, 46, 44, 44, 44, 320, 320, 46,
- 44, 44, 44, 49, 320, 46, 104, 320, 103, 66,
- 66, 66, 66, 320, 320, 320, 70, 320, 70, 64,
- 49, 71, 71, 71, 71, 320, 49, 105, 71, 71,
- 71, 71, 49, 320, 320, 64, 106, 320, 320, 320,
- 107, 108, 320, 320, 62, 109, 63, 63, 63, 63,
- 62, 320, 65, 65, 65, 65, 64, 66, 66, 66,
- 66, 320, 64, 71, 71, 71, 71, 64, 44, 44,
-
- 44, 320, 64, 46, 44, 44, 44, 320, 64, 46,
- 44, 44, 44, 64, 320, 125, 44, 44, 44, 320,
- 320, 46, 44, 44, 44, 320, 320, 128, 320, 320,
- 49, 320, 44, 44, 44, 320, 49, 46, 320, 120,
- 320, 320, 49, 320, 44, 44, 44, 320, 49, 46,
- 320, 320, 320, 320, 49, 320, 121, 124, 124, 124,
- 124, 320, 126, 127, 49, 124, 124, 124, 124, 44,
- 44, 44, 320, 135, 46, 320, 49, 320, 320, 124,
- 124, 124, 124, 124, 124, 44, 44, 44, 320, 320,
- 46, 44, 44, 44, 320, 320, 46, 131, 44, 44,
-
- 44, 49, 320, 46, 320, 129, 44, 44, 44, 320,
- 320, 46, 320, 44, 44, 44, 320, 49, 46, 44,
- 44, 44, 130, 49, 46, 320, 44, 44, 44, 320,
- 49, 46, 44, 44, 44, 320, 320, 46, 49, 132,
- 320, 320, 134, 320, 320, 49, 320, 44, 44, 44,
- 133, 49, 46, 320, 44, 44, 44, 138, 49, 46,
- 136, 44, 44, 44, 49, 320, 46, 320, 137, 44,
- 44, 44, 139, 320, 46, 320, 320, 320, 320, 49,
- 44, 44, 44, 320, 140, 46, 49, 44, 44, 44,
- 320, 320, 46, 49, 320, 320, 320, 141, 143, 320,
-
- 320, 49, 320, 320, 44, 44, 44, 144, 142, 46,
- 320, 320, 49, 320, 320, 44, 44, 44, 320, 49,
- 46, 320, 320, 145, 320, 320, 146, 44, 44, 44,
- 320, 320, 46, 44, 44, 44, 49, 320, 46, 44,
- 44, 44, 320, 320, 46, 155, 320, 49, 320, 320,
- 320, 320, 156, 157, 157, 157, 157, 320, 320, 49,
- 320, 157, 157, 157, 157, 49, 320, 44, 44, 44,
- 320, 49, 46, 158, 320, 157, 157, 157, 157, 157,
- 157, 44, 44, 44, 320, 159, 46, 320, 320, 44,
- 44, 44, 160, 320, 46, 44, 44, 44, 320, 49,
-
- 46, 320, 44, 44, 44, 320, 320, 46, 320, 44,
- 44, 44, 320, 49, 46, 320, 161, 44, 44, 44,
- 320, 49, 46, 44, 44, 44, 320, 49, 46, 320,
- 320, 320, 162, 163, 49, 44, 44, 44, 320, 320,
- 46, 49, 320, 320, 164, 320, 44, 44, 44, 49,
- 166, 46, 165, 320, 320, 49, 320, 320, 167, 44,
- 44, 44, 320, 320, 46, 320, 320, 49, 168, 320,
- 320, 169, 320, 320, 170, 44, 44, 44, 49, 320,
- 46, 44, 44, 44, 320, 171, 46, 44, 44, 44,
- 320, 49, 46, 44, 44, 44, 320, 320, 46, 320,
-
- 44, 44, 44, 320, 320, 46, 320, 49, 172, 320,
- 173, 320, 320, 49, 320, 320, 44, 44, 44, 49,
- 174, 46, 44, 44, 44, 49, 320, 46, 44, 44,
- 44, 175, 49, 46, 320, 44, 44, 44, 320, 320,
- 46, 176, 320, 320, 320, 320, 320, 320, 49, 320,
- 320, 44, 44, 44, 49, 177, 46, 44, 44, 44,
- 49, 320, 46, 320, 320, 183, 178, 49, 320, 320,
- 320, 320, 320, 320, 186, 320, 184, 185, 185, 185,
- 185, 320, 320, 49, 320, 185, 185, 185, 185, 49,
- 320, 320, 188, 44, 44, 44, 320, 320, 46, 185,
-
- 185, 185, 185, 185, 185, 320, 320, 187, 189, 190,
- 44, 44, 44, 320, 320, 46, 44, 44, 44, 320,
- 320, 46, 44, 44, 44, 49, 320, 193, 44, 44,
- 44, 320, 320, 46, 44, 44, 44, 320, 320, 46,
- 320, 320, 49, 320, 44, 44, 44, 320, 49, 46,
- 320, 320, 191, 320, 49, 320, 44, 44, 44, 320,
- 49, 46, 320, 194, 320, 320, 49, 192, 320, 44,
- 44, 44, 320, 195, 46, 320, 49, 44, 44, 44,
- 320, 320, 46, 320, 320, 196, 320, 320, 49, 44,
- 44, 44, 320, 320, 200, 44, 44, 44, 320, 197,
-
- 46, 49, 320, 320, 320, 44, 44, 44, 198, 49,
- 46, 44, 44, 44, 320, 320, 46, 320, 44, 44,
- 44, 49, 199, 46, 44, 44, 44, 49, 320, 46,
- 44, 44, 44, 320, 320, 206, 320, 49, 320, 44,
- 44, 44, 320, 49, 46, 320, 320, 320, 201, 207,
- 49, 202, 320, 44, 44, 44, 49, 204, 46, 320,
- 320, 203, 49, 44, 44, 44, 320, 320, 46, 320,
- 320, 49, 320, 44, 44, 44, 320, 205, 46, 320,
- 320, 320, 320, 320, 320, 49, 320, 320, 320, 320,
- 320, 320, 44, 44, 44, 49, 320, 46, 320, 320,
-
- 210, 320, 320, 320, 320, 49, 320, 320, 320, 320,
- 211, 45, 45, 45, 45, 320, 320, 320, 214, 45,
- 45, 45, 45, 320, 49, 44, 44, 44, 320, 320,
- 46, 320, 320, 45, 45, 45, 45, 45, 45, 212,
- 44, 44, 44, 320, 320, 215, 44, 44, 44, 320,
- 320, 216, 320, 44, 44, 44, 320, 49, 217, 44,
- 44, 44, 320, 320, 46, 44, 44, 44, 320, 218,
- 46, 320, 49, 213, 44, 44, 44, 320, 49, 46,
- 320, 44, 44, 44, 320, 49, 46, 44, 44, 44,
- 320, 49, 46, 44, 44, 44, 320, 49, 46, 44,
-
- 44, 44, 320, 320, 224, 320, 49, 44, 44, 44,
- 320, 320, 46, 49, 320, 219, 44, 44, 44, 49,
- 221, 46, 320, 320, 220, 49, 320, 320, 44, 44,
- 44, 49, 320, 46, 320, 44, 44, 44, 320, 49,
- 46, 320, 320, 223, 222, 44, 44, 44, 49, 320,
- 46, 44, 44, 44, 320, 226, 46, 320, 320, 225,
- 49, 44, 44, 44, 320, 320, 46, 49, 44, 44,
- 44, 227, 320, 46, 44, 44, 44, 49, 320, 46,
- 44, 44, 44, 49, 320, 46, 320, 228, 230, 44,
- 44, 44, 320, 49, 46, 320, 320, 229, 320, 320,
-
- 49, 320, 232, 320, 320, 320, 49, 320, 233, 44,
- 44, 44, 49, 320, 46, 44, 44, 44, 320, 320,
- 46, 49, 320, 320, 320, 235, 234, 320, 236, 44,
- 44, 44, 320, 320, 46, 44, 44, 44, 320, 320,
- 46, 49, 320, 44, 44, 44, 320, 49, 46, 320,
- 320, 44, 44, 44, 237, 320, 242, 44, 44, 44,
- 320, 49, 243, 44, 44, 44, 320, 49, 46, 320,
- 320, 238, 320, 240, 320, 49, 44, 44, 44, 320,
- 239, 46, 241, 49, 320, 44, 44, 44, 320, 49,
- 248, 244, 44, 44, 44, 49, 320, 46, 44, 44,
-
- 44, 320, 247, 46, 44, 44, 44, 320, 49, 250,
- 320, 44, 44, 44, 320, 245, 251, 49, 44, 44,
- 44, 320, 320, 252, 49, 320, 320, 320, 246, 320,
- 49, 320, 44, 44, 44, 320, 49, 46, 320, 44,
- 44, 44, 253, 49, 46, 320, 249, 44, 44, 44,
- 49, 320, 46, 44, 44, 44, 320, 320, 256, 320,
- 44, 44, 44, 320, 49, 257, 320, 44, 44, 44,
- 320, 49, 46, 44, 44, 44, 320, 258, 259, 49,
- 320, 44, 44, 44, 320, 49, 46, 320, 320, 320,
- 255, 320, 49, 254, 320, 44, 44, 44, 320, 49,
-
- 46, 44, 44, 44, 320, 49, 46, 44, 44, 44,
- 320, 320, 46, 49, 44, 44, 44, 320, 320, 46,
- 44, 44, 44, 320, 320, 46, 320, 49, 320, 260,
- 44, 44, 44, 49, 261, 46, 44, 44, 44, 49,
- 320, 46, 44, 44, 44, 320, 49, 46, 44, 44,
- 44, 320, 49, 46, 263, 320, 320, 262, 320, 264,
- 265, 266, 49, 320, 320, 320, 320, 320, 49, 268,
- 320, 267, 269, 320, 49, 320, 44, 44, 44, 320,
- 49, 46, 44, 44, 44, 320, 320, 273, 320, 44,
- 44, 44, 320, 270, 46, 320, 320, 271, 44, 44,
-
- 44, 320, 320, 46, 320, 44, 44, 44, 49, 320,
- 46, 44, 44, 44, 49, 320, 46, 44, 44, 44,
- 320, 49, 46, 320, 274, 320, 272, 44, 44, 44,
- 49, 320, 46, 320, 44, 44, 44, 49, 320, 46,
- 320, 320, 320, 49, 320, 320, 44, 44, 44, 49,
- 320, 46, 320, 320, 275, 276, 44, 44, 44, 49,
- 320, 46, 320, 277, 320, 278, 49, 320, 44, 44,
- 44, 320, 279, 46, 44, 44, 44, 320, 49, 46,
- 320, 44, 44, 44, 280, 281, 46, 320, 49, 44,
- 44, 44, 320, 320, 46, 320, 44, 44, 44, 320,
-
- 49, 46, 320, 320, 320, 320, 49, 320, 282, 44,
- 44, 44, 320, 49, 46, 320, 320, 320, 320, 283,
- 284, 49, 44, 44, 44, 320, 320, 289, 49, 320,
- 285, 44, 44, 44, 286, 287, 46, 44, 44, 44,
- 320, 49, 46, 44, 44, 44, 288, 320, 46, 320,
- 44, 44, 44, 320, 49, 293, 44, 44, 44, 320,
- 320, 46, 320, 49, 320, 320, 290, 320, 320, 49,
- 320, 44, 44, 44, 320, 49, 46, 320, 320, 44,
- 44, 44, 49, 320, 296, 320, 292, 291, 49, 44,
- 44, 44, 320, 320, 46, 294, 44, 44, 44, 320,
-
- 320, 46, 320, 49, 44, 44, 44, 320, 320, 46,
- 295, 49, 320, 44, 44, 44, 320, 320, 46, 320,
- 320, 49, 320, 320, 44, 44, 44, 320, 49, 46,
- 44, 44, 44, 320, 320, 302, 49, 44, 44, 44,
- 298, 320, 303, 320, 297, 49, 44, 44, 44, 320,
- 320, 46, 320, 320, 299, 320, 49, 320, 44, 44,
- 44, 320, 49, 46, 320, 320, 320, 300, 320, 49,
- 320, 320, 301, 320, 44, 44, 44, 320, 49, 46,
- 44, 44, 44, 320, 320, 46, 44, 44, 44, 320,
- 49, 46, 320, 320, 44, 44, 44, 305, 304, 309,
-
- 44, 44, 44, 320, 320, 46, 49, 320, 44, 44,
- 44, 320, 49, 46, 320, 320, 320, 306, 49, 307,
- 320, 320, 44, 44, 44, 320, 49, 46, 320, 44,
- 44, 44, 49, 308, 46, 320, 44, 44, 44, 320,
- 49, 314, 320, 44, 44, 44, 320, 311, 46, 320,
- 320, 320, 310, 320, 49, 44, 44, 44, 320, 320,
- 46, 49, 320, 320, 44, 44, 44, 320, 49, 317,
- 320, 320, 312, 320, 320, 49, 44, 44, 44, 320,
- 313, 318, 320, 44, 44, 44, 320, 49, 319, 320,
- 320, 320, 320, 320, 315, 320, 49, 320, 320, 320,
-
- 320, 320, 320, 320, 320, 320, 316, 320, 49, 320,
- 320, 320, 320, 320, 320, 49, 36, 36, 36, 36,
- 36, 36, 36, 45, 45, 45, 45, 45, 45, 45,
- 61, 320, 61, 61, 61, 61, 61, 80, 320, 80,
- 320, 80, 80, 80, 82, 82, 82, 82, 82, 82,
- 82, 87, 87, 87, 87, 87, 87, 87, 110, 320,
- 110, 110, 110, 110, 110, 82, 82, 320, 82, 122,
- 122, 122, 122, 122, 154, 154, 182, 182, 209, 209,
- 82, 82, 11, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
-
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320
+ 12, 12, 12, 12, 41, 42, 74, 42, 12, 12,
+ 12, 12, 69, 42, 12, 42, 12, 70, 12, 75,
+
+ 74, 74, 85, 248, 12, 12, 12, 12, 39, 76,
+ 12, 42, 12, 42, 75, 77, 64, 12, 65, 65,
+ 65, 65, 75, 12, 12, 44, 44, 44, 66, 86,
+ 46, 64, 76, 67, 67, 67, 67, 78, 68, 68,
+ 68, 68, 222, 66, 66, 76, 116, 72, 66, 72,
+ 47, 48, 73, 73, 73, 73, 192, 49, 118, 66,
+ 128, 50, 51, 52, 66, 53, 116, 54, 79, 117,
+ 55, 56, 57, 58, 59, 161, 60, 116, 61, 62,
+ 64, 118, 67, 67, 67, 67, 44, 44, 44, 117,
+ 118, 46, 66, 44, 44, 44, 117, 119, 46, 44,
+
+ 44, 44, 90, 85, 46, 155, 156, 157, 66, 45,
+ 44, 44, 44, 121, 128, 46, 120, 155, 49, 44,
+ 44, 44, 124, 157, 46, 49, 156, 157, 155, 45,
+ 86, 49, 156, 45, 44, 44, 44, 45, 88, 46,
+ 158, 87, 49, 160, 45, 190, 190, 45, 95, 45,
+ 91, 49, 159, 123, 93, 44, 44, 44, 92, 122,
+ 46, 190, 191, 44, 44, 44, 49, 94, 46, 44,
+ 44, 44, 43, 96, 46, 83, 97, 81, 44, 44,
+ 44, 80, 71, 46, 44, 44, 44, 49, 43, 46,
+ 366, 44, 44, 44, 366, 49, 46, 44, 44, 44,
+
+ 98, 49, 46, 44, 44, 44, 366, 366, 46, 366,
+ 49, 99, 101, 103, 366, 100, 49, 102, 366, 105,
+ 44, 44, 44, 49, 366, 46, 104, 366, 366, 49,
+ 366, 366, 107, 366, 366, 49, 366, 366, 44, 44,
+ 44, 366, 108, 46, 106, 73, 73, 73, 73, 366,
+ 366, 109, 49, 366, 366, 110, 111, 366, 68, 68,
+ 68, 68, 73, 73, 73, 73, 366, 112, 66, 366,
+ 49, 113, 366, 114, 64, 366, 65, 65, 65, 65,
+ 366, 366, 366, 72, 66, 72, 66, 366, 73, 73,
+ 73, 73, 64, 366, 67, 67, 67, 67, 68, 68,
+
+ 68, 68, 66, 366, 66, 44, 44, 44, 66, 366,
+ 46, 44, 44, 44, 366, 366, 46, 44, 44, 44,
+ 66, 366, 46, 366, 66, 366, 366, 366, 44, 44,
+ 44, 366, 366, 46, 366, 366, 366, 49, 366, 44,
+ 44, 44, 366, 49, 131, 366, 125, 366, 366, 49,
+ 44, 44, 44, 366, 366, 46, 366, 366, 366, 366,
+ 49, 366, 366, 126, 129, 129, 129, 129, 366, 366,
+ 366, 49, 129, 129, 129, 129, 130, 366, 44, 44,
+ 44, 366, 49, 134, 366, 366, 129, 129, 129, 129,
+ 129, 129, 366, 44, 44, 44, 132, 133, 46, 44,
+
+ 44, 44, 366, 366, 46, 366, 44, 44, 44, 366,
+ 49, 46, 44, 44, 44, 366, 366, 46, 44, 44,
+ 44, 366, 366, 46, 366, 49, 366, 366, 366, 135,
+ 366, 49, 44, 44, 44, 366, 136, 46, 49, 366,
+ 44, 44, 44, 366, 49, 46, 44, 44, 44, 366,
+ 49, 46, 44, 44, 44, 366, 366, 46, 366, 137,
+ 138, 366, 366, 366, 49, 366, 366, 366, 140, 366,
+ 139, 366, 49, 366, 44, 44, 44, 366, 49, 46,
+ 366, 141, 366, 366, 49, 366, 44, 44, 44, 366,
+ 144, 46, 366, 142, 44, 44, 44, 366, 366, 46,
+
+ 366, 143, 44, 44, 44, 366, 49, 46, 44, 44,
+ 44, 366, 366, 46, 44, 44, 44, 366, 49, 46,
+ 145, 366, 44, 44, 44, 366, 49, 46, 44, 44,
+ 44, 366, 366, 46, 49, 366, 366, 366, 146, 366,
+ 49, 366, 366, 366, 147, 149, 49, 366, 44, 44,
+ 44, 366, 150, 46, 49, 366, 148, 366, 151, 366,
+ 49, 44, 44, 44, 366, 366, 46, 44, 44, 44,
+ 366, 152, 46, 44, 44, 44, 366, 366, 46, 366,
+ 49, 366, 366, 44, 44, 44, 366, 153, 46, 366,
+ 366, 366, 366, 49, 366, 44, 44, 44, 366, 49,
+
+ 46, 366, 366, 366, 366, 49, 154, 366, 163, 366,
+ 164, 165, 165, 165, 165, 49, 366, 366, 366, 165,
+ 165, 165, 165, 44, 44, 44, 366, 49, 46, 167,
+ 366, 366, 366, 165, 165, 165, 165, 165, 165, 44,
+ 44, 44, 366, 366, 46, 366, 366, 166, 44, 44,
+ 44, 366, 366, 46, 366, 49, 44, 44, 44, 366,
+ 366, 46, 44, 44, 44, 366, 366, 46, 44, 44,
+ 44, 49, 366, 46, 366, 168, 44, 44, 44, 366,
+ 49, 46, 44, 44, 44, 366, 366, 46, 49, 366,
+ 366, 366, 169, 366, 49, 366, 366, 170, 366, 366,
+
+ 49, 366, 366, 366, 366, 366, 172, 171, 49, 366,
+ 44, 44, 44, 366, 49, 46, 366, 173, 366, 44,
+ 44, 44, 366, 175, 46, 366, 174, 44, 44, 44,
+ 366, 366, 46, 44, 44, 44, 366, 366, 46, 44,
+ 44, 44, 49, 366, 46, 176, 366, 44, 44, 44,
+ 366, 49, 46, 44, 44, 44, 366, 366, 46, 49,
+ 366, 366, 44, 44, 44, 49, 179, 46, 366, 366,
+ 177, 49, 180, 178, 366, 44, 44, 44, 366, 49,
+ 46, 366, 182, 366, 366, 49, 366, 366, 181, 366,
+ 366, 366, 183, 366, 49, 44, 44, 44, 366, 366,
+
+ 46, 366, 366, 44, 44, 44, 184, 49, 46, 44,
+ 44, 44, 366, 366, 46, 366, 366, 44, 44, 44,
+ 366, 366, 46, 185, 44, 44, 44, 49, 366, 46,
+ 366, 44, 44, 44, 366, 49, 46, 44, 44, 44,
+ 366, 49, 46, 44, 44, 44, 186, 197, 46, 49,
+ 366, 366, 366, 366, 366, 366, 49, 366, 187, 188,
+ 189, 366, 366, 49, 366, 366, 366, 194, 366, 49,
+ 366, 366, 366, 366, 366, 49, 366, 366, 366, 195,
+ 196, 196, 196, 196, 200, 366, 366, 366, 196, 196,
+ 196, 196, 44, 44, 44, 366, 366, 46, 366, 366,
+
+ 366, 366, 196, 196, 196, 196, 196, 196, 44, 44,
+ 44, 366, 366, 46, 44, 44, 44, 366, 366, 46,
+ 44, 44, 44, 366, 49, 46, 366, 366, 366, 201,
+ 202, 198, 44, 44, 44, 366, 366, 46, 366, 366,
+ 49, 366, 44, 44, 44, 366, 49, 205, 366, 44,
+ 44, 44, 49, 366, 46, 44, 44, 44, 199, 366,
+ 46, 366, 203, 366, 49, 44, 44, 44, 366, 366,
+ 46, 44, 44, 44, 49, 366, 46, 44, 44, 44,
+ 366, 49, 46, 204, 206, 366, 366, 49, 44, 44,
+ 44, 366, 366, 46, 207, 366, 366, 49, 366, 44,
+
+ 44, 44, 366, 49, 212, 366, 208, 366, 366, 49,
+ 44, 44, 44, 366, 209, 46, 210, 366, 366, 366,
+ 49, 44, 44, 44, 366, 366, 46, 44, 44, 44,
+ 366, 49, 46, 211, 44, 44, 44, 366, 366, 46,
+ 366, 366, 49, 44, 44, 44, 366, 366, 46, 44,
+ 44, 44, 366, 49, 46, 44, 44, 44, 366, 49,
+ 219, 366, 366, 213, 366, 366, 49, 214, 366, 44,
+ 44, 44, 366, 216, 46, 49, 366, 215, 366, 220,
+ 366, 49, 366, 44, 44, 44, 218, 49, 46, 366,
+ 44, 44, 44, 366, 366, 46, 217, 44, 44, 44,
+
+ 366, 49, 46, 366, 44, 44, 44, 366, 366, 46,
+ 366, 44, 44, 44, 366, 49, 46, 366, 44, 44,
+ 44, 221, 49, 46, 366, 366, 366, 366, 366, 49,
+ 44, 44, 44, 366, 366, 46, 49, 224, 366, 366,
+ 366, 366, 366, 49, 225, 45, 45, 45, 45, 366,
+ 49, 366, 366, 45, 45, 45, 45, 226, 227, 44,
+ 44, 44, 49, 366, 230, 366, 228, 45, 45, 45,
+ 45, 45, 45, 366, 366, 229, 44, 44, 44, 366,
+ 366, 231, 44, 44, 44, 366, 366, 232, 44, 44,
+ 44, 49, 366, 46, 44, 44, 44, 366, 233, 46,
+
+ 44, 44, 44, 366, 366, 46, 366, 366, 49, 366,
+ 44, 44, 44, 366, 49, 46, 44, 44, 44, 366,
+ 49, 46, 44, 44, 44, 366, 49, 46, 44, 44,
+ 44, 366, 49, 239, 44, 44, 44, 366, 366, 46,
+ 366, 366, 49, 366, 234, 366, 366, 366, 49, 236,
+ 235, 44, 44, 44, 49, 366, 46, 44, 44, 44,
+ 49, 366, 46, 44, 44, 44, 49, 366, 46, 44,
+ 44, 44, 238, 237, 46, 44, 44, 44, 366, 366,
+ 46, 366, 366, 49, 366, 366, 240, 366, 366, 49,
+ 241, 44, 44, 44, 366, 49, 46, 44, 44, 44,
+
+ 242, 49, 46, 44, 44, 44, 366, 49, 46, 44,
+ 44, 44, 366, 366, 46, 243, 366, 366, 366, 366,
+ 366, 244, 366, 49, 366, 245, 366, 366, 246, 49,
+ 366, 366, 247, 366, 366, 49, 366, 44, 44, 44,
+ 366, 49, 46, 366, 249, 44, 44, 44, 366, 250,
+ 46, 44, 44, 44, 366, 366, 46, 366, 366, 44,
+ 44, 44, 366, 366, 46, 366, 366, 366, 366, 49,
+ 44, 44, 44, 366, 366, 46, 366, 49, 366, 44,
+ 44, 44, 366, 49, 46, 366, 251, 44, 44, 44,
+ 366, 49, 46, 366, 366, 366, 253, 252, 254, 44,
+
+ 44, 44, 49, 366, 46, 366, 366, 44, 44, 44,
+ 366, 49, 46, 366, 366, 255, 44, 44, 44, 49,
+ 366, 260, 44, 44, 44, 366, 366, 261, 44, 44,
+ 44, 49, 366, 46, 366, 256, 366, 258, 257, 49,
+ 44, 44, 44, 366, 366, 46, 259, 366, 49, 366,
+ 44, 44, 44, 366, 49, 266, 262, 44, 44, 44,
+ 49, 366, 46, 44, 44, 44, 366, 265, 46, 44,
+ 44, 44, 49, 366, 46, 366, 44, 44, 44, 366,
+ 263, 46, 49, 44, 44, 44, 366, 366, 270, 49,
+ 366, 366, 264, 366, 366, 49, 366, 44, 44, 44,
+
+ 366, 49, 271, 366, 366, 366, 267, 366, 49, 44,
+ 44, 44, 366, 366, 46, 49, 366, 268, 44, 44,
+ 44, 366, 366, 273, 366, 44, 44, 44, 269, 49,
+ 46, 44, 44, 44, 366, 274, 46, 44, 44, 44,
+ 366, 49, 46, 44, 44, 44, 366, 272, 277, 366,
+ 49, 44, 44, 44, 366, 366, 278, 49, 366, 366,
+ 44, 44, 44, 49, 366, 46, 44, 44, 44, 49,
+ 279, 280, 44, 44, 44, 49, 366, 46, 366, 366,
+ 276, 366, 366, 49, 366, 275, 44, 44, 44, 366,
+ 366, 46, 49, 366, 44, 44, 44, 366, 49, 46,
+
+ 44, 44, 44, 366, 49, 46, 44, 44, 44, 366,
+ 366, 46, 44, 44, 44, 366, 366, 46, 49, 366,
+ 281, 366, 44, 44, 44, 282, 49, 46, 44, 44,
+ 44, 366, 49, 46, 44, 44, 44, 366, 49, 46,
+ 366, 366, 287, 366, 49, 366, 366, 284, 366, 366,
+ 283, 366, 285, 286, 49, 366, 366, 366, 366, 288,
+ 49, 289, 366, 290, 366, 366, 49, 44, 44, 44,
+ 366, 366, 46, 44, 44, 44, 366, 366, 46, 44,
+ 44, 44, 366, 366, 46, 291, 44, 44, 44, 366,
+ 366, 46, 44, 44, 44, 366, 366, 46, 366, 49,
+
+ 366, 366, 44, 44, 44, 49, 292, 297, 366, 293,
+ 366, 49, 44, 44, 44, 366, 366, 46, 49, 366,
+ 44, 44, 44, 366, 49, 46, 366, 44, 44, 44,
+ 294, 366, 46, 366, 49, 295, 44, 44, 44, 366,
+ 366, 46, 296, 366, 49, 366, 366, 298, 44, 44,
+ 44, 366, 49, 46, 366, 44, 44, 44, 366, 49,
+ 46, 44, 44, 44, 366, 303, 46, 366, 49, 44,
+ 44, 44, 366, 366, 46, 301, 299, 300, 366, 366,
+ 49, 366, 366, 44, 44, 44, 366, 49, 46, 44,
+ 44, 44, 366, 49, 46, 366, 366, 44, 44, 44,
+
+ 302, 49, 46, 44, 44, 44, 366, 366, 46, 44,
+ 44, 44, 366, 304, 46, 49, 366, 305, 44, 44,
+ 44, 49, 366, 46, 366, 44, 44, 44, 306, 49,
+ 46, 366, 366, 366, 366, 49, 308, 366, 366, 307,
+ 366, 49, 366, 44, 44, 44, 366, 366, 46, 366,
+ 49, 44, 44, 44, 366, 309, 46, 49, 366, 366,
+ 310, 314, 366, 366, 311, 44, 44, 44, 366, 366,
+ 46, 44, 44, 44, 312, 49, 46, 44, 44, 44,
+ 366, 366, 46, 49, 366, 44, 44, 44, 313, 366,
+ 46, 44, 44, 44, 366, 366, 319, 49, 366, 366,
+
+ 44, 44, 44, 49, 315, 46, 366, 366, 316, 49,
+ 44, 44, 44, 366, 366, 46, 317, 49, 366, 44,
+ 44, 44, 318, 49, 46, 44, 44, 44, 366, 366,
+ 323, 366, 49, 366, 366, 320, 44, 44, 44, 366,
+ 366, 46, 49, 366, 44, 44, 44, 366, 366, 46,
+ 366, 49, 366, 44, 44, 44, 366, 49, 326, 366,
+ 321, 366, 322, 366, 44, 44, 44, 366, 49, 46,
+ 366, 366, 44, 44, 44, 324, 49, 46, 366, 44,
+ 44, 44, 366, 325, 46, 49, 44, 44, 44, 366,
+ 366, 330, 44, 44, 44, 366, 49, 46, 44, 44,
+
+ 44, 327, 366, 46, 49, 44, 44, 44, 366, 366,
+ 46, 49, 44, 44, 44, 366, 366, 46, 49, 366,
+ 366, 329, 366, 366, 49, 366, 366, 328, 366, 366,
+ 49, 366, 366, 44, 44, 44, 331, 49, 335, 366,
+ 44, 44, 44, 366, 49, 336, 366, 366, 332, 44,
+ 44, 44, 366, 366, 46, 366, 44, 44, 44, 333,
+ 334, 46, 44, 44, 44, 49, 366, 46, 44, 44,
+ 44, 366, 49, 46, 44, 44, 44, 366, 366, 46,
+ 366, 49, 44, 44, 44, 366, 366, 46, 49, 366,
+ 366, 337, 366, 366, 49, 366, 366, 339, 366, 366,
+
+ 49, 366, 366, 366, 366, 366, 49, 340, 338, 366,
+ 44, 44, 44, 366, 49, 46, 366, 341, 44, 44,
+ 44, 342, 366, 46, 44, 44, 44, 366, 366, 345,
+ 44, 44, 44, 366, 366, 46, 44, 44, 44, 366,
+ 366, 46, 49, 44, 44, 44, 366, 366, 46, 366,
+ 49, 366, 366, 344, 366, 366, 49, 343, 44, 44,
+ 44, 366, 49, 46, 44, 44, 44, 366, 49, 46,
+ 366, 44, 44, 44, 366, 49, 46, 346, 44, 44,
+ 44, 366, 348, 46, 44, 44, 44, 366, 347, 353,
+ 49, 366, 44, 44, 44, 366, 49, 46, 366, 44,
+
+ 44, 44, 366, 49, 46, 366, 366, 366, 349, 366,
+ 49, 366, 44, 44, 44, 350, 49, 356, 351, 352,
+ 44, 44, 44, 366, 49, 46, 366, 44, 44, 44,
+ 366, 49, 46, 44, 44, 44, 366, 366, 359, 366,
+ 44, 44, 44, 354, 49, 360, 44, 44, 44, 366,
+ 355, 46, 49, 366, 366, 44, 44, 44, 366, 49,
+ 46, 357, 44, 44, 44, 49, 358, 46, 44, 44,
+ 44, 366, 49, 364, 366, 44, 44, 44, 49, 366,
+ 365, 366, 366, 366, 366, 361, 366, 49, 366, 366,
+ 366, 366, 366, 366, 49, 366, 366, 366, 366, 366,
+
+ 49, 366, 366, 366, 366, 366, 362, 49, 366, 366,
+ 366, 366, 366, 363, 36, 36, 36, 36, 36, 36,
+ 36, 45, 45, 45, 45, 45, 45, 45, 63, 366,
+ 63, 63, 63, 63, 63, 82, 366, 82, 366, 82,
+ 82, 82, 84, 84, 84, 84, 84, 84, 84, 89,
+ 89, 89, 89, 89, 89, 89, 115, 366, 115, 115,
+ 115, 115, 115, 84, 84, 366, 84, 127, 127, 127,
+ 127, 127, 162, 162, 193, 193, 223, 223, 84, 84,
+ 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
} ;
-static const flex_int16_t yy_chk[2144] =
+static const flex_int16_t yy_chk[2542] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -1116,231 +1173,275 @@ static const flex_int16_t yy_chk[2144] =
5, 5, 5, 5, 10, 13, 26, 13, 5, 5,
9, 5, 21, 37, 5, 37, 5, 21, 5, 27,
- 26, 31, 44, 208, 5, 5, 7, 10, 5, 28,
+ 26, 31, 44, 222, 5, 5, 7, 10, 5, 28,
8, 42, 5, 42, 32, 31, 17, 5, 17, 17,
17, 17, 27, 5, 5, 15, 15, 15, 17, 44,
15, 19, 28, 19, 19, 19, 19, 32, 20, 20,
- 20, 20, 82, 19, 17, 33, 72, 25, 20, 25,
- 15, 15, 25, 25, 25, 25, 181, 15, 153, 19,
- 122, 117, 15, 15, 20, 15, 72, 15, 33, 82,
- 15, 15, 15, 15, 15, 87, 15, 22, 15, 22,
- 22, 22, 22, 45, 45, 45, 84, 74, 45, 22,
- 47, 47, 47, 73, 75, 47, 48, 48, 48, 49,
-
- 113, 48, 77, 80, 76, 22, 49, 50, 50, 50,
- 74, 112, 50, 73, 75, 45, 113, 111, 51, 51,
- 51, 116, 47, 51, 76, 77, 49, 147, 48, 115,
- 49, 112, 51, 79, 49, 48, 114, 116, 47, 50,
- 111, 49, 50, 147, 49, 43, 49, 49, 150, 115,
- 51, 52, 52, 52, 41, 50, 52, 51, 39, 114,
- 51, 53, 53, 53, 150, 38, 53, 54, 54, 54,
- 24, 14, 54, 55, 55, 55, 11, 0, 55, 56,
- 56, 56, 0, 52, 56, 57, 57, 57, 0, 0,
- 57, 0, 0, 53, 0, 0, 52, 0, 0, 54,
-
- 0, 58, 58, 58, 0, 55, 58, 0, 55, 53,
- 54, 56, 0, 53, 56, 54, 0, 57, 59, 59,
- 59, 55, 0, 59, 60, 60, 60, 0, 0, 60,
- 88, 88, 88, 58, 0, 88, 58, 0, 57, 62,
- 62, 62, 62, 0, 0, 0, 64, 0, 64, 62,
- 59, 64, 64, 64, 64, 0, 60, 59, 70, 70,
- 70, 70, 88, 0, 0, 62, 59, 0, 0, 0,
- 59, 60, 0, 0, 63, 60, 63, 63, 63, 63,
- 65, 0, 65, 65, 65, 65, 63, 66, 66, 66,
- 66, 0, 65, 71, 71, 71, 71, 66, 85, 85,
-
- 85, 0, 63, 85, 86, 86, 86, 0, 65, 86,
- 90, 90, 90, 66, 0, 90, 91, 91, 91, 0,
- 0, 91, 92, 92, 92, 0, 0, 92, 0, 0,
- 85, 0, 99, 99, 99, 0, 86, 99, 0, 85,
- 0, 0, 90, 0, 95, 95, 95, 0, 91, 95,
- 0, 0, 0, 0, 92, 0, 86, 89, 89, 89,
- 89, 0, 91, 91, 99, 89, 89, 89, 89, 93,
- 93, 93, 0, 99, 93, 0, 95, 0, 0, 89,
- 89, 89, 89, 89, 89, 94, 94, 94, 0, 0,
- 94, 96, 96, 96, 0, 0, 96, 95, 97, 97,
-
- 97, 93, 0, 97, 0, 93, 98, 98, 98, 0,
- 0, 98, 0, 100, 100, 100, 0, 94, 100, 101,
- 101, 101, 94, 96, 101, 0, 102, 102, 102, 0,
- 97, 102, 103, 103, 103, 0, 0, 103, 98, 96,
- 0, 0, 98, 0, 0, 100, 0, 104, 104, 104,
- 97, 101, 104, 0, 105, 105, 105, 101, 102, 105,
- 100, 106, 106, 106, 103, 0, 106, 0, 100, 107,
- 107, 107, 102, 0, 107, 0, 0, 0, 0, 104,
- 108, 108, 108, 0, 103, 108, 105, 109, 109, 109,
- 0, 0, 109, 106, 0, 0, 0, 104, 106, 0,
-
- 0, 107, 0, 0, 120, 120, 120, 107, 105, 120,
- 0, 0, 108, 0, 0, 121, 121, 121, 0, 109,
- 121, 0, 0, 108, 0, 0, 109, 126, 126, 126,
- 0, 0, 126, 127, 127, 127, 120, 0, 127, 129,
- 129, 129, 0, 0, 129, 120, 0, 121, 0, 0,
- 0, 0, 121, 124, 124, 124, 124, 0, 0, 126,
- 0, 124, 124, 124, 124, 127, 0, 130, 130, 130,
- 0, 129, 130, 126, 0, 124, 124, 124, 124, 124,
- 124, 131, 131, 131, 0, 127, 131, 0, 0, 132,
- 132, 132, 129, 0, 132, 133, 133, 133, 0, 130,
-
- 133, 0, 134, 134, 134, 0, 0, 134, 0, 135,
- 135, 135, 0, 131, 135, 0, 130, 137, 137, 137,
- 0, 132, 137, 136, 136, 136, 0, 133, 136, 0,
- 0, 0, 131, 132, 134, 138, 138, 138, 0, 0,
- 138, 135, 0, 0, 133, 0, 139, 139, 139, 137,
- 135, 139, 134, 0, 0, 136, 0, 0, 136, 140,
- 140, 140, 0, 0, 140, 0, 0, 138, 137, 0,
- 0, 137, 0, 0, 138, 141, 141, 141, 139, 0,
- 141, 142, 142, 142, 0, 139, 142, 143, 143, 143,
- 0, 140, 143, 144, 144, 144, 0, 0, 144, 0,
-
- 145, 145, 145, 0, 0, 145, 0, 141, 140, 0,
- 141, 0, 0, 142, 0, 0, 146, 146, 146, 143,
- 142, 146, 155, 155, 155, 144, 0, 155, 156, 156,
- 156, 143, 145, 156, 0, 158, 158, 158, 0, 0,
- 158, 144, 0, 0, 0, 0, 0, 0, 146, 0,
- 0, 160, 160, 160, 155, 145, 160, 159, 159, 159,
- 156, 0, 159, 0, 0, 155, 146, 158, 0, 0,
- 0, 0, 0, 0, 158, 0, 156, 157, 157, 157,
- 157, 0, 0, 160, 0, 157, 157, 157, 157, 159,
- 0, 0, 160, 161, 161, 161, 0, 0, 161, 157,
-
- 157, 157, 157, 157, 157, 0, 0, 159, 161, 161,
- 162, 162, 162, 0, 0, 162, 163, 163, 163, 0,
- 0, 163, 164, 164, 164, 161, 0, 164, 165, 165,
- 165, 0, 0, 165, 166, 166, 166, 0, 0, 166,
- 0, 0, 162, 0, 167, 167, 167, 0, 163, 167,
- 0, 0, 162, 0, 164, 0, 168, 168, 168, 0,
- 165, 168, 0, 165, 0, 0, 166, 163, 0, 169,
- 169, 169, 0, 166, 169, 0, 167, 170, 170, 170,
- 0, 0, 170, 0, 0, 167, 0, 0, 168, 171,
- 171, 171, 0, 0, 171, 172, 172, 172, 0, 168,
-
- 172, 169, 0, 0, 0, 173, 173, 173, 169, 170,
- 173, 174, 174, 174, 0, 0, 174, 0, 175, 175,
- 175, 171, 170, 175, 176, 176, 176, 172, 0, 176,
- 177, 177, 177, 0, 0, 177, 0, 173, 0, 178,
- 178, 178, 0, 174, 178, 0, 0, 0, 172, 178,
- 175, 173, 0, 183, 183, 183, 176, 175, 183, 0,
- 0, 174, 177, 184, 184, 184, 0, 0, 184, 0,
- 0, 178, 0, 188, 188, 188, 0, 176, 188, 0,
- 0, 0, 0, 0, 0, 183, 0, 0, 0, 0,
- 0, 0, 186, 186, 186, 184, 0, 186, 0, 0,
-
- 183, 0, 0, 0, 0, 188, 0, 0, 0, 0,
- 184, 185, 185, 185, 185, 0, 0, 0, 188, 185,
- 185, 185, 185, 0, 186, 187, 187, 187, 0, 0,
- 187, 0, 0, 185, 185, 185, 185, 185, 185, 186,
- 189, 189, 189, 0, 0, 189, 190, 190, 190, 0,
- 0, 190, 0, 191, 191, 191, 0, 187, 191, 192,
- 192, 192, 0, 0, 192, 194, 194, 194, 0, 192,
- 194, 0, 189, 187, 195, 195, 195, 0, 190, 195,
- 0, 196, 196, 196, 0, 191, 196, 197, 197, 197,
- 0, 192, 197, 198, 198, 198, 0, 194, 198, 199,
-
- 199, 199, 0, 0, 199, 0, 195, 201, 201, 201,
- 0, 0, 201, 196, 0, 194, 202, 202, 202, 197,
- 196, 202, 0, 0, 195, 198, 0, 0, 203, 203,
- 203, 199, 0, 203, 0, 204, 204, 204, 0, 201,
- 204, 0, 0, 198, 197, 205, 205, 205, 202, 0,
- 205, 207, 207, 207, 0, 202, 207, 0, 0, 201,
- 203, 210, 210, 210, 0, 0, 210, 204, 211, 211,
- 211, 203, 0, 211, 212, 212, 212, 205, 0, 212,
- 213, 213, 213, 207, 0, 213, 0, 204, 207, 214,
- 214, 214, 0, 210, 214, 0, 0, 205, 0, 0,
-
- 211, 0, 210, 0, 0, 0, 212, 0, 211, 218,
- 218, 218, 213, 0, 218, 219, 219, 219, 0, 0,
- 219, 214, 0, 0, 0, 213, 212, 0, 214, 220,
- 220, 220, 0, 0, 220, 221, 221, 221, 0, 0,
- 221, 218, 0, 222, 222, 222, 0, 219, 222, 0,
- 0, 223, 223, 223, 218, 0, 223, 225, 225, 225,
- 0, 220, 225, 226, 226, 226, 0, 221, 226, 0,
- 0, 219, 0, 221, 0, 222, 227, 227, 227, 0,
- 220, 227, 222, 223, 0, 229, 229, 229, 0, 225,
- 229, 225, 228, 228, 228, 226, 0, 228, 230, 230,
-
- 230, 0, 228, 230, 232, 232, 232, 0, 227, 232,
- 0, 233, 233, 233, 0, 226, 233, 229, 234, 234,
- 234, 0, 0, 234, 228, 0, 0, 0, 227, 0,
- 230, 0, 235, 235, 235, 0, 232, 235, 0, 236,
- 236, 236, 235, 233, 236, 0, 230, 237, 237, 237,
- 234, 0, 237, 238, 238, 238, 0, 0, 238, 0,
- 239, 239, 239, 0, 235, 239, 0, 240, 240, 240,
- 0, 236, 240, 241, 241, 241, 0, 240, 241, 237,
- 0, 244, 244, 244, 0, 238, 244, 0, 0, 0,
- 237, 0, 239, 236, 0, 245, 245, 245, 0, 240,
-
- 245, 246, 246, 246, 0, 241, 246, 247, 247, 247,
- 0, 0, 247, 244, 249, 249, 249, 0, 0, 249,
- 253, 253, 253, 0, 0, 253, 0, 245, 0, 244,
- 254, 254, 254, 246, 245, 254, 255, 255, 255, 247,
- 0, 255, 258, 258, 258, 0, 249, 258, 260, 260,
- 260, 0, 253, 260, 247, 0, 0, 246, 0, 247,
- 247, 249, 254, 0, 0, 0, 0, 0, 255, 254,
- 0, 253, 255, 0, 258, 0, 261, 261, 261, 0,
- 260, 261, 262, 262, 262, 0, 0, 262, 0, 263,
- 263, 263, 0, 258, 263, 0, 0, 260, 264, 264,
-
- 264, 0, 0, 264, 0, 265, 265, 265, 261, 0,
- 265, 266, 266, 266, 262, 0, 266, 267, 267, 267,
- 0, 263, 267, 0, 263, 0, 261, 268, 268, 268,
- 264, 0, 268, 0, 269, 269, 269, 265, 0, 269,
- 0, 0, 0, 266, 0, 0, 270, 270, 270, 267,
- 0, 270, 0, 0, 264, 265, 271, 271, 271, 268,
- 0, 271, 0, 266, 0, 267, 269, 0, 272, 272,
- 272, 0, 268, 272, 274, 274, 274, 0, 270, 274,
- 0, 275, 275, 275, 269, 270, 275, 0, 271, 276,
- 276, 276, 0, 0, 276, 0, 277, 277, 277, 0,
-
- 272, 277, 0, 0, 0, 0, 274, 0, 271, 278,
- 278, 278, 0, 275, 278, 0, 0, 0, 0, 272,
- 274, 276, 279, 279, 279, 0, 0, 279, 277, 0,
- 275, 280, 280, 280, 276, 277, 280, 281, 281, 281,
- 0, 278, 281, 282, 282, 282, 278, 0, 282, 0,
- 283, 283, 283, 0, 279, 283, 284, 284, 284, 0,
- 0, 284, 0, 280, 0, 0, 280, 0, 0, 281,
- 0, 285, 285, 285, 0, 282, 285, 0, 0, 286,
- 286, 286, 283, 0, 286, 0, 282, 281, 284, 287,
- 287, 287, 0, 0, 287, 284, 288, 288, 288, 0,
-
- 0, 288, 0, 285, 290, 290, 290, 0, 0, 290,
- 285, 286, 0, 291, 291, 291, 0, 0, 291, 0,
- 0, 287, 0, 0, 292, 292, 292, 0, 288, 292,
- 294, 294, 294, 0, 0, 294, 290, 295, 295, 295,
- 288, 0, 295, 0, 287, 291, 297, 297, 297, 0,
- 0, 297, 0, 0, 290, 0, 292, 0, 298, 298,
- 298, 0, 294, 298, 0, 0, 0, 291, 0, 295,
- 0, 0, 292, 0, 299, 299, 299, 0, 297, 299,
- 300, 300, 300, 0, 0, 300, 301, 301, 301, 0,
- 298, 301, 0, 0, 304, 304, 304, 298, 297, 304,
-
- 305, 305, 305, 0, 0, 305, 299, 0, 306, 306,
- 306, 0, 300, 306, 0, 0, 0, 299, 301, 300,
- 0, 0, 307, 307, 307, 0, 304, 307, 0, 308,
- 308, 308, 305, 301, 308, 0, 310, 310, 310, 0,
- 306, 310, 0, 311, 311, 311, 0, 306, 311, 0,
- 0, 0, 305, 0, 307, 312, 312, 312, 0, 0,
- 312, 308, 0, 0, 313, 313, 313, 0, 310, 313,
- 0, 0, 307, 0, 0, 311, 315, 315, 315, 0,
- 308, 315, 0, 316, 316, 316, 0, 312, 316, 0,
- 0, 0, 0, 0, 311, 0, 313, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 312, 0, 315, 0,
- 0, 0, 0, 0, 0, 316, 321, 321, 321, 321,
- 321, 321, 321, 322, 322, 322, 322, 322, 322, 322,
- 323, 0, 323, 323, 323, 323, 323, 324, 0, 324,
- 0, 324, 324, 324, 325, 325, 325, 325, 325, 325,
- 325, 326, 326, 326, 326, 326, 326, 326, 327, 0,
- 327, 327, 327, 327, 327, 328, 328, 0, 328, 329,
- 329, 329, 329, 329, 330, 330, 331, 331, 332, 332,
- 333, 333, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
-
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320
+ 20, 20, 192, 19, 17, 33, 74, 25, 20, 25,
+ 15, 15, 25, 25, 25, 25, 161, 15, 76, 19,
+ 127, 15, 15, 15, 20, 15, 74, 15, 33, 75,
+ 15, 15, 15, 15, 15, 122, 15, 77, 15, 15,
+ 22, 76, 22, 22, 22, 22, 45, 45, 45, 75,
+ 79, 45, 22, 47, 47, 47, 78, 77, 47, 48,
+
+ 48, 48, 49, 84, 48, 116, 117, 118, 22, 49,
+ 50, 50, 50, 79, 89, 50, 78, 119, 45, 51,
+ 51, 51, 86, 118, 51, 47, 117, 121, 116, 49,
+ 84, 48, 120, 49, 52, 52, 52, 49, 48, 52,
+ 119, 47, 50, 121, 49, 155, 158, 49, 52, 49,
+ 49, 51, 120, 82, 51, 53, 53, 53, 50, 81,
+ 53, 155, 158, 54, 54, 54, 52, 51, 54, 55,
+ 55, 55, 43, 52, 55, 41, 52, 39, 56, 56,
+ 56, 38, 24, 56, 57, 57, 57, 53, 14, 57,
+ 11, 58, 58, 58, 0, 54, 58, 59, 59, 59,
+
+ 53, 55, 59, 60, 60, 60, 0, 0, 60, 0,
+ 56, 54, 55, 56, 0, 54, 57, 55, 0, 57,
+ 61, 61, 61, 58, 0, 61, 56, 0, 0, 59,
+ 0, 0, 59, 0, 0, 60, 0, 0, 62, 62,
+ 62, 0, 60, 62, 58, 72, 72, 72, 72, 0,
+ 0, 60, 61, 0, 0, 60, 60, 0, 64, 64,
+ 64, 64, 73, 73, 73, 73, 0, 61, 64, 0,
+ 62, 61, 0, 62, 65, 0, 65, 65, 65, 65,
+ 0, 0, 0, 66, 64, 66, 65, 0, 66, 66,
+ 66, 66, 67, 0, 67, 67, 67, 67, 68, 68,
+
+ 68, 68, 65, 0, 67, 87, 87, 87, 68, 0,
+ 87, 88, 88, 88, 0, 0, 88, 90, 90, 90,
+ 67, 0, 90, 0, 68, 0, 0, 0, 92, 92,
+ 92, 0, 0, 92, 0, 0, 0, 87, 0, 93,
+ 93, 93, 0, 88, 93, 0, 87, 0, 0, 90,
+ 94, 94, 94, 0, 0, 94, 0, 0, 0, 0,
+ 92, 0, 0, 88, 91, 91, 91, 91, 0, 0,
+ 0, 93, 91, 91, 91, 91, 92, 0, 95, 95,
+ 95, 0, 94, 95, 0, 0, 91, 91, 91, 91,
+ 91, 91, 0, 96, 96, 96, 94, 94, 96, 97,
+
+ 97, 97, 0, 0, 97, 0, 98, 98, 98, 0,
+ 95, 98, 99, 99, 99, 0, 0, 99, 100, 100,
+ 100, 0, 0, 100, 0, 96, 0, 0, 0, 96,
+ 0, 97, 101, 101, 101, 0, 97, 101, 98, 0,
+ 102, 102, 102, 0, 99, 102, 103, 103, 103, 0,
+ 100, 103, 104, 104, 104, 0, 0, 104, 0, 98,
+ 99, 0, 0, 0, 101, 0, 0, 0, 101, 0,
+ 100, 0, 102, 0, 105, 105, 105, 0, 103, 105,
+ 0, 102, 0, 0, 104, 0, 106, 106, 106, 0,
+ 104, 106, 0, 103, 107, 107, 107, 0, 0, 107,
+
+ 0, 103, 108, 108, 108, 0, 105, 108, 109, 109,
+ 109, 0, 0, 109, 110, 110, 110, 0, 106, 110,
+ 105, 0, 111, 111, 111, 0, 107, 111, 112, 112,
+ 112, 0, 0, 112, 108, 0, 0, 0, 106, 0,
+ 109, 0, 0, 0, 107, 109, 110, 0, 113, 113,
+ 113, 0, 110, 113, 111, 0, 108, 0, 111, 0,
+ 112, 114, 114, 114, 0, 0, 114, 125, 125, 125,
+ 0, 112, 125, 126, 126, 126, 0, 0, 126, 0,
+ 113, 0, 0, 132, 132, 132, 0, 113, 132, 0,
+ 0, 0, 0, 114, 0, 130, 130, 130, 0, 125,
+
+ 130, 0, 0, 0, 0, 126, 114, 0, 125, 0,
+ 126, 129, 129, 129, 129, 132, 0, 0, 0, 129,
+ 129, 129, 129, 133, 133, 133, 0, 130, 133, 132,
+ 0, 0, 0, 129, 129, 129, 129, 129, 129, 135,
+ 135, 135, 0, 0, 135, 0, 0, 130, 136, 136,
+ 136, 0, 0, 136, 0, 133, 137, 137, 137, 0,
+ 0, 137, 138, 138, 138, 0, 0, 138, 139, 139,
+ 139, 135, 0, 139, 0, 133, 140, 140, 140, 0,
+ 136, 140, 141, 141, 141, 0, 0, 141, 137, 0,
+ 0, 0, 135, 0, 138, 0, 0, 136, 0, 0,
+
+ 139, 0, 0, 0, 0, 0, 138, 137, 140, 0,
+ 142, 142, 142, 0, 141, 142, 0, 139, 0, 143,
+ 143, 143, 0, 141, 143, 0, 140, 144, 144, 144,
+ 0, 0, 144, 145, 145, 145, 0, 0, 145, 146,
+ 146, 146, 142, 0, 146, 142, 0, 147, 147, 147,
+ 0, 143, 147, 148, 148, 148, 0, 0, 148, 144,
+ 0, 0, 149, 149, 149, 145, 144, 149, 0, 0,
+ 143, 146, 145, 143, 0, 150, 150, 150, 0, 147,
+ 150, 0, 147, 0, 0, 148, 0, 0, 146, 0,
+ 0, 0, 148, 0, 149, 151, 151, 151, 0, 0,
+
+ 151, 0, 0, 152, 152, 152, 149, 150, 152, 153,
+ 153, 153, 0, 0, 153, 0, 0, 154, 154, 154,
+ 0, 0, 154, 150, 163, 163, 163, 151, 0, 163,
+ 0, 164, 164, 164, 0, 152, 164, 166, 166, 166,
+ 0, 153, 166, 169, 169, 169, 151, 166, 169, 154,
+ 0, 0, 0, 0, 0, 0, 163, 0, 152, 153,
+ 154, 0, 0, 164, 0, 0, 0, 163, 0, 166,
+ 0, 0, 0, 0, 0, 169, 0, 0, 0, 164,
+ 165, 165, 165, 165, 169, 0, 0, 0, 165, 165,
+ 165, 165, 167, 167, 167, 0, 0, 167, 0, 0,
+
+ 0, 0, 165, 165, 165, 165, 165, 165, 168, 168,
+ 168, 0, 0, 168, 170, 170, 170, 0, 0, 170,
+ 171, 171, 171, 0, 167, 171, 0, 0, 0, 170,
+ 170, 167, 172, 172, 172, 0, 0, 172, 0, 0,
+ 168, 0, 173, 173, 173, 0, 170, 173, 0, 174,
+ 174, 174, 171, 0, 174, 175, 175, 175, 168, 0,
+ 175, 0, 171, 0, 172, 176, 176, 176, 0, 0,
+ 176, 177, 177, 177, 173, 0, 177, 178, 178, 178,
+ 0, 174, 178, 172, 174, 0, 0, 175, 179, 179,
+ 179, 0, 0, 179, 175, 0, 0, 176, 0, 180,
+
+ 180, 180, 0, 177, 180, 0, 176, 0, 0, 178,
+ 181, 181, 181, 0, 177, 181, 178, 0, 0, 0,
+ 179, 182, 182, 182, 0, 0, 182, 183, 183, 183,
+ 0, 180, 183, 179, 184, 184, 184, 0, 0, 184,
+ 0, 0, 181, 185, 185, 185, 0, 0, 185, 186,
+ 186, 186, 0, 182, 186, 187, 187, 187, 0, 183,
+ 187, 0, 0, 181, 0, 0, 184, 182, 0, 188,
+ 188, 188, 0, 184, 188, 185, 0, 183, 0, 188,
+ 0, 186, 0, 189, 189, 189, 186, 187, 189, 0,
+ 194, 194, 194, 0, 0, 194, 185, 195, 195, 195,
+
+ 0, 188, 195, 0, 197, 197, 197, 0, 0, 197,
+ 0, 198, 198, 198, 0, 189, 198, 0, 199, 199,
+ 199, 189, 194, 199, 0, 0, 0, 0, 0, 195,
+ 200, 200, 200, 0, 0, 200, 197, 194, 0, 0,
+ 0, 0, 0, 198, 195, 196, 196, 196, 196, 0,
+ 199, 0, 0, 196, 196, 196, 196, 197, 198, 201,
+ 201, 201, 200, 0, 201, 0, 199, 196, 196, 196,
+ 196, 196, 196, 0, 0, 200, 202, 202, 202, 0,
+ 0, 202, 203, 203, 203, 0, 0, 203, 204, 204,
+ 204, 201, 0, 204, 206, 206, 206, 0, 204, 206,
+
+ 207, 207, 207, 0, 0, 207, 0, 0, 202, 0,
+ 208, 208, 208, 0, 203, 208, 209, 209, 209, 0,
+ 204, 209, 210, 210, 210, 0, 206, 210, 211, 211,
+ 211, 0, 207, 211, 213, 213, 213, 0, 0, 213,
+ 0, 0, 208, 0, 206, 0, 0, 0, 209, 208,
+ 207, 214, 214, 214, 210, 0, 214, 215, 215, 215,
+ 211, 0, 215, 216, 216, 216, 213, 0, 216, 217,
+ 217, 217, 210, 209, 217, 218, 218, 218, 0, 0,
+ 218, 0, 0, 214, 0, 0, 213, 0, 0, 215,
+ 214, 220, 220, 220, 0, 216, 220, 221, 221, 221,
+
+ 215, 217, 221, 224, 224, 224, 0, 218, 224, 225,
+ 225, 225, 0, 0, 225, 216, 0, 0, 0, 0,
+ 0, 217, 0, 220, 0, 218, 0, 0, 220, 221,
+ 0, 0, 221, 0, 0, 224, 0, 226, 226, 226,
+ 0, 225, 226, 0, 224, 227, 227, 227, 0, 225,
+ 227, 228, 228, 228, 0, 0, 228, 0, 0, 229,
+ 229, 229, 0, 0, 229, 0, 0, 0, 0, 226,
+ 233, 233, 233, 0, 0, 233, 0, 227, 0, 234,
+ 234, 234, 0, 228, 234, 0, 226, 235, 235, 235,
+ 0, 229, 235, 0, 0, 0, 228, 227, 229, 236,
+
+ 236, 236, 233, 0, 236, 0, 0, 237, 237, 237,
+ 0, 234, 237, 0, 0, 233, 238, 238, 238, 235,
+ 0, 238, 240, 240, 240, 0, 0, 240, 241, 241,
+ 241, 236, 0, 241, 0, 234, 0, 236, 235, 237,
+ 242, 242, 242, 0, 0, 242, 237, 0, 238, 0,
+ 244, 244, 244, 0, 240, 244, 240, 243, 243, 243,
+ 241, 0, 243, 245, 245, 245, 0, 243, 245, 246,
+ 246, 246, 242, 0, 246, 0, 247, 247, 247, 0,
+ 241, 247, 244, 249, 249, 249, 0, 0, 249, 243,
+ 0, 0, 242, 0, 0, 245, 0, 250, 250, 250,
+
+ 0, 246, 250, 0, 0, 0, 245, 0, 247, 251,
+ 251, 251, 0, 0, 251, 249, 0, 246, 252, 252,
+ 252, 0, 0, 252, 0, 253, 253, 253, 247, 250,
+ 253, 254, 254, 254, 0, 253, 254, 255, 255, 255,
+ 0, 251, 255, 256, 256, 256, 0, 251, 256, 0,
+ 252, 257, 257, 257, 0, 0, 257, 253, 0, 0,
+ 258, 258, 258, 254, 0, 258, 259, 259, 259, 255,
+ 258, 259, 262, 262, 262, 256, 0, 262, 0, 0,
+ 255, 0, 0, 257, 0, 254, 263, 263, 263, 0,
+ 0, 263, 258, 0, 264, 264, 264, 0, 259, 264,
+
+ 265, 265, 265, 0, 262, 265, 267, 267, 267, 0,
+ 0, 267, 268, 268, 268, 0, 0, 268, 263, 0,
+ 262, 0, 269, 269, 269, 263, 264, 269, 272, 272,
+ 272, 0, 265, 272, 274, 274, 274, 0, 267, 274,
+ 0, 0, 267, 0, 268, 0, 0, 265, 0, 0,
+ 264, 0, 265, 265, 269, 0, 0, 0, 0, 268,
+ 272, 269, 0, 272, 0, 0, 274, 275, 275, 275,
+ 0, 0, 275, 276, 276, 276, 0, 0, 276, 279,
+ 279, 279, 0, 0, 279, 274, 281, 281, 281, 0,
+ 0, 281, 282, 282, 282, 0, 0, 282, 0, 275,
+
+ 0, 0, 283, 283, 283, 276, 275, 283, 0, 276,
+ 0, 279, 284, 284, 284, 0, 0, 284, 281, 0,
+ 285, 285, 285, 0, 282, 285, 0, 286, 286, 286,
+ 279, 0, 286, 0, 283, 281, 287, 287, 287, 0,
+ 0, 287, 282, 0, 284, 0, 0, 284, 288, 288,
+ 288, 0, 285, 288, 0, 289, 289, 289, 0, 286,
+ 289, 290, 290, 290, 0, 289, 290, 0, 287, 291,
+ 291, 291, 0, 0, 291, 287, 285, 286, 0, 0,
+ 288, 0, 0, 292, 292, 292, 0, 289, 292, 293,
+ 293, 293, 0, 290, 293, 0, 0, 294, 294, 294,
+
+ 288, 291, 294, 295, 295, 295, 0, 0, 295, 296,
+ 296, 296, 0, 290, 296, 292, 0, 291, 298, 298,
+ 298, 293, 0, 298, 0, 299, 299, 299, 292, 294,
+ 299, 0, 0, 0, 0, 295, 294, 0, 0, 293,
+ 0, 296, 0, 300, 300, 300, 0, 0, 300, 0,
+ 298, 301, 301, 301, 0, 295, 301, 299, 0, 0,
+ 296, 301, 0, 0, 298, 302, 302, 302, 0, 0,
+ 302, 303, 303, 303, 299, 300, 303, 304, 304, 304,
+ 0, 0, 304, 301, 0, 305, 305, 305, 300, 0,
+ 305, 306, 306, 306, 0, 0, 306, 302, 0, 0,
+
+ 307, 307, 307, 303, 302, 307, 0, 0, 303, 304,
+ 308, 308, 308, 0, 0, 308, 304, 305, 0, 309,
+ 309, 309, 305, 306, 309, 310, 310, 310, 0, 0,
+ 310, 0, 307, 0, 0, 307, 311, 311, 311, 0,
+ 0, 311, 308, 0, 312, 312, 312, 0, 0, 312,
+ 0, 309, 0, 313, 313, 313, 0, 310, 313, 0,
+ 308, 0, 309, 0, 314, 314, 314, 0, 311, 314,
+ 0, 0, 315, 315, 315, 311, 312, 315, 0, 316,
+ 316, 316, 0, 312, 316, 313, 317, 317, 317, 0,
+ 0, 317, 318, 318, 318, 0, 314, 318, 320, 320,
+
+ 320, 314, 0, 320, 315, 321, 321, 321, 0, 0,
+ 321, 316, 322, 322, 322, 0, 0, 322, 317, 0,
+ 0, 316, 0, 0, 318, 0, 0, 315, 0, 0,
+ 320, 0, 0, 324, 324, 324, 318, 321, 324, 0,
+ 325, 325, 325, 0, 322, 325, 0, 0, 320, 327,
+ 327, 327, 0, 0, 327, 0, 328, 328, 328, 321,
+ 322, 328, 329, 329, 329, 324, 0, 329, 331, 331,
+ 331, 0, 325, 331, 332, 332, 332, 0, 0, 332,
+ 0, 327, 333, 333, 333, 0, 0, 333, 328, 0,
+ 0, 327, 0, 0, 329, 0, 0, 329, 0, 0,
+
+ 331, 0, 0, 0, 0, 0, 332, 331, 328, 0,
+ 334, 334, 334, 0, 333, 334, 0, 332, 337, 337,
+ 337, 333, 0, 337, 338, 338, 338, 0, 0, 338,
+ 339, 339, 339, 0, 0, 339, 340, 340, 340, 0,
+ 0, 340, 334, 341, 341, 341, 0, 0, 341, 0,
+ 337, 0, 0, 337, 0, 0, 338, 334, 342, 342,
+ 342, 0, 339, 342, 343, 343, 343, 0, 340, 343,
+ 0, 344, 344, 344, 0, 341, 344, 339, 346, 346,
+ 346, 0, 341, 346, 347, 347, 347, 0, 340, 347,
+ 342, 0, 348, 348, 348, 0, 343, 348, 0, 349,
+
+ 349, 349, 0, 344, 349, 0, 0, 0, 342, 0,
+ 346, 0, 350, 350, 350, 343, 347, 350, 344, 346,
+ 351, 351, 351, 0, 348, 351, 0, 352, 352, 352,
+ 0, 349, 352, 354, 354, 354, 0, 0, 354, 0,
+ 355, 355, 355, 348, 350, 355, 357, 357, 357, 0,
+ 349, 357, 351, 0, 0, 358, 358, 358, 0, 352,
+ 358, 351, 361, 361, 361, 354, 352, 361, 362, 362,
+ 362, 0, 355, 362, 0, 363, 363, 363, 357, 0,
+ 363, 0, 0, 0, 0, 357, 0, 358, 0, 0,
+ 0, 0, 0, 0, 361, 0, 0, 0, 0, 0,
+
+ 362, 0, 0, 0, 0, 0, 358, 363, 0, 0,
+ 0, 0, 0, 361, 367, 367, 367, 367, 367, 367,
+ 367, 368, 368, 368, 368, 368, 368, 368, 369, 0,
+ 369, 369, 369, 369, 369, 370, 0, 370, 0, 370,
+ 370, 370, 371, 371, 371, 371, 371, 371, 371, 372,
+ 372, 372, 372, 372, 372, 372, 373, 0, 373, 373,
+ 373, 373, 373, 374, 374, 0, 374, 375, 375, 375,
+ 375, 375, 376, 376, 377, 377, 378, 378, 379, 379,
+ 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
} ;
static yy_state_type yy_last_accepting_state;
@@ -1349,14 +1450,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[59] =
+static const flex_int16_t yy_rule_linenum[62] =
{ 0,
133, 135, 137, 142, 143, 148, 149, 150, 162, 165,
- 170, 177, 186, 198, 210, 219, 228, 237, 246, 255,
- 264, 273, 282, 291, 300, 309, 318, 327, 336, 345,
- 354, 363, 372, 381, 390, 399, 408, 417, 426, 435,
- 444, 543, 548, 553, 558, 559, 560, 561, 562, 563,
- 565, 583, 596, 601, 605, 607, 609, 611
+ 170, 177, 186, 198, 210, 220, 230, 240, 249, 258,
+ 267, 276, 285, 294, 303, 312, 321, 330, 339, 348,
+ 357, 366, 375, 384, 393, 402, 411, 420, 429, 438,
+ 447, 456, 465, 474, 573, 578, 583, 588, 589, 590,
+ 591, 592, 593, 595, 613, 626, 631, 635, 637, 639,
+ 641
} ;
/* The intent behind this definition is that it'll catch
@@ -1411,7 +1513,7 @@ using isc::netconf::NetconfParser;
/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::netconf::ParserContext::fatal(msg)
-#line 1414 "netconf_lexer.cc"
+#line 1516 "netconf_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
@@ -1437,8 +1539,8 @@ using isc::netconf::NetconfParser;
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 1440 "netconf_lexer.cc"
-#line 1441 "netconf_lexer.cc"
+#line 1542 "netconf_lexer.cc"
+#line 1543 "netconf_lexer.cc"
#define INITIAL 0
#define COMMENT 1
@@ -1734,9 +1836,9 @@ YY_DECL
/* We currently have 3 points of entries defined:
START_JSON - which expects any valid JSON
- START_NETCONF - which expects full configuration (with outer map and Control-netconf
+ START_NETCONF - which expects full configuration (with outer map and Netconf
object in it.
- START_SUB_NETCONF - which expects only content of the Control-netconf, this is
+ START_SUB_NETCONF - which expects only content of the Netconf, this is
primarily useful for testing. */
if (start_token_flag) {
start_token_flag = false;
@@ -1752,7 +1854,7 @@ YY_DECL
}
-#line 1755 "netconf_lexer.cc"
+#line 1857 "netconf_lexer.cc"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
@@ -1781,13 +1883,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 >= 321 )
+ if ( yy_current_state >= 367 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
++yy_cp;
}
- while ( yy_current_state != 320 );
+ while ( yy_current_state != 366 );
yy_cp = (yy_last_accepting_cpos);
yy_current_state = (yy_last_accepting_state);
@@ -1806,13 +1908,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 < 59 )
+ else if ( yy_act < 62 )
fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
(long)yy_rule_linenum[yy_act], yytext );
- else if ( yy_act == 59 )
+ else if ( yy_act == 62 )
fprintf( stderr, "--accepting default rule (\"%s\")\n",
yytext );
- else if ( yy_act == 60 )
+ else if ( yy_act == 63 )
fprintf( stderr, "--(end of buffer or a NUL)\n" );
else
fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
@@ -1964,15 +2066,54 @@ YY_RULE_SETUP
{
switch(driver.ctx_) {
case ParserContext::NETCONF:
+ case ParserContext::SERVER:
+ return NetconfParser::make_BOOT_UPDATE(driver.loc_);
+ default:
+ return NetconfParser::make_STRING("boot-update", driver.loc_);
+ }
+}
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 220 "netconf_lexer.ll"
+{
+ switch(driver.ctx_) {
+ case ParserContext::NETCONF:
+ case ParserContext::SERVER:
+ return NetconfParser::make_SUBSCRIBE_CHANGES(driver.loc_);
+ default:
+ return NetconfParser::make_STRING("subscribe-changes", driver.loc_);
+ }
+}
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 230 "netconf_lexer.ll"
+{
+ switch(driver.ctx_) {
+ case ParserContext::NETCONF:
+ case ParserContext::SERVER:
+ return NetconfParser::make_VALIDATE_CHANGES(driver.loc_);
+ default:
+ return NetconfParser::make_STRING("validate-changes", driver.loc_);
+ }
+}
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 240 "netconf_lexer.ll"
+{
+ switch(driver.ctx_) {
+ case ParserContext::NETCONF:
return NetconfParser::make_MANAGED_SERVERS(driver.loc_);
default:
return NetconfParser::make_STRING("managed-servers", driver.loc_);
}
}
YY_BREAK
-case 16:
+case 19:
YY_RULE_SETUP
-#line 219 "netconf_lexer.ll"
+#line 249 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::MANAGED_SERVERS:
@@ -1982,9 +2123,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 17:
+case 20:
YY_RULE_SETUP
-#line 228 "netconf_lexer.ll"
+#line 258 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::MANAGED_SERVERS:
@@ -1994,9 +2135,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 18:
+case 21:
YY_RULE_SETUP
-#line 237 "netconf_lexer.ll"
+#line 267 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::MANAGED_SERVERS:
@@ -2006,9 +2147,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 19:
+case 22:
YY_RULE_SETUP
-#line 246 "netconf_lexer.ll"
+#line 276 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::MANAGED_SERVERS:
@@ -2018,9 +2159,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 20:
+case 23:
YY_RULE_SETUP
-#line 255 "netconf_lexer.ll"
+#line 285 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::SERVER:
@@ -2030,9 +2171,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 21:
+case 24:
YY_RULE_SETUP
-#line 264 "netconf_lexer.ll"
+#line 294 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::SERVER:
@@ -2042,9 +2183,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 22:
+case 25:
YY_RULE_SETUP
-#line 273 "netconf_lexer.ll"
+#line 303 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::SOCKET_TYPE:
@@ -2054,9 +2195,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 23:
+case 26:
YY_RULE_SETUP
-#line 282 "netconf_lexer.ll"
+#line 312 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::SOCKET_TYPE:
@@ -2066,9 +2207,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 24:
+case 27:
YY_RULE_SETUP
-#line 291 "netconf_lexer.ll"
+#line 321 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::SOCKET_TYPE:
@@ -2078,9 +2219,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 25:
+case 28:
YY_RULE_SETUP
-#line 300 "netconf_lexer.ll"
+#line 330 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::CONTROL_SOCKET:
@@ -2090,9 +2231,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 26:
+case 29:
YY_RULE_SETUP
-#line 309 "netconf_lexer.ll"
+#line 339 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::CONTROL_SOCKET:
@@ -2102,9 +2243,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 27:
+case 30:
YY_RULE_SETUP
-#line 318 "netconf_lexer.ll"
+#line 348 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::CONTROL_SOCKET:
@@ -2114,9 +2255,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 28:
+case 31:
YY_RULE_SETUP
-#line 327 "netconf_lexer.ll"
+#line 357 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::NETCONF:
@@ -2126,9 +2267,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 29:
+case 32:
YY_RULE_SETUP
-#line 336 "netconf_lexer.ll"
+#line 366 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::HOOKS_LIBRARIES:
@@ -2138,9 +2279,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 30:
+case 33:
YY_RULE_SETUP
-#line 345 "netconf_lexer.ll"
+#line 375 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::HOOKS_LIBRARIES:
@@ -2150,9 +2291,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 31:
+case 34:
YY_RULE_SETUP
-#line 354 "netconf_lexer.ll"
+#line 384 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::CONFIG:
@@ -2162,9 +2303,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 32:
+case 35:
YY_RULE_SETUP
-#line 363 "netconf_lexer.ll"
+#line 393 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::LOGGING:
@@ -2174,9 +2315,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 33:
+case 36:
YY_RULE_SETUP
-#line 372 "netconf_lexer.ll"
+#line 402 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::LOGGERS:
@@ -2186,9 +2327,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 34:
+case 37:
YY_RULE_SETUP
-#line 381 "netconf_lexer.ll"
+#line 411 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::LOGGERS:
@@ -2198,9 +2339,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 35:
+case 38:
YY_RULE_SETUP
-#line 390 "netconf_lexer.ll"
+#line 420 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::OUTPUT_OPTIONS:
@@ -2210,9 +2351,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 36:
+case 39:
YY_RULE_SETUP
-#line 399 "netconf_lexer.ll"
+#line 429 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::OUTPUT_OPTIONS:
@@ -2222,9 +2363,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 37:
+case 40:
YY_RULE_SETUP
-#line 408 "netconf_lexer.ll"
+#line 438 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::OUTPUT_OPTIONS:
@@ -2234,9 +2375,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 38:
+case 41:
YY_RULE_SETUP
-#line 417 "netconf_lexer.ll"
+#line 447 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::OUTPUT_OPTIONS:
@@ -2246,9 +2387,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 39:
+case 42:
YY_RULE_SETUP
-#line 426 "netconf_lexer.ll"
+#line 456 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::LOGGERS:
@@ -2258,9 +2399,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 40:
+case 43:
YY_RULE_SETUP
-#line 435 "netconf_lexer.ll"
+#line 465 "netconf_lexer.ll"
{
switch(driver.ctx_) {
case ParserContext::LOGGERS:
@@ -2270,9 +2411,9 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 41:
+case 44:
YY_RULE_SETUP
-#line 444 "netconf_lexer.ll"
+#line 474 "netconf_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.
@@ -2372,65 +2513,65 @@ YY_RULE_SETUP
return NetconfParser::make_STRING(decoded, driver.loc_);
}
YY_BREAK
-case 42:
-/* rule 42 can match eol */
+case 45:
+/* rule 45 can match eol */
YY_RULE_SETUP
-#line 543 "netconf_lexer.ll"
+#line 573 "netconf_lexer.ll"
{
/* Bad string with a forbidden control character inside */
driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
}
YY_BREAK
-case 43:
-/* rule 43 can match eol */
+case 46:
+/* rule 46 can match eol */
YY_RULE_SETUP
-#line 548 "netconf_lexer.ll"
+#line 578 "netconf_lexer.ll"
{
/* Bad string with a bad escape inside */
driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
}
YY_BREAK
-case 44:
+case 47:
YY_RULE_SETUP
-#line 553 "netconf_lexer.ll"
+#line 583 "netconf_lexer.ll"
{
/* Bad string with an open escape at the end */
driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
}
YY_BREAK
-case 45:
+case 48:
YY_RULE_SETUP
-#line 558 "netconf_lexer.ll"
+#line 588 "netconf_lexer.ll"
{ return NetconfParser::make_LSQUARE_BRACKET(driver.loc_); }
YY_BREAK
-case 46:
+case 49:
YY_RULE_SETUP
-#line 559 "netconf_lexer.ll"
+#line 589 "netconf_lexer.ll"
{ return NetconfParser::make_RSQUARE_BRACKET(driver.loc_); }
YY_BREAK
-case 47:
+case 50:
YY_RULE_SETUP
-#line 560 "netconf_lexer.ll"
+#line 590 "netconf_lexer.ll"
{ return NetconfParser::make_LCURLY_BRACKET(driver.loc_); }
YY_BREAK
-case 48:
+case 51:
YY_RULE_SETUP
-#line 561 "netconf_lexer.ll"
+#line 591 "netconf_lexer.ll"
{ return NetconfParser::make_RCURLY_BRACKET(driver.loc_); }
YY_BREAK
-case 49:
+case 52:
YY_RULE_SETUP
-#line 562 "netconf_lexer.ll"
+#line 592 "netconf_lexer.ll"
{ return NetconfParser::make_COMMA(driver.loc_); }
YY_BREAK
-case 50:
+case 53:
YY_RULE_SETUP
-#line 563 "netconf_lexer.ll"
+#line 593 "netconf_lexer.ll"
{ return NetconfParser::make_COLON(driver.loc_); }
YY_BREAK
-case 51:
+case 54:
YY_RULE_SETUP
-#line 565 "netconf_lexer.ll"
+#line 595 "netconf_lexer.ll"
{
/* An integer was found. */
std::string tmp(yytext);
@@ -2449,9 +2590,9 @@ YY_RULE_SETUP
return NetconfParser::make_INTEGER(integer, driver.loc_);
}
YY_BREAK
-case 52:
+case 55:
YY_RULE_SETUP
-#line 583 "netconf_lexer.ll"
+#line 613 "netconf_lexer.ll"
{
/* A floating point was found. */
std::string tmp(yytext);
@@ -2465,43 +2606,43 @@ YY_RULE_SETUP
return NetconfParser::make_FLOAT(fp, driver.loc_);
}
YY_BREAK
-case 53:
+case 56:
YY_RULE_SETUP
-#line 596 "netconf_lexer.ll"
+#line 626 "netconf_lexer.ll"
{
string tmp(yytext);
return NetconfParser::make_BOOLEAN(tmp == "true", driver.loc_);
}
YY_BREAK
-case 54:
+case 57:
YY_RULE_SETUP
-#line 601 "netconf_lexer.ll"
+#line 631 "netconf_lexer.ll"
{
return NetconfParser::make_NULL_TYPE(driver.loc_);
}
YY_BREAK
-case 55:
+case 58:
YY_RULE_SETUP
-#line 605 "netconf_lexer.ll"
+#line 635 "netconf_lexer.ll"
driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
YY_BREAK
-case 56:
+case 59:
YY_RULE_SETUP
-#line 607 "netconf_lexer.ll"
+#line 637 "netconf_lexer.ll"
driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
YY_BREAK
-case 57:
+case 60:
YY_RULE_SETUP
-#line 609 "netconf_lexer.ll"
+#line 639 "netconf_lexer.ll"
driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
YY_BREAK
-case 58:
+case 61:
YY_RULE_SETUP
-#line 611 "netconf_lexer.ll"
+#line 641 "netconf_lexer.ll"
driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
YY_BREAK
case YY_STATE_EOF(INITIAL):
-#line 613 "netconf_lexer.ll"
+#line 643 "netconf_lexer.ll"
{
if (driver.states_.empty()) {
return NetconfParser::make_END(driver.loc_);
@@ -2525,12 +2666,12 @@ case YY_STATE_EOF(INITIAL):
BEGIN(DIR_EXIT);
}
YY_BREAK
-case 59:
+case 62:
YY_RULE_SETUP
-#line 636 "netconf_lexer.ll"
+#line 666 "netconf_lexer.ll"
ECHO;
YY_BREAK
-#line 2533 "netconf_lexer.cc"
+#line 2674 "netconf_lexer.cc"
case YY_END_OF_BUFFER:
{
@@ -2849,7 +2990,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 >= 321 )
+ if ( yy_current_state >= 367 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -2882,11 +3023,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 >= 321 )
+ if ( yy_current_state >= 367 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
- yy_is_jam = (yy_current_state == 320);
+ yy_is_jam = (yy_current_state == 366);
return yy_is_jam ? 0 : yy_current_state;
}
@@ -3635,7 +3776,7 @@ void yyfree (void * ptr )
/* %ok-for-header */
-#line 636 "netconf_lexer.ll"
+#line 666 "netconf_lexer.ll"
using namespace isc::dhcp;
diff --git a/src/bin/netconf/netconf_lexer.ll b/src/bin/netconf/netconf_lexer.ll
index ada8236526..5862e9701c 100644
--- a/src/bin/netconf/netconf_lexer.ll
+++ b/src/bin/netconf/netconf_lexer.ll
@@ -206,6 +206,36 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
}
+\"boot-update\" {
+ switch(driver.ctx_) {
+ case ParserContext::NETCONF:
+ case ParserContext::SERVER:
+ return NetconfParser::make_BOOT_UPDATE(driver.loc_);
+ default:
+ return NetconfParser::make_STRING("boot-update", driver.loc_);
+ }
+}
+
+\"subscribe-changes\" {
+ switch(driver.ctx_) {
+ case ParserContext::NETCONF:
+ case ParserContext::SERVER:
+ return NetconfParser::make_SUBSCRIBE_CHANGES(driver.loc_);
+ default:
+ return NetconfParser::make_STRING("subscribe-changes", driver.loc_);
+ }
+}
+
+\"validate-changes\" {
+ switch(driver.ctx_) {
+ case ParserContext::NETCONF:
+ case ParserContext::SERVER:
+ return NetconfParser::make_VALIDATE_CHANGES(driver.loc_);
+ default:
+ return NetconfParser::make_STRING("validate-changes", driver.loc_);
+ }
+}
+
\"managed-servers\" {
switch(driver.ctx_) {
case ParserContext::NETCONF:
diff --git a/src/bin/netconf/netconf_parser.cc b/src/bin/netconf/netconf_parser.cc
index a864e2406b..66c8b997a8 100644
--- a/src/bin/netconf/netconf_parser.cc
+++ b/src/bin/netconf/netconf_parser.cc
@@ -244,25 +244,25 @@ namespace isc { namespace netconf {
{
switch (that.type_get ())
{
- case 54: // value
- case 57: // map_value
- case 113: // socket_type_value
+ case 57: // value
+ case 60: // map_value
+ case 119: // socket_type_value
value.copy< ElementPtr > (that.value);
break;
- case 45: // "boolean"
+ case 48: // "boolean"
value.copy< bool > (that.value);
break;
- case 44: // "floating point"
+ case 47: // "floating point"
value.copy< double > (that.value);
break;
- case 43: // "integer"
+ case 46: // "integer"
value.copy< int64_t > (that.value);
break;
- case 42: // "constant string"
+ case 45: // "constant string"
value.copy< std::string > (that.value);
break;
@@ -277,25 +277,25 @@ namespace isc { namespace netconf {
{
switch (that.type_get ())
{
- case 54: // value
- case 57: // map_value
- case 113: // socket_type_value
+ case 57: // value
+ case 60: // map_value
+ case 119: // socket_type_value
value.move< ElementPtr > (that.value);
break;
- case 45: // "boolean"
+ case 48: // "boolean"
value.move< bool > (that.value);
break;
- case 44: // "floating point"
+ case 47: // "floating point"
value.move< double > (that.value);
break;
- case 43: // "integer"
+ case 46: // "integer"
value.move< int64_t > (that.value);
break;
- case 42: // "constant string"
+ case 45: // "constant string"
value.move< std::string > (that.value);
break;
@@ -313,25 +313,25 @@ namespace isc { namespace netconf {
state = that.state;
switch (that.type_get ())
{
- case 54: // value
- case 57: // map_value
- case 113: // socket_type_value
+ case 57: // value
+ case 60: // map_value
+ case 119: // socket_type_value
value.copy< ElementPtr > (that.value);
break;
- case 45: // "boolean"
+ case 48: // "boolean"
value.copy< bool > (that.value);
break;
- case 44: // "floating point"
+ case 47: // "floating point"
value.copy< double > (that.value);
break;
- case 43: // "integer"
+ case 46: // "integer"
value.copy< int64_t > (that.value);
break;
- case 42: // "constant string"
+ case 45: // "constant string"
value.copy< std::string > (that.value);
break;
@@ -370,51 +370,51 @@ namespace isc { namespace netconf {
<< yysym.location << ": ";
switch (yytype)
{
- case 42: // "constant string"
+ case 45: // "constant string"
-#line 103 "netconf_parser.yy" // lalr1.cc:635
+#line 107 "netconf_parser.yy" // lalr1.cc:635
{ yyoutput << yysym.value.template as< std::string > (); }
#line 378 "netconf_parser.cc" // lalr1.cc:635
break;
- case 43: // "integer"
+ case 46: // "integer"
-#line 103 "netconf_parser.yy" // lalr1.cc:635
+#line 107 "netconf_parser.yy" // lalr1.cc:635
{ yyoutput << yysym.value.template as< int64_t > (); }
#line 385 "netconf_parser.cc" // lalr1.cc:635
break;
- case 44: // "floating point"
+ case 47: // "floating point"
-#line 103 "netconf_parser.yy" // lalr1.cc:635
+#line 107 "netconf_parser.yy" // lalr1.cc:635
{ yyoutput << yysym.value.template as< double > (); }
#line 392 "netconf_parser.cc" // lalr1.cc:635
break;
- case 45: // "boolean"
+ case 48: // "boolean"
-#line 103 "netconf_parser.yy" // lalr1.cc:635
+#line 107 "netconf_parser.yy" // lalr1.cc:635
{ yyoutput << yysym.value.template as< bool > (); }
#line 399 "netconf_parser.cc" // lalr1.cc:635
break;
- case 54: // value
+ case 57: // value
-#line 103 "netconf_parser.yy" // lalr1.cc:635
+#line 107 "netconf_parser.yy" // lalr1.cc:635
{ yyoutput << yysym.value.template as< ElementPtr > (); }
#line 406 "netconf_parser.cc" // lalr1.cc:635
break;
- case 57: // map_value
+ case 60: // map_value
-#line 103 "netconf_parser.yy" // lalr1.cc:635
+#line 107 "netconf_parser.yy" // lalr1.cc:635
{ yyoutput << yysym.value.template as< ElementPtr > (); }
#line 413 "netconf_parser.cc" // lalr1.cc:635
break;
- case 113: // socket_type_value
+ case 119: // socket_type_value
-#line 103 "netconf_parser.yy" // lalr1.cc:635
+#line 107 "netconf_parser.yy" // lalr1.cc:635
{ yyoutput << yysym.value.template as< ElementPtr > (); }
#line 420 "netconf_parser.cc" // lalr1.cc:635
break;
@@ -613,25 +613,25 @@ namespace isc { namespace netconf {
when using variants. */
switch (yyr1_[yyn])
{
- case 54: // value
- case 57: // map_value
- case 113: // socket_type_value
+ case 57: // value
+ case 60: // map_value
+ case 119: // socket_type_value
yylhs.value.build< ElementPtr > ();
break;
- case 45: // "boolean"
+ case 48: // "boolean"
yylhs.value.build< bool > ();
break;
- case 44: // "floating point"
+ case 47: // "floating point"
yylhs.value.build< double > ();
break;
- case 43: // "integer"
+ case 46: // "integer"
yylhs.value.build< int64_t > ();
break;
- case 42: // "constant string"
+ case 45: // "constant string"
yylhs.value.build< std::string > ();
break;
@@ -654,27 +654,27 @@ namespace isc { namespace netconf {
switch (yyn)
{
case 2:
-#line 114 "netconf_parser.yy" // lalr1.cc:856
+#line 118 "netconf_parser.yy" // lalr1.cc:856
{ ctx.ctx_ = ctx.NO_KEYWORDS; }
#line 660 "netconf_parser.cc" // lalr1.cc:856
break;
case 4:
-#line 115 "netconf_parser.yy" // lalr1.cc:856
+#line 119 "netconf_parser.yy" // lalr1.cc:856
{ ctx.ctx_ = ctx.CONFIG; }
#line 666 "netconf_parser.cc" // lalr1.cc:856
break;
case 6:
-#line 116 "netconf_parser.yy" // lalr1.cc:856
+#line 120 "netconf_parser.yy" // lalr1.cc:856
{ ctx.ctx_ = ctx.NETCONF; }
#line 672 "netconf_parser.cc" // lalr1.cc:856
break;
case 8:
-#line 124 "netconf_parser.yy" // lalr1.cc:856
+#line 128 "netconf_parser.yy" // lalr1.cc:856
{
- // Parse the Control-netconf map
+ // Parse the Netconf map
ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
ctx.stack_.push_back(m);
}
@@ -682,7 +682,7 @@ namespace isc { namespace netconf {
break;
case 9:
-#line 128 "netconf_parser.yy" // lalr1.cc:856
+#line 132 "netconf_parser.yy" // lalr1.cc:856
{
// parsing completed
}
@@ -690,7 +690,7 @@ namespace isc { namespace netconf {
break;
case 10:
-#line 135 "netconf_parser.yy" // lalr1.cc:856
+#line 139 "netconf_parser.yy" // lalr1.cc:856
{
// Push back the JSON value on the stack
ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ());
@@ -699,49 +699,49 @@ namespace isc { namespace netconf {
break;
case 11:
-#line 141 "netconf_parser.yy" // lalr1.cc:856
+#line 145 "netconf_parser.yy" // lalr1.cc:856
{ yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); }
#line 705 "netconf_parser.cc" // lalr1.cc:856
break;
case 12:
-#line 142 "netconf_parser.yy" // lalr1.cc:856
+#line 146 "netconf_parser.yy" // lalr1.cc:856
{ yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); }
#line 711 "netconf_parser.cc" // lalr1.cc:856
break;
case 13:
-#line 143 "netconf_parser.yy" // lalr1.cc:856
+#line 147 "netconf_parser.yy" // lalr1.cc:856
{ yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); }
#line 717 "netconf_parser.cc" // lalr1.cc:856
break;
case 14:
-#line 144 "netconf_parser.yy" // lalr1.cc:856
+#line 148 "netconf_parser.yy" // lalr1.cc:856
{ yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); }
#line 723 "netconf_parser.cc" // lalr1.cc:856
break;
case 15:
-#line 145 "netconf_parser.yy" // lalr1.cc:856
+#line 149 "netconf_parser.yy" // lalr1.cc:856
{ yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
#line 729 "netconf_parser.cc" // lalr1.cc:856
break;
case 16:
-#line 146 "netconf_parser.yy" // lalr1.cc:856
+#line 150 "netconf_parser.yy" // lalr1.cc:856
{ yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
#line 735 "netconf_parser.cc" // lalr1.cc:856
break;
case 17:
-#line 147 "netconf_parser.yy" // lalr1.cc:856
+#line 151 "netconf_parser.yy" // lalr1.cc:856
{ yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
#line 741 "netconf_parser.cc" // lalr1.cc:856
break;
case 18:
-#line 151 "netconf_parser.yy" // lalr1.cc:856
+#line 155 "netconf_parser.yy" // lalr1.cc:856
{
// This code is executed when we're about to start parsing
// the content of the map
@@ -752,7 +752,7 @@ namespace isc { namespace netconf {
break;
case 19:
-#line 156 "netconf_parser.yy" // lalr1.cc:856
+#line 160 "netconf_parser.yy" // lalr1.cc:856
{
// map parsing completed. If we ever want to do any wrap up
// (maybe some sanity checking), this would be the best place
@@ -762,13 +762,13 @@ namespace isc { namespace netconf {
break;
case 20:
-#line 162 "netconf_parser.yy" // lalr1.cc:856
+#line 166 "netconf_parser.yy" // lalr1.cc:856
{ yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
#line 768 "netconf_parser.cc" // lalr1.cc:856
break;
case 23:
-#line 176 "netconf_parser.yy" // lalr1.cc:856
+#line 180 "netconf_parser.yy" // lalr1.cc:856
{
// map containing a single entry
ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
@@ -777,7 +777,7 @@ namespace isc { namespace netconf {
break;
case 24:
-#line 180 "netconf_parser.yy" // lalr1.cc:856
+#line 184 "netconf_parser.yy" // lalr1.cc:856
{
// map consisting of a shorter map followed by
// comma and string:value
@@ -787,7 +787,7 @@ namespace isc { namespace netconf {
break;
case 25:
-#line 187 "netconf_parser.yy" // lalr1.cc:856
+#line 191 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
ctx.stack_.push_back(l);
@@ -796,14 +796,14 @@ namespace isc { namespace netconf {
break;
case 26:
-#line 190 "netconf_parser.yy" // lalr1.cc:856
+#line 194 "netconf_parser.yy" // lalr1.cc:856
{
}
#line 803 "netconf_parser.cc" // lalr1.cc:856
break;
case 29:
-#line 197 "netconf_parser.yy" // lalr1.cc:856
+#line 201 "netconf_parser.yy" // lalr1.cc:856
{
// List consisting of a single element.
ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
@@ -812,7 +812,7 @@ namespace isc { namespace netconf {
break;
case 30:
-#line 201 "netconf_parser.yy" // lalr1.cc:856
+#line 205 "netconf_parser.yy" // lalr1.cc:856
{
// List ending with , and a value.
ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
@@ -821,7 +821,7 @@ namespace isc { namespace netconf {
break;
case 31:
-#line 214 "netconf_parser.yy" // lalr1.cc:856
+#line 218 "netconf_parser.yy" // lalr1.cc:856
{
const std::string& where = ctx.contextName();
const std::string& keyword = yystack_[1].value.as< std::string > ();
@@ -832,7 +832,7 @@ namespace isc { namespace netconf {
break;
case 32:
-#line 222 "netconf_parser.yy" // lalr1.cc:856
+#line 226 "netconf_parser.yy" // lalr1.cc:856
{
// This code is executed when we're about to start parsing
// the content of the map
@@ -843,7 +843,7 @@ namespace isc { namespace netconf {
break;
case 33:
-#line 227 "netconf_parser.yy" // lalr1.cc:856
+#line 231 "netconf_parser.yy" // lalr1.cc:856
{
// map parsing completed. If we ever want to do any wrap up
// (maybe some sanity checking), this would be the best place
@@ -853,7 +853,7 @@ namespace isc { namespace netconf {
break;
case 38:
-#line 244 "netconf_parser.yy" // lalr1.cc:856
+#line 248 "netconf_parser.yy" // lalr1.cc:856
{
// Let's create a MapElement that will represent it, add it to the
@@ -869,9 +869,9 @@ namespace isc { namespace netconf {
break;
case 39:
-#line 254 "netconf_parser.yy" // lalr1.cc:856
+#line 258 "netconf_parser.yy" // lalr1.cc:856
{
- // Ok, we're done with parsing control-netconf. Let's take the map
+ // Ok, we're done with parsing Netconf. Let's take the map
// off the stack.
ctx.stack_.pop_back();
ctx.leave();
@@ -879,16 +879,43 @@ namespace isc { namespace netconf {
#line 880 "netconf_parser.cc" // lalr1.cc:856
break;
- case 49:
-#line 278 "netconf_parser.yy" // lalr1.cc:856
+ case 52:
+#line 285 "netconf_parser.yy" // lalr1.cc:856
+ {
+ ElementPtr flag(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
+ ctx.stack_.back()->set("boot-update", flag);
+}
+#line 889 "netconf_parser.cc" // lalr1.cc:856
+ break;
+
+ case 53:
+#line 290 "netconf_parser.yy" // lalr1.cc:856
+ {
+ ElementPtr flag(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
+ ctx.stack_.back()->set("subscribe-changes", flag);
+}
+#line 898 "netconf_parser.cc" // lalr1.cc:856
+ break;
+
+ case 54:
+#line 295 "netconf_parser.yy" // lalr1.cc:856
+ {
+ ElementPtr flag(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
+ ctx.stack_.back()->set("validate-changes", flag);
+}
+#line 907 "netconf_parser.cc" // lalr1.cc:856
+ break;
+
+ case 55:
+#line 300 "netconf_parser.yy" // lalr1.cc:856
{
ctx.enter(ctx.NO_KEYWORDS);
}
-#line 888 "netconf_parser.cc" // lalr1.cc:856
+#line 915 "netconf_parser.cc" // lalr1.cc:856
break;
- case 50:
-#line 280 "netconf_parser.yy" // lalr1.cc:856
+ case 56:
+#line 302 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr parent = ctx.stack_.back();
ElementPtr user_context = yystack_[0].value.as< ElementPtr > ();
@@ -911,19 +938,19 @@ namespace isc { namespace netconf {
parent->set("user-context", user_context);
ctx.leave();
}
-#line 915 "netconf_parser.cc" // lalr1.cc:856
+#line 942 "netconf_parser.cc" // lalr1.cc:856
break;
- case 51:
-#line 303 "netconf_parser.yy" // lalr1.cc:856
+ case 57:
+#line 325 "netconf_parser.yy" // lalr1.cc:856
{
ctx.enter(ctx.NO_KEYWORDS);
}
-#line 923 "netconf_parser.cc" // lalr1.cc:856
+#line 950 "netconf_parser.cc" // lalr1.cc:856
break;
- case 52:
-#line 305 "netconf_parser.yy" // lalr1.cc:856
+ case 58:
+#line 327 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr parent = ctx.stack_.back();
ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location)));
@@ -948,479 +975,479 @@ namespace isc { namespace netconf {
parent->set("user-context", user_context);
ctx.leave();
}
-#line 952 "netconf_parser.cc" // lalr1.cc:856
+#line 979 "netconf_parser.cc" // lalr1.cc:856
break;
- case 53:
-#line 331 "netconf_parser.yy" // lalr1.cc:856
+ case 59:
+#line 353 "netconf_parser.yy" // lalr1.cc:856
{
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 963 "netconf_parser.cc" // lalr1.cc:856
+#line 990 "netconf_parser.cc" // lalr1.cc:856
break;
- case 54:
-#line 336 "netconf_parser.yy" // lalr1.cc:856
+ case 60:
+#line 358 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
ctx.leave();
}
-#line 972 "netconf_parser.cc" // lalr1.cc:856
+#line 999 "netconf_parser.cc" // lalr1.cc:856
break;
- case 59:
-#line 349 "netconf_parser.yy" // lalr1.cc:856
+ case 65:
+#line 371 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->add(m);
ctx.stack_.push_back(m);
}
-#line 982 "netconf_parser.cc" // lalr1.cc:856
+#line 1009 "netconf_parser.cc" // lalr1.cc:856
break;
- case 60:
-#line 353 "netconf_parser.yy" // lalr1.cc:856
+ case 66:
+#line 375 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
}
-#line 990 "netconf_parser.cc" // lalr1.cc:856
+#line 1017 "netconf_parser.cc" // lalr1.cc:856
break;
- case 66:
-#line 366 "netconf_parser.yy" // lalr1.cc:856
+ case 72:
+#line 388 "netconf_parser.yy" // lalr1.cc:856
{
ctx.enter(ctx.NO_KEYWORDS);
}
-#line 998 "netconf_parser.cc" // lalr1.cc:856
+#line 1025 "netconf_parser.cc" // lalr1.cc:856
break;
- case 67:
-#line 368 "netconf_parser.yy" // lalr1.cc:856
+ case 73:
+#line 390 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("library", lib);
ctx.leave();
}
-#line 1008 "netconf_parser.cc" // lalr1.cc:856
+#line 1035 "netconf_parser.cc" // lalr1.cc:856
break;
- case 68:
-#line 374 "netconf_parser.yy" // lalr1.cc:856
+ case 74:
+#line 396 "netconf_parser.yy" // lalr1.cc:856
{
ctx.enter(ctx.NO_KEYWORDS);
}
-#line 1016 "netconf_parser.cc" // lalr1.cc:856
+#line 1043 "netconf_parser.cc" // lalr1.cc:856
break;
- case 69:
-#line 376 "netconf_parser.yy" // lalr1.cc:856
+ case 75:
+#line 398 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ());
ctx.leave();
}
-#line 1025 "netconf_parser.cc" // lalr1.cc:856
+#line 1052 "netconf_parser.cc" // lalr1.cc:856
break;
- case 70:
-#line 384 "netconf_parser.yy" // lalr1.cc:856
+ case 76:
+#line 406 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr m(new MapElement(ctx.loc2pos(yystack_[2].location)));
ctx.stack_.back()->set("managed-servers", m);
ctx.stack_.push_back(m);
ctx.enter(ctx.MANAGED_SERVERS);
}
-#line 1036 "netconf_parser.cc" // lalr1.cc:856
+#line 1063 "netconf_parser.cc" // lalr1.cc:856
break;
- case 71:
-#line 389 "netconf_parser.yy" // lalr1.cc:856
+ case 77:
+#line 411 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
ctx.leave();
}
-#line 1045 "netconf_parser.cc" // lalr1.cc:856
+#line 1072 "netconf_parser.cc" // lalr1.cc:856
break;
- case 81:
-#line 413 "netconf_parser.yy" // lalr1.cc:856
+ case 87:
+#line 435 "netconf_parser.yy" // lalr1.cc:856
{
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 1056 "netconf_parser.cc" // lalr1.cc:856
+#line 1083 "netconf_parser.cc" // lalr1.cc:856
break;
- case 82:
-#line 418 "netconf_parser.yy" // lalr1.cc:856
+ case 88:
+#line 440 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
ctx.leave();
}
-#line 1065 "netconf_parser.cc" // lalr1.cc:856
+#line 1092 "netconf_parser.cc" // lalr1.cc:856
break;
- case 83:
-#line 424 "netconf_parser.yy" // lalr1.cc:856
+ case 89:
+#line 446 "netconf_parser.yy" // lalr1.cc:856
{
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 1076 "netconf_parser.cc" // lalr1.cc:856
+#line 1103 "netconf_parser.cc" // lalr1.cc:856
break;
- case 84:
-#line 429 "netconf_parser.yy" // lalr1.cc:856
+ case 90:
+#line 451 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
ctx.leave();
}
-#line 1085 "netconf_parser.cc" // lalr1.cc:856
+#line 1112 "netconf_parser.cc" // lalr1.cc:856
break;
- case 85:
-#line 435 "netconf_parser.yy" // lalr1.cc:856
+ case 91:
+#line 457 "netconf_parser.yy" // lalr1.cc:856
{
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 1096 "netconf_parser.cc" // lalr1.cc:856
+#line 1123 "netconf_parser.cc" // lalr1.cc:856
break;
- case 86:
-#line 440 "netconf_parser.yy" // lalr1.cc:856
+ case 92:
+#line 462 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
ctx.leave();
}
-#line 1105 "netconf_parser.cc" // lalr1.cc:856
+#line 1132 "netconf_parser.cc" // lalr1.cc:856
break;
- case 87:
-#line 446 "netconf_parser.yy" // lalr1.cc:856
+ case 93:
+#line 468 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("ca", m);
ctx.stack_.push_back(m);
ctx.enter(ctx.SERVER);
}
-#line 1116 "netconf_parser.cc" // lalr1.cc:856
+#line 1143 "netconf_parser.cc" // lalr1.cc:856
break;
- case 88:
-#line 451 "netconf_parser.yy" // lalr1.cc:856
+ case 94:
+#line 473 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
ctx.leave();
}
-#line 1125 "netconf_parser.cc" // lalr1.cc:856
+#line 1152 "netconf_parser.cc" // lalr1.cc:856
break;
- case 96:
-#line 470 "netconf_parser.yy" // lalr1.cc:856
+ case 105:
+#line 495 "netconf_parser.yy" // lalr1.cc:856
{
ctx.enter(ctx.NO_KEYWORDS);
}
-#line 1133 "netconf_parser.cc" // lalr1.cc:856
+#line 1160 "netconf_parser.cc" // lalr1.cc:856
break;
- case 97:
-#line 472 "netconf_parser.yy" // lalr1.cc:856
+ case 106:
+#line 497 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr model(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("model", model);
ctx.leave();
}
-#line 1143 "netconf_parser.cc" // lalr1.cc:856
+#line 1170 "netconf_parser.cc" // lalr1.cc:856
break;
- case 98:
-#line 479 "netconf_parser.yy" // lalr1.cc:856
+ case 107:
+#line 504 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("control-socket", m);
ctx.stack_.push_back(m);
ctx.enter(ctx.CONTROL_SOCKET);
}
-#line 1154 "netconf_parser.cc" // lalr1.cc:856
+#line 1181 "netconf_parser.cc" // lalr1.cc:856
break;
- case 99:
-#line 484 "netconf_parser.yy" // lalr1.cc:856
+ case 108:
+#line 509 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
ctx.leave();
}
-#line 1163 "netconf_parser.cc" // lalr1.cc:856
+#line 1190 "netconf_parser.cc" // lalr1.cc:856
break;
- case 108:
-#line 502 "netconf_parser.yy" // lalr1.cc:856
+ case 117:
+#line 527 "netconf_parser.yy" // lalr1.cc:856
{
ctx.enter(ctx.SOCKET_TYPE);
}
-#line 1171 "netconf_parser.cc" // lalr1.cc:856
+#line 1198 "netconf_parser.cc" // lalr1.cc:856
break;
- case 109:
-#line 504 "netconf_parser.yy" // lalr1.cc:856
+ case 118:
+#line 529 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.back()->set("socket-type", yystack_[0].value.as< ElementPtr > ());
ctx.leave();
}
-#line 1180 "netconf_parser.cc" // lalr1.cc:856
+#line 1207 "netconf_parser.cc" // lalr1.cc:856
break;
- case 110:
-#line 510 "netconf_parser.yy" // lalr1.cc:856
+ case 119:
+#line 535 "netconf_parser.yy" // lalr1.cc:856
{ yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("unix", ctx.loc2pos(yystack_[0].location))); }
-#line 1186 "netconf_parser.cc" // lalr1.cc:856
+#line 1213 "netconf_parser.cc" // lalr1.cc:856
break;
- case 111:
-#line 511 "netconf_parser.yy" // lalr1.cc:856
+ case 120:
+#line 536 "netconf_parser.yy" // lalr1.cc:856
{ yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("http", ctx.loc2pos(yystack_[0].location))); }
-#line 1192 "netconf_parser.cc" // lalr1.cc:856
+#line 1219 "netconf_parser.cc" // lalr1.cc:856
break;
- case 112:
-#line 512 "netconf_parser.yy" // lalr1.cc:856
+ case 121:
+#line 537 "netconf_parser.yy" // lalr1.cc:856
{ yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("stdout", ctx.loc2pos(yystack_[0].location))); }
-#line 1198 "netconf_parser.cc" // lalr1.cc:856
+#line 1225 "netconf_parser.cc" // lalr1.cc:856
break;
- case 113:
-#line 515 "netconf_parser.yy" // lalr1.cc:856
+ case 122:
+#line 540 "netconf_parser.yy" // lalr1.cc:856
{
ctx.enter(ctx.NO_KEYWORDS);
}
-#line 1206 "netconf_parser.cc" // lalr1.cc:856
+#line 1233 "netconf_parser.cc" // lalr1.cc:856
break;
- case 114:
-#line 517 "netconf_parser.yy" // lalr1.cc:856
+ case 123:
+#line 542 "netconf_parser.yy" // lalr1.cc:856
{
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 1216 "netconf_parser.cc" // lalr1.cc:856
+#line 1243 "netconf_parser.cc" // lalr1.cc:856
break;
- case 115:
-#line 524 "netconf_parser.yy" // lalr1.cc:856
+ case 124:
+#line 549 "netconf_parser.yy" // lalr1.cc:856
{
ctx.enter(ctx.NO_KEYWORDS);
}
-#line 1224 "netconf_parser.cc" // lalr1.cc:856
+#line 1251 "netconf_parser.cc" // lalr1.cc:856
break;
- case 116:
-#line 526 "netconf_parser.yy" // lalr1.cc:856
+ case 125:
+#line 551 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr url(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("socket-url", url);
ctx.leave();
}
-#line 1234 "netconf_parser.cc" // lalr1.cc:856
+#line 1261 "netconf_parser.cc" // lalr1.cc:856
break;
- case 117:
-#line 539 "netconf_parser.yy" // lalr1.cc:856
+ case 126:
+#line 564 "netconf_parser.yy" // lalr1.cc:856
{
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 1245 "netconf_parser.cc" // lalr1.cc:856
+#line 1272 "netconf_parser.cc" // lalr1.cc:856
break;
- case 118:
-#line 544 "netconf_parser.yy" // lalr1.cc:856
+ case 127:
+#line 569 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
ctx.leave();
}
-#line 1254 "netconf_parser.cc" // lalr1.cc:856
+#line 1281 "netconf_parser.cc" // lalr1.cc:856
break;
- case 122:
-#line 561 "netconf_parser.yy" // lalr1.cc:856
+ case 131:
+#line 586 "netconf_parser.yy" // lalr1.cc:856
{
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 1265 "netconf_parser.cc" // lalr1.cc:856
+#line 1292 "netconf_parser.cc" // lalr1.cc:856
break;
- case 123:
-#line 566 "netconf_parser.yy" // lalr1.cc:856
+ case 132:
+#line 591 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
ctx.leave();
}
-#line 1274 "netconf_parser.cc" // lalr1.cc:856
+#line 1301 "netconf_parser.cc" // lalr1.cc:856
break;
- case 126:
-#line 578 "netconf_parser.yy" // lalr1.cc:856
+ case 135:
+#line 603 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->add(l);
ctx.stack_.push_back(l);
}
-#line 1284 "netconf_parser.cc" // lalr1.cc:856
+#line 1311 "netconf_parser.cc" // lalr1.cc:856
break;
- case 127:
-#line 582 "netconf_parser.yy" // lalr1.cc:856
+ case 136:
+#line 607 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
}
-#line 1292 "netconf_parser.cc" // lalr1.cc:856
+#line 1319 "netconf_parser.cc" // lalr1.cc:856
break;
- case 137:
-#line 599 "netconf_parser.yy" // lalr1.cc:856
+ case 146:
+#line 624 "netconf_parser.yy" // lalr1.cc:856
{
ctx.enter(ctx.NO_KEYWORDS);
}
-#line 1300 "netconf_parser.cc" // lalr1.cc:856
+#line 1327 "netconf_parser.cc" // lalr1.cc:856
break;
- case 138:
-#line 601 "netconf_parser.yy" // lalr1.cc:856
+ case 147:
+#line 626 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("name", name);
ctx.leave();
}
-#line 1310 "netconf_parser.cc" // lalr1.cc:856
+#line 1337 "netconf_parser.cc" // lalr1.cc:856
break;
- case 139:
-#line 607 "netconf_parser.yy" // lalr1.cc:856
+ case 148:
+#line 632 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("debuglevel", dl);
}
-#line 1319 "netconf_parser.cc" // lalr1.cc:856
+#line 1346 "netconf_parser.cc" // lalr1.cc:856
break;
- case 140:
-#line 612 "netconf_parser.yy" // lalr1.cc:856
+ case 149:
+#line 637 "netconf_parser.yy" // lalr1.cc:856
{
ctx.enter(ctx.NO_KEYWORDS);
}
-#line 1327 "netconf_parser.cc" // lalr1.cc:856
+#line 1354 "netconf_parser.cc" // lalr1.cc:856
break;
- case 141:
-#line 614 "netconf_parser.yy" // lalr1.cc:856
+ case 150:
+#line 639 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("severity", sev);
ctx.leave();
}
-#line 1337 "netconf_parser.cc" // lalr1.cc:856
+#line 1364 "netconf_parser.cc" // lalr1.cc:856
break;
- case 142:
-#line 620 "netconf_parser.yy" // lalr1.cc:856
+ case 151:
+#line 645 "netconf_parser.yy" // lalr1.cc:856
{
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 1348 "netconf_parser.cc" // lalr1.cc:856
+#line 1375 "netconf_parser.cc" // lalr1.cc:856
break;
- case 143:
-#line 625 "netconf_parser.yy" // lalr1.cc:856
+ case 152:
+#line 650 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
ctx.leave();
}
-#line 1357 "netconf_parser.cc" // lalr1.cc:856
+#line 1384 "netconf_parser.cc" // lalr1.cc:856
break;
- case 146:
-#line 634 "netconf_parser.yy" // lalr1.cc:856
+ case 155:
+#line 659 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->add(m);
ctx.stack_.push_back(m);
}
-#line 1367 "netconf_parser.cc" // lalr1.cc:856
+#line 1394 "netconf_parser.cc" // lalr1.cc:856
break;
- case 147:
-#line 638 "netconf_parser.yy" // lalr1.cc:856
+ case 156:
+#line 663 "netconf_parser.yy" // lalr1.cc:856
{
ctx.stack_.pop_back();
}
-#line 1375 "netconf_parser.cc" // lalr1.cc:856
+#line 1402 "netconf_parser.cc" // lalr1.cc:856
break;
- case 154:
-#line 652 "netconf_parser.yy" // lalr1.cc:856
+ case 163:
+#line 677 "netconf_parser.yy" // lalr1.cc:856
{
ctx.enter(ctx.NO_KEYWORDS);
}
-#line 1383 "netconf_parser.cc" // lalr1.cc:856
+#line 1410 "netconf_parser.cc" // lalr1.cc:856
break;
- case 155:
-#line 654 "netconf_parser.yy" // lalr1.cc:856
+ case 164:
+#line 679 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("output", sev);
ctx.leave();
}
-#line 1393 "netconf_parser.cc" // lalr1.cc:856
+#line 1420 "netconf_parser.cc" // lalr1.cc:856
break;
- case 156:
-#line 660 "netconf_parser.yy" // lalr1.cc:856
+ case 165:
+#line 685 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("flush", flush);
}
-#line 1402 "netconf_parser.cc" // lalr1.cc:856
+#line 1429 "netconf_parser.cc" // lalr1.cc:856
break;
- case 157:
-#line 665 "netconf_parser.yy" // lalr1.cc:856
+ case 166:
+#line 690 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("maxsize", maxsize);
}
-#line 1411 "netconf_parser.cc" // lalr1.cc:856
+#line 1438 "netconf_parser.cc" // lalr1.cc:856
break;
- case 158:
-#line 670 "netconf_parser.yy" // lalr1.cc:856
+ case 167:
+#line 695 "netconf_parser.yy" // lalr1.cc:856
{
ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
ctx.stack_.back()->set("maxver", maxver);
}
-#line 1420 "netconf_parser.cc" // lalr1.cc:856
+#line 1447 "netconf_parser.cc" // lalr1.cc:856
break;
-#line 1424 "netconf_parser.cc" // lalr1.cc:856
+#line 1451 "netconf_parser.cc" // lalr1.cc:856
default:
break;
}
@@ -1674,40 +1701,41 @@ namespace isc { namespace netconf {
}
- const signed char NetconfParser::yypact_ninf_ = -73;
+ const signed char NetconfParser::yypact_ninf_ = -64;
const signed char NetconfParser::yytable_ninf_ = -1;
const short int
NetconfParser::yypact_[] =
{
- 55, -73, -73, -73, 17, 2, 3, 31, -73, -73,
- -73, -73, -73, -73, -73, -73, -73, -73, -73, -73,
- -73, -73, -73, -73, 2, 6, 10, 11, -73, 46,
- 68, 86, 95, 88, -73, -73, 0, -73, -73, -73,
- -73, -73, 100, -73, 101, -73, 98, 104, -73, -73,
- -73, -73, -73, -73, 2, 2, -73, 66, 105, 106,
- 10, -73, 107, 108, 109, 110, -73, -73, 11, -73,
- -73, 111, 112, 113, -73, 114, 75, -73, 117, -73,
- 2, 11, 93, -73, -73, -73, -2, 118, -73, 116,
- -73, 13, -73, -73, -73, -73, -73, -73, -73, 119,
- 115, -73, -73, -73, -73, -73, -73, 120, 125, -73,
- -73, 126, 93, -73, 127, 128, 129, 130, -73, -2,
- 34, -73, 118, 124, -73, 134, 135, 137, 138, -73,
- -73, -73, -73, 61, -73, -73, -73, -73, 139, 39,
- 39, 39, 39, 131, 132, 57, -73, -73, 27, -73,
- -73, -73, -73, -73, -73, 62, -73, -73, -73, 69,
- 70, 71, 121, 2, -73, -6, 139, -73, 133, 143,
- 39, -73, -73, -73, -73, -73, -73, -73, -73, 144,
- -73, -73, -73, -73, 72, -73, -73, -73, -73, -73,
- -73, 122, 142, -73, 146, 147, 123, 148, -6, -73,
- -73, 7, 136, 149, -73, 140, -73, -73, -73, -73,
- -73, -73, -73, 79, -73, -73, -73, -73, -73, 150,
- -73, 151, 152, 154, 7, -73, -73, 83, -73, 76,
- 141, 145, -73, 30, 150, -73, -73, -73, -73, -73,
- -73, -73, -73, 155, 156, 157, 80, -73, -73, -73,
- -73, -73, -73, 158, 159, 153, 160, 30, -73, 163,
- -73, -73, -73, -73, -73
+ 64, -64, -64, -64, 13, 9, 18, 29, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -64, 9, -22, 10, 15, -64, 1,
+ 70, 79, 74, 106, -64, -64, 7, -64, -64, -64,
+ -64, -64, 113, 116, 117, 118, -64, 119, -64, 120,
+ 121, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ 9, 9, -64, 80, 122, 123, 10, -64, 125, 126,
+ 83, 84, 85, 127, 131, -64, -64, 15, -64, -64,
+ 132, 130, 133, -64, 134, 97, -64, -64, -64, -64,
+ 138, -64, 9, 15, 105, -64, -64, -64, 44, 137,
+ -64, 139, -64, 16, -64, -64, -64, -64, -64, -64,
+ -64, 140, 136, -64, -64, -64, -64, -64, -64, 143,
+ 142, -64, -64, 146, 105, -64, 147, 148, 152, 153,
+ -64, 44, 2, -64, 137, 141, -64, 154, 155, 156,
+ 157, -64, -64, -64, -64, 40, -64, -64, -64, -64,
+ 158, 65, 65, 65, 65, 162, 163, 88, -64, -64,
+ 43, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ 62, -64, -64, -64, 82, 91, 92, 114, 9, -64,
+ 0, 158, -64, 164, 165, 65, -64, -64, -64, -64,
+ -64, -64, -64, -64, 166, -64, -64, -64, -64, 93,
+ -64, -64, -64, -64, -64, -64, 115, 167, -64, 168,
+ 169, 129, 172, 0, -64, -64, -6, 135, 173, -64,
+ 149, -64, -64, -64, -64, -64, -64, -64, 94, -64,
+ -64, -64, -64, -64, 170, -64, 175, 177, 178, -6,
+ -64, -64, 78, -64, 87, 150, 151, -64, 52, 170,
+ -64, -64, -64, -64, -64, -64, -64, -64, 179, 180,
+ 181, 95, -64, -64, -64, -64, -64, -64, 188, 145,
+ 159, 160, 52, -64, 171, -64, -64, -64, -64, -64
};
const unsigned char
@@ -1716,169 +1744,176 @@ namespace isc { namespace netconf {
0, 2, 4, 6, 0, 0, 0, 0, 1, 25,
18, 15, 14, 11, 12, 13, 3, 10, 16, 17,
32, 5, 8, 7, 27, 21, 0, 40, 29, 0,
- 28, 0, 0, 22, 38, 117, 0, 34, 36, 37,
- 49, 51, 0, 53, 0, 48, 0, 41, 42, 46,
- 47, 45, 44, 26, 0, 0, 19, 0, 0, 0,
- 0, 33, 0, 0, 0, 0, 31, 9, 0, 30,
- 23, 0, 0, 0, 35, 0, 0, 70, 0, 43,
- 0, 40, 0, 20, 50, 52, 72, 55, 24, 0,
- 122, 0, 119, 121, 81, 83, 85, 87, 80, 0,
- 73, 74, 76, 77, 78, 79, 59, 0, 56, 57,
- 39, 0, 0, 118, 0, 0, 0, 0, 71, 0,
- 0, 54, 0, 0, 120, 0, 0, 0, 0, 75,
- 66, 68, 63, 0, 61, 64, 65, 58, 0, 0,
- 0, 0, 0, 0, 0, 0, 60, 126, 0, 124,
- 96, 98, 95, 93, 94, 0, 89, 91, 92, 0,
- 0, 0, 0, 0, 62, 0, 0, 123, 0, 0,
- 0, 82, 84, 86, 88, 67, 69, 137, 142, 0,
- 140, 136, 134, 135, 0, 128, 130, 132, 133, 131,
- 125, 0, 0, 90, 0, 0, 0, 0, 0, 127,
- 97, 0, 0, 0, 139, 0, 129, 108, 113, 115,
- 107, 105, 106, 0, 100, 102, 103, 104, 138, 0,
- 141, 0, 0, 0, 0, 99, 146, 0, 144, 0,
- 0, 0, 101, 0, 0, 143, 110, 111, 112, 109,
- 114, 116, 154, 0, 0, 0, 0, 148, 150, 151,
- 152, 153, 145, 0, 0, 0, 0, 0, 147, 0,
- 156, 157, 158, 149, 155
+ 28, 0, 0, 22, 38, 126, 0, 34, 36, 37,
+ 55, 57, 0, 0, 0, 0, 59, 0, 51, 0,
+ 41, 42, 44, 45, 46, 49, 50, 48, 47, 26,
+ 0, 0, 19, 0, 0, 0, 0, 33, 0, 0,
+ 0, 0, 0, 0, 0, 31, 9, 0, 30, 23,
+ 0, 0, 0, 35, 0, 0, 52, 53, 54, 76,
+ 0, 43, 0, 40, 0, 20, 56, 58, 78, 61,
+ 24, 0, 131, 0, 128, 130, 87, 89, 91, 93,
+ 86, 0, 79, 80, 82, 83, 84, 85, 65, 0,
+ 62, 63, 39, 0, 0, 127, 0, 0, 0, 0,
+ 77, 0, 0, 60, 0, 0, 129, 0, 0, 0,
+ 0, 81, 72, 74, 69, 0, 67, 70, 71, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 135,
+ 0, 133, 105, 107, 104, 98, 99, 100, 102, 103,
+ 0, 95, 97, 101, 0, 0, 0, 0, 0, 68,
+ 0, 0, 132, 0, 0, 0, 88, 90, 92, 94,
+ 73, 75, 146, 151, 0, 149, 145, 143, 144, 0,
+ 137, 139, 141, 142, 140, 134, 0, 0, 96, 0,
+ 0, 0, 0, 0, 136, 106, 0, 0, 0, 148,
+ 0, 138, 117, 122, 124, 116, 114, 115, 0, 109,
+ 111, 112, 113, 147, 0, 150, 0, 0, 0, 0,
+ 108, 155, 0, 153, 0, 0, 0, 110, 0, 0,
+ 152, 119, 120, 121, 118, 123, 125, 163, 0, 0,
+ 0, 0, 157, 159, 160, 161, 162, 154, 0, 0,
+ 0, 0, 0, 156, 0, 165, 166, 167, 158, 164
};
const short int
NetconfParser::yypgoto_[] =
{
- -73, -73, -73, -73, -73, -73, -73, -73, -20, 38,
- -73, -73, -73, -73, -73, -73, -73, -73, -27, -73,
- -73, -73, 161, -73, -73, 84, -73, 85, -26, -73,
- -25, -73, -73, -73, -73, -73, 45, -73, -73, 23,
- -73, -73, -73, -73, -73, -73, -73, -73, 50, -73,
- -73, -73, -73, -73, -73, -73, -73, -40, 9, -73,
- -73, -73, -73, -73, -54, -73, -73, -73, -73, -73,
- -73, -73, -73, -73, -73, 65, -73, -73, -73, 14,
- -73, -73, -17, -73, -73, -73, -73, -73, -73, -73,
- -73, -50, -73, -73, -72, -73, -73, -73, -73, -73
+ -64, -64, -64, -64, -64, -64, -64, -64, -20, 124,
+ -64, -64, -64, -64, -64, -64, -64, -64, -27, -64,
+ -64, -64, 144, -64, -64, 104, -64, 161, -24, -19,
+ -18, -26, -64, -25, -64, -64, -64, -64, -64, 37,
+ -64, -64, 41, -64, -64, -64, -64, -64, -64, -64,
+ -64, 68, -64, -64, -64, -64, -64, -64, -64, -64,
+ -38, 17, -64, -64, -64, -64, -64, -39, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, 77, -64,
+ -64, -64, 22, -64, -64, -9, -64, -64, -64, -64,
+ -64, -64, -64, -64, -42, -64, -64, -63, -64, -64,
+ -64, -64, -64
};
const short int
NetconfParser::yydefgoto_[] =
{
-1, 4, 5, 6, 7, 23, 27, 16, 17, 18,
- 25, 84, 32, 33, 19, 24, 29, 30, 152, 21,
- 26, 36, 37, 38, 58, 46, 47, 48, 153, 62,
- 154, 63, 51, 65, 107, 108, 109, 120, 133, 134,
- 135, 143, 136, 144, 52, 86, 99, 100, 101, 102,
- 114, 103, 115, 104, 116, 105, 117, 155, 156, 157,
- 168, 158, 169, 213, 214, 215, 221, 239, 216, 222,
- 217, 223, 39, 59, 91, 92, 93, 111, 148, 149,
- 165, 184, 185, 186, 194, 187, 188, 197, 189, 195,
- 227, 228, 233, 246, 247, 248, 253, 249, 250, 251
+ 25, 96, 32, 33, 19, 24, 29, 30, 164, 21,
+ 26, 36, 37, 38, 64, 49, 50, 51, 165, 166,
+ 167, 168, 68, 169, 69, 57, 74, 119, 120, 121,
+ 132, 145, 146, 147, 155, 148, 156, 58, 98, 111,
+ 112, 113, 114, 126, 115, 127, 116, 128, 117, 129,
+ 170, 171, 172, 183, 173, 184, 228, 229, 230, 236,
+ 254, 231, 237, 232, 238, 39, 65, 103, 104, 105,
+ 123, 160, 161, 180, 199, 200, 201, 209, 202, 203,
+ 212, 204, 210, 242, 243, 248, 261, 262, 263, 268,
+ 264, 265, 266
};
const unsigned short int
NetconfParser::yytable_[] =
{
- 45, 49, 50, 60, 28, 40, 41, 9, 61, 10,
- 20, 11, 94, 95, 96, 97, 112, 8, 40, 41,
- 34, 113, 40, 41, 42, 177, 178, 207, 179, 180,
- 166, 208, 209, 167, 69, 70, 44, 43, 22, 35,
- 44, 45, 49, 50, 12, 13, 14, 15, 31, 44,
- 40, 41, 53, 44, 45, 49, 50, 150, 151, 98,
- 88, 130, 131, 242, 145, 170, 243, 244, 245, 146,
- 171, 54, 170, 170, 170, 198, 44, 172, 173, 174,
- 199, 44, 224, 257, 130, 131, 234, 225, 258, 235,
- 55, 57, 98, 132, 1, 2, 3, 236, 237, 238,
- 159, 160, 161, 56, 64, 66, 67, 68, 71, 72,
- 73, 75, 76, 83, 78, 80, 77, 85, 119, 81,
- 82, 10, 87, 90, 110, 106, 121, 118, 122, 138,
- 123, 125, 126, 127, 128, 162, 163, 191, 181, 182,
- 183, 139, 140, 176, 141, 142, 147, 192, 196, 201,
- 202, 203, 205, 79, 219, 229, 230, 226, 231, 254,
- 255, 256, 259, 175, 200, 89, 204, 137, 164, 129,
- 232, 181, 182, 183, 210, 211, 212, 124, 218, 193,
- 190, 206, 220, 240, 252, 263, 0, 241, 0, 0,
- 0, 0, 0, 0, 0, 0, 261, 210, 211, 212,
- 0, 0, 0, 262, 260, 264, 0, 0, 0, 0,
+ 48, 55, 56, 52, 28, 40, 41, 59, 53, 54,
+ 66, 40, 41, 8, 9, 67, 10, 222, 11, 124,
+ 34, 223, 224, 31, 125, 20, 40, 41, 42, 43,
+ 44, 45, 142, 143, 192, 193, 22, 194, 195, 47,
+ 78, 79, 35, 157, 46, 47, 181, 47, 158, 182,
+ 48, 55, 56, 52, 12, 13, 14, 15, 53, 54,
+ 47, 106, 107, 108, 109, 185, 48, 55, 56, 52,
+ 186, 110, 100, 60, 53, 54, 40, 41, 42, 43,
+ 44, 249, 62, 61, 250, 185, 162, 163, 257, 47,
+ 187, 258, 259, 260, 185, 185, 213, 239, 272, 188,
+ 189, 214, 240, 273, 110, 144, 1, 2, 3, 63,
+ 47, 251, 252, 253, 174, 175, 176, 70, 142, 143,
+ 71, 72, 73, 75, 77, 80, 81, 82, 76, 84,
+ 85, 86, 87, 88, 89, 90, 92, 93, 102, 131,
+ 94, 10, 97, 99, 118, 134, 150, 122, 130, 133,
+ 135, 137, 138, 196, 197, 198, 139, 140, 191, 190,
+ 215, 151, 152, 153, 154, 159, 177, 178, 206, 207,
+ 211, 149, 217, 218, 216, 219, 220, 241, 234, 244,
+ 233, 245, 246, 269, 270, 271, 196, 197, 198, 225,
+ 226, 227, 274, 275, 235, 255, 256, 101, 179, 141,
+ 247, 136, 208, 205, 221, 276, 277, 267, 95, 278,
+ 83, 0, 225, 226, 227, 0, 279, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 74
+ 0, 0, 0, 0, 0, 0, 0, 0, 91
};
const short int
NetconfParser::yycheck_[] =
{
- 27, 27, 27, 3, 24, 11, 12, 5, 8, 7,
- 7, 9, 14, 15, 16, 17, 3, 0, 11, 12,
- 10, 8, 11, 12, 13, 31, 32, 20, 34, 35,
- 3, 24, 25, 6, 54, 55, 42, 26, 7, 29,
- 42, 68, 68, 68, 42, 43, 44, 45, 42, 42,
- 11, 12, 6, 42, 81, 81, 81, 18, 19, 86,
- 80, 27, 28, 33, 3, 3, 36, 37, 38, 8,
- 8, 3, 3, 3, 3, 3, 42, 8, 8, 8,
- 8, 42, 3, 3, 27, 28, 3, 8, 8, 6,
- 4, 3, 119, 120, 39, 40, 41, 21, 22, 23,
- 140, 141, 142, 8, 4, 4, 8, 3, 42, 4,
- 4, 4, 4, 75, 4, 4, 7, 42, 3, 7,
- 7, 7, 5, 30, 8, 7, 6, 8, 3, 5,
- 4, 4, 4, 4, 4, 4, 4, 4, 165, 165,
- 165, 7, 7, 163, 7, 7, 7, 4, 4, 7,
- 4, 4, 4, 68, 5, 4, 4, 7, 4, 4,
- 4, 4, 4, 42, 42, 81, 43, 122, 145, 119,
- 224, 198, 198, 198, 201, 201, 201, 112, 42, 170,
- 166, 198, 42, 42, 234, 257, -1, 42, -1, -1,
- -1, -1, -1, -1, -1, -1, 43, 224, 224, 224,
- -1, -1, -1, 43, 45, 42, -1, -1, -1, -1,
+ 27, 27, 27, 27, 24, 11, 12, 6, 27, 27,
+ 3, 11, 12, 0, 5, 8, 7, 23, 9, 3,
+ 10, 27, 28, 45, 8, 7, 11, 12, 13, 14,
+ 15, 16, 30, 31, 34, 35, 7, 37, 38, 45,
+ 60, 61, 32, 3, 29, 45, 3, 45, 8, 6,
+ 77, 77, 77, 77, 45, 46, 47, 48, 77, 77,
+ 45, 17, 18, 19, 20, 3, 93, 93, 93, 93,
+ 8, 98, 92, 3, 93, 93, 11, 12, 13, 14,
+ 15, 3, 8, 4, 6, 3, 21, 22, 36, 45,
+ 8, 39, 40, 41, 3, 3, 3, 3, 3, 8,
+ 8, 8, 8, 8, 131, 132, 42, 43, 44, 3,
+ 45, 24, 25, 26, 152, 153, 154, 4, 30, 31,
+ 4, 4, 4, 4, 3, 45, 4, 4, 8, 4,
+ 4, 48, 48, 48, 7, 4, 4, 7, 33, 3,
+ 7, 7, 45, 5, 7, 3, 5, 8, 8, 6,
+ 4, 4, 4, 180, 180, 180, 4, 4, 178, 45,
+ 45, 7, 7, 7, 7, 7, 4, 4, 4, 4,
+ 4, 134, 4, 4, 7, 46, 4, 7, 5, 4,
+ 45, 4, 4, 4, 4, 4, 213, 213, 213, 216,
+ 216, 216, 4, 48, 45, 45, 45, 93, 157, 131,
+ 239, 124, 185, 181, 213, 46, 46, 249, 84, 272,
+ 66, -1, 239, 239, 239, -1, 45, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 60
+ -1, -1, -1, -1, -1, -1, -1, -1, 77
};
const unsigned char
NetconfParser::yystos_[] =
{
- 0, 39, 40, 41, 47, 48, 49, 50, 0, 5,
- 7, 9, 42, 43, 44, 45, 53, 54, 55, 60,
- 7, 65, 7, 51, 61, 56, 66, 52, 54, 62,
- 63, 42, 58, 59, 10, 29, 67, 68, 69, 118,
- 11, 12, 13, 26, 42, 64, 71, 72, 73, 74,
- 76, 78, 90, 6, 3, 4, 8, 3, 70, 119,
- 3, 8, 75, 77, 4, 79, 4, 8, 3, 54,
- 54, 42, 4, 4, 68, 4, 4, 7, 4, 73,
- 4, 7, 7, 55, 57, 42, 91, 5, 54, 71,
- 30, 120, 121, 122, 14, 15, 16, 17, 64, 92,
- 93, 94, 95, 97, 99, 101, 7, 80, 81, 82,
- 8, 123, 3, 8, 96, 98, 100, 102, 8, 3,
- 83, 6, 3, 4, 121, 4, 4, 4, 4, 94,
- 27, 28, 64, 84, 85, 86, 88, 82, 5, 7,
- 7, 7, 7, 87, 89, 3, 8, 7, 124, 125,
- 18, 19, 64, 74, 76, 103, 104, 105, 107, 103,
- 103, 103, 4, 4, 85, 126, 3, 6, 106, 108,
- 3, 8, 8, 8, 8, 42, 54, 31, 32, 34,
- 35, 64, 74, 76, 127, 128, 129, 131, 132, 134,
- 125, 4, 4, 104, 130, 135, 4, 133, 3, 8,
- 42, 7, 4, 4, 43, 4, 128, 20, 24, 25,
- 64, 74, 76, 109, 110, 111, 114, 116, 42, 5,
- 42, 112, 115, 117, 3, 8, 7, 136, 137, 4,
- 4, 4, 110, 138, 3, 6, 21, 22, 23, 113,
- 42, 42, 33, 36, 37, 38, 139, 140, 141, 143,
- 144, 145, 137, 142, 4, 4, 4, 3, 8, 4,
- 45, 43, 43, 140, 42
+ 0, 42, 43, 44, 50, 51, 52, 53, 0, 5,
+ 7, 9, 45, 46, 47, 48, 56, 57, 58, 63,
+ 7, 68, 7, 54, 64, 59, 69, 55, 57, 65,
+ 66, 45, 61, 62, 10, 32, 70, 71, 72, 124,
+ 11, 12, 13, 14, 15, 16, 29, 45, 67, 74,
+ 75, 76, 77, 78, 79, 80, 82, 84, 96, 6,
+ 3, 4, 8, 3, 73, 125, 3, 8, 81, 83,
+ 4, 4, 4, 4, 85, 4, 8, 3, 57, 57,
+ 45, 4, 4, 71, 4, 4, 48, 48, 48, 7,
+ 4, 76, 4, 7, 7, 58, 60, 45, 97, 5,
+ 57, 74, 33, 126, 127, 128, 17, 18, 19, 20,
+ 67, 98, 99, 100, 101, 103, 105, 107, 7, 86,
+ 87, 88, 8, 129, 3, 8, 102, 104, 106, 108,
+ 8, 3, 89, 6, 3, 4, 127, 4, 4, 4,
+ 4, 100, 30, 31, 67, 90, 91, 92, 94, 88,
+ 5, 7, 7, 7, 7, 93, 95, 3, 8, 7,
+ 130, 131, 21, 22, 67, 77, 78, 79, 80, 82,
+ 109, 110, 111, 113, 109, 109, 109, 4, 4, 91,
+ 132, 3, 6, 112, 114, 3, 8, 8, 8, 8,
+ 45, 57, 34, 35, 37, 38, 67, 80, 82, 133,
+ 134, 135, 137, 138, 140, 131, 4, 4, 110, 136,
+ 141, 4, 139, 3, 8, 45, 7, 4, 4, 46,
+ 4, 134, 23, 27, 28, 67, 80, 82, 115, 116,
+ 117, 120, 122, 45, 5, 45, 118, 121, 123, 3,
+ 8, 7, 142, 143, 4, 4, 4, 116, 144, 3,
+ 6, 24, 25, 26, 119, 45, 45, 36, 39, 40,
+ 41, 145, 146, 147, 149, 150, 151, 143, 148, 4,
+ 4, 4, 3, 8, 4, 48, 46, 46, 146, 45
};
const unsigned char
NetconfParser::yyr1_[] =
{
- 0, 46, 48, 47, 49, 47, 50, 47, 52, 51,
- 53, 54, 54, 54, 54, 54, 54, 54, 56, 55,
- 57, 58, 58, 59, 59, 61, 60, 62, 62, 63,
- 63, 64, 66, 65, 67, 67, 68, 68, 70, 69,
- 71, 71, 72, 72, 73, 73, 73, 73, 73, 75,
- 74, 77, 76, 79, 78, 80, 80, 81, 81, 83,
- 82, 84, 84, 84, 85, 85, 87, 86, 89, 88,
- 91, 90, 92, 92, 93, 93, 94, 94, 94, 94,
- 94, 96, 95, 98, 97, 100, 99, 102, 101, 103,
- 103, 104, 104, 104, 104, 104, 106, 105, 108, 107,
- 109, 109, 110, 110, 110, 110, 110, 110, 112, 111,
- 113, 113, 113, 115, 114, 117, 116, 119, 118, 120,
- 120, 121, 123, 122, 124, 124, 126, 125, 127, 127,
- 128, 128, 128, 128, 128, 128, 128, 130, 129, 131,
- 133, 132, 135, 134, 136, 136, 138, 137, 139, 139,
- 140, 140, 140, 140, 142, 141, 143, 144, 145
+ 0, 49, 51, 50, 52, 50, 53, 50, 55, 54,
+ 56, 57, 57, 57, 57, 57, 57, 57, 59, 58,
+ 60, 61, 61, 62, 62, 64, 63, 65, 65, 66,
+ 66, 67, 69, 68, 70, 70, 71, 71, 73, 72,
+ 74, 74, 75, 75, 76, 76, 76, 76, 76, 76,
+ 76, 76, 77, 78, 79, 81, 80, 83, 82, 85,
+ 84, 86, 86, 87, 87, 89, 88, 90, 90, 90,
+ 91, 91, 93, 92, 95, 94, 97, 96, 98, 98,
+ 99, 99, 100, 100, 100, 100, 100, 102, 101, 104,
+ 103, 106, 105, 108, 107, 109, 109, 110, 110, 110,
+ 110, 110, 110, 110, 110, 112, 111, 114, 113, 115,
+ 115, 116, 116, 116, 116, 116, 116, 118, 117, 119,
+ 119, 119, 121, 120, 123, 122, 125, 124, 126, 126,
+ 127, 129, 128, 130, 130, 132, 131, 133, 133, 134,
+ 134, 134, 134, 134, 134, 134, 136, 135, 137, 139,
+ 138, 141, 140, 142, 142, 144, 143, 145, 145, 146,
+ 146, 146, 146, 148, 147, 149, 150, 151
};
const unsigned char
@@ -1888,18 +1923,19 @@ namespace isc { namespace netconf {
1, 1, 1, 1, 1, 1, 1, 1, 0, 4,
1, 0, 1, 3, 5, 0, 4, 0, 1, 1,
3, 2, 0, 4, 1, 3, 1, 1, 0, 6,
- 0, 1, 1, 3, 1, 1, 1, 1, 1, 0,
- 4, 0, 4, 0, 6, 0, 1, 1, 3, 0,
- 4, 1, 3, 1, 1, 1, 0, 4, 0, 4,
- 0, 6, 0, 1, 1, 3, 1, 1, 1, 1,
- 1, 0, 6, 0, 6, 0, 6, 0, 6, 1,
- 3, 1, 1, 1, 1, 1, 0, 4, 0, 6,
- 1, 3, 1, 1, 1, 1, 1, 1, 0, 4,
- 1, 1, 1, 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
+ 0, 1, 1, 3, 1, 1, 1, 1, 1, 1,
+ 1, 1, 3, 3, 3, 0, 4, 0, 4, 0,
+ 6, 0, 1, 1, 3, 0, 4, 1, 3, 1,
+ 1, 1, 0, 4, 0, 4, 0, 6, 0, 1,
+ 1, 3, 1, 1, 1, 1, 1, 0, 6, 0,
+ 6, 0, 6, 0, 6, 1, 3, 1, 1, 1,
+ 1, 1, 1, 1, 1, 0, 4, 0, 6, 1,
+ 3, 1, 1, 1, 1, 1, 1, 0, 4, 1,
+ 1, 1, 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
};
@@ -1911,8 +1947,9 @@ namespace isc { namespace netconf {
{
"\"end of file\"", "error", "$undefined", "\",\"", "\":\"", "\"[\"",
"\"]\"", "\"{\"", "\"}\"", "\"null\"", "\"Netconf\"", "\"user-context\"",
- "\"comment\"", "\"managed-servers\"", "\"dhcp4\"", "\"dhcp6\"", "\"d2\"",
- "\"ca\"", "\"model\"", "\"control-socket\"", "\"socket-type\"",
+ "\"comment\"", "\"boot-update\"", "\"subscribe-changes\"",
+ "\"validate-changes\"", "\"managed-servers\"", "\"dhcp4\"", "\"dhcp6\"",
+ "\"d2\"", "\"ca\"", "\"model\"", "\"control-socket\"", "\"socket-type\"",
"\"unix\"", "\"http\"", "\"stdout\"", "\"socket-name\"",
"\"socket-url\"", "\"hooks-libraries\"", "\"library\"", "\"parameters\"",
"\"Logging\"", "\"loggers\"", "\"name\"", "\"output_options\"",
@@ -1925,7 +1962,8 @@ namespace isc { namespace netconf {
"not_empty_list", "unknown_map_entry", "netconf_syntax_map", "$@7",
"global_objects", "global_object", "netconf_object", "$@8",
"global_params", "not_empty_global_params", "global_param",
- "user_context", "$@9", "comment", "$@10", "hooks_libraries", "$@11",
+ "boot_update", "subscribe_changes", "validate_changes", "user_context",
+ "$@9", "comment", "$@10", "hooks_libraries", "$@11",
"hooks_libraries_list", "not_empty_hooks_libraries_list",
"hooks_library", "$@12", "hooks_params", "hooks_param", "library",
"$@13", "parameters", "$@14", "managed_servers", "$@15",
@@ -1947,22 +1985,23 @@ namespace isc { namespace netconf {
const unsigned short int
NetconfParser::yyrline_[] =
{
- 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, 222, 222, 234, 235, 239, 240, 244, 244,
- 261, 262, 265, 266, 271, 272, 273, 274, 275, 278,
- 278, 303, 303, 331, 331, 341, 342, 345, 346, 349,
- 349, 357, 358, 359, 362, 363, 366, 366, 374, 374,
- 384, 384, 394, 395, 398, 399, 405, 406, 407, 408,
- 409, 413, 413, 424, 424, 435, 435, 446, 446, 457,
- 458, 462, 463, 464, 465, 466, 470, 470, 479, 479,
- 490, 491, 494, 495, 496, 497, 498, 499, 502, 502,
- 510, 511, 512, 515, 515, 524, 524, 539, 539, 552,
- 553, 557, 561, 561, 573, 574, 578, 578, 586, 587,
- 590, 591, 592, 593, 594, 595, 596, 599, 599, 607,
- 612, 612, 620, 620, 630, 631, 634, 634, 642, 643,
- 646, 647, 648, 649, 652, 652, 660, 665, 670
+ 0, 118, 118, 118, 119, 119, 120, 120, 128, 128,
+ 139, 145, 146, 147, 148, 149, 150, 151, 155, 155,
+ 166, 171, 172, 180, 184, 191, 191, 197, 198, 201,
+ 205, 218, 226, 226, 238, 239, 243, 244, 248, 248,
+ 265, 266, 269, 270, 275, 276, 277, 278, 279, 280,
+ 281, 282, 285, 290, 295, 300, 300, 325, 325, 353,
+ 353, 363, 364, 367, 368, 371, 371, 379, 380, 381,
+ 384, 385, 388, 388, 396, 396, 406, 406, 416, 417,
+ 420, 421, 427, 428, 429, 430, 431, 435, 435, 446,
+ 446, 457, 457, 468, 468, 479, 480, 484, 485, 486,
+ 487, 488, 489, 490, 491, 495, 495, 504, 504, 515,
+ 516, 519, 520, 521, 522, 523, 524, 527, 527, 535,
+ 536, 537, 540, 540, 549, 549, 564, 564, 577, 578,
+ 582, 586, 586, 598, 599, 603, 603, 611, 612, 615,
+ 616, 617, 618, 619, 620, 621, 624, 624, 632, 637,
+ 637, 645, 645, 655, 656, 659, 659, 667, 668, 671,
+ 672, 673, 674, 677, 677, 685, 690, 695
};
// Print the state stack on the debug stream.
@@ -1997,8 +2036,8 @@ namespace isc { namespace netconf {
#line 14 "netconf_parser.yy" // lalr1.cc:1163
} } // isc::netconf
-#line 2001 "netconf_parser.cc" // lalr1.cc:1163
-#line 675 "netconf_parser.yy" // lalr1.cc:1164
+#line 2040 "netconf_parser.cc" // lalr1.cc:1163
+#line 700 "netconf_parser.yy" // lalr1.cc:1164
void
diff --git a/src/bin/netconf/netconf_parser.h b/src/bin/netconf/netconf_parser.h
index 317b4768dd..f7a4e6cb3a 100644
--- a/src/bin/netconf/netconf_parser.h
+++ b/src/bin/netconf/netconf_parser.h
@@ -352,39 +352,42 @@ namespace isc { namespace netconf {
TOKEN_NETCONF = 265,
TOKEN_USER_CONTEXT = 266,
TOKEN_COMMENT = 267,
- TOKEN_MANAGED_SERVERS = 268,
- TOKEN_DHCP4_SERVER = 269,
- TOKEN_DHCP6_SERVER = 270,
- TOKEN_D2_SERVER = 271,
- TOKEN_CA_SERVER = 272,
- TOKEN_MODEL = 273,
- TOKEN_CONTROL_SOCKET = 274,
- TOKEN_SOCKET_TYPE = 275,
- TOKEN_UNIX = 276,
- TOKEN_HTTP = 277,
- TOKEN_STDOUT = 278,
- TOKEN_SOCKET_NAME = 279,
- TOKEN_SOCKET_URL = 280,
- TOKEN_HOOKS_LIBRARIES = 281,
- TOKEN_LIBRARY = 282,
- TOKEN_PARAMETERS = 283,
- TOKEN_LOGGING = 284,
- TOKEN_LOGGERS = 285,
- TOKEN_NAME = 286,
- TOKEN_OUTPUT_OPTIONS = 287,
- TOKEN_OUTPUT = 288,
- TOKEN_DEBUGLEVEL = 289,
- TOKEN_SEVERITY = 290,
- TOKEN_FLUSH = 291,
- TOKEN_MAXSIZE = 292,
- TOKEN_MAXVER = 293,
- TOKEN_START_JSON = 294,
- TOKEN_START_NETCONF = 295,
- TOKEN_START_SUB_NETCONF = 296,
- TOKEN_STRING = 297,
- TOKEN_INTEGER = 298,
- TOKEN_FLOAT = 299,
- TOKEN_BOOLEAN = 300
+ TOKEN_BOOT_UPDATE = 268,
+ TOKEN_SUBSCRIBE_CHANGES = 269,
+ TOKEN_VALIDATE_CHANGES = 270,
+ TOKEN_MANAGED_SERVERS = 271,
+ TOKEN_DHCP4_SERVER = 272,
+ TOKEN_DHCP6_SERVER = 273,
+ TOKEN_D2_SERVER = 274,
+ TOKEN_CA_SERVER = 275,
+ TOKEN_MODEL = 276,
+ TOKEN_CONTROL_SOCKET = 277,
+ TOKEN_SOCKET_TYPE = 278,
+ TOKEN_UNIX = 279,
+ TOKEN_HTTP = 280,
+ TOKEN_STDOUT = 281,
+ TOKEN_SOCKET_NAME = 282,
+ TOKEN_SOCKET_URL = 283,
+ TOKEN_HOOKS_LIBRARIES = 284,
+ TOKEN_LIBRARY = 285,
+ TOKEN_PARAMETERS = 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_START_JSON = 297,
+ TOKEN_START_NETCONF = 298,
+ TOKEN_START_SUB_NETCONF = 299,
+ TOKEN_STRING = 300,
+ TOKEN_INTEGER = 301,
+ TOKEN_FLOAT = 302,
+ TOKEN_BOOLEAN = 303
};
};
@@ -545,6 +548,18 @@ namespace isc { namespace netconf {
static inline
symbol_type
+ make_BOOT_UPDATE (const location_type& l);
+
+ static inline
+ symbol_type
+ make_SUBSCRIBE_CHANGES (const location_type& l);
+
+ static inline
+ symbol_type
+ make_VALIDATE_CHANGES (const location_type& l);
+
+ static inline
+ symbol_type
make_MANAGED_SERVERS (const location_type& l);
static inline
@@ -882,12 +897,12 @@ namespace isc { namespace netconf {
enum
{
yyeof_ = 0,
- yylast_ = 221, ///< Last index in yytable_.
- yynnts_ = 100, ///< Number of nonterminal symbols.
+ yylast_ = 238, ///< Last index in yytable_.
+ yynnts_ = 103, ///< Number of nonterminal symbols.
yyfinal_ = 8, ///< Termination state number.
yyterror_ = 1,
yyerrcode_ = 256,
- yyntokens_ = 46 ///< Number of tokens.
+ yyntokens_ = 49 ///< Number of tokens.
};
@@ -934,9 +949,9 @@ namespace isc { namespace netconf {
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
+ 45, 46, 47, 48
};
- const unsigned user_token_number_max_ = 300;
+ const unsigned user_token_number_max_ = 303;
const token_number_type undef_token_ = 2;
if (static_cast<int> (t) <= yyeof_)
@@ -967,25 +982,25 @@ namespace isc { namespace netconf {
{
switch (other.type_get ())
{
- case 54: // value
- case 57: // map_value
- case 113: // socket_type_value
+ case 57: // value
+ case 60: // map_value
+ case 119: // socket_type_value
value.copy< ElementPtr > (other.value);
break;
- case 45: // "boolean"
+ case 48: // "boolean"
value.copy< bool > (other.value);
break;
- case 44: // "floating point"
+ case 47: // "floating point"
value.copy< double > (other.value);
break;
- case 43: // "integer"
+ case 46: // "integer"
value.copy< int64_t > (other.value);
break;
- case 42: // "constant string"
+ case 45: // "constant string"
value.copy< std::string > (other.value);
break;
@@ -1004,25 +1019,25 @@ namespace isc { namespace netconf {
(void) v;
switch (this->type_get ())
{
- case 54: // value
- case 57: // map_value
- case 113: // socket_type_value
+ case 57: // value
+ case 60: // map_value
+ case 119: // socket_type_value
value.copy< ElementPtr > (v);
break;
- case 45: // "boolean"
+ case 48: // "boolean"
value.copy< bool > (v);
break;
- case 44: // "floating point"
+ case 47: // "floating point"
value.copy< double > (v);
break;
- case 43: // "integer"
+ case 46: // "integer"
value.copy< int64_t > (v);
break;
- case 42: // "constant string"
+ case 45: // "constant string"
value.copy< std::string > (v);
break;
@@ -1100,25 +1115,25 @@ namespace isc { namespace netconf {
// Type destructor.
switch (yytype)
{
- case 54: // value
- case 57: // map_value
- case 113: // socket_type_value
+ case 57: // value
+ case 60: // map_value
+ case 119: // socket_type_value
value.template destroy< ElementPtr > ();
break;
- case 45: // "boolean"
+ case 48: // "boolean"
value.template destroy< bool > ();
break;
- case 44: // "floating point"
+ case 47: // "floating point"
value.template destroy< double > ();
break;
- case 43: // "integer"
+ case 46: // "integer"
value.template destroy< int64_t > ();
break;
- case 42: // "constant string"
+ case 45: // "constant string"
value.template destroy< std::string > ();
break;
@@ -1143,25 +1158,25 @@ namespace isc { namespace netconf {
super_type::move (s);
switch (this->type_get ())
{
- case 54: // value
- case 57: // map_value
- case 113: // socket_type_value
+ case 57: // value
+ case 60: // map_value
+ case 119: // socket_type_value
value.move< ElementPtr > (s.value);
break;
- case 45: // "boolean"
+ case 48: // "boolean"
value.move< bool > (s.value);
break;
- case 44: // "floating point"
+ case 47: // "floating point"
value.move< double > (s.value);
break;
- case 43: // "integer"
+ case 46: // "integer"
value.move< int64_t > (s.value);
break;
- case 42: // "constant string"
+ case 45: // "constant string"
value.move< std::string > (s.value);
break;
@@ -1224,7 +1239,7 @@ namespace isc { namespace netconf {
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, 298, 299, 300
+ 295, 296, 297, 298, 299, 300, 301, 302, 303
};
return static_cast<token_type> (yytoken_number_[type]);
}
@@ -1296,6 +1311,24 @@ namespace isc { namespace netconf {
}
NetconfParser::symbol_type
+ NetconfParser::make_BOOT_UPDATE (const location_type& l)
+ {
+ return symbol_type (token::TOKEN_BOOT_UPDATE, l);
+ }
+
+ NetconfParser::symbol_type
+ NetconfParser::make_SUBSCRIBE_CHANGES (const location_type& l)
+ {
+ return symbol_type (token::TOKEN_SUBSCRIBE_CHANGES, l);
+ }
+
+ NetconfParser::symbol_type
+ NetconfParser::make_VALIDATE_CHANGES (const location_type& l)
+ {
+ return symbol_type (token::TOKEN_VALIDATE_CHANGES, l);
+ }
+
+ NetconfParser::symbol_type
NetconfParser::make_MANAGED_SERVERS (const location_type& l)
{
return symbol_type (token::TOKEN_MANAGED_SERVERS, l);
@@ -1496,7 +1529,7 @@ namespace isc { namespace netconf {
#line 14 "netconf_parser.yy" // lalr1.cc:379
} } // isc::netconf
-#line 1500 "netconf_parser.h" // lalr1.cc:379
+#line 1533 "netconf_parser.h" // lalr1.cc:379
diff --git a/src/bin/netconf/netconf_parser.yy b/src/bin/netconf/netconf_parser.yy
index 14fc5639a4..e7ccfe38f0 100644
--- a/src/bin/netconf/netconf_parser.yy
+++ b/src/bin/netconf/netconf_parser.yy
@@ -53,6 +53,10 @@ using namespace std;
USER_CONTEXT "user-context"
COMMENT "comment"
+ BOOT_UPDATE "boot-update"
+ SUBSCRIBE_CHANGES "subscribe-changes"
+ VALIDATE_CHANGES "validate-changes"
+
MANAGED_SERVERS "managed-servers"
DHCP4_SERVER "dhcp4"
DHCP6_SERVER "dhcp6"
@@ -268,13 +272,31 @@ not_empty_global_params: global_param
// These are the parameters that are allowed in the top-level for
// Netconf.
-global_param: managed_servers
+global_param: boot_update
+ | subscribe_changes
+ | validate_changes
+ | managed_servers
| hooks_libraries
| user_context
| comment
| unknown_map_entry
;
+boot_update: BOOT_UPDATE COLON BOOLEAN {
+ ElementPtr flag(new BoolElement($3, ctx.loc2pos(@3)));
+ ctx.stack_.back()->set("boot-update", flag);
+};
+
+subscribe_changes: SUBSCRIBE_CHANGES COLON BOOLEAN {
+ ElementPtr flag(new BoolElement($3, ctx.loc2pos(@3)));
+ ctx.stack_.back()->set("subscribe-changes", flag);
+};
+
+validate_changes: VALIDATE_CHANGES COLON BOOLEAN {
+ ElementPtr flag(new BoolElement($3, ctx.loc2pos(@3)));
+ ctx.stack_.back()->set("validate-changes", flag);
+};
+
user_context: USER_CONTEXT {
ctx.enter(ctx.NO_KEYWORDS);
} COLON map_value {
@@ -460,6 +482,9 @@ managed_server_params: managed_server_param
// We currently support two server parameters: model and control-socket.
managed_server_param: model
+ | boot_update
+ | subscribe_changes
+ | validate_changes
| control_socket
| user_context
| comment
diff --git a/src/bin/netconf/position.hh b/src/bin/netconf/position.hh
index 96b6e13f6a..97d1919a1d 100644
--- a/src/bin/netconf/position.hh
+++ b/src/bin/netconf/position.hh
@@ -1,4 +1,4 @@
-// Generated 201809281126
+// Generated 201810092120
// A Bison parser, made by GNU Bison 3.0.5.
// Positions for Bison parsers in C++
diff --git a/src/bin/netconf/simple_parser.cc b/src/bin/netconf/simple_parser.cc
index 5f5591b069..0a4734b058 100644
--- a/src/bin/netconf/simple_parser.cc
+++ b/src/bin/netconf/simple_parser.cc
@@ -36,6 +36,9 @@ namespace netconf {
///
/// These are global Netconf parameters.
const SimpleDefaults NetconfSimpleParser::NETCONF_DEFAULTS = {
+ { "boot-update", Element::boolean, "true" },
+ { "subscribe-changes", Element::boolean, "true" },
+ { "validate-changes", Element::boolean, "true" }
};
/// Supplies defaults for control-socket elements
@@ -65,6 +68,18 @@ const SimpleDefaults NetconfSimpleParser::CA_DEFAULTS = {
{ "model", Element::string, "kea-ctrl-agent" }
};
+/// @brief List of parameters that can be inherited to managed-servers scope.
+///
+/// Some parameters may be defined on both global (directly in Netconf) and
+/// servers (Netconf/managed-servers/...) scope. If not defined in the
+/// managed-servers scope, the value is being inherited (derived) from
+/// the global scope. This array lists all of such parameters.
+const ParamsList NetconfSimpleParser::INHERIT_TO_SERVERS = {
+ "boot-update",
+ "subscribe-changes",
+ "validate-changes"
+};
+
/// @}
/// ---------------------------------------------------------------------------
@@ -87,6 +102,24 @@ size_t NetconfSimpleParser::setAllDefaults(const ElementPtr& global) {
return (cnt);
}
+size_t NetconfSimpleParser::deriveParameters(ConstElementPtr global) {
+ size_t cnt = 0;
+
+ // Now derive global parameters into managed-servers.
+ ConstElementPtr servers = global->get("managed-servers");
+ if (servers) {
+ for (auto it : servers->mapValue()) {
+ ElementPtr mutable_server =
+ boost::const_pointer_cast<Element>(it.second);
+ cnt += SimpleParser::deriveParams(global,
+ mutable_server,
+ INHERIT_TO_SERVERS);
+ }
+ }
+
+ return (cnt);
+}
+
size_t
NetconfSimpleParser::setServerDefaults(const std::string name,
ConstElementPtr server) {
diff --git a/src/bin/netconf/simple_parser.h b/src/bin/netconf/simple_parser.h
index eb13983e11..5c9324dae9 100644
--- a/src/bin/netconf/simple_parser.h
+++ b/src/bin/netconf/simple_parser.h
@@ -30,6 +30,14 @@ public:
/// @return number of default values added
static size_t setAllDefaults(const isc::data::ElementPtr& global);
+ /// @brief Derives (inherits) all parameters from global to more specific scopes.
+ ///
+ /// This method currently does the following:
+ /// - derives global parameters to managed servers (flags for now)
+ /// @param global scope to be modified if needed
+ /// @return number of default values derived
+ static size_t deriveParameters(isc::data::ConstElementPtr global);
+
/// @brief Adds default values to a Managed server entry.
///
/// Adds server specific defaults, e.g. the default model.
@@ -58,6 +66,7 @@ public:
static const isc::data::SimpleDefaults DHCP6_DEFAULTS;
static const isc::data::SimpleDefaults D2_DEFAULTS;
static const isc::data::SimpleDefaults CA_DEFAULTS;
+ static const isc::data::ParamsList INHERIT_TO_SERVERS;
};
};
diff --git a/src/bin/netconf/stack.hh b/src/bin/netconf/stack.hh
index ef4b2cf75e..7074ea3de0 100644
--- a/src/bin/netconf/stack.hh
+++ b/src/bin/netconf/stack.hh
@@ -1,4 +1,4 @@
-// Generated 201809281126
+// Generated 201810092120
// A Bison parser, made by GNU Bison 3.0.5.
// Stack handling for Bison parsers in C++
diff --git a/src/bin/netconf/tests/netconf_cfg_mgr_unittests.cc b/src/bin/netconf/tests/netconf_cfg_mgr_unittests.cc
index c08156245a..d463439103 100644
--- a/src/bin/netconf/tests/netconf_cfg_mgr_unittests.cc
+++ b/src/bin/netconf/tests/netconf_cfg_mgr_unittests.cc
@@ -12,11 +12,13 @@
#include <process/testutils/d_test_stubs.h>
#include <process/d_cfg_mgr.h>
#include <yang/yang_models.h>
+#include <testutils/test_to_element.h>
#include <netconf/tests/test_libraries.h>
#include <boost/scoped_ptr.hpp>
#include <gtest/gtest.h>
using namespace std;
+using namespace isc;
using namespace isc::netconf;
using namespace isc::config;
using namespace isc::data;
@@ -135,6 +137,59 @@ TEST(NetconfCfgMgr, contextHookParams) {
EXPECT_EQ(libs.get(), stored_libs.get());
}
+// Tests if the context can store and retrieve globals.
+TEST(NetconfCfgMgr, contextGlobals) {
+ NetconfConfig ctx;
+
+ // By default there should be no globals.
+ ConstElementPtr globals = ctx.getConfiguredGlobals();
+ ASSERT_TRUE(globals);
+ ASSERT_EQ(Element::map, globals->getType());
+ EXPECT_EQ(0, globals->mapValue().size());
+
+ // Attempting to extract globals from a non-map should throw.
+ ASSERT_THROW(ctx.extractConfiguredGlobals(Element::create(777)), BadValue);
+
+ // Now let's create a configuration from which to extract global scalars.
+ // Extraction (currently) has no business logic, so the elements we use
+ // can be arbitrary.
+ ConstElementPtr global_cfg;
+ string global_cfg_str =
+ "{\n"
+ " \"astring\": \"okay\",\n"
+ " \"amap\": { \"not-this\":777, \"not-that\": \"poo\" },\n"
+ " \"anint\": 444,\n"
+ " \"alist\": [ 1, 2, 3 ],\n"
+ " \"abool\": true\n"
+ "}\n";
+ ASSERT_NO_THROW(global_cfg = Element::fromJSON(global_cfg_str));
+
+ // Extract globals from the config.
+ ASSERT_NO_THROW(ctx.extractConfiguredGlobals(global_cfg));
+
+ // Now see if the extract was correct.
+ globals = ctx.getConfiguredGlobals();
+ ASSERT_TRUE(globals);
+ ASSERT_EQ(Element::map, globals->getType());
+ EXPECT_NE(0, globals->mapValue().size());
+
+ // Maps and lists should be excluded.
+ for (auto it : globals->mapValue()) {
+ if (it.first == "astring") {
+ ASSERT_EQ(Element::string, it.second->getType());
+ EXPECT_EQ("okay", it.second->stringValue());
+ } else if (it.first == "anint") {
+ ASSERT_EQ(Element::integer, it.second->getType());
+ EXPECT_EQ(444, it.second->intValue());
+ } else if (it.first == "abool") {
+ ASSERT_EQ(Element::boolean, it.second->getType());
+ EXPECT_TRUE(it.second->boolValue());
+ } else {
+ ADD_FAILURE() << "unexpected element found:" << it.first;
+ }
+ }
+}
+
/// Netconf configurations used in tests.
const char* NETCONF_CONFIGS[] = {
@@ -143,12 +198,17 @@ const char* NETCONF_CONFIGS[] = {
// Configuration 1: global parameters only (no server, not hooks)
"{\n"
+ " \"boot-update\": false,\n"
+ " \"subscribe-changes\": false,\n"
+ " \"validate-changes\": false\n"
"}",
// Configuration 2: 1 server
"{\n"
+ " \"boot-update\": false,\n"
" \"managed-servers\": {\n"
" \"dhcp4\": {\n"
+ " \"boot-update\": true,\n"
" \"control-socket\": {\n"
" \"socket-name\": \"/tmp/socket-v4\"\n"
" }\n"
@@ -158,8 +218,10 @@ const char* NETCONF_CONFIGS[] = {
// Configuration 3: all 4 servers
"{\n"
+ " \"boot-update\": false,\n"
" \"managed-servers\": {\n"
" \"dhcp4\": {\n"
+ " \"boot-update\": true,\n"
" \"control-socket\": {\n"
" \"socket-name\": \"/tmp/socket-v4\"\n"
" }\n"
@@ -170,6 +232,7 @@ const char* NETCONF_CONFIGS[] = {
" }\n"
" },\n"
" \"d2\": {\n"
+ " \"subscribe-changes\": false,\n"
" \"control-socket\": {\n"
" \"socket-name\": \"/tmp/socket-d2\"\n"
" }\n"
@@ -207,6 +270,7 @@ const char* NETCONF_CONFIGS[] = {
"{\n"
" \"managed-servers\": {\n"
" \"d2\": {\n"
+ " \"subscribe-changes\": false,\n"
" \"control-socket\": {\n"
" \"socket-name\": \"/tmp/socket-d2\"\n"
" }\n"
@@ -255,6 +319,9 @@ const char* NETCONF_CONFIGS[] = {
// Configuration 9: empty control socket
"{\n"
+ " \"boot-update\": false,\n"
+ " \"subscribe-changes\": false,\n"
+ " \"validate-changes\": false,\n"
" \"managed-servers\": {\n"
" \"dhcp4\": {\n"
" \"control-socket\": {\n"
@@ -354,6 +421,13 @@ TEST_F(NetconfParserTest, configParseGlobalOnly) {
ASSERT_TRUE(ctx);
ASSERT_TRUE(ctx->getCfgServersMap());
EXPECT_EQ(0, ctx->getCfgServersMap()->size());
+ ConstElementPtr globals = ctx->getConfiguredGlobals();
+ ASSERT_TRUE(globals);
+ string expected = "{ "
+ "\"boot-update\": false, "
+ "\"subscribe-changes\": false, "
+ "\"validate-changes\": false }";
+ EXPECT_EQ(expected, globals->str());
}
// Tests if an empty (i.e. without a control socket) can be configured.
@@ -369,6 +443,10 @@ TEST_F(NetconfParserTest, configParseEmptyCfgServer) {
CfgServerPtr server = ctx->getCfgServersMap()->at("dhcp4");
ASSERT_TRUE(server);
EXPECT_EQ(KEA_DHCP4_SERVER, server->getModel());
+ // Defaults.
+ EXPECT_TRUE(server->getBootUpdate());
+ EXPECT_TRUE(server->getSubscribeChanges());
+ EXPECT_TRUE(server->getValidateChanges());
CfgControlSocketPtr socket = server->getCfgControlSocket();
EXPECT_FALSE(socket);
}
@@ -386,6 +464,10 @@ TEST_F(NetconfParserTest, configParseDefaults) {
CfgServerPtr server = ctx->getCfgServersMap()->at("dhcp4");
ASSERT_TRUE(server);
EXPECT_EQ(KEA_DHCP4_SERVER, server->getModel());
+ // Globals overwrite defaults.
+ EXPECT_FALSE(server->getBootUpdate());
+ EXPECT_FALSE(server->getSubscribeChanges());
+ EXPECT_FALSE(server->getValidateChanges());
CfgControlSocketPtr socket = server->getCfgControlSocket();
ASSERT_TRUE(socket);
@@ -407,6 +489,10 @@ TEST_F(NetconfParserTest, configParseServerDhcp4) {
CfgServerPtr server = ctx->getCfgServersMap()->at("dhcp4");
ASSERT_TRUE(server);
EXPECT_EQ(KEA_DHCP4_SERVER, server->getModel());
+ // Locals overwrite globals.
+ EXPECT_TRUE(server->getBootUpdate());
+ EXPECT_TRUE(server->getSubscribeChanges());
+ EXPECT_TRUE(server->getValidateChanges());
CfgControlSocketPtr socket = server->getCfgControlSocket();
ASSERT_TRUE(socket);
EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType());
@@ -426,6 +512,9 @@ TEST_F(NetconfParserTest, configParseServerD2) {
CfgServerPtr server = ctx->getCfgServersMap()->at("d2");
ASSERT_TRUE(server);
EXPECT_EQ(KEA_DHCP_DDNS, server->getModel());
+ EXPECT_TRUE(server->getBootUpdate());
+ EXPECT_FALSE(server->getSubscribeChanges());
+ EXPECT_TRUE(server->getValidateChanges());
CfgControlSocketPtr socket = server->getCfgControlSocket();
ASSERT_TRUE(socket);
EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType());
@@ -466,6 +555,9 @@ TEST_F(NetconfParserTest, configParse4Servers) {
CfgServerPtr server = ctx->getCfgServersMap()->at("dhcp4");
ASSERT_TRUE(server);
EXPECT_EQ(KEA_DHCP4_SERVER, server->getModel());
+ EXPECT_TRUE(server->getBootUpdate());
+ EXPECT_TRUE(server->getSubscribeChanges());
+ EXPECT_TRUE(server->getValidateChanges());
CfgControlSocketPtr socket = server->getCfgControlSocket();
ASSERT_TRUE(socket);
EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType());
@@ -477,6 +569,9 @@ TEST_F(NetconfParserTest, configParse4Servers) {
ASSERT_TRUE(server);
EXPECT_EQ(KEA_DHCP6_SERVER, server->getModel());
socket = server->getCfgControlSocket();
+ EXPECT_FALSE(server->getBootUpdate());
+ EXPECT_TRUE(server->getSubscribeChanges());
+ EXPECT_TRUE(server->getValidateChanges());
ASSERT_TRUE(socket);
EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType());
EXPECT_EQ("/tmp/socket-v6", socket->getName());
@@ -486,6 +581,9 @@ TEST_F(NetconfParserTest, configParse4Servers) {
server = ctx->getCfgServersMap()->at("d2");
ASSERT_TRUE(server);
EXPECT_EQ(KEA_DHCP_DDNS, server->getModel());
+ EXPECT_FALSE(server->getBootUpdate());
+ EXPECT_FALSE(server->getSubscribeChanges());
+ EXPECT_TRUE(server->getValidateChanges());
socket = server->getCfgControlSocket();
ASSERT_TRUE(socket);
EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType());
@@ -496,11 +594,69 @@ TEST_F(NetconfParserTest, configParse4Servers) {
server = ctx->getCfgServersMap()->at("ca");
ASSERT_TRUE(server);
EXPECT_EQ(KEA_CTRL_AGENT, server->getModel());
+ EXPECT_FALSE(server->getBootUpdate());
+ EXPECT_TRUE(server->getSubscribeChanges());
+ EXPECT_TRUE(server->getValidateChanges());
socket = server->getCfgControlSocket();
ASSERT_TRUE(socket);
EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType());
EXPECT_EQ("/tmp/socket-ca", socket->getName());
EXPECT_EQ("http://127.0.0.1:8000/", socket->getUrl().toText());
+
+ // Check unparsing.
+ string expected = "{\n"
+ " \"Netconf\": {\n"
+ " \"boot-update\": false,\n"
+ " \"managed-servers\": {\n"
+ " \"dhcp4\": {\n"
+ " \"model\": \"kea-dhcp4-server\",\n"
+ " \"boot-update\": true,\n"
+ " \"subscribe-changes\": true,\n"
+ " \"validate-changes\": true,\n"
+ " \"control-socket\": {\n"
+ " \"socket-type\": \"stdout\",\n"
+ " \"socket-name\": \"/tmp/socket-v4\",\n"
+ " \"socket-url\": \"http://127.0.0.1:8000/\"\n"
+ " }\n"
+ " },\n"
+ " \"dhcp6\": {\n"
+ " \"model\": \"kea-dhcp6-server\",\n"
+ " \"boot-update\": false,\n"
+ " \"subscribe-changes\": true,\n"
+ " \"validate-changes\": true,\n"
+ " \"control-socket\": {\n"
+ " \"socket-type\": \"stdout\",\n"
+ " \"socket-name\": \"/tmp/socket-v6\",\n"
+ " \"socket-url\": \"http://127.0.0.1:8000/\"\n"
+ " }\n"
+ " },\n"
+ " \"d2\": {\n"
+ " \"model\": \"kea-dhcp-ddns\",\n"
+ " \"boot-update\": false,\n"
+ " \"subscribe-changes\": false,\n"
+ " \"validate-changes\": true,\n"
+ " \"control-socket\": {\n"
+ " \"socket-type\": \"stdout\",\n"
+ " \"socket-name\": \"/tmp/socket-d2\",\n"
+ " \"socket-url\": \"http://127.0.0.1:8000/\"\n"
+ " }\n"
+ " },\n"
+ " \"ca\": {\n"
+ " \"model\": \"kea-ctrl-agent\",\n"
+ " \"boot-update\": false,\n"
+ " \"subscribe-changes\": true,\n"
+ " \"validate-changes\": true,\n"
+ " \"control-socket\": {\n"
+ " \"socket-type\": \"stdout\",\n"
+ " \"socket-name\": \"/tmp/socket-ca\",\n"
+ " \"socket-url\": \"http://127.0.0.1:8000/\"\n"
+ " }\n"
+ " }\n"
+ " },\n"
+ " \"hooks-libraries\": [ ]\n"
+ " }\n"
+ "}";
+ isc::test::runToElementTest<NetconfConfig>(expected, *ctx);
}
// Tests the handling of invalid socket URL.
diff --git a/src/bin/netconf/tests/netconf_controller_unittests.cc b/src/bin/netconf/tests/netconf_controller_unittests.cc
index 12c80a2e52..1b26a9f198 100644
--- a/src/bin/netconf/tests/netconf_controller_unittests.cc
+++ b/src/bin/netconf/tests/netconf_controller_unittests.cc
@@ -24,6 +24,8 @@ namespace {
/// @brief Valid Netconf Config used in tests.
const char* valid_netconf_config =
"{"
+ " \"boot-update\": false,"
+ " \"subscribe-changes\": false,"
" \"managed-servers\": {"
" \"dhcp4\": {"
" \"control-socket\": {"
diff --git a/src/bin/netconf/tests/netconf_tests.sh.in b/src/bin/netconf/tests/netconf_tests.sh.in
index f7ab35bb04..50143d04a9 100644
--- a/src/bin/netconf/tests/netconf_tests.sh.in
+++ b/src/bin/netconf/tests/netconf_tests.sh.in
@@ -8,7 +8,6 @@
CFG_FILE=@abs_top_builddir@/src/bin/netconf/tests/test_config.json
# Path to the Kea log file.
LOG_FILE=@abs_top_builddir@/src/bin/netconf/tests/test.log
-# Path to the Kea lease file.
# Expected version
EXPECTED_VERSION="@PACKAGE_VERSION@"
@@ -16,7 +15,13 @@ EXPECTED_VERSION="@PACKAGE_VERSION@"
CONFIG="{
\"Netconf\":
{
- // some configuration will be stored here eventually.
+ \"managed-servers\":
+ {
+ \"dhcp4\":
+ {
+ \"comment\": \"simply use defaults...\"
+ }
+ }
},
\"Logging\":
@@ -35,6 +40,32 @@ CONFIG="{
}
}"
+# Invalid configuration (syntax error) to check that Kea can check syntax.
+CONFIG_BAD_SYNTAX="{
+ \"Netconf\":
+ {
+ \"boot-update\": BOGUS
+ }
+}"
+
+# Invalid configuration (invalid url) to check that Kea can check syntax.
+CONFIG_BAD_VALUE="{
+ \"Netconf\":
+ {
+ \"managed-servers\":
+ {
+ \"dhcp4\":
+ {
+ \"control-socket\":
+ {
+ \"socket-type\": \"http\",
+ \"socket-url\": \"BOGUS\"
+ }
+ }
+ }
+ }
+}"
+
# Set the location of the executable.
bin="kea-netconf"
bin_path=@abs_top_builddir@/src/bin/netconf
@@ -67,14 +98,99 @@ usage_test() {
test_finish 0
}
+# This test verifies that syntax checking works properly. This function
+# requires 3 parameters:
+# testname
+# config - string with a content of the config (will be written to a file)
+# exp_code - expected exit code returned by kea (0 - success, 1 - failure)
+syntax_check_test() {
+ local TESTNAME="${1}"
+ local CONFIG="${2}"
+ local EXP_CODE="${3}"
+
+ # Log the start of the test and print test name.
+ test_start $TESTNAME
+ # Remove dangling Kea instances and remove log files.
+ cleanup
+ # Create correct configuration file.
+ create_config "${CONFIG}"
+ # Check it
+ printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\""
+ ${bin_path}/${bin} -t ${CFG_FILE}
+ exit_code=$?
+ if [ ${exit_code} -ne $EXP_CODE ]; then
+ printf "ERROR: expected exit code ${EXP_CODE}, got ${exit_code}\n"
+ clean_exit 1
+ fi
+ test_finish 0
+}
+
+# This test verifies that Netconf Agent is shut down gracefully when it
+# receives a SIGINT or SIGTERM signal.
+shutdown_test() {
+ test_name=${1} # Test name
+ signum=${2} # Signal number
+ # Log the start of the test and print test name.
+ test_start ${test_name}
+ # Remove dangling Netconf instances and remove log files.
+ cleanup
+ # Create new configuration file.
+ create_config "${CONFIG}"
+ # Instruct Netconf Agent to log to the specific file.
+ set_logger
+ # Start Netconf Agent.
+ start_kea ${bin_path}/${bin}
+ # Wait up to 20s for Netconf Agent to start.
+ wait_for_kea 20
+ if [ ${_WAIT_FOR_KEA} -eq 0 ]; then
+ printf "ERROR: timeout waiting for Netconf Agent to start.\n"
+ clean_exit 1
+ fi
+
+ # Check if it is still running. It could have terminated (e.g. as a result
+ # of configuration failure).
+ get_pid ${bin}
+ if [ ${_GET_PIDS_NUM} -ne 1 ]; then
+ printf "ERROR: expected one Netconf Agent process to be started. Found %d processes\
+ started.\n" ${_GET_PIDS_NUM}
+ clean_exit 1
+ fi
+
+ # Check in the log file, how many times server has been configured.
+ # It should be just once on startup.
+ get_reconfigs
+ if [ ${_GET_RECONFIGS} -ne 1 ]; then
+ printf "ERROR: server been configured ${_GET_RECONFIGS} time(s), but exactly 1 was expected.\n"
+ clean_exit 1
+ else
+ printf "Server successfully configured.\n"
+ fi
+
+ # Send signal to Netconf Agent (SIGTERM, SIGINT etc.)
+ send_signal ${signum} ${bin}
+
+ # Now wait for process to log that it is exiting.
+ wait_for_message 10 "DCTL_SHUTDOWN" 1
+ if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then
+ printf "ERROR: Netconf Agent did not log shutdown.\n"
+ clean_exit 1
+ fi
+
+ # Make sure the server is down.
+ wait_for_server_down 5 ${bin}
+ assert_eq 1 ${_WAIT_FOR_SERVER_DOWN} \
+ "Expected wait_for_server_down return %d, returned %d"
+
+ test_finish 0
+}
version_test "netconf.version"
usage_test "netconf.invalid-param" "-f" 1
usage_test "netconf.dash-h" "-h" 1
usage_test "netconf.dash-v" "-v" 0
-
-# The following tests are currently disabled. Once we have a parser that is
-# able to understand logger configuration, those tests (imported from DHCPv4)
-# should work.
-#shutdown_test "netconf.sigterm_test" 15
-#shutdown_test "netconf.sigint_test" 2
+shutdown_test "netconf.sigterm_test" 15
+shutdown_test "netconf.sigint_test" 2
+logger_vars_test "netconf.variables"
+syntax_check_test "netconf.syntax_check_success" "${CONFIG}" 0
+syntax_check_test "netconf.syntax_check_bad_syntax" "${CONFIG_BAD_SYNTAX}" 1
+syntax_check_test "netconf.syntax_check_bad_values" "${CONFIG_BAD_VALUE}" 1
diff --git a/src/bin/netconf/tests/parser_unittests.cc b/src/bin/netconf/tests/parser_unittests.cc
index 0bcd33829d..f3d8ff2b5b 100644
--- a/src/bin/netconf/tests/parser_unittests.cc
+++ b/src/bin/netconf/tests/parser_unittests.cc
@@ -124,9 +124,15 @@ TEST(ParserTest, keywordJSON) {
// be parsed with syntactic checking (and as pure JSON).
TEST(ParserTest, keywordNetconf) {
string txt = "{ \"Netconf\": {\n"
+ " \"boot-update\": true,"
+ " \"subscribe-changes\": true,"
+ " \"validate-changes\": true,"
" \"managed-servers\": {"
" \"dhcp4\": {"
" \"model\": \"kea-dhcp4-server\","
+ " \"boot-update\": false,"
+ " \"subscribe-changes\": false,"
+ " \"validate-changes\": false,"
" \"control-socket\": {"
" \"socket-type\": \"unix\","
" \"socket-name\": \"/path/to/the/unix/socket-v4\""
@@ -134,6 +140,9 @@ TEST(ParserTest, keywordNetconf) {
" },"
" \"dhcp6\": {"
" \"model\": \"kea-dhcp6-server\","
+ " \"boot-update\": false,"
+ " \"subscribe-changes\": false,"
+ " \"validate-changes\": false,"
" \"control-socket\": {"
" \"socket-type\": \"http\","
" \"socket-url\": \"http://127.0.0.1:12345/\""
@@ -141,12 +150,18 @@ TEST(ParserTest, keywordNetconf) {
" },"
" \"d2\": {"
" \"model\": \"kea-dhcp-ddns\","
+ " \"boot-update\": false,"
+ " \"subscribe-changes\": false,"
+ " \"validate-changes\": false,"
" \"control-socket\": {"
" \"socket-type\": \"stdout\""
" }"
" },"
" \"ca\": {"
" \"model\": \"kea-ctrl-agent\","
+ " \"boot-update\": false,"
+ " \"subscribe-changes\": false,"
+ " \"validate-changes\": false,"
" \"control-socket\": {"
" \"socket-type\": \"http\","
" \"user-context\": { \"use default\": true }"
@@ -174,9 +189,15 @@ TEST(ParserTest, keywordSubNetconf) {
// This is similar to previous test, but note the lack of outer
// map and Netconf.
string txt = "{\n"
+ " \"boot-update\": true,"
+ " \"subscribe-changes\": true,"
+ " \"validate-changes\": true,"
" \"managed-servers\": {"
" \"dhcp4\": {"
" \"model\": \"kea-dhcp4-server\","
+ " \"boot-update\": false,"
+ " \"subscribe-changes\": false,"
+ " \"validate-changes\": false,"
" \"control-socket\": {"
" \"socket-type\": \"unix\","
" \"socket-name\": \"/path/to/the/unix/socket-v4\""
@@ -184,6 +205,9 @@ TEST(ParserTest, keywordSubNetconf) {
" },"
" \"dhcp6\": {"
" \"model\": \"kea-dhcp6-server\","
+ " \"boot-update\": false,"
+ " \"subscribe-changes\": false,"
+ " \"validate-changes\": false,"
" \"control-socket\": {"
" \"socket-type\": \"http\","
" \"socket-url\": \"http://127.0.0.1:12345/\""
@@ -191,13 +215,18 @@ TEST(ParserTest, keywordSubNetconf) {
" },"
" \"d2\": {"
" \"model\": \"kea-dhcp-ddns\","
+ " \"boot-update\": false,"
+ " \"subscribe-changes\": false,"
+ " \"validate-changes\": false,"
" \"control-socket\": {"
" \"socket-type\": \"stdout\""
" }"
" },"
" \"ca\": {"
" \"model\": \"kea-ctrl-agent\","
- " \"model\": \"kea-dhcp6-server\","
+ " \"boot-update\": false,"
+ " \"subscribe-changes\": false,"
+ " \"validate-changes\": false,"
" \"control-socket\": {"
" \"socket-type\": \"http\","
" \"user-context\": { \"use default\": true }"
diff --git a/src/bin/netconf/tests/testdata/get_config.json b/src/bin/netconf/tests/testdata/get_config.json
index 02185fa42f..42645769c3 100644
--- a/src/bin/netconf/tests/testdata/get_config.json
+++ b/src/bin/netconf/tests/testdata/get_config.json
@@ -1,5 +1,6 @@
{
"Netconf": {
+ "boot-update": false,
"hooks-libraries": [
{
"library": "/tmp/ky/src/bin/netconf/tests/.libs/libbasic.so",
@@ -10,14 +11,18 @@
],
"managed-servers": {
"ca": {
+ "boot-update": false,
"control-socket": {
"socket-name": "",
"socket-type": "http",
"socket-url": "http://127.0.0.1:8000/"
},
- "model": "kea-ctrl-agent"
+ "model": "kea-ctrl-agent",
+ "subscribe-changes": true,
+ "validate-changes": true
},
"d2": {
+ "boot-update": false,
"control-socket": {
"socket-name": "",
"socket-type": "stdout",
@@ -26,24 +31,32 @@
"in-use": false
}
},
- "model": "kea-dhcp-ddns"
+ "model": "kea-dhcp-ddns",
+ "subscribe-changes": true,
+ "validate-changes": true
},
"dhcp4": {
"comment": "DHCP4 server",
+ "boot-update": false,
"control-socket": {
- "socket-name": "/path/to/the/unix/socket-v4",
+ "socket-name": "/tmp/kea4-ctrl-socket",
"socket-type": "unix",
"socket-url": "http://127.0.0.1:8000/"
},
- "model": "kea-dhcp4-server"
+ "model": "kea-dhcp4-server",
+ "subscribe-changes": true,
+ "validate-changes": true
},
"dhcp6": {
+ "boot-update": false,
"control-socket": {
- "socket-name": "/path/to/the/unix/socket-v6",
+ "socket-name": "/tmp/kea6-ctrl-socket",
"socket-type": "unix",
"socket-url": "http://127.0.0.1:8000/"
},
- "model": "kea-dhcp6-server"
+ "model": "kea-dhcp6-server",
+ "subscribe-changes": true,
+ "validate-changes": true
}
}
}