/// <summary>
        /// DownloadAndSaveHaircutPreviewAsync implementation
        /// </summary>
        private IEnumerator DownloadAndSaveHaircutPreviewFunc(AvatarHaircutData haircutData, AsyncRequest request)
        {
            Debug.LogFormat("Downloading haircut preview...");
            var haircutPreviewRequest = connection.DownloadHaircutPreviewBytesAsync(haircutData);

            yield return(request.AwaitSubrequest(haircutPreviewRequest, 0.8f));

            if (request.IsError)
            {
                yield break;
            }

            Debug.LogFormat("Saving haircut preview to disk...");
            var saveHaircutPreviewRequest = CoreTools.SaveHaircutFileAsync(haircutPreviewRequest.Result, haircutData.identity, HaircutFile.HAIRCUT_PREVIEW);

            yield return(request.AwaitSubrequest(saveHaircutPreviewRequest, 0.9f));

            if (request.IsError)
            {
                yield break;
            }

            request.IsDone = true;
        }
        /// <summary>
        /// DownloadAndSaveHaircutMeshAsync implementation
        /// </summary>
        private IEnumerator DownloadAndSaveHaircutMeshFunc(AvatarHaircutData haircutData, AsyncRequest request)
        {
            Debug.LogFormat("Downloading haircut mesh, texture and points simultaneously...");
            var haircutMeshRequest    = connection.DownloadHaircutMeshZipAsync(haircutData);
            var haircutTextureRequest = connection.DownloadHaircutTextureBytesAsync(haircutData);

            yield return(request.AwaitSubrequests(0.8f, haircutMeshRequest, haircutTextureRequest));

            if (request.IsError)
            {
                yield break;
            }

            Debug.LogFormat("Saving haircut mesh and texture to disk...");
            var saveHaircutMeshRequest    = CoreTools.SaveHaircutFileAsync(haircutMeshRequest.Result, haircutData.identity, HaircutFile.HAIRCUT_MESH_ZIP);
            var saveHaircutTextureRequest = CoreTools.SaveHaircutFileAsync(haircutTextureRequest.Result, haircutData.identity, HaircutFile.HAIRCUT_TEXTURE);

            yield return(request.AwaitSubrequests(0.9f, saveHaircutMeshRequest, saveHaircutTextureRequest));

            if (request.IsError)
            {
                yield break;
            }

            Debug.LogFormat("Unzip haircut mesh...");
            var unzipMeshRequest = CoreTools.UnzipFileAsync(saveHaircutMeshRequest.Result);

            yield return(request.AwaitSubrequest(unzipMeshRequest, 1.0f));

            if (request.IsError)
            {
                yield break;
            }

            request.IsDone = true;
        }