module Osmocom_Gb_Types {

	/* This module contains additional definitions and templates that we use on top of the
	 * TITAN NS + BSSGP modules */

	import from General_Types all;
	import from Osmocom_Types all;
	import from GSM_Types all;
	import from BSSGP_Types all
	import from NS_Types all
	import from Native_Functions all;

	type uint16_t Nsvci;
	type uint16_t Nsei;
	type uint16_t BssgpBvci;

	template (present) BssgpBvci t_BssgpBvciUser := complement (0);

	type enumerated OsmoNsDialect {
		NS2_DIALECT_UNDEF		('00'H),
		NS2_DIALECT_STATIC_ALIVE	('01'H),
		NS2_DIALECT_STATIC_RESETBLOCK	('02'H),
		NS2_DIALECT_IPACCESS		('03'H),
		NS2_DIALECT_SNS			('04'H)
	};

	/* TS 48.016 10.3.7 */
	type enumerated NsPduType {
		NS_PDUT_NS_UNITDATA	('00000000'B),
		NS_PDUT_NS_RESET	('00000010'B),
		NS_PDUT_NS_RESET_ACK	('00000011'B),
		NS_PDUT_NS_BLOCK	('00000100'B),
		NS_PDUT_NS_BLOCK_ACK	('00000101'B),
		NS_PDUT_NS_UNBLOCK	('00000110'B),
		NS_PDUT_NS_UNBLOCK_ACK	('00000111'B),
		NS_PDUT_NS_STATUS	('00001000'B),
		NS_PDUT_NS_ALIVE	('00001010'B),
		NS_PDUT_NS_ALIVE_ACK	('00001011'B)
		/* FIXME: SNS */
	} with { variant "FIELDLENGTH(8)" };

	/* TS 48.016 10.3 */
	type enumerated NsIEI {
		NS_IEI_CAUSE		('00000000'B),
		NS_IEI_NSVCI		('00000001'B),
		NS_IEI_NS_PDU		('00000010'B),
		NS_IEI_BVCI		('00000011'B),
		NS_IEI_NSEI		('00000100'B),
		NS_IEI_LIST_IPv4	('00000101'B),
		NS_IEI_LIST_IPv6	('00000110'B),
		NS_IEI_MAX_NUM_NSVC	('00000111'B),
		NS_IEI_NUM_IPv4_EP	('00001000'B),
		NS_IEI_NUM_IPv6_EP	('00001001'B),
		NS_IEI_RESET_FLAG	('00001010'B),
		NS_IEI_IP_ADDRESS	('00001011'B)
	} with { variant "FIELDLENGTH(8)" };

	/* TS 48.016 10.3.2 */
	type enumerated NsCause {
		NS_CAUSE_TRANSIT_NETWORK_FAILURE		('00000000'B),
		NS_CAUSE_OM_INTERVENTION			('00000001'B),
		NS_CAUSE_EQUIPMENT_FAILURE			('00000010'B),
		NS_CAUSE_NSVC_BLOCKED				('00000011'B),
		NS_CAUSE_NSVC_UNKNOWN				('00000100'B),
		NS_CAUSE_BVCI_UNKNOWN_AT_NSE			('00000101'B),
		NS_CAUSE_SEMANTICALLY_INCORRECT_PDU		('00001000'B),
		NS_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE	('00001010'B),
		NS_CAUSE_PROTOCOL_ERROR_UNSPEIFIED		('00001011'B),
		NS_CAUSE_INVALID_ESSENTIAL_IE			('00001100'B),
		NS_CAUSE_MISSING_ESSENTIAL_IE			('00001101'B),
		NS_CAUSE_INVALID_NR_OF_IPv4_ENDPOINTS		('00001110'B),
		NS_CAUSE_INVALID_NR_OF_IPv6_ENDPOINTS		('00001111'B),
		NS_CAUSE_INVALID_NR_OF_NSVCS			('00010000'B),
		NS_CAUSE_INVALID_WEIGHTS			('00010001'B),
		NS_CAUSE_UNKNOWN_IP_ENDPOINT			('00010010'B),
		NS_CAUSE_UNKNOWN_IP_ADDRESS			('00010011'B),
		NS_CAUSE_IP_TEST_FAILEDA			('00010100'B)
	} with { variant "FIELDLENGTH(8)" };

	template (value) NS_SDU_ControlBits t_SduCtrlB := {
		rBit := '0'B,
		cBit := '0'B,
		spare := '000000'B
	}

	template (value) CauseNS ts_NS_IE_CAUSE(NsCause cause) := {
		iEI := '00'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		cause := int2oct(enum2int(valueof(cause)), 1)
	}
	function ts_NS_IE_CAUSE_omit(template (omit) NsCause cause) return template (omit) CauseNS {
		var template (omit) CauseNS ret;
		if (istemplatekind(cause, "omit")) {
			return omit;
		} else {
			ret := {
				iEI := '00'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				cause := int2oct(enum2int(valueof(cause)), 1)
			}
			return ret;
		}
	}

	function tr_NS_IE_CAUSE(template NsCause cause) return template CauseNS {
		var template CauseNS ret;
		ret.iEI := '00'O;
		ret.ext := '1'B;
		ret.lengthIndicator := { length1 := 1 };
		if (istemplatekind(cause, "omit")) {
			return omit;
		} else if (istemplatekind(cause, "*")) {
			return *;
		} else if (istemplatekind(cause, "?")) {
			ret.cause := ?
		} else {
			ret.cause := int2oct(enum2int(valueof(cause)), 1);
		}
		return ret;
	}

	function ts_SNS_IP_ADDR(template (omit) IPAddress ip) return template (omit) IP_Address_NS {
		var template (omit) IP_Address_NS ret;
		if (istemplatekind(ip, "omit")) {
			return omit;
		} else {
			ret.iEI := '0B'O;
			ret.ipAddress := ip;
			if (ischosen(ip.ip4Address)) {
				ret.addressType := '01'O;
			} else {
				ret.addressType := '02'O;
			}
		}
		return ret;
	}
	function tr_SNS_IP_ADDR(template IPAddress ip) return template IP_Address_NS {
		var template IP_Address_NS ret;
		ret.iEI := '0B'O;
		if (istemplatekind(ip, "omit")) {
			return omit;
		} else if (istemplatekind(ip, "*")) {
			return *;
		} else if (istemplatekind(ip, "?")) {
			return ?;
		} else {
			ret.ipAddress := ip;
			if (ischosen(ip.ip4Address)) {
				ret.addressType := '01'O;
			} else {
				ret.addressType := '02'O;
			}
		}
		return ret;
	}

	private function f_oct_or_wc(template integer inp, integer len) return template octetstring {
		if (istemplatekind(inp, "omit")) {
			return omit;
		} else if (istemplatekind(inp, "*")) {
			return *;
		} else if (istemplatekind(inp, "?")) {
			return ?;
		}
		return int2oct(valueof(inp), len);
	}

	private function f_hex_or_wc(template integer inp, integer len) return template hexstring {
		if (istemplatekind(inp, "omit")) {
			return omit;
		} else if (istemplatekind(inp, "*")) {
			return *;
		} else if (istemplatekind(inp, "?")) {
			return ?;
		}
		return int2hex(valueof(inp), len);
	}

	template (value) NS_VCI ts_NS_IE_NSVCI(Nsvci nsvci) := {
		iEI := '01'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nS_VCI := int2oct(nsvci, 2)
	}
	template NS_VCI tr_NS_IE_NSVCI(template Nsvci nsvci) := {
		iEI := '01'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nS_VCI := f_oct_or_wc(nsvci, 2)
	}

	template (value) NSEI_NS ts_NS_IE_NSEI(Nsei nsei) := {
		iEI:= '04'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nSEI := int2oct(nsei, 2)
	}
	template NSEI_NS tr_NS_IE_NSEI(template Nsei nsei) := {
		iEI:= '04'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nSEI := f_oct_or_wc(nsei, 2)
	}

	template (value) IP4_Element ts_SNS_IPv4(charstring ip, integer udp_port,
						 uint8_t sig_weight := 1, uint8_t data_weight := 1) := {
		ipAddress := f_inet_addr(ip),
		uDP_Port := int2oct(udp_port, 2),
		signallingWeight := int2oct(sig_weight, 1),
		dataWeight := int2oct(data_weight, 1)
	}
	function tr_SNS_IPv4(template charstring ip, template integer udp_port,
				template uint8_t sig_weight := ?, template uint8_t data_weight := ?)
	return template IP4_Element {
		var template IP4_Element e;
		if (istemplatekind(ip, "?")) {
			e.ipAddress := ?;
		} else {
			e.ipAddress := f_inet_addr(valueof(ip));
		}
		if (istemplatekind(udp_port, "?")) {
			e.uDP_Port := ?;
		} else {
			e.uDP_Port := int2oct(valueof(udp_port), 2);
		}
		if (istemplatekind(sig_weight, "?")) {
			e.signallingWeight := ?;
		} else {
			e.signallingWeight := int2oct(valueof(sig_weight), 1);
		}
		if (istemplatekind(data_weight, "?")) {
			e.dataWeight := ?;
		} else {
			e.dataWeight := int2oct(valueof(data_weight), 1);
		}
		return e;
	}

	template (value) IP6_Element ts_SNS_IPv6(charstring ip, integer udp_port,
						 uint8_t sig_weight := 1, uint8_t data_weight := 1) := {
		ipAddress := f_inet6_addr(ip),
		uDP_Port := int2oct(udp_port, 2),
		signallingWeight := int2oct(sig_weight, 1),
		dataWeight := int2oct(data_weight, 1)
	}
	function tr_SNS_IPv6(template charstring ip, template integer udp_port,
				template uint8_t sig_weight := ?, template uint8_t data_weight := ?)
	return template IP6_Element {
		var template IP6_Element e;
		if (istemplatekind(ip, "?")) {
			e.ipAddress := ?;
		} else {
			e.ipAddress := f_inet6_addr(valueof(ip));
		}
		if (istemplatekind(udp_port, "?")) {
			e.uDP_Port := ?;
		} else {
			e.uDP_Port := int2oct(valueof(udp_port), 2);
		}
		if (istemplatekind(sig_weight, "?")) {
			e.signallingWeight := ?;
		} else {
			e.signallingWeight := int2oct(valueof(sig_weight), 1);
		}
		if (istemplatekind(data_weight, "?")) {
			e.dataWeight := ?;
		} else {
			e.dataWeight := int2oct(valueof(data_weight), 1);
		}
		return e;
	}


	template (value) PDU_NS ts_NS_RESET(NsCause cause, Nsvci nsvci, Nsei nsei) := {
		pDU_NS_Reset := {
			nsPduType := '02'O,
			causeNS := ts_NS_IE_CAUSE(cause),
			nS_VCI := ts_NS_IE_NSVCI(nsvci),
			nSEI_NS := ts_NS_IE_NSEI(nsei)
		}
	}
	template PDU_NS tr_NS_RESET(template NsCause cause, template Nsvci nsvci, template Nsei nsei) := {
		pDU_NS_Reset := {
			nsPduType := '02'O,
			causeNS := tr_NS_IE_CAUSE(cause),
			nS_VCI := tr_NS_IE_NSVCI(nsvci),
			nSEI_NS := tr_NS_IE_NSEI(nsei)
		}
	}

	template (value) PDU_NS ts_NS_RESET_ACK(Nsvci nsvci, Nsei nsei) := {
		pDU_NS_Reset_Ack := {
			nsPduType := '03'O,
			nS_VCI := ts_NS_IE_NSVCI(nsvci),
			nSEI_NS := ts_NS_IE_NSEI(nsei)
		}
	}
	template PDU_NS tr_NS_RESET_ACK(template Nsvci nsvci, template Nsei nsei) := {
		pDU_NS_Reset_Ack := {
			nsPduType := '03'O,
			nS_VCI := tr_NS_IE_NSVCI(nsvci),
			nSEI_NS := tr_NS_IE_NSEI(nsei)
		}
	}

	template (value) PDU_NS ts_NS_BLOCK(NsCause cause, Nsvci nsvci) := {
		pDU_NS_Block := {
			nsPduType := '04'O,
			causeNS := ts_NS_IE_CAUSE(cause),
			nS_VCI := ts_NS_IE_NSVCI(nsvci)
		}
	}
	template PDU_NS tr_NS_BLOCK(template NsCause cause, template Nsvci nsvci) := {
		pDU_NS_Block := {
			nsPduType := '04'O,
			causeNS := tr_NS_IE_CAUSE(cause),
			nS_VCI := tr_NS_IE_NSVCI(nsvci)
		}
	}

	template (value) PDU_NS ts_NS_BLOCK_ACK(Nsvci nsvci) := {
		pDU_NS_Block_Ack := {
			nsPduType := '05'O,
			nS_VCI := ts_NS_IE_NSVCI(nsvci)
		}
	}
	template PDU_NS tr_NS_BLOCK_ACK(template Nsvci nsvci) := {
		pDU_NS_Block_Ack := {
			nsPduType := '05'O,
			nS_VCI := tr_NS_IE_NSVCI(nsvci)
		}
	}

	template PDU_NS t_NS_UNBLOCK := {
		pDU_NS_Unblock := {
			nsPduType := '06'O
		}
	}

	template PDU_NS t_NS_UNBLOCK_ACK := {
		pDU_NS_Unblock_Ack := {
			nsPduType := '07'O
		}
	}

	template PDU_NS t_NS_ALIVE := {
		pDU_NS_Alive := {
			nsPduType := '0A'O
		}
	}

	template PDU_NS t_NS_ALIVE_ACK := {
		pDU_NS_Alive_Ack := {
			nsPduType := '0B'O
		}
	}

	template (value) PDU_NS ts_NS_STATUS(NsCause cause, PDU_NS pdu) := {
		pDU_NS_Status := {
			nsPduType := '08'O,
			causeNS := ts_NS_IE_CAUSE(cause),
			nS_VCI := omit,
			nS_PDU := {
				iEI := '02'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				ns_PDU := enc_PDU_NS(pdu)
			},
			bVCI_NS := omit,
			listofIP4Elements := omit,
			listofIP6Elements := omit
		}
	}

	template PDU_NS tr_NS_STATUS(template NsCause cause) := {
		pDU_NS_Status := {
			nsPduType := '08'O,
			causeNS := tr_NS_IE_CAUSE(cause),
			nS_VCI := *,
			nS_PDU := *,
			bVCI_NS := *,
			listofIP4Elements := *,
			listofIP6Elements := *
		}
	}

	template (value) PDU_NS ts_NS_UNITDATA(template (value) NS_SDU_ControlBits bits, BssgpBvci bvci, octetstring sdu) := {
		pDU_NS_Unitdata := {
			nsPduType := '00'O,
			nS_SDU_ControlBits := bits,
			bVCI := int2oct(bvci, 2),
			nS_SDU := sdu
		}
	}
	template PDU_NS tr_NS_UNITDATA(template NS_SDU_ControlBits bits, template BssgpBvci bvci, template
octetstring sdu) := {
		pDU_NS_Unitdata := {
			nsPduType := '00'O,
			nS_SDU_ControlBits := bits,
			bVCI := f_oct_or_wc(bvci, 2),
			nS_SDU := sdu
		}
	}
	template PDU_NS tr_NS_UNITDATA_User(template NS_SDU_ControlBits bits, template octetstring sdu) := {
		pDU_NS_Unitdata := {
			nsPduType := '00'O,
			nS_SDU_ControlBits := bits,
			bVCI := complement ('0000'O),
			nS_SDU := sdu
		}
	}



