ObjectSets


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1107 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c
index b1cce69..29919a1 100644
--- a/libasn1parser/asn1p_expr.c
+++ b/libasn1parser/asn1p_expr.c
@@ -176,16 +176,31 @@
 	if(!target)
 		return NULL;	/* errno's are compatible */
 
-	if(!target->value) {
-		fprintf(stderr,
-		"FATAL: Parameterization did not resolve value reference "
-		"at line %d", ref->_lineno);
-		asn1p_expr_free(target);
+	if(target->meta_type == AMT_VALUE) {
+		if(!target->value) {
+			fprintf(stderr,
+			"FATAL: Parameterization did not resolve "
+			"value reference at line %d\n", ref->_lineno);
+			asn1p_expr_free(target);
+			errno = EPERM;
+			return NULL;
+		}
+		cval = asn1p_value_clone(target->value);
+	} else if(target->meta_type == AMT_VALUESET) {
+		if(!target->constraints) {
+			fprintf(stderr,
+			"FATAL: Parameterization did not resolve "
+			"value set reference at line %d\n", ref->_lineno);
+			asn1p_expr_free(target);
+			errno = EPERM;
+			return NULL;
+		}
+		cval = asn1p_value_fromconstr(target->constraints, 1);
+	} else {
 		errno = EPERM;
-		return NULL;
+		cval = NULL;
 	}
 
-	cval = asn1p_value_clone(target->value);
 	asn1p_expr_free(target);
 	return cval;
 }
diff --git a/libasn1parser/asn1p_value.c b/libasn1parser/asn1p_value.c
index 6686e49..cafc1f9 100644
--- a/libasn1parser/asn1p_value.c
+++ b/libasn1parser/asn1p_value.c
@@ -30,6 +30,30 @@
 }
 
 asn1p_value_t *
+asn1p_value_fromconstr(asn1p_constraint_t *ct, int do_copy) {
+	if(ct) {
+		asn1p_value_t *v = calloc(1, sizeof *v);
+		if(v) {
+			if(do_copy) {
+				v->value.constraint
+					= asn1p_constraint_clone(ct);
+				if(v->value.constraint == NULL) {
+					free(v);
+					return NULL;
+				}
+			} else {
+				v->value.constraint = ct;
+			}
+			v->type = ATV_VALUESET;
+		}
+		return v;
+	} else {
+		errno = EINVAL;
+		return NULL;
+	}
+}
+
+asn1p_value_t *
 asn1p_value_frombits(uint8_t *bits, int size_in_bits, int do_copy) {
 	if(bits) {
 		asn1p_value_t *v = calloc(1, sizeof *v);
@@ -155,6 +179,13 @@
 				else if(errno != ESRCH) return NULL;
 			}
 			return asn1p_value_fromref(v->value.reference, 1);
+		case ATV_VALUESET:
+			if(resolver) {
+				clone = resolver(v, rarg);
+				if(clone) return clone;
+				else if(errno != ESRCH) return NULL;
+			}
+			return asn1p_value_fromconstr(v->value.constraint, 1);
 		case ATV_CHOICE_IDENTIFIER: {
 			char *id = v->value.choice_identifier.identifier;
 			clone = calloc(1, sizeof(*clone));
@@ -204,6 +235,9 @@
 		case ATV_REFERENCED:
 			asn1p_ref_free(v->value.reference);
 			break;
+		case ATV_VALUESET:
+			asn1p_constraint_free(v->value.constraint);
+			break;
 		case ATV_CHOICE_IDENTIFIER:
 			free(v->value.choice_identifier.identifier);
 			asn1p_value_free(v->value.choice_identifier.value);
diff --git a/libasn1parser/asn1p_value.h b/libasn1parser/asn1p_value.h
index 5705f74..1b5bbee 100644
--- a/libasn1parser/asn1p_value.h
+++ b/libasn1parser/asn1p_value.h
@@ -4,6 +4,8 @@
 #ifndef	ASN1_PARSER_VALUE_H
 #define	ASN1_PARSER_VALUE_H
 
+struct asn1p_constraint_s;	/* Forward declaration */
+
 /*
  * A wrapper around various kinds of values.
  */
@@ -25,11 +27,13 @@
 		ATV_STRING,	/* "abcdef" */
 		ATV_UNPARSED,
 		ATV_BITVECTOR,
+		ATV_VALUESET,	/* { 1 | 2 | 3 } */
 		ATV_REFERENCED,	/* Reference to a value defined elsewhere */
 		ATV_CHOICE_IDENTIFIER,	/* ChoiceIdentifier value */
 	} type;	/* Value type and location */
 
 	union {
+		struct asn1p_constraint_s *constraint;	/* ValueSet */
 		asn1p_ref_t	*reference;
 		asn1c_integer_t	 v_integer;
 		double		 v_double;
@@ -59,6 +63,7 @@
  */
 void asn1p_value_free(asn1p_value_t *);
 asn1p_value_t *asn1p_value_fromref(asn1p_ref_t *ref, int do_copy);
+asn1p_value_t *asn1p_value_fromconstr(struct asn1p_constraint_s *ct, int dc);
 asn1p_value_t *asn1p_value_frombits(uint8_t *bits, int size_in_bits, int dc);
 asn1p_value_t *asn1p_value_frombuf(char *buffer, int size, int do_copy);
 asn1p_value_t *asn1p_value_fromdouble(double);
diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c
index 9bbad6e..e9be56f 100644
--- a/libasn1parser/asn1p_y.c
+++ b/libasn1parser/asn1p_y.c
@@ -223,7 +223,7 @@
 
 
 
-#define	YYFINAL		444
+#define	YYFINAL		448
 #define	YYFLAG		-32768
 #define	YYNTBASE	120
 
@@ -276,29 +276,29 @@
     79,    81,    82,    86,    88,    92,    95,    97,   100,   101,
    103,   108,   110,   114,   116,   120,   122,   126,   130,   133,
    135,   139,   141,   145,   147,   151,   156,   158,   160,   165,
-   169,   173,   180,   182,   186,   188,   192,   196,   200,   202,
-   206,   208,   210,   212,   213,   215,   217,   221,   225,   228,
-   232,   234,   236,   240,   243,   245,   247,   253,   254,   256,
-   258,   262,   265,   270,   274,   278,   282,   286,   290,   291,
-   293,   294,   301,   303,   306,   308,   310,   312,   316,   318,
-   322,   326,   330,   331,   334,   336,   341,   346,   351,   358,
-   365,   367,   372,   376,   378,   382,   386,   390,   392,   396,
-   398,   402,   404,   406,   408,   410,   414,   418,   420,   425,
-   427,   429,   433,   434,   438,   440,   442,   444,   446,   448,
-   450,   452,   454,   458,   460,   462,   464,   466,   469,   471,
-   473,   475,   477,   480,   483,   485,   487,   490,   493,   495,
-   497,   499,   501,   503,   506,   508,   511,   513,   515,   517,
-   519,   521,   523,   525,   527,   529,   531,   533,   535,   537,
-   539,   541,   543,   545,   547,   549,   550,   552,   554,   559,
-   563,   568,   570,   574,   580,   582,   586,   590,   594,   598,
-   603,   607,   609,   611,   615,   619,   623,   627,   629,   631,
-   632,   638,   640,   643,   646,   650,   652,   654,   656,   658,
-   660,   662,   664,   666,   670,   676,   678,   682,   684,   688,
-   689,   691,   693,   695,   697,   699,   701,   705,   710,   712,
-   716,   719,   723,   725,   729,   730,   732,   734,   737,   740,
-   744,   746,   750,   752,   757,   762,   764,   766,   768,   770,
-   771,   773,   776,   781,   782,   784,   786,   788,   789,   791,
-   793,   795,   797,   799,   800,   802
+   169,   173,   180,   187,   189,   193,   195,   199,   203,   207,
+   211,   213,   217,   219,   221,   223,   225,   226,   228,   230,
+   234,   238,   241,   245,   247,   249,   253,   256,   258,   260,
+   266,   267,   269,   271,   275,   278,   283,   287,   291,   295,
+   299,   303,   304,   306,   307,   314,   316,   319,   321,   323,
+   325,   329,   331,   335,   339,   343,   344,   347,   349,   354,
+   359,   364,   371,   378,   380,   385,   389,   391,   395,   399,
+   403,   405,   409,   411,   415,   417,   419,   421,   423,   427,
+   431,   433,   438,   440,   442,   446,   447,   451,   453,   455,
+   457,   459,   461,   463,   465,   467,   471,   473,   475,   477,
+   479,   482,   484,   486,   488,   490,   493,   496,   498,   500,
+   503,   506,   508,   510,   512,   514,   516,   519,   521,   524,
+   526,   528,   530,   532,   534,   536,   538,   540,   542,   544,
+   546,   548,   550,   552,   554,   556,   558,   560,   562,   563,
+   565,   567,   572,   576,   581,   583,   585,   589,   595,   597,
+   601,   605,   609,   613,   618,   622,   624,   626,   630,   634,
+   638,   642,   644,   646,   647,   653,   655,   658,   661,   665,
+   667,   669,   671,   673,   675,   677,   679,   681,   685,   691,
+   693,   697,   699,   703,   704,   706,   708,   710,   712,   714,
+   716,   720,   725,   727,   731,   734,   738,   740,   744,   745,
+   747,   749,   752,   755,   759,   761,   765,   767,   772,   777,
+   779,   781,   783,   785,   786,   788,   791,   796,   797,   799,
+   801,   803,   804,   806,   808,   810,   812,   814,   815,   817
 };
 
 static const short yyrhs[] = {   121,
@@ -319,70 +319,71 @@
    223,   107,   108,     0,   226,     0,   107,   193,   108,     0,
    223,   145,     3,   143,     0,   185,     0,   170,     0,   170,
    107,   149,   108,     0,   223,     3,   166,     0,   223,     3,
-   156,     0,   223,   107,   147,   108,     3,   166,     0,   148,
-     0,   147,   112,   148,     0,   223,     0,   223,   113,   226,
-     0,   223,   113,   223,     0,   183,   113,   226,     0,   150,
-     0,   149,   112,   150,     0,   166,     0,   179,     0,   226,
-     0,     0,   152,     0,   153,     0,   152,   112,   153,     0,
-   226,   166,   212,     0,   166,   212,     0,    34,    72,   166,
-     0,   165,     0,   155,     0,   154,   112,   155,     0,   226,
-   166,     0,   165,     0,   166,     0,    32,   107,   158,   108,
-   160,     0,     0,    92,     0,   159,     0,   158,   112,   159,
-     0,    16,   212,     0,    17,   166,   157,   212,     0,    17,
-   174,   212,     0,    17,   175,   212,     0,    16,   174,   212,
-     0,    16,   166,   212,     0,    16,   175,   212,     0,     0,
-   161,     0,     0,    99,    86,   107,   162,   163,   108,     0,
-   164,     0,   163,   164,     0,     4,     0,    18,     0,   173,
-     0,   114,   163,   115,     0,   106,     0,   106,   116,   180,
-     0,   106,   116,   217,     0,   218,   168,   190,     0,     0,
-   167,   169,     0,   145,     0,    31,   107,   154,   108,     0,
-    82,   107,   151,   108,     0,    83,   107,   151,   108,     0,
-    82,   190,    72,   225,   218,   168,     0,    83,   190,    72,
-   225,   218,   168,     0,    22,     0,    22,    39,    29,   226,
-     0,    60,    72,   170,     0,    14,     0,    14,   117,   223,
-     0,   224,   117,   223,     0,    14,   117,   226,     0,   224,
-     0,   224,   117,   171,     0,   172,     0,   171,   117,   172,
-     0,   173,     0,    16,     0,    17,     0,    16,     0,   174,
-   117,    16,     0,   174,   117,    17,     0,    15,     0,   226,
-   145,     3,   177,     0,   179,     0,   180,     0,   226,   113,
-   177,     0,     0,   107,   178,   182,     0,    67,     0,    49,
-     0,    90,     0,     6,     0,     8,     0,   181,     0,   217,
-     0,   226,     0,   223,   117,   226,     0,     7,     0,    11,
-     0,    12,     0,     5,     0,   182,     5,     0,    28,     0,
-    67,     0,    80,     0,   184,     0,    71,    85,     0,    69,
-    55,     0,    81,     0,    48,     0,    40,    75,     0,    30,
-    85,     0,    95,     0,    51,     0,   186,     0,    62,     0,
-    44,     0,    26,    85,     0,   183,     0,   184,   214,     0,
-    27,     0,    52,     0,    53,     0,    54,     0,    63,     0,
-    68,     0,    78,     0,    87,     0,    89,     0,    94,     0,
-    96,     0,    97,     0,    98,     0,    70,     0,   103,     0,
-   104,     0,   101,     0,   102,     0,   100,     0,     0,   191,
-     0,   192,     0,    84,   109,   193,   110,     0,   109,   193,
-   110,     0,   192,   109,   193,   110,     0,   194,     0,   194,
-   112,   106,     0,   194,   112,   106,   112,   194,     0,   195,
-     0,    21,   100,   195,     0,   194,   187,   195,     0,   194,
-   188,   195,     0,   195,   189,   195,     0,   198,   109,   193,
-   110,     0,   109,   193,   110,     0,   199,     0,   200,     0,
-   199,   197,   199,     0,    65,   197,   199,     0,   199,   197,
-    64,     0,    65,   197,    64,     0,   206,     0,   201,     0,
-     0,    35,    29,   107,   196,   182,     0,   105,     0,   105,
-   118,     0,   118,   105,     0,   118,   105,   118,     0,    84,
-     0,    50,     0,    49,     0,    90,     0,   217,     0,   181,
-     0,   226,     0,   223,     0,    99,    33,   192,     0,    99,
-    34,   107,   202,   108,     0,   203,     0,   202,   112,   203,
-     0,   106,     0,   226,   190,   204,     0,     0,   205,     0,
-    77,     0,    19,     0,    73,     0,   207,     0,   208,     0,
-   107,   223,   108,     0,   207,   107,   209,   108,     0,   210,
-     0,   209,   112,   210,     0,   119,   211,     0,   119,   117,
-   211,     0,   226,     0,   211,   117,   226,     0,     0,   213,
-     0,    73,     0,    37,   177,     0,   107,   108,     0,   107,
-   215,   108,     0,   216,     0,   215,   112,   216,     0,   226,
-     0,   226,   109,   217,   110,     0,   226,   109,   180,   110,
-     0,   217,     0,   106,     0,    10,     0,    13,     0,     0,
-   219,     0,   220,   222,     0,   114,   221,    10,   115,     0,
-     0,    93,     0,    23,     0,    79,     0,     0,    56,     0,
-    45,     0,    14,     0,    15,     0,    15,     0,     0,   226,
-     0,     9,     0
+   156,     0,   223,   107,   147,   108,     3,   166,     0,   223,
+   107,   147,   108,     3,   156,     0,   148,     0,   147,   112,
+   148,     0,   223,     0,   223,   113,   226,     0,   223,   113,
+   223,     0,   183,   113,   226,     0,   183,   113,   223,     0,
+   150,     0,   149,   112,   150,     0,   166,     0,   179,     0,
+   226,     0,   143,     0,     0,   152,     0,   153,     0,   152,
+   112,   153,     0,   226,   166,   212,     0,   166,   212,     0,
+    34,    72,   166,     0,   165,     0,   155,     0,   154,   112,
+   155,     0,   226,   166,     0,   165,     0,   166,     0,    32,
+   107,   158,   108,   160,     0,     0,    92,     0,   159,     0,
+   158,   112,   159,     0,    16,   212,     0,    17,   166,   157,
+   212,     0,    17,   174,   212,     0,    17,   175,   212,     0,
+    16,   174,   212,     0,    16,   166,   212,     0,    16,   175,
+   212,     0,     0,   161,     0,     0,    99,    86,   107,   162,
+   163,   108,     0,   164,     0,   163,   164,     0,     4,     0,
+    18,     0,   173,     0,   114,   163,   115,     0,   106,     0,
+   106,   116,   180,     0,   106,   116,   217,     0,   218,   168,
+   190,     0,     0,   167,   169,     0,   145,     0,    31,   107,
+   154,   108,     0,    82,   107,   151,   108,     0,    83,   107,
+   151,   108,     0,    82,   190,    72,   225,   218,   168,     0,
+    83,   190,    72,   225,   218,   168,     0,    22,     0,    22,
+    39,    29,   226,     0,    60,    72,   170,     0,    14,     0,
+    14,   117,   223,     0,   224,   117,   223,     0,    14,   117,
+   226,     0,   224,     0,   224,   117,   171,     0,   172,     0,
+   171,   117,   172,     0,   173,     0,    16,     0,    17,     0,
+    16,     0,   174,   117,    16,     0,   174,   117,    17,     0,
+    15,     0,   226,   145,     3,   177,     0,   179,     0,   180,
+     0,   226,   113,   177,     0,     0,   107,   178,   182,     0,
+    67,     0,    49,     0,    90,     0,     6,     0,     8,     0,
+   181,     0,   217,     0,   226,     0,   223,   117,   226,     0,
+     7,     0,    11,     0,    12,     0,     5,     0,   182,     5,
+     0,    28,     0,    67,     0,    80,     0,   184,     0,    71,
+    85,     0,    69,    55,     0,    81,     0,    48,     0,    40,
+    75,     0,    30,    85,     0,    95,     0,    51,     0,   186,
+     0,    62,     0,    44,     0,    26,    85,     0,   183,     0,
+   184,   214,     0,    27,     0,    52,     0,    53,     0,    54,
+     0,    63,     0,    68,     0,    78,     0,    87,     0,    89,
+     0,    94,     0,    96,     0,    97,     0,    98,     0,    70,
+     0,   103,     0,   104,     0,   101,     0,   102,     0,   100,
+     0,     0,   191,     0,   192,     0,    84,   109,   193,   110,
+     0,   109,   193,   110,     0,   192,   109,   193,   110,     0,
+   106,     0,   194,     0,   194,   112,   106,     0,   194,   112,
+   106,   112,   194,     0,   195,     0,    21,   100,   195,     0,
+   194,   187,   195,     0,   194,   188,   195,     0,   195,   189,
+   195,     0,   198,   109,   193,   110,     0,   109,   193,   110,
+     0,   199,     0,   200,     0,   199,   197,   199,     0,    65,
+   197,   199,     0,   199,   197,    64,     0,    65,   197,    64,
+     0,   206,     0,   201,     0,     0,    35,    29,   107,   196,
+   182,     0,   105,     0,   105,   118,     0,   118,   105,     0,
+   118,   105,   118,     0,    84,     0,    50,     0,    49,     0,
+    90,     0,   217,     0,   181,     0,   226,     0,   223,     0,
+    99,    33,   192,     0,    99,    34,   107,   202,   108,     0,
+   203,     0,   202,   112,   203,     0,   106,     0,   226,   190,
+   204,     0,     0,   205,     0,    77,     0,    19,     0,    73,
+     0,   207,     0,   208,     0,   107,   223,   108,     0,   207,
+   107,   209,   108,     0,   210,     0,   209,   112,   210,     0,
+   119,   211,     0,   119,   117,   211,     0,   226,     0,   211,
+   117,   226,     0,     0,   213,     0,    73,     0,    37,   177,
+     0,   107,   108,     0,   107,   215,   108,     0,   216,     0,
+   215,   112,   216,     0,   226,     0,   226,   109,   217,   110,
+     0,   226,   109,   180,   110,     0,   217,     0,   106,     0,
+    10,     0,    13,     0,     0,   219,     0,   220,   222,     0,
+   114,   221,    10,   115,     0,     0,    93,     0,    23,     0,
+    79,     0,     0,    56,     0,    45,     0,    14,     0,    15,
+     0,    15,     0,     0,   226,     0,     9,     0
 };
 
 #endif
@@ -395,29 +396,29 @@
    558,   565,   567,   579,   591,   602,   607,   613,   619,   621,
    624,   635,   641,   647,   654,   660,   668,   672,   675,   682,
    688,   694,   701,   707,   716,   718,   728,   742,   752,   768,
-   778,   794,   802,   812,   822,   827,   834,   841,   851,   857,
-   863,   867,   875,   902,   904,   906,   912,   918,   926,   932,
-   939,   944,   950,   956,   962,   965,   971,   981,   983,   986,
-   994,  1001,  1014,  1025,  1035,  1046,  1056,  1067,  1078,  1080,
-  1085,  1089,  1094,  1099,  1105,  1110,  1113,  1117,  1122,  1131,
-  1140,  1151,  1173,  1180,  1199,  1203,  1209,  1215,  1221,  1231,
-  1241,  1247,  1259,  1273,  1282,  1292,  1302,  1312,  1320,  1341,
-  1350,  1359,  1361,  1368,  1375,  1381,  1385,  1391,  1411,  1421,
-  1423,  1424,  1431,  1431,  1436,  1443,  1449,  1454,  1458,  1462,
-  1465,  1470,  1482,  1499,  1504,  1509,  1542,  1552,  1566,  1568,
-  1569,  1570,  1571,  1572,  1573,  1574,  1575,  1576,  1577,  1578,
-  1579,  1585,  1587,  1588,  1591,  1598,  1610,  1612,  1616,  1620,
-  1621,  1622,  1623,  1624,  1628,  1629,  1630,  1631,  1635,  1636,
-  1643,  1643,  1644,  1644,  1645,  1647,  1649,  1654,  1658,  1667,
-  1671,  1676,  1680,  1686,  1696,  1700,  1703,  1706,  1709,  1714,
-  1723,  1731,  1737,  1743,  1750,  1758,  1766,  1775,  1778,  1781,
-  1782,  1792,  1794,  1795,  1796,  1799,  1803,  1808,  1814,  1819,
-  1822,  1825,  1838,  1852,  1856,  1861,  1865,  1870,  1877,  1890,
-  1892,  1895,  1899,  1902,  1907,  1911,  1919,  1934,  1940,  1947,
-  1960,  1972,  1987,  1991,  2008,  2013,  2016,  2021,  2043,  2048,
-  2053,  2059,  2065,  2073,  2081,  2089,  2096,  2106,  2111,  2141,
-  2143,  2146,  2153,  2159,  2161,  2162,  2163,  2166,  2168,  2169,
-  2172,  2177,  2184,  2191,  2193,  2198
+   778,   794,   800,   807,   817,   827,   832,   839,   846,   854,
+   864,   870,   876,   880,   888,   899,   921,   923,   925,   931,
+   937,   945,   951,   958,   963,   969,   975,   981,   984,   990,
+  1000,  1002,  1005,  1013,  1020,  1033,  1044,  1054,  1065,  1075,
+  1086,  1097,  1099,  1104,  1108,  1113,  1118,  1124,  1129,  1132,
+  1136,  1141,  1150,  1159,  1170,  1192,  1199,  1218,  1222,  1228,
+  1234,  1240,  1250,  1260,  1266,  1277,  1291,  1300,  1310,  1320,
+  1330,  1338,  1359,  1368,  1377,  1379,  1386,  1393,  1399,  1403,
+  1409,  1429,  1439,  1441,  1442,  1449,  1449,  1454,  1461,  1467,
+  1472,  1476,  1480,  1483,  1488,  1500,  1517,  1522,  1527,  1560,
+  1570,  1584,  1586,  1587,  1588,  1589,  1590,  1591,  1592,  1593,
+  1594,  1595,  1596,  1597,  1603,  1605,  1606,  1609,  1616,  1628,
+  1630,  1634,  1638,  1639,  1640,  1641,  1642,  1646,  1647,  1648,
+  1649,  1653,  1654,  1661,  1661,  1662,  1662,  1663,  1665,  1667,
+  1672,  1676,  1685,  1689,  1694,  1699,  1702,  1708,  1718,  1722,
+  1725,  1728,  1731,  1736,  1745,  1753,  1759,  1765,  1772,  1780,
+  1788,  1797,  1800,  1803,  1804,  1814,  1816,  1817,  1818,  1821,
+  1825,  1830,  1836,  1841,  1844,  1847,  1860,  1874,  1878,  1883,
+  1887,  1892,  1899,  1912,  1914,  1917,  1921,  1924,  1929,  1933,
+  1941,  1956,  1962,  1969,  1982,  1994,  2009,  2013,  2030,  2035,
+  2038,  2043,  2065,  2070,  2075,  2081,  2087,  2095,  2103,  2111,
+  2118,  2128,  2133,  2163,  2165,  2168,  2175,  2181,  2183,  2184,
+  2185,  2188,  2190,  2191,  2194,  2199,  2206,  2213,  2215,  2220
 };
 #endif
 
