
/*** <<< INCLUDES [T1] >>> ***/

#include <INTEGER.h>
#include <constr_SET.h>

/*** <<< DEPS [T1] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum T1_PR {
	T1_PR_i,	/* Member i is present */
} T1_PR;
extern asn_TYPE_descriptor_t asn_DEF_T1;

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


typedef struct T1 {
	INTEGER_t	 i;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pT1, T1_PR_x) */
	unsigned int _presence_map
		[((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} T1_t;

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

static asn_TYPE_member_t asn_MBR_T1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct T1, i),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "i"
		},
};
static ber_tlv_tag_t asn_DEF_T1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_T1_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 14 */
};
static uint8_t asn_DEF_T1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(1 << 7)
};
static asn_SET_specifics_t asn_DEF_T1_specs = {
	sizeof(struct T1),
	offsetof(struct T1, _asn_ctx),
	offsetof(struct T1, _presence_map),
	asn_DEF_T1_tag2el,
	1,	/* Count of tags in the map */
	1,	/* Whether extensible */
	(unsigned int *)asn_DEF_T1_mmap	/* Mandatory elements map */
};
asn_TYPE_descriptor_t asn_DEF_T1 = {
	"T1",
	SET_free,
	SET_print,
	SET_constraint,
	SET_decode_ber,
	SET_encode_der,
	0,				/* Not implemented yet */
	SET_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_T1_tags,
	sizeof(asn_DEF_T1_tags)
		/sizeof(asn_DEF_T1_tags[0]), /* 1 */
	asn_DEF_T1_tags,	/* Same as above */
	sizeof(asn_DEF_T1_tags)
		/sizeof(asn_DEF_T1_tags[0]), /* 1 */
	asn_MBR_T1,
	1,	/* Elements count */
	&asn_DEF_T1_specs	/* Additional specs */
};


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

#include <INTEGER.h>
#include <constr_SET.h>

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


/*
 * Method of determining the components presence
 */
typedef enum T2_PR {
	T2_PR_i,	/* Member i is present */
} T2_PR;
extern asn_TYPE_descriptor_t asn_DEF_T2;

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


typedef struct T2 {
	INTEGER_t	 i;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pT2, T2_PR_x) */
	unsigned int _presence_map
		[((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* 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, i),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "i"
		},
};
static ber_tlv_tag_t asn_DEF_T2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_T2_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 15 */
};
static uint8_t asn_DEF_T2_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(1 << 7)
};
static asn_SET_specifics_t asn_DEF_T2_specs = {
	sizeof(struct T2),
	offsetof(struct T2, _asn_ctx),
	offsetof(struct T2, _presence_map),
	asn_DEF_T2_tag2el,
	1,	/* Count of tags in the map */
	1,	/* Whether extensible */
	(unsigned int *)asn_DEF_T2_mmap	/* Mandatory elements map */
};
asn_TYPE_descriptor_t asn_DEF_T2 = {
	"T2",
	SET_free,
	SET_print,
	SET_constraint,
	SET_decode_ber,
	SET_encode_der,
	0,				/* Not implemented yet */
	SET_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,
	1,	/* Elements count */
	&asn_DEF_T2_specs	/* Additional specs */
};


/*** <<< INCLUDES [T3] >>> ***/

#include <INTEGER.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [T3] >>> ***/

typedef enum T3_PR {
	T3_PR_NOTHING,	/* No components present */
	T3_PR_i,
	/* Extensions may appear below */
} T3_PR;
extern asn_TYPE_descriptor_t asn_DEF_T3;

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


typedef struct T3 {
	T3_PR present;
	union {
		INTEGER_t	 i;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} T3_t;

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

static asn_TYPE_member_t asn_MBR_T3[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct T3, choice.i),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "i"
		},
};
static asn_TYPE_tag2member_t asn_DEF_T3_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 16 */
};
static asn_CHOICE_specifics_t asn_DEF_T3_specs = {
	sizeof(struct T3),
	offsetof(struct T3, _asn_ctx),
	offsetof(struct T3, present),
	sizeof(((struct T3 *)0)->present),
	asn_DEF_T3_tag2el,
	1,	/* Count of tags in the map */
	1	/* Whether extensible */
};
asn_TYPE_descriptor_t asn_DEF_T3 = {
	"T3",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	0,				/* Not implemented yet */
	CHOICE_encode_xer,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	asn_MBR_T3,
	1,	/* Elements count */
	&asn_DEF_T3_specs	/* Additional specs */
};


/*** <<< INCLUDES [T4] >>> ***/

#include <INTEGER.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [T4] >>> ***/

typedef enum T4_PR {
	T4_PR_NOTHING,	/* No components present */
	T4_PR_i,
	/* Extensions may appear below */
} T4_PR;
extern asn_TYPE_descriptor_t asn_DEF_T4;

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


typedef struct T4 {
	T4_PR present;
	union {
		INTEGER_t	 i;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} T4_t;

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

static asn_TYPE_member_t asn_MBR_T4[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct T4, choice.i),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "i"
		},
};
static asn_TYPE_tag2member_t asn_DEF_T4_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 17 */
};
static asn_CHOICE_specifics_t asn_DEF_T4_specs = {
	sizeof(struct T4),
	offsetof(struct T4, _asn_ctx),
	offsetof(struct T4, present),
	sizeof(((struct T4 *)0)->present),
	asn_DEF_T4_tag2el,
	1,	/* Count of tags in the map */
	1	/* Whether extensible */
};
asn_TYPE_descriptor_t asn_DEF_T4 = {
	"T4",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	0,				/* Not implemented yet */
	CHOICE_encode_xer,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	asn_MBR_T4,
	1,	/* Elements count */
	&asn_DEF_T4_specs	/* Additional specs */
};

