/// <summary>
        /// Checks if hierarchy is created for the variation label.
        /// Get the "Hierarchy_x0020_Is_x0020_Created" list item value
        /// </summary>
        /// <param name="context">Context for SharePoint objects and operations</param>
        /// <param name="variationLabel">Variation label</param>
        /// <returns>True, if hierarchy is created for the variation label</returns>
        private static bool CheckForHierarchyCreation(this ClientContext context, VariationLabelEntity variationLabel)
        {
            bool hierarchyIsCreated = false;

            // Get current web
            Web web = context.Web;
            context.Load(web, w => w.ServerRelativeUrl);
            context.ExecuteQueryRetry();

            // Try to get _VarLabelsListId property from web property bag
            string variationLabelsListId = web.GetPropertyBagValueString(VARIATIONLABELSLISTID, string.Empty);

            if (!string.IsNullOrEmpty(variationLabelsListId))
            {
                // Load the lists
                var lists = web.Lists;
                context.Load(lists);
                context.ExecuteQueryRetry();

                // Get the "Variation Labels" List by id
                Guid varRelationshipsListId = new Guid(variationLabelsListId);
                var variationLabelsList = lists.GetById(varRelationshipsListId);

                // Get the variationLabelsList list items
                ListItemCollection collListItems = variationLabelsList.GetItems(CamlQuery.CreateAllItemsQuery());
                context.Load(collListItems);
                context.ExecuteQueryRetry();

                // Check hierarchy is created
                ListItem varLabel = collListItems.First(x => x["Language"].ToString() == variationLabel.Language);
                variationLabel.IsCreated = hierarchyIsCreated = (bool)varLabel["Hierarchy_x0020_Is_x0020_Created"];
            }

            return hierarchyIsCreated;
        }
        /// <summary>
        /// Wait for the variation label creation
        /// </summary>
        /// <param name="context">Context for SharePoint objects and operations</param>
        /// <param name="variationLabel">Variation label</param>
        public static void WaitForVariationLabelCreation(this ClientContext context, VariationLabelEntity variationLabel)
        {
            if (variationLabel == null)
            {
                throw new ArgumentException("variationLabel");
            }

            while (!CheckForHierarchyCreation(context, variationLabel))
            {
                // Wait for 60 seconds and then try again
                System.Threading.Thread.Sleep(60000);
            }
        }
        /// <summary>
        /// Retrieve all configured variation labels
        /// </summary>
        /// <param name="context">Context for SharePoint objects and operations</param>
        /// <returns>Collection of VariationLabelEntity objects</returns>
        public static IEnumerable<VariationLabelEntity> GetVariationLabels(this ClientContext context)
        {
            var variationLabels = new List<VariationLabelEntity>();
            // Get current web
            Web web = context.Web;
            context.Load(web, w => w.ServerRelativeUrl);
            context.ExecuteQueryRetry();

            // Try to get _VarLabelsListId property from web property bag
            string variationLabelsListId = web.GetPropertyBagValueString(VARIATIONLABELSLISTID, string.Empty);

            if (!string.IsNullOrEmpty(variationLabelsListId))
            {
                // Load the lists
                var lists = web.Lists;
                context.Load(lists);
                context.ExecuteQueryRetry();

                // Get the "Variation Labels" List by id
                Guid varRelationshipsListId = new Guid(variationLabelsListId);
                var variationLabelsList = lists.GetById(varRelationshipsListId);

                // Get the variationLabelsList list items
                ListItemCollection collListItems = variationLabelsList.GetItems(CamlQuery.CreateAllItemsQuery());
                context.Load(collListItems);
                context.ExecuteQueryRetry();

                foreach (var listItem in collListItems)
                {
                    var label = new VariationLabelEntity();
                    label.Title = (string)listItem["Title"];
                    label.Description = (string)listItem["Description"];
                    label.FlagControlDisplayName = (string)listItem["Flag_x0020_Control_x0020_Display"];
                    label.Language = (string)listItem["Language"];
                    label.Locale = Convert.ToUInt32(listItem["Locale"]);
                    label.HierarchyCreationMode = (string)listItem["Hierarchy_x0020_Creation_x0020_M"];
                    label.IsSource = (bool)listItem["Is_x0020_Source"];
                    label.IsCreated = (bool)listItem["Hierarchy_x0020_Is_x0020_Created"];
                    variationLabels.Add(label);
                }
            }
            return variationLabels;
        }
        /// <summary>
        /// Creates source variation label
        /// </summary>
        /// <param name="context">Context for SharePoint objects and operations</param>
        /// <param name="sourceVariationLabel">Source variation label</param>
        public static void ProvisionSourceVariationLabel(this ClientContext context, VariationLabelEntity sourceVariationLabel)
        {
            if (sourceVariationLabel == null)
            {
                throw new ArgumentException("sourceVariationLabel");
            }

            // Compose the parameters
            List<VariationLabelEntity> sourceVariations = new List<VariationLabelEntity>();
            sourceVariations.Add(sourceVariationLabel);

            // Create source variation label
            CreateVariationLabels(context, sourceVariations);

            WaitForVariationLabelCreation(context, sourceVariationLabel);
        }