
/*** <<< INCLUDES [T] >>> ***/

#include <INTEGER.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

/*** <<< FWD-DECLS [T] >>> ***/

struct T2;

/*** <<< TYPE-DECLS [T] >>> ***/

typedef struct T {
	INTEGER_t	 Int;
	struct collection {
		A_SEQUENCE_OF(struct T2) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} collection;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} T_t;

/*** <<< FUNC-DECLS [T] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_T;

/*** <<< POST-INCLUDE [T] >>> ***/

#include <T2.h>

/*** <<< STAT-DEFS [T] >>> ***/

static asn_TYPE_member_t asn_MBR_collection_2[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_T2,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_collection_2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_collection_2_specs = {
	sizeof(struct collection),
	offsetof(struct collection, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_collection_2 = {
	"collection",
	"collection",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_collection_2_tags,
	sizeof(asn_DEF_collection_2_tags)
		/sizeof(asn_DEF_collection_2_tags[0]), /* 1 */
	asn_DEF_collection_2_tags,	/* Same as above */
	sizeof(asn_DEF_collection_2_tags)
		/sizeof(asn_DEF_collection_2_tags[0]), /* 1 */
	asn_MBR_collection_2,
	1,	/* Single element */
	&asn_SPC_collection_2_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_T_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct T, Int),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "int"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct T, collection),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_collection_2,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "collection"
		},
};
static ber_tlv_tag_t asn_DEF_T_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_T_1_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* int at 15 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 } /* collection at 17 */
};
static asn_SEQUENCE_specifics_t asn_SPC_T_1_specs = {
	sizeof(struct T),
	offsetof(struct T, _asn_ctx),
	asn_MAP_T_1_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_T = {
	"T",
	"T",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_T_1_tags,
	sizeof(asn_DEF_T_1_tags)
		/sizeof(asn_DEF_T_1_tags[0]), /* 1 */
	asn_DEF_T_1_tags,	/* Same as above */
	sizeof(asn_DEF_T_1_tags)
		/sizeof(asn_DEF_T_1_tags[0]), /* 1 */
	asn_MBR_T_1,
	2,	/* Elements count */
	&asn_SPC_T_1_specs	/* Additional specs */
};


/*** <<< INCLUDES [T2] >>> ***/

#include <BOOLEAN.h>
#include <UTF8String.h>
#include <constr_SEQUENCE.h>

/*** <<< TYPE-DECLS [T2] >>> ***/

typedef struct T2 {
	BOOLEAN_t	 flag;
	UTF8String_t	 str;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} T2_t;

/*** <<< FUNC-DECLS [T2] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_T2;

/*** <<< STAT-DEFS [T2] >>> ***/

static asn_TYPE_member_t asn_MBR_T2_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct T2, flag),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_BOOLEAN,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "flag"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct T2, str),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_UTF8String,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "str"
		},
};
static ber_tlv_tag_t asn_DEF_T2_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_T2_1_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* flag at 20 */
    { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 1, 0, 0 } /* str at 21 */
};
static asn_SEQUENCE_specifics_t asn_SPC_T2_1_specs = {
	sizeof(struct T2),
	offsetof(struct T2, _asn_ctx),
	asn_MAP_T2_1_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_T2 = {
	"T2",
	"T2",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_T2_1_tags,
	sizeof(asn_DEF_T2_1_tags)
		/sizeof(asn_DEF_T2_1_tags[0]), /* 1 */
	asn_DEF_T2_1_tags,	/* Same as above */
	sizeof(asn_DEF_T2_1_tags)
		/sizeof(asn_DEF_T2_1_tags[0]), /* 1 */
	asn_MBR_T2_1,
	2,	/* Elements count */
	&asn_SPC_T2_1_specs	/* Additional specs */
};

