/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "RANAP-IEs"
 * 	found in "../../asn1/ranap/RANAP-IEs.asn"
 */

#include <osmocom/ranap/RANAP_InterSystemInformationTransferType.h>

static asn_per_constraints_t asn_PER_type_RANAP_InterSystemInformationTransferType_constr_1 GCC_NOTUSED = {
	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_TYPE_member_t asn_MBR_RANAP_InterSystemInformationTransferType_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InterSystemInformationTransferType, choice.rIM_Transfer),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_RIM_Transfer,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"rIM-Transfer"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_InterSystemInformationTransferType_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rIM-Transfer */
};
static asn_CHOICE_specifics_t asn_SPC_RANAP_InterSystemInformationTransferType_specs_1 = {
	sizeof(struct RANAP_InterSystemInformationTransferType),
	offsetof(struct RANAP_InterSystemInformationTransferType, _asn_ctx),
	offsetof(struct RANAP_InterSystemInformationTransferType, present),
	sizeof(((struct RANAP_InterSystemInformationTransferType *)0)->present),
	asn_MAP_RANAP_InterSystemInformationTransferType_tag2el_1,
	1,	/* Count of tags in the map */
	0,
	1	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_InterSystemInformationTransferType = {
	"RANAP_InterSystemInformationTransferType",
	"RANAP_InterSystemInformationTransferType",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	CHOICE_decode_uper,
	CHOICE_encode_uper,
	CHOICE_decode_aper,
	CHOICE_encode_aper,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	&asn_PER_type_RANAP_InterSystemInformationTransferType_constr_1,
	asn_MBR_RANAP_InterSystemInformationTransferType_1,
	1,	/* Elements count */
	&asn_SPC_RANAP_InterSystemInformationTransferType_specs_1	/* Additional specs */
};

