public static async void Export(string str, PatchInfo info, string PatchPath, string path_NewStandAlone,
                                        string path_OldStandAlone, string path_OutputPatchFiles, string NameOfCompressionZip,
                                        Func <string, float> OnInitialize,
                                        Func <float, int, float> OnUpdate, Action <string> OnComplete)
        {
            float counter = OnInitialize("Exporting...");

            info = JsonConvert.DeserializeObject <PatchInfo>(File.ReadAllText(PatchPath + "/patch.txt"));
            string tmpPath     = "";
            string currentPath = "";
            int    total       = info.filesToAdd.Count + info.filesToReplace.Count;

            try
            {
                foreach (var item in info.filesToReplace)
                {
                    currentPath = str + item.Key.Substring(path_NewStandAlone.Length);
                    using (FileStream reader = new FileStream(item.Key, FileMode.OpenOrCreate, FileAccess.Read))
                    {
                        if (!Directory.Exists(tmpPath = Path.GetDirectoryName(currentPath)))
                        {
                            Directory.CreateDirectory(tmpPath);
                        }

                        using (FileStream writer = new FileStream(currentPath, FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            await reader.CopyToAsync(writer);
                        }
                    }
                    counter = OnUpdate(counter, total);
                }
            }
            catch (Exception ex)
            {
                UnityEngine.Debug.Log(ex.HelpLink + " " + ex.Message);
            }

            //OnComplete("Exporting");
            GenerateClientPatch(str, PatchPath, info, path_NewStandAlone, path_OldStandAlone, path_OutputPatchFiles, NameOfCompressionZip, OnInitialize, OnComplete);
        }
        private static async void GenerateClientPatch(string str, string PatchPath, PatchInfo info, string path_NewStandAlone,
                                                      string path_OldStandAlone, string path_OutputPatchFiles, string Name_ZipPatchForCompression, Func <string, float> OnUpdate = null, Action <string> OnComplete = null)
        {
            try
            {
                info = JsonConvert.DeserializeObject <PatchInfo>(File.ReadAllText(PatchPath + "/patch.txt"));
                PatchInfo clientInfo = new PatchInfo();

                foreach (KeyValuePair <string, string> item in info.filesToAdd)
                {
                    clientInfo.filesToAdd.Add(item.Key.Substring(path_NewStandAlone.Length), item.Value.Substring(path_OldStandAlone.Length));
                }

                foreach (KeyValuePair <string, string> item in info.filesToDelete)
                {
                    clientInfo.filesToDelete.Add(item.Key.Substring(path_OldStandAlone.Length), "");
                }

                foreach (KeyValuePair <string, string> item in info.filesToReplace)
                {
                    clientInfo.filesToReplace.Add(item.Key.Substring(path_NewStandAlone.Length), item.Value.Substring(path_OldStandAlone.Length));
                }

                using (StreamWriter PatchWriter = new StreamWriter(path_OutputPatchFiles + "/patch.txt"))
                {
                    await PatchWriter.WriteLineAsync(JsonConvert.SerializeObject(clientInfo));
                }
            }
            catch (Exception ex)
            {
                UnityEngine.Debug.Log(ex.Message);
            }

            // TODO: Need to track progress of Compressing Patch
            OnUpdate?.Invoke("Cant track Compression progress, just wait.");
            CompressPatchFolder(str, path_OutputPatchFiles, Name_ZipPatchForCompression);
            OnComplete?.Invoke("Done Compression");
        }