anchor.diff:                                  ?M5_SHARED_SUBS_NOT_SUPPORTED |
                                   ?M5_SUBSCRIPTION_IDS_NOT_SUPPORTED |
                                   ?M5_WILDCARD_SUBS_NOT_SUPPORTED],
  -          properties=#{}     :: map()
  +          properties=#{}     :: mqtt5_properties()
            }).
   -type mqtt5_suback()        :: #mqtt5_suback{}.
   
   -record(mqtt5_unsubscribe, {
             message_id        :: msg_id(),
             topics=[]         :: [topic()],
  -          properties=#{}    :: map()
  +          properties=#{}    :: mqtt5_properties()
            }).
   -type mqtt5_unsubscribe()   :: #mqtt5_unsubscribe{}.
   
  
positive.code: 
  -type msg_id()          :: undefined | 0..65535.
  
  -record(mqtt5_lwt, {
            will_properties=#{} :: map(),
            will_retain       :: flag(),
            will_qos          :: qos(),
            will_topic        :: topic(),
  
negative.code: -record(mqtt5_puback, {
            message_id        :: msg_id(),
            reason_code       :: reason_code(),
            properties=#{}    :: mqtt5_properties()
           }).
  -type mqtt5_puback()        :: #mqtt5_puback{}.
  
  -record(mqtt5_pubrec, {
            message_id        :: msg_id(),
            reason_code       :: reason_code(),
            properties=#{}    :: mqtt5_properties()
           }).
  -type mqtt5_pubrec()        :: #mqtt5_pubrec{}.
  
  -record(mqtt5_pubrel, {
            message_id        :: msg_id(),
            reason_code       :: reason_code(),
            properties=#{}    :: mqtt5_properties()
           }).
  -type mqtt5_pubrel()        :: #mqtt5_pubrel{}.
  
  -record(mqtt5_pubcomp, {
            message_id        :: msg_id(),
            reason_code       :: reason_code(),
            properties=#{}    :: mqtt5_properties()
           }).
  -type mqtt5_pubcomp()       :: #mqtt5_pubcomp{}.
  
  