public static NintexFormSerialize FromDefinition(NintexFormDefinition def, ClientContext ctx, Web web, List list)
            {
                var result = new NintexFormSerialize();

                result.listId        = list.Id.ToString("B");
                result.contentTypeId = def.ListContentTypeNameOrId;
                result.formXml       = def.FormXml;

                return(result);
            }
        public override void DeployModel(object modelHost, DefinitionBase model)
        {
            NintexFormDefinition formModel = (NintexFormDefinition)model;

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = null,
                ObjectType       = typeof(Object),
                ObjectDefinition = formModel,
                ModelHost        = modelHost
            });

            //https://help.nintex.com/en-US/sdks/sdk2013/FormSDK/Topics/SDK_NF_API_OPS__2013_WWSvcOps.htm?tocpath=Nintex%20Software%20Development%20Kit%7CNintex%20Forms%202013%20Software%20Development%20Kit%7CNintex%20Forms%20SDK%20Samples%7CMigrate%20Forms%20with%20the%20Nintex%20Forms%20API%7CInvoking%20methods%20from%20the%20REST%20API%7C_____2
            //https://help.nintex.com/en-US/sdks/sdk2013/#FormSDK/Topics/SDK_NF_API_REF_PublishFormXml.htm%3FTocPath%3DNintex%2520Software%2520Development%2520Kit%7CNintex%2520Forms%25202013%2520Software%2520Development%2520Kit%7CNintex%2520Forms%25202013%2520SDK%2520Reference%7CWeb%2520Services%2520Reference%7C_____4

            base.DeployModel(modelHost, model);

            var    listModelHost   = modelHost.WithAssertAndCast <ListModelHost>("modelHost", value => value.RequireNotNull());
            var    web             = listModelHost.HostWeb;
            var    list            = listModelHost.HostList;
            var    clientContext   = listModelHost.HostClientContext;
            string formDigestValue = clientContext.GetFormDigestDirect().DigestValue;

            var publishUrl = UrlUtility.CombineUrl(clientContext.Url, "/_vti_bin/NintexFormsServices/NfRestService.svc/PublishFormXml");

            using (var webrequestexecutor = clientContext.WebRequestExecutorFactory.CreateWebRequestExecutor(clientContext, publishUrl))
            {
                webrequestexecutor.RequestContentType = "application/json";
                webrequestexecutor.RequestContentType = "application/json; charset=utf-8";

                webrequestexecutor.RequestHeaders.Add("X-RequestDigest", formDigestValue);
                //executor.RequestHeaders.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
                //executor.RequestHeaders.Add(HttpRequestHeader.ContentEncoding, "utf-8");
                webrequestexecutor.RequestMethod = "POST";

                var serializedObject = NintexFormSerialize.FromDefinition(formModel, clientContext, web, list);


                HttpWebRequest request = webrequestexecutor.WebRequest;
                ClientRuntimeContext.SetupRequestCredential(clientContext, request);
                var FireExecutingWebRequestEventInternalMethod = typeof(ClientContext).GetMethod("FireExecutingWebRequestEventInternal",
                                                                                                 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                FireExecutingWebRequestEventInternalMethod.Invoke(clientContext, new object[] { new WebRequestEventArgs(webrequestexecutor) });

                var requestStream = webrequestexecutor.GetRequestStream();
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(NintexFormSerialize));
                ser.WriteObject(requestStream, serializedObject);
                requestStream.Close();

                var result   = "";
                var response = request.GetResponse();
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    result = sr.ReadToEnd();
                }

                //executor.Execute();
                //string result = "";

                //using (StreamReader sr = new StreamReader(executor.GetResponseStream()))
                //{
                //    result = sr.ReadToEnd();
                //}

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = result,
                    ObjectType       = typeof(string),
                    ObjectDefinition = formModel,
                    ModelHost        = modelHost
                });
            }
        }