/// <summary>
        ///     End extend (async).
        /// </summary>
        /// <param name="asyncResult">async result</param>
        /// <returns>extended calendar hash chain</returns>
        public CalendarHashChain EndExtend(IAsyncResult asyncResult)
        {
            if (_extendingServiceProtocol == null)
            {
                throw new KsiServiceException("Extending service protocol is missing from service.");
            }

            KsiServiceAsyncResult serviceAsyncResult = GetKsiServiceAsyncResult(asyncResult);

            if (!serviceAsyncResult.IsCompleted)
            {
                serviceAsyncResult.AsyncWaitHandle.WaitOne();
            }

            byte[]     data    = _extendingServiceProtocol.EndExtend(serviceAsyncResult);
            PduPayload payload = ExtendRequestResponseParser.Parse(data, serviceAsyncResult.RequestId);

            if (IsLegacyPduVersion)
            {
                LegacyExtendResponsePayload legacyResponsePayload = payload as LegacyExtendResponsePayload;

                if (legacyResponsePayload == null)
                {
                    Logger.Warn("Extend request failed. Invalid response payload.{0}Payload:{0}{1}", Environment.NewLine, payload);
                    throw new KsiServiceException("Invalid extend response payload. Type: " + payload.Type);
                }

                return(legacyResponsePayload.CalendarHashChain);
            }
            else

            {
                ExtendResponsePayload responsePayload = payload as ExtendResponsePayload;

                if (responsePayload == null)
                {
                    Logger.Warn("Extend request failed. Invalid response payload.{0}Payload:{0}{1}", Environment.NewLine, payload);
                    throw new KsiServiceException("Invalid extend response payload. Type: " + payload.Type);
                }

                Logger.Debug("End extend successful (request id: {0}){1}{2}", serviceAsyncResult.RequestId, Environment.NewLine, responsePayload.CalendarHashChain);

                return(responsePayload.CalendarHashChain);
            }
        }
        /// <summary>
        /// Parse child tag
        /// </summary>
        protected override ITlvTag ParseChild(ITlvTag childTag)
        {
            switch (childTag.Type)
            {
            case Constants.ExtendResponsePayload.TagType:
                ExtendResponsePayload extendResponsePayload = childTag as ExtendResponsePayload ?? new ExtendResponsePayload(childTag);
                Payloads.Add(extendResponsePayload);
                return(extendResponsePayload);

            case Constants.ErrorPayload.TagType:
                return(ErrorPayload = childTag as ExtendErrorPayload ?? new ExtendErrorPayload(childTag));

            case Constants.ExtenderConfigResponsePayload.TagType:
                ExtenderConfigResponsePayload configResponsePayload = childTag as ExtenderConfigResponsePayload ?? new ExtenderConfigResponsePayload(childTag);
                Payloads.Add(configResponsePayload);
                return(configResponsePayload);

            default:
                return(base.ParseChild(childTag));
            }
        }