In an HTTP request, the Accept-Language header describes the list of languages that the requester would like content to be returned in. This header is a comma-separated list of language tags, each optionally followed by a quality factor (q=value) indicating preference weight. For example, "en-US, fr-CA;q=0.8, ;q=0.5" means the client prefers American English most, then Canadian French, and finally any other language with lower priority. Your task is to write a function that receives two arguments: a string representing the Accept-Language header value and a list (or set) of language tags that the server supports. The function must return the supported languages that match the client’s preferences, ordered by the client’s preference (highest q-value first). Matching rules: an exact tag match is best; if none, a prefix match (e.g., "fr" matches "fr-FR") is acceptable; the special "" wildcard matches any remaining unsupported languages with its given q-value. If no q-value is supplied, assume 1.0. The returned list should contain only supported languages, each at most once, in the order of the client’s weighted preferences.