	private function ts_num_of_ep(OCT1 iei, template (omit) uint16_t num_ep)
	return template (omit) NumberOfIP_Endpoints {
		var template (omit) NumberOfIP_Endpoints t;
		if (istemplatekind(num_ep, "omit")) {
			return omit;
		} else {
			t.iEI := iei;
			t.numberOfIP_Endpoints := int2oct(valueof(num_ep), 2);
			return t;
		}
	}
	private function tr_num_of_ep(OCT1 iei, template uint16_t num_ep)
	return template NumberOfIP_Endpoints {
		var template NumberOfIP_Endpoints t;
		if (istemplatekind(num_ep, "omit")) {
			return omit;
		} else if (istemplatekind(num_ep, "*")) {
			return *;
		} else if (istemplatekind(num_ep, "?")) {
			return ?;
		} else {
			t.iEI := iei;
			t.numberOfIP_Endpoints := int2oct(valueof(num_ep), 2);
			return t;
		}
	}


	template (value) ResetFlag ts_SNS_IE_ResetFlag(boolean rst) := {
		iEI := '0A'O,
		resetBIT := bool2bit(rst),
		spare := '0000000'B
	}
	template ResetFlag tr_SNS_IE_ResetFlag(template boolean rst) := {
		iEI := '0A'O,
		resetBIT := bool2bit_tmpl(rst),
		spare := '0000000'B
	}

	template (value) EndFlag ts_SNS_IE_EndFlag(boolean end) := {
		eBIT := bool2bit(end),
		spare := '0000000'B
	}
	template EndFlag tr_SNS_IE_EndFlag(template boolean end) := {
		eBIT := bool2bit_tmpl(end),
		spare := '0000000'B
	}

	template (value) MaxNumberOfNSVCs ts_SNS_IE_MaxNumOfNSVCs(uint16_t num) := {
		iEI := '07'O,
		maxNumberOfNSVCs := int2oct(num, 2)
	}
	template MaxNumberOfNSVCs tr_SNS_IE_MaxNumOfNSVCs(template uint16_t num) := {
		iEI := '07'O,
		maxNumberOfNSVCs := f_oct_or_wc(num, 2)
	}

	template (value) PDU_NS ts_SNS_SIZE(Nsei nsei, boolean rst_flag := true,
				uint16_t max_nsvcs := 2,
				template (omit) uint16_t num_v4 := 1,
				template (omit) uint16_t num_v6 := omit) := {
		pDU_SNS_Size := {
			nsPduType := '12'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			resetFlag := ts_SNS_IE_ResetFlag(rst_flag),
			maxNumberOfNSVCs := ts_SNS_IE_MaxNumOfNSVCs(max_nsvcs),
			numberOfIP4_Endpoints := ts_num_of_ep('08'O, num_v4),
			numberOfIP6_Endpoints := ts_num_of_ep('09'O, num_v6)
		}
	}
	template PDU_NS tr_SNS_SIZE(template Nsei nsei, template boolean rst_flag := ?,
				template uint16_t max_nsvcs := ?,
				template uint16_t num_v4 := ?,
				template uint16_t num_v6 := *) := {
		pDU_SNS_Size := {
			nsPduType := '12'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			resetFlag := tr_SNS_IE_ResetFlag(rst_flag),
			maxNumberOfNSVCs := tr_SNS_IE_MaxNumOfNSVCs(max_nsvcs),
			numberOfIP4_Endpoints := tr_num_of_ep('08'O, num_v4),
			numberOfIP6_Endpoints := tr_num_of_ep('09'O, num_v6)
		}
	}

	template PDU_NS ts_SNS_SIZE_ACK(Nsei nsei, template (omit) NsCause cause) := {
		pDU_SNS_Size_Ack := {
			nsPduType := '13'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			causeNS := ts_NS_IE_CAUSE_omit(cause)
		}
	}
	template PDU_NS tr_SNS_SIZE_ACK(template Nsei nsei, template NsCause cause) := {
		pDU_SNS_Size_Ack := {
			nsPduType := '13'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			causeNS := tr_NS_IE_CAUSE(cause)
		}
	}