@@ -452,7 +453,7 @@
 "ImportsBundleSet","AssignedIdentifier","ImportsBundle","ImportsList","ImportsElement",
 "ExportsDefinition","ExportsBody","ExportsElement","ValueSet","ValueSetTypeAssignment",
 "DefinedType","DataTypeReference","ParameterArgumentList","ParameterArgumentName",
-"Specializations","Specialization","optComponentTypeLists","ComponentTypeLists",
+"ActualParameterList","ActualParameter","optComponentTypeLists","ComponentTypeLists",
 "ComponentType","AlternativeTypeLists","AlternativeType","ObjectClass","optUnique",
 "FieldSpec","ClassField","optWithSyntax","WithSyntax","@2","WithSyntaxList",
 "WithSyntaxToken","ExtensionAndException","Type","NSTD_IndirectMarker","TypeDeclaration",
@@ -478,29 +479,29 @@
    132,   133,   132,   132,   134,   134,   135,   135,   136,   136,
    137,   138,   138,   139,   139,   139,   140,   140,   140,   141,
    141,   142,   142,   142,   143,   144,   145,   145,   145,   146,
-   146,   146,   147,   147,   148,   148,   148,   148,   149,   149,
-   150,   150,   150,   151,   151,   152,   152,   153,   153,   153,
-   153,   154,   154,   155,   155,   155,   156,   157,   157,   158,
-   158,   159,   159,   159,   159,   159,   159,   159,   160,   160,
-   162,   161,   163,   163,   164,   164,   164,   164,   165,   165,
-   165,   166,   167,   168,   169,   169,   169,   169,   169,   169,
-   169,   169,   169,   170,   170,   170,   170,   170,   170,   171,
-   171,   172,   173,   173,   174,   174,   174,   175,   176,   177,
-   177,   177,   178,   177,   177,   179,   179,   179,   179,   179,
-   179,   180,   180,   181,   181,   181,   182,   182,   183,   183,
-   183,   183,   183,   183,   183,   183,   183,   183,   183,   183,
-   183,   184,   184,   184,   185,   185,   186,   186,   186,   186,
+   146,   146,   146,   147,   147,   148,   148,   148,   148,   148,
+   149,   149,   150,   150,   150,   150,   151,   151,   152,   152,
+   153,   153,   153,   153,   154,   154,   155,   155,   155,   156,
+   157,   157,   158,   158,   159,   159,   159,   159,   159,   159,
+   159,   160,   160,   162,   161,   163,   163,   164,   164,   164,
+   164,   165,   165,   165,   166,   167,   168,   169,   169,   169,
+   169,   169,   169,   169,   169,   169,   170,   170,   170,   170,
+   170,   170,   171,   171,   172,   173,   173,   174,   174,   174,
+   175,   176,   177,   177,   177,   178,   177,   177,   179,   179,
+   179,   179,   179,   179,   180,   180,   181,   181,   181,   182,
+   182,   183,   183,   183,   183,   183,   183,   183,   183,   183,
+   183,   183,   183,   183,   184,   184,   184,   185,   185,   186,
    186,   186,   186,   186,   186,   186,   186,   186,   186,   186,
