-- This ASN definition is taken from
-- http://132.151.1.19/internet-drafts/draft-ietf-megaco-h248v2-04.txt
--
-- and has been modified to pass through the ASN2ETH compiler
-- (we dont support automatic tags yet so the tags had to be added by
--  hand)

MEDIA-GATEWAY-CONTROL {itu-t(0) recommendation(0) h(8) h248(248) 
modules(0) media-gateway-control(0) version2(2)} 
DEFINITIONS AUTOMATIC TAGS ::= 
BEGIN 
       
      MegacoMessage ::= SEQUENCE 
      { 
         authHeader     [0] IMPLICIT AuthenticationHeader OPTIONAL, 
         mess           [1] IMPLICIT Message 
      } 
       
      AuthenticationHeader ::= SEQUENCE 
      { 
         secParmIndex   [0] IMPLICIT SecurityParmIndex, 
         seqNum         [1] IMPLICIT SequenceNum, 
         ad             [2] IMPLICIT AuthData 
      } 
       
      SecurityParmIndex ::= OCTET STRING(SIZE(4)) 
       
      SequenceNum       ::= OCTET STRING(SIZE(4)) 
       
      AuthData          ::= OCTET STRING (SIZE (12..32)) 
       
      Message ::= SEQUENCE 
      { 
         version           [0] IMPLICIT INTEGER(0..99), 
         -- The version of the protocol defined here is equal to 2. 
         mId               [1] MId,  -- Name/address of message originator 
         messageBody       [2] CHOICE 
         { 
            messageError      [0] IMPLICIT ErrorDescriptor, 
            transactions      [1] IMPLICIT SEQUENCE OF Transaction 
         }, 
         ... 
      } 
       
      MId ::= CHOICE 
      { 
         ip4Address           [0] IMPLICIT IP4Address, 
         ip6Address           [1] IMPLICIT IP6Address, 
         domainName           [2] IMPLICIT DomainName, 
         deviceName           [3] IMPLICIT PathName, 
         mtpAddress           [4] IMPLICIT MtpAddress, 
          -- Addressing structure of mtpAddress: 
          --     25 - 15              0 
          --     |  PC           | NI | 
          --     24 - 14 bits    2 bits 
      -- Note: 14 bits are defined for international use. 
      -- Two national options exist where the point code is 16 or 24   
       -- bits. 
       -- To octet align the mtpAddress, the MSBs shall be encoded as 0s. 
         ... 
      } 
       
      MtpAddress ::= OCTET STRING(SIZE(2..4))

      DomainName ::= SEQUENCE 
      { 
         name           [0] IMPLICIT IA5String, 
         -- The name starts with an alphanumeric digit followed by a 
         -- sequence of alphanumeric digits, hyphens and dots.  No two 
         -- dots shall occur consecutively. 
         portNumber     [1] IMPLICIT INTEGER(0..65535) OPTIONAL 
      } 
       
      IP4Address ::= SEQUENCE 
      { 
         address        [0] IMPLICIT OCTET STRING (SIZE(4)), 
         portNumber     [1] IMPLICIT INTEGER(0..65535) OPTIONAL 
      } 
       
      IP6Address ::= SEQUENCE 
      { 
         address        [0] IMPLICIT OCTET STRING (SIZE(16)), 
         portNumber     [1] IMPLICIT INTEGER(0..65535) OPTIONAL 
      } 
       
      PathName ::= IA5String(SIZE (1..64)) 
      -- See A.3 

      Transaction ::= CHOICE 
      { 
         transactionRequest      [0] IMPLICIT TransactionRequest, 
         transactionPending      [1] IMPLICIT TransactionPending, 
         transactionReply        [2] IMPLICIT TransactionReply, 
         transactionResponseAck  [3] IMPLICIT TransactionResponseAck, 
            -- use of response acks is dependent on underlying transport 
         ... 
      } 
       
      TransactionId ::= INTEGER(0..4294967295)  -- 32-bit unsigned integer 
       
      TransactionRequest ::= SEQUENCE 
      { 
         transactionId        [0] IMPLICIT TransactionId, 
         actions              [1] IMPLICIT SEQUENCE OF ActionRequest, 
         ... 
      } 
       
      TransactionPending ::= SEQUENCE 
      { 
         transactionId        [0] IMPLICIT TransactionId, 
         ... 
      } 
       
      TransactionReply ::= SEQUENCE 
      { 
         transactionId        [0] IMPLICIT TransactionId, 
         immAckRequired       [1] IMPLICIT NULL OPTIONAL, 
         transactionResult    [2] CHOICE 
         { 
              transactionError   [0] IMPLICIT ErrorDescriptor, 
              actionReplies      [1] IMPLICIT SEQUENCE OF ActionReply 
         }, 
         ... 
      } 
       
      TransactionResponseAck ::= SEQUENCE OF TransactionAck 
      TransactionAck ::= SEQUENCE 
      { 
         firstAck       [0] IMPLICIT TransactionId, 
         lastAck        [1] IMPLICIT TransactionId OPTIONAL 
      } 
       
      ErrorDescriptor ::= SEQUENCE 
      { 
         errorCode      [0] IMPLICIT ErrorCode, 
         errorText      [1] IMPLICIT ErrorText OPTIONAL 
      } 
       
      ErrorCode ::= INTEGER(0..65535) 
      -- See clause 14 for IANA considerations with respect to error codes 
    
      ErrorText ::= IA5String 
       
      ContextID ::= INTEGER(0..4294967295) 
       
      -- Context NULL Value: 0 
      -- Context CHOOSE Value: 4294967294 (0xFFFFFFFE)  
      -- Context ALL Value: 4294967295 (0xFFFFFFFF) 
       
       
      ActionRequest ::= SEQUENCE 
      { 
         contextId            [0] IMPLICIT ContextID, 
         contextRequest       [1] IMPLICIT ContextRequest OPTIONAL, 
         contextAttrAuditReq  [2] IMPLICIT ContextAttrAuditRequest OPTIONAL, 
         commandRequests      [3] IMPLICIT SEQUENCE OF CommandRequest 
      } 
       
      ActionReply ::= SEQUENCE 
      { 
         contextId         [0] IMPLICIT ContextID, 
         errorDescriptor   [1] IMPLICIT ErrorDescriptor OPTIONAL, 
         contextReply      [2] IMPLICIT ContextRequest OPTIONAL, 
         commandReply      [3] IMPLICIT SEQUENCE OF CommandReply 
      } 
       
      ContextRequest ::= SEQUENCE 
      { 
         priority       [0] IMPLICIT INTEGER(0..15) OPTIONAL, 
         emergency      [1] IMPLICIT BOOLEAN OPTIONAL, 
         topologyReq    [2] IMPLICIT SEQUENCE OF TopologyRequest OPTIONAL, 
         ... 
      } 
       
      ContextAttrAuditRequest ::= SEQUENCE 
      { 
         topology    [0] IMPLICIT NULL OPTIONAL, 
         emergency   [1] IMPLICIT NULL OPTIONAL, 
         priority    [2] IMPLICIT NULL OPTIONAL, 
         ... 
      } 
       
      CommandRequest ::= SEQUENCE 
      { 
         command           [0] Command, 
         optional          [1] IMPLICIT NULL OPTIONAL, 
         wildcardReturn    [2] IMPLICIT NULL OPTIONAL, 
         ... 
      } 

      Command ::= CHOICE 
      { 
         addReq               [0] IMPLICIT AmmRequest, 
         moveReq              [1] IMPLICIT AmmRequest, 
         modReq               [2] IMPLICIT AmmRequest, 
         -- Add, Move, Modify requests have the same parameters 
         subtractReq          [3] IMPLICIT SubtractRequest, 
         auditCapRequest      [4] IMPLICIT AuditRequest, 
         auditValueRequest    [5] IMPLICIT AuditRequest, 
         notifyReq            [6] IMPLICIT NotifyRequest, 
         serviceChangeReq     [7] IMPLICIT ServiceChangeRequest, 
         ... 
      } 

      CommandReply ::= CHOICE 
      { 
         addReply                [0] IMPLICIT AmmsReply, 
         moveReply               [1] IMPLICIT AmmsReply, 
         modReply                [2] IMPLICIT AmmsReply, 
         subtractReply           [3] IMPLICIT AmmsReply, 
         -- Add, Move, Modify, Subtract replies have the same parameters 
         auditCapReply           [4] AuditReply, 
         auditValueReply         [5] AuditReply, 
         notifyReply             [6] IMPLICIT NotifyReply, 
         serviceChangeReply      [7] IMPLICIT ServiceChangeReply, 
         ... 
      } 
       
      TopologyRequest ::= SEQUENCE 
      { 
         terminationFrom         [0] IMPLICIT TerminationID, 
         terminationTo           [1] IMPLICIT TerminationID, 
         topologyDirection       [2] IMPLICIT ENUMERATED 
         { 
            bothway(0), 
            isolate(1), 
            oneway(2) 
         }, 
         ..., 
         streamID             [3] IMPLICIT StreamID OPTIONAL 
      } 
       
      AmmRequest ::= SEQUENCE 
      { 
         terminationID        [0] IMPLICIT TerminationIDList, 
         descriptors          [1] IMPLICIT SEQUENCE OF AmmDescriptor, 
         -- At most one descriptor of each type (see AmmDescriptor) 
         -- allowed in the sequence. 
         ... 
      } 

      AmmDescriptor ::= CHOICE 
      { 
         mediaDescriptor         [0] IMPLICIT MediaDescriptor, 
         modemDescriptor         [1] IMPLICIT ModemDescriptor, 
         muxDescriptor           [2] IMPLICIT MuxDescriptor, 
         eventsDescriptor        [3] IMPLICIT EventsDescriptor, 
         eventBufferDescriptor   [4] IMPLICIT EventBufferDescriptor, 
         signalsDescriptor       [5] IMPLICIT SignalsDescriptor, 
         digitMapDescriptor      [6] IMPLICIT DigitMapDescriptor, 
         auditDescriptor         [7] IMPLICIT AuditDescriptor, 
         ... 
      } 
       
       
      AmmsReply ::= SEQUENCE 
      { 
         terminationID        [0] IMPLICIT TerminationIDList, 
         terminationAudit     [1] IMPLICIT TerminationAudit OPTIONAL, 
         ... 
      } 
       
      SubtractRequest ::= SEQUENCE 
      { 
         terminationID        [0] IMPLICIT TerminationIDList, 
         auditDescriptor      [1] IMPLICIT AuditDescriptor OPTIONAL, 
         ... 
      } 
       
      AuditRequest ::= SEQUENCE 
      { 
         terminationID        [0] IMPLICIT TerminationID, 
         auditDescriptor      [1] IMPLICIT AuditDescriptor, 
         ... 
      } 

      AuditReply ::= CHOICE 
      { 
         contextAuditResult   [0] IMPLICIT TerminationIDList, 
         error                [1] IMPLICIT ErrorDescriptor, 
         auditResult          [2] IMPLICIT AuditResult, 
         ... 
      } 
       
      AuditResult ::= SEQUENCE 
      { 
       
         terminationID           [0] IMPLICIT TerminationID, 
         terminationAuditResult  [1] IMPLICIT TerminationAudit 
      } 
       
       
       
      TerminationAudit ::= SEQUENCE OF AuditReturnParameter 

      AuditReturnParameter ::= CHOICE 
      { 
         errorDescriptor            [0] IMPLICIT ErrorDescriptor, 
         mediaDescriptor            [1] IMPLICIT MediaDescriptor, 
         modemDescriptor            [2] IMPLICIT ModemDescriptor, 
         muxDescriptor              [3] IMPLICIT MuxDescriptor, 
         eventsDescriptor           [4] IMPLICIT EventsDescriptor, 
         eventBufferDescriptor      [5] IMPLICIT EventBufferDescriptor, 
         signalsDescriptor          [6] IMPLICIT SignalsDescriptor, 
         digitMapDescriptor         [7] IMPLICIT DigitMapDescriptor, 
         observedEventsDescriptor   [8] IMPLICIT ObservedEventsDescriptor, 
         statisticsDescriptor       [9] IMPLICIT StatisticsDescriptor, 
         packagesDescriptor         [10] IMPLICIT PackagesDescriptor, 
         emptyDescriptors           [11] IMPLICIT AuditDescriptor, 
         ... 
      } 
       
      AuditDescriptor ::= SEQUENCE 
      { 
         auditToken  [0] IMPLICIT BIT STRING 
               { 
                  muxToken(0), modemToken(1), mediaToken(2), 
                  eventsToken(3), signalsToken(4), 
                  digitMapToken(5), statsToken(6), 
                  observedEventsToken(7), 
                  packagesToken(8), eventBufferToken(9) 
               } OPTIONAL, 
         ..., 
         auditPropertyToken [1] IMPLICIT SEQUENCE OF IndAuditParameter OPTIONAL 
      } 

      IndAuditParameter ::= CHOICE 
      { 
         indaudmediaDescriptor         [0] IMPLICIT IndAudMediaDescriptor, 
         indaudeventsDescriptor        [1] IMPLICIT IndAudEventsDescriptor, 
         indaudeventBufferDescriptor   [2] IMPLICIT IndAudEventBufferDescriptor, 
         indaudsignalsDescriptor       [3] IndAudSignalsDescriptor, 
         indauddigitMapDescriptor      [4] IMPLICIT IndAudDigitMapDescriptor, 
         indaudstatisticsDescriptor    [5] IMPLICIT IndAudStatisticsDescriptor, 
         indaudpackagesDescriptor      [6] IMPLICIT IndAudPackagesDescriptor, 
         ... 
      } 
       
      IndAudMediaDescriptor ::= SEQUENCE 
      { 
          
         termStateDescr    [0] IMPLICIT IndAudTerminationStateDescriptor OPTIONAL, 
         streams           [1] CHOICE 
               { 
                  oneStream      [0] IMPLICIT IndAudStreamParms, 
                  multiStream    [1] IMPLICIT SEQUENCE OF IndAudStreamDescriptor 
               } OPTIONAL, 
         ... 
      } 
       
      IndAudStreamDescriptor ::= SEQUENCE 
      { 
         streamID                [0] IMPLICIT StreamID, 
         streamParms             [1] IMPLICIT IndAudStreamParms 
      } 
       
      IndAudStreamParms ::= SEQUENCE 
      { 
         localControlDescriptor  [0] IMPLICIT IndAudLocalControlDescriptor OPTIONAL, 
         localDescriptor         [1] IMPLICIT IndAudLocalRemoteDescriptor OPTIONAL, 
         remoteDescriptor        [2] IMPLICIT IndAudLocalRemoteDescriptor OPTIONAL, 
         ... 
      } 
       
      IndAudLocalControlDescriptor ::= SEQUENCE 
      { 
         streamMode              [0] IMPLICIT NULL OPTIONAL, 
         reserveValue            [1] IMPLICIT NULL OPTIONAL, 
         reserveGroup            [2] IMPLICIT NULL OPTIONAL, 
         propertyParms           [3] IMPLICIT IndAudPropertyParms OPTIONAL, 
         ... 
      } 
       
      IndAudPropertyParm ::= SEQUENCE 
      { 
         name     [0] IMPLICIT PkgdName, 
         ... 
      } 

      IndAudPropertyParms ::= SEQUENCE OF IndAudPropertyParm 
       
      IndAudLocalRemoteDescriptor ::= SEQUENCE 
      { 
         propGroupID    [0] IMPLICIT INTEGER(0..65535) OPTIONAL, 
         propGrps       [1] IMPLICIT IndAudPropertyGroup, 
         ... 
      } 
       
      IndAudPropertyGroup ::= SEQUENCE OF IndAudPropertyParm 
       
      IndAudTerminationStateDescriptor ::= SEQUENCE  
      { 
         propertyParms        [0] IMPLICIT IndAudPropertyParms, 
         eventBufferControl   [1] IMPLICIT NULL OPTIONAL, 
         serviceState         [2] IMPLICIT NULL OPTIONAL, 
         ... 
      } 
       
      IndAudEventsDescriptor ::= SEQUENCE 
      { 
         requestID      [0] IMPLICIT RequestID OPTIONAL, 
         pkgdName       [1] IMPLICIT PkgdName, 
         streamID       [2] IMPLICIT StreamID OPTIONAL, 
         ... 
      } 
       
      IndAudEventBufferDescriptor ::= SEQUENCE 
      { 
         eventName   [0] IMPLICIT PkgdName, 
         streamID    [1] IMPLICIT StreamID OPTIONAL, 
         ... 
      } 

      IndAudSignalsDescriptor ::=CHOICE 
      { 
         signal         [0] IMPLICIT IndAudSignal, 
         seqSigList     [1] IMPLICIT IndAudSeqSigList, 
         ... 
      } 
       
      IndAudSeqSigList ::= SEQUENCE 
      { 
         id             [0] IMPLICIT INTEGER(0..65535), 
         signalList     [1] IMPLICIT IndAudSignal OPTIONAL 
      } 
       
      IndAudSignal ::= SEQUENCE 
      { 
         signalName     [0] IMPLICIT PkgdName, 
         streamID       [1] IMPLICIT StreamID OPTIONAL, 
         ... 
      } 
       
      IndAudDigitMapDescriptor ::= SEQUENCE 
      { 
         digitMapName   [0] IMPLICIT DigitMapName OPTIONAL 
      } 
    
      IndAudStatisticsDescriptor ::= SEQUENCE  
      { 
         statName       [0] IMPLICIT PkgdName 
      } 
       
      IndAudPackagesDescriptor ::= SEQUENCE 
      { 
         packageName       [0] IMPLICIT Name, 
         packageVersion    [1] IMPLICIT INTEGER(0..99), 
         ... 
      } 
       
      NotifyRequest ::= SEQUENCE 
      { 
         terminationID              [0] IMPLICIT TerminationIDList, 
         observedEventsDescriptor   [1] IMPLICIT ObservedEventsDescriptor, 
         errorDescriptor            [2] IMPLICIT ErrorDescriptor OPTIONAL, 
         ... 
      } 
       
      NotifyReply ::= SEQUENCE 
      { 
         terminationID           [0] IMPLICIT TerminationIDList, 
         errorDescriptor         [1] IMPLICIT ErrorDescriptor OPTIONAL, 
         ... 
      } 
       
      ObservedEventsDescriptor ::= SEQUENCE 
      { 
         requestId               [0] IMPLICIT RequestID, 
         observedEventLst        [1] IMPLICIT SEQUENCE OF ObservedEvent 
      } 
       
      ObservedEvent ::= SEQUENCE 
      { 
         eventName               [0] IMPLICIT EventName, 
         streamID                [1] IMPLICIT StreamID OPTIONAL, 
         eventParList            [2] IMPLICIT EventParameters, 
         timeNotation            [3] IMPLICIT TimeNotation OPTIONAL, 
         ... 
      } 
       
      EventName ::= OCTET STRING 

      ExtraInfo ::= CHOICE 
      { 
         relation [0] IMPLICIT Relation, 
         range    [1] IMPLICIT BOOLEAN, 
         sublist  [2] IMPLICIT BOOLEAN 
      }
             
      EventParameter ::= SEQUENCE 
      { 
         eventParameterName      [0] IMPLICIT EventParameterName, 
         eventParamValue         [1] IMPLICIT EventParamValues, 
    
         -- For use of extraInfo see the comment related to PropertyParm 
         extraInfo               [2] ExtraInfo OPTIONAL,
         ... 
       
      }

	  EventParameterName ::= Name
	
	  EventParamValues ::= SEQUENCE OF EventParamValue
	  
	  EventParamValue ::= OCTET STRING

      EventParameters ::= SEQUENCE OF EventParameter

      ServiceChangeRequest ::= SEQUENCE 
      { 
         terminationID           [0] IMPLICIT TerminationIDList, 
         serviceChangeParms      [1] IMPLICIT ServiceChangeParm, 
         ... 
      } 
       
      ServiceChangeReply ::= SEQUENCE 
      { 
         terminationID           [0] IMPLICIT TerminationIDList, 
         serviceChangeResult     [1] ServiceChangeResult, 
         ... 
      } 
       
      -- For ServiceChangeResult, no parameters are mandatory.  Hence the 
      -- distinction between ServiceChangeParm and ServiceChangeResParm. 

      ServiceChangeResult ::= CHOICE 
      { 
         errorDescriptor            [0] IMPLICIT ErrorDescriptor, 
         serviceChangeResParms      [1] IMPLICIT ServiceChangeResParm 
      } 
       
      WildcardField ::= OCTET STRING(SIZE(1)) 
       
      TerminationID ::= SEQUENCE 
      { 
         wildcard       [0] IMPLICIT SEQUENCE OF WildcardField,  
         id             [1] IMPLICIT OCTET STRING(SIZE(1..8)), 
         ... 
      } 
      -- See A.1 for explanation of wildcarding mechanism. 
      -- Termination ID 0xFFFFFFFFFFFFFFFF indicates the ROOT Termination. 
       
      TerminationIDList ::= SEQUENCE OF TerminationID 
       

      MediaDescriptor ::= SEQUENCE 
      { 
         termStateDescr    [0] IMPLICIT TerminationStateDescriptor OPTIONAL, 
         streams           [1] CHOICE 
                  { 
                     oneStream      [0] IMPLICIT StreamParms, 
                     multiStream    [1] IMPLICIT SEQUENCE OF StreamDescriptor 
                  } OPTIONAL, 
         ... 
      } 
       
      StreamDescriptor ::= SEQUENCE 
      { 
         streamID                [0] IMPLICIT StreamID, 
         streamParms             [1] IMPLICIT StreamParms 
      } 
       
      StreamParms ::= SEQUENCE 
      { 
         localControlDescriptor     [0] IMPLICIT LocalControlDescriptor OPTIONAL, 
         localDescriptor            [1] IMPLICIT LocalRemoteDescriptor OPTIONAL, 
         remoteDescriptor           [2] IMPLICIT LocalRemoteDescriptor OPTIONAL, 
         ... 
      } 
       
      LocalControlDescriptor ::= SEQUENCE 
      { 
         streamMode        [0] IMPLICIT StreamMode OPTIONAL, 
         reserveValue      [1] IMPLICIT BOOLEAN OPTIONAL, 
         reserveGroup      [2] IMPLICIT BOOLEAN OPTIONAL, 
         propertyParms     [3] IMPLICIT PropertyParms, 
         ... 
      } 
       
      StreamMode ::= ENUMERATED  
      { 
         sendOnly(0), 
         recvOnly(1), 
         sendRecv(2), 
         inactive(3), 
         loopBack(4), 
            ... 
      } 
       
      -- In PropertyParm, value is a SEQUENCE OF octet string.  When sent 
      -- by an MGC the interpretation is as follows: 
      -- empty sequence means CHOOSE 
      -- one element sequence specifies value 
      -- If the sublist field is not selected, a longer sequence means 
      -- "choose one of the values" (i.e. value1 OR value2 OR ...) 
      -- If the sublist field is selected, 
      -- a sequence with more than one element encodes the value of a 
      -- list-valued property (i.e. value1 AND value2 AND ...). 
      -- The relation field may only be selected if the value sequence 
      -- has length 1.  It indicates that the MG has to choose a value 
      -- for the property. E.g. x > 3 (using the greaterThan 
      -- value for relation) instructs the MG to choose any value larger 
      -- than 3 for property x. 
      -- The range field may only be selected if the value sequence 
      -- has length 2.  It indicates that the MG has to choose a value 
      -- in the range between the first octet in the value sequence and 
      -- the trailing octet in the value sequence, including the 
      -- boundary values. 
      -- When sent by the MG, only responses to an AuditCapability request 
      -- may contain multiple values, a range, or a relation field. 
       
      PropertyParm ::= SEQUENCE 
      { 
         propertyName [0] IMPLICIT PkgdName, 
         value        [1] IMPLICIT SEQUENCE OF PropertyID, 
         extraInfo    [2] ExtraInfo OPTIONAL,
         ... 
      } 

      PropertyParms ::= SEQUENCE OF PropertyParm 
       
      Name ::= OCTET STRING(SIZE(2)) 
       
      PkgdName ::= OCTET STRING(SIZE(4)) 
      -- represents Package Name (2 octets) plus Property, Event, 
      -- Signal Names or Statistics ID. (2 octets) 
      -- To wildcard a package use 0xFFFF for first two octets, choose 
      -- is not allowed. To reference native property tag specified in 
      -- Annex C, use 0x0000 as first two octets. 
      -- To wildcard a Property, Event, Signal, or Statistics ID, use 
      -- 0xFFFF for last two octets, choose is not allowed. 
      -- Wildcarding of Package Name is permitted only if Property, 
      -- Event, Signal, or Statistics ID are 
      -- also wildcarded. 
      PropertyID ::= OCTET STRING 
       
      Relation ::= ENUMERATED 
      { 
         greaterThan(0), 
         smallerThan(1), 
         unequalTo(2), 
         ... 
      } 
       
      LocalRemoteDescriptor ::= SEQUENCE 
      { 
         propGrps [0] IMPLICIT SEQUENCE OF PropertyGroup, 
         ... 
      } 
       
      PropertyGroup ::= SEQUENCE OF PropertyParm 
       
      TerminationStateDescriptor ::= SEQUENCE  
      { 
         propertyParms        [0] IMPLICIT PropertyParms, 
         eventBufferControl   [1] IMPLICIT EventBufferControl OPTIONAL, 
         serviceState         [2] IMPLICIT ServiceState OPTIONAL, 
         ... 
      } 
       
      EventBufferControl ::= ENUMERATED 
      { 
         off(0), 
         lockStep(1), 
         ... 
      } 
       
      ServiceState ::= ENUMERATED 
      { 
         test(0), 
         outOfSvc(1), 
         inSvc(2), 
            ... 
      } 
       
      MuxDescriptor   ::= SEQUENCE 
      { 
         muxType           [0] IMPLICIT MuxType, 
         termList          [1] IMPLICIT SEQUENCE OF TerminationID, 
         nonStandardData   [2] IMPLICIT NonStandardData OPTIONAL, 
         ... 
      } 
       
      MuxType ::= ENUMERATED 
      { 
         h221(0), 
         h223(1), 
         h226(2), 
         v76(3), 
         ..., 
         nx64k(4) 
      } 
       
      StreamID ::= INTEGER(0..65535)   -- 16-bit unsigned integer 
       
      EventsDescriptor ::= SEQUENCE 
      { 
         requestID      [0] IMPLICIT RequestID OPTIONAL, 
                     -- RequestID must be present if eventList 
                     -- is non empty 
         eventList      [1] IMPLICIT RequestedEvents, 
         ... 
      } 
       
      RequestedEvent ::= SEQUENCE 
      { 
         pkgdName       [0] IMPLICIT EventName, 
         streamID       [1] IMPLICIT StreamID OPTIONAL, 
         eventAction    [2] IMPLICIT RequestedActions OPTIONAL, 
         evParList      [3] IMPLICIT EventParameters, 
         ... 
      } 

      RequestedEvents ::= SEQUENCE OF RequestedEvent

      RequestedActions ::= SEQUENCE 
      { 
         keepActive           [0] IMPLICIT BOOLEAN OPTIONAL, 
         eventDM              [1] EventDM OPTIONAL, 
         secondEvent          [2] IMPLICIT SecondEventsDescriptor OPTIONAL, 
         signalsDescriptor    [3] IMPLICIT SignalsDescriptor OPTIONAL, 
         ... 
      } 

      EventDM ::= CHOICE 
      { 
         digitMapName   [0] IMPLICIT DigitMapName, 
         digitMapValue  [1] IMPLICIT DigitMapValue 
      } 
       
      SecondEventsDescriptor ::= SEQUENCE 
      { 
         requestID         [0] IMPLICIT RequestID OPTIONAL, 
         eventList         [1] IMPLICIT SEQUENCE OF SecondRequestedEvent, 
         ... 
      } 
       
      SecondRequestedEvent ::= SEQUENCE 
      { 
         pkgdName          [0] IMPLICIT EventName, 
         streamID          [1] IMPLICIT StreamID OPTIONAL, 
         eventAction       [2] IMPLICIT SecondRequestedActions OPTIONAL, 
         evParList         [3] IMPLICIT EventParameters, 
         ... 
      } 
       
      SecondRequestedActions ::= SEQUENCE 
      { 
         keepActive           [0] IMPLICIT BOOLEAN OPTIONAL, 
         eventDM              [1] EventDM OPTIONAL, 
         signalsDescriptor    [2] IMPLICIT SignalsDescriptor OPTIONAL, 
         ... 
      } 
       
      EventBufferDescriptor ::= SEQUENCE OF EventSpec 
       
      EventSpec ::= SEQUENCE 
      { 
         eventName      [0] IMPLICIT EventName, 
         streamID       [1] IMPLICIT StreamID OPTIONAL, 
         eventParList   [2] IMPLICIT EventParameters, 
         ... 
      } 
       
       
      SignalsDescriptor ::= SEQUENCE OF SignalRequest 
       
      SignalRequest ::= CHOICE 
      { 
         signal         [0] IMPLICIT Signal, 
         seqSigList     [1] IMPLICIT SeqSigList, 
         ... 
      } 
       
      SeqSigList ::= SEQUENCE 
      { 
         id          [0] IMPLICIT INTEGER(0..65535), 
         signalList  [1] IMPLICIT SEQUENCE OF Signal 
      } 
       
      Signal ::= SEQUENCE 
      { 
         signalName        [0] IMPLICIT SignalName, 
         streamID          [1] IMPLICIT StreamID OPTIONAL, 
         sigType           [2] IMPLICIT SignalType OPTIONAL, 
         duration          [3] IMPLICIT INTEGER (0..65535) OPTIONAL, 
         notifyCompletion  [4] IMPLICIT NotifyCompletion OPTIONAL, 
         keepActive        [5] IMPLICIT BOOLEAN OPTIONAL, 
         sigParList        [6] IMPLICIT SEQUENCE OF SigParameter, 
         ... 
      } 
       
      SignalType ::= ENUMERATED 
      { 
         brief(0), 
         onOff(1), 
         timeOut(2), 
         ... 
      } 
       
      SignalName ::= OCTET STRING 
       
      NotifyCompletion ::= BIT STRING 
      { 
         onTimeOut(0), onInterruptByEvent(1), 
         onInterruptByNewSignalDescr(2), otherReason(3) 
      } 
       
      SigParameter ::= SEQUENCE 
      { 
         sigParameterName     [0] IMPLICIT SigParameterName, 
         sigParameterValue    [1] IMPLICIT SigParamValues,
      -- For use of extraInfo see the comment related to PropertyParm 
         extraInfo            [2] ExtraInfo OPTIONAL,
         ... 
      }
	
	  SigParameterName ::= Name
	  
	  SigParamValues ::= SEQUENCE OF SigParamValue
	  
	  SigParamValue ::= OCTET STRING
	  
      -- For an AuditCapReply with all events, the RequestID SHALL be ALL. 
      -- ALL is represented by 0xffffffff. 
       
      RequestID ::= INTEGER(0..4294967295)   -- 32-bit unsigned integer 
       
      ModemDescriptor ::= SEQUENCE 
      { 
         mtl               [0] IMPLICIT SEQUENCE OF ModemType,  
         mpl               [1] IMPLICIT PropertyParms, 
         nonStandardData   [2] IMPLICIT NonStandardData OPTIONAL 
      } 
       
      ModemType ::= ENUMERATED 
      { 
         v18(0), 
         v22(1), 
         v22bis(2), 
         v32(3), 
         v32bis(4), 
         v34(5), 
         v90(6), 
         v91(7), 
         synchISDN(8), 
         ... 
      } 
       
      DigitMapDescriptor ::= SEQUENCE 
      { 
         digitMapName   [0] IMPLICIT DigitMapName OPTIONAL, 
         digitMapValue  [1] IMPLICIT DigitMapValue OPTIONAL 
      } 
       
      DigitMapName ::= Name 
       
      DigitMapValue ::= SEQUENCE 
      { 
         startTimer        [0] IMPLICIT INTEGER(0..99) OPTIONAL, 
         shortTimer        [1] IMPLICIT INTEGER(0..99) OPTIONAL, 
         longTimer         [2] IMPLICIT INTEGER(0..99) OPTIONAL, 
         digitMapBody      [3] IMPLICIT IA5String, 
      -- Units are seconds for start, short and long timers, and 
      -- hundreds of milliseconds for duration timer. Thus start, 
      -- short, and long range from 1 to 99 seconds and duration 
      -- from 100 ms to 9.9 s 
         -- See A.3 for explanation of digit map syntax 
         ..., 
         durationTimer     [4] IMPLICIT INTEGER (0..99) OPTIONAL 
      } 
       
      ServiceChangeParm ::= SEQUENCE 
      { 
         serviceChangeMethod     [0] IMPLICIT ServiceChangeMethod, 
         serviceChangeAddress    [1] ServiceChangeAddress OPTIONAL, 
         serviceChangeVersion    [2] IMPLICIT INTEGER(0..99) OPTIONAL, 
         serviceChangeProfile    [3] IMPLICIT ServiceChangeProfile OPTIONAL, 
         serviceChangeReason     [4] IMPLICIT Value, 
      -- A serviceChangeReason consists of a numeric reason code 
      -- and an optional text description. 
      -- The serviceChangeReason SHALL be a string consisting of  
      -- a decimal reason code, optionally followed by a single  
      -- space character and a textual description string. 
      -- This string is first BER-encoded as an IA5String. 
      -- The result of this BER-encoding is then encoded as 
      -- an ASN.1 OCTET STRING type, "double wrapping" the  
      -- value 
      -- as was done for package elements. 
         serviceChangeDelay      [5] IMPLICIT INTEGER(0..4294967295) OPTIONAL, 
                                           -- 32-bit unsigned integer 
         serviceChangeMgcId      [6] MId OPTIONAL, 
         timeStamp               [7] IMPLICIT TimeNotation OPTIONAL, 
         nonStandardData         [8] IMPLICIT NonStandardData OPTIONAL, 
         ..., 
         serviceChangeInfo       [9] IMPLICIT AuditDescriptor OPTIONAL 
      } 

      ServiceChangeAddress ::= CHOICE 
      { 
         portNumber        [0] IMPLICIT INTEGER(0..65535),    -- TCP/UDP port number 
         ip4Address        [1] IMPLICIT IP4Address, 
         ip6Address        [2] IMPLICIT IP6Address, 
         domainName        [3] IMPLICIT DomainName, 
         deviceName        [4] IMPLICIT PathName, 
         mtpAddress        [5] IMPLICIT MtpAddress, 
         ... 
      } 
       
      ServiceChangeResParm ::= SEQUENCE 
      { 
         serviceChangeMgcId      [0] MId OPTIONAL, 
         serviceChangeAddress    [1] ServiceChangeAddress OPTIONAL, 
         serviceChangeVersion    [2] IMPLICIT INTEGER(0..99) OPTIONAL, 
         serviceChangeProfile    [3] IMPLICIT ServiceChangeProfile OPTIONAL, 
         timestamp               [4] IMPLICIT TimeNotation OPTIONAL, 
         ... 
      } 
       
      ServiceChangeMethod ::= ENUMERATED 
      { 
         failover(0), 
         forced(1), 
         graceful(2), 
         restart(3), 
         disconnected(4), 
         handOff(5), 
         ... 
      } 
       
      ServiceChangeProfile ::= SEQUENCE 
      { 
         profileName    [0] IMPLICIT IA5String(SIZE (1..67)) 
       
         -- 64 characters for name, 1 for "/", 2 for version to match ABNF 
      } 
       
      PackagesDescriptor ::= SEQUENCE OF PackagesItem 
       
      PackagesItem ::= SEQUENCE 
      { 
         packageName       [0] IMPLICIT Name, 
         packageVersion    [1] IMPLICIT INTEGER(0..99), 
         ... 
      } 
       
      StatisticsDescriptor ::= SEQUENCE OF StatisticsParameter 
       
      StatisticsParameter ::= SEQUENCE 
      { 
         statName       [0] IMPLICIT PkgdName, 
         statValue      [1] IMPLICIT Value OPTIONAL 
      } 
       
      NonStandardData ::= SEQUENCE 
      { 
         nonStandardIdentifier   [0] NonStandardIdentifier, 
         data                    [1] IMPLICIT OCTET STRING 
      } 
       
      NonStandardIdentifier ::= CHOICE 
      { 
         object            [0] IMPLICIT OBJECT IDENTIFIER, 
         h221NonStandard   [1] IMPLICIT H221NonStandard, 
         experimental      [2] IMPLICIT IA5String(SIZE(8)),  
             -- first two characters SHOULD be "X-" or "X+" 
         ... 
      } 
       
      H221NonStandard ::= SEQUENCE 
      {  t35CountryCode1      [0] IMPLICIT INTEGER(0..255), 
         t35CountryCode2      [1] IMPLICIT INTEGER(0..255),      -- country, as per T.35 
         t35Extension         [2] IMPLICIT INTEGER(0..255),      -- assigned nationally 
         manufacturerCode     [3] IMPLICIT INTEGER(0..65535), -- assigned nationally 
         ... 
      } 
       
      TimeNotation ::= SEQUENCE 
      { 
         date     [0] IMPLICIT IA5String(SIZE(8)),  -- yyyymmdd format 
         time     [1] IMPLICIT IA5String(SIZE(8))   -- hhmmssss format 
         -- per ISO 8601:1988 
      } 
       
      Value ::= SEQUENCE OF OCTET STRING 
       
      END