def METHOD_NAME(self, results, **kwargs):
    """Build :class:`~eodag.api.product._product.EOProduct` from provider result
    :param results: Raw provider result as single dict in list
    :type results: list
    :param kwargs: Search arguments
    :type kwargs: Union[int, str, bool, dict, list]
    :returns: list of single :class:`~eodag.api.product._product.EOProduct`
    :rtype: list
    """
    product_type = kwargs.get("productType")
    result = results[0]
    # update result with query parameters without pagination (or search-only params)
    if isinstance(self.config.pagination["next_page_query_obj"], str) and hasattr(
        self, "query_params_unpaginated"
    ):
        unpaginated_query_params = self.query_params_unpaginated
    elif isinstance(self.config.pagination["next_page_query_obj"], str):
        next_page_query_obj = orjson.loads(
            self.config.pagination["next_page_query_obj"].format()
        )
        unpaginated_query_params = {
            k: v
            for k, v in self.query_params.items()
            if (k, v) not in next_page_query_obj.items()
        }
    else:
        unpaginated_query_params = self.query_params
    result = dict(result, **unpaginated_query_params)
    # update result with search args if not None (and not auth)
    kwargs.pop("auth", None)
    result = dict(result, **{k: v for k, v in kwargs.items() if v is not None})
    # parse porperties
    parsed_properties = properties_from_json(
        result,
        self.config.metadata_mapping,
        discovery_config=getattr(self.config, "discover_metadata", {}),
    )
    if not product_type:
        product_type = parsed_properties.get("productType", None)
    # filter available mapped properties
    product_available_properties = {
        k: v
        for (k, v) in parsed_properties.items()
        if v not in (NOT_AVAILABLE, NOT_MAPPED)
    }
    # query hash, will be used to build a product id
    sorted_unpaginated_query_params = dict_items_recursive_sort(
        unpaginated_query_params
    )
    qs = geojson.dumps(sorted_unpaginated_query_params)
    query_hash = hashlib.sha1(str(qs).encode("UTF-8")).hexdigest()
    # build product id
    id_prefix = (product_type or self.provider).upper()
    product_id = "%s_%s_%s" % (
        id_prefix,
        parsed_properties["startTimeFromAscendingNode"]
        .split("T")[0]
        .replace("-", ""),
        query_hash,
    )
    product_available_properties["id"] = product_available_properties[
        "title"
    ] = product_id
    # update downloadLink
    product_available_properties["downloadLink"] += f"?{qs}"
    # parse metadata needing downloadLink
    for param, mapping in self.config.metadata_mapping.items():
        if Fields("downloadLink") in mapping:
            product_available_properties.update(
                properties_from_json(product_available_properties, {param: mapping})
            )
    # use product_type_config as default properties
    product_available_properties = dict(
        getattr(self.config, "product_type_config", {}),
        **product_available_properties,
    )
    product = EOProduct(
        provider=self.provider,
        productType=product_type,
        properties=product_available_properties,
    )
    return [
        product,
    ]