haystack-ml-stack 0.4.9__tar.gz → 0.4.11__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/PKG-INFO +1 -1
  2. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/pyproject.toml +1 -1
  3. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/_kafka.py +2 -1
  4. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/_serializers.py +1 -0
  5. haystack_ml_stack-0.4.11/src/haystack_ml_stack/_version.py +1 -0
  6. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/app.py +12 -1
  7. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/dynamo.py +18 -21
  8. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/generated/v1/features_pb2.py +32 -32
  9. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/generated/v1/features_pb2.pyi +3 -1
  10. haystack_ml_stack-0.4.11/src/haystack_ml_stack/tmp.py +28 -0
  11. haystack_ml_stack-0.4.11/src/haystack_ml_stack/tmp2.py +28 -0
  12. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/utils.py +0 -1
  13. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack.egg-info/PKG-INFO +1 -1
  14. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack.egg-info/SOURCES.txt +2 -0
  15. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/tests/test_serializers.py +0 -0
  16. haystack_ml_stack-0.4.9/src/haystack_ml_stack/_version.py +0 -1
  17. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/README.md +0 -0
  18. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/setup.cfg +0 -0
  19. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/__init__.py +0 -0
  20. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/cache.py +0 -0
  21. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/exceptions.py +0 -0
  22. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/generated/__init__.py +0 -0
  23. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/generated/v1/__init__.py +0 -0
  24. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/model_store.py +0 -0
  25. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack/settings.py +0 -0
  26. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack.egg-info/dependency_links.txt +0 -0
  27. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack.egg-info/requires.txt +0 -0
  28. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/src/haystack_ml_stack.egg-info/top_level.txt +0 -0
  29. {haystack_ml_stack-0.4.9 → haystack_ml_stack-0.4.11}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: haystack-ml-stack
3
- Version: 0.4.9
3
+ Version: 0.4.11
4
4
  Summary: Functions related to Haystack ML
5
5
  Author-email: Oscar Vega <oscar@haystack.tv>
6
6
  License: MIT
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "haystack-ml-stack"
8
- version = "0.4.9"
8
+ version = "0.4.11"
9
9
  description = "Functions related to Haystack ML"
10
10
  readme = "README.md"
11
11
  authors = [{ name = "Oscar Vega", email = "oscar@haystack.tv" }]
@@ -72,7 +72,7 @@ async def send_channels_to_kafka(
72
72
  "userid": user.get("userid"),
73
73
  "client_os": user.get("clientOs"),
74
74
  "model_input": {"user": user, "channels": channels},
75
- "model_output": model_output,
75
+ "model_output": {c: v for c, v in model_output.items() if c != "__meta__"},
76
76
  "model_name": state["model_name"].replace(".pkl", "")
77
77
  if state["model_name"]
78
78
  else None,
@@ -83,6 +83,7 @@ async def send_channels_to_kafka(
83
83
  "user_features": state.get("user_features", []),
84
84
  "global_features": state.get("global_features", []),
85
85
  "query_params": query_params,
86
+ **model_output.get("__meta__", {})
86
87
  },
87
88
  "processed_at": processed_at.isoformat(),
88
89
  }
@@ -297,6 +297,7 @@ class GlobalChannelsSerializerV1(SimpleSerializer):
297
297
  channel_msg.name = str(channel["name"])
298
298
  channel_msg.category_group = str(channel["category_group"])
299
299
  channel_msg.start_date = int(channel["start_date"])
300
+ channel_msg.required_features.extend(str(f) for f in (channel.get("required_features") or []))
300
301
  return root_msg
301
302
 
302
303
 
@@ -0,0 +1 @@
1
+ __version__ = "0.4.11"
@@ -516,6 +516,7 @@ def create_channel_app(
516
516
  )
517
517
 
518
518
  model = state["model"]
519
+ exploration_mode = query_params.get("exploration") in ["True", "true", "1"]
519
520
  try:
520
521
  preprocess_start = time.perf_counter_ns()
521
522
  model["params"]["query_params"] = query_params
@@ -526,6 +527,16 @@ def create_channel_app(
526
527
  )
527
528
  predict_start = time.perf_counter_ns()
528
529
  model_output = model["predict"](model_input, model["params"])
530
+ if exploration_mode:
531
+ if "exploration" not in model:
532
+ raise ValueError("Model does not support exploration mode")
533
+ model_output = model["exploration"](
534
+ user,
535
+ channels,
536
+ model_output,
537
+ model["params"],
538
+ )
539
+
529
540
  predict_end = time.perf_counter_ns()
530
541
  except Exception as e:
531
542
  logger.error("Model prediction failed: \n%s", traceback.format_exc())
@@ -547,7 +558,7 @@ def create_channel_app(
547
558
  "retrieval_ms": retrieval_meta.retrieval_ms,
548
559
  "preprocess_ms": (predict_start - preprocess_start) * 1e-6,
549
560
  "predict_ms": (predict_end - predict_start) * 1e-6,
550
- "total_channels": len(model_output),
561
+ "total_channels": len(model_output) - ("__meta__" in model_output),
551
562
  }
