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

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

/*** <<< DEPS [T] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_T;

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


typedef struct T {
	INTEGER_t	 Int;
	struct collection {
		A_SEQUENCE_OF(T2_t) 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;

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

static asn_TYPE_member_t asn_MBR_collection[] = {
	{ 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_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_collection_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 = {
	"collection",
	"collection",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	0,				/* Not implemented yet */
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_collection_tags,
	sizeof(asn_DEF_collection_tags)
		/sizeof(asn_DEF_collection_tags[0]), /* 1 */
	asn_DEF_collection_tags,	/* Same as above */
	sizeof(asn_DEF_collection_tags)
		/sizeof(asn_DEF_collection_tags[0]), /* 1 */
	asn_MBR_collection,
	1,	/* Single element */
	&asn_DEF_collection_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_T[] = {
	{ 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,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "collection"
		},
};
static ber_tlv_tag_t asn_DEF_T_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_T_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_DEF_T_specs = {
	sizeof(struct T),
	offsetof(struct T, _asn_ctx),
	asn_DEF_T_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_tags,
	sizeof(asn_DEF_T_tags)
		/sizeof(asn_DEF_T_tags[0]), /* 1 */
	asn_DEF_T_tags,	/* Same as above */
	sizeof(asn_DEF_T_tags)
		/sizeof(asn_DEF_T_tags[0]), /* 1 */
	asn_MBR_T,
	2,	/* Elements count */
	&asn_DEF_T_specs	/* Additional specs */
};


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

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

/*** <<< DEPS [T2] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_T2;

/*** <<< 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;

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

static asn_TYPE_member_t asn_MBR_T2[] = {
	{ 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_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_T2_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_DEF_T2_specs = {
	sizeof(struct T2),
	offsetof(struct T2, _asn_ctx),
	asn_DEF_T2_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_tags,
	sizeof(asn_DEF_T2_tags)
		/sizeof(asn_DEF_T2_tags[0]), /* 1 */
	asn_DEF_T2_tags,	/* Same as above */
	sizeof(asn_DEF_T2_tags)
		/sizeof(asn_DEF_T2_tags[0]), /* 1 */
	asn_MBR_T2,
	2,	/* Elements count */
	&asn_DEF_T2_specs	/* Additional specs */
};