-   187,   187,   188,   188,   189,   190,   190,   191,   191,   192,
-   192,   193,   193,   193,   194,   194,   194,   194,   194,   195,
-   195,   195,   195,   195,   195,   195,   195,   195,   195,   196,
-   195,   197,   197,   197,   197,   198,   198,   199,   199,   199,
-   199,   199,   200,   201,   201,   202,   202,   203,   203,   204,
-   204,   205,   205,   205,   206,   206,   207,   208,   209,   209,
-   210,   210,   211,   211,   212,   212,   213,   213,   214,   214,
-   215,   215,   216,   216,   216,   216,   216,   217,   217,   218,
-   218,   219,   220,   221,   221,   221,   221,   222,   222,   222,
-   223,   223,   224,   225,   225,   226
+   186,   186,   186,   187,   187,   188,   188,   189,   190,   190,
+   191,   191,   192,   192,   193,   193,   193,   193,   194,   194,
+   194,   194,   194,   195,   195,   195,   195,   195,   195,   195,
+   195,   195,   195,   196,   195,   197,   197,   197,   197,   198,
+   198,   199,   199,   199,   199,   199,   200,   201,   201,   202,
+   202,   203,   203,   204,   204,   205,   205,   205,   206,   206,
+   207,   208,   209,   209,   210,   210,   211,   211,   212,   212,
+   213,   213,   214,   214,   215,   215,   216,   216,   216,   216,
+   216,   217,   217,   218,   218,   219,   220,   221,   221,   221,
+   221,   222,   222,   222,   223,   223,   224,   225,   225,   226
 };
 
 static const short yyr2[] = {     0,
@@ -510,223 +511,231 @@
      1,     0,     3,     1,     3,     2,     1,     2,     0,     1,
      4,     1,     3,     1,     3,     1,     3,     3,     2,     1,
      3,     1,     3,     1,     3,     4,     1,     1,     4,     3,
-     3,     6,     1,     3,     1,     3,     3,     3,     1,     3,
-     1,     1,     1,     0,     1,     1,     3,     3,     2,     3,
-     1,     1,     3,     2,     1,     1,     5,     0,     1,     1,
-     3,     2,     4,     3,     3,     3,     3,     3,     0,     1,
-     0,     6,     1,     2,     1,     1,     1,     3,     1,     3,
-     3,     3,     0,     2,     1,     4,     4,     4,     6,     6,
-     1,     4,     3,     1,     3,     3,     3,     1,     3,     1,
-     3,     1,     1,     1,     1,     3,     3,     1,     4,     1,
-     1,     3,     0,     3,     1,     1,     1,     1,     1,     1,
-     1,     1,     3,     1,     1,     1,     1,     2,     1,     1,
-     1,     1,     2,     2,     1,     1,     2,     2,     1,     1,
-     1,     1,     1,     2,     1,     2,     1,     1,     1,     1,
+     3,     6,     6,     1,     3,     1,     3,     3,     3,     3,
+     1,     3,     1,     1,     1,     1,     0,     1,     1,     3,
+     3,     2,     3,     1,     1,     3,     2,     1,     1,     5,
+     0,     1,     1,     3,     2,     4,     3,     3,     3,     3,
+     3,     0,     1,     0,     6,     1,     2,     1,     1,     1,
+     3,     1,     3,     3,     3,     0,     2,     1,     4,     4,
+     4,     6,     6,     1,     4,     3,     1,     3,     3,     3,
+     1,     3,     1,     3,     1,     1,     1,     1,     3,     3,
+     1,     4,     1,     1,     3,     0,     3,     1,     1,     1,
+     1,     1,     1,     1,     1,     3,     1,     1,     1,     1,
+     2,     1,     1,     1,     1,     2,     2,     1,     1,     2,
+     2,     1,     1,     1,     1,     1,     2,     1,     2,     1,
      1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-     1,     1,     1,     1,     1,     0,     1,     1,     4,     3,
-     4,     1,     3,     5,     1,     3,     3,     3,     3,     4,
-     3,     1,     1,     3,     3,     3,     3,     1,     1,     0,
-     5,     1,     2,     2,     3,     1,     1,     1,     1,     1,
-     1,     1,     1,     3,     5,     1,     3,     1,     3,     0,
-     1,     1,     1,     1,     1,     1,     3,     4,     1,     3,
-     2,     3,     1,     3,     0,     1,     1,     2,     2,     3,
-     1,     3,     1,     4,     4,     1,     1,     1,     1,     0,
-     1,     2,     4,     0,     1,     1,     1,     0,     1,     1,
-     1,     1,     1,     0,     1,     1
+     1,     1,     1,     1,     1,     1,     1,     1,     0,     1,
+     1,     4,     3,     4,     1,     1,     3,     5,     1,     3,
+     3,     3,     3,     4,     3,     1,     1,     3,     3,     3,
+     3,     1,     1,     0,     5,     1,     2,     2,     3,     1,
+     1,     1,     1,     1,     1,     1,     1,     3,     5,     1,
+     3,     1,     3,     0,     1,     1,     1,     1,     1,     1,
+     3,     4,     1,     3,     2,     3,     1,     3,     0,     1,
+     1,     2,     2,     3,     1,     3,     1,     4,     4,     1,
+     1,     1,     1,     0,     1,     2,     4,     0,     1,     1,
+     1,     0,     1,     1,     1,     1,     1,     0,     1,     1
 };
 
 static const short yydefact[] = {     0,
-   281,   282,     1,     2,     5,     3,     0,     0,     6,   286,
+   285,   286,     1,     2,     5,     3,     0,     0,     6,   290,
     13,     8,     0,     9,    11,    14,     7,    10,     0,     0,
      0,     0,     0,     0,     0,    15,    16,     0,    22,    20,
-    18,    21,    19,     0,    17,    12,    23,   177,     0,     0,
-   178,   179,   180,     0,   181,   182,   190,   183,   184,   185,
-   186,   187,   188,   189,     0,    24,    25,    27,    28,    31,
+    18,    21,    19,     0,    17,    12,    23,   180,     0,     0,
+   181,   182,   183,     0,   184,   185,   193,   186,   187,   188,
+   189,   190,   191,   192,     0,    24,    25,    27,    28,    31,
     29,    30,    34,     0,     0,    32,     0,    49,     0,    50,
     52,    54,    36,     0,    37,     0,    42,    44,    46,     4,
-    26,   270,   124,   283,     0,   159,     0,     0,   173,   166,
-   170,   172,   160,     0,     0,   161,   165,   169,     0,     0,
-    58,   175,   162,    57,   171,   128,     0,    33,    48,    47,
-     0,     0,    35,    38,     0,     0,     0,     0,   274,    61,
-    60,   113,   271,   278,     0,   174,   168,   167,   164,   163,
-     0,    63,     0,   162,    65,     0,   270,     0,   176,     0,
-     0,    51,    53,    39,    43,    45,     0,   276,   277,   275,
-     0,     0,   196,   280,   279,   272,   125,   127,     0,     0,
-     0,     0,     0,    56,   148,   154,   149,   268,   155,   156,
-   269,   146,   147,     0,    69,    71,    72,   150,   151,    73,
-   267,   259,     0,   261,   266,   263,   133,   134,   129,   130,
-   132,   126,   145,   143,   139,   140,   141,     0,   152,    40,
-    41,   270,   270,     0,    90,     0,   121,     0,     0,   196,
-   196,   115,   114,     0,     0,   112,   197,   198,   270,    64,
-    68,    67,    66,     0,     0,   228,   227,     0,   226,   229,
-     0,     0,     0,   231,     0,   202,   205,     0,   212,   213,
-   219,   218,   245,   246,   230,   233,   232,    59,   270,   260,
-     0,     0,     0,     0,     0,     0,   138,   135,     0,   257,
-   255,   255,   255,    92,   256,    88,   255,   255,    99,     0,
-   273,     0,   270,     0,   270,     0,   270,     0,     0,     0,
-     0,    62,     0,     0,   222,     0,     0,     0,     0,     0,
-     0,    55,   193,   194,   191,   192,     0,     0,     0,   195,
-     0,     0,     0,     0,    70,   262,     0,     0,   152,   131,
-   157,   144,   153,   142,   258,    97,     0,    96,    98,    89,
-   255,    94,    95,     0,    87,   100,    91,     0,   109,     0,
-    82,    85,    86,   270,   123,     0,     0,    75,    76,    81,
-   255,   270,   284,     0,   284,     0,   200,     0,   206,   220,
-   223,   224,   217,   215,   234,     0,   247,   211,   203,   207,
-   208,   209,     0,   216,   214,     0,     0,   249,   265,   264,
-   158,   136,   137,    93,     0,   122,     0,   116,   270,    84,
-   270,   117,   270,    79,   255,   270,   285,   118,   270,   199,
-   201,     0,   225,   238,     0,   236,   196,     0,   210,     0,
-   251,   253,   248,     0,   101,   110,   111,    83,    80,    77,
-    78,   113,   113,   221,   235,     0,   240,   204,   252,     0,
-   250,     0,   119,   120,   237,   243,   244,   242,   239,   241,
-   254,   105,   106,     0,     0,   103,   107,     0,   102,   104,
-   108,     0,     0,     0
+    26,   274,   127,   287,     0,   162,     0,     0,   176,   169,
+   173,   175,   163,     0,     0,   164,   168,   172,     0,     0,
+    58,   178,   165,    57,   174,   131,     0,    33,    48,    47,
+     0,     0,    35,    38,     0,     0,     0,     0,   278,    61,
+    60,   116,   275,   282,     0,   177,   171,   170,   167,   166,
+     0,    64,     0,   165,    66,     0,   274,     0,   179,     0,
+     0,    51,    53,    39,    43,    45,     0,   280,   281,   279,
+     0,     0,   199,   284,   283,   276,   128,   130,     0,     0,
+     0,     0,     0,    56,   151,   157,   152,   272,   158,   159,
+   273,   149,   150,    76,     0,    71,    73,    74,   153,   154,
+    75,   271,   263,     0,   265,   270,   267,   136,   137,   132,
+   133,   135,   129,   148,   146,   142,   143,   144,     0,   155,
+    40,    41,   274,   274,     0,    93,     0,   124,     0,     0,
+   199,   199,   118,   117,     0,     0,   115,   200,   201,   274,
+    65,    70,    69,    68,    67,     0,     0,   232,   231,     0,
+   230,   233,     0,   205,     0,     0,   235,     0,   206,   209,
+     0,   216,   217,   223,   222,   249,   250,   234,   237,   236,
+    59,   274,   264,     0,     0,     0,     0,     0,     0,   141,
+   138,     0,   261,   259,   259,   259,    95,   260,    91,   259,
+   259,   102,     0,   277,     0,   274,     0,   274,     0,   274,
+     0,     0,     0,     0,    63,    62,     0,     0,   226,     0,
+     0,     0,     0,     0,     0,    55,   196,   197,   194,   195,
+     0,     0,     0,   198,     0,     0,     0,     0,    72,   266,
+     0,     0,   155,   134,   160,   147,   156,   145,   262,   100,
+     0,    99,   101,    92,   259,    97,    98,     0,    90,   103,
+    94,     0,   112,     0,    85,    88,    89,   274,   126,     0,
+     0,    78,    79,    84,   259,   274,   288,     0,   288,     0,
+   203,     0,   210,   224,   227,   228,   221,   219,   238,     0,
+   251,   215,   207,   211,   212,   213,     0,   220,   218,     0,
+     0,   253,   269,   268,   161,   139,   140,    96,     0,   125,
+     0,   119,   274,    87,   274,   120,   274,    82,   259,   274,
+   289,   121,   274,   202,   204,     0,   229,   242,     0,   240,
+   199,     0,   214,     0,   255,   257,   252,     0,   104,   113,
+   114,    86,    83,    80,    81,   116,   116,   225,   239,     0,
+   244,   208,   256,     0,   254,     0,   122,   123,   241,   247,
+   248,   246,   243,   245,   258,   108,   109,     0,     0,   106,
+   110,     0,   105,   107,   111,     0,     0,     0
 };
 