552
563
  newrelic.agent.record_custom_event(
553
564
  "ChannelInference",
@@ -495,35 +495,32 @@ def _process_channels(
495
495
  "USER_" + k.replace("#", "_"): v for k, v in user.items() if k in user_features
496
496
  }
497
497
 
498
- all_channels = set()
499
- if playlist_stats_global:
500
- for stat in playlist_stats_global.values():
501
- all_channels.update(stat.data.keys())
502
- if playlist_stats_user:
503
- for stat in playlist_stats_user.values():
504
- all_channels.update(stat.data.keys())
505
-
506
- all_channels = all_channels | set(DEFAULT_CHANNELS)
507
-
508
- # My headlines will stay on top so not part of the candidates
498
+ # My headlines and local news will stay on top so not part of the candidates
499
+ # watch history and liked videos are always part of the bottom also
509
500
  # The group labels are also ignored, not real channels for UI
510
- ignore_channels = set(["my headlines", "national_favorite", "local_favorite"])
501
+ ignore_channels = {"my headlines", "local news", "national_favorite", "local_favorite", "watch history", "liked videos", "nn_join_us"}
511
502
 
512
- # Rule for weather
513
- if user.get("geo", {}).get("country") != "US":
514
- ignore_channels.add("weather")
515
- # Rule for live_es
516
- if "es" not in user.get("languages", []):
517
- ignore_channels.add("live_es")
503
+ # Rules to filter candidates
504
+ channel_features = user.get("channelFeatures", {})
505
+ channel_eligibility = channel_features.get("eligibility", {})
506
+ channel_feature_predicates = channel_features.get("features", {})
507
+
508
+ # Eligibility rules
509
+ for name in channel_eligibility:
510
+ if not channel_eligibility[name]:
511
+ ignore_channels.add(name)
518
512
 
519
513
  inserted_channel_names = set()
520
514
  if channel_candidates is not None:
521
515
  preferred = set(user.get("preferredChannels", []) or [])
522
516
  for ch in channel_candidates.data:
517
+ # Feature predicate rules for special channels
518
+ if ch.required_features and not all(channel_feature_predicates.get(f, False) for f in ch.required_features):
519
+ ignore_channels.add(ch.name)
523
520
  # Rule for authors
524
521
  if (
525
522
  ch.category_group in ("national_favorite", "local_favorite")
526
- and ch.name not in preferred
523
+ and (ch.name not in preferred or not channel_eligibility.get(ch.category_group, True))
527
524
  ):
528
525
  ignore_channels.add(ch.name)
529
526
  # Rule for shows
@@ -541,13 +538,13 @@ def _process_channels(
541
538
  )
542
539
  inserted_channel_names.add(ch.name)
543
540
 
544
- for name in all_channels:
541
+ for name in DEFAULT_CHANNELS:
545
542
  if name not in ignore_channels and name not in inserted_channel_names:
546
543
  channels.append(
547
544
  {
548
545
  "name": name,
549
546
  "category_group": "",
550
- "start_date": int(datetime.datetime.now().timestamp()),
547
+ "start_date": int(datetime.datetime(2020, 1, 1).timestamp()),
551
548
  }
552
549
  )
553
550
 
@@ -24,7 +24,7 @@ _sym_db = _symbol_database.Default()
24
24
 
25
25
 
26
26
 
27
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0e\x66\x65\x61tures.proto\x12\x1ahaystack_ml_stack.features\"7\n\x12\x45ntryContextCounts\x12\x10\n\x08\x61ttempts\x18\x01 \x01(\x05\x12\x0f\n\x07watched\x18\x02 \x01(\x05\"_\n\x0cSelectCounts\x12\x15\n\rtotal_selects\x18\x01 \x01(\x05\x12!\n\x19total_selects_and_watched\x18\x02 \x01(\x05\x12\x15\n\rtotal_browsed\x18\x03 \x01(\x05\"\xf3\x02\n\x14\x45ntryContextPWatched\x12@\n\x08\x61utoplay\x18\x01 \x01(\x0b\x32..haystack_ml_stack.features.EntryContextCounts\x12\x41\n\tsel_thumb\x18\x02 \x01(\x0b\x32..haystack_ml_stack.features.EntryContextCounts\x12\x43\n\x0b\x63hoose_next\x18\x03 \x01(\x0b\x32..haystack_ml_stack.features.EntryContextCounts\x12@\n\x08\x63h_swtch\x18\x04 \x01(\x0b\x32..haystack_ml_stack.features.EntryContextCounts\x12O\n\x17launch_first_in_session\x18\x05 \x01(\x0b\x32..haystack_ml_stack.features.EntryContextCounts\"\x85\x02\n\x0fPositionPSelect\x12;\n\tfirst_pos\x18\x01 \x01(\x0b\x32(.haystack_ml_stack.features.SelectCounts\x12<\n\nsecond_pos\x18\x02 \x01(\x0b\x32(.haystack_ml_stack.features.SelectCounts\x12;\n\tthird_pos\x18\x03 \x01(\x0b\x32(.haystack_ml_stack.features.SelectCounts\x12:\n\x08rest_pos\x18\x04 \x01(\x0b\x32(.haystack_ml_stack.features.SelectCounts\"\xa9\x01\n\x1f\x42rowsedDebiasedPositionPSelects\x12\x44\n\x0fup_to_4_browsed\x18\x01 \x01(\x0b\x32+.haystack_ml_stack.features.PositionPSelect\x12@\n\x0b\x61ll_browsed\x18\x02 \x01(\x0b\x32+.haystack_ml_stack.features.PositionPSelect\"\xb8\x01\n\x16PlaylistStatsForGlobal\x12\x15\n\rwatched_count\x18\x01 \x01(\x05\x12\x19\n\x11not_watched_count\x18\x02 \x01(\x05\x12\x1b\n\x13\x63\x61pped_watched_secs\x18\x03 \x01(\x02\x12\x1f\n\x17\x63\x61pped_not_watched_secs\x18\x04 \x01(\x02\x12\x14\n\x0cwatched_secs\x18\x05 \x01(\x02\x12\x18\n\x10not_watched_secs\x18\x06 \x01(\x02\"\xc5\x01\n\x14PlaylistStatsForUser\x12\x12\n\ntotal_days\x18\x01 \x01(\x05\x12\x12\n\nstart_days\x18\x02 \x01(\x05\x12\x13\n\x0b\x61\x63tive_days\x18\x03 \x01(\x05\x12\x15\n\rtotal_watched\x18\x04 \x01(\x02\x12\x1c\n\x14\x63\x61pped_total_watched\x18\x05 \x01(\x02\x12 \n\x18\x63\x61pped_total_log_watched\x18\x06 \x01(\x02\x12\x19\n\x11\x66irst_active_date\x18\x07 \x01(\t\"C\n\x07\x43hannel\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0e\x63\x61tegory_group\x18\x02 \x01(\t\x12\x12\n\nstart_date\x18\x03 \x01(\x05\"k\n\rStreamPSelect\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12I\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32;.haystack_ml_stack.features.BrowsedDebiasedPositionPSelects\"a\n\x0eStreamPWatched\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12>\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x30.haystack_ml_stack.features.EntryContextPWatched\"_\n\x0cUserPWatched\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12>\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x30.haystack_ml_stack.features.EntryContextPWatched\"\xda\x01\n\x19UserPersonalizingPWatched\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12M\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32?.haystack_ml_stack.features.UserPersonalizingPWatched.DataEntry\x1a]\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12?\n\x05value\x18\x02 \x01(\x0b\x32\x30.haystack_ml_stack.features.EntryContextPWatched:\x02\x38\x01\"i\n\x0bUserPSelect\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12I\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32;.haystack_ml_stack.features.BrowsedDebiasedPositionPSelects\"\xe3\x01\n\x18UserPersonalizingPSelect\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12L\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32>.haystack_ml_stack.features.UserPersonalizingPSelect.DataEntry\x1ah\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12J\n\x05value\x18\x02 \x01(\x0b\x32;.haystack_ml_stack.features.BrowsedDebiasedPositionPSelects:\x02\x38\x01\"\xa2\x01\n\x16StreamSimilarityScores\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12J\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32<.haystack_ml_stack.features.StreamSimilarityScores.DataEntry\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x01:\x02\x38\x01\"\xd0\x01\n\x13GlobalPlaylistStats\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12G\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x39.haystack_ml_stack.features.GlobalPlaylistStats.DataEntry\x1a_\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x41\n\x05value\x18\x02 \x01(\x0b\x32\x32.haystack_ml_stack.features.PlaylistStatsForGlobal:\x02\x38\x01\"\xca\x01\n\x11UserPlaylistStats\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x45\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x37.haystack_ml_stack.features.UserPlaylistStats.DataEntry\x1a]\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12?\n\x05value\x18\x02 \x01(\x0b\x32\x30.haystack_ml_stack.features.PlaylistStatsForUser:\x02\x38\x01\"T\n\x0eGlobalChannels\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x31\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32#.haystack_ml_stack.features.Channelb\x06proto3')
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0e\x66\x65\x61tures.proto\x12\x1ahaystack_ml_stack.features\"7\n\x12\x45ntryContextCounts\x12\x10\n\x08\x61ttempts\x18\x01 \x01(\x05\x12\x0f\n\x07watched\x18\x02 \x01(\x05\"_\n\x0cSelectCounts\x12\x15\n\rtotal_selects\x18\x01 \x01(\x05\x12!\n\x19total_selects_and_watched\x18\x02 \x01(\x05\x12\x15\n\rtotal_browsed\x18\x03 \x01(\x05\"\xf3\x02\n\x14\x45ntryContextPWatched\x12@\n\x08\x61utoplay\x18\x01 \x01(\x0b\x32..haystack_ml_stack.features.EntryContextCounts\x12\x41\n\tsel_thumb\x18\x02 \x01(\x0b\x32..haystack_ml_stack.features.EntryContextCounts\x12\x43\n\x0b\x63hoose_next\x18\x03 \x01(\x0b\x32..haystack_ml_stack.features.EntryContextCounts\x12@\n\x08\x63h_swtch\x18\x04 \x01(\x0b\x32..haystack_ml_stack.features.EntryContextCounts\x12O\n\x17launch_first_in_session\x18\x05 \x01(\x0b\x32..haystack_ml_stack.features.EntryContextCounts\"\x85\x02\n\x0fPositionPSelect\x12;\n\tfirst_pos\x18\x01 \x01(\x0b\x32(.haystack_ml_stack.features.SelectCounts\x12<\n\nsecond_pos\x18\x02 \x01(\x0b\x32(.haystack_ml_stack.features.SelectCounts\x12;\n\tthird_pos\x18\x03 \x01(\x0b\x32(.haystack_ml_stack.features.SelectCounts\x12:\n\x08rest_pos\x18\x04 \x01(\x0b\x32(.haystack_ml_stack.features.SelectCounts\"\xa9\x01\n\x1f\x42rowsedDebiasedPositionPSelects\x12\x44\n\x0fup_to_4_browsed\x18\x01 \x01(\x0b\x32+.haystack_ml_stack.features.PositionPSelect\x12@\n\x0b\x61ll_browsed\x18\x02 \x01(\x0b\x32+.haystack_ml_stack.features.PositionPSelect\"\xb8\x01\n\x16PlaylistStatsForGlobal\x12\x15\n\rwatched_count\x18\x01 \x01(\x05\x12\x19\n\x11not_watched_count\x18\x02 \x01(\x05\x12\x1b\n\x13\x63\x61pped_watched_secs\x18\x03 \x01(\x02\x12\x1f\n\x17\x63\x61pped_not_watched_secs\x18\x04 \x01(\x02\x12\x14\n\x0cwatched_secs\x18\x05 \x01(\x02\x12\x18\n\x10not_watched_secs\x18\x06 \x01(\x02\"\xc5\x01\n\x14PlaylistStatsForUser\x12\x12\n\ntotal_days\x18\x01 \x01(\x05\x12\x12\n\nstart_days\x18\x02 \x01(\x05\x12\x13\n\x0b\x61\x63tive_days\x18\x03 \x01(\x05\x12\x15\n\rtotal_watched\x18\x04 \x01(\x02\x12\x1c\n\x14\x63\x61pped_total_watched\x18\x05 \x01(\x02\x12 \n\x18\x63\x61pped_total_log_watched\x18\x06 \x01(\x02\x12\x19\n\x11\x66irst_active_date\x18\x07 \x01(\t\"^\n\x07\x43hannel\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0e\x63\x61tegory_group\x18\x02 \x01(\t\x12\x12\n\nstart_date\x18\x03 \x01(\x05\x12\x19\n\x11required_features\x18\x04 \x03(\t\"k\n\rStreamPSelect\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12I\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32;.haystack_ml_stack.features.BrowsedDebiasedPositionPSelects\"a\n\x0eStreamPWatched\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12>\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x30.haystack_ml_stack.features.EntryContextPWatched\"_\n\x0cUserPWatched\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12>\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x30.haystack_ml_stack.features.EntryContextPWatched\"\xda\x01\n\x19UserPersonalizingPWatched\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12M\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32?.haystack_ml_stack.features.UserPersonalizingPWatched.DataEntry\x1a]\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12?\n\x05value\x18\x02 \x01(\x0b\x32\x30.haystack_ml_stack.features.EntryContextPWatched:\x02\x38\x01\"i\n\x0bUserPSelect\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12I\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32;.haystack_ml_stack.features.BrowsedDebiasedPositionPSelects\"\xe3\x01\n\x18UserPersonalizingPSelect\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12L\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32>.haystack_ml_stack.features.UserPersonalizingPSelect.DataEntry\x1ah\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12J\n\x05value\x18\x02 \x01(\x0b\x32;.haystack_ml_stack.features.BrowsedDebiasedPositionPSelects:\x02\x38\x01\"\xa2\x01\n\x16StreamSimilarityScores\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12J\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32<.haystack_ml_stack.features.StreamSimilarityScores.DataEntry\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x01:\x02\x38\x01\"\xd0\x01\n\x13GlobalPlaylistStats\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12G\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x39.haystack_ml_stack.features.GlobalPlaylistStats.DataEntry\x1a_\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x41\n\x05value\x18\x02 \x01(\x0b\x32\x32.haystack_ml_stack.features.PlaylistStatsForGlobal:\x02\x38\x01\"\xca\x01\n\x11UserPlaylistStats\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x45\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x37.haystack_ml_stack.features.UserPlaylistStats.DataEntry\x1a]\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12?\n\x05value\x18\x02 \x01(\x0b\x32\x30.haystack_ml_stack.features.PlaylistStatsForUser:\x02\x38\x01\"T\n\x0eGlobalChannels\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x31\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32#.haystack_ml_stack.features.Channelb\x06proto3')
28
28
 
29
29
  _globals = globals()
30
30
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -56,35 +56,35 @@ if not _descriptor._USE_C_DESCRIPTORS:
56
56
  _globals['_PLAYLISTSTATSFORUSER']._serialized_start=1198
57
57
  _globals['_PLAYLISTSTATSFORUSER']._serialized_end=1395
58
58
  _globals['_CHANNEL']._serialized_start=1397
59
- _globals['_CHANNEL']._serialized_end=1464
60
- _globals['_STREAMPSELECT']._serialized_start=1466
61
- _globals['_STREAMPSELECT']._serialized_end=1573
62
- _globals['_STREAMPWATCHED']._serialized_start=1575
63
- _globals['_STREAMPWATCHED']._serialized_end=1672
64
- _globals['_USERPWATCHED']._serialized_start=1674
65
- _globals['_USERPWATCHED']._serialized_end=1769
66
- _globals['_USERPERSONALIZINGPWATCHED']._serialized_start=1772
67
- _globals['_USERPERSONALIZINGPWATCHED']._serialized_end=1990
68
- _globals['_USERPERSONALIZINGPWATCHED_DATAENTRY']._serialized_start=1897
69
- _globals['_USERPERSONALIZINGPWATCHED_DATAENTRY']._serialized_end=1990
70
- _globals['_USERPSELECT']._serialized_start=1992
71
- _globals['_USERPSELECT']._serialized_end=2097
72
- _globals['_USERPERSONALIZINGPSELECT']._serialized_start=2100
73
- _globals['_USERPERSONALIZINGPSELECT']._serialized_end=2327
74
- _globals['_USERPERSONALIZINGPSELECT_DATAENTRY']._serialized_start=2223
75
- _globals['_USERPERSONALIZINGPSELECT_DATAENTRY']._serialized_end=2327
76
- _globals['_STREAMSIMILARITYSCORES']._serialized_start=2330
77
- _globals['_STREAMSIMILARITYSCORES']._serialized_end=2492
78
- _globals['_STREAMSIMILARITYSCORES_DATAENTRY']._serialized_start=2449
79
- _globals['_STREAMSIMILARITYSCORES_DATAENTRY']._serialized_end=2492
80
- _globals['_GLOBALPLAYLISTSTATS']._serialized_start=2495
81
- _globals['_GLOBALPLAYLISTSTATS']._serialized_end=2703
82
- _globals['_GLOBALPLAYLISTSTATS_DATAENTRY']._serialized_start=2608
83
- _globals['_GLOBALPLAYLISTSTATS_DATAENTRY']._serialized_end=2703
84
- _globals['_USERPLAYLISTSTATS']._serialized_start=2706
85
- _globals['_USERPLAYLISTSTATS']._serialized_end=2908
86
- _globals['_USERPLAYLISTSTATS_DATAENTRY']._serialized_start=2815
87
- _globals['_USERPLAYLISTSTATS_DATAENTRY']._serialized_end=2908
88
- _globals['_GLOBALCHANNELS']._serialized_start=2910
89
- _globals['_GLOBALCHANNELS']._serialized_end=2994
59
+ _globals['_CHANNEL']._serialized_end=1491
60
+ _globals['_STREAMPSELECT']._serialized_start=1493
61
+ _globals['_STREAMPSELECT']._serialized_end=1600
62
+ _globals['_STREAMPWATCHED']._serialized_start=1602
63
+ _globals['_STREAMPWATCHED']._serialized_end=1699
64
+ _globals['_USERPWATCHED']._serialized_start=1701
65
+ _globals['_USERPWATCHED']._serialized_end=1796
66
+ _globals['_USERPERSONALIZINGPWATCHED']._serialized_start=1799
67
+ _globals['_USERPERSONALIZINGPWATCHED']._serialized_end=2017
68
+ _globals['_USERPERSONALIZINGPWATCHED_DATAENTRY']._serialized_start=1924
69
+ _globals['_USERPERSONALIZINGPWATCHED_DATAENTRY']._serialized_end=2017
70
+ _globals['_USERPSELECT']._serialized_start=2019
71
+ _globals['_USERPSELECT']._serialized_end=2124
72
+ _globals['_USERPERSONALIZINGPSELECT']._serialized_start=2127
73
+ _globals['_USERPERSONALIZINGPSELECT']._serialized_end=2354
74
+ _globals['_USERPERSONALIZINGPSELECT_DATAENTRY']._serialized_start=2250
75
+ _globals['_USERPERSONALIZINGPSELECT_DATAENTRY']._serialized_end=2354
76
+ _globals['_STREAMSIMILARITYSCORES']._serialized_start=2357
77
+ _globals['_STREAMSIMILARITYSCORES']._serialized_end=2519
78
+ _globals['_STREAMSIMILARITYSCORES_DATAENTRY']._serialized_start=2476
79
+ _globals['_STREAMSIMILARITYSCORES_DATAENTRY']._serialized_end=2519
80
+ _globals['_GLOBALPLAYLISTSTATS']._serialized_start=2522
81
+ _globals['_GLOBALPLAYLISTSTATS']._serialized_end=2730
82
+ _globals['_GLOBALPLAYLISTSTATS_DATAENTRY']._serialized_start=2635
83
+ _globals['_GLOBALPLAYLISTSTATS_DATAENTRY']._serialized_end=2730
84
+ _globals['_USERPLAYLISTSTATS']._serialized_start=2733
85
+ _globals['_USERPLAYLISTSTATS']._serialized_end=2935
86
+ _globals['_USERPLAYLISTSTATS_DATAENTRY']._serialized_start=2842
87
+ _globals['_USERPLAYLISTSTATS_DATAENTRY']._serialized_end=2935
88
+ _globals['_GLOBALCHANNELS']._serialized_start=2937
89
+ _globals['_GLOBALCHANNELS']._serialized_end=3021
90
90
  # @@protoc_insertion_point(module_scope)
@@ -97,10 +97,12 @@ class Channel(_message.Message):
97
97
  NAME_FIELD_NUMBER: _ClassVar[int]
98
98
  CATEGORY_GROUP_FIELD_NUMBER: _ClassVar[int]
99
99
  START_DATE_FIELD_NUMBER: _ClassVar[int]
100
+ REQUIRED_FEATURES_FIELD_NUMBER: _ClassVar[int]
100
101
  name: str
101
102
  category_group: str
102
103
  start_date: int
103
- def __init__(self, name: _Optional[str] = ..., category_group: _Optional[str] = ..., start_date: _Optional[int] = ...) -> None: ...
104
+ required_features: _containers.RepeatedScalarFieldContainer[str]
105
+ def __init__(self, name: _Optional[str] = ..., category_group: _Optional[str] = ..., start_date: _Optional[int] = ..., required_features: _Optional[_Iterable[str]] = ...) -> None: ...
104
106
 
105
107
  class StreamPSelect(_message.Message):
106
108
  __slots__ = ()
@@ -0,0 +1,28 @@
1
+ import sys
2
+ import base64
3
+
4
+ b64 = """
5
+ CAESHAoEa3VzYRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa25vZRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2Z0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoLZm94NWF0bGFudGESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0bHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KBndjdmJ0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3RpdhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3BzZBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSGwoDa2d3Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Z2VtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdnVlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Y21oEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRraWlpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHhsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aWZyEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrb2NvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrYnR4Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YnJjEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dmlyEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIlCgpuZXdzbmF0aW9uEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3bmNuEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIkCgxjYnNtaW5uZXNvdGESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEikKEWZveDU5aW5kaWFuYXBvbGlzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3d2xwEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3c2ZhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIhCgljYnNkZW52ZXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh0KBTEzYWJjEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZrb2F0dHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiMKC2NiY21hbml0b2JhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrYW1yEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bGF4Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRra2NvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Y2F4Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRra3R2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZW5zEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdG52Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3cmVnEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZrc2J3dHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiUKDXRoZW5ld3NjZW50ZXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiMKCG5iY3RvZGF5EhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZWh0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIbCgN3b2kSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdmeHQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdhbmUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGttdnQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKCmZveDdhdXN0aW4SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKCW5ld3NtYXh0dhIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2J0dxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIQoJY2JzYm9zdG9uEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrbGZ5Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZmFhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrYXJkEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3eHl6Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrb2xvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdHNtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YXZ5Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZ3VuEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdHZxEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIiCgd0aGVoaWxsEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZGJqEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3eGlpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3cHhpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3c3ltEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3eG1pEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YXZlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YXRlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIpChFmb3gyMW5ld3Njb2xvcmFkbxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3JleBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2F0YxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJwoPZm94MTFsb3NhbmdlbGVzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3c29jEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3emR4Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrc253Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRInCgx5YWhvb2ZpbmFuY2USEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdjYmQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KA2NubhIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3RyaxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3BueBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSLwoUZGV1dHNjaGV3ZWxsZWVuZ2xpc2gSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdueXcSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiUKDWNic3NhY3JhbWVudG8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdwcmkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtud2ESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdhYmkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHduZHUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KBjFjYnNsYRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2dtYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3JxZRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3BpeBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3JlbRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2R2bRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2dhbBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2hzdhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2JuZxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3FhZBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHQoFbmJjMTUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKCmNiY3Rvcm9udG8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGt2dnUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKB2FiY25ld3MSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0aWMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0dnkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd4aXgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdzYXcSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtpcm8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiAKBXZldWVyEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3cm9jEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3d2J0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIgCghhemZhbWlseRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSGwoDd3dsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aGJmEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHZmEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIkCglibG9vbWJlcmcSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdibnMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0a3ISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGttYmMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGt0dXUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiYKDmZveDRrYW5zYXNjaXR5Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3d2F5Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIqChJoYXlzdGFja192YW5jb3V2ZXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdka3kSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEioKD2Fzc29jaWF0ZWRwcmVzcxIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHgoGa25vcHR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YmtvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3eGlhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aXNuEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dGFlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YXB0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZmb3g1ZGMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiAKCGZveDhuZXdzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3amNsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aHRtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZWF1Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZrZnlydHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdib2MSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdrcmcSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdkc3USDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdvd2sSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0b2wSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtianISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtjcmcSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiMKCG5ld3N5aHViEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgRrc250Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIlCgpsaXZlbm93Zm94EhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3bmVwEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIhCgZncmF5ZGMSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBGt5dHgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd1c2ESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtvYWESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdkaG4SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGt0dmISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh0KBXdpc3R2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bG94Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIiCgdjYmNuZXdzEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgRrZ3R2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3cHZpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3b3d0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIdCgVraG9uMhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2VybxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2ZveBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHQoFa2N0djUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtzdHASDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtnbnMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KBm5ld3MxMhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2ZvchIObG9jYWxfZmF2b3JpdGUYgMKv8AUSGwoDbmNtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIkCgxjYnNiYWx0aW1vcmUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdyZGUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKDGZveDVzYW5kaWVnbxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2FsYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2l0bhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3RhYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa21naBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHgoGd210d3R2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIiCgpjYnNjaGljYWdvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dG9rEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3amJmEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Y3BvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aGFzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRInCgxyZXV0ZXJzdmlkZW8SEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdzYXYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHduZW0SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtyb24SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdjdHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhoKDGNubi9hbWFucG91chIEc2hvdxiAwq/wBRIcCgR3ZXdzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aGJxEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZhYmM3bnkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh0KBXdnbnR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZmRhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRuYmM2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Y2piEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHdvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIjCghldXJvbmV3cxIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3N5chIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2NhdRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoLZm94MmRldHJvaXQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdvb2QSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtjY2kSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKCmNic2RldHJvaXQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtpdmkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh0KBXdobzEzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dGFqEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZXljEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR0bWo0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Z2hwEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIlCg1jYnNwaXR0c2J1cmdoEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrc3dvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRramN0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIjCgtuYmNzYW5kaWVnbxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoLbmJjbmVicmFza2ESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiMKC2NiY2VkbW9udG9uEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdHZpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZGFtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Z3J6Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIlCg1mb3g2bWlsd2F1a2VlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZmZmEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bWJiEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dmVjEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bG5zEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdGFsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrbnh2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRranJoEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRInCg9jYnNzYW5mcmFuY2lzY28SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdtZ3QSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiMKC2ZveGNhcm9saW5hEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIfCgdmb3gxMHR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrcmlzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrcHR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZXNoEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRraW5nEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dnRtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3eHh2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bWFyEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrc2Z5Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bWJkEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIgCghjYnNtaWFtaRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoIcG9saXRpY3MSCmhzX2NoYW5uZWwYxIba8AUSHAoEa2FsYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJAoMZm94MzVvcmxhbmRvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdHhsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIkCglhYmNuZXdzMjQSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdsa3kSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdjYmkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtpZHkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtlbG8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEicKD3dlc3Rlcm5tYXNzbmV3cxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3R2eBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJAoMY2JzNnBvcnRsYW5kEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bmN0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZ3aXZidHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKCmNiY2NhbGdhcnkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtldm4SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGFiYzcSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtsdHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdpbHgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdzcGESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdoaW8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdtYmYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdsZXgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGt3cWMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdnYmESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKDGZveDMyY2hpY2FnbxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIgoKY2JzbmV3eW9yaxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2p6eRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3VschIObG9jYWxfZmF2b3JpdGUYgMKv8AUSGwoDa3NsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dGVuEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZnRzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHZtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dmx0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZm1iEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrYXJrEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YnJlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIiCgdjb3VydHR2EhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3YmFsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRImChJ3aWxkZmlyZS1uZXdzLTIwMjYSCmhzX2NoYW5uZWwYmJTP0wYSHAoEd3BiZhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3JibBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2FpdBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3htYRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2hudBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3NlZRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3NtdhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3hhbhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2R0bhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2ZzYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIQoGY25ldHR2EhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIdCgV3bWN0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSGwoDa29iEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3a3l0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHZyEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRreGlpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrc2xhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dGhyEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bHd0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YnR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZnZzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dnVlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dm5zEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdGxhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aWJ3Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrd2NoEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIrChBhbGphemVlcmFlbmdsaXNoEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIjCgthYmM3Y2hpY2FnbxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoLZm94MzFkZW52ZXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdsdHgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdhZmYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdwbXQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdiaXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0dmQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0cmYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGthcmUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtmc24SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdjaWESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGttdHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdwdHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdtdXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdzYXoSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKCW55cHNwb3J0cxIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSJgoObmV3czJuYXNodmlsbGUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtmZHgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KBmtldHZ0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSKQoRZm94MjlwaGlsYWRlbHBoaWESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KBmNic2RmdxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2NlbhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIAoIZm94NG5ld3MSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdjbmMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtzdHUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGt4eHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdiYXkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGttaWQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKEGlyYW4tY3Jpc2lzLW5ld3MSCmhzX2NoYW5uZWwY6LuLzQYSHAoEa3NkaxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2ZydhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2hlYxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2pldBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2JtdBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2hicxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2ZzbRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3R0YxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJwoPZm94OW1pbm5lYXBvbGlzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3enptEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIkCgxmb3gxMHBob2VuaXgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdkaW8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKDGZveDI2aG91c3RvbhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3d0eBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoLY2JjbW9udHJlYWwSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdyaWMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtobmwSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdib3kSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiAKCGFiYzduZXdzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3cmR3Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bGJ0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIiCgpxMTNzZWF0dGxlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIdCgVjYnM0NhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoIYW1hemVsYWISEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdwdHoSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiUKDWZveDEzdGFtcGFiYXkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKB25iY25ld3MSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0b2MSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhsKA2tocRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2dldBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3RodhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd21hehIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3l0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa21vdhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2ZteRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIgoHaTI0bmV3cxIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2VjdBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2p0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3FyZhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3lsZRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSKAoQY2hhbm5lbDhsYXN2ZWdhcxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3dueRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3BheBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2RlZhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSKgoPZnJhbmNlMjRlbmdsaXNoEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgRrc2hiEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIbCgN3c2ISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdmbGESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKB2NoZWRkYXISEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEiEKBmJ1eno2MBIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2JiaBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3BsYxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3NieRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2R0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3lmZhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3dzYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJQoKZm94d2VhdGhlchIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2NiZBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJgoOdmFsbGV5bmV3c2xpdmUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtjcmESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiAKCDEwMTFuZXdzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdHZ1Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrc25mEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bHVjEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3b2lvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIoChBjYnNwaGlsYWRlbHBoaWExEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRraG91Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrbmR1Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIhCg1pbnRlcm5hdGlvbmFsEgpoc19jaGFubmVsGOzSs/AFEi4KDWRvY3VtZW50YXJpZXMSCmhzX2NoYW5uZWwYovTQ0QYiC3ByZXZpZXdHYXRlEh4KCnlvdXItbW9uZXkSCmhzX2NoYW5uZWwYid3H0wY=
6
+ """
7
+
8
+ data = base64.b64decode(b64.strip().replace(' ', '').replace('\n', ''))
9
+ print(f"Binary size: {len(data)} bytes")
10
+
11
+ # --- 0.4.10 ---
12
+ sys.path.insert(0, '/Users/admin/miniconda3/envs/py311/lib/python3.11/site-packages')
13
+ from haystack_ml_stack.generated.v1 import features_pb2 as pb2_v10
14
+
15
+ msg10 = pb2_v10.GlobalChannels()
16
+ msg10.ParseFromString(data)
17
+
18
+ empty10 = [c.name for c in msg10.data if not c.category_group]
19
+ print(f"\n=== 0.4.10 ===")
20
+ print(f"version={msg10.version}, channels={len(msg10.data)}")
21
+ print(f"Empty category_group: {len(empty10)}")
22
+ if empty10:
23
+ print(f" {empty10}")
24
+ for c in msg10.data:
25
+ if c.category_group == 'hs_channel':
26
+ print(f" [hs] {c.name:<30} start_date={c.start_date} required_features={list(c.required_features)}")
27
+
28
+ print([c for c in msg10.data if c.name in ('wbns', 'wdsu', 'kcau', 'weau', 'kndu', 'ktuu')])
@@ -0,0 +1,28 @@
1
+ # decode_v49_only.py — run with: /tmp/hms_v49_env/bin/python3 decode_v49_only.py
2
+ import sys
3
+ import base64
4
+
5
+ # No 0.4.10 path here at all
6
+ b64 = """
7
+ CAESHAoEa3VzYRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa25vZRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2Z0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoLZm94NWF0bGFudGESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0bHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KBndjdmJ0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3RpdhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3BzZBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSGwoDa2d3Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Z2VtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdnVlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Y21oEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRraWlpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHhsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aWZyEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrb2NvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrYnR4Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YnJjEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dmlyEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIlCgpuZXdzbmF0aW9uEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3bmNuEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIkCgxjYnNtaW5uZXNvdGESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEikKEWZveDU5aW5kaWFuYXBvbGlzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3d2xwEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3c2ZhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIhCgljYnNkZW52ZXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh0KBTEzYWJjEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZrb2F0dHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiMKC2NiY21hbml0b2JhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrYW1yEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bGF4Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRra2NvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Y2F4Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRra3R2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZW5zEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdG52Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3cmVnEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZrc2J3dHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiUKDXRoZW5ld3NjZW50ZXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiMKCG5iY3RvZGF5EhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZWh0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIbCgN3b2kSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdmeHQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdhbmUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGttdnQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKCmZveDdhdXN0aW4SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKCW5ld3NtYXh0dhIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2J0dxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIQoJY2JzYm9zdG9uEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrbGZ5Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZmFhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrYXJkEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3eHl6Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrb2xvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdHNtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YXZ5Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZ3VuEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdHZxEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIiCgd0aGVoaWxsEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZGJqEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3eGlpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3cHhpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3c3ltEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3eG1pEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YXZlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YXRlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIpChFmb3gyMW5ld3Njb2xvcmFkbxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3JleBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2F0YxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJwoPZm94MTFsb3NhbmdlbGVzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3c29jEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3emR4Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrc253Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRInCgx5YWhvb2ZpbmFuY2USEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdjYmQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KA2NubhIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3RyaxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3BueBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSLwoUZGV1dHNjaGV3ZWxsZWVuZ2xpc2gSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdueXcSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiUKDWNic3NhY3JhbWVudG8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdwcmkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtud2ESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdhYmkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHduZHUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KBjFjYnNsYRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2dtYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3JxZRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3BpeBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3JlbRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2R2bRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2dhbBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2hzdhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2JuZxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3FhZBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHQoFbmJjMTUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKCmNiY3Rvcm9udG8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGt2dnUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKB2FiY25ld3MSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0aWMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0dnkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd4aXgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdzYXcSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtpcm8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiAKBXZldWVyEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3cm9jEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3d2J0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIgCghhemZhbWlseRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSGwoDd3dsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aGJmEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHZmEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIkCglibG9vbWJlcmcSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdibnMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0a3ISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGttYmMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGt0dXUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiYKDmZveDRrYW5zYXNjaXR5Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3d2F5Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIqChJoYXlzdGFja192YW5jb3V2ZXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdka3kSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEioKD2Fzc29jaWF0ZWRwcmVzcxIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHgoGa25vcHR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YmtvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3eGlhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aXNuEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dGFlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YXB0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZmb3g1ZGMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiAKCGZveDhuZXdzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3amNsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aHRtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZWF1Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZrZnlydHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdib2MSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdrcmcSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdkc3USDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdvd2sSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0b2wSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtianISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtjcmcSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiMKCG5ld3N5aHViEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgRrc250Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIlCgpsaXZlbm93Zm94EhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3bmVwEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIhCgZncmF5ZGMSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBGt5dHgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd1c2ESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtvYWESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdkaG4SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGt0dmISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh0KBXdpc3R2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bG94Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIiCgdjYmNuZXdzEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgRrZ3R2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3cHZpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3b3d0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIdCgVraG9uMhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2VybxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2ZveBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHQoFa2N0djUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtzdHASDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtnbnMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KBm5ld3MxMhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2ZvchIObG9jYWxfZmF2b3JpdGUYgMKv8AUSGwoDbmNtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIkCgxjYnNiYWx0aW1vcmUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdyZGUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKDGZveDVzYW5kaWVnbxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2FsYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2l0bhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3RhYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa21naBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHgoGd210d3R2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIiCgpjYnNjaGljYWdvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dG9rEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3amJmEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Y3BvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aGFzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRInCgxyZXV0ZXJzdmlkZW8SEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdzYXYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHduZW0SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtyb24SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdjdHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhoKDGNubi9hbWFucG91chIEc2hvdxiAwq/wBRIcCgR3ZXdzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aGJxEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZhYmM3bnkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh0KBXdnbnR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZmRhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRuYmM2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Y2piEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHdvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIjCghldXJvbmV3cxIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3N5chIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2NhdRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoLZm94MmRldHJvaXQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdvb2QSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtjY2kSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKCmNic2RldHJvaXQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtpdmkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh0KBXdobzEzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dGFqEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZXljEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR0bWo0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Z2hwEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIlCg1jYnNwaXR0c2J1cmdoEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrc3dvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRramN0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIjCgtuYmNzYW5kaWVnbxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoLbmJjbmVicmFza2ESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiMKC2NiY2VkbW9udG9uEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdHZpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZGFtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3Z3J6Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIlCg1mb3g2bWlsd2F1a2VlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZmZmEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bWJiEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dmVjEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bG5zEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdGFsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrbnh2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRranJoEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRInCg9jYnNzYW5mcmFuY2lzY28SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdtZ3QSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiMKC2ZveGNhcm9saW5hEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIfCgdmb3gxMHR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrcmlzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrcHR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZXNoEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRraW5nEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dnRtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3eHh2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bWFyEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrc2Z5Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bWJkEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIgCghjYnNtaWFtaRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoIcG9saXRpY3MSCmhzX2NoYW5uZWwYxIba8AUSHAoEa2FsYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJAoMZm94MzVvcmxhbmRvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdHhsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIkCglhYmNuZXdzMjQSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdsa3kSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdjYmkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtpZHkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtlbG8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEicKD3dlc3Rlcm5tYXNzbmV3cxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3R2eBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJAoMY2JzNnBvcnRsYW5kEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bmN0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIeCgZ3aXZidHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKCmNiY2NhbGdhcnkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtldm4SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGFiYzcSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtsdHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdpbHgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdzcGESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdoaW8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdtYmYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdsZXgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGt3cWMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdnYmESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKDGZveDMyY2hpY2FnbxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIgoKY2JzbmV3eW9yaxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2p6eRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3VschIObG9jYWxfZmF2b3JpdGUYgMKv8AUSGwoDa3NsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dGVuEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3ZnRzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHZtEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dmx0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZm1iEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrYXJrEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YnJlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIiCgdjb3VydHR2EhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgR3YmFsEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRImChJ3aWxkZmlyZS1uZXdzLTIwMjYSCmhzX2NoYW5uZWwYmJTP0wYSHAoEd3BiZhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3JibBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2FpdBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3htYRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2hudBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3NlZRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3NtdhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3hhbhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2R0bhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2ZzYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIQoGY25ldHR2EhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIdCgV3bWN0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSGwoDa29iEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3a3l0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dHZyEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRreGlpEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrc2xhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dGhyEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bHd0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3YnR2Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrZnZzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dnVlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3dm5zEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdGxhEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3aWJ3Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrd2NoEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIrChBhbGphemVlcmFlbmdsaXNoEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIjCgthYmM3Y2hpY2FnbxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoLZm94MzFkZW52ZXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdsdHgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdhZmYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdwbXQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdiaXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0dmQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0cmYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGthcmUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtmc24SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdjaWESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGttdHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdwdHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdtdXISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdzYXoSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKCW55cHNwb3J0cxIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSJgoObmV3czJuYXNodmlsbGUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtmZHgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KBmtldHZ0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSKQoRZm94MjlwaGlsYWRlbHBoaWESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEh4KBmNic2RmdxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2NlbhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIAoIZm94NG5ld3MSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdjbmMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtzdHUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGt4eHYSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdiYXkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGttaWQSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKEGlyYW4tY3Jpc2lzLW5ld3MSCmhzX2NoYW5uZWwY6LuLzQYSHAoEa3NkaxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2ZydhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2hlYxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2pldBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2JtdBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2hicxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2ZzbRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3R0YxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJwoPZm94OW1pbm5lYXBvbGlzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3enptEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIkCgxmb3gxMHBob2VuaXgSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdkaW8SDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiQKDGZveDI2aG91c3RvbhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3d0eBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoLY2JjbW9udHJlYWwSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdyaWMSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtobmwSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdib3kSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiAKCGFiYzduZXdzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3cmR3Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bGJ0Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIiCgpxMTNzZWF0dGxlEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIdCgVjYnM0NhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIwoIYW1hemVsYWISEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHdwdHoSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiUKDWZveDEzdGFtcGFiYXkSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKB25iY25ld3MSEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEhwKBHd0b2MSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhsKA2tocRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2dldBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3RodhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd21hehIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3l0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa21vdhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2ZteRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSIgoHaTI0bmV3cxIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2VjdBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2p0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3FyZhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3lsZRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSKAoQY2hhbm5lbDhsYXN2ZWdhcxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3dueRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3BheBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2RlZhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSKgoPZnJhbmNlMjRlbmdsaXNoEhFuYXRpb25hbF9mYXZvcml0ZRiAwq/wBRIcCgRrc2hiEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIbCgN3c2ISDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBHdmbGESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiIKB2NoZWRkYXISEW5hdGlvbmFsX2Zhdm9yaXRlGIDCr/AFEiEKBmJ1eno2MBIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2JiaBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3BsYxIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEa3NieRIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd2R0dhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3lmZhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSHAoEd3dzYhIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJQoKZm94d2VhdGhlchIRbmF0aW9uYWxfZmF2b3JpdGUYgMKv8AUSHAoEa2NiZBIObG9jYWxfZmF2b3JpdGUYgMKv8AUSJgoOdmFsbGV5bmV3c2xpdmUSDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEhwKBGtjcmESDmxvY2FsX2Zhdm9yaXRlGIDCr/AFEiAKCDEwMTFuZXdzEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrdHZ1Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrc25mEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3bHVjEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgR3b2lvEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIoChBjYnNwaGlsYWRlbHBoaWExEg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRraG91Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIcCgRrbmR1Eg5sb2NhbF9mYXZvcml0ZRiAwq/wBRIhCg1pbnRlcm5hdGlvbmFsEgpoc19jaGFubmVsGOzSs/AFEi4KDWRvY3VtZW50YXJpZXMSCmhzX2NoYW5uZWwYovTQ0QYiC3ByZXZpZXdHYXRlEh4KCnlvdXItbW9uZXkSCmhzX2NoYW5uZWwYid3H0wY=
8
+ """
9
+
10
+ s = b64.strip().replace(' ', '').replace('\n', '')
11
+ data = base64.b64decode(s + '=' * (-len(s) % 4))
12
+
13
+ # -len(s) % 4 computes exactly how many = characters are needed (0, 1, or 2), so it handles any input correctly.
14
+ #data = base64.b64decode(b64.strip().replace(' ', '').replace('\n', ''))
15
+
16
+ from haystack_ml_stack.generated.v1 import features_pb2 as pb2
17
+
18
+ msg = pb2.GlobalChannels()
19
+ msg.ParseFromString(data)
20
+
21
+ empty = [c.name for c in msg.data if not c.category_group]
22
+ print(f"version={msg.version}, channels={len(msg.data)}")
23
+ print(f"Empty category_group: {len(empty)}")
24
+ if empty:
25
+ print(f" {empty}")
26
+ for c in msg.data:
27
+ if c.category_group == 'hs_channel':
28
+ print(f" [hs] {c.name:<30} start_date={c.start_date} required_features={list(c.required_features)}")
@@ -680,7 +680,6 @@ def _validate_pwatched_entry_context(entry_contexts: list[str]):
680
680
 
681
681
 
682
682
  DEFAULT_CHANNELS = [
683
- "local news",
684
683
  "science & technology",
685
684
  "business & finance",
686
685
  "entertainment news",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: haystack-ml-stack
3
- Version: 0.4.9
3
+ Version: 0.4.11
4
4
  Summary: Functions related to Haystack ML
5
5
  Author-email: Oscar Vega <oscar@haystack.tv>
6
6
  License: MIT
@@ -10,6 +10,8 @@ src/haystack_ml_stack/dynamo.py
10
10
  src/haystack_ml_stack/exceptions.py
11
11
  src/haystack_ml_stack/model_store.py
12
12
  src/haystack_ml_stack/settings.py
13
+ src/haystack_ml_stack/tmp.py
14
+ src/haystack_ml_stack/tmp2.py
13
15
  src/haystack_ml_stack/utils.py
14
16
  src/haystack_ml_stack.egg-info/PKG-INFO
15
17
  src/haystack_ml_stack.egg-info/SOURCES.txt
@@ -1 +0,0 @@
1
- __version__ = "0.4.9"