/// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void Run(AdWordsUser user)
        {
            // Get the UserListService.
            AdwordsUserListService userListService =
                (AdwordsUserListService)user.GetService(
                    AdWordsService.v201710.AdwordsUserListService);

            // Create a user list.
            CrmBasedUserList userList = new CrmBasedUserList()
            {
                name = "Customer relationship management list #" +
                       ExampleUtilities.GetRandomString(),
                description = "A list of customers that originated from email " +
                              "addresses",

                // CRM Userlist has a maximum membership lifespan of 180 days. See
                // https://support.google.com/adwords/answer/6276125 for details.
                membershipLifeSpan = 180L,
            };

            // Create operation.
            UserListOperation operation = new UserListOperation()
            {
                operand   = userList,
                @operator = Operator.ADD
            };

            try {
                // Add user list.
                UserListReturnValue result = userListService.mutate(
                    new UserListOperation[] { operation });

                Console.WriteLine("Created new user list with name = '{0}' and id = " +
                                  "'{1}'.", result.value[0].name, result.value[0].id);

                // Get user list ID.
                long userListId = result.value[0].id;

                // Prepare the emails for upload.
                List <Member> memberList = new List <Member>();

                // Hash normalized email addresses based on SHA-256 hashing algorithm.
                String[] emailHashes = new String[EMAILS.Length];
                for (int i = 0; i < EMAILS.Length; i++)
                {
                    Member member = new Member();
                    member.hashedEmail = ToSha256String(digest, ToNormalizedEmail(EMAILS[i]));

                    // Adding address info is currently available on a whitelist-only basis. This
                    // code demonstrates how to do it, but if you are not on the whitelist, you
                    // will need to remove this block for the example to run.
                    AddressInfo addressInfo = new AddressInfo();
                    addressInfo.hashedFirstName = ToSha256String(digest, FIRST_NAME);
                    addressInfo.hashedLastName  = ToSha256String(digest, LAST_NAME);
                    addressInfo.zipCode         = ZIP_CODE;
                    addressInfo.countryCode     = COUNTRY_CODE;
                    member.addressInfo          = addressInfo;

                    memberList.Add(member);
                }
                ;

                // Create operation to add members to the user list based on email
                // addresses.
                MutateMembersOperation mutateMembersOperation =
                    new MutateMembersOperation()
                {
                    operand = new MutateMembersOperand()
                    {
                        userListId  = userListId,
                        membersList = memberList.ToArray()
                    },
                    @operator = Operator.ADD
                };

                // Add members to the user list based on email addresses.
                MutateMembersReturnValue mutateMembersResult =
                    userListService.mutateMembers(
                        new MutateMembersOperation[] { mutateMembersOperation });

                // Display results.
                // Reminder: it may take several hours for the list to be populated
                // with members.
                foreach (UserList userListResult in mutateMembersResult.userLists)
                {
                    Console.WriteLine("Email addresses were added to user list with " +
                                      "name '{0}' and id '{1}'.",
                                      userListResult.name, userListResult.id);
                }
                userListService.Close();
            } catch (Exception e) {
                throw new System.ApplicationException("Failed to add user lists " +
                                                      "(a.k.a. audiences) and upload email addresses.", e);
            }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void Run(AdWordsUser user)
        {
            // Get the UserListService.
            AdwordsUserListService userListService =
                (AdwordsUserListService)user.GetService(AdWordsService.v201710.AdwordsUserListService);

            // First rule item group - users who visited the checkout page and had
            // more than one item in their shopping cart.
            StringRuleItem checkoutStringRuleItem = new StringRuleItem();

            checkoutStringRuleItem.key      = new StringKey();
            checkoutStringRuleItem.key.name = "ecomm_pagetype";
            checkoutStringRuleItem.op       = StringRuleItemStringOperator.EQUALS;
            checkoutStringRuleItem.value    = "checkout";

            RuleItem checkoutRuleItem = new RuleItem();

            checkoutRuleItem.Item = checkoutStringRuleItem;

            NumberRuleItem cartSizeNumberRuleItem = new NumberRuleItem();

            cartSizeNumberRuleItem.key      = new NumberKey();
            cartSizeNumberRuleItem.key.name = "cartsize";
            cartSizeNumberRuleItem.op       = NumberRuleItemNumberOperator.GREATER_THAN;
            cartSizeNumberRuleItem.value    = 1;

            RuleItem cartSizeRuleItem = new RuleItem();

            cartSizeRuleItem.Item = cartSizeNumberRuleItem;

            // Combine the two rule items into a RuleItemGroup so AdWords will AND
            // their rules together.
            RuleItemGroup checkoutMultipleItemGroup = new RuleItemGroup();

            checkoutMultipleItemGroup.items = new RuleItem[] { checkoutRuleItem, cartSizeRuleItem };

            // Second rule item group - users who check out within the next 3 months.
            DateRuleItem startDateDateRuleItem = new DateRuleItem();

            startDateDateRuleItem.key      = new DateKey();
            startDateDateRuleItem.key.name = "checkoutdate";
            startDateDateRuleItem.op       = DateRuleItemDateOperator.AFTER;
            startDateDateRuleItem.value    = DateTime.Now.ToString(DATE_FORMAT_STRING);
            RuleItem startDateRuleItem = new RuleItem();

            startDateRuleItem.Item = startDateDateRuleItem;

            DateRuleItem endDateDateRuleItem = new DateRuleItem();

            endDateDateRuleItem.key      = new DateKey();
            endDateDateRuleItem.key.name = "checkoutdate";
            endDateDateRuleItem.op       = DateRuleItemDateOperator.BEFORE;
            endDateDateRuleItem.value    = DateTime.Now.AddMonths(3).ToString(DATE_FORMAT_STRING);
            RuleItem endDateRuleItem = new RuleItem();

            endDateRuleItem.Item = endDateDateRuleItem;

            // Combine the date rule items into a RuleItemGroup.
            RuleItemGroup checkedOutNextThreeMonthsItemGroup = new RuleItemGroup();

            checkedOutNextThreeMonthsItemGroup.items =
                new RuleItem[] { startDateRuleItem, endDateRuleItem };

            // Combine the rule item groups into a Rule so AdWords knows how to apply the rules.
            Rule rule = new Rule();

            rule.groups = new RuleItemGroup[] { checkoutMultipleItemGroup,
                                                checkedOutNextThreeMonthsItemGroup };

            // ExpressionRuleUserLists can use either CNF Or DNF For matching. CNF means
            // 'at least one item in each rule item group must match', and DNF means 'at
            // least one entire rule item group must match'.
            // DateSpecificRuleUserList only supports DNF. You can also omit the rule
            // type altogether To Default To DNF.
            rule.ruleType = UserListRuleTypeEnumsEnum.DNF;

            // Third and fourth rule item groups.
            // Visitors of a page who visited another page. See
            // https://developers.google.com/adwords/api/docs/reference/latest/AdwordsUserListService.StringKey
            // for more details.
            StringKey urlStringKey = new StringKey()
            {
                name = "url__"
            };

            StringRuleItem site1StringRuleItem = new StringRuleItem();

            site1StringRuleItem.key   = urlStringKey;
            site1StringRuleItem.op    = StringRuleItemStringOperator.EQUALS;
            site1StringRuleItem.value = "example.com/example1";
            RuleItem site1RuleItem = new RuleItem();

            site1RuleItem.Item = site1StringRuleItem;

            StringRuleItem site2StringRuleItem = new StringRuleItem();

            site2StringRuleItem.key   = (urlStringKey);
            site2StringRuleItem.op    = (StringRuleItemStringOperator.EQUALS);
            site2StringRuleItem.value = ("example.com/example2");
            RuleItem site2RuleItem = new RuleItem();

            site2RuleItem.Item = (site2StringRuleItem);

            // Create two RuleItemGroups to show that a visitor browsed two sites.
            RuleItemGroup site1RuleItemGroup = new RuleItemGroup();

            site1RuleItemGroup.items = new RuleItem[] { site1RuleItem };
            RuleItemGroup site2RuleItemGroup = new RuleItemGroup();

            site2RuleItemGroup.items = new RuleItem[] { site2RuleItem };

            // Create two rules to show that a visitor browsed two sites.
            Rule userVisitedSite1Rule = new Rule();

            userVisitedSite1Rule.groups = new RuleItemGroup[] { site1RuleItemGroup };

            Rule userVisitedSite2Rule = new Rule();

            userVisitedSite2Rule.groups = new RuleItemGroup[] { site2RuleItemGroup };

            // Create the user list with no restrictions on site visit date.
            ExpressionRuleUserList expressionUserList = new ExpressionRuleUserList();
            String creationTimeString = DateTime.Now.ToString("yyyyMMdd_HHmmss");

            expressionUserList.name        = "Expression based user list created at " + creationTimeString;
            expressionUserList.description = "Users who checked out in three month window OR visited " +
                                             "the checkout page with more than one item in their cart.";
            expressionUserList.rule = rule;

            // Optional: Set the prepopulationStatus to REQUESTED to include past users
            // in the user list.
            expressionUserList.prepopulationStatus = RuleBasedUserListPrepopulationStatus.REQUESTED;

            // Create the user list restricted to users who visit your site within
            // the next six months.
            DateTime startDate = DateTime.Now;
            DateTime endDate   = startDate.AddMonths(6);

            DateSpecificRuleUserList dateUserList = new DateSpecificRuleUserList();

            dateUserList.name        = "Date rule user list created at " + creationTimeString;
            dateUserList.description = String.Format("Users who visited the site between {0} and " +
                                                     "{1} and checked out in three month window OR visited the checkout page " +
                                                     "with more than one item in their cart.", startDate.ToString(DATE_FORMAT_STRING),
                                                     endDate.ToString(DATE_FORMAT_STRING));
            dateUserList.rule = rule;

            // Set the start and end dates of the user list.
            dateUserList.startDate = startDate.ToString(DATE_FORMAT_STRING);
            dateUserList.endDate   = endDate.ToString(DATE_FORMAT_STRING);

            // Create the user list where "Visitors of a page who did visit another page".
            // To create a user list where "Visitors of a page who did not visit another
            // page", change the ruleOperator from AND to AND_NOT.
            CombinedRuleUserList combinedRuleUserList = new CombinedRuleUserList();

            combinedRuleUserList.name         = "Combined rule user list created at " + creationTimeString;
            combinedRuleUserList.description  = "Users who visited two sites.";
            combinedRuleUserList.leftOperand  = userVisitedSite1Rule;
            combinedRuleUserList.rightOperand = userVisitedSite2Rule;
            combinedRuleUserList.ruleOperator = CombinedRuleUserListRuleOperator.AND;

            // Create operations to add the user lists.
            List <UserListOperation> operations = new List <UserListOperation>();

            foreach (UserList userList in new UserList[] { expressionUserList, dateUserList,
                                                           combinedRuleUserList })
            {
                UserListOperation operation = new UserListOperation();
                operation.operand   = userList;
                operation.@operator = Operator.ADD;
                operations.Add(operation);
            }

            try {
                // Submit the operations.
                UserListReturnValue result = userListService.mutate(operations.ToArray());

                // Display the results.
                foreach (UserList userListResult in result.value)
                {
                    Console.WriteLine("User list added with ID {0}, name '{1}', status '{2}', " +
                                      "list type '{3}', accountUserListStatus '{4}', description '{5}'.",
                                      userListResult.id,
                                      userListResult.name,
                                      userListResult.status,
                                      userListResult.listType,
                                      userListResult.accountUserListStatus,
                                      userListResult.description);
                }
                userListService.Close();
            } catch (Exception e) {
                throw new System.ApplicationException("Failed to add rule based user lists.", e);
            }
        }