-static const short yydefgoto[] = {   442,
+static const short yydefgoto[] = {   446,
      3,     4,     8,     9,    13,    14,    25,    26,    27,    55,
-    56,    57,   108,    58,    74,   201,    75,    76,    77,    59,
-    69,    70,   164,    60,   100,    61,   131,   132,   174,   175,
-   337,   338,   339,   330,   331,   120,   321,   204,   205,   325,
-   326,   422,   435,   436,   340,   341,   152,   153,   213,   101,
-   189,   190,   437,   262,   263,    62,   195,   254,   196,   197,
-   234,   312,   102,   103,   104,   105,   298,   299,   301,   216,
-   217,   218,   235,   236,   237,   392,   287,   238,   239,   240,
-   241,   395,   396,   429,   430,   242,   243,   244,   367,   368,
-   401,   264,   265,   139,   183,   184,   245,   122,   123,   124,
-   151,   156,   246,   106,   386,   247
+    56,    57,   108,    58,    74,   202,    75,    76,    77,    59,
+    69,    70,   174,    60,   100,    61,   131,   132,   175,   176,
+   341,   342,   343,   334,   335,   120,   325,   205,   206,   329,
+   330,   426,   439,   440,   344,   345,   152,   153,   214,   101,
+   190,   191,   441,   265,   266,    62,   196,   257,   197,   198,
+   237,   316,   102,   103,   104,   105,   302,   303,   305,   217,
+   218,   219,   238,   239,   240,   396,   291,   241,   242,   243,
+   244,   399,   400,   433,   434,   245,   246,   247,   371,   372,
+   405,   267,   268,   139,   184,   185,   248,   122,   123,   124,
+   151,   156,   249,   106,   390,   250
 };
 
-static const short yypact[] = {   275,
--32768,-32768,   275,-32768,   -91,-32768,    17,    36,-32768,-32768,
--32768,-32768,    56,-32768,   -47,   262,-32768,-32768,    54,    44,
-    41,    62,    91,    68,   175,   262,-32768,    82,-32768,-32768,
--32768,-32768,-32768,   155,-32768,-32768,   453,-32768,   193,    75,
--32768,-32768,-32768,   197,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,   198,   453,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,   337,   614,-32768,   132,-32768,   119,-32768,
-   144,-32768,-32768,     3,-32768,    57,-32768,   154,-32768,-32768,
--32768,   -11,   184,-32768,   196,-32768,   223,   251,-32768,-32768,
--32768,-32768,-32768,   273,   252,-32768,-32768,-32768,   690,   336,
-   243,-32768,   246,-32768,-32768,   241,   357,-32768,-32768,-32768,
-   290,   253,-32768,-32768,   275,   290,   254,   259,     9,-32768,
--32768,-32768,-32768,   102,   290,-32768,-32768,-32768,-32768,-32768,
-    -2,-32768,   255,-32768,   258,   266,    70,   163,-32768,   308,
-   207,-32768,-32768,   -91,-32768,-32768,   303,-32768,-32768,-32768,
-   364,   538,   -38,-32768,-32768,-32768,-32768,-32768,   372,   690,
-   370,   290,   189,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,    69,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,    85,-32768,-32768,   271,-32768,-32768,   265,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,   269,   270,-32768,
--32768,    71,    76,   128,-32768,   272,   353,   287,   323,    98,
-   125,-32768,-32768,   288,   189,-32768,-32768,   289,   282,-32768,
--32768,-32768,-32768,   311,   373,-32768,-32768,   -50,-32768,-32768,
-   301,   275,   189,-32768,   293,   191,   312,   294,   -50,-32768,
--32768,-32768,   307,-32768,-32768,-32768,-32768,-32768,    70,-32768,
-   178,   302,   329,   411,   370,   207,-32768,-32768,   207,-32768,
-    26,    48,    26,-32768,-32768,   327,    48,    26,   321,   303,
--32768,   392,    39,   333,    60,   350,    60,   351,   189,   315,
-   189,-32768,   436,   322,   309,   325,   216,   319,   330,   328,
-   331,-32768,-32768,-32768,-32768,-32768,   332,   436,   436,-32768,
-   436,   189,   320,   334,-32768,-32768,   342,   344,-32768,-32768,
--32768,   434,-32768,-32768,-32768,-32768,   338,-32768,-32768,-32768,
-    26,-32768,-32768,   354,-32768,-32768,-32768,   370,   326,   138,
--32768,-32768,-32768,   282,-32768,   383,   348,   345,-32768,-32768,
-    26,   282,   370,   352,   370,   349,-32768,   355,-32768,-32768,
--32768,   340,-32768,-32768,   289,    22,-32768,-32768,   358,-32768,
--32768,-32768,   356,-32768,-32768,    -4,   164,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,   362,-32768,   302,-32768,    39,-32768,
-   282,-32768,    61,-32768,    26,   282,-32768,-32768,   282,-32768,
--32768,   411,-32768,-32768,   179,-32768,   -38,   189,-32768,   370,
-   346,-32768,-32768,   334,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,   434,-32768,    22,    24,   240,   346,   370,
--32768,    35,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,    35,    43,-32768,-32768,    18,-32768,-32768,
--32768,   461,   464,-32768
+static const short yypact[] = {   200,
+-32768,-32768,   200,-32768,   -45,-32768,    43,    34,-32768,-32768,
+-32768,-32768,    50,-32768,   -19,   235,-32768,-32768,    86,   122,
+    22,   106,   139,   120,   236,   235,-32768,   134,-32768,-32768,
+-32768,-32768,-32768,   197,-32768,-32768,   457,-32768,   234,    56,
+-32768,-32768,-32768,    49,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,   214,   457,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,   341,   618,-32768,   163,-32768,   181,-32768,
+   206,-32768,-32768,    65,-32768,   -14,-32768,   216,-32768,-32768,
+-32768,    57,   210,-32768,   256,-32768,   258,   274,-32768,-32768,
+-32768,-32768,-32768,   295,   266,-32768,-32768,-32768,   694,   349,
+   250,-32768,   251,-32768,-32768,   242,   357,-32768,-32768,-32768,
+   226,   253,-32768,-32768,   200,   226,   254,   257,    85,-32768,
+-32768,-32768,-32768,     5,   226,-32768,-32768,-32768,-32768,-32768,
+    -5,-32768,   252,-32768,   259,   263,    75,    82,-32768,   303,
+   219,-32768,-32768,   -45,-32768,-32768,   305,-32768,-32768,-32768,
+   356,   542,    18,-32768,-32768,-32768,-32768,-32768,   372,   694,
+   226,   226,   188,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,    67,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,    99,-32768,-32768,   268,-32768,-32768,   261,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   267,   270,
+-32768,-32768,   169,    90,   112,-32768,   271,   348,   283,   319,
+   103,   109,-32768,-32768,   290,   188,-32768,-32768,   291,    57,
+-32768,-32768,-32768,-32768,-32768,   301,   373,-32768,-32768,   -74,
+-32768,-32768,   299,-32768,   200,   188,-32768,   297,   204,   306,
+   298,   -74,-32768,-32768,-32768,   307,-32768,-32768,-32768,-32768,
+-32768,    75,-32768,     7,   275,   318,   410,   407,   219,-32768,
+-32768,   219,-32768,    41,    74,    41,-32768,-32768,   326,    74,
+    41,   321,   305,-32768,   394,    14,   322,    60,   352,    60,
+   353,   188,   316,   188,-32768,-32768,   440,   320,   311,   327,
+   433,   324,   334,   323,   346,-32768,-32768,-32768,-32768,-32768,
+   328,   440,   440,-32768,   440,   188,   452,   338,-32768,-32768,
+   350,   358,-32768,-32768,-32768,   453,-32768,-32768,-32768,-32768,
+   329,-32768,-32768,-32768,    41,-32768,-32768,   381,-32768,-32768,
+-32768,   407,   354,   146,-32768,-32768,-32768,   355,-32768,   401,
+   366,   364,-32768,-32768,    41,   355,   407,   369,   407,   368,
+-32768,   370,-32768,-32768,-32768,   361,-32768,-32768,   291,    17,
+-32768,-32768,   371,-32768,-32768,-32768,   375,-32768,-32768,    23,
+   158,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   374,-32768,
+   275,-32768,    14,-32768,   355,-32768,    42,-32768,    41,   355,
+-32768,-32768,   355,-32768,-32768,   410,-32768,-32768,   203,-32768,
+    18,   289,-32768,   407,   376,-32768,-32768,   338,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,   453,-32768,    17,
+   140,   227,   376,   407,-32768,    38,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,    38,    11,-32768,
+-32768,    30,-32768,-32768,-32768,   486,   487,-32768
 };
 
 static const short yypgoto[] = {-32768,
--32768,   469,-32768,   335,-32768,   460,-32768,-32768,   448,-32768,
--32768,   419,-32768,-32768,-32768,-32768,   402,-32768,   361,-32768,
--32768,   367,-32768,-32768,   -54,-32768,-32768,   324,-32768,   232,
-   205,-32768,   100,-32768,   108,-32768,-32768,-32768,   218,-32768,
--32768,-32768,    55,  -176,  -244,   -79,-32768,   -56,-32768,   217,
--32768,   237,  -133,   291,   295,-32768,    19,-32768,  -127,  -250,
-   -97,   101,   -49,   -45,-32768,   -14,-32768,-32768,-32768,  -202,
--32768,   204,   -44,    99,   -16,-32768,   257,-32768,  -231,-32768,
--32768,-32768,    84,-32768,-32768,-32768,-32768,-32768,-32768,   104,
-   103,  -248,-32768,-32768,-32768,   261,  -113,   -76,-32768,-32768,
--32768,-32768,     1,-32768,   157,    -7
+-32768,   485,-32768,   347,-32768,   479,-32768,-32768,   468,-32768,
+-32768,   439,-32768,-32768,-32768,-32768,   422,-32768,   382,-32768,
+-32768,   389,   377,-32768,   -55,-32768,-32768,   342,-32768,   255,
+   224,-32768,   119,-32768,   125,   292,-32768,-32768,   241,-32768,
+-32768,-32768,    79,  -270,  -268,   -71,-32768,   -69,-32768,   244,
+-32768,   262,  -135,   315,   325,-32768,   -82,-32768,  -130,  -246,
+  -102,   126,   -59,   -31,-32768,   -13,-32768,-32768,-32768,  -209,
+-32768,   239,   -63,   124,   -41,-32768,   286,-32768,  -121,-32768,
+-32768,-32768,   113,-32768,-32768,-32768,-32768,-32768,-32768,   128,
+   130,  -252,-32768,-32768,-32768,   278,  -116,  -114,-32768,-32768,
+-32768,-32768,     1,-32768,   189,    -7
 };
 
 
-#define	YYLAST		788
+#define	YYLAST		792
 
 
 static const short yytable[] = {    15,
-     5,   307,   121,     5,    10,    15,   191,   276,   278,   177,
-   107,    10,   316,   318,   319,     7,     1,     2,   322,   323,
-   118,   432,    63,   179,   185,    10,    11,   179,   332,    65,
-    10,   148,    72,   187,   188,   433,    79,    64,   432,   178,
-    71,    63,   426,   178,    78,   214,   432,    10,    65,   133,
-   187,   188,   433,   134,   285,   354,    64,   176,   187,   188,
-   433,    19,   259,    28,    10,    11,    79,   286,    10,    10,
-   215,   365,   374,    16,    78,   165,   166,   167,    10,   168,
-   169,   170,   171,    10,   259,   257,   258,   149,     1,     2,
-   257,   258,   384,   336,   336,    67,   427,   212,   260,   135,
-   428,   150,   119,    72,    29,   159,   115,   259,    79,   160,
-   133,    71,   400,   113,   134,   144,    78,   158,   172,   191,
-   260,   177,   261,   266,    12,   157,   406,   394,    30,   180,
-   186,   434,   441,   199,   332,   179,   411,   185,   308,   282,
-   192,   198,   179,   260,   329,   179,   154,    32,   434,    31,
-   439,   178,   119,   221,   223,    33,   434,   155,   178,   173,
-   135,   178,   222,    17,   317,   329,   329,   -74,   116,   176,
-   280,    10,   168,   119,   119,   171,   248,    34,  -255,    37,
-   249,   214,  -255,   119,   119,    68,    10,   168,   291,   119,
-   171,    36,   250,   333,   417,   166,   251,    10,   168,   169,
-   170,   171,     1,     2,   275,    10,   215,    66,   214,   224,
-     1,     2,   165,   166,   167,    10,   168,   169,   170,   171,
-     1,     2,   166,   225,    10,   168,   169,   170,   171,   110,
-   111,   277,   290,   215,   346,   269,   348,   226,   227,   270,
-    80,   180,   109,   186,   309,   378,    73,   313,   199,   379,
-   112,   199,   198,   228,   380,   172,   198,   363,   440,   198,
-   117,   440,   385,   407,   226,   334,   349,   342,   181,   342,
-   182,   403,   229,   193,   314,   404,    20,   315,   230,   353,
-   126,   360,   361,   181,   362,    21,   415,   231,     1,     2,
-   416,   293,   294,   295,   296,   232,   173,   233,    10,   333,
-   125,   409,   297,     1,     2,   230,    22,   127,    23,   412,
-    10,   168,   413,   194,   171,     1,     2,    24,   202,   203,
-   376,     1,     2,   187,   188,   128,   166,   129,    10,   168,
-   169,   170,   171,   288,   289,   387,   130,   387,   136,    82,
-   293,   294,   295,   296,   187,   188,    83,    84,   397,   137,
-    83,    84,   138,   372,   373,   423,   424,   140,   402,   141,
-   143,   146,    85,    38,    86,   147,    87,   161,   226,   309,
-   162,   334,   163,   206,   219,   342,    88,   198,    10,   252,
-    89,   253,   256,   364,    90,   255,   271,    91,    41,    42,
-    43,   272,   402,   273,   274,   119,   279,   281,    92,    45,
-   292,   284,   302,    93,    46,    94,    47,    95,   397,   230,
-   283,   300,   431,   304,    48,   311,    96,    97,   320,   324,
-   328,   343,   345,    49,   347,    50,   351,   215,   350,   352,
-    51,    98,    52,    53,    54,   357,   356,   359,   371,   375,
-   358,   377,   166,    99,    10,   168,   169,   170,   171,     1,
-     2,   369,   366,   370,   381,   382,   383,   393,   390,   388,
-   443,    10,   420,   444,   391,   399,     1,     2,   405,   398,
-   225,     6,    18,    35,    81,   114,   145,   142,   200,    38,
-   305,   344,   410,   220,   226,   227,   408,   327,   438,   310,
-   335,   355,   414,   267,    39,   303,   418,   268,    40,   425,
-   228,   389,   419,     0,    41,    42,    43,   421,     0,     0,
-    44,   306,     0,     0,     0,    45,     0,     0,     0,   229,
-    46,     0,    47,     0,     0,   230,     0,     0,     0,     0,
-    48,     0,     0,     0,   231,     0,     0,     0,     0,    49,
-     0,    50,   232,     0,   233,     0,    51,     0,    52,    53,
-    54,    83,    84,     0,     0,     0,     0,     0,     0,   207,
-     0,     0,     0,    85,    38,    86,     0,    87,   208,     0,
+     5,   279,   281,     5,   192,    15,   178,   336,   311,   107,
+   121,   320,   322,   323,   436,    10,   168,   326,   327,   171,
+   180,   186,    10,    63,   180,    10,   188,   189,   437,    65,
+   289,    10,    72,   436,   179,   115,    79,    64,   179,   133,
+    71,   436,    63,   290,    78,   188,   189,   437,    65,   154,
+    10,    10,    11,   188,   189,   437,    64,    10,    10,    11,
+   155,     7,     1,     2,    10,   177,    79,   134,    10,     1,
+     2,    16,   378,    10,    78,   340,    67,   262,     1,     2,
+   165,   166,   167,    10,   168,   169,   170,   171,   118,    19,
+    10,   168,   388,   340,   171,    28,   213,   116,    73,   135,
+   133,   215,   159,    72,   260,   261,   160,   148,    79,    30,
+   262,    71,   182,   263,   336,   144,    78,   158,   443,   333,
+   192,   178,   398,   172,   438,   157,   216,   119,   134,   181,
+   187,   264,   269,   200,   410,   180,   415,   186,   312,   404,
+   193,   199,   180,   438,   445,   180,   263,   333,   286,   179,
+    12,   438,   283,   223,   225,   119,   179,    17,   430,   179,
+   135,   222,   224,   149,   173,   333,    68,   -77,   444,   358,
+   119,   444,   295,   119,   251,   113,   318,   150,   252,   319,
+   177,   163,    29,   260,   261,   369,   215,   182,   119,   183,
+   321,   421,   215,    31,   166,    32,    10,   168,   169,   170,
+   171,     1,     2,   119,   337,   262,   253,    33,   226,   278,
+   254,   216,   431,     1,     2,   280,   432,   216,   350,   272,
+   352,    37,   227,   273,   165,   166,   167,    10,   168,   169,
+   170,   171,     1,     2,    10,   294,   228,   229,    34,     1,
+     2,   263,   367,    36,   181,   353,   187,   313,    66,    20,
+   317,   200,   230,   382,   200,   199,    80,   383,    21,   199,
+   364,   365,   199,   366,   411,   407,   384,   172,   338,   408,
+   346,   231,   346,   109,   389,   416,  -259,   232,   417,    22,
+  -259,    23,   119,    10,   168,   194,   233,   171,     1,     2,
+    24,   110,   111,   234,   235,   166,   236,    10,   168,   169,
+   170,   171,     1,     2,   297,   298,   299,   300,   173,   226,
+   419,   337,   112,   413,   420,   301,     1,     2,   188,   189,
+   203,   204,   117,   227,   380,   195,   125,   297,   298,   299,
+   300,   292,   293,   188,   189,    83,    84,   228,   229,   391,
+   126,   391,   127,    82,   376,   377,   427,   428,   128,   129,
+   130,   136,   401,   230,    83,    84,   137,   138,   140,   141,
+   143,   146,   406,   147,   161,   207,    85,    38,    86,   163,
+    87,   162,   231,   313,   220,   338,   255,   256,   232,   346,
+    88,   199,   259,   258,    89,   274,   275,   233,    90,   276,
+   277,    91,    41,    42,    43,   235,   406,   236,   282,   284,
+   287,   288,    92,    45,   296,   304,   306,    93,    46,    94,
+    47,    95,   401,   308,   315,    10,   435,   324,    48,   328,
+    96,    97,   332,   347,   349,   351,   354,    49,   355,    50,
+   361,   356,   216,   363,    51,    98,    52,    53,    54,   166,
+   360,    10,   168,   169,   170,   171,   166,    99,    10,   168,
+   169,   170,   171,     1,     2,   362,   370,   375,   166,   373,
+    10,   168,   169,   170,   171,    10,   379,   374,   119,   381,
+     1,     2,   385,   386,   227,   387,   392,   394,   397,   395,
+   409,   228,   402,    38,   403,   447,   448,     6,   228,   229,
+   201,    18,   424,    35,    81,   114,   357,   145,    39,   142,
+   228,   221,    40,   348,   230,   414,   309,   412,    41,    42,
+    43,   285,   164,   331,    44,   368,   442,   314,   270,    45,
+   339,   418,   232,   231,    46,   422,    47,   307,   271,   232,
+   359,   310,   429,   423,    48,   425,     0,   393,   233,     0,
+     0,   232,     0,    49,     0,    50,   235,     0,   236,     0,
+    51,     0,    52,    53,    54,    83,    84,     0,     0,     0,
+     0,     0,     0,   208,     0,     0,     0,    85,    38,    86,
+     0,    87,   209,     0,     0,     0,     0,     0,     0,     0,
+     0,    88,     0,     0,     0,    89,     0,     0,     0,    90,
+     0,     0,    91,    41,    42,    43,     0,     0,     0,     0,
+     0,   210,     0,    92,    45,     0,     0,     0,    93,    46,
+    94,    47,    95,     0,     0,     0,     0,     0,     0,    48,
+     0,    96,    97,   211,   212,     0,     0,     0,    49,     0,
+    50,    83,    84,     0,     0,    51,    98,    52,    53,    54,
+     0,     0,     0,    85,    38,    86,     0,    87,     0,     0,
      0,     0,     0,     0,     0,     0,     0,    88,     0,     0,
      0,    89,     0,     0,     0,    90,     0,     0,    91,    41,
-    42,    43,     0,     0,     0,     0,     0,   209,     0,    92,
+    42,    43,     0,     0,     0,     0,     0,     0,     0,    92,
     45,     0,     0,     0,    93,    46,    94,    47,    95,     0,
-     0,     0,     0,     0,     0,    48,     0,    96,    97,   210,
-   211,     0,     0,     0,    49,     0,    50,    83,    84,     0,
+     0,     0,     0,     0,     0,    48,     0,    96,    97,     0,
+     0,     0,     0,     0,    49,     0,    50,     1,     2,     0,
      0,    51,    98,    52,    53,    54,     0,     0,     0,    85,
     38,    86,     0,    87,     0,     0,     0,     0,     0,     0,
      0,     0,     0,    88,     0,     0,     0,    89,     0,     0,
@@ -734,81 +743,82 @@
      0,     0,     0,     0,     0,    92,    45,     0,     0,     0,
     93,    46,    94,    47,    95,     0,     0,     0,     0,     0,
      0,    48,     0,    96,    97,     0,     0,     0,     0,     0,
-    49,     0,    50,     1,     2,     0,     0,    51,    98,    52,
-    53,    54,     0,     0,     0,    85,    38,    86,     0,    87,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,    88,
-     0,     0,     0,    89,     0,     0,     0,    90,     0,     0,
-    91,    41,    42,    43,     0,     0,     0,     0,     0,     0,
-     0,    92,    45,     0,     0,     0,    93,    46,    94,    47,
-    95,     0,     0,     0,     0,     0,     0,    48,     0,    96,
-    97,     0,     0,     0,     0,     0,    49,     0,    50,     0,
-     0,     0,     0,    51,    98,    52,    53,    54
+    49,     0,    50,     0,     0,     0,     0,    51,    98,    52,
+    53,    54
 };
 
 static const short yycheck[] = {     7,
-     0,   252,    82,     3,     9,    13,   140,   210,   211,   137,
-    65,     9,   261,   262,   263,   107,    14,    15,   267,   268,
-    32,     4,    37,   137,   138,     9,    10,   141,   273,    37,
-     9,    23,    40,    16,    17,    18,    44,    37,     4,   137,
-    40,    56,    19,   141,    44,    84,     4,     9,    56,    99,
-    16,    17,    18,    99,   105,   287,    56,   137,    16,    17,
-    18,   109,    37,    10,     9,    10,    74,   118,     9,     9,
-   109,   303,   321,    38,    74,     6,     7,     8,     9,    10,
-    11,    12,    13,     9,    37,    15,    16,    79,    14,    15,
-    15,    16,   341,    34,    34,    21,    73,   152,    73,    99,
-    77,    93,   114,   111,    61,   108,    50,    37,   116,   112,
-   160,   111,   117,   111,   160,   115,   116,   125,    49,   253,
-    73,   249,   202,   203,   108,   125,   377,   106,    88,   137,
-   138,   114,   115,   141,   379,   249,   385,   251,   252,   219,
-   140,   141,   256,    73,   106,   259,    45,    57,   114,    88,
-   108,   249,   114,   161,   162,    88,   114,    56,   256,    90,
-   160,   259,   162,   108,   117,   106,   106,   108,   112,   249,
-   215,     9,    10,   114,   114,    13,   108,     3,   108,    25,
-   112,    84,   112,   114,   114,   111,     9,    10,   233,   114,
-    13,   110,   108,   273,   397,     7,   112,     9,    10,    11,
-    12,    13,    14,    15,   107,     9,   109,    15,    84,    21,
-    14,    15,     6,     7,     8,     9,    10,    11,    12,    13,
-    14,    15,     7,    35,     9,    10,    11,    12,    13,   111,
-   112,   107,   232,   109,   279,   108,   281,    49,    50,   112,
-    43,   249,   111,   251,   252,   108,    50,   255,   256,   112,
-   107,   259,   252,    65,   334,    49,   256,   302,   435,   259,
-   107,   438,   342,   377,    49,   273,   283,   275,   106,   277,
-   108,   108,    84,    67,   256,   112,    15,   259,    90,    64,
-    85,   298,   299,   106,   301,    24,   108,    99,    14,    15,
-   112,   101,   102,   103,   104,   107,    90,   109,     9,   379,
-   117,   381,   112,    14,    15,    90,    45,    85,    47,   386,
-     9,    10,   389,   107,    13,    14,    15,    56,    16,    17,
-   328,    14,    15,    16,    17,    75,     7,    55,     9,    10,
-    11,    12,    13,    33,    34,   343,    85,   345,     3,     3,
-   101,   102,   103,   104,    16,    17,    14,    15,   356,   107,
-    14,    15,   107,    16,    17,   412,   413,   117,   366,     3,
-   108,   108,    26,    27,    28,   107,    30,   113,    49,   377,
-   113,   379,   107,    10,     3,   383,    40,   377,     9,   109,
-    44,   117,   113,    64,    48,   117,   115,    51,    52,    53,
-    54,    39,   400,   107,    72,   114,   109,   109,    62,    63,
-   108,    29,   109,    67,    68,    69,    70,    71,   416,    90,
-   100,   100,   420,   107,    78,     5,    80,    81,    92,    99,
-    29,    72,    72,    87,   110,    89,   118,   109,   107,   105,
-    94,    95,    96,    97,    98,   108,   107,   106,     5,    86,
-   110,   116,     7,   107,     9,    10,    11,    12,    13,    14,
-    15,   110,   119,   110,    72,   108,   112,   118,   110,   108,
-     0,     9,   117,     0,   110,   110,    14,    15,   107,   112,
-    35,     3,    13,    26,    56,    74,   116,   111,   144,    27,
-   249,   277,   383,   160,    49,    50,   379,   270,   434,   253,
-   274,   288,   392,   203,    42,   239,   398,   203,    46,   416,
-    65,   345,   400,    -1,    52,    53,    54,   404,    -1,    -1,
-    58,   251,    -1,    -1,    -1,    63,    -1,    -1,    -1,    84,
-    68,    -1,    70,    -1,    -1,    90,    -1,    -1,    -1,    -1,
-    78,    -1,    -1,    -1,    99,    -1,    -1,    -1,    -1,    87,
-    -1,    89,   107,    -1,   109,    -1,    94,    -1,    96,    97,
-    98,    14,    15,    -1,    -1,    -1,    -1,    -1,    -1,    22,
-    -1,    -1,    -1,    26,    27,    28,    -1,    30,    31,    -1,
+     0,   211,   212,     3,   140,    13,   137,   276,   255,    65,
+    82,   264,   265,   266,     4,     9,    10,   270,   271,    13,
+   137,   138,     9,    37,   141,     9,    16,    17,    18,    37,
+   105,     9,    40,     4,   137,    50,    44,    37,   141,    99,
+    40,     4,    56,   118,    44,    16,    17,    18,    56,    45,
+     9,     9,    10,    16,    17,    18,    56,     9,     9,    10,
+    56,   107,    14,    15,     9,   137,    74,    99,     9,    14,
+    15,    38,   325,     9,    74,    34,    21,    37,    14,    15,
+     6,     7,     8,     9,    10,    11,    12,    13,    32,   109,
+     9,    10,   345,    34,    13,    10,   152,   112,    50,    99,
+   160,    84,   108,   111,    15,    16,   112,    23,   116,    88,
+    37,   111,   106,    73,   383,   115,   116,   125,   108,   106,
+   256,   252,   106,    49,   114,   125,   109,   114,   160,   137,
+   138,   203,   204,   141,   381,   252,   389,   254,   255,   117,
+   140,   141,   259,   114,   115,   262,    73,   106,   220,   252,
+   108,   114,   216,   161,   162,   114,   259,   108,    19,   262,
+   160,   161,   162,    79,    90,   106,   111,   108,   439,   291,
+   114,   442,   236,   114,   108,   111,   259,    93,   112,   262,
+   252,   107,    61,    15,    16,   307,    84,   106,   114,   108,
+   117,   401,    84,    88,     7,    57,     9,    10,    11,    12,
+    13,    14,    15,   114,   276,    37,   108,    88,    21,   107,
+   112,   109,    73,    14,    15,   107,    77,   109,   282,   108,
+   284,    25,    35,   112,     6,     7,     8,     9,    10,    11,
+    12,    13,    14,    15,     9,   235,    49,    50,     3,    14,
+    15,    73,   306,   110,   252,   287,   254,   255,    15,    15,
+   258,   259,    65,   108,   262,   255,    43,   112,    24,   259,
+   302,   303,   262,   305,   381,   108,   338,    49,   276,   112,
+   278,    84,   280,   111,   346,   390,   108,    90,   393,    45,
+   112,    47,   114,     9,    10,    67,    99,    13,    14,    15,
+    56,   111,   112,   106,   107,     7,   109,     9,    10,    11,
+    12,    13,    14,    15,   101,   102,   103,   104,    90,    21,
+   108,   383,   107,   385,   112,   112,    14,    15,    16,    17,
+    16,    17,   107,    35,   332,   107,   117,   101,   102,   103,
+   104,    33,    34,    16,    17,    14,    15,    49,    50,   347,
+    85,   349,    85,     3,    16,    17,   416,   417,    75,    55,
+    85,     3,   360,    65,    14,    15,   107,   107,   117,     3,
+   108,   108,   370,   107,   113,    10,    26,    27,    28,   107,
+    30,   113,    84,   381,     3,   383,   109,   117,    90,   387,
+    40,   381,   113,   117,    44,   115,    39,    99,    48,   107,
+    72,    51,    52,    53,    54,   107,   404,   109,   109,   109,
+   100,    29,    62,    63,   108,   100,   109,    67,    68,    69,
+    70,    71,   420,   107,     5,     9,   424,    92,    78,    99,
+    80,    81,    29,    72,    72,   110,   107,    87,   118,    89,
+   108,   105,   109,   106,    94,    95,    96,    97,    98,     7,
+   107,     9,    10,    11,    12,    13,     7,   107,     9,    10,
+    11,    12,    13,    14,    15,   110,   119,     5,     7,   110,
+     9,    10,    11,    12,    13,     9,    86,   110,   114,   116,
+    14,    15,    72,   108,    35,   112,   108,   110,   118,   110,
+   107,    49,   112,    27,   110,     0,     0,     3,    49,    50,
+   144,    13,   117,    26,    56,    74,    64,   116,    42,   111,
+    49,   160,    46,   280,    65,   387,   252,   383,    52,    53,
+    54,   220,   136,   273,    58,    64,   438,   256,   204,    63,
+   277,   396,    90,    84,    68,   402,    70,   242,   204,    90,
+   292,   254,   420,   404,    78,   408,    -1,   349,    99,    -1,
+    -1,    90,    -1,    87,    -1,    89,   107,    -1,   109,    -1,
+    94,    -1,    96,    97,    98,    14,    15,    -1,    -1,    -1,
+    -1,    -1,    -1,    22,    -1,    -1,    -1,    26,    27,    28,
+    -1,    30,    31,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    40,    -1,    -1,    -1,    44,    -1,    -1,    -1,    48,
+    -1,    -1,    51,    52,    53,    54,    -1,    -1,    -1,    -1,
+    -1,    60,    -1,    62,    63,    -1,    -1,    -1,    67,    68,
+    69,    70,    71,    -1,    -1,    -1,    -1,    -1,    -1,    78,
+    -1,    80,    81,    82,    83,    -1,    -1,    -1,    87,    -1,
+    89,    14,    15,    -1,    -1,    94,    95,    96,    97,    98,
+    -1,    -1,    -1,    26,    27,    28,    -1,    30,    -1,    -1,
     -1,    -1,    -1,    -1,    -1,    -1,    -1,    40,    -1,    -1,
     -1,    44,    -1,    -1,    -1,    48,    -1,    -1,    51,    52,
-    53,    54,    -1,    -1,    -1,    -1,    -1,    60,    -1,    62,
+    53,    54,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    62,
     63,    -1,    -1,    -1,    67,    68,    69,    70,    71,    -1,
-    -1,    -1,    -1,    -1,    -1,    78,    -1,    80,    81,    82,
-    83,    -1,    -1,    -1,    87,    -1,    89,    14,    15,    -1,
+    -1,    -1,    -1,    -1,    -1,    78,    -1,    80,    81,    -1,
+    -1,    -1,    -1,    -1,    87,    -1,    89,    14,    15,    -1,
     -1,    94,    95,    96,    97,    98,    -1,    -1,    -1,    26,
     27,    28,    -1,    30,    -1,    -1,    -1,    -1,    -1,    -1,
     -1,    -1,    -1,    40,    -1,    -1,    -1,    44,    -1,    -1,
@@ -816,15 +826,8 @@
     -1,    -1,    -1,    -1,    -1,    62,    63,    -1,    -1,    -1,
     67,    68,    69,    70,    71,    -1,    -1,    -1,    -1,    -1,
     -1,    78,    -1,    80,    81,    -1,    -1,    -1,    -1,    -1,
-    87,    -1,    89,    14,    15,    -1,    -1,    94,    95,    96,
-    97,    98,    -1,    -1,    -1,    26,    27,    28,    -1,    30,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    40,
-    -1,    -1,    -1,    44,    -1,    -1,    -1,    48,    -1,    -1,
-    51,    52,    53,    54,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,    62,    63,    -1,    -1,    -1,    67,    68,    69,    70,
-    71,    -1,    -1,    -1,    -1,    -1,    -1,    78,    -1,    80,
-    81,    -1,    -1,    -1,    -1,    -1,    87,    -1,    89,    -1,
-    -1,    -1,    -1,    94,    95,    96,    97,    98
+    87,    -1,    89,    -1,    -1,    -1,    -1,    94,    95,    96,
+    97,    98
 };
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
 #line 3 "/usr/share/bison.simple"
@@ -1864,13 +1867,20 @@
 #line 794 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
-		assert(yyval.a_expr->Identifier == 0);
 		yyval.a_expr->Identifier = yyvsp[-5].tv_str;
 		yyval.a_expr->lhs_params = yyvsp[-3].a_plist;
 	;
     break;}
 case 63:
-#line 803 "asn1p_y.y"
+#line 800 "asn1p_y.y"
+{
+		yyval.a_expr = yyvsp[0].a_expr;
+		yyval.a_expr->Identifier = yyvsp[-5].tv_str;
+		yyval.a_expr->lhs_params = yyvsp[-3].a_plist;
+	;
+    break;}
+case 64:
+#line 808 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_plist = asn1p_paramlist_new(yylineno);
@@ -1881,8 +1891,8 @@
 		if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument);
 	;
     break;}
-case 64:
-#line 812 "asn1p_y.y"
+case 65:
+#line 817 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_plist = yyvsp[-2].a_plist;
@@ -1892,25 +1902,15 @@
 		if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument);
 	;
     break;}
-case 65:
-#line 823 "asn1p_y.y"
+case 66:
+#line 828 "asn1p_y.y"
 {
 		yyval.a_parg.governor = NULL;
 		yyval.a_parg.argument = yyvsp[0].tv_str;
 	;
     break;}
-case 66:
-#line 827 "asn1p_y.y"
-{
-		int ret;
-		yyval.a_parg.governor = asn1p_ref_new(yylineno);
-		ret = asn1p_ref_add_component(yyval.a_parg.governor, yyvsp[-2].tv_str, 0);
-		checkmem(ret == 0);
-		yyval.a_parg.argument = yyvsp[0].tv_str;
-	;
-    break;}
 case 67:
-#line 834 "asn1p_y.y"
+#line 832 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -1920,7 +1920,17 @@
 	;
     break;}
 case 68:
-#line 841 "asn1p_y.y"
+#line 839 "asn1p_y.y"
+{
+		int ret;
+		yyval.a_parg.governor = asn1p_ref_new(yylineno);
+		ret = asn1p_ref_add_component(yyval.a_parg.governor, yyvsp[-2].tv_str, 0);
+		checkmem(ret == 0);
+		yyval.a_parg.argument = yyvsp[0].tv_str;
+	;
+    break;}
+case 69:
+#line 846 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -1930,29 +1940,40 @@
 		yyval.a_parg.argument = yyvsp[0].tv_str;
 	;
     break;}
-case 69:
-#line 852 "asn1p_y.y"
+case 70:
+#line 854 "asn1p_y.y"
+{
+		int ret;
+		yyval.a_parg.governor = asn1p_ref_new(yylineno);
+		ret = asn1p_ref_add_component(yyval.a_parg.governor,
+			ASN_EXPR_TYPE2STR(yyvsp[-2].a_type), 1);
+		checkmem(ret == 0);
+		yyval.a_parg.argument = yyvsp[0].tv_str;
+	;
+    break;}
+case 71:
+#line 865 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 70:
-#line 857 "asn1p_y.y"
+case 72:
+#line 870 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 71:
-#line 864 "asn1p_y.y"
+case 73:
+#line 877 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
-case 72:
-#line 867 "asn1p_y.y"
+case 74:
+#line 880 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1962,8 +1983,8 @@
 		yyval.a_expr->value = yyvsp[0].a_value;
 	;
     break;}
-case 73:
-#line 875 "asn1p_y.y"
+case 75:
+#line 888 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		yyval.a_expr = asn1p_expr_new(yylineno);
@@ -1976,31 +1997,40 @@
 		yyval.a_expr->value = asn1p_value_fromref(ref, 0);
 	;
     break;}
