/// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void Run(AdWordsUser user)
        {
            // Get the MediaService.
              MediaService mediaService = (MediaService) user.GetService(
              AdWordsService.v201502.MediaService);

              // Create a selector.
              Selector selector = new Selector();
              selector.fields = new string[] {"MediaId", "Width", "Height", "MimeType"};

              // Set the filter.
              Predicate predicate = new Predicate();
              predicate.@operator = PredicateOperator.IN;
              predicate.field = "Type";
              predicate.values = new string[] {MediaMediaType.VIDEO.ToString(),
              MediaMediaType.IMAGE.ToString()};

              selector.predicates = new Predicate[] {predicate};

              // Set selector paging.
              selector.paging = new Paging();

              int offset = 0;
              int pageSize = 500;

              MediaPage page = new MediaPage();

              try {
            do {
              selector.paging.startIndex = offset;
              selector.paging.numberResults = pageSize;

              page = mediaService.get(selector);

              if (page != null && page.entries != null) {
            int i = offset;

            foreach (Media media in page.entries) {
              if (media is Video) {
                Video video = (Video) media;
                Console.WriteLine("{0}) Video with id \"{1}\" and name \"{2}\" was found.",
                    i, video.mediaId, video.name);
              } else if (media is Image) {
                Image image = (Image) media;
                Dictionary<MediaSize, Dimensions> dimensions =
                    CreateMediaDimensionMap(image.dimensions);
                Console.WriteLine("{0}) Image with id '{1}', dimensions '{2}x{3}', and MIME type " +
                    "'{4}' was found.", i, image.mediaId, dimensions[MediaSize.FULL].width,
                    dimensions[MediaSize.FULL].height, image.mimeType);
              }
              i++;
            }
              }
              offset += pageSize;
            } while (offset < page.totalNumEntries);
            Console.WriteLine("Number of images and videos found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to get images and videos.", e);
              }
        }
    /// <summary>
    /// Runs the code example.
    /// </summary>
    /// <param name="user">The AdWords user.</param>
    /// <param name="fileName">The file to which the report is downloaded.
    /// </param>
    public void Run(AdWordsUser user, string fileName) {
      ReportDefinition definition = new ReportDefinition();

      definition.reportName = "Last 7 days CRITERIA_PERFORMANCE_REPORT";
      definition.reportType = ReportDefinitionReportType.CRITERIA_PERFORMANCE_REPORT;
      definition.downloadFormat = DownloadFormat.GZIPPED_CSV;
      definition.dateRangeType = ReportDefinitionDateRangeType.LAST_7_DAYS;

      // Create selector.
      Selector selector = new Selector();
      selector.fields = new string[] {"CampaignId", "AdGroupId", "Id", "CriteriaType", "Criteria",
          "FinalUrls", "Clicks", "Impressions", "Cost"};

      Predicate predicate = new Predicate();
      predicate.field = "Status";
      predicate.@operator = PredicateOperator.IN;
      predicate.values = new string[] {"ENABLED", "PAUSED"};
      selector.predicates = new Predicate[] {predicate};

      definition.selector = selector;
      definition.includeZeroImpressions = true;

      string filePath = ExampleUtilities.GetHomeDir() + Path.DirectorySeparatorChar + fileName;

      try {
        ReportUtilities utilities = new ReportUtilities(user, "v201502", definition);
        using (ReportResponse response = utilities.GetResponse()) {
          response.Save(filePath);
        } 
        Console.WriteLine("Report was downloaded to '{0}'.", filePath);
      } catch (Exception ex) {
        throw new System.ApplicationException("Failed to download report.", ex);
      }
    }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void Run(AdWordsUser user)
        {
            // Get the ManagedCustomerService.
              ManagedCustomerService managedCustomerService = (ManagedCustomerService) user.GetService(
              AdWordsService.v201502.ManagedCustomerService);

              // Create selector.
              Selector selector = new Selector();
              selector.fields = new String[] {"CustomerId", "Name"};

              try {
            // Get results.
            ManagedCustomerPage page = managedCustomerService.get(selector);

            // Display serviced account graph.
            if (page.entries != null) {
              // Create map from customerId to customer node.
              Dictionary<long, ManagedCustomerTreeNode> customerIdToCustomerNode =
              new Dictionary<long, ManagedCustomerTreeNode>();

              // Create account tree nodes for each customer.
              foreach (ManagedCustomer customer in page.entries) {
            ManagedCustomerTreeNode node = new ManagedCustomerTreeNode();
            node.Account = customer;
            customerIdToCustomerNode.Add(customer.customerId, node);
              }

              // For each link, connect nodes in tree.
              if (page.links != null) {
            foreach (ManagedCustomerLink link in page.links) {
              ManagedCustomerTreeNode managerNode =
                  customerIdToCustomerNode[link.managerCustomerId];
              ManagedCustomerTreeNode childNode = customerIdToCustomerNode[link.clientCustomerId];
              childNode.ParentNode = managerNode;
              if (managerNode != null) {
                managerNode.ChildAccounts.Add(childNode);
              }
            }
              }

              // Find the root account node in the tree.
              ManagedCustomerTreeNode rootNode = null;
              foreach (ManagedCustomer account in page.entries) {
            if (customerIdToCustomerNode[account.customerId].ParentNode == null) {
              rootNode = customerIdToCustomerNode[account.customerId];
              break;
            }
              }

              // Display account tree.
              Console.WriteLine("CustomerId, Name");
              Console.WriteLine(rootNode.ToTreeString(0, new StringBuilder()));
            } else {
              Console.WriteLine("No serviced accounts were found.");
            }
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to create ad groups.", e);
              }
        }
    /// <summary>
    /// The main method.
    /// </summary>
    /// <param name="args">Command line arguments.</param>
    static void Main(string[] args) {
      AdWordsUser user = new AdWordsUser();

      // This code example shows how to run an AdWords API web application
      // while incorporating the OAuth2 installed application flow into your
      // application. If your application uses a single MCC login to make calls
      // to all your accounts, you shouldn't use this code example. Instead, you
      // should run OAuthTokenGenerator.exe to generate a refresh
      // token and use that configuration in your application's App.config.
      AdWordsAppConfig config = user.Config as AdWordsAppConfig;
      if (user.Config.OAuth2Mode == OAuth2Flow.APPLICATION &&
            string.IsNullOrEmpty(config.OAuth2RefreshToken)) {
         DoAuth2Authorization(user);
      }

      Console.Write("Enter the customer id: ");
      string customerId = Console.ReadLine();
      config.ClientCustomerId = customerId;

      // Get the CampaignService.
      CampaignService campaignService =
          (CampaignService) user.GetService(AdWordsService.v201502.CampaignService);

      // Create the selector.
      Selector selector = new Selector();
      selector.fields = new string[] {"Id", "Name", "Status"};

      // Set the selector paging.
      selector.paging = new Paging();

      int offset = 0;
      int pageSize = 500;

      CampaignPage page = new CampaignPage();

      try {
        do {
          selector.paging.startIndex = offset;
          selector.paging.numberResults = pageSize;

          // Get the campaigns.
          page = campaignService.get(selector);

          // Display the results.
          if (page != null && page.entries != null) {
            int i = offset;
            foreach (Campaign campaign in page.entries) {
              Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and status = '{3}'" +
                " was found.", i + 1, campaign.id, campaign.name, campaign.status);
              i++;
            }
          }
          offset += pageSize;
        } while (offset < page.totalNumEntries);
        Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries);
      } catch (Exception ex) {
        throw new System.ApplicationException("Failed to retrieve campaigns", ex);
      }
    }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="campaignId">Id of the campaign for which disapproved ads
        /// are retrieved.</param>
        public void Run(AdWordsUser user, long campaignId)
        {
            // Get the AdGroupAdService.
              AdGroupAdService service =
              (AdGroupAdService) user.GetService(AdWordsService.v201502.AdGroupAdService);

              // Create the selector.
              Selector selector = new Selector();
              selector.fields = new string[] {"Id", "AdGroupCreativeApprovalStatus",
              "AdGroupAdDisapprovalReasons"};

              // Create the filter.
              Predicate campaignPredicate = new Predicate();
              campaignPredicate.@operator = PredicateOperator.EQUALS;
              campaignPredicate.field = "CampaignId";
              campaignPredicate.values = new string[] {campaignId.ToString()};

              Predicate approvalPredicate = new Predicate();
              approvalPredicate.@operator = PredicateOperator.EQUALS;
              approvalPredicate.field = "AdGroupCreativeApprovalStatus";
              approvalPredicate.values = new string[] {AdGroupAdApprovalStatus.DISAPPROVED.ToString()};

              selector.predicates = new Predicate[] {campaignPredicate, approvalPredicate};

              // Set the selector paging.
              selector.paging = new Paging();

              int offset = 0;
              int pageSize = 500;

              AdGroupAdPage page = new AdGroupAdPage();

              try {
            do {
              selector.paging.startIndex = offset;
              selector.paging.numberResults = pageSize;

              // Get the disapproved ads.
              page = service.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = offset;
            foreach (AdGroupAd adGroupAd in page.entries) {
              Console.WriteLine("{0}) Ad id {1} has been disapproved for the following " +
                  "reason(s):", i, adGroupAd.ad.id);
              foreach (string reason in adGroupAd.disapprovalReasons) {
                Console.WriteLine("    {0}", reason);
              }
              i++;
            }
              }
              offset += pageSize;
            } while (offset < page.totalNumEntries);
            Console.WriteLine("Number of disapproved ads found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to get disapproved ads.", e);
              }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="labelName">ID of the label.</param>
        public void Run(AdWordsUser user, long labelId)
        {
            // Get the CampaignService.
              CampaignService campaignService =
              (CampaignService) user.GetService(AdWordsService.v201502.CampaignService);

              // Create the selector.
              Selector selector = new Selector();
              selector.fields = new string[] { "Id", "Name", "Labels" };

              // Labels filtering is performed by ID. You can use CONTAINS_ANY to
              // select campaigns with any of the label IDs, CONTAINS_ALL to select
              // campaigns with all of the label IDs, or CONTAINS_NONE to select
              // campaigns with none of the label IDs.
              Predicate predicate = new Predicate();
              predicate.@operator = PredicateOperator.CONTAINS_ANY;
              predicate.field = "Labels";
              predicate.values = new string[] { labelId.ToString() };
              selector.predicates = new Predicate[] { predicate };

              // Set the selector paging.
              selector.paging = new Paging();

              int offset = 0;
              int pageSize = 500;

              CampaignPage page = new CampaignPage();

              try {
            do {
              selector.paging.startIndex = offset;
              selector.paging.numberResults = pageSize;

              // Get the campaigns.
              page = campaignService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = offset;
            foreach (Campaign campaign in page.entries) {
              List<string> labelNames = new List<string>();
              foreach (Label label in campaign.labels) {
                labelNames.Add(label.name);
              }

              Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and labels = '{3}'" +
                  " was found.", i + 1, campaign.id, campaign.name,
                  string.Join(", ", labelNames.ToArray()));
              i++;
            }
              }
              offset += pageSize;
            } while (offset < page.totalNumEntries);
            Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to retrieve campaigns by label", e);
              }
        }
    /// <summary>
    /// Runs the code example.
    /// </summary>
    /// <param name="user">The AdWords user.</param>
    /// <param name="campaignId">Id of the campaign from which targeting
    /// criteria are retrieved.</param>
    public void Run(AdWordsUser user, long campaignId) {
      // Get the CampaignCriterionService.
      CampaignCriterionService campaignCriterionService =
          (CampaignCriterionService) user.GetService(
              AdWordsService.v201502.CampaignCriterionService);

      // Create the selector.
      Selector selector = new Selector();
      selector.fields = new string[] {"Id", "CriteriaType", "PlacementUrl"};

      // Set the filters.
      Predicate campaignPredicate = new Predicate();
      campaignPredicate.field = "CampaignId";
      campaignPredicate.@operator = PredicateOperator.EQUALS;
      campaignPredicate.values = new string[] {campaignId.ToString()};

      Predicate placementPredicate = new Predicate();
      placementPredicate.field = "CriteriaType";
      placementPredicate.@operator = PredicateOperator.EQUALS;
      placementPredicate.values = new string[] {"PLACEMENT"};

      selector.predicates = new Predicate[] {campaignPredicate, placementPredicate};

      // Set the selector paging.
      selector.paging = new Paging();

      int offset = 0;
      int pageSize = 500;

      CampaignCriterionPage page = new CampaignCriterionPage();

      try {
        do {
          selector.paging.startIndex = offset;
          selector.paging.numberResults = pageSize;

          // Get all campaign targets.
          page = campaignCriterionService.get(selector);

          // Display the results.
          if (page != null && page.entries != null) {
            int i = offset;
            foreach (CampaignCriterion campaignCriterion in page.entries) {
              Placement placement = campaignCriterion.criterion as Placement;

              Console.WriteLine("{0}) Placement with ID {1} and url {2} was found.", i,
                  placement.id, placement.url);
              i++;
            }
          }
          offset += pageSize;
        } while (offset < page.totalNumEntries);
        Console.WriteLine("Number of placements found: {0}", page.totalNumEntries);
      } catch (Exception ex) {
        throw new System.ApplicationException("Failed to get campaign targeting criteria.", ex);
      }
    }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="adGroupId">Id of the ad group to which ads are added.
        /// </param>
        public void Run(AdWordsUser user, long campaignId)
        {
            // Get the AdGroupAdService.
              AdGroupBidModifierService adGroupBidModifierService =
              (AdGroupBidModifierService) user.GetService(
              AdWordsService.v201502.AdGroupBidModifierService);

              const int PAGE_SIZE = 500;

              // Get all ad group bid modifiers for the campaign.
              Selector selector = new Selector();
              selector.fields = new String[] {"CampaignId", "AdGroupId", "BidModifier", "BidModifierSource",
            "CriteriaType", "Id"};

              Predicate predicate = new Predicate();
              predicate.field = "CampaignId";
              predicate.@operator = PredicateOperator.EQUALS;
              predicate.values = new string[] {campaignId.ToString()};
              selector.predicates = new Predicate[] {predicate};

              // Set the selector paging.
              selector.paging = new Paging();

              int offset = 0;
              int pageSize = PAGE_SIZE;

              AdGroupBidModifierPage page = new AdGroupBidModifierPage();

              try {
            do {
              selector.paging.startIndex = offset;
              selector.paging.numberResults = pageSize;

              // Get the campaigns.
              page = adGroupBidModifierService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = offset;
            foreach (AdGroupBidModifier adGroupBidModifier in page.entries) {
              string bidModifier = (adGroupBidModifier.bidModifierSpecified)?
                  adGroupBidModifier.bidModifier.ToString() : "UNSET";
              Console.WriteLine("{0}) Campaign ID {1}, AdGroup ID {2}, Criterion ID {3} has " +
                  "ad group level modifier: {4} and source = {5}.",
                  i + 1, adGroupBidModifier.campaignId,
                  adGroupBidModifier.adGroupId, adGroupBidModifier.criterion.id, bidModifier,
                  adGroupBidModifier.bidModifierSource);
              i++;
            }
              }
              offset += pageSize;
            } while (offset < page.totalNumEntries);
            Console.WriteLine("Number of adgroup bid modifiers found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to retrieve adgroup bid modifiers.", e);
              }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void Run(AdWordsUser user)
        {
            // Get the ExpressBusinessService.
              ExpressBusinessService businessService = (ExpressBusinessService)
              user.GetService(AdWordsService.v201502.ExpressBusinessService);

              Selector selector = new Selector();
              selector.fields = new String[] { "Id", "Name", "Website", "Address", "GeoPoint", "Status" };

              // To get all express businesses owned by the current customer,
              // simply skip the call to selector.setPredicates below.
              Predicate predicate = new Predicate();
              predicate.field = "Status";
              predicate.@operator = PredicateOperator.EQUALS;
              predicate.values = new string[] { "ACTIVE" };

              selector.predicates = new Predicate[] { predicate };

              // Set the selector paging.
              selector.paging = new Paging();

              int offset = 0;
              int pageSize = 500;

              ExpressBusinessPage page = null;
              try {
            do {
              selector.paging.startIndex = offset;
              selector.paging.numberResults = pageSize;

              // Get all businesses.
              page = businessService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = offset;
            foreach (ExpressBusiness business in page.entries) {
              Console.WriteLine("{0}) Express business found with name '{1}', id = {2}, " +
                  "website = {3} and status = {4}.\n", i + 1, business.name, business.id,
                  business.website, business.status);
              Console.WriteLine("Address");
              Console.WriteLine("=======");
              Console.WriteLine(FormatAddress(business.address));
              Console.WriteLine("Co-ordinates: {0}\n", FormatGeopoint(business.geoPoint));
              i++;
            }
              }
              offset += pageSize;
            } while (offset < page.totalNumEntries);
            Console.WriteLine("Number of businesses found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to retrieve express business.", e);
              }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void Run(AdWordsUser user)
        {
            // Get the ConstantDataService.
              ConstantDataService constantDataService = (ConstantDataService) user.GetService(
              AdWordsService.v201502.ConstantDataService);

              Selector selector = new Selector();
              Predicate predicate = new Predicate();
              predicate.field = "Country";
              predicate.@operator = PredicateOperator.IN;
              predicate.values = new string[] { "US" };

              try {
            ProductBiddingCategoryData[] results =
            constantDataService.getProductBiddingCategoryData(selector);

            Dictionary<long, ProductCategory> biddingCategories =
            new Dictionary<long, ProductCategory>();
            List<ProductCategory> rootCategories = new List<ProductCategory>();

            foreach (ProductBiddingCategoryData productBiddingCategory in results) {
              long id = productBiddingCategory.dimensionValue.value;
              long parentId = 0;
              string name = productBiddingCategory.displayValue[0].value;

              if (productBiddingCategory.parentDimensionValue != null) {
            parentId = productBiddingCategory.parentDimensionValue.value;
              }

              if (biddingCategories.ContainsKey(id)) {
            biddingCategories.Add(id, new ProductCategory());
              }

              ProductCategory category = biddingCategories[id];

              if (parentId != 0) {
            if (biddingCategories.ContainsKey(parentId)) {
              biddingCategories.Add(parentId, new ProductCategory());
            }
            ProductCategory parent = biddingCategories[parentId];
            parent.Children.Add(category);
              } else {
            rootCategories.Add(category);
              }

              category.Id = id;
              category.Name = name;
            }

            DisplayProductCategories(rootCategories, "");
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to set shopping product category.", e);
              }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="productServiceSuggestion">The product/service suggestion.
        /// </param>
        /// <param name="localeText">The locale text.</param>
        public void Run(AdWordsUser user, string productServiceSuggestion, string localeText)
        {
            // Get the service, which loads the required classes.
              ProductServiceService productServiceService = (ProductServiceService) user.GetService(
              AdWordsService.v201502.ProductServiceService);

              // Create selector.
              Selector selector = new Selector();
              selector.fields = new string[] {"ProductServiceText"};

              // Create predicates.
              Predicate textPredicate = new Predicate();
              textPredicate.field = "ProductServiceText";
              textPredicate.@operator = PredicateOperator.EQUALS;
              textPredicate.values = new string[] {productServiceSuggestion};

              Predicate localePredicate = new Predicate();
              localePredicate.field = "Locale";
              localePredicate.@operator = PredicateOperator.EQUALS;
              localePredicate.values = new string[]{localeText};

              selector.predicates = new Predicate[] {textPredicate, localePredicate};

              // Set the selector paging.
              selector.paging = new Paging();

              int offset = 0;
              int pageSize = 500;

              ProductServicePage page = null;
              try {
            do {
              selector.paging.startIndex = offset;
              selector.paging.numberResults = pageSize;

              // Make the get request.
              page = productServiceService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = offset;
            foreach (ProductService productService in page.entries) {
              Console.WriteLine("Product/service with text '{0}' found", productService.text);
              i++;
            }
              }
              offset += pageSize;
            } while (offset < page.totalNumEntries);
            Console.WriteLine("Number of products/services found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to retrieve products/services.", e);
              }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="campaignId">Id of the campaign from which targeting
        /// criteria are retrieved.</param>
        public void Run(AdWordsUser user, long campaignId)
        {
            // Get the CampaignCriterionService.
              CampaignCriterionService campaignCriterionService =
              (CampaignCriterionService) user.GetService(
              AdWordsService.v201502.CampaignCriterionService);

              // Create the selector.
              Selector selector = new Selector();
              selector.fields = new string[] {"Id", "CriteriaType", "CampaignId"};

              // Set the filters.
              Predicate predicate = new Predicate();
              predicate.field = "CampaignId";
              predicate.@operator = PredicateOperator.EQUALS;
              predicate.values = new string[] {campaignId.ToString()};

              selector.predicates = new Predicate[] {predicate};

              // Set the selector paging.
              selector.paging = new Paging();

              int offset = 0;
              int pageSize = 500;

              CampaignCriterionPage page = new CampaignCriterionPage();

              try {
            do {
              selector.paging.startIndex = offset;
              selector.paging.numberResults = pageSize;

              // Get all campaign targets.
              page = campaignCriterionService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = offset;
            foreach (CampaignCriterion campaignCriterion in page.entries) {
              string negative = (campaignCriterion is NegativeCampaignCriterion) ? "Negative " : "";
              Console.WriteLine("{0}) {1}Campaign criterion with id = '{2}' and Type = {3} was " +
                  " found for campaign id '{4}'", i, negative, campaignCriterion.criterion.id,
                  campaignCriterion.criterion.type, campaignCriterion.campaignId);
              i++;
            }
              }
              offset += pageSize;
            } while (offset < page.totalNumEntries);
            Console.WriteLine("Number of campaign targeting criteria found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to get campaign targeting criteria.", e);
              }
        }
    /// <summary>
    /// Runs the code example.
    /// </summary>
    /// <param name="user">The AdWords user.</param>
    public void Run(AdWordsUser user) {
      // Get the LocationCriterionService.
      LocationCriterionService locationCriterionService =
          (LocationCriterionService) user.GetService(AdWordsService.v201502.
              LocationCriterionService);

      string[] locationNames = new string[] {"Paris", "Quebec", "Spain", "Deutschland"};

      Selector selector = new Selector();
      selector.fields = new string[] {"Id", "LocationName", "CanonicalName", "DisplayType",
          "ParentLocations", "Reach", "TargetingStatus"};

      // Location names must match exactly, only EQUALS and IN are supported.
      Predicate predicate1 = new Predicate();
      predicate1.field = "LocationName";
      predicate1.@operator = PredicateOperator.IN;
      predicate1.values = locationNames;

      // Set the locale of the returned location names.
      Predicate predicate2 = new Predicate();
      predicate2.field = "Locale";
      predicate2.@operator = PredicateOperator.EQUALS;
      predicate2.values = new string[] {"en"};

      selector.predicates = new Predicate[] {predicate1, predicate2};

      try {
        // Make the get request.
        LocationCriterion[] locationCriteria = locationCriterionService.get(selector);

        // Display the resulting location criteria.
        foreach (LocationCriterion locationCriterion in locationCriteria) {
          string parentLocations = "";
          if (locationCriterion.location != null &&
              locationCriterion.location.parentLocations != null) {
            foreach (Location location in locationCriterion.location.parentLocations) {
              parentLocations += GetLocationString(location) + ", ";
            }
            parentLocations.TrimEnd(',', ' ');
          } else {
            parentLocations = "N/A";
          }
          Console.WriteLine("The search term '{0}' returned the location '{1}' of type '{2}' " +
              "with parent locations '{3}',  reach '{4}' and targeting status '{5}.",
              locationCriterion.searchTerm, locationCriterion.location.locationName,
              locationCriterion.location.displayType, parentLocations, locationCriterion.reach,
              locationCriterion.location.targetingStatus);
        }
      } catch (Exception ex) {
        throw new System.ApplicationException("Failed to get location criteria.", ex);
      }
    }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="campaignId">Id of the campaign for which ad groups are
        /// retrieved.</param>
        public void Run(AdWordsUser user, long campaignId)
        {
            // Get the AdGroupService.
              AdGroupService adGroupService =
              (AdGroupService) user.GetService(AdWordsService.v201502.AdGroupService);

              // Create the selector.
              Selector selector = new Selector();
              selector.fields = new string[] {"Id", "Name"};

              // Create the filters.
              Predicate predicate = new Predicate();
              predicate.field = "CampaignId";
              predicate.@operator = PredicateOperator.EQUALS;
              predicate.values = new string[] {campaignId.ToString()};
              selector.predicates = new Predicate[] {predicate};

              // Set the selector paging.
              selector.paging = new Paging();

              int offset = 0;
              int pageSize = 500;

              AdGroupPage page = new AdGroupPage();

              try {
            do {
              selector.paging.startIndex = offset;
              selector.paging.numberResults = pageSize;

              // Get the ad groups.
              page = adGroupService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = offset;
            foreach (AdGroup adGroup in page.entries) {
              Console.WriteLine("{0}) Ad group name is '{1}' and id is {2}.", i + 1, adGroup.name,
                  adGroup.id);
              i++;
            }
              }
              offset += pageSize;
            } while (offset < page.totalNumEntries);
            Console.WriteLine("Number of ad groups found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to retrieve ad groups.", e);
              }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="businessId">The AdWords Express business id.</param>
        public void Run(AdWordsUser user, long businessId)
        {
            // Get the PromotionService.
              PromotionService promotionService = (PromotionService)
              user.GetService(AdWordsService.v201502.PromotionService);

              // Set the business ID to the service.
              promotionService.RequestHeader.expressBusinessId = businessId;

              Selector selector = new Selector();
              selector.fields = new String[] {"PromotionId", "Name", "Status", "DestinationUrl",
              "StreetAddressVisible", "CallTrackingEnabled", "ContentNetworkOptedOut", "Budget",
              "PromotionCriteria", "RemainingBudget", "Creatives", "CampaignIds" };

              // Set the selector paging.
              selector.paging = new Paging();

              int offset = 0;
              int pageSize = 500;

              PromotionPage page = null;
              try {
            do {
              selector.paging.startIndex = offset;
              selector.paging.numberResults = pageSize;

              // Get all promotions for the  business.
              page = promotionService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = offset;
            foreach (Promotion promotion in page.entries) {
              // Summary.
              Console.WriteLine("0) Express promotion with name = {1} and id = {2} was found.",
                  i + 1, promotion.id, promotion.name);
              i++;
            }
              }
              offset += pageSize;
            } while (offset < page.totalNumEntries);
            Console.WriteLine("Number of promotions found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to retrieve promotions.", e);
              }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void Run(AdWordsUser user)
        {
            // Get the CampaignService.
              CampaignService campaignService =
              (CampaignService) user.GetService(AdWordsService.v201502.CampaignService);

              // Create the selector.
              Selector selector = new Selector();
              selector.fields = new string[] {"Id", "Name", "Status"};

              // Set the selector paging.
              selector.paging = new Paging();

              int offset = 0;
              int pageSize = 500;

              CampaignPage page = new CampaignPage();

              try {
            do {
              selector.paging.startIndex = offset;
              selector.paging.numberResults = pageSize;

              // Get the campaigns.
              page = campaignService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = offset;
            foreach (Campaign campaign in page.entries) {
              Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and status = '{3}'" +
                " was found.", i + 1, campaign.id, campaign.name, campaign.status);
              i++;
            }
              }
              offset += pageSize;
            } while (offset < page.totalNumEntries);
            Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to retrieve campaigns", e);
              }
        }
        /// <summary>
        /// Runs the specified user.
        /// </summary>
        /// <param name="user">The user.</param>
        /// <param name="adGroupId">Id of the ad group for which bid simulations are
        /// retrieved.</param>
        public void Run(AdWordsUser user, long adGroupId)
        {
            // Get the DataService.
              DataService dataService = (DataService) user.GetService(AdWordsService.v201502.DataService);

              // Create the selector.
              Selector selector = new Selector();
              selector.fields = new string[] {"AdGroupId", "LandscapeType", "LandscapeCurrent", "StartDate",
              "EndDate", "Bid", "LocalClicks", "LocalCost", "LocalImpressions"};

              // Set the filters.
              Predicate adGroupPredicate = new Predicate();
              adGroupPredicate.field = "AdGroupId";
              adGroupPredicate.@operator = PredicateOperator.IN;
              adGroupPredicate.values = new string[] {adGroupId.ToString()};

              selector.predicates = new Predicate[] {adGroupPredicate};

              try {
            // Get bid landscape for ad group.
            AdGroupBidLandscapePage page = dataService.getAdGroupBidLandscape(selector);
            if (page != null && page.entries != null && page.entries.Length > 0) {
              foreach (AdGroupBidLandscape bidLandscape in page.entries) {
            Console.WriteLine("Found ad group bid landscape with ad group id '{0}', type '{1}', " +
                "current: '{2}', start date '{3}', end date '{4}', and landscape points",
                bidLandscape.adGroupId, bidLandscape.type, bidLandscape.landscapeCurrent,
                bidLandscape.startDate, bidLandscape.endDate);
            foreach (BidLandscapeLandscapePoint point in bidLandscape.landscapePoints) {
              Console.WriteLine("- bid: {0} => clicks: {1}, cost: {2}, impressions: {3}",
                  point.bid.microAmount, point.bid.microAmount,
                  point.clicks, point.cost.microAmount, point.impressions);
            }
              }
            } else {
              Console.WriteLine("No ad group bid landscapes were found.");
            }
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to get ad group bid landscapes.", e);
              }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void Run(AdWordsUser user)
        {
            // Get the CampaignService.
              CampaignService campaignService =
              (CampaignService) user.GetService(AdWordsService.v201502.CampaignService);

              // Create the selector.
              Selector selector = new Selector() {
            fields = new string[] {
              Campaign.Fields.Id, Campaign.Fields.Name, Campaign.Fields.Status
            },
            paging = Paging.Default
              };

              CampaignPage page = new CampaignPage();

              try {
            do {
              // Get the campaigns.
              page = campaignService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = selector.paging.startIndex;
            foreach (Campaign campaign in page.entries) {
              Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and status = '{3}'" +
                " was found.", i + 1, campaign.id, campaign.name, campaign.status);
              i++;
            }
              }
              selector.paging.IncreaseOffset();
            } while (selector.paging.startIndex < page.totalNumEntries);
            Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to retrieve campaigns", e);
              }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="campaignId">Id of the campaign from which targeting
        /// criteria are retrieved.</param>
        public void Run(AdWordsUser user, long campaignId)
        {
            // Get the CampaignCriterionService.
              CampaignCriterionService campaignCriterionService =
              (CampaignCriterionService) user.GetService(
              AdWordsService.v201502.CampaignCriterionService);

              Selector selector = new Selector() {
            fields = new string[] {
              CampaignCriterion.Fields.CampaignId, Criterion.Fields.Id,
              Criterion.Fields.CriteriaType, Placement.Fields.PlacementUrl
            },
            predicates = new Predicate[] {
              Predicate.Equals(CampaignCriterion.Fields.CampaignId, campaignId.ToString()),
              Predicate.Equals(Criterion.Fields.CriteriaType, "PLACEMENT")
            },
            paging = Paging.Default
              };

              CampaignCriterionPage page = new CampaignCriterionPage();

              try {
            do {
              // Get all campaign targets.
              page = campaignCriterionService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = selector.paging.startIndex;
            foreach (CampaignCriterion campaignCriterion in page.entries) {
              Placement placement = campaignCriterion.criterion as Placement;

              Console.WriteLine("{0}) Placement with ID {1} and url {2} was found.", i + 1,
                  placement.id, placement.url);
              i++;
            }
              }
              selector.paging.IncreaseOffset();
            } while (selector.paging.startIndex < page.totalNumEntries);
            Console.WriteLine("Number of placements found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to get campaign targeting criteria.", e);
              }
        }
        /// <summary>
        /// Gets the ad group ad by ID.
        /// </summary>
        /// <param name="adGroupAdService">The AdGroupAdService instance.</param>
        /// <param name="adGroupId">ID of the ad group.</param>
        /// <param name="adId">ID of the ad to be retrieved.</param>
        /// <returns>The AdGroupAd if the item could be retrieved, null otherwise.
        /// </returns>
        private AdGroupAd GetAdGroupAd(AdGroupAdService adGroupAdService, long adGroupId, long adId)
        {
            // Create a selector.
              Selector selector = new Selector() {
            fields = new string[] { Ad.Fields.Id, Ad.Fields.Url },
            predicates = new Predicate[] {
              // Restrict the fetch to only the selected ad group ID and ad ID.
              Predicate.Equals(AdGroupAd.Fields.AdGroupId, adGroupId),
              Predicate.Equals(Ad.Fields.Id, adId)
            }
              };

              // Get the ad.
              AdGroupAdPage page = adGroupAdService.get(selector);

              if (page != null && page.entries != null && page.entries.Length > 0) {
            return page.entries[0];
              } else {
            return null;
              }
        }
        /// <summary>
        /// Runs the specified user.
        /// </summary>
        /// <param name="user">The user.</param>
        /// <param name="adGroupId">Id of the ad group for which bid simulations are
        /// retrieved.</param>
        public void Run(AdWordsUser user, long adGroupId)
        {
            // Get the DataService.
              DataService dataService = (DataService) user.GetService(AdWordsService.v201502.DataService);

              // Create the selector.
              Selector selector = new Selector() {
            fields = new string[] {
              AdGroupBidLandscape.Fields.AdGroupId, AdGroupBidLandscape.Fields.LandscapeType,
              AdGroupBidLandscape.Fields.LandscapeCurrent, AdGroupBidLandscape.Fields.StartDate,
              AdGroupBidLandscape.Fields.EndDate, BidLandscapeLandscapePoint.Fields.Bid,
              BidLandscapeLandscapePoint.Fields.LocalClicks,
              BidLandscapeLandscapePoint.Fields.LocalCost,
              BidLandscapeLandscapePoint.Fields.LocalImpressions
            },
            predicates = new Predicate[] {
              Predicate.Equals(AdGroupBidLandscape.Fields.AdGroupId, adGroupId)
            }
              };

              try {
            // Get bid landscape for ad group.
            AdGroupBidLandscapePage page = dataService.getAdGroupBidLandscape(selector);
            if (page != null && page.entries != null && page.entries.Length > 0) {
              foreach (AdGroupBidLandscape bidLandscape in page.entries) {
            Console.WriteLine("Found ad group bid landscape with ad group id '{0}', type '{1}', " +
                "current: '{2}', start date '{3}', end date '{4}', and landscape points",
                bidLandscape.adGroupId, bidLandscape.type, bidLandscape.landscapeCurrent,
                bidLandscape.startDate, bidLandscape.endDate);
            foreach (BidLandscapeLandscapePoint point in bidLandscape.landscapePoints) {
              Console.WriteLine("- bid: {0} => clicks: {1}, cost: {2}, impressions: {3}",
                  point.bid.microAmount, point.bid.microAmount,
                  point.clicks, point.cost.microAmount, point.impressions);
            }
              }
            } else {
              Console.WriteLine("No ad group bid landscapes were found.");
            }
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to get ad group bid landscapes.", e);
              }
        }
 /// <summary>
 /// Mocked version of CampaignService::get
 /// </summary>
 /// <param name="serviceSelector">The service selector.</param>
 /// <returns>null</returns>
 public override CampaignPage get(Selector serviceSelector) {
   getCalled = true;
   return null;
 }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void Run(AdWordsUser user)
        {
            // Get the AdGroupCriterionService.
              AdGroupCriterionService adGroupCriterionService =
              (AdGroupCriterionService) user.GetService(
              AdWordsService.v201502.AdGroupCriterionService);

              // Create a selector.
              Selector selector = new Selector() {
            fields = new string[] {
              Criterion.Fields.Id, AdGroupCriterion.Fields.AdGroupId, Placement.Fields.PlacementUrl
            },
            predicates = new Predicate[] {
              // Select only placements.
              Predicate.Equals(Criterion.Fields.CriteriaType, "PLACEMENT")
            },
            paging = Paging.Default
              };

              AdGroupCriterionPage page = new AdGroupCriterionPage();

              try {
            do {
              // Get the keywords.
              page = adGroupCriterionService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = selector.paging.startIndex;

            foreach (AdGroupCriterion adGroupCriterion in page.entries) {
              bool isNegative = (adGroupCriterion is NegativeAdGroupCriterion);

              // If you are retrieving multiple type of criteria, then you may
              // need to check for
              //
              // if (adGroupCriterion is Placement) { ... }
              //
              // to identify the criterion type.
              Placement placement = (Placement) adGroupCriterion.criterion;
              if (isNegative) {
                Console.WriteLine("{0}) Negative placement with ad group ID = '{1}', placement " +
                    "ID = '{2}', and url = '{3}' was found.", i + 1, adGroupCriterion.adGroupId,
                    placement.id, placement.url);
              } else {
                Console.WriteLine("{0}) Placement with ad group ID = '{1}', placement ID = " +
                    "'{2}' and url = '{3}' was found.", i + 1, adGroupCriterion.adGroupId,
                    placement.id, placement.url);
              }
              i++;
            }
              }
              selector.paging.IncreaseOffset();
            } while (selector.paging.startIndex < page.totalNumEntries);
            Console.WriteLine("Number of placements found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to retrieve placements.", e);
              }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="adGroupId">ID of the ad group from which keywords are
        /// retrieved.</param>
        public void Run(AdWordsUser user, long adGroupId)
        {
            // Get the AdGroupCriterionService.
              AdGroupCriterionService adGroupCriterionService =
              (AdGroupCriterionService) user.GetService(
              AdWordsService.v201502.AdGroupCriterionService);

              // Create a selector.
              Selector selector = new Selector() {
            fields = new string[] {
              Keyword.Fields.Id, Keyword.Fields.KeywordMatchType,
              Keyword.Fields.KeywordText, Keyword.Fields.CriteriaType
            },
            predicates = new Predicate[] {
              // Select only keywords.
              Predicate.In(Keyword.Fields.CriteriaType, new string[] {"KEYWORD"}),

              // Restrict search to an ad group.
              Predicate.Equals(AdGroupCriterion.Fields.AdGroupId, adGroupId),
            },
            paging = Paging.Default
              };

              AdGroupCriterionPage page = new AdGroupCriterionPage();

              try {
            do {
              // Get the keywords.
              page = adGroupCriterionService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = selector.paging.startIndex;

            foreach (AdGroupCriterion adGroupCriterion in page.entries) {
              bool isNegative = (adGroupCriterion is NegativeAdGroupCriterion);

              // If you are retrieving multiple type of criteria, then you may
              // need to check for
              //
              // if (adGroupCriterion is Keyword) { ... }
              //
              // to identify the criterion type.
              Keyword keyword = (Keyword) adGroupCriterion.criterion;
              string keywordType = isNegative ? "Negative keyword" : "Keyword";

              Console.WriteLine("{0}) {1} with text = '{2}', matchtype = '{3}', ID = '{4}' and " +
                  "criteria type = '{5}' was found.", i + 1, keywordType, keyword.text,
                  keyword.matchType, keyword.id, keyword.CriterionType);
              i++;
            }
              }
              selector.paging.IncreaseOffset();
            } while (selector.paging.startIndex < page.totalNumEntries);
            Console.WriteLine("Number of keywords found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to retrieve keywords.", e);
              }
        }
    public void TestGetAllCampaignsMockOnly() {
      ServiceSignature mockSignature = MockUtilities.RegisterMockService(user,
          AdWordsService.v201502.CampaignService, typeof(MockCampaignService));

      CampaignService campaignService = (CampaignService) user.GetService(mockSignature);
      Assert.That(campaignService is MockCampaignService);

      // Create a selector.
      Selector selector = new Selector();
      selector.fields = new string[] { "Id", "Name", "Status" };

      CampaignPage page = null;

      Assert.DoesNotThrow(delegate() {
        page = campaignService.get(selector);
      });

      Assert.IsNull(page);
      Assert.True((campaignService as MockCampaignService).GetCalled);
    }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="adGroupId">ID of the ad group from which keywords are
        /// retrieved.</param>
        public void Run(AdWordsUser user, long adGroupId)
        {
            // Get the AdGroupCriterionService.
              AdGroupCriterionService adGroupCriterionService =
              (AdGroupCriterionService) user.GetService(
              AdWordsService.v201502.AdGroupCriterionService);

              // Create a selector.
              Selector selector = new Selector();
              selector.fields = new string[] { "Id", "KeywordMatchType", "KeywordText", "CriteriaType" };

              // Select only keywords.
              Predicate criteriaPredicate = new Predicate();
              criteriaPredicate.field = "CriteriaType";
              criteriaPredicate.@operator = PredicateOperator.IN;
              criteriaPredicate.values = new string[] {"KEYWORD"};

              // Restrict search to an ad group.
              Predicate adGroupPredicate = new Predicate();
              adGroupPredicate.field = "AdGroupId";
              adGroupPredicate.@operator = PredicateOperator.EQUALS;
              adGroupPredicate.values = new string[] { adGroupId.ToString() };

              selector.predicates = new Predicate[] {adGroupPredicate, criteriaPredicate};

              // Set the selector paging.
              selector.paging = new Paging();

              int offset = 0;
              int pageSize = 500;

              AdGroupCriterionPage page = new AdGroupCriterionPage();

              try {
            do {
              selector.paging.startIndex = offset;
              selector.paging.numberResults = pageSize;

              // Get the keywords.
              page = adGroupCriterionService.get(selector);

              // Display the results.
              if (page != null && page.entries != null) {
            int i = offset;

            foreach (AdGroupCriterion adGroupCriterion in page.entries) {
              bool isNegative = (adGroupCriterion is NegativeAdGroupCriterion);

              // If you are retrieving multiple type of criteria, then you may
              // need to check for
              //
              // if (adGroupCriterion is Keyword) { ... }
              //
              // to identify the criterion type.
              Keyword keyword = (Keyword) adGroupCriterion.criterion;
              string keywordType = isNegative ? "Negative keyword" : "Keyword";

              Console.WriteLine("{0}) {1} with text = '{2}', matchtype = '{3}', ID = '{4}' and " +
                  "criteria type = '{5}' was found.", i + 1, keywordType, keyword.text,
                  keyword.matchType, keyword.id, keyword.CriterionType);
              i++;
            }
              }
              offset += pageSize;
            } while (offset < page.totalNumEntries);
            Console.WriteLine("Number of keywords found: {0}", page.totalNumEntries);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to retrieve keywords.", e);
              }
        }
    /// <summary>
    /// Gets the ad group ad by ID.
    /// </summary>
    /// <param name="adGroupAdService">The AdGroupAdService instance.</param>
    /// <param name="adGroupId">ID of the ad group.</param>
    /// <param name="adId">ID of the ad to be retrieved.</param>
    /// <returns>The AdGroupAd if the item could be retrieved, null otherwise.
    /// </returns>
    private AdGroupAd GetAdGroupAd(AdGroupAdService adGroupAdService, long adGroupId, long adId) {
      // Create a selector.
      Selector selector = new Selector();
      selector.fields = new string[] { "Id", "Url" };

      // Restrict the fetch to only the selected ad group ID and ad ID.
      Predicate adGroupPredicate = new Predicate();
      adGroupPredicate.field = "AdGroupId";
      adGroupPredicate.@operator = PredicateOperator.EQUALS;
      adGroupPredicate.values = new string[] { adGroupId.ToString() };

      Predicate adPredicate = new Predicate();
      adPredicate.field = "Id";
      adPredicate.@operator = PredicateOperator.EQUALS;
      adPredicate.values = new string[] { adId.ToString() };

      selector.predicates = new Predicate[] { adGroupPredicate, adPredicate };

      // Get the ad.
      AdGroupAdPage page = adGroupAdService.get(selector);

      if (page != null && page.entries != null && page.entries.Length > 0) {
        return page.entries[0];
      } else {
        return null;
      }
    }
        /// <summary>
        /// Gets all campaign ids in the account.
        /// </summary>
        /// <param name="user">The user for which campaigns are retrieved.</param>
        /// <returns>The list of campaign ids.</returns>
        private long[] GetAllCampaignIds(AdWordsUser user)
        {
            // Get the CampaignService.
              CampaignService campaignService =
              (CampaignService) user.GetService(AdWordsService.v201502.CampaignService);

              List<long> allCampaigns = new List<long>();

              // Create the selector.
              Selector selector = new Selector() {
            fields = new string[] { Campaign.Fields.Id }
              };

              // Get all campaigns.
              CampaignPage page = campaignService.get(selector);

              // Return the results.
              if (page != null && page.entries != null) {
            foreach (Campaign campaign in page.entries) {
              allCampaigns.Add(campaign.id);
            }
              }
              return allCampaigns.ToArray();
        }
    /// <summary>
    /// Gets the shared set IDs associated with a campaign.
    /// </summary>
    /// <param name="user">The user that owns the campaign.</param>
    /// <param name="campaignId">The campaign identifier.</param>
    /// <returns>The list of shared set IDs associated with the campaign.</returns>
    private List<string> GetSharedSetIds(AdWordsUser user, long campaignId) {
      CampaignSharedSetService campaignSharedSetService =
          (CampaignSharedSetService) user.GetService(
              AdWordsService.v201502.CampaignSharedSetService);

      Selector selector = new Selector() {
        fields = new string[] { "SharedSetId", "CampaignId", "SharedSetName", "SharedSetType" },
        predicates = new Predicate[] {
          new Predicate() {
            field = "CampaignId",
            @operator = PredicateOperator.EQUALS,
            values = new string[] {campaignId.ToString()}
          },
          new Predicate() {
            field = "SharedSetType",
            @operator = PredicateOperator.IN,
            values = new string[] {SharedSetType.NEGATIVE_KEYWORDS.ToString()}
          }
        }
      };

      List<string> sharedSetIds = new List<string>();

      int offset = 0;
      int pageSize = 500;

      CampaignSharedSetPage page = new CampaignSharedSetPage();

      try {
        do {
          selector.paging.startIndex = offset;
          selector.paging.numberResults = pageSize;

          // Get the campaigns.
          page = campaignSharedSetService.get(selector);

          // Display the results.
          if (page != null && page.entries != null) {
            int i = offset;
            foreach (CampaignSharedSet campaignSharedSet in page.entries) {
              sharedSetIds.Add(campaignSharedSet.sharedSetId.ToString());
              Console.WriteLine("Campaign shared set ID {0} and name '{1}' found for campaign " +
                  "ID {2}.\n", campaignSharedSet.sharedSetId, campaignSharedSet.sharedSetName,
                  campaignSharedSet.campaignId);
            }
          }
          offset += pageSize;
        } while (offset < page.totalNumEntries);
        return sharedSetIds;
      } catch (Exception e) {
        throw new Exception("Failed to get shared set ids for campaign.", e);
      }
    }
    /// <summary>
    /// Gets the shared criteria in a shared set.
    /// </summary>
    /// <param name="user">The user that owns the shared set.</param>
    /// <param name="sharedSetIds">The shared criteria IDs.</param>
    /// <returns>The list of shared criteria.</returns>
    private List<SharedCriterion> GetSharedCriteria(AdWordsUser user,
        List<string> sharedSetIds) {
      SharedCriterionService sharedCriterionService =
          (SharedCriterionService) user.GetService(AdWordsService.v201502.SharedCriterionService);

      Selector selector = new Selector() {
        fields = new string[] { "SharedSetId", "Id", "KeywordText", "KeywordMatchType",
            "PlacementUrl" },
        predicates = new Predicate[] {
          new Predicate() {
            field = "SharedSetId",
            @operator = PredicateOperator.IN,
            values = sharedSetIds.ToArray()
          }
        }
      };

      List<SharedCriterion> sharedCriteria = new List<SharedCriterion>();

      int offset = 0;
      int pageSize = 500;

      SharedCriterionPage page = new SharedCriterionPage();

      try {
        do {
          selector.paging.startIndex = offset;
          selector.paging.numberResults = pageSize;

          // Get the campaigns.
          page = sharedCriterionService.get(selector);

          // Display the results.
          if (page != null && page.entries != null) {
            int i = offset;
            foreach (SharedCriterion sharedCriterion in page.entries) {
              switch (sharedCriterion.criterion.type) {
                case CriterionType.KEYWORD:
                  Keyword keyword = (Keyword) sharedCriterion.criterion;
                  Console.WriteLine("Shared negative keyword with ID {0} and text '{1}' was " +
                      "found.", keyword.id, keyword.text);
                  break;

                case CriterionType.PLACEMENT:
                  Placement placement = (Placement) sharedCriterion.criterion;
                  Console.WriteLine("Shared negative placement with ID {0} and URL '{1}' " +
                      "was found.", placement.id, placement.url);
                  break;

                default:
                  Console.WriteLine("Shared criteria with ID {0} was found.",
                      sharedCriterion.criterion.id);
                  break;
              }

              sharedCriteria.Add(sharedCriterion);
            }
          }
          offset += pageSize;
        } while (offset < page.totalNumEntries);

        return sharedCriteria;
      } catch (Exception e) {
        throw new Exception("Failed to get shared criteria.", e);
      }
    }