	private function ts_SNS_IE_ListIP4(template (omit) IP4_Elements elem)
	return template (omit) ListofIP4Elements {
		var template (omit) ListofIP4Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else {
			r := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				iP4_Elements := elem
			}
			return r;
		}
	}
	private function tr_SNS_IE_ListIP4(template IP4_Elements elem)
	return template ListofIP4Elements {
		var template ListofIP4Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else if (istemplatekind(elem, "*")) {
			return *;
		} else if (istemplatekind(elem, "?")) {
			return ?;
		} else {
			r := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := ? /* overwritten */
				},
				iP4_Elements := elem
			}
			return r;
		}
	}

	private function ts_SNS_IE_ListIP6(template (omit) IP6_Elements elem)
	return template (omit) ListofIP6Elements {
		var template (omit) ListofIP6Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else {
			r := {
				iEI := '06'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				iP6_Elements := elem
			}
			return r;
		}
	}
	private function tr_SNS_IE_ListIP6(template IP6_Elements elem)
	return template ListofIP6Elements {
		var template ListofIP6Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else if (istemplatekind(elem, "*")) {
			return *;
		} else if (istemplatekind(elem, "?")) {
			return ?;
		} else {
			r := {
				iEI := '06'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := ? /* overwritten */
				},
				iP6_Elements := elem
			}
			return r;
		}
	}

	template (value) PDU_NS ts_SNS_CONFIG(Nsei nsei, boolean end_flag,
					template (omit) IP4_Elements v4 := omit,
					template (omit) IP6_Elements v6 := omit) := {
		pDU_SNS_Config := {
			nsPduType := '0F'O,
			endFlag := ts_SNS_IE_EndFlag(end_flag),
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			listofIP4Elements := ts_SNS_IE_ListIP4(v4),
			listofIP6Elements := ts_SNS_IE_ListIP6(v6)
		}
	}
	template PDU_NS tr_SNS_CONFIG(template Nsei nsei, template boolean end_flag,
					template IP4_Elements v4 := omit,
					template IP6_Elements v6 := omit) := {
		pDU_SNS_Config := {
			nsPduType := '0F'O,
			endFlag := tr_SNS_IE_EndFlag(end_flag),
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			listofIP4Elements := tr_SNS_IE_ListIP4(v4),
			listofIP6Elements := tr_SNS_IE_ListIP6(v6)
		}
	}

	template (value) PDU_NS ts_SNS_CONFIG_ACK(Nsei nsei, template (omit) NsCause cause) := {
		pDU_SNS_Config_Ack := {
			nsPduType := '10'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			causeNS := ts_NS_IE_CAUSE_omit(cause)
		}
	}
	template PDU_NS tr_SNS_CONFIG_ACK(template Nsei nsei, template NsCause cause) := {
		pDU_SNS_Config_Ack := {
			nsPduType := '10'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			causeNS := tr_NS_IE_CAUSE(cause)
		}
	}

	template (value) PDU_NS ts_SNS_ADD(Nsei nsei, uint8_t trans_id,
					   template (omit) IP4_Elements v4,
					   template (omit) IP6_Elements v6 := omit) := {
		pDU_SNS_Add := {
			nsPduType := '0D'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			listofIP4Elements := ts_SNS_IE_ListIP4(v4),
			listofIP6Elements := ts_SNS_IE_ListIP6(v6)
		}
	}
	template PDU_NS tr_SNS_ADD(template Nsei nsei, template uint8_t trans_id,
				   template IP4_Elements v4,
				   template IP6_Elements v6 := omit) := {
		pDU_SNS_Add := {
			nsPduType := '0D'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			listofIP4Elements := tr_SNS_IE_ListIP4(v4),
			listofIP6Elements := tr_SNS_IE_ListIP6(v6)
		}
	}

	template (value) PDU_NS ts_SNS_DEL(Nsei nsei, uint8_t trans_id,
					   template (omit) IPAddress ip_sns,
					   template (omit) IP4_Elements v4,
					   template (omit) IP6_Elements v6 := omit) := {
		pDU_SNS_Delete := {
			nsPduType := '11'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			iP_Address_NS := ts_SNS_IP_ADDR(ip_sns),
			listofIP4Elements := ts_SNS_IE_ListIP4(v4),
			listofIP6Elements := ts_SNS_IE_ListIP6(v6)
		}
	}
	template PDU_NS tr_SNS_DEL(template Nsei nsei, template uint8_t trans_id,
				   template IPAddress ip_sns,
				   template IP4_Elements v4,
				   template IP6_Elements v6 := omit) := {
		pDU_SNS_Delete := {
			nsPduType := '11'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			iP_Address_NS := tr_SNS_IP_ADDR(ip_sns),
			listofIP4Elements := tr_SNS_IE_ListIP4(v4),
			listofIP6Elements := tr_SNS_IE_ListIP6(v6)
		}
	}

	template (value) PDU_NS ts_SNS_CHG_WEIGHT(Nsei nsei, uint8_t trans_id,
						  template (omit) IP4_Elements v4,
						  template (omit) IP6_Elements v6 := omit) := {
		pDU_SNS_ChangeWeight := {
			nsPduType := '0E'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			listofIP4Elements := ts_SNS_IE_ListIP4(v4),
			listofIP6Elements := ts_SNS_IE_ListIP6(v6)
		}
	}
	template PDU_NS tr_SNS_CHG_WEIGHT(template Nsei nsei, template uint8_t trans_id,
					  template IP4_Elements v4,
					  template IP6_Elements v6 := omit) := {
		pDU_SNS_ChangeWeight := {
			nsPduType := '0E'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			listofIP4Elements := tr_SNS_IE_ListIP4(v4),
			listofIP6Elements := tr_SNS_IE_ListIP6(v6)
		}
	}


	template (value) PDU_NS ts_SNS_ACK(Nsei nsei, uint8_t trans_id,
					   template (omit) NsCause cause := omit,
					   template (omit) IP4_Elements v4 := omit,
					   template (omit) IP6_Elements v6 := omit) := {
		pDU_SNS_Ack := {
			nsPduType := '0C'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			causeNS := ts_NS_IE_CAUSE_omit(cause),
			iP_Address_NS := omit,
			listofIP4Elements := ts_SNS_IE_ListIP4(v4),
			listofIP6Elements := ts_SNS_IE_ListIP6(v6)
		}
	}
	template PDU_NS tr_SNS_ACK(template Nsei nsei, template uint8_t trans_id := ?,
					   template NsCause cause := omit,
					   template IP4_Elements v4 := *,
					   template IP6_Elements v6 := *) := {
		pDU_SNS_Ack := {
			nsPduType := '0C'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			causeNS := tr_NS_IE_CAUSE(cause),
			iP_Address_NS := omit,
			listofIP4Elements := tr_SNS_IE_ListIP4(v4),
			listofIP6Elements := tr_SNS_IE_ListIP6(v6)
		}
	}

	template PDU_NS tr_SNS(template Nsei nsei) := ( tr_SNS_SIZE(nsei),
							tr_SNS_SIZE_ACK(nsei, *),
							tr_SNS_CONFIG(nsei, ?, *, *),
							tr_SNS_CONFIG_ACK(nsei, *),
							tr_SNS_ADD(nsei, ?, *, *),
							tr_SNS_DEL(nsei, ?, *, *),
							tr_SNS_CHG_WEIGHT(nsei, ?, *, *),
							tr_SNS_ACK(nsei, ?, *, *, *) )






	type record BssgpCellId {
		RoutingAreaIdentification	ra_id,
		CellIdentity			cell_id
	} with { variant "" };

	template (value) BssgpCellId ts_BssgpCellId(template (value) RoutingAreaIdentification rai, CellIdentity cell_id) := {
		ra_id := rai,
		cell_id := cell_id
	};

	type enumerated BssgpCause {
		BSSGP_CAUSE_PROC_OVERLOAD			('00'H),
		BSSGP_CAUSE_EQUIMENT_FAILURE			('01'H),
		BSSGP_CAUSE_TRANSIT_NETWORK_FAILURE		('02'H),
		BSSGP_CAUSE_NET_SV_CAP_MOD_GT_ZERO_KBPS		('03'H),
		BSSGP_CAUSE_UNKNOWN_MS				('04'H),
		BSSGP_CAUSE_BVCI_UNKNOWN			('05'H),
		BSSGP_CAUSE_CELL_TRAFFIC_CONGESTION		('06'H),
		BSSGP_CAUSE_SGSN_CONGESTION			('07'H),
		BSSGP_CAUSE_OM_INTERVENTION			('08'H),
		BSSGP_CAUSE_BVCI_BLOCKED			('09'H),
		BSSGP_CAUSE_PFC_CREATE_FAILURE			('0a'H),
		BSSGP_CAUSE_PFC_PREEMPTED			('0b'H),
		BSSGP_CAUSE_ABQP_NO_MORE_SUPPORTED		('0c'H),
		BSSGP_CAUSE_SEMANTICALLY_INCORRECT_PDU		('20'H),
		BSSGP_CAUSE_INVALID_MANDATORY_IE		('21'H),
		BSSGP_CAUSE_MISSING_MANDATORY_IE		('22'H),
		BSSGP_CAUSE_MISSING_CONDITIONAL_IE		('23'H),
		BSSGP_CAUSE_UNEXPECTED_CONDITIONAL_IE		('24'H),
		BSSGP_CAUSE_CONDITIONAL_IE_ERROR		('25'H),
		BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE ('26'H),
		BSSGP_CAUSE_PROTOCOL_ERROR_UNSPECIFIED		('27'H),
		BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_FEATURE_SET	('28'H),
		BSSGP_CAUSE_REQUESTED_INFO_NOT_AVAILABLE	('29'H),
		BSSGP_CAUSE_UNKNOWN_DESTINATION_ADDRESS		('2a'H),
		BSSGP_CAUSE_UNKNOWN_RIM_APP_IDENTITY		('2b'H),
		BSSGP_CAUSE_INVALID_CONTAINER_UNIT_INFO		('2c'H),
		BSSGP_CAUSE_PFC_QUEUING				('2d'H),
		BSSGP_CAUSE_PFC_CREATED_SUCCESSFULLY		('2e'H),
		BSSGP_CAUSE_T12_EXPIRY				('2f'H),
		BSSGP_CAUSE_MS_UNDER_PS_HANDOVER_TREATMENT	('30'H),
		BSSGP_CAUSE_UPLINK_QUALITY			('31'H),
		BSSGP_CAUSE_UPLINK_STRENGTH			('32'H),
		BSSGP_CAUSE_DOWNLINK_QUALITY			('33'H),
		BSSGP_CAUSE_DOWNLINK_STRENGTH			('34'H),
		BSSGP_CAUSE_DISTANCE				('35'H),
		BSSGP_CAUSE_BETTER_CELL				('36'H),
		BSSGP_CAUSE_TRAFFIC				('37'H),
		BSSGP_CAUSE_OM_INTERVENTION2			('38'H),
		BSSGP_CAUSE_MS_BACK_ON_OLD_CHANNEL		('39'H),
		BSSGP_CAUSE_T13_EXPIRY				('3a'H),
		BSSGP_CAUSE_T14_EXPIRY				('3b'H),
		BSSGP_CAUSE_NOT_ALL_REQUESTED_PFC_CREATED	('3c'H)
	} with { variant "FIELDLENGTH(8)" };

	private function t_FLUSH_ACTION(template OCT1 act)
	return template Flush_Action {
		var template Flush_Action r;
		if (istemplatekind(act, "omit")) {
			return omit;
		} else if (istemplatekind(act, "*")) {
			return *;
		} else {
			r := {
				iEI := '0C'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				actionValue := act
			}
			return r;
		}
	}
	private function t_NO_OCT_AFF(template integer oct_aff)
	return template Number_of_octets_affected {
		var template Number_of_octets_affected r;
		if (istemplatekind(oct_aff, "omit")) {
			return omit;
		} else if (istemplatekind(oct_aff, "*")) {
			return *;
		} else {
			r := {
				iEI := '25'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 3
				},
				number_of_octets_transfered_or_deleted := f_oct_or_wc(oct_aff, 3)
			}
			return r;
		}
	}

	private function t_LLC_FRAMES_DISCARDED(template integer frames_discarded)
	return template LLC_Frames_Discarded {
		var template LLC_Frames_Discarded r;
		if (istemplatekind(frames_discarded, "omit")) {
			return omit;
		} else if (istemplatekind(frames_discarded, "*")) {
			return *;
		} else {
			r := {
				iEI := '0F'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				number_of_frames_discarded := f_hex_or_wc(frames_discarded, 2)
			}
			return r;
		}
	}

	private function t_BSSGP_BVCI(template BssgpBvci bvci)
	return template BVCI {
		var template BVCI r;
		if (istemplatekind(bvci, "omit")) {
			return omit;
		} else if (istemplatekind(bvci, "*")) {
			return *;
		} else {
			r := {
				iEI := '04'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				unstructured_value := f_oct_or_wc(bvci, 2)
			}
			return r;
		}
	}
	private function  t_BSSGP_NSEI(template Nsei nsei)
	return template NSEI_BSSGP {
		var template NSEI_BSSGP r;
		if (istemplatekind(nsei, "omit")) {
			return omit;
		} else if (istemplatekind(nsei, "*")) {
			return *;
		} else {
			r := {
				iEI:= '3E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				nSEI := f_oct_or_wc(nsei, 2)
			}
			return r;
		}
	}

	template (value) TLLI_BSSGP ts_BSSGP_TLLI(template (value) GprsTlli tlli) := {
		iEI := '1F'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 4
		},
		tLLI_Value := tlli
	}
	template TLLI_BSSGP tr_BSSGP_TLLI(template GprsTlli tlli) := {
		iEI := '1F'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 4
		},
		tLLI_Value := tlli
	}
	private function f_ts_BSSGP_TLLI(template (omit) GprsTlli tlli) return template (omit) TLLI_BSSGP {
		if (istemplatekind(tlli, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_TLLI(valueof(tlli));
		}
	}
	private function f_tr_BSSGP_TLLI(template GprsTlli tlli) return template TLLI_BSSGP {
		if (istemplatekind(tlli, "omit")) {
			return omit;
		} else if (istemplatekind(tlli, "*")) {
			return *;
		} else {
			return tr_BSSGP_TLLI(valueof(tlli));
		}
	}

	template (value) Suspend_Reference_Number ts_BSSGP_SUSP_REF(template (value) OCT1 susp_ref) := {
		iEI := '1D'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		suspend_Reference_Number_value := susp_ref
	}
	template Suspend_Reference_Number tr_BSSGP_SUSP_REF(template OCT1 susp_ref) := {
		iEI := '1D'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		suspend_Reference_Number_value := susp_ref
	}

	template IMSI_BSSGP tr_BSSGP_IMSI(template hexstring imsi) := {
		iEI := '0D'O,
		ext := '1'B,
		lengthIndicator := ?,
		type_of_Identity := '001'B,
		oddevenIndicator := ?,
		digits := imsi
	}

	template IMSI_BSSGP ts_BSSGP_IMSI(hexstring imsi) := {
		iEI := '0D'O,
		ext := '1'B,
		lengthIndicator := { length1 := 0 /* overwritten */ },
		type_of_Identity := '001'B,
		oddevenIndicator := f_hex_is_odd_length(imsi),
		digits := imsi
	}
	private function f_ts_BSSGP_IMSI(template (omit) hexstring imsi) return template (omit) IMSI_BSSGP {
		if (istemplatekind(imsi, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_IMSI(valueof(imsi));
		}
	}
	private function f_tr_BSSGP_IMSI(template hexstring imsi) return template IMSI_BSSGP {
		if (istemplatekind(imsi, "omit")) {
			return omit;
		} else if (istemplatekind(imsi, "*")) {
			return *;
		} else {
			return tr_BSSGP_IMSI(imsi);
		}
	}

	template (present) TMSI_BSSGP tr_BSSGP_TMSI(GsmTmsi tmsi) := {
		iEI := '20'O,
		ext := '1'B,
		lengthIndicator := { length1 := 4 },
		tMSI_Value := int2oct(tmsi, 4)
	}

	template TMSI_BSSGP ts_BSSGP_TMSI(GsmTmsi tmsi) := {
		iEI := '20'O,
		ext := '1'B,
		lengthIndicator := { length1 := 4 },
		tMSI_Value := int2oct(tmsi, 4)
	}
	private function f_ts_BSSGP_TMSI(template (omit) GsmTmsi tmsi) return template (omit) TMSI_BSSGP {
		if (istemplatekind(tmsi, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_TMSI(valueof(tmsi));
		}
	}
	private function f_tr_BSSGP_TMSI(template GsmTmsi tmsi) return template TMSI_BSSGP {
		if (istemplatekind(tmsi, "omit")) {
			return omit;
		} else if (istemplatekind(tmsi, "*")) {
			return *;
		} else if (istemplatekind(tmsi, "?")) {
			return ?;
		} else {
			return tr_BSSGP_TMSI(valueof(tmsi));
		}
	}

	function f_bssgp_length_ind(integer len) return LIN2_2a {
		var LIN2_2a ret;
		if (len > 255) {
			ret := { length2 := len };
		} else {
			ret := { length1 := len };
		}
		return ret;
	}

	template LLC_PDU ts_BSSGP_LLC_PDU(octetstring pdu) := {
		iEI := '0D'O,
		ext := '1'B,
		lengthIndicator := f_bssgp_length_ind(lengthof(pdu)),
		lLC_PDU := pdu
	}

	template LLC_PDU tr_BSSGP_LLC_PDU(template octetstring pdu := ?) := {
		iEI := '0E'O,
		ext := ?,
		lengthIndicator := ?,
		lLC_PDU := pdu
	}

	function ts_BSSGP_CAUSE(template (omit) BssgpCause cause) return template (omit) Cause_BSSGP {
		var template (omit) Cause_BSSGP ret;
		if (istemplatekind(cause, "omit")) {
			ret := omit;
		} else {
			ret.iEI := '07'O;
			ret.ext := '1'B;
			ret.lengthIndicator := { length1 := 1 };
			ret.cause_Value := int2oct(enum2int(valueof(cause)), 1);
		}
		return ret;
	}
	function t_BSSGP_CAUSE(template BssgpCause cause) return template Cause_BSSGP {
		var template Cause_BSSGP ret;
		ret.iEI := '07'O;
		ret.ext := '1'B;
		ret.lengthIndicator := { length1 := 1 };
		if (isvalue(cause)) {
			ret.cause_Value := int2oct(enum2int(valueof(cause)), 1);
		} else {
			ret.cause_Value := ?
		}
		return ret;
	}

	function t_BSSGP_IE_CellId(template BssgpCellId cid) return template Cell_Identifier {
		var template Cell_Identifier ret := {
			iEI := '08'O,
			ext := '1'B,
			lengthIndicator := { length1 := 8 },
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			lac := ?,
			rac := ?,
			cI_value := ?
		}
		if (istemplatekind(cid, "omit")) {
			return omit;
		} else if (istemplatekind(cid, "*")) {
			return *;
		} else if (istemplatekind(cid, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
			if (isvalue(cid.ra_id.lai.lac)) {
				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
			}
		}
		if (isvalue(cid) and isvalue(cid.ra_id)) {
			ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
		}
		if (isvalue(cid)) {
			ret.cI_value := f_oct_or_wc(cid.cell_id, 2);
		}
		return ret;
	}

	template (value) Tag ts_BSSGP_IE_Tag(OCT1 tag) := {
		iEI := '1E'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		unstructured_Value := tag
	}

	template (present) Tag tr_BSSGP_IE_Tag(template (present) OCT1 tag) := {
		iEI := '1E'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		unstructured_Value := tag
	}

	template (value) RA_Cap_UPD_CAUSE ts_BSSGP_IE_RACU_Cause(template (value) OCT1 cause) := {
		iEI := '1A'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		rA_CAP_UPD_Cause_value := cause
	}

	template (present) RA_Cap_UPD_CAUSE tr_BSSGP_IE_RACU_Cause(template (present) OCT1 cause) := {
		iEI := '1A'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		rA_CAP_UPD_Cause_value := cause
	}

	/* 10.4.12 */
	template PDU_BSSGP ts_BVC_RESET(BssgpCause cause, BssgpBvci bvci,
					template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET := {
			bssgpPduType := '22'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cause := ts_BSSGP_CAUSE(cause),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := omit,
			extended_Feature_Bitmap := omit
		}
	}
	template PDU_BSSGP tr_BVC_RESET(template BssgpCause cause, template BssgpBvci bvci,
					template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET := {
			bssgpPduType := '22'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cause := t_BSSGP_CAUSE(cause),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := *,
			extended_Feature_Bitmap := *
		}
	}

	/* 10.4.13 */
	template PDU_BSSGP ts_BVC_RESET_ACK(BssgpBvci bvci, template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET_ACK := {
			bssgpPduType := '23'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := omit,
			extended_Feature_Bitmap := omit
		}
	}
	template PDU_BSSGP tr_BVC_RESET_ACK(template BssgpBvci bvci, template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET_ACK := {
			bssgpPduType := '23'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := *,
			extended_Feature_Bitmap := *
		}
	}


	/* 10.4.10 */
	template PDU_BSSGP t_BVC_UNBLOCK(template BssgpBvci bvci) := {
		pDU_BSSGP_BVC_UNBLOCK := {
			bssgpPduType := '24'O,
			bVCI := t_BSSGP_BVCI(bvci)
		}
	}

	/* 10.4.11 */
	template PDU_BSSGP t_BVC_UNBLOCK_ACK(template BssgpBvci bvci) := {
		pDU_BSSGP_BVC_UNBLOCK_ACK := {
			bssgpPduType := '25'O,
			bVCI := t_BSSGP_BVCI(bvci)
		}
	}

	/* 10.4.8 */
	template PDU_BSSGP t_BVC_BLOCK(template BssgpBvci bvci, template BssgpCause cause) := {
		pDU_BSSGP_BVC_BLOCK := {
			bssgpPduType := '20'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cause := t_BSSGP_CAUSE(cause)
		}
	}

	/* 10.4.9 */
	template PDU_BSSGP t_BVC_BLOCK_ACK(template BssgpBvci bvci) := {
		pDU_BSSGP_BVC_BLOCK_ACK := {
			bssgpPduType := '21'O,
			bVCI := t_BSSGP_BVCI(bvci)
		}
	}

	/* 10.4.4 */
	template PDU_BSSGP t_BVC_FC_BVC(uint16_t bmax, uint16_t bucket_leak_rate,
					uint16_t bmax_default_ms, uint16_t r_default_ms, OCT1 tag) := {
		pDU_BSSGP_FLOW_CONTROL_BVC := {
			bssgpPduType := '26'O,
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			},
			bVC_Bucket_Size := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := f_oct_or_wc(bucket_leak_rate, 2)
			},
			bmax_default_MS := {
				iEI := '01'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax_default_ms, 2)
			},
			r_default_MS := {
				iEI := '1C'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_default_MS_value := f_oct_or_wc(r_default_ms, 2)
			},
			bucket_Full_Ratio := omit,
			bVC_Measurement := omit,
			flow_Control_Granularity := omit
		}
	}
	template PDU_BSSGP tr_BVC_FC_BVC(template uint16_t bmax := ?,
					 template uint16_t bucket_leak_rate := ?,
					 template uint16_t bmax_default_ms := ?,
					 template uint16_t r_default_ms := ?,
					 template OCT1 tag := ?) := {
		pDU_BSSGP_FLOW_CONTROL_BVC := {
			bssgpPduType := '26'O,
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			},
			bVC_Bucket_Size := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := f_oct_or_wc(bucket_leak_rate, 2)
			},
			bmax_default_MS := {
				iEI := '01'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax_default_ms, 2)
			},
			r_default_MS := {
				iEI := '1C'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_default_MS_value := f_oct_or_wc(r_default_ms, 2)
			},
			bucket_Full_Ratio := *,
			bVC_Measurement := *,
			flow_Control_Granularity := *
		}
	}

	/* 10.4.5 */
	template PDU_BSSGP t_BVC_FC_BVC_ACK(template OCT1 tag) := {
		pDU_BSSGP_FLOW_CONTROL_BVC_ACK := {
			bssgpPduType := '27'O,
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			}
		}
	}

	/* 10.4.6 */
	template (value) PDU_BSSGP ts_BVC_FC_MS(GprsTlli tlli, uint16_t bmax, uint16_t bucket_leak_rate,
						OCT1 tag) := {
		pDU_BSSGP_FLOW_CONTROL_MS := {
			bssgpPduType := '28'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			},
			mS_Bucket_Size := {
				iEI := '12'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := f_oct_or_wc(bucket_leak_rate, 2)
			},
			bucket_Full_Ratio := omit,
			flow_Control_Granularity := omit
		}
	}
	template (present) PDU_BSSGP tr_BVC_FC_MS(template (present) GprsTlli tlli := ?,
						  template (present) uint16_t bmax := ?,
						  template (present) uint16_t bucket_leak_rate := ?,
						  template (present) OCT1 tag := ?) := {
		pDU_BSSGP_FLOW_CONTROL_MS := {
			bssgpPduType := '28'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			},
			mS_Bucket_Size := {
				iEI := '12'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := f_oct_or_wc(bucket_leak_rate, 2)
			},
			bucket_Full_Ratio := *,
			flow_Control_Granularity := *
		}
	}

	/* 10.4.7 */
	template (value) PDU_BSSGP ts_BVC_FC_MS_ACK(template (value) GprsTlli tlli,
						    template (value) OCT1 tag) := {

		pDU_BSSGP_FLOW_CONTROL_MS_ACK := {
			bssgpPduType := '29'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			}
		}
	}
	template (present) PDU_BSSGP tr_BVC_FC_MS_ACK(template (present) GprsTlli tlli,
						      template (present) OCT1 tag := ?) := {

		pDU_BSSGP_FLOW_CONTROL_MS_ACK := {
			bssgpPduType := '29'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			}
		}
	}

	/* 10.4.14 */
	template PDU_BSSGP ts_BSSGP_STATUS(template (omit) BssgpBvci bvci, template BssgpCause cause,
					   PDU_BSSGP pdu) := {
		pDU_BSSGP_STATUS := {
			bssgpPduType := '41'O,
			cause := t_BSSGP_CAUSE(cause),
			bVCI := t_BSSGP_BVCI(bvci),
			pDU_in_Error := {
				iEI := '15'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				erroneous_BSSGP_PDU := enc_PDU_BSSGP(pdu)
			}
		}
	}
	template PDU_BSSGP tr_BSSGP_STATUS(template BssgpBvci bvci := ?, template BssgpCause cause := ?,
					   template octetstring pdu := ?) := {
		pDU_BSSGP_STATUS := {
			bssgpPduType := '41'O,
			cause := t_BSSGP_CAUSE(cause),
			bVCI := t_BSSGP_BVCI(bvci),
			pDU_in_Error := {
				iEI := '15'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := ?
				},
				erroneous_BSSGP_PDU := pdu
			}
		}
	}

	private function f_presence_bit_MultislotCap_GPRS_BSSGP(template (omit) MultislotCap_GPRS_BSSGP mscap_gprs) return BIT1 {
		if (istemplatekind(mscap_gprs, "omit")) {
			return '0'B;
		}
		return '1'B;
	}
	private function f_presence_bit_MultislotCap_EGPRS_BSSGP(template (omit) MultislotCap_EGPRS_BSSGP mscap_egprs) return BIT1 {
		if (istemplatekind(mscap_egprs, "omit")) {
			return '0'B;
		}
		return '1'B;
	}
	template (value) MSRACapabilityValuesRecord_BSSGP ts_RaCapRec_BSSGP(BIT4 att := '0001'B /* E-GSM */, template (omit) MultislotCap_GPRS_BSSGP mscap_gprs := omit, template (omit) MultislotCap_EGPRS_BSSGP mscap_egprs := omit) := {
		mSRACapabilityValues := {
			mSRACapabilityValuesExclude1111 := {
				accessTechnType := att, /* E-GSM */
				accessCapabilities := {
					lengthIndicator := 0, /* overwritten */
					accessCapabilities := {
						rfPowerCapability := '001'B, /* FIXME */
						presenceBitA5 := '0'B,
						a5bits := omit,
						esind := '1'B,
						psbit := '0'B,
						vgcs := '0'B,
						vbs := '0'B,
						presenceBitMultislot := '1'B,
						multislotcap := {
							presenceBitHscsd := '0'B,
							hscsdmultislotclass := omit,
							presenceBitGprs := f_presence_bit_MultislotCap_GPRS_BSSGP(mscap_gprs),
							gprsmultislot := mscap_gprs,
							presenceBitSms := '0'B,
							multislotCap_SMS := omit,
							multislotCapAdditionsAfterRel97 := {
								presenceBitEcsdmulti := '0'B,
								ecsdmultislotclass := omit,
								presenceBitEgprsmulti := f_presence_bit_MultislotCap_EGPRS_BSSGP(mscap_egprs),
								multislotCap_EGPRS := mscap_egprs,
								presenceBitDtmGprsmulti := '0'B,
								multislotCapdtmgprsmultislotsubclass := omit
							}
						},
						accessCapAdditionsAfterRel97 := omit
					},
					spare_bits := omit
				}
			}
		},
		presenceBitMSRACap := '0'B
	};
	template (present) MSRACapabilityValuesRecord_BSSGP
	tr_RaCapRec_BSSGP(template (present) BIT4 att := '0001'B /* E-GSM */, template MultislotCap_GPRS_BSSGP mscap_gprs := *,
			  template MultislotCap_EGPRS_BSSGP mscap_egprs := *) := {
		mSRACapabilityValues := {
			mSRACapabilityValuesExclude1111 := {
				accessTechnType := att, /* E-GSM */
				accessCapabilities := {
					lengthIndicator := ?, /* overwritten */
					accessCapabilities := {
						rfPowerCapability := '001'B, /* FIXME */
						presenceBitA5 := ?,
						a5bits := *,
						esind := '1'B,
						psbit := '0'B,
						vgcs := '0'B,
						vbs := '0'B,
						presenceBitMultislot := '1'B,
						multislotcap := {
							presenceBitHscsd := '0'B,
							hscsdmultislotclass := omit,
							presenceBitGprs := ?,
							gprsmultislot := mscap_gprs,
							presenceBitSms := '0'B,
							multislotCap_SMS := omit,
							multislotCapAdditionsAfterRel97 := {
								presenceBitEcsdmulti := '0'B,
								ecsdmultislotclass := *,
								presenceBitEgprsmulti := ?,
								multislotCap_EGPRS := mscap_egprs,
								presenceBitDtmGprsmulti := ?,
								multislotCapdtmgprsmultislotsubclass := *
							}
						},
						accessCapAdditionsAfterRel97 := *
					},
					spare_bits := *
				}
			}
		},
		presenceBitMSRACap := '0'B
	};


	template QoS_Profile_V t_defaultQos := {
		peak_Bit_Rate := int2oct(80, 2),
		precedence := '000'B,
		a_bit := '0'B,
		t_bit := '0'B,
		c_r_bit := '0'B,
		peakBitRateGranularity := '00'B
	}

	template QoS_Profile ts_QoS_TLV(template QoS_Profile_V qos) := {
		iEI := '18'O,
		ext := '1'B,
		lengthIndicator := { length1 := 3 },
		peak_Bit_Rate := qos.peak_Bit_Rate,
		precedence := qos.precedence,
		a_bit := qos.a_bit,
		t_bit := qos.t_bit,
		c_r_bit := qos.c_r_bit,
		peakBitRateGranularity := qos.peakBitRateGranularity
	}

	template PDU_Lifetime t_DefaultLifetime(uint16_t delay := 65535) := {
		iEI := '16'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		delay_Value := f_oct_or_wc(delay, 2)
	}

	template DRX_Parameters t_defaultDRXparam := {
		iEI := '0A'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		splitPG_CycleCode := '00'O,
		nonDRXTimer := '000'B,
		splitOnCCCH := '0'B,
		cnSpecificDRXCycleLength := '0000'B
	}

	function ts_BSSGP_IE_MSRAcap_omit(template (omit) MSRadioAccessCapabilityV_BSSGP racap) return template (omit) MS_Radio_Access_Capability {
		var template (omit) MS_Radio_Access_Capability ret;
		if (istemplatekind(racap, "omit")) {
			return omit;
		} else {
			ret := {
				iEI := '13'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				mSRadioAccessCapabilityV_BSSGP := racap
			}
			return ret;
		}
	}

	function tr_BSSGP_IE_MSRAcap(template MSRadioAccessCapabilityV_BSSGP racap) return template MS_Radio_Access_Capability {
		var template MS_Radio_Access_Capability ret;
		if (istemplatekind(racap, "omit")) {
			return omit;
		} else {
			ret := {
				iEI := '13'O,
				ext := ?,
				lengthIndicator := ?,
				mSRadioAccessCapabilityV_BSSGP := racap
			}
			return ret;
		}
	}

	/* 10.2.1 */
	template PDU_BSSGP ts_BSSGP_DL_UD(GprsTlli tlli, octetstring pdu,
					  template (omit) MSRadioAccessCapabilityV_BSSGP racap := omit,
					  template (omit) IMSI_BSSGP imsi := omit) := {
		pDU_BSSGP_DL_UNITDATA := {
			bssgpPduType := '00'O,
			tLLI_current := tlli,
			qoS_Profile := t_defaultQos,
			pDU_Lifetime := t_DefaultLifetime(65535),
			mS_Radio_Access_Capability := ts_BSSGP_IE_MSRAcap_omit(racap),
			priority := omit,
			dRX_Parameters := omit,
			iMSI := imsi,
			tLLI_old := omit,
			pFI := omit,
			lSA_Information := omit,
			service_UTRAN_CCO := omit,
			service_Class_Indicator := omit,
			subscriber_Profile_ID_For_RAT_Priority := omit,
			redirection_Indication := omit,
			redirection_Completed := omit,
			unconfirmed_Send_State_Variable := omit,
			sCI := omit,
			gGSN_PGW_Location := omit,
			eDRX_Paremeters := omit,
			old_Routing_Area_Identification := omit,
			attach_Indicator := omit,
			alignment_octets := omit,
			lLC_PDU := ts_BSSGP_LLC_PDU(pdu),
			initialLLC_PDU := omit
		}
	}
	template PDU_BSSGP tr_BSSGP_DL_UD(template (present) GprsTlli tlli, template (present) octetstring pdu,
					  template IMSI_BSSGP imsi := omit) := {
		pDU_BSSGP_DL_UNITDATA := {
			bssgpPduType := '00'O,
			tLLI_current := tlli,
			qoS_Profile := ?,
			pDU_Lifetime := ?,
			mS_Radio_Access_Capability := *,
			priority := *,
			dRX_Parameters := *,
			iMSI := imsi,
			tLLI_old := *,
			pFI := *,
			lSA_Information := *,
			service_UTRAN_CCO := *,
			service_Class_Indicator := *,
			subscriber_Profile_ID_For_RAT_Priority := *,
			redirection_Indication := *,
			redirection_Completed := *,
			unconfirmed_Send_State_Variable := *,
			sCI := *,
			gGSN_PGW_Location := *,
			eDRX_Paremeters := *,
			old_Routing_Area_Identification := *,
			attach_Indicator := *,
			alignment_octets := *,
			lLC_PDU := tr_BSSGP_LLC_PDU(pdu),
			initialLLC_PDU := *
		}
	}

	/* 10.2.2 */
	template PDU_BSSGP ts_BSSGP_UL_UD(GprsTlli tlli, BssgpCellId cell_id, octetstring payload) := {
		pDU_BSSGP_UL_UNITDATA := {
			bssgpPduType := '01'O,
			tLLI := tlli,
			qoS_Profile := t_defaultQos,
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			pFI := omit,
			lSA_Identifier_List := omit,
			redirect_Attempt_Flag := omit,
			iMSI_BSSGP := omit,
			unconfirmed_Send_State_Variable := omit,
			selected_PLMN_ID := omit,
			selected_Operator := omit,
			cS_Registered_Operator := omit,
			alignment_octets := omit,
			lLC_PDU := ts_BSSGP_LLC_PDU(payload)
		}
	}
	template PDU_BSSGP tr_BSSGP_UL_UD(template GprsTlli tlli := ?, template BssgpCellId cell_id := ?,
					  template octetstring payload := ?) := {
		pDU_BSSGP_UL_UNITDATA := {
			bssgpPduType := '01'O,
			tLLI := tlli,
			qoS_Profile := ?,
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			pFI := *,
			lSA_Identifier_List := *,
			redirect_Attempt_Flag := *,
			iMSI_BSSGP := *,
			unconfirmed_Send_State_Variable := *,
			selected_PLMN_ID := *,
			selected_Operator := *,
			cS_Registered_Operator := *,
			alignment_octets := *,
			lLC_PDU := tr_BSSGP_LLC_PDU(payload)
		}
	}

	/* 10.3.2 */
	template PDU_BSSGP tr_BSSGP_CS_PAGING(BssgpBvci bvci) := {
		pDU_BSSGP_PAGING_CS := {
			bssgpPduType := '07'O,
			iMSI := ?,
			dRX_Parameters := ?,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			tLLI := *,
			channel_needed := *,
			eMLPP_Priority := *,
			tMSI := *,
			global_CN_Id := *
		}
	}
	template PDU_BSSGP ts_BSSGP_CS_PAGING_IMSI(BssgpBvci bvci, hexstring imsi) := {
		pDU_BSSGP_PAGING_CS := {
			bssgpPduType := '07'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			dRX_Parameters := t_defaultDRXparam,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			tLLI := omit,
			channel_needed := omit,
			eMLPP_Priority := omit,
			tMSI := omit,
			global_CN_Id := omit
		}
	}
	template PDU_BSSGP ts_BSSGP_CS_PAGING_PTMSI(BssgpBvci bvci, hexstring imsi, GsmTmsi tmsi) := {
		pDU_BSSGP_PAGING_CS := {
			bssgpPduType := '07'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			dRX_Parameters := t_defaultDRXparam,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			tLLI := omit,
			channel_needed := omit,
			eMLPP_Priority := omit,
			tMSI := ts_BSSGP_TMSI(tmsi),
			global_CN_Id := omit
		}
	}

	/* 10.3.1 */
	template PDU_BSSGP tr_BSSGP_PS_PAGING(template BssgpBvci bvci) := {
		pDU_BSSGP_PAGING_PS := {
			bssgpPduType := '06'O,
			iMSI := ?,
			dRX_Parameters := *,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			pFI := *,
			aBQP := *,
			qoS_Profile := ?,
			pTMSI := *,
			eDRX_Paremeters := *
		}
	}
	template PDU_BSSGP ts_BSSGP_PS_PAGING_IMSI(BssgpBvci bvci, hexstring imsi) := {
		pDU_BSSGP_PAGING_PS := {
			bssgpPduType := '06'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			dRX_Parameters := omit,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			pFI := omit,
			aBQP := omit,
			qoS_Profile := ts_QoS_TLV(t_defaultQos),
			pTMSI := omit,
			eDRX_Paremeters := omit
		}
	}
	template PDU_BSSGP ts_BSSGP_PS_PAGING_PTMSI(BssgpBvci bvci, hexstring imsi, GsmTmsi tmsi) := {
		pDU_BSSGP_PAGING_PS := {
			bssgpPduType := '06'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			dRX_Parameters := omit,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			pFI := omit,
			aBQP := omit,
			qoS_Profile := ts_QoS_TLV(t_defaultQos),
			pTMSI := ts_BSSGP_TMSI(tmsi),
			eDRX_Paremeters := omit
		}
	}

	template (value) Paging_Field4 ts_BssgpP4BssArea := {
		bSS_Area_Indication := {
			iEI := '02'O,
			ext := '1'B,
			lengthIndicator := {
				length1 := 1
			},
			bSS_indicator := '00'O
		}
	}

	template (value) Paging_Field4 ts_BssgpP4LAC(GSM_Types.LocationAreaIdentification lai) := {
		location_Area := ts_BSSGP_LA_ID(lai)
	}

	template (value) Paging_Field4 ts_BssgpP4RAC(GSM_Types.RoutingAreaIdentification rai) := {
		routeing_Area := ts_BSSGP_RA_ID(rai)
	}

	template (value) Paging_Field4 ts_BssgpP4Bvci(BssgpBvci bvci) := {
		bVCI := t_BSSGP_BVCI(bvci)
	}

	template (value) Location_Area ts_BSSGP_LA_ID(GSM_Types.LocationAreaIdentification input) := {
		iEI := '10'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 5
		},
		mccDigit1 := input.mcc_mnc[0],
		mccDigit2 := input.mcc_mnc[1],
		mccDigit3 := input.mcc_mnc[2],
		mncDigit3 := input.mcc_mnc[3],
		mncDigit1 := input.mcc_mnc[4],
		mncDigit2 := input.mcc_mnc[5],
		lac := int2oct(input.lac, 2)
	}

	template (value) Routeing_Area ts_BSSGP_RA_ID(GSM_Types.RoutingAreaIdentification input) := {
		iEI := '1B'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 6
		},
		mccDigit1 := input.lai.mcc_mnc[0],
		mccDigit2 := input.lai.mcc_mnc[1],
		mccDigit3 := input.lai.mcc_mnc[2],
		mncDigit3 := input.lai.mcc_mnc[3],
		mncDigit1 := input.lai.mcc_mnc[4],
		mncDigit2 := input.lai.mcc_mnc[5],
		lac := int2oct(input.lai.lac, 2),
		rac := int2oct(input.rac, 1)
	}

	private function f_ts_BSSGP_RA_ID(template (omit) GSM_Types.RoutingAreaIdentification input)
	return template (omit) Routeing_Area {
		if (istemplatekind(input, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_RA_ID(valueof(input));
		}
	}

	private function f_tr_BSSGP_RA_ID(template GSM_Types.RoutingAreaIdentification input)
	return template Routeing_Area {
		if (istemplatekind(input, "omit")) {
			return omit;
		} else if (istemplatekind(input, "*")) {
			return *;
		} else if (istemplatekind(input, "?")) {
			return ?;
		} else {
			return ts_BSSGP_RA_ID(valueof(input));
		}
	}

	/* 10.3.6 */
	template (value) PDU_BSSGP ts_BSSGP_SUSPEND(GprsTlli tlli, RoutingAreaIdentification ra_id) := {
		pDU_BSSGP_SUSPEND := {
			bssgpPduType := '0B'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id)
		}
	}
	template PDU_BSSGP tr_BSSGP_SUSPEND(template GprsTlli tlli, RoutingAreaIdentification ra_id) := {
		pDU_BSSGP_SUSPEND := {
			bssgpPduType := '0B'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id)
		}
	}

	/* 10.3.7 */
	template (value) PDU_BSSGP ts_BSSGP_SUSPEND_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
							template (value) OCT1 susp_ref) := {
		pDU_BSSGP_SUSPEND_ACK := {
			bssgpPduType := '0C'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			suspend_Reference_Number := ts_BSSGP_SUSP_REF(susp_ref)
		}
	}
	template PDU_BSSGP tr_BSSGP_SUSPEND_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
						template OCT1 susp_ref) := {
		pDU_BSSGP_SUSPEND_ACK := {
			bssgpPduType := '0C'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			suspend_Reference_Number := tr_BSSGP_SUSP_REF(susp_ref)
		}
	}

	/* 10.3.8 */
	template (value) PDU_BSSGP ts_BSSGP_SUSPEND_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
							 template (omit) BssgpCause cause) := {
		pDU_BSSGP_SUSPEND_NACK := {
			bssgpPduType := '0D'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			cause := ts_BSSGP_CAUSE(cause)
		}
	}
	template PDU_BSSGP tr_BSSGP_SUSPEND_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
						template BssgpCause cause) := {
		pDU_BSSGP_SUSPEND_NACK := {
			bssgpPduType := '0D'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			cause := t_BSSGP_CAUSE(cause)
		}
	}


	/* 10.3.9 */
	template (value) PDU_BSSGP ts_BSSGP_RESUME(GprsTlli tlli, RoutingAreaIdentification ra_id,
						   OCT1 susp_ref) := {
		pDU_BSSGP_RESUME := {
			bssgpPduType := '0E'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			suspend_Reference_Number := ts_BSSGP_SUSP_REF(susp_ref)
		}
	}
	template PDU_BSSGP tr_BSSGP_RESUME(template GprsTlli tlli, RoutingAreaIdentification ra_id,
					   template OCT1 susp_ref) := {
		pDU_BSSGP_RESUME := {
			bssgpPduType := '0E'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			suspend_Reference_Number := tr_BSSGP_SUSP_REF(susp_ref)
		}
	}

	/* 10.3.10 */
	template (value) PDU_BSSGP ts_BSSGP_RESUME_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id)
		:= {
		pDU_BSSGP_RESUME_ACK := {
			bssgpPduType := '0F'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id)
		}
	}
	template PDU_BSSGP tr_BSSGP_RESUME_ACK(template GprsTlli tlli,
						RoutingAreaIdentification ra_id) := {
		pDU_BSSGP_RESUME_ACK := {
			bssgpPduType := '0F'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id)
		}
	}

	/* 10.3.11 */
	template (value) PDU_BSSGP ts_BSSGP_RESUME_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
						template (omit) BssgpCause cause) := {
		pDU_BSSGP_RESUME_NACK := {
			bssgpPduType := '10'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			cause := ts_BSSGP_CAUSE(cause)
		}
	}
	template PDU_BSSGP tr_BSSGP_RESUME_NACK(template GprsTlli tlli,
						RoutingAreaIdentification ra_id,
						template BssgpCause cause) := {
		pDU_BSSGP_RESUME_NACK := {
			bssgpPduType := '10'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			cause := t_BSSGP_CAUSE(cause)
		}
	}

	/* 10.3.12 */
	template (value) PDU_BSSGP ts_BSSGP_DUMMY_PAGING_PS(hexstring imsi,
							    template (omit) RoutingAreaIdentification ra) := {
		pDU_BSSGP_DUMMY_PAGING_PS := {
			bssgpPduType := '12'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			routeing_Area := f_ts_BSSGP_RA_ID(ra),
			eDRX_Paremeters := omit
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_DUMMY_PAGING_PS(hexstring imsi,
							      template RoutingAreaIdentification ra) := {
		pDU_BSSGP_DUMMY_PAGING_PS := {
			bssgpPduType := '12'O,
			iMSI := tr_BSSGP_IMSI(imsi),
			routeing_Area := f_tr_BSSGP_RA_ID(ra),
			eDRX_Paremeters := omit
		}
	}

	template (value) Time_Until_Next_Paging_Occasion ts_TimeNextPag(uint8_t mins, uint8_t secs) := {
		iEI := '93'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		minutes := mins,
		spare := '00'B,
		seconds := secs,
		spare2 := '00'B
	}
	template (present) Time_Until_Next_Paging_Occasion tr_TimeNextPag(template (present) uint8_t mins,
									  template (present) uint8_t secs) := {
		iEI := '93'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		minutes := mins,
		spare := ?,
		seconds := secs,
		spare2 := ?
	}

	/* 10.3.13 */
	template (value) PDU_BSSGP ts_BSSGP_DUMMY_PAGING_PS_RESP(hexstring imsi, uint8_t mins, uint8_t secs) := {
		pDU_BSSGP_DUMMY_PAGING_PS_RESPONSE := {
			bssgpPduType := '13'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			time_Until_Next_Paging_Occasion := ts_TimeNextPag(mins, secs)
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_DUMMY_PAGING_PS_RESP(hexstring imsi,
								   template (present) uint8_t mins,
								   template (present) uint8_t secs) := {
		pDU_BSSGP_DUMMY_PAGING_PS_RESPONSE := {
			bssgpPduType := '13'O,
			iMSI := tr_BSSGP_IMSI(imsi),
			time_Until_Next_Paging_Occasion := tr_TimeNextPag(mins, secs)
		}
	}

	/* 10.3.14 */
	template (value) PDU_BSSGP ts_BSSGP_PAGING_PS_REJ(hexstring imsi, uint8_t mins, uint8_t secs,
							  template (omit) GsmTmsi tmsi) := {
		pDU_BSSGP_PAGING_PS_REJECT := {
			bssgpPduType := '11'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			pTMSI := f_ts_BSSGP_TMSI(tmsi),
			time_Until_Next_Paging_Occasion := ts_TimeNextPag(mins, secs)
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_PAGING_PS_REJ(hexstring imsi,
							    template (present) uint8_t mins,
							    template (present) uint8_t secs,
							    template GsmTmsi tmsi) := {
		pDU_BSSGP_PAGING_PS_REJECT := {
			bssgpPduType := '11'O,
			iMSI := tr_BSSGP_IMSI(imsi),
			pTMSI := f_tr_BSSGP_TMSI(tmsi),
			time_Until_Next_Paging_Occasion := tr_TimeNextPag(mins, secs)
		}
	}

	/* 10.3.15 */
	template (value) PDU_BSSGP ts_BSSGP_MS_REG_ENQ(hexstring imsi) := {
		pDU_BSSGP_MS_REGISTRATION_ENQUIRY := {
			bssgpPduType := '14'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			mME_Query := omit
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_MS_REG_ENQ(hexstring imsi) := {
		pDU_BSSGP_MS_REGISTRATION_ENQUIRY := {
			bssgpPduType := '14'O,
			iMSI := tr_BSSGP_IMSI(imsi),
			mME_Query := *
		}
	}

	/* 11.3.126 */
	template (value) PLMN_Identity ts_BSSGP_PlmnId(template (value) BcdMccMnc mccmnc) := {
		iEI := '96'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 3
		},
		mccDigit1 := mccmnc[0],
		mccDigit2 := mccmnc[1],
		mccDigit3 := mccmnc[2],
		mncDigit3 := mccmnc[5],
		mncDigit1 := mccmnc[3],
		mncDigit2 := mccmnc[4]
	}
	template (present) PLMN_Identity tr_BSSGP_PlmnId(template (present) BcdMccMnc mccmnc) := {
		iEI := '96'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 3
		},
		mccDigit1 := mccmnc[0],
		mccDigit2 := mccmnc[1],
		mccDigit3 := mccmnc[2],
		mncDigit3 := mccmnc[5],
		mncDigit1 := mccmnc[3],
		mncDigit2 := mccmnc[4]
	}
	private function f_ts_BSSGP_PlmnId(template (omit) BcdMccMnc mccmnc)
	return template (omit) PLMN_Identity {
		if (istemplatekind(mccmnc, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_PlmnId(mccmnc);
		}
	}
	private function f_tr_BSSGP_PlmnId(template BcdMccMnc mccmnc)
	return template PLMN_Identity {
		if (istemplatekind(mccmnc, "omit")) {
			return omit;
		} else if (istemplatekind(mccmnc, "*")) {
			return *;
		} else if (istemplatekind(mccmnc, "?")) {
			return ?;
		} else {
			return ts_BSSGP_PlmnId(mccmnc);
		}
	}

	/* 10.3.16 */
	template (value) PDU_BSSGP ts_BSSGP_MS_REW_ENQ_RESP(hexstring imsi, template (omit) BcdMccMnc mccmnc) := {
		pDU_BSSGP_MS_REGISTRATION_ENQUIRY_RESPONSE := {
			bssgpPduType := '15'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			pS_Registered_Operator := f_ts_BSSGP_PlmnId(mccmnc)
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_MS_REW_ENQ_RESP(hexstring imsi, template BcdMccMnc mccmnc) := {
		pDU_BSSGP_MS_REGISTRATION_ENQUIRY_RESPONSE := {
			bssgpPduType := '15'O,
			iMSI := tr_BSSGP_IMSI(imsi),
			pS_Registered_Operator := f_tr_BSSGP_PlmnId(mccmnc)
		}
	}

	/* 10.4.1 */
	template (value) PDU_BSSGP ts_BSSGP_FLUSH_LL(GprsTlli tlli, template (value) BssgpBvci bvci_old,
						     template (omit) BssgpBvci bvci_new := omit,
						     template (omit) Nsei nsei := omit) := {
		pDU_BSSGP_FLUSH_LL := {
			bssgpPduType := '2A'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			bVCI_old := t_BSSGP_BVCI(bvci_old),
			bVCI_new := t_BSSGP_BVCI(bvci_new),
			nSEI := t_BSSGP_NSEI(nsei)
		}
	}
	template PDU_BSSGP tr_BSSGP_FLUSH_LL(template GprsTlli tlli, template BssgpBvci bvci_old,
					     template (omit) BssgpBvci bvci_new := omit,
					     template (omit) Nsei nsei := omit) := {
		pDU_BSSGP_FLUSH_LL := {
			bssgpPduType := '2A'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			bVCI_old := t_BSSGP_BVCI(bvci_old),
			bVCI_new := t_BSSGP_BVCI(bvci_new),
			nSEI := t_BSSGP_NSEI(nsei)
		}
	}

	/* 10.4.2 */
	template (value) PDU_BSSGP ts_BSSGP_FLUSH_LL_ACK(GprsTlli tlli, template (value) OCT1 act,
							 template (value) integer oct_affected,
							 template (omit) BssgpBvci bvci_new := omit,
							 template (omit) Nsei nsei := omit) := {
		pDU_BSSGP_FLUSH_LL_ACK := {
			bssgpPduType := '2B'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			flush_Action := t_FLUSH_ACTION(act),
			bVCI_new := t_BSSGP_BVCI(bvci_new),
			number_of_octets_affected := t_NO_OCT_AFF(oct_affected),
			nSEI := t_BSSGP_NSEI(nsei)
		}
	}
	template PDU_BSSGP tr_BSSGP_FLUSH_LL_ACK(template GprsTlli tlli, template OCT1 act,
						 template integer oct_affected,
						 template (omit) BssgpBvci bvci_new := omit,
						 template (omit) Nsei nsei := omit) := {
		pDU_BSSGP_FLUSH_LL_ACK := {
			bssgpPduType := '2B'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			flush_Action := t_FLUSH_ACTION(act),
			bVCI_new := t_BSSGP_BVCI(bvci_new),
			number_of_octets_affected := t_NO_OCT_AFF(oct_affected),
			nSEI := t_BSSGP_NSEI(nsei)
		}
	}

	/* 10.4.3 */
	template (value) PDU_BSSGP ts_BSSGP_LLC_DISCARDED(GprsTlli tlli, template (value) integer frames_discarded,
							 template (value) BssgpBvci bvci,
							 template (value) integer oct_deleted) := {
		pDU_BSSGP_LLC_DISCARDED := {
			bssgpPduType := '2C'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			lLC_Frames_Discarded := t_LLC_FRAMES_DISCARDED(frames_discarded),
			bVCI := t_BSSGP_BVCI(bvci),
			number_of_octets_deleted := t_NO_OCT_AFF(oct_deleted),
			pFI := omit
		}
	}
	template PDU_BSSGP tr_BSSGP_LLC_DISCARDED(template GprsTlli tlli, template integer frames_discarded,
						 template BssgpBvci bvci,
						 template integer oct_deleted) := {
		pDU_BSSGP_LLC_DISCARDED := {
			bssgpPduType := '2C'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			lLC_Frames_Discarded := t_LLC_FRAMES_DISCARDED(frames_discarded),
			bVCI := t_BSSGP_BVCI(bvci),
			number_of_octets_deleted := t_NO_OCT_AFF(oct_deleted),
			pFI := *
		}
	}

	/* 10.2.3 */
	template (value) PDU_BSSGP ts_BSSGP_RA_CAP(GprsTlli tlli,
						   template (omit) MSRadioAccessCapabilityV_BSSGP racap := omit) := {
		pDU_BSSGP_RA_CAPABILITY := {
			bssgpPduType := '02'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			mS_Radio_Access_Capability := ts_BSSGP_IE_MSRAcap_omit(racap)
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_RA_CAP(template (present) GprsTlli tlli,
						     template MSRadioAccessCapabilityV_BSSGP racap) := {
		pDU_BSSGP_RA_CAPABILITY := {
			bssgpPduType := '02'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			mS_Radio_Access_Capability := tr_BSSGP_IE_MSRAcap(racap)
		}
	}


	/* 10.3.3 */
	template (value) PDU_BSSGP ts_BSSGP_RA_CAP_UPD(GprsTlli tlli, OCT1 tag) := {
		pDU_BSSGP_RA_CAPABILITY_UPDATE := {
			bssgpPduType := '08'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := ts_BSSGP_IE_Tag(tag)
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_RA_CAP_UPD(template (present) GprsTlli tlli,
						     template OCT1 tag) := {
		pDU_BSSGP_RA_CAPABILITY_UPDATE := {
			bssgpPduType := '08'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := tr_BSSGP_IE_Tag(tag)
		}
	}


	/* 10.3.4 */
	template (value) PDU_BSSGP
	ts_BSSGP_RA_CAP_UPD_ACK(GprsTlli tlli, OCT1 tag, template (value) OCT1 cause,
			        template (omit) MSRadioAccessCapabilityV_BSSGP racap := omit) := {
		pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK := {
			bssgpPduType := '09'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := ts_BSSGP_IE_Tag(tag),
			iMSI := omit,
			rA_Cap_UPDATE_CAUSE := ts_BSSGP_IE_RACU_Cause(cause),
			mS_Radio_Access_Capability := ts_BSSGP_IE_MSRAcap_omit(racap)
		}
	}
	template (present) PDU_BSSGP
	tr_BSSGP_RA_CAP_UPD_ACK(template (present) GprsTlli tlli, template OCT1 tag, template (present) OCT1 cause,
			        template MSRadioAccessCapabilityV_BSSGP racap := omit) := {
		pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK := {
			bssgpPduType := '09'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := tr_BSSGP_IE_Tag(tag),
			iMSI := omit,
			rA_Cap_UPDATE_CAUSE := tr_BSSGP_IE_RACU_Cause(cause),
			mS_Radio_Access_Capability := tr_BSSGP_IE_MSRAcap(racap)
		}
	}

	type enumerated BssgpRadioCause {
		BSSGP_RADIO_CAUSE_CONTACT_LOST		('00'H),
		BSSGP_RADIO_CAUSE_LINK_QUAL_INSUFF	('01'H),
		BSSGP_RADIO_CAUSE_CELL_RESEL_ORDERED	('02'H),
		BSSGP_RADIO_CAUSE_CELL_RESEL_PREPARE	('03'H),
		BSSGP_RADIO_CAUSE_CELL_RESEL_FAILURE 	('04'H)
	} with { variant "FIELDLENGTH(8)" };

        function ts_BSSGP_RADIO_CAUSE(template (omit) BssgpRadioCause cause) return template (omit) Radio_Cause {
		var template (omit) Radio_Cause ret;
		if (istemplatekind(cause, "omit")) {
			ret := omit;
		} else {
			ret.iEI := '19'O;
			ret.ext := '1'B;
			ret.lengthIndicator := { length1 := 1 };
			ret.radio_Cause_Value := int2oct(enum2int(valueof(cause)), 1);
		}
		return ret;
	}
	function tr_BSSGP_RADIO_CAUSE(template BssgpRadioCause cause) return template (present) Radio_Cause {
		var template Radio_Cause ret;
		ret.iEI := '19'O;
		ret.ext := '1'B;
		ret.lengthIndicator := { length1 := 1 };
		if (isvalue(cause)) {
			ret.radio_Cause_Value := int2oct(enum2int(valueof(cause)), 1);
		} else {
			ret.radio_Cause_Value := ?
		}
		return ret;
	}

	/* 10.3.5 */
	template (value) PDU_BSSGP
	ts_BSSGP_RADIO_STATUS(template (omit) GprsTlli tlli, template (value) BssgpRadioCause cause,
			      template (omit) GsmTmsi tmsi := omit,
			      template (omit) hexstring imsi := omit) := {
		pDU_BSSGP_RADIO_STATUS := {
			bssgpPduType := '0a'O,
			tLLI := f_ts_BSSGP_TLLI(tlli),
			tMSI := f_ts_BSSGP_TMSI(tmsi),
			iMSI := f_ts_BSSGP_IMSI(imsi),
			radio_Cause := ts_BSSGP_RADIO_CAUSE(cause)
		}
	}
	template (present) PDU_BSSGP
	tr_BSSGP_RADIO_STATUS(template GprsTlli tlli, template (present) BssgpRadioCause cause,
			      template GsmTmsi tmsi := *, template hexstring imsi := *) := {
		pDU_BSSGP_RADIO_STATUS := {
			bssgpPduType := '0a'O,
			tLLI := f_tr_BSSGP_TLLI(tlli),
			tMSI := f_tr_BSSGP_TMSI(tmsi),
			iMSI := f_tr_BSSGP_IMSI(imsi),
			radio_Cause := tr_BSSGP_RADIO_CAUSE(cause)
		}
	}

	/* 10.4.15 */
	template (value) PDU_BSSGP
	ts_BSSGP_INVOKE_TRACE(OCT1 eq_trace, OCT2 ref) := {
		pDU_BSSGP_SGSN_INVOKE_TRACE := {
			bssgpPduType := '40'O,
			traceType := {
				iEI := '22'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				equipment_Trace := eq_trace
			},
			traceReference := {
				iEI := '21'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				trace_Reference := ref
			},
			triggerId := omit,
			mobileId := omit,
			omcId := omit,
			transactionId := omit
		}
	}
	template (present) PDU_BSSGP
	tr_BSSGP_INVOKE_TRACE(template (present) OCT1 eq_trace, template (present) OCT2 ref) := {
		pDU_BSSGP_SGSN_INVOKE_TRACE := {
			bssgpPduType := '40'O,
			traceType := {
				iEI := '22'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				equipment_Trace := eq_trace
			},
			traceReference := {
				iEI := '21'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				trace_Reference := ref
			},
			triggerId := *,
			mobileId := *,
			omcId := *,
			transactionId := *
		}
	}

	/* 10.4.36 */
	template (value) PDU_BSSGP
	ts_OVERLOAD(template (value) BIT1 priority_class) := {
		pDU_BSSGP_OVERLOAD := {
			bssgpPduType := '42'O,
			priority_Class_Indicator := {
				iEI := '8f'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				priority_Class_Indicator_Value := priority_class,
				spare := '0000000'B
			}
		}
	}
	template (present) PDU_BSSGP
	tr_OVERLOAD(template (present) BIT1 priority_class) := {
		pDU_BSSGP_OVERLOAD := {
			bssgpPduType := '42'O,
			priority_Class_Indicator := {
				iEI := '8f'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				priority_Class_Indicator_Value := priority_class,
				spare := '0000000'B
			}
		}
	}

	/* 3GPP TS 48.018 11.3.61 */
	const OCT1 RIM_APP_ID_NACC := '01'O;
	const OCT1 RIM_APP_ID_SI3 := '02'O;
	const OCT1 RIM_APP_ID_MBMS_DATA_CH := '03'O;
	const OCT1 RIM_APP_ID_SON_TRANSF := '04'O;
	const OCT1 RIM_APP_ID_UTRA_SI := '05'O;
	template (value) RIM_Application_Identity ts_RIM_Application_Identity(OCT1 app_id) := {
		 iEI := '4B'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 1
		 },
		 rIMApplicationIdentity := app_id
	}


	/* 3GPP TS 48.018 11.3.62 */
	template (value) RIM_Sequence_Number ts_RIM_Sequence_Number(integer seq) := {
		 iEI := '4C'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 4
		 },
		 rIMSequenceNumber := int2oct(seq, 4)
	}

	/* 3GPP TS 48.018 11.3.62a.1 */
	template (value) RAN_Information_Request_RIM_Container
	ts_RAN_Information_Request_RIM_Container(template (value) RIM_Application_Identity app_id,
						 template (value) RIM_Sequence_Number seq,
						 template (value) RIM_PDU_Indications ind,
						 template (omit) RIM_Protocol_Version_Number ver := omit,
						 template (omit) RAN_Information_Request_Application_Container app_cont := omit,
						 template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
		 iEI := '57'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIM_Application_Identity := app_id,
		 rIM_Sequence_Number := seq,
		 rIM_PDU_Indications := ind,
		 rIM_Protocol_Version_Number := ver,
		 application_Container := app_cont,
		 sON_Transfer_Application_Identity_TLV := son_app_id
	}
	template RAN_Information_Request_RIM_Container
	tr_RAN_Information_Request_RIM_Container(template RIM_Application_Identity app_id := ?,
						 template RIM_Sequence_Number seq := ?,
						 template RIM_PDU_Indications ind := ?,
						 template RIM_Protocol_Version_Number ver := *,
						 template RAN_Information_Request_Application_Container app_cont := *,
						 template SON_Transfer_Application_Identity_TLV son_app_id := *) := {
		 iEI := '57'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := ?
		 },
		 rIM_Application_Identity := app_id,
		 rIM_Sequence_Number := seq,
		 rIM_PDU_Indications := ind,
		 rIM_Protocol_Version_Number := ver,
		 application_Container := app_cont,
		 sON_Transfer_Application_Identity_TLV := son_app_id
	}


	/* 3GPP TS 48.018 11.3.62a.2 */
	template (value) RAN_Information_RIM_Container
	ts_RAN_Information_RIM_Container(template (value) RIM_Application_Identity app_id,
					 template (value) RIM_Sequence_Number seq,
					 template (value) RIM_PDU_Indications ind,
					 template (omit) RIM_Protocol_Version_Number ver := omit,
					 template (omit) ApplContainer_or_ApplErrContainer app_cont_or_app_err := omit,
					 template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {

		 iEI := '58'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIM_Application_Identity := app_id,
		 rIM_Sequence_Number := seq,
		 rIM_PDU_Indications := ind,
		 rIM_Protocol_Version_Number := ver,
		 applContainer_or_ApplErrContainer := app_cont_or_app_err,
		 sON_Transfer_Application_Identity := son_app_id
	}
	template (value) ApplContainer_or_ApplErrContainer
	tsu_ApplContainer_or_ApplErrContainer_NACC(template (value) ApplContainer_or_ApplErrContainer_NACC cont) := {
		nacc := cont
	}
	template (value) ApplContainer_or_ApplErrContainer
	tsu_ApplContainer_or_ApplErrContainer_SI3(template (value) ApplContainer_or_ApplErrContainer_SI3 cont) := {
		si3 := cont
	}
	template (value) ApplContainer_or_ApplErrContainer
	tsu_ApplContainer_or_ApplErrContainer_MBMS_data_channel(template (value) ApplContainer_or_ApplErrContainer_MBMS_data_channel cont) := {
		mBMS_data_channel := cont
	}
	template (value) ApplContainer_or_ApplErrContainer_NACC
	tsu_ApplContainer_NACC(template (value) BssgpCellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
		application_Container := ts_RAN_Information_Application_Container_NACC(cid, psi_type, si_psi_num, si_psi)
	}
	template (value) ApplContainer_or_ApplErrContainer_NACC
	tsu_ApplErrContainer_NACC(template (value) BssgpCellId cid,
				  integer cause,
				  template (value) Application_Container_IE_NACC app_cont) := {
		application_Error_Container := ts_Application_Error_Container_NACC(cid, cause, app_cont)
	}
	template (value) ApplContainer_or_ApplErrContainer_SI3
	tsu_ApplContainer_SI3(template (value) BssgpCellId cid, template (value) SI3 si3) := {
		application_Container := ts_RAN_Information_Application_Container_SI3(cid, si3)
	}
	template (value) ApplContainer_or_ApplErrContainer_SI3
	tsu_ApplErrContainer_SI3(template (value) BssgpCellId cid,
				 integer cause,
				 template (value) Application_Container_IE_SI3 app_cont) := {
		application_Error_Container := ts_Application_Error_Container_SI3(cid, cause, app_cont)
	}
	template (value) ApplContainer_or_ApplErrContainer_MBMS_data_channel
	tsu_ApplContainer_MBMS_data_channel(template (value) BssgpCellId cid, octetstring data_ch_report) := {
		application_Container := ts_RAN_Information_Application_Container_MBMS_data_channel(cid, data_ch_report)
	}
	template (value) ApplContainer_or_ApplErrContainer_MBMS_data_channel
	tsu_ApplErrContainer_MBMS_data_channel(template (value) BssgpCellId cid,
					       integer cause,
					       template (value) Application_Container_IE_MBMS_data_channel app_cont) := {
		application_Error_Container := ts_Application_Error_Container_MBMS_data_channel(cid, cause, app_cont)
	}

	/* 3GPP TS 48.018 11.3.62a.3 */
	template (value) RAN_Information_Ack_RIM_Container
	ts_RAN_Information_Ack_RIM_Container(template (value) RIM_Application_Identity app_id,
					     template (value) RIM_Sequence_Number seq,
					     template (omit) RIM_Protocol_Version_Number ver := omit,
					     template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
		 iEI := '5A'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIM_Application_Identity := app_id,
		 rIM_Sequence_Number := seq,
		 rIM_Protocol_Version_Number := ver,
		 sON_Transfer_Application_Identity := son_app_id
	}

	/* 3GPP TS 48.018 11.3.62a.4 */
	template (value) RAN_Information_Error_RIM_Container
	ts_RAN_Information_Error_RIM_Container(template (value) RIM_Application_Identity app_id,
					       template (value) Cause_BSSGP cause,
					       template (omit) RIM_Protocol_Version_Number ver := omit,
					       PDU_BSSGP pdu,
					       template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
		 iEI := '5B'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIM_Application_Identity := app_id,
		 rIM_cause := cause,
		 rIM_Protocol_Version_Number := ver,
		 pDU_in_Error:= {
			iEI := '15'O,
			ext := '1'B,
			lengthIndicator := {
				length1 := 0 /* overwritten */
			},
			erroneous_BSSGP_PDU := enc_PDU_BSSGP(pdu)
		 },
		 sON_Transfer_Application_Identity := son_app_id
	}

	/* 3GPP TS 48.018 11.3.62a.5 */
	template (value) RAN_Information_Application_Error_RIM_Container
	ts_RAN_Information_Application_Error_RIM_Container(template (value) RIM_Application_Identity app_id,
							   template (value) RIM_Sequence_Number seq,
							   template (value) RIM_PDU_Indications ind,
							   template (omit) RIM_Protocol_Version_Number ver := omit,
							   template (value) Application_Error_Container cont,
							   template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
		 iEI := '59'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIM_Application_Identity := app_id,
		 rIM_Sequence_Number := seq,
		 rIM_PDU_Indications := ind,
		 rIM_Protocol_Version_Number := ver,
		 application_Error_Container := cont,
		 sON_Transfer_Application_Identity := son_app_id
	}


	/* 3GPP TS 48.018 11.3.63.1 */
	template (value) RAN_Information_Request_Application_Container
	tsu_RAN_Information_Request_Application_Container_NACC(template (value) BssgpCellId cid) := {
		nacc := ts_RAN_Information_Request_Application_Container_NACC(cid)
	}
	template (value) RAN_Information_Request_Application_Container
	tsu_RAN_Information_Request_Application_Container_SI3(template (value) BssgpCellId cid) := {
		si3 := ts_RAN_Information_Request_Application_Container_SI3(cid)
	}
	template (value) RAN_Information_Request_Application_Container
	tsu_RAN_Information_Request_Application_Container_MBMS_data_channel(template (value) BssgpCellId cid) := {
		mBMS_data_channel := ts_RAN_Information_Request_Application_Container_MBMS_data_channel(cid)
	}

	/* NOTE: The type description of reporting_Cell_Identifier in chapter 11.3.63.1, version V10.6.0 (2012-07) of
	 * 3GPP TS 48.018 clearly states: "Reporting Cell Identifier: This field is encoded as the Cell Identifier
	 * defined in sub-clause 11.3.9". However this seems to be an error in the specification, because the
	 * specifiction in Table 11.3.63.1.1 already has a length field an an IEI defined. Keeping the IEI and lenght
	 * of the BSSGP cell identifier in addition would no make sense. Also in the chapters below the specifiction
	 * of the IEs are similar and there it says "Reporting Cell Identifier: This field is encoded as the value
	 * part of the Cell Identifier IE defined in sub-clause 11.3.9, not including IEI and Length Indicator.",
	 * which actually makes sense. */

	/* 3GPP TS 48.018 11.3.63.1.1 */
	template (value) RAN_Information_Request_Application_Container_NACC
	ts_RAN_Information_Request_Application_Container_NACC(template (value) BssgpCellId cid) := {
		 iEI := '4D'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid)
	}

	/* 3GPP TS 48.018 11.3.63.1.2 */
	template (value) RAN_Information_Request_Application_Container_SI3
	ts_RAN_Information_Request_Application_Container_SI3(template (value) BssgpCellId cid) := {
		 iEI := '4D'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid)
	}

	/* 3GPP TS 48.018 11.3.63.1.3 */
	template (value) RAN_Information_Request_Application_Container_MBMS_data_channel
	ts_RAN_Information_Request_Application_Container_MBMS_data_channel(template (value) BssgpCellId cid) := {
		 iEI := '4D'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid)
	}

	/* 3GPP TS 48.018 11.3.63.2.1 */
	template (value) RAN_Information_Application_Container_NACC
	ts_RAN_Information_Application_Container_NACC(template (value) BssgpCellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
		 iEI := '4E'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid),
		 typeBit := bool2bit(psi_type),
		 number_of_SI_PSI := int2bit(si_psi_num, 7),
		 sI_PSI := si_psi
	}

	/* 3GPP TS 48.018 11.3.63.2.2 */
	template (value) RAN_Information_Application_Container_SI3
	ts_RAN_Information_Application_Container_SI3(template (value) BssgpCellId cid, template (value) SI3 si3) := {
		 iEI := '4E'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid),
		 sI3 := si3
	}

	/* 3GPP TS 48.018 11.3.63.2.3 */
	template (value) RAN_Information_Application_Container_MBMS_data_channel
	ts_RAN_Information_Application_Container_MBMS_data_channel(template (value) BssgpCellId cid, octetstring data_ch_report) := {
		 iEI := '4E'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid),
		 mBMS_data_channel_report := data_ch_report
	}


	/* 3GPP TS 48.018 11.3.64 */
	template (value) Application_Error_Container
	tsu_Application_Error_Container_NACC(template (value) BssgpCellId cid,
					     integer cause,
					     template (value) Application_Container_IE_NACC app_cont) := {
		nacc := ts_Application_Error_Container_NACC(cid, cause, app_cont)
	}
	template (value) Application_Error_Container
	tsu_Application_Error_Container_SI3(template (value) BssgpCellId cid,
					    integer cause,
					    template (value) Application_Container_IE_SI3 app_cont) := {
		si3 := ts_Application_Error_Container_SI3(cid, cause, app_cont)
	}
	template (value) Application_Error_Container
	tsu_Application_Error_Container_MBMS_data_channel(template (value) BssgpCellId cid,
							  integer cause,
							  template (value) Application_Container_IE_MBMS_data_channel app_cont) := {
		mBMS_data_channel := ts_Application_Error_Container_MBMS_data_channel(cid, cause, app_cont)
	}

	/* 3GPP TS 48.018 11.3.64.1  */
	template (value) Application_Error_Container_NACC
	ts_Application_Error_Container_NACC(template (value) BssgpCellId cid,
					    integer cause,
					    template (value) Application_Container_IE_NACC app_cont) := {
		 iEI := '56'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 nACC_cause := int2oct(cause, 1),
		 erroneousApplicationContainer := app_cont
	}
	template (value) Application_Container_IE_NACC
	tsu_Application_Container_IE_NACC_req(template (value) BssgpCellId cid) := {
		rAN_Information_Request_Application_Container := ts_RAN_Information_Request_Application_Container_NACC(cid)
	}
	template (value) Application_Container_IE_NACC
	tsu_Application_Container_IE_NACC(template (value) BssgpCellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
		rAN_Information_Application_Container := ts_RAN_Information_Application_Container_NACC(cid, psi_type, si_psi_num, si_psi)
	}

	/* 3GPP TS 48.018 11.3.64.2 */
	template (value) Application_Error_Container_SI3
	ts_Application_Error_Container_SI3(template (value) BssgpCellId cid,
					   integer cause,
					   template (value) Application_Container_IE_SI3 app_cont) := {
		 iEI := '56'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 sI3_cause := int2oct(cause, 1),
		 erroneousApplicationContainer := app_cont
	}
	template (value) Application_Container_IE_SI3
	tsu_Application_Container_IE_SI3_req(template (value) BssgpCellId cid) := {
		rAN_Information_Request_Application_Container := ts_RAN_Information_Request_Application_Container_SI3(cid)
	}
	template (value) Application_Container_IE_SI3
	tsu_Application_Container_IE_SI3(template (value) BssgpCellId cid, template (value) SI3 si3) := {
		rAN_Information_Application_Container := ts_RAN_Information_Application_Container_SI3(cid, si3)
	}

	/* 3GPP TS 48.018 11.3.64.3 */
	template (value) Application_Error_Container_MBMS_data_channel
	ts_Application_Error_Container_MBMS_data_channel(template (value) BssgpCellId cid,
							 integer cause,
							 template (value) Application_Container_IE_MBMS_data_channel app_cont) := {
		 iEI := '56'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 mBMS_data_channel_cause := int2oct(cause, 1),
		 erroneousApplicationContainer := app_cont
	}
	template (value) Application_Container_IE_MBMS_data_channel
	tsu_Application_Container_IE_MBMS_data_channel_req(template (value) BssgpCellId cid) := {
		rAN_Information_Request_Application_Container := ts_RAN_Information_Request_Application_Container_MBMS_data_channel(cid)
	}
	template (value) Application_Container_IE_MBMS_data_channel
	tsu_Application_Container_IE_MBMS_data_channel(template (value) BssgpCellId cid, octetstring data_ch_report) := {
		rAN_Information_Application_Container := ts_RAN_Information_Application_Container_MBMS_data_channel(cid, data_ch_report)
	}


	/* 3GPP TS 44.018 10.5.1.3 -> 3GPP TS 24.008 10.5.1.3 */
	function t_LocationAreaIdentification(template BssgpCellId cid) return template BSSGP_Types.LocationAreaIdentification {
		var template BSSGP_Types.LocationAreaIdentification ret := {
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			lac := ?
		}
		if (istemplatekind(cid, "omit")) {
			return omit;
		} else if (istemplatekind(cid, "*")) {
			return *;
		} else if (istemplatekind(cid, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
			if (isvalue(cid.ra_id.lai.lac)) {
				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
			}
		}
		return ret;
	}

	/* 3GPP TS 44.018 10.5.2.11 */
	template (value) ControlChannelDescription ts_ControlChannelDescription(integer ccch_conf,
										integer bs_ag_blks_res,
										boolean att,
										boolean mscr,
										integer bs_pa_mfrms,
										BIT2 cbq3,
										integer t3212) := {
		 cCCH_Conf := int2bit(ccch_conf, 3),
		 bS_AG_BLKS_RES := int2bit(bs_ag_blks_res, 3),
		 aTT := bool2bit(att),
		 mSCR := bool2bit(mscr),
		 bS_PA_MFRMS := int2bit(bs_pa_mfrms, 3),
		 spare1 := '00'B,
		 cBQ3 := cbq3,
		 spare2 := '0'B,
		 t3212 := int2oct(t3212, 1)
	}

	/* 3GPP TS 44.018 10.5.2.3 */
	template (value) CellOptions ts_CellOptions(integer radio_link_timeout,
						    BIT3 dtx,
						    boolean pwrc) := {
		radioLinkTimeout := int2bit(radio_link_timeout, 4),
		dTX1 := dtx[0] & dtx[1],
		pWRC := bool2bit(pwrc),
		dtx2 := dtx[2]
	}

	/* 3GPP TS 44.018 10.5.2.4 */
	template (value) CellSelectionParameters ts_CellSelectionParameters(integer ms_txpwr_max_cch,
									    integer cell_reselection_hysteresis,
									    integer rxlev_access_min,
									    boolean neci,
									    boolean acs) := {
		mS_TXPWR_MAX_CCH := int2bit(ms_txpwr_max_cch, 5),
		cellReselectHysterisis := int2bit(cell_reselection_hysteresis, 3),
		rXLEV_Access_Min := int2bit(rxlev_access_min, 6),
		nECI := bool2bit(neci),
		aCS := bool2bit(acs)
	}

	/* 3GPP TS 44.018 10.5.2.29 */
	template (value) RACHControlParameters ts_RACHControlParameters(boolean re,
									boolean cell_barr_access,
									integer tx_integer,
									integer max_retrans,
									integer ac_15_to_8,
									integer ac_7_to_0) := {
		rE := bool2bit(re),
		cellBarrAccess := bool2bit(cell_barr_access),
		tX_Integer := int2bit(tx_integer, 4),
		maxRetrans := int2bit(max_retrans, 2),
		aC_15_to_8 := int2oct(ac_15_to_8, 1),
		aC_7_to_0 := int2oct(ac_7_to_0, 1)
	}

	/* 3GPP TS 44.018 9.1.35 */
	template (value) SI3 ts_SI3(integer cell_id,
				    template (value) BSSGP_Types.LocationAreaIdentification lai,
				    template (value) ControlChannelDescription cch_descr,
				    template (value) CellOptions cell_opt,
				    template (value) CellSelectionParameters cell_sel_par,
				    template (value) RACHControlParameters rach_ctrl_par,
				    OCT4 rest_octets) := {
		sI3MessageType := '1B'O,
		cellIdentity := int2oct(cell_id, 2),
		locationAreaIdentification := lai,
		controlChannelDescription := cch_descr,
		cellOptions := cell_opt,
		cellSelectionParameters := cell_sel_par,
		rACHControlParameters := rach_ctrl_par,
		sI3RestOctets := rest_octets
	}


	/* 3GPP TS 48.018 11.3.65 */
	const BIT3 RIM_PDU_TYPE_STOP := '000'B;
	const BIT3 RIM_PDU_TYPE_SING_REP := '001'B;
	const BIT3 RIM_PDU_TYPE_MULT_REP := '010'B;
	template (value) RIM_PDU_Indications ts_RIM_PDU_Indications(boolean ack, BIT3 type_ext) := {
		 iEI := '4F'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 1
		 },
		 ack := bool2bit(ack),
		 pDU_Type_Extension := type_ext,
		 reserved := '0000'B
	}

	/* 3GPP TS 48.018 11.3.67 */
	template (value) RIM_Protocol_Version_Number ts_RIM_Protocol_Version_Number(integer ver) := {
		 iEI := '55'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 1
		 },
		 rIMProtocolVersionNumber := int2oct(ver, 1)
	}

	/* 3GPP TS 48.018 11.3.70 */
	const HEX1 RIM_ADDR_GERAN_CELL_ID := '0'H;
	const HEX1 RIM_ADDR_UTRAN_RNC_ID := '1'H;
	const HEX1 RIM_ADDR_EUTRAN_NODEB_ID := '2'H;
	const HEX1 RIM_ADDR_EHRPD_SECTOR_ID := '3'H;
	template (value) RIM_Routing_Information ts_RIM_Routing_Information(HEX1 addr_discr, template (value) RIM_Routing_Address addr) := {
		 iEI := '54'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIMRoutingAddressDiscriminator := addr_discr,
		 spare := '0'H,
		 rIM_Routing_Address := addr
	}
	template RIM_Routing_Information tr_RIM_Routing_Information(template HEX1 addr_discr := ?, template RIM_Routing_Address addr := ?) := {
		 iEI := '54'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := ?
		 },
		 rIMRoutingAddressDiscriminator := addr_discr,
		 spare := '0'H,
		 rIM_Routing_Address := addr
	}

	template RIM_Routing_Address t_RIM_Routing_Address_cid(template BssgpCellId cid := ?) := {
		 cell_Identifier := t_Cell_Identifier_V(cid)
	}
	template RIM_Routing_Address t_RIM_Routing_Address_rncid(template BssgpCellId cid := ?, template integer rnc_id := ?) := {
		 globalRNCID := t_GlobalRNC_ID_BSSGP(cid, rnc_id)
	}
	template RIM_Routing_Address t_RIM_Routing_Address_enbid(template BssgpCellId cid := ?, template integer tac := ?, template octetstring gnbid := ?) := {
		 eNB_Identifier := t_ENB_Identifier_V(cid, tac, gnbid)
	}
	template RIM_Routing_Address t_RIM_Routing_Address_sector(template octetstring sector := ?) := {
		 eHRPD_SectorID := sector
	}

	function t_Cell_Identifier_V(template BssgpCellId cid) return template Cell_Identifier_V {
		var template Cell_Identifier_V ret := {
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			lac := ?,
			rac := ?,
			cI_value := ?
		}
		if (istemplatekind(cid, "omit")) {
			return omit;
		} else if (istemplatekind(cid, "*")) {
			return *;
		} else if (istemplatekind(cid, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
			if (isvalue(cid.ra_id.lai.lac)) {
				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
			}
		}
		if (isvalue(cid) and isvalue(cid.ra_id)) {
			ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
		}
		if (isvalue(cid)) {
			ret.cI_value := f_oct_or_wc(cid.cell_id, 2);
		}
		return ret;
	}

	function t_GlobalRNC_ID_BSSGP(template BssgpCellId cid, template integer rnc_id) return template GlobalRNC_ID_BSSGP {
		var template GlobalRNC_ID_BSSGP ret := {
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			lac := ?,
			rac := ?,
			spare := ?,
			rNC_ID := ?
		}
		if (istemplatekind(cid, "omit") and istemplatekind(rnc_id, "omit")) {
			return omit;
		} else if (istemplatekind(cid, "*") and istemplatekind(rnc_id, "*")) {
			return *;
		} else if (istemplatekind(cid, "?") and istemplatekind(rnc_id, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
			if (isvalue(cid.ra_id.lai.lac)) {
				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
			}
		}
		if (isvalue(cid) and isvalue(cid.ra_id)) {
			ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
		}
		if (isvalue(rnc_id)) {
			ret.spare := '0'H;
			ret.rNC_ID := rnc_id;
		}

		return ret;
	}

	function t_ENB_Identifier_V(template BssgpCellId cid, template integer tac, template octetstring gnbid) return template ENB_Identifier_V {
		var template ENB_Identifier_V ret := {
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			tac := ?,
			globaleNBID := ?
		}
		if (istemplatekind(cid, "omit") and istemplatekind(tac, "omit") and istemplatekind(gnbid, "omit")) {
			return omit;
		} else if (istemplatekind(cid, "*") and istemplatekind(tac, "*") and istemplatekind(gnbid, "*")) {
			return *;
		} else if (istemplatekind(cid, "?") and istemplatekind(tac, "?") and istemplatekind(gnbid, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
		}
		if (isvalue(tac)) {
			ret.tac := int2oct(valueof(tac), 2);
		}
		if (isvalue(gnbid)) {
			ret.globaleNBID := gnbid;
		}

		return ret;
	}

	/* 3GPP TS 48.018 11.3.108 */
	template (value) SON_Transfer_Application_Identity_TLV ts_SON_Transfer_Application_Identity_TLV(template (value) octetstring app_id) := {
		 iEI := '84'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 sON_Transfer_Application_Identity := app_id
	}


	/* 3GPP TS 48.018 10.6.1 */
	template (value) PDU_BSSGP
	ts_RAN_INFORMATION_REQUEST(template (value) RIM_Routing_Information dst,
				   template (value) RIM_Routing_Information src,
				   template (value) RAN_Information_Request_RIM_Container cont) := {
		pDU_BSSGP_RAN_INFORMATION_REQUEST := {
			bssgpPduType := '71'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}
	template PDU_BSSGP
	tr_RAN_INFORMATION_REQUEST(template RIM_Routing_Information dst := ?,
				   template RIM_Routing_Information src := ?,
				   template RAN_Information_Request_RIM_Container cont := ?) := {
		pDU_BSSGP_RAN_INFORMATION_REQUEST := {
			bssgpPduType := '71'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}

	/* 3GPP TS 48.018 10.6.2 */
	template (value) PDU_BSSGP
	ts_PDU_BSSGP_RAN_INFORMATION(template (value) RIM_Routing_Information dst,
				     template (value) RIM_Routing_Information src,
				     template (value) RAN_Information_RIM_Container cont) := {
		pDU_BSSGP_RAN_INFORMATION := {
			bssgpPduType := '70'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}
	template PDU_BSSGP
	tr_PDU_BSSGP_RAN_INFORMATION(template RIM_Routing_Information dst := ?,
				     template RIM_Routing_Information src := ?,
				     template RAN_Information_RIM_Container cont := ?) := {
		pDU_BSSGP_RAN_INFORMATION := {
			bssgpPduType := '70'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}

	/* 3GPP TS 48.018 10.6.3 */
	template (value) PDU_BSSGP
	ts_PDU_BSSGP_RAN_INFORMATION_ACK(template (value) RIM_Routing_Information dst,
					 template (value) RIM_Routing_Information src,
					 template (value) RAN_Information_Ack_RIM_Container cont) := {
		pDU_BSSGP_RAN_INFORMATION_ACK := {
			bssgpPduType := '72'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}
	template PDU_BSSGP
	tr_PDU_BSSGP_RAN_INFORMATION_ACK(template RIM_Routing_Information dst := ?,
					 template RIM_Routing_Information src := ?,
					 template RAN_Information_Ack_RIM_Container cont := ?) := {
		pDU_BSSGP_RAN_INFORMATION_ACK := {
			bssgpPduType := '72'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}

	/* 3GPP TS 48.018 10.6.4 */
	template (value) PDU_BSSGP
	ts_PDU_BSSGP_RAN_INFORMATION_ERROR(template (value) RIM_Routing_Information dst,
					   template (value) RIM_Routing_Information src,
					   template (value) RAN_Information_Error_RIM_Container cont) := {
		pDU_BSSGP_RAN_INFORMATION_ERROR := {
			bssgpPduType := '73'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}
	template PDU_BSSGP
	tr_PDU_BSSGP_RAN_INFORMATION_ERROR(template RIM_Routing_Information dst := ?,
					   template RIM_Routing_Information src := ?,
					   template RAN_Information_Error_RIM_Container cont := ?) := {
		pDU_BSSGP_RAN_INFORMATION_ERROR := {
			bssgpPduType := '73'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}

	/* 3GPP TS 48.018 10.6.5 */
	template (value) PDU_BSSGP
	ts_PDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR(template (value) RIM_Routing_Information dst,
						       template (value) RIM_Routing_Information src,
						       template (value) RAN_Information_Application_Error_RIM_Container cont) := {
		pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR := {
			bssgpPduType := '74'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}
	template PDU_BSSGP
	tr_PDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR(template RIM_Routing_Information dst := ?,
						       template RIM_Routing_Information src := ?,
						       template RAN_Information_Application_Error_RIM_Container cont := ?) := {
		pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR := {
			bssgpPduType := '74'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}

	/* PDU permitted on PTP BVC only (TS 48.018 Section 5.4.1) */
	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTP_ONLY := (
		{pDU_BSSGP_DL_UNITDATA := ?},
		{pDU_BSSGP_UL_UNITDATA := ?},
		{pDU_BSSGP_RA_CAPABILITY := ?},
		{pDU_BSSGP_RA_CAPABILITY_UPDATE := ?},
		{pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK := ?},
		{pDU_BSSGP_RADIO_STATUS := ?},
		{pDU_BSSGP_FLOW_CONTROL_BVC := ?},
		{pDU_BSSGP_FLOW_CONTROL_BVC_ACK := ?},
		{pDU_BSSGP_FLOW_CONTROL_MS := ?},
		{pDU_BSSGP_FLOW_CONTROL_MS_ACK := ?},
		{pDU_BSSGP_FLOW_CONTROL_PFC := ?},
		{pDU_BSSGP_FLOW_CONTROL_PFC_ACK := ?},
		{pDU_BSSGP_DOWNLOAD_BSS_PFC := ?},
		{pDU_BSSGP_CREATE_BSS_PFC := ?},
		{pDU_BSSGP_CREATE_BSS_PFC_ACK := ?},
		{pDU_BSSGP_CREATE_BSS_PFC_NACK := ?},
		{pDU_BSSGP_MODIFY_BSS_PFC := ?},
		{pDU_BSSGP_MODIFY_BSS_PFC_ACK := ?},
		{pDU_BSSGP_DELETE_BSS_PFC := ?},
		{pDU_BSSGP_DELETE_BSS_PFC_ACK := ?},
		{pDU_BSSGP_DELETE_BSS_PFC_REQ := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUIRED := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUIRED_ACK := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUIRED_NACK := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUEST := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUEST_ACK := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUEST_NACK := ?},
		{pDU_BSSGP_PS_HANDOVER_COMPLETE := ?},
		{pDU_BSSGP_PS_HANDOVER_COMPLETE_ACK := ?},
		{pDU_BSSGP_PS_HANDOVER_CANCEL := ?}
	);

	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTP := (
		tr_BSSGP_PERMITTED_PTP_ONLY,
		{pDU_BSSGP_PAGING_PS := ?},
		{pDU_BSSGP_PAGING_CS := ?},
		{pDU_BSSGP_STATUS := ?}
	);

	/* PDU permitted on Signaling BVC only (TS 48.018 Section 5.4.1) */
	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_SIGN_ONLY := (
		{pDU_BSSGP_SUSPEND := ?},
		{pDU_BSSGP_SUSPEND_ACK := ?},
		{pDU_BSSGP_SUSPEND_NACK := ?},
		{pDU_BSSGP_RESUME := ?},
		{pDU_BSSGP_RESUME_ACK := ?},
		{pDU_BSSGP_RESUME_NACK := ?},
		{pDU_BSSGP_FLUSH_LL := ?},
		{pDU_BSSGP_FLUSH_LL_ACK := ?},
		{pDU_BSSGP_LLC_DISCARDED := ?},
		{pDU_BSSGP_BVC_BLOCK := ?},
		{pDU_BSSGP_BVC_BLOCK_ACK := ?},
		{pDU_BSSGP_BVC_UNBLOCK := ?},
		{pDU_BSSGP_BVC_UNBLOCK_ACK := ?},
		{pDU_BSSGP_BVC_RESET := ?},
		{pDU_BSSGP_BVC_RESET_ACK := ?},
		{pDU_BSSGP_SGSN_INVOKE_TRACE := ?},
		{pDU_BSSGP_PERFORM_LOCATION_REQUEST := ?},
		{pDU_BSSGP_PERFORM_LOCATION_RESPONSE := ?},
		{pDU_BSSGP_PERFORM_LOCATION_ABORT := ?},
		{pDU_BSSGP_POSITION_COMMAND := ?},
		{pDU_BSSGP_POSITION_RESPONSE := ?},
		{pDU_BSSGP_RAN_INFORMATION := ?},
		{pDU_BSSGP_RAN_INFORMATION_REQUEST := ?},
		{pDU_BSSGP_RAN_INFORMATION_ACK := ?},
		{pDU_BSSGP_RAN_INFORMATION_ERROR := ?},
		{pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR := ?},
		{pDU_BSSGP_MBMS_SESSION_START_REQUEST := ?},
		{pDU_BSSGP_MBMS_SESSION_START_RESPONSE := ?},
		{pDU_BSSGP_MBMS_SESSION_STOP_REQUEST := ?},
		{pDU_BSSGP_MBMS_STOP_RESPONSE := ?},
		{pDU_BSSGP_SESSION_UPDATE_REQUEST := ?},
		{pDU_BSSGP_SESSION_UPDATE_RESPONSE := ?}
	);

	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_SIGN := (
		tr_BSSGP_PERMITTED_SIGN_ONLY,
		{pDU_BSSGP_PAGING_PS := ?},
		{pDU_BSSGP_PAGING_CS := ?},
		{pDU_BSSGP_SUSPEND := ?},
		{pDU_BSSGP_STATUS := ?}
	);

	/* PDU permitted on PTM BVC only (TS 48.018 Section 5.4.1) */
	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTM_ONLY := (
		{pDU_BSSGP_DL_MBMS_UNITDATA := ?},
		{pDU_BSSGP_UL_MBMS_UNITDATA := ?}
	);

	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTM := (
		tr_BSSGP_PERMITTED_PTM_ONLY,
		{pDU_BSSGP_STATUS := ?}
	);


	/* Template for any PTP BVCI IE */
	template (present) BVCI tr_BSSGP_IE_PtpBvci := {
		iEI := '04'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		unstructured_value := complement ('0000'O, '0001'O)
	}

	/* message on signaling PTP but containing a ptp BVC */
	/*
	template PDU_BSSGP tr_BSSGP_SIG_FOR_PTP(template Bvci bvci) := (
		{pDU_BSSGP_FLUSH_LL:{?,?,tr_BSSGP_IE_PtpBvci, *, *}},
		{pDU_BSSGP_FLUSH_LL_ACK:{?,?,?,tr_BSSGP_IE_PtpBvci, ?, *}},
		{pDU_BSSGP_LLC_DISCARDED:{?,?,?,tr_BSSGP_IE_PtpBvci, ?, *}},
		{pDU_BSSGP_BVC_BLOCK:{?,tr_BSSGP_IE_PtpBvci, ?}},
		{pDU_BSSGP_BVC_BLOCK_ACK:{?,tr_BSSGP_IE_PtpBvci}},
		{pDU_BSSGP_BVC_UNBLOCK:{?,tr_BSSGP_IE_PtpBvci}},
		{pDU_BSSGP_BVC_UNBLOCK_ACK:{?,tr_BSSGP_IE_PtpBvci}},
		{pDU_BSSGP_BVC_RESET:{?,tr_BSSGP_IE_PtpBvci,?,*,*,*}},
		{pDU_BSSGP_BVC_RESET_ACK:{?,tr_BSSGP_IE_PtpBvci,*,*,*}},
		{pDU_BSSGP_STATUS:{?,?,tr_BSSGP_IE_PtpBvci,*}},
		{pDU_BSSGP_PERFORM_LOCATION_REQUEST:{?,?,?,*,tr_BSSGP_IE_PtpBvci,?,?,?,*,*,*,*,*,*,*,*,*}},
		{pDU_BSSGP_PERFORM_LOCATION_RESPONSE:{?,?,tr_BSSGP_IE_PtpBvci,*,*,*,*,*,*}},
		{pDU_BSSGP_PERFORM_LOCATION_ABORT:{?,?,tr_BSSGP_IE_PtpBvci,?}},
		{pDU_BSSGP_POSITION_COMMAND:{
	);
	*/

	/* extract the BVCI IE of given PDU + return it */
	function f_BSSGP_BVCI_IE_get(PDU_BSSGP pdu) return template (omit) BVCI {
		select (pdu) {
		case (PDU_BSSGP:{pDU_BSSGP_FLUSH_LL:=?}) {
			return pdu.pDU_BSSGP_FLUSH_LL.bVCI_old;
			}
		case (PDU_BSSGP:{pDU_BSSGP_FLUSH_LL_ACK:=?}) {
			return pdu.pDU_BSSGP_FLUSH_LL_ACK.bVCI_new;
			}
		case (PDU_BSSGP:{pDU_BSSGP_LLC_DISCARDED:=?}) {
			return pdu.pDU_BSSGP_LLC_DISCARDED.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_BLOCK:=?}) {
			return pdu.pDU_BSSGP_BVC_BLOCK.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_BLOCK_ACK:=?}) {
			return pdu.pDU_BSSGP_BVC_BLOCK_ACK.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_UNBLOCK:=?}) {
			return pdu.pDU_BSSGP_BVC_UNBLOCK.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_UNBLOCK_ACK:=?}) {
			return pdu.pDU_BSSGP_BVC_UNBLOCK_ACK.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_RESET:=?}) {
			return pdu.pDU_BSSGP_BVC_RESET.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_RESET_ACK:=?}) {
			return pdu.pDU_BSSGP_BVC_RESET_ACK.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_STATUS:=?}) {
			return pdu.pDU_BSSGP_STATUS.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_REQUEST:=?}) {
			return pdu.pDU_BSSGP_PERFORM_LOCATION_REQUEST.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_RESPONSE:=?}) {
			return pdu.pDU_BSSGP_PERFORM_LOCATION_RESPONSE.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_ABORT:=?}) {
			return pdu.pDU_BSSGP_PERFORM_LOCATION_ABORT.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_POSITION_COMMAND:=?}) {
			return pdu.pDU_BSSGP_POSITION_COMMAND.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_POSITION_RESPONSE:=?}) {
			return pdu.pDU_BSSGP_POSITION_RESPONSE.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_PAGING_PS:={?,?,*,{bVCI:=?},*,*,?,*,*}}) {
			return pdu.pDU_BSSGP_PAGING_PS.paging_Field4.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_PAGING_CS:={?,?,?,{bVCI:=?},*,*,*,*,*}}) {
			return pdu.pDU_BSSGP_PAGING_CS.paging_Field4.bVCI;
			}
		case else {
			return omit;
			}
		}
	}

	/* extract the BVCI IE of given PDU + convert it to integer value */
	function f_BSSGP_BVCI_get(PDU_BSSGP pdu) return template (omit) BssgpBvci {
		var template (omit) BVCI bvci_raw := f_BSSGP_BVCI_IE_get(pdu);
		if (istemplatekind(bvci_raw, "omit")) {
			return omit;
		}
		return oct2int(valueof(bvci_raw.unstructured_value));
	}

	/* 3GPP TS 23.003 2.6 */
	type enumerated TlliType {
		TLLI_LOCAL,
		TLLI_FOREIGN,
		TLLI_RANDOM,
		TLLI_AUXILIARY,
		TLLI_RESERVED,
		TLLI_G_RNTI,
		TLLI_RAND_G_RNTI
	}

	/* 3GPP TS 23.003 2.6 */
	function f_gprs_tlli_type(OCT4 tlli) return TlliType {
		var bitstring tllib := oct2bit(tlli);
		if (substr(tllib, 0, 2) == '11'B) {
			return TLLI_LOCAL;
		} else if (substr(tllib, 0, 2) == '10'B) {
			return TLLI_FOREIGN;
		} else if (substr(tllib, 0, 5) == '01111'B) {
			return TLLI_RANDOM;
		} else if (substr(tllib, 0, 4) == '0110'B) {
			return TLLI_RESERVED;
		} else if (substr(tllib, 0, 3) == '010'B) {
			return TLLI_RESERVED;
		} else if (substr(tllib, 0, 4) == '0000'B) {
			return TLLI_G_RNTI;
		} else if (substr(tllib, 0, 4) == '0001'B) {
			return TLLI_RAND_G_RNTI;
		} else {
			setverdict(fail, "Unknonw TLLI Type ", tllib);
			mtc.stop;
		}
	}

	/* build a TLLI of specified type from the given (P)TMSI */
	function f_gprs_tlli_from_tmsi(OCT4 tmsi, TlliType tlli_type) return OCT4 {
		var bitstring tmsi_bits := oct2bit(tmsi);
		var bitstring prefix;
		select (tlli_type) {
		case (TLLI_LOCAL)	{ prefix := '11'B }
		case (TLLI_FOREIGN)	{ prefix := '01111'B }
		case (TLLI_RANDOM)	{ prefix := '0110'B }
		case (TLLI_RESERVED)	{ prefix := '010'B }
		case (TLLI_G_RNTI)	{ prefix := '0000'B }
		case (TLLI_RAND_G_RNTI)	{ prefix := '0001'B }
		case else {
			setverdict(fail, "Unknonw TLLI Type ", tlli_type);
			mtc.stop;
			}
		}
		return bit2oct(prefix & substr(tmsi_bits, lengthof(prefix), 32-lengthof(prefix)));
	}

	function f_gprs_tlli_random() return OCT4 {
		var OCT4 tlli := f_rnd_octstring(4);
		return tlli or4b 'c0000000'O;
	}

} with { encode "RAW" };