-case 74:
-#line 903 "asn1p_y.y"
+case 76:
+#line 899 "asn1p_y.y"
+{
+		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr->expr_type = A1TC_VALUESET;
+		yyval.a_expr->meta_type = AMT_VALUESET;
+		yyval.a_expr->constraints = yyvsp[0].a_constr;
+	;
+    break;}
+case 77:
+#line 922 "asn1p_y.y"
 { yyval.a_expr = asn1p_expr_new(yylineno); ;
     break;}
-case 75:
-#line 904 "asn1p_y.y"
+case 78:
+#line 923 "asn1p_y.y"
 { yyval.a_expr = yyvsp[0].a_expr; ;
     break;}
-case 76:
-#line 907 "asn1p_y.y"
+case 79:
+#line 926 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 77:
-#line 912 "asn1p_y.y"
+case 80:
+#line 931 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 78:
-#line 919 "asn1p_y.y"
+case 81:
+#line 938 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -2009,8 +2039,8 @@
 		yyval.a_expr->marker = yyvsp[0].a_marker;
 	;
     break;}
-case 79:
-#line 926 "asn1p_y.y"
+case 82:
+#line 945 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		yyvsp[0].a_marker.flags |= yyval.a_expr->marker.flags;
@@ -2018,8 +2048,8 @@
 		_fixup_anonymous_identifier(yyval.a_expr);
 	;
     break;}
-case 80:
-#line 932 "asn1p_y.y"
+case 83:
+#line 951 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2028,50 +2058,50 @@
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 81:
-#line 939 "asn1p_y.y"
+case 84:
+#line 958 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
-case 82:
-#line 945 "asn1p_y.y"
+case 85:
+#line 964 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 83:
-#line 950 "asn1p_y.y"
+case 86:
+#line 969 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 84:
-#line 957 "asn1p_y.y"
+case 87:
+#line 976 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
 		yyval.a_expr->Identifier = yyvsp[-1].tv_str;
 	;
     break;}
-case 85:
-#line 962 "asn1p_y.y"
+case 88:
+#line 981 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
-case 86:
-#line 965 "asn1p_y.y"
+case 89:
+#line 984 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		_fixup_anonymous_identifier(yyval.a_expr);
 	;
     break;}
-case 87:
-#line 972 "asn1p_y.y"
+case 90:
+#line 991 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		checkmem(yyval.a_expr);
@@ -2080,16 +2110,16 @@
 		assert(yyval.a_expr->meta_type == AMT_OBJECTCLASS);
 	;
     break;}
-case 88:
-#line 982 "asn1p_y.y"
+case 91:
+#line 1001 "asn1p_y.y"
 { yyval.a_int = 0; ;
     break;}
-case 89:
-#line 983 "asn1p_y.y"
+case 92:
+#line 1002 "asn1p_y.y"
 { yyval.a_int = 1; ;
     break;}
-case 90:
-#line 987 "asn1p_y.y"
+case 93:
+#line 1006 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2098,15 +2128,15 @@
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 91:
-#line 994 "asn1p_y.y"
+case 94:
+#line 1013 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 92:
-#line 1004 "asn1p_y.y"
+case 95:
+#line 1023 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2116,8 +2146,8 @@
 		yyval.a_expr->marker = yyvsp[0].a_marker;
 	;
     break;}
-case 93:
-#line 1014 "asn1p_y.y"
+case 96:
+#line 1033 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		yyval.a_expr->Identifier = yyvsp[-3].tv_str;
@@ -2128,8 +2158,8 @@
 		asn1p_expr_add(yyval.a_expr, yyvsp[-2].a_expr);
 	;
     break;}
-case 94:
-#line 1025 "asn1p_y.y"
+case 97:
+#line 1044 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -2139,8 +2169,8 @@
 		yyval.a_expr->marker = yyvsp[0].a_marker;
 	;
     break;}
-case 95:
-#line 1035 "asn1p_y.y"
+case 98:
+#line 1054 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2151,8 +2181,8 @@
 		yyval.a_expr->marker = yyvsp[0].a_marker;
 	;
     break;}
-case 96:
-#line 1046 "asn1p_y.y"
+case 99:
+#line 1065 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -2162,8 +2192,8 @@
 		yyval.a_expr->marker = yyvsp[0].a_marker;
 	;
     break;}
-case 97:
-#line 1056 "asn1p_y.y"
+case 100:
+#line 1075 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2174,8 +2204,8 @@
 		yyval.a_expr->marker = yyvsp[0].a_marker;
 	;
     break;}
-case 98:
-#line 1067 "asn1p_y.y"
+case 101:
+#line 1086 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2186,103 +2216,103 @@
 		yyval.a_expr->marker = yyvsp[0].a_marker;
 	;
     break;}
-case 99:
-#line 1079 "asn1p_y.y"
+case 102:
+#line 1098 "asn1p_y.y"
 { yyval.a_wsynt = 0; ;
     break;}
-case 100:
-#line 1080 "asn1p_y.y"
+case 103:
+#line 1099 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[0].a_wsynt;
 	;
     break;}
-case 101:
-#line 1087 "asn1p_y.y"
+case 104:
+#line 1106 "asn1p_y.y"
 { asn1p_lexer_hack_enable_with_syntax(); ;
     break;}
-case 102:
-#line 1089 "asn1p_y.y"
+case 105:
+#line 1108 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 	;
     break;}
-case 103:
-#line 1095 "asn1p_y.y"
+case 106:
+#line 1114 "asn1p_y.y"
 {
 		yyval.a_wsynt = asn1p_wsyntx_new();
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
 	;
     break;}
-case 104:
-#line 1099 "asn1p_y.y"
+case 107:
+#line 1118 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
 	;
     break;}
-case 105:
-#line 1106 "asn1p_y.y"
+case 108:
+#line 1125 "asn1p_y.y"
 {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		yyval.a_wchunk->type = WC_WHITESPACE;
 	;
     break;}
-case 106:
-#line 1110 "asn1p_y.y"
+case 109:
+#line 1129 "asn1p_y.y"
 {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_str, strlen(yyvsp[0].tv_str), 0);
 	;
     break;}
-case 107:
-#line 1113 "asn1p_y.y"
+case 110:
+#line 1132 "asn1p_y.y"
 {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].a_refcomp.name, strlen(yyvsp[0].a_refcomp.name), 0);
 		yyval.a_wchunk->type = WC_FIELD;
 	;
     break;}
-case 108:
-#line 1117 "asn1p_y.y"
+case 111:
+#line 1136 "asn1p_y.y"
 {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_fromsyntax(yyvsp[-1].a_wsynt);
 	;
     break;}
-case 109:
-#line 1123 "asn1p_y.y"
-{
-		yyval.a_expr = asn1p_expr_new(yylineno);
-		checkmem(yyval.a_expr);
-		yyval.a_expr->Identifier = strdup("...");
-		checkmem(yyval.a_expr->Identifier);
-		yyval.a_expr->expr_type = A1TC_EXTENSIBLE;
-		yyval.a_expr->meta_type = AMT_TYPE;
-	;
-    break;}
-case 110:
-#line 1131 "asn1p_y.y"
-{
-		yyval.a_expr = asn1p_expr_new(yylineno);
-		checkmem(yyval.a_expr);
-		yyval.a_expr->Identifier = strdup("...");
-		checkmem(yyval.a_expr->Identifier);
-		yyval.a_expr->value = yyvsp[0].a_value;
-		yyval.a_expr->expr_type = A1TC_EXTENSIBLE;
-		yyval.a_expr->meta_type = AMT_TYPE;
-	;
-    break;}
-case 111:
-#line 1140 "asn1p_y.y"
-{
-		yyval.a_expr = asn1p_expr_new(yylineno);
-		checkmem(yyval.a_expr);
-		yyval.a_expr->Identifier = strdup("...");
-		yyval.a_expr->value = yyvsp[0].a_value;
-		checkmem(yyval.a_expr->Identifier);
-		yyval.a_expr->expr_type = A1TC_EXTENSIBLE;
-		yyval.a_expr->meta_type = AMT_TYPE;
-	;
-    break;}
 case 112:
-#line 1152 "asn1p_y.y"
+#line 1142 "asn1p_y.y"
+{
+		yyval.a_expr = asn1p_expr_new(yylineno);
+		checkmem(yyval.a_expr);
+		yyval.a_expr->Identifier = strdup("...");
+		checkmem(yyval.a_expr->Identifier);
+		yyval.a_expr->expr_type = A1TC_EXTENSIBLE;
+		yyval.a_expr->meta_type = AMT_TYPE;
+	;
+    break;}
+case 113:
+#line 1150 "asn1p_y.y"
+{
+		yyval.a_expr = asn1p_expr_new(yylineno);
+		checkmem(yyval.a_expr);
+		yyval.a_expr->Identifier = strdup("...");
+		checkmem(yyval.a_expr->Identifier);
+		yyval.a_expr->value = yyvsp[0].a_value;
+		yyval.a_expr->expr_type = A1TC_EXTENSIBLE;
+		yyval.a_expr->meta_type = AMT_TYPE;
+	;
+    break;}
+case 114:
+#line 1159 "asn1p_y.y"
+{
+		yyval.a_expr = asn1p_expr_new(yylineno);
+		checkmem(yyval.a_expr);
+		yyval.a_expr->Identifier = strdup("...");
+		yyval.a_expr->value = yyvsp[0].a_value;
+		checkmem(yyval.a_expr->Identifier);
+		yyval.a_expr->expr_type = A1TC_EXTENSIBLE;
+		yyval.a_expr->meta_type = AMT_TYPE;
+	;
+    break;}
+case 115:
+#line 1171 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		yyval.a_expr->tag = yyvsp[-2].a_tag;
@@ -2303,15 +2333,15 @@
 		}
 	;
     break;}
-case 113:
-#line 1174 "asn1p_y.y"
+case 116:
+#line 1193 "asn1p_y.y"
 {
 		yyval.a_int = asn1p_as_pointer ? EM_INDIRECT : 0;
 		asn1p_as_pointer = 0;
 	;
     break;}
-case 114:
-#line 1181 "asn1p_y.y"
+case 117:
+#line 1200 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->marker.flags |= yyvsp[-1].a_int;
@@ -2329,14 +2359,14 @@
 		}
 	;
     break;}
-case 115:
-#line 1200 "asn1p_y.y"
+case 118:
+#line 1219 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
-case 116:
-#line 1203 "asn1p_y.y"
+case 119:
+#line 1222 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2344,8 +2374,8 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 117:
-#line 1209 "asn1p_y.y"
+case 120:
+#line 1228 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2353,8 +2383,8 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 118:
-#line 1215 "asn1p_y.y"
+case 121:
+#line 1234 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2362,8 +2392,8 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 119:
-#line 1221 "asn1p_y.y"
+case 122:
+#line 1240 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2375,8 +2405,8 @@
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 120:
-#line 1231 "asn1p_y.y"
+case 123:
+#line 1250 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2388,8 +2418,8 @@
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 121:
-#line 1241 "asn1p_y.y"
+case 124:
+#line 1260 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2397,8 +2427,8 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 122:
-#line 1247 "asn1p_y.y"
+case 125:
+#line 1266 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_expr = asn1p_expr_new(yylineno);
@@ -2411,8 +2441,8 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 123:
-#line 1259 "asn1p_y.y"
+case 126:
+#line 1277 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2421,8 +2451,8 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 124:
-#line 1274 "asn1p_y.y"
+case 127:
+#line 1292 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2432,8 +2462,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 125:
-#line 1282 "asn1p_y.y"
+case 128:
+#line 1300 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2445,8 +2475,8 @@
 		free(yyvsp[-2].tv_str);
 	;
     break;}
-case 126:
-#line 1292 "asn1p_y.y"
+case 129:
+#line 1310 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2458,8 +2488,8 @@
 		free(yyvsp[-2].tv_str);
 	;
     break;}
-case 127:
-#line 1302 "asn1p_y.y"
+case 130:
+#line 1320 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2471,8 +2501,8 @@
 		free(yyvsp[-2].tv_str);
 	;
     break;}
-case 128:
-#line 1312 "asn1p_y.y"
+case 131:
+#line 1330 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2482,8 +2512,8 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 129:
-#line 1320 "asn1p_y.y"
+case 132:
+#line 1338 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = yyvsp[0].a_ref;
@@ -2504,8 +2534,8 @@
 		}
 	;
     break;}
-case 130:
-#line 1342 "asn1p_y.y"
+case 133:
+#line 1360 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2515,8 +2545,8 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 131:
-#line 1350 "asn1p_y.y"
+case 134:
+#line 1368 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = yyvsp[-2].a_ref;
@@ -2525,50 +2555,50 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 133:
-#line 1363 "asn1p_y.y"
+case 136:
+#line 1381 "asn1p_y.y"
 {
 		yyval.a_refcomp.lex_type = RLT_AmpUppercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
 	;
     break;}
-case 134:
-#line 1368 "asn1p_y.y"
+case 137:
+#line 1386 "asn1p_y.y"
 {
 		yyval.a_refcomp.lex_type = RLT_Amplowercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
 	;
     break;}
-case 135:
-#line 1377 "asn1p_y.y"
+case 138:
+#line 1395 "asn1p_y.y"
 {
 		yyval.a_ref = asn1p_ref_new(yylineno);
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase);
 	;
     break;}
-case 136:
-#line 1381 "asn1p_y.y"
+case 139:
+#line 1399 "asn1p_y.y"
 {
 		yyval.a_ref = yyval.a_ref;
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase);
 	;
     break;}
-case 137:
-#line 1385 "asn1p_y.y"
+case 140:
+#line 1403 "asn1p_y.y"
 {
 		yyval.a_ref = yyval.a_ref;
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_Amplowercase);
 	;
     break;}
-case 138:
-#line 1392 "asn1p_y.y"
+case 141:
+#line 1410 "asn1p_y.y"
 {
 		yyval.a_ref = asn1p_ref_new(yylineno);
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS);
 	;
     break;}
-case 139:
-#line 1412 "asn1p_y.y"
+case 142:
+#line 1430 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		assert(yyval.a_expr->Identifier == NULL);
@@ -2577,8 +2607,8 @@
 		yyval.a_expr->value = yyvsp[0].a_value;
 	;
     break;}
-case 142:
-#line 1424 "asn1p_y.y"
+case 145:
+#line 1442 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -2587,70 +2617,70 @@
 		yyval.a_value->value.choice_identifier.value = yyvsp[0].a_value;
 	;
     break;}
-case 143:
-#line 1431 "asn1p_y.y"
+case 146:
+#line 1449 "asn1p_y.y"
 { asn1p_lexer_hack_push_opaque_state(); ;
     break;}
-case 144:
-#line 1431 "asn1p_y.y"
+case 147:
+#line 1449 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_UNPARSED;
 	;
     break;}
-case 145:
-#line 1436 "asn1p_y.y"
+case 148:
+#line 1454 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_NULL;
 	;
     break;}
-case 146:
-#line 1444 "asn1p_y.y"
+case 149:
+#line 1462 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_FALSE;
 	;
     break;}
-case 147:
-#line 1449 "asn1p_y.y"
+case 150:
+#line 1467 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_TRUE;
 	;
     break;}
-case 148:
-#line 1454 "asn1p_y.y"
+case 151:
+#line 1472 "asn1p_y.y"
 {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B');
 		checkmem(yyval.a_value);
 	;
     break;}
-case 149:
-#line 1458 "asn1p_y.y"
+case 152:
+#line 1476 "asn1p_y.y"
 {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H');
 		checkmem(yyval.a_value);
 	;
     break;}
-case 150:
-#line 1462 "asn1p_y.y"
+case 153:
+#line 1480 "asn1p_y.y"
 {
 		yyval.a_value = yyval.a_value;
 	;
     break;}
-case 151:
-#line 1465 "asn1p_y.y"
+case 154:
+#line 1483 "asn1p_y.y"
 {
 		yyval.a_value = yyvsp[0].a_value;
 	;
     break;}
-case 152:
-#line 1471 "asn1p_y.y"
+case 155:
+#line 1489 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2663,8 +2693,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 153:
-#line 1482 "asn1p_y.y"
+case 156:
+#line 1500 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2680,31 +2710,31 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 154:
-#line 1500 "asn1p_y.y"
+case 157:
+#line 1518 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		checkmem(yyval.a_value);
 	;
     break;}
-case 155:
-#line 1504 "asn1p_y.y"
+case 158:
+#line 1522 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_TUPLE;
 	;
     break;}
-case 156:
-#line 1509 "asn1p_y.y"
+case 159:
+#line 1527 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_QUADRUPLE;
 	;
     break;}
-case 157:
-#line 1543 "asn1p_y.y"
+case 160:
+#line 1561 "asn1p_y.y"
 {
 		yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1;
 		yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1);
@@ -2715,8 +2745,8 @@
 		free(yyvsp[0].tv_opaque.buf);
 	;
     break;}
-case 158:
-#line 1552 "asn1p_y.y"
+case 161:
+#line 1570 "asn1p_y.y"
 {
 		int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len;
 		char *p = malloc(newsize + 1);
@@ -2730,72 +2760,72 @@
 		yyval.tv_opaque.len = newsize;
 	;
     break;}
-case 159:
-#line 1567 "asn1p_y.y"
+case 162:
+#line 1585 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_BOOLEAN; ;
     break;}
-case 160:
-#line 1568 "asn1p_y.y"
+case 163:
+#line 1586 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_NULL; ;
     break;}
-case 161:
-#line 1569 "asn1p_y.y"
+case 164:
+#line 1587 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_REAL; ;
     break;}
-case 162:
-#line 1570 "asn1p_y.y"
-{ yyval.a_type = yyvsp[0].a_type; ;
-    break;}
-case 163:
-#line 1571 "asn1p_y.y"
-{ yyval.a_type = ASN_BASIC_OCTET_STRING; ;
-    break;}
-case 164:
-#line 1572 "asn1p_y.y"
-{ yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ;
-    break;}
 case 165:
-#line 1573 "asn1p_y.y"
-{ yyval.a_type = ASN_BASIC_RELATIVE_OID; ;
+#line 1588 "asn1p_y.y"
+{ yyval.a_type = yyvsp[0].a_type; ;
     break;}
 case 166:
-#line 1574 "asn1p_y.y"
-{ yyval.a_type = ASN_BASIC_EXTERNAL; ;
+#line 1589 "asn1p_y.y"
+{ yyval.a_type = ASN_BASIC_OCTET_STRING; ;
     break;}
 case 167:
-#line 1575 "asn1p_y.y"
-{ yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ;
+#line 1590 "asn1p_y.y"
+{ yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ;
     break;}
 case 168:
-#line 1576 "asn1p_y.y"
-{ yyval.a_type = ASN_BASIC_CHARACTER_STRING; ;
+#line 1591 "asn1p_y.y"
+{ yyval.a_type = ASN_BASIC_RELATIVE_OID; ;
     break;}
 case 169:
-#line 1577 "asn1p_y.y"
-{ yyval.a_type = ASN_BASIC_UTCTime; ;
+#line 1592 "asn1p_y.y"
+{ yyval.a_type = ASN_BASIC_EXTERNAL; ;
     break;}
 case 170:
-#line 1578 "asn1p_y.y"
-{ yyval.a_type = ASN_BASIC_GeneralizedTime; ;
+#line 1593 "asn1p_y.y"
+{ yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ;
     break;}
 case 171:
-#line 1579 "asn1p_y.y"
-{ yyval.a_type = yyvsp[0].a_type; ;
+#line 1594 "asn1p_y.y"
+{ yyval.a_type = ASN_BASIC_CHARACTER_STRING; ;
     break;}
 case 172:
-#line 1586 "asn1p_y.y"
-{ yyval.a_type = ASN_BASIC_INTEGER; ;
+#line 1595 "asn1p_y.y"
+{ yyval.a_type = ASN_BASIC_UTCTime; ;
     break;}
 case 173:
-#line 1587 "asn1p_y.y"
-{ yyval.a_type = ASN_BASIC_ENUMERATED; ;
+#line 1596 "asn1p_y.y"
+{ yyval.a_type = ASN_BASIC_GeneralizedTime; ;
     break;}
 case 174:
-#line 1588 "asn1p_y.y"
-{ yyval.a_type = ASN_BASIC_BIT_STRING; ;
+#line 1597 "asn1p_y.y"
+{ yyval.a_type = yyvsp[0].a_type; ;
     break;}
 case 175:
-#line 1592 "asn1p_y.y"
+#line 1604 "asn1p_y.y"
+{ yyval.a_type = ASN_BASIC_INTEGER; ;
+    break;}
+case 176:
+#line 1605 "asn1p_y.y"
+{ yyval.a_type = ASN_BASIC_ENUMERATED; ;
+    break;}
+case 177:
+#line 1606 "asn1p_y.y"
+{ yyval.a_type = ASN_BASIC_BIT_STRING; ;
+    break;}
+case 178:
+#line 1610 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2803,8 +2833,8 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 176:
-#line 1598 "asn1p_y.y"
+case 179:
+#line 1616 "asn1p_y.y"
 {
 		if(yyvsp[0].a_expr) {
 			yyval.a_expr = yyvsp[0].a_expr;
@@ -2816,92 +2846,92 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 177:
-#line 1611 "asn1p_y.y"
+case 180:
+#line 1629 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_BMPString; ;
     break;}
-case 178:
-#line 1612 "asn1p_y.y"
+case 181:
+#line 1630 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_GeneralString;
 		fprintf(stderr, "WARNING: GeneralString is not fully supported\n");
 	;
     break;}
-case 179:
-#line 1616 "asn1p_y.y"
+case 182:
+#line 1634 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_GraphicString;
 		fprintf(stderr, "WARNING: GraphicString is not fully supported\n");
 	;
     break;}
-case 180:
-#line 1620 "asn1p_y.y"
+case 183:
+#line 1638 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_IA5String; ;
     break;}
-case 181:
-#line 1621 "asn1p_y.y"
+case 184:
+#line 1639 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_ISO646String; ;
     break;}
-case 182:
-#line 1622 "asn1p_y.y"
+case 185:
+#line 1640 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_NumericString; ;
     break;}
-case 183:
-#line 1623 "asn1p_y.y"
+case 186:
+#line 1641 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_PrintableString; ;
     break;}
-case 184:
-#line 1624 "asn1p_y.y"
+case 187:
+#line 1642 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_T61String;
 		fprintf(stderr, "WARNING: T61String is not fully supported\n");
 	;
     break;}
-case 185:
-#line 1628 "asn1p_y.y"
+case 188:
+#line 1646 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_TeletexString; ;
     break;}
-case 186:
-#line 1629 "asn1p_y.y"
+case 189:
+#line 1647 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_UniversalString; ;
     break;}
-case 187:
-#line 1630 "asn1p_y.y"
+case 190:
+#line 1648 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_UTF8String; ;
     break;}
-case 188:
-#line 1631 "asn1p_y.y"
+case 191:
+#line 1649 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_VideotexString;
 		fprintf(stderr, "WARNING: VideotexString is not fully supported\n");
 	;
     break;}
-case 189:
-#line 1635 "asn1p_y.y"
+case 192:
+#line 1653 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_VisibleString; ;
     break;}
-case 190:
-#line 1636 "asn1p_y.y"
+case 193:
+#line 1654 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_ObjectDescriptor; ;
     break;}
-case 196:
-#line 1648 "asn1p_y.y"
+case 199:
+#line 1666 "asn1p_y.y"
 { yyval.a_constr = 0; ;
     break;}
-case 197:
-#line 1649 "asn1p_y.y"
+case 200:
+#line 1667 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 198:
-#line 1655 "asn1p_y.y"
+case 201:
+#line 1673 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0);
 	;
     break;}
-case 199:
-#line 1658 "asn1p_y.y"
+case 202:
+#line 1676 "asn1p_y.y"
 {
 		/*
 		 * This is a special case, for compatibility purposes.
@@ -2910,26 +2940,33 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0);
 	;
     break;}
-case 200:
-#line 1668 "asn1p_y.y"
+case 203:
+#line 1686 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[-1].a_constr;
 	;
     break;}
-case 201:
-#line 1671 "asn1p_y.y"
+case 204:
+#line 1689 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	;
     break;}
-case 202:
-#line 1677 "asn1p_y.y"
+case 205:
+#line 1695 "asn1p_y.y"
+{
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		yyval.a_constr->type = ACT_EL_EXT;
+	;
+    break;}
+case 206:
+#line 1699 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 203:
-#line 1680 "asn1p_y.y"
+case 207:
+#line 1702 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -2937,8 +2974,8 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct);
 	;
     break;}
-case 204:
-#line 1686 "asn1p_y.y"
+case 208:
+#line 1708 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -2948,38 +2985,38 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr);
 	;
     break;}
-case 205:
-#line 1697 "asn1p_y.y"
+case 209:
+#line 1719 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 206:
-#line 1700 "asn1p_y.y"
+case 210:
+#line 1722 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0);
 	;
     break;}
-case 207:
-#line 1703 "asn1p_y.y"
+case 211:
+#line 1725 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 208:
-#line 1706 "asn1p_y.y"
+case 212:
+#line 1728 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 209:
-#line 1709 "asn1p_y.y"
+case 213:
+#line 1731 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 210:
-#line 1715 "asn1p_y.y"
+case 214:
+#line 1737 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -2989,8 +3026,8 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 211:
-#line 1723 "asn1p_y.y"
+case 215:
+#line 1745 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -3000,8 +3037,8 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 212:
-#line 1731 "asn1p_y.y"
+case 216:
+#line 1753 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3009,8 +3046,8 @@
 		yyval.a_constr->value = yyvsp[0].a_value;
 	;
     break;}
-case 213:
-#line 1737 "asn1p_y.y"
+case 217:
+#line 1759 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3018,68 +3055,68 @@
 		yyval.a_constr->containedSubtype = yyvsp[0].a_value;
 	;
     break;}
-case 214:
-#line 1743 "asn1p_y.y"
-{
-		yyval.a_constr = asn1p_constraint_new(yylineno);
-		checkmem(yyval.a_constr);
-		yyval.a_constr->type = yyvsp[-1].a_ctype;
-		yyval.a_constr->range_start = yyvsp[-2].a_value;
-		yyval.a_constr->range_stop = yyvsp[0].a_value;
-	;
-    break;}
-case 215:
-#line 1750 "asn1p_y.y"
-{
-		yyval.a_constr = asn1p_constraint_new(yylineno);
-		checkmem(yyval.a_constr);
-		yyval.a_constr->type = yyvsp[-1].a_ctype;
-		yyval.a_constr->range_start = asn1p_value_fromint(-123);
-		yyval.a_constr->range_stop = yyvsp[0].a_value;
-		yyval.a_constr->range_start->type = ATV_MIN;
-	;
-    break;}
-case 216:
-#line 1758 "asn1p_y.y"
-{
-		yyval.a_constr = asn1p_constraint_new(yylineno);
-		checkmem(yyval.a_constr);
-		yyval.a_constr->type = yyvsp[-1].a_ctype;
-		yyval.a_constr->range_start = yyvsp[-2].a_value;
-		yyval.a_constr->range_stop = asn1p_value_fromint(321);
-		yyval.a_constr->range_stop->type = ATV_MAX;
-	;
-    break;}
-case 217:
-#line 1766 "asn1p_y.y"
-{
-		yyval.a_constr = asn1p_constraint_new(yylineno);
-		checkmem(yyval.a_constr);
-		yyval.a_constr->type = yyvsp[-1].a_ctype;
-		yyval.a_constr->range_start = asn1p_value_fromint(-123);
-		yyval.a_constr->range_stop = asn1p_value_fromint(321);
-		yyval.a_constr->range_start->type = ATV_MIN;
-		yyval.a_constr->range_stop->type = ATV_MAX;
-	;
-    break;}
 case 218:
-#line 1775 "asn1p_y.y"
+#line 1765 "asn1p_y.y"
 {
-		yyval.a_constr = yyvsp[0].a_constr;
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		checkmem(yyval.a_constr);
+		yyval.a_constr->type = yyvsp[-1].a_ctype;
+		yyval.a_constr->range_start = yyvsp[-2].a_value;
+		yyval.a_constr->range_stop = yyvsp[0].a_value;
 	;
     break;}
 case 219:
-#line 1778 "asn1p_y.y"
+#line 1772 "asn1p_y.y"
+{
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		checkmem(yyval.a_constr);
+		yyval.a_constr->type = yyvsp[-1].a_ctype;
+		yyval.a_constr->range_start = asn1p_value_fromint(-123);
+		yyval.a_constr->range_stop = yyvsp[0].a_value;
+		yyval.a_constr->range_start->type = ATV_MIN;
+	;
+    break;}
+case 220:
+#line 1780 "asn1p_y.y"
+{
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		checkmem(yyval.a_constr);
+		yyval.a_constr->type = yyvsp[-1].a_ctype;
+		yyval.a_constr->range_start = yyvsp[-2].a_value;
+		yyval.a_constr->range_stop = asn1p_value_fromint(321);
+		yyval.a_constr->range_stop->type = ATV_MAX;
+	;
+    break;}
+case 221:
+#line 1788 "asn1p_y.y"
+{
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		checkmem(yyval.a_constr);
+		yyval.a_constr->type = yyvsp[-1].a_ctype;
+		yyval.a_constr->range_start = asn1p_value_fromint(-123);
+		yyval.a_constr->range_stop = asn1p_value_fromint(321);
+		yyval.a_constr->range_start->type = ATV_MIN;
+		yyval.a_constr->range_stop->type = ATV_MAX;
+	;
+    break;}
+case 222:
+#line 1797 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 220:
-#line 1782 "asn1p_y.y"
+case 223:
+#line 1800 "asn1p_y.y"
+{
+		yyval.a_constr = yyvsp[0].a_constr;
+	;
+    break;}
+case 224:
+#line 1804 "asn1p_y.y"
 { asn1p_lexer_hack_push_opaque_state(); ;
     break;}
-case 221:
-#line 1782 "asn1p_y.y"
+case 225:
+#line 1804 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3089,64 +3126,64 @@
 		yyval.a_constr->value->type = ATV_UNPARSED;
 	;
     break;}
-case 222:
-#line 1793 "asn1p_y.y"
+case 226:
+#line 1815 "asn1p_y.y"
 { yyval.a_ctype = ACT_EL_RANGE; ;
     break;}
-case 223:
-#line 1794 "asn1p_y.y"
+case 227:
+#line 1816 "asn1p_y.y"
 { yyval.a_ctype = ACT_EL_RLRANGE; ;
     break;}
-case 224:
-#line 1795 "asn1p_y.y"
+case 228:
+#line 1817 "asn1p_y.y"
 { yyval.a_ctype = ACT_EL_LLRANGE; ;
     break;}
-case 225:
-#line 1796 "asn1p_y.y"
+case 229:
+#line 1818 "asn1p_y.y"
 { yyval.a_ctype = ACT_EL_ULRANGE; ;
     break;}
-case 226:
-#line 1800 "asn1p_y.y"
+case 230:
+#line 1822 "asn1p_y.y"
 {
 		yyval.a_ctype = ACT_CT_SIZE;
 	;
     break;}
-case 227:
-#line 1803 "asn1p_y.y"
+case 231:
+#line 1825 "asn1p_y.y"
 {
 		yyval.a_ctype = ACT_CT_FROM;
 	;
     break;}
-case 228:
-#line 1809 "asn1p_y.y"
+case 232:
+#line 1831 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_FALSE;
 	;
     break;}
-case 229:
-#line 1814 "asn1p_y.y"
+case 233:
+#line 1836 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(1);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_TRUE;
 	;
     break;}
-case 230:
-#line 1819 "asn1p_y.y"
+case 234:
+#line 1841 "asn1p_y.y"
 {
 		yyval.a_value = yyvsp[0].a_value;
 	;
     break;}
-case 231:
-#line 1822 "asn1p_y.y"
+case 235:
+#line 1844 "asn1p_y.y"
 {
 		yyval.a_value = yyvsp[0].a_value;
 	;
     break;}
-case 232:
-#line 1825 "asn1p_y.y"
+case 236:
+#line 1847 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3159,8 +3196,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 233:
-#line 1839 "asn1p_y.y"
+case 237:
+#line 1861 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3173,32 +3210,32 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 234:
-#line 1853 "asn1p_y.y"
+case 238:
+#line 1875 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0);
 	;
     break;}
-case 235:
-#line 1856 "asn1p_y.y"
+case 239:
+#line 1878 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0);
 	;
     break;}
-case 236:
-#line 1862 "asn1p_y.y"
+case 240:
+#line 1884 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 237:
-#line 1865 "asn1p_y.y"
+case 241:
+#line 1887 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 238:
-#line 1871 "asn1p_y.y"
+case 242:
+#line 1893 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3206,8 +3243,8 @@
 		yyval.a_constr->value = asn1p_value_frombuf("...", 3, 0);
 	;
     break;}
-case 239:
-#line 1877 "asn1p_y.y"
+case 243:
+#line 1899 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3217,46 +3254,46 @@
 		if(yyvsp[-1].a_constr) asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr);
 	;
     break;}
-case 240:
-#line 1891 "asn1p_y.y"
+case 244:
+#line 1913 "asn1p_y.y"
 { yyval.a_pres = ACPRES_DEFAULT; ;
     break;}
-case 241:
-#line 1892 "asn1p_y.y"
+case 245:
+#line 1914 "asn1p_y.y"
 { yyval.a_pres = yyvsp[0].a_pres; ;
     break;}
-case 242:
-#line 1896 "asn1p_y.y"
+case 246:
+#line 1918 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_PRESENT;
 	;
     break;}
-case 243:
-#line 1899 "asn1p_y.y"
+case 247:
+#line 1921 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_ABSENT;
 	;
     break;}
-case 244:
-#line 1902 "asn1p_y.y"
+case 248:
+#line 1924 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_OPTIONAL;
 	;
     break;}
-case 245:
-#line 1908 "asn1p_y.y"
+case 249:
+#line 1930 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 246:
-#line 1911 "asn1p_y.y"
+case 250:
+#line 1933 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 247:
-#line 1920 "asn1p_y.y"
+case 251:
+#line 1942 "asn1p_y.y"
 {
 		asn1p_ref_t *ref = asn1p_ref_new(yylineno);
 		asn1p_constraint_t *ct;
@@ -3270,14 +3307,14 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0);
 	;
     break;}
-case 248:
-#line 1935 "asn1p_y.y"
+case 252:
+#line 1957 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	;
     break;}
-case 249:
-#line 1941 "asn1p_y.y"
+case 253:
+#line 1963 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3285,8 +3322,8 @@
 		yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0);
 	;
     break;}
-case 250:
-#line 1947 "asn1p_y.y"
+case 254:
+#line 1969 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -3296,8 +3333,8 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct);
 	;
     break;}
-case 251:
-#line 1961 "asn1p_y.y"
+case 255:
+#line 1983 "asn1p_y.y"
 {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 2);
 		int ret;
@@ -3310,8 +3347,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 252:
-#line 1972 "asn1p_y.y"
+case 256:
+#line 1994 "asn1p_y.y"
 {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 3);
 		int ret;
@@ -3325,14 +3362,14 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 253:
-#line 1988 "asn1p_y.y"
+case 257:
+#line 2010 "asn1p_y.y"
 {
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
-case 254:
-#line 1991 "asn1p_y.y"
+case 258:
+#line 2013 "asn1p_y.y"
 {
 		int l1 = strlen(yyvsp[-2].tv_str);
 		int l3 = strlen(yyvsp[0].tv_str);
@@ -3343,61 +3380,61 @@
 		yyval.tv_str[l1 + 1 + l3] = '\0';
 	;
     break;}
-case 255:
-#line 2009 "asn1p_y.y"
+case 259:
+#line 2031 "asn1p_y.y"
 {
 		yyval.a_marker.flags = EM_NOMARK;
 		yyval.a_marker.default_value = 0;
 	;
     break;}
-case 256:
-#line 2013 "asn1p_y.y"
+case 260:
+#line 2035 "asn1p_y.y"
 { yyval.a_marker = yyvsp[0].a_marker; ;
     break;}
-case 257:
-#line 2017 "asn1p_y.y"
+case 261:
+#line 2039 "asn1p_y.y"
 {
 		yyval.a_marker.flags = EM_OPTIONAL | EM_INDIRECT;
 		yyval.a_marker.default_value = 0;
 	;
     break;}
-case 258:
-#line 2021 "asn1p_y.y"
+case 262:
+#line 2043 "asn1p_y.y"
 {
 		yyval.a_marker.flags = EM_DEFAULT;
 		yyval.a_marker.default_value = yyvsp[0].a_value;
 	;
     break;}
-case 259:
-#line 2044 "asn1p_y.y"
+case 263:
+#line 2066 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
 	;
     break;}
-case 260:
-#line 2048 "asn1p_y.y"
+case 264:
+#line 2070 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 	;
     break;}
-case 261:
-#line 2054 "asn1p_y.y"
+case 265:
+#line 2076 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 262:
-#line 2059 "asn1p_y.y"
+case 266:
+#line 2081 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 263:
-#line 2066 "asn1p_y.y"
+case 267:
+#line 2088 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3406,8 +3443,8 @@
 		yyval.a_expr->Identifier = yyvsp[0].tv_str;
 	;
     break;}
-case 264:
-#line 2073 "asn1p_y.y"
+case 268:
+#line 2095 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3417,8 +3454,8 @@
 		yyval.a_expr->value = yyvsp[-1].a_value;
 	;
     break;}
-case 265:
-#line 2081 "asn1p_y.y"
+case 269:
+#line 2103 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3428,8 +3465,8 @@
 		yyval.a_expr->value = yyvsp[-1].a_value;
 	;
     break;}
-case 266:
-#line 2089 "asn1p_y.y"
+case 270:
+#line 2111 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3438,8 +3475,8 @@
 		yyval.a_expr->value = yyvsp[0].a_value;
 	;
     break;}
-case 267:
-#line 2096 "asn1p_y.y"
+case 271:
+#line 2118 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3449,98 +3486,74 @@
 		yyval.a_expr->meta_type = AMT_VALUE;
 	;
     break;}
-case 268:
-#line 2107 "asn1p_y.y"
+case 272:
+#line 2129 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
 	;
     break;}
-case 269:
-#line 2111 "asn1p_y.y"
+case 273:
+#line 2133 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
 	;
     break;}
-case 270:
-#line 2142 "asn1p_y.y"
+case 274:
+#line 2164 "asn1p_y.y"
 { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ;
     break;}
-case 271:
-#line 2143 "asn1p_y.y"
+case 275:
+#line 2165 "asn1p_y.y"
 { yyval.a_tag = yyvsp[0].a_tag; ;
     break;}
-case 272:
-#line 2147 "asn1p_y.y"
+case 276:
+#line 2169 "asn1p_y.y"
 {
 		yyval.a_tag = yyvsp[-1].a_tag;
 		yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode;
 	;
     break;}
-case 273:
-#line 2154 "asn1p_y.y"
+case 277:
+#line 2176 "asn1p_y.y"
 {
 		yyval.a_tag = yyvsp[-2].a_tag;
 		yyval.a_tag.tag_value = yyvsp[-1].a_int;
 	;
     break;}
-case 274:
-#line 2160 "asn1p_y.y"
+case 278:
+#line 2182 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ;
     break;}
-case 275:
-#line 2161 "asn1p_y.y"
+case 279:
+#line 2183 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_UNIVERSAL; ;
     break;}
-case 276:
-#line 2162 "asn1p_y.y"
+case 280:
+#line 2184 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_APPLICATION; ;
     break;}
-case 277:
-#line 2163 "asn1p_y.y"
+case 281:
+#line 2185 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_PRIVATE; ;
     break;}
-case 278:
-#line 2167 "asn1p_y.y"
+case 282:
+#line 2189 "asn1p_y.y"
 { yyval.a_tag.tag_mode = TM_DEFAULT; ;
     break;}
-case 279:
-#line 2168 "asn1p_y.y"
+case 283:
+#line 2190 "asn1p_y.y"
 { yyval.a_tag.tag_mode = TM_IMPLICIT; ;
     break;}
-case 280:
-#line 2169 "asn1p_y.y"
+case 284:
+#line 2191 "asn1p_y.y"
 { yyval.a_tag.tag_mode = TM_EXPLICIT; ;
     break;}
-case 281:
-#line 2173 "asn1p_y.y"
-{
-		checkmem(yyvsp[0].tv_str);
-		yyval.tv_str = yyvsp[0].tv_str;
-	;
-    break;}
-case 282:
-#line 2177 "asn1p_y.y"
-{
-		checkmem(yyvsp[0].tv_str);
-		yyval.tv_str = yyvsp[0].tv_str;
-	;
-    break;}
-case 283:
-#line 2185 "asn1p_y.y"
-{
-		checkmem(yyvsp[0].tv_str);
-		yyval.tv_str = yyvsp[0].tv_str;
-	;
-    break;}
-case 284:
-#line 2192 "asn1p_y.y"
-{ yyval.tv_str = 0; ;
-    break;}
 case 285:
-#line 2193 "asn1p_y.y"
+#line 2195 "asn1p_y.y"
 {
+		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
@@ -3551,6 +3564,30 @@
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
+case 287:
+#line 2207 "asn1p_y.y"
+{
+		checkmem(yyvsp[0].tv_str);
+		yyval.tv_str = yyvsp[0].tv_str;
+	;
+    break;}
+case 288:
+#line 2214 "asn1p_y.y"
+{ yyval.tv_str = 0; ;
+    break;}
+case 289:
+#line 2215 "asn1p_y.y"
+{
+		yyval.tv_str = yyvsp[0].tv_str;
+	;
+    break;}
+case 290:
+#line 2221 "asn1p_y.y"
+{
+		checkmem(yyvsp[0].tv_str);
+		yyval.tv_str = yyvsp[0].tv_str;
+	;
+    break;}
 }
    /* the action file gets copied in in place of this dollarsign */
 #line 543 "/usr/share/bison.simple"
@@ -3773,7 +3810,7 @@
     }
   return 1;
 }
-#line 2205 "asn1p_y.y"
+#line 2227 "asn1p_y.y"
 
 
 
diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y
index 597f77c..f3131df 100644
--- a/libasn1parser/asn1p_y.y
+++ b/libasn1parser/asn1p_y.y
@@ -272,8 +272,8 @@
 %type	<tv_str>		optIdentifier
 %type	<a_parg>		ParameterArgumentName
 %type	<a_plist>		ParameterArgumentList
-%type	<a_expr>		Specialization
-%type	<a_expr>		Specializations
+%type	<a_expr>		ActualParameter
+%type	<a_expr>		ActualParameterList
 %type	<a_aid>			AssignedIdentifier	/* OID/DefinedValue */
 %type	<a_oid>			ObjectIdentifier	/* OID */
 %type	<a_oid>			optObjectIdentifier	/* Optional OID */
@@ -747,9 +747,9 @@
 		$$->meta_type = AMT_TYPEREF;
 	}
 	/*
-	 * A parametrized assignment.
+	 * A parameterized assignment.
 	 */
-	| ComplexTypeReference '{' Specializations '}' {
+	| ComplexTypeReference '{' ActualParameterList '}' {
 		$$ = asn1p_expr_new(yylineno);
 		checkmem($$);
 		$$->reference = $1;
@@ -782,7 +782,7 @@
 		assert($$->meta_type == AMT_OBJECTCLASS);
 	}
 	/*
-	 * Parametrized <Type> declaration:
+	 * Parameterized <Type> declaration:
 	 * === EXAMPLE ===
 	 *   SIGNED { ToBeSigned } ::= SEQUENCE {
 	 *      toBeSigned  ToBeSigned,
@@ -793,7 +793,12 @@
 	 */
 	| TypeRefName '{' ParameterArgumentList '}' TOK_PPEQ Type {
 		$$ = $6;
-		assert($$->Identifier == 0);
+		$$->Identifier = $1;
+		$$->lhs_params = $3;
+	}
+	/* Parameterized CLASS declaration */
+	| TypeRefName '{' ParameterArgumentList '}' TOK_PPEQ ObjectClass {
+		$$ = $6;
 		$$->Identifier = $1;
 		$$->lhs_params = $3;
 	}
@@ -846,21 +851,29 @@
 		checkmem(ret == 0);
 		$$.argument = $3;
 	}
+	| BasicTypeId ':' TypeRefName {
+		int ret;
+		$$.governor = asn1p_ref_new(yylineno);
+		ret = asn1p_ref_add_component($$.governor,
+			ASN_EXPR_TYPE2STR($1), 1);
+		checkmem(ret == 0);
+		$$.argument = $3;
+	}
 	;
 
-Specializations:
-	Specialization {
+ActualParameterList:
+	ActualParameter {
 		$$ = asn1p_expr_new(yylineno);
 		checkmem($$);
 		asn1p_expr_add($$, $1);
 	}
-	| Specializations ',' Specialization {
+	| ActualParameterList ',' ActualParameter {
 		$$ = $1;
 		asn1p_expr_add($$, $3);
 	}
 	;
 
-Specialization:
+ActualParameter:
 	Type {
 		$$ = $1;
 	}
@@ -883,10 +896,16 @@
 		asn1p_ref_add_component(ref, $1, RLT_lowercase);
 		$$->value = asn1p_value_fromref(ref, 0);
 	}
+	| ValueSet {
+		$$ = asn1p_expr_new(yylineno);
+		$$->expr_type = A1TC_VALUESET;
+		$$->meta_type = AMT_VALUESET;
+		$$->constraints = $1;
+	}
 	;
 
 /*
-	| '{' Specialization '}' {
+	| '{' ActualParameter '}' {
 		$$ = asn1p_expr_new(yylineno);
 		checkmem($$);
 		asn1p_expr_add($$, $2);
@@ -1255,7 +1274,6 @@
 		$$->expr_type = ASN_TYPE_ANY;
 		$$->meta_type = AMT_TYPE;
 	}
-
 	| TOK_INSTANCE TOK_OF ComplexTypeReference {
 		$$ = asn1p_expr_new(yylineno);
 		checkmem($$);
@@ -1674,7 +1692,11 @@
 	;
 
 ElementSetSpecs:
-	ElementSetSpec {
+	TOK_ThreeDots  {
+		$$ = asn1p_constraint_new(yylineno);
+		$$->type = ACT_EL_EXT;
+	}
+	| ElementSetSpec {
 		$$ = $1;
 	}
 	| ElementSetSpec ',' TOK_ThreeDots {