{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a669562d",
   "metadata": {},
   "source": [
    "# PageRank Approach for Finding Users with Good Taste\n",
    "\n",
    "## Plan:\n",
    "\n",
    "### 1. Build Directed Graph\n",
    "- Nodes: Users and Clips\n",
    "- Edges: User → Clip (if user likes clip, weight by log of play_count)\n",
    "- Edges: Clip → User (distribute clip's quality to users who liked it)\n",
    "\n",
    "### 2. Define \"Good Clips\" (Bot-Resistant)\n",
    "- **High unique user engagement**: likes/unique_users ratio\n",
    "- **High average play count**: mean(play_count) per user\n",
    "- **Low flag rate**: flagged_count/total_interactions\n",
    "- **Engagement diversity**: liked by users with diverse listening patterns\n",
    "- **NOT just high like count** (this attracts bots)\n",
    "\n",
    "### 3. Initialize Scores\n",
    "- Clips: Score based on unique user engagement metrics above\n",
    "- Users: \n",
    "  - Users who like rarely and wegith their vote more.\n",
    "    - for example, if they listened to 100 clips and only liked 4, each vote should get a weight of 25.\n",
    "    - if they listened to 100 clips and liked 50, each vote should get a weight of 2 ish.\n",
    "\n",
    "### 4. Bot Detection & Filtering\n",
    "- Remove users who like >80% of clips they interact with\n",
    "- Remove users with avg play_count < 1 but many likes\n",
    "- Remove users who liked >100 clips but play_count ≈ 0\n",
    "- Weight edges by play_count to reduce bot influence\n",
    "\n",
    "### 5. Run PageRank\n",
    "- Users gain score from liking genuinely engaging clips\n",
    "- Clips gain score from being liked by high-score (non-bot) users\n",
    "- Iterate until convergence"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "6c0e3a2d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import networkx as nx\n",
    "from typing import Dict, List, Set, Tuple\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from collections import defaultdict\n",
    "import warnings\n",
    "\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "\n",
    "# Load the data\n",
    "reactions_on_others = pd.read_pickle(\n",
    "    \"/home/tony/Data/Preference/user_reaction_interaction_20250820.pkl\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3eaa6658",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data shape: (3329371, 10)\n",
      "\n",
      "Columns: ['clip_id', 'user_id', 'updated_at', 'play_count', 'skip_count', 'flagged', 'flagged_reason', 'reaction_type', 'is_pro_user', 'clip_creator_id']\n",
      "\n",
      "Reaction types: reaction_type\n",
      "L    1308021\n",
      "D       2520\n",
      "Name: count, dtype: int64\n",
      "\n",
      "Interactions by type:\n",
      "  - With reaction (L or D): 1310541\n",
      "  - No reaction (just listen): 2018830\n",
      "  - Total interactions: 3329371\n",
      "\n",
      "Data types:\n",
      "user_id type: int32\n",
      "clip_id type: object\n"
     ]
    }
   ],
   "source": [
    "# Check data structure\n",
    "print(\"Data shape:\", reactions_on_others.shape)\n",
    "print(\"\\nColumns:\", reactions_on_others.columns.tolist())\n",
    "print(\"\\nReaction types:\", reactions_on_others[\"reaction_type\"].value_counts())\n",
    "\n",
    "# KEY INSIGHT: Many interactions have no reaction (just listening)\n",
    "print(\"\\nInteractions by type:\")\n",
    "print(\n",
    "    f\"  - With reaction (L or D): {reactions_on_others['reaction_type'].notna().sum()}\"\n",
    ")\n",
    "print(\n",
    "    f\"  - No reaction (just listen): {reactions_on_others['reaction_type'].isna().sum()}\"\n",
    ")\n",
    "print(f\"  - Total interactions: {len(reactions_on_others)}\")\n",
    "\n",
    "# Check data types for IDs\n",
    "print(\"\\nData types:\")\n",
    "print(f\"user_id type: {reactions_on_others['user_id'].dtype}\")\n",
    "print(f\"clip_id type: {reactions_on_others['clip_id'].dtype}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0eaaf288",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Analyzing user behavior patterns...\n",
      "\n",
      "User behavior statistics (all 153972 users):\n",
      "  - Mean like rate: 5.6%\n",
      "  - Median like rate: 0.0%\n",
      "  - Users with like_rate > 0.5: 5259\n",
      "  - Users with like_rate > 0.7: 3250\n",
      "  - Users with like_rate > 0.9: 1865\n",
      "\n",
      "Interaction distribution:\n",
      "  - Users with 1-10 interactions: 118474\n",
      "  - Users with 11-50 interactions: 27183\n",
      "  - Users with 51+ interactions: 8315\n"
     ]
    }
   ],
   "source": [
    "# Analyze user behavior patterns before bot detection\n",
    "print(\"Analyzing user behavior patterns...\")\n",
    "user_behavior = reactions_on_others.groupby(\"user_id\").agg(\n",
    "    {\n",
    "        \"clip_id\": [\"count\", \"nunique\"],\n",
    "        \"reaction_type\": [\n",
    "            lambda x: (x == \"L\").sum(),\n",
    "            lambda x: x.isna().sum(),\n",
    "        ],\n",
    "        \"play_count\": \"mean\",\n",
    "    }\n",
    ")\n",
    "\n",
    "user_behavior.columns = [\n",
    "    \"total_interactions\",\n",
    "    \"unique_clips\",\n",
    "    \"likes\",\n",
    "    \"neutral_listens\",\n",
    "    \"avg_play_count\",\n",
    "]\n",
    "user_behavior[\"like_rate\"] = (\n",
    "    user_behavior[\"likes\"] / user_behavior[\"total_interactions\"]\n",
    ")\n",
    "\n",
    "print(f\"\\nUser behavior statistics (all {len(user_behavior)} users):\")\n",
    "print(f\"  - Mean like rate: {user_behavior['like_rate'].mean():.1%}\")\n",
    "print(f\"  - Median like rate: {user_behavior['like_rate'].median():.1%}\")\n",
    "print(\n",
    "    f\"  - Users with like_rate > 0.5: {len(user_behavior[user_behavior['like_rate'] > 0.5])}\"\n",
    ")\n",
    "print(\n",
    "    f\"  - Users with like_rate > 0.7: {len(user_behavior[user_behavior['like_rate'] > 0.7])}\"\n",
    ")\n",
    "print(\n",
    "    f\"  - Users with like_rate > 0.9: {len(user_behavior[user_behavior['like_rate'] > 0.9])}\"\n",
    ")\n",
    "\n",
    "# Show distribution of interactions\n",
    "print(f\"\\nInteraction distribution:\")\n",
    "print(\n",
    "    f\"  - Users with 1-10 interactions: {len(user_behavior[user_behavior['total_interactions'] <= 10])}\"\n",
    ")\n",
    "print(\n",
    "    f\"  - Users with 11-50 interactions: {len(user_behavior[(user_behavior['total_interactions'] > 10) & (user_behavior['total_interactions'] <= 50)])}\"\n",
    ")\n",
    "print(\n",
    "    f\"  - Users with 51+ interactions: {len(user_behavior[user_behavior['total_interactions'] > 50])}\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b4d3050a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Interaction Breakdown:\n",
      "  - Neutral listens: 2,018,830 (60.6%)\n",
      "  - Likes: 1,308,021 (39.3%)\n",
      "  - Dislikes: 2,520 (0.1%)\n",
      "\n",
      "This means 60.6% of all interactions were being ignored in the original analysis!\n"
     ]
    }
   ],
   "source": [
    "# Analyze the significance of neutral listens\n",
    "total_interactions = len(reactions_on_others)\n",
    "neutral_listens = reactions_on_others[\"reaction_type\"].isna().sum()\n",
    "likes = (reactions_on_others[\"reaction_type\"] == \"L\").sum()\n",
    "dislikes = (reactions_on_others[\"reaction_type\"] == \"D\").sum()\n",
    "\n",
    "print(\"Interaction Breakdown:\")\n",
    "print(\n",
    "    f\"  - Neutral listens: {neutral_listens:,} ({neutral_listens/total_interactions:.1%})\"\n",
    ")\n",
    "print(f\"  - Likes: {likes:,} ({likes/total_interactions:.1%})\")\n",
    "print(f\"  - Dislikes: {dislikes:,} ({dislikes/total_interactions:.1%})\")\n",
    "print(\n",
    "    f\"\\nThis means {neutral_listens/total_interactions:.1%} of all interactions were being ignored in the original analysis!\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b46bffaf",
   "metadata": {},
   "outputs": [],
   "source": [
    "# # Debug: Check if specific high like-rate users were caught as bots\n",
    "# suspicious_user_ids = [75567253, 100442050, 65805460]\n",
    "# print(\"\\nDEBUG: Checking if suspicious users were detected as bots:\")\n",
    "# for uid in suspicious_user_ids:\n",
    "#     is_bot = uid in bot_users\n",
    "#     print(f\"  - User {uid}: {'BOT' if is_bot else 'NOT BOT'}\")\n",
    "\n",
    "# # Check their stats in the original data\n",
    "# print(\"\\nTheir stats in original data:\")\n",
    "# user_stats_debug = reactions_on_others.groupby(\"user_id\").agg(\n",
    "#     {\n",
    "#         \"reaction_type\": [\n",
    "#             \"count\",\n",
    "#             lambda x: (x == \"L\").sum(),\n",
    "#         ]\n",
    "#     }\n",
    "# )\n",
    "# user_stats_debug.columns = [\"total_interactions\", \"likes\"]\n",
    "# user_stats_debug[\"like_rate\"] = (\n",
    "#     user_stats_debug[\"likes\"] / user_stats_debug[\"total_interactions\"]\n",
    "# )\n",
    "\n",
    "# for uid in suspicious_user_ids:\n",
    "#     if uid in user_stats_debug.index:\n",
    "#         stats = user_stats_debug.loc[uid]\n",
    "#         print(\n",
    "#             f\"  - User {uid}: {stats['total_interactions']} interactions, {stats['likes']} likes, {stats['like_rate']:.1%} like rate\"\n",
    "#         )\n",
    "\n",
    "# # Check if they still exist in filtered data\n",
    "# print(\"\\nChecking if they exist in filtered data:\")\n",
    "# for uid in suspicious_user_ids:\n",
    "#     count_in_filtered = len(df_filtered[df_filtered[\"user_id\"] == uid])\n",
    "#     print(f\"  - User {uid}: {count_in_filtered} interactions in filtered data\")\n",
    "\n",
    "# # Show bot detection thresholds\n",
    "# print(\"\\n\\nCurrent bot detection thresholds:\")\n",
    "# print(\"  - Extreme likers: like_rate > 0.9 AND interactions > 5\")\n",
    "# print(\"  - High like rate: like_rate > 0.6 AND interactions > 20\")\n",
    "# print(\"  - Always react: reaction_rate > 0.8 AND interactions > 30\")\n",
    "# print(\"  - Like everything: neutral_listens < likes * 0.5 AND likes > 30\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f5883f8e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Detected 4277 bot users:\n",
      "  - High like rate (>80%): 4277\n",
      "  - Many likes but no play: 0\n",
      "  - High interact, low play: 0\n",
      "  - No neutral listening: 436\n",
      "\n",
      "Bot vs Normal user statistics:\n",
      "  - Bot like rate: 84.6% vs Normal: 3.3%\n",
      "  - Bot avg play per like: 2.10 vs Normal: 68771168043.96\n",
      "  - Bot neutral listens: 48 vs Normal: 12\n",
      "\n",
      "Filtered data shape: (2118572, 10) (removed 1210799 bot interactions)\n"
     ]
    }
   ],
   "source": [
    "# Step 1: Bot Detection and Filtering\n",
    "def detect_bots(df: pd.DataFrame) -> Set[int]:\n",
    "    \"\"\"Detect bot users based on suspicious behavior patterns.\"\"\"\n",
    "    bots = set()\n",
    "\n",
    "    # Calculate user metrics - ALL rows are interactions\n",
    "    user_stats = df.groupby(\"user_id\").agg(\n",
    "        {\n",
    "            \"clip_id\": [\"count\", \"nunique\"],  # total interactions and unique clips\n",
    "            \"reaction_type\": [\n",
    "                lambda x: (x == \"L\").sum(),  # likes\n",
    "                lambda x: (x == \"D\").sum(),  # dislikes\n",
    "                lambda x: x.isna().sum(),  # listens without reaction\n",
    "            ],\n",
    "            \"play_count\": [\"mean\", \"sum\"],\n",
    "        }\n",
    "    )\n",
    "\n",
    "    user_stats.columns = [\n",
    "        \"total_interactions\",\n",
    "        \"unique_clips\",\n",
    "        \"likes\",\n",
    "        \"dislikes\",\n",
    "        \"neutral_listens\",\n",
    "        \"avg_play_count\",\n",
    "        \"total_play_count\",\n",
    "    ]\n",
    "\n",
    "    # Calculate metrics\n",
    "    user_stats[\"like_rate\"] = user_stats[\"likes\"] / (\n",
    "        user_stats[\"total_interactions\"] + 1e-10\n",
    "    )\n",
    "    user_stats[\"avg_play_per_like\"] = user_stats[\"total_play_count\"] / (\n",
    "        user_stats[\"likes\"] + 1e-10\n",
    "    )\n",
    "\n",
    "    # Bot criteria - more aggressive filtering\n",
    "    # 1. High like rate (>60% is abnormal given mean is 5.6%)\n",
    "    high_like_rate = user_stats[\n",
    "        (\n",
    "            user_stats[\"like_rate\"] > 0.6\n",
    "        )  # Lower threshold - normal users rarely like >60%\n",
    "    ].index\n",
    "    bots.update(high_like_rate)\n",
    "\n",
    "    # 2. Many likes but almost no play count\n",
    "    many_likes_no_play = user_stats[\n",
    "        (user_stats[\"likes\"] > 100) & (user_stats[\"avg_play_per_like\"] < 0.1)\n",
    "    ].index\n",
    "    bots.update(many_likes_no_play)\n",
    "\n",
    "    # 3. High interactions but low consumption\n",
    "    high_interact_low_play = user_stats[\n",
    "        (user_stats[\"total_interactions\"] > 100) & (user_stats[\"avg_play_count\"] < 1.0)\n",
    "    ].index\n",
    "    bots.update(high_interact_low_play)\n",
    "\n",
    "    # 4. No neutral listening behavior (only likes, no exploration)\n",
    "    no_neutral_listening = user_stats[\n",
    "        (user_stats[\"neutral_listens\"] < user_stats[\"likes\"] * 0.2)\n",
    "        & (user_stats[\"likes\"] > 50)\n",
    "    ].index\n",
    "    bots.update(no_neutral_listening)\n",
    "\n",
    "    print(f\"Detected {len(bots)} bot users:\")\n",
    "    print(f\"  - High like rate (>80%): {len(high_like_rate)}\")\n",
    "    print(f\"  - Many likes but no play: {len(many_likes_no_play)}\")\n",
    "    print(f\"  - High interact, low play: {len(high_interact_low_play)}\")\n",
    "    print(f\"  - No neutral listening: {len(no_neutral_listening)}\")\n",
    "\n",
    "    # Show some stats about detected bots vs normal users\n",
    "    if len(bots) > 0:\n",
    "        bot_stats = user_stats.loc[list(bots)]\n",
    "        normal_stats = user_stats[~user_stats.index.isin(bots)]\n",
    "        print(f\"\\nBot vs Normal user statistics:\")\n",
    "        print(\n",
    "            f\"  - Bot like rate: {bot_stats['like_rate'].mean():.1%} vs Normal: {normal_stats['like_rate'].mean():.1%}\"\n",
    "        )\n",
    "        print(\n",
    "            f\"  - Bot avg play per like: {bot_stats['avg_play_per_like'].mean():.2f} vs Normal: {normal_stats['avg_play_per_like'].mean():.2f}\"\n",
    "        )\n",
    "        print(\n",
    "            f\"  - Bot neutral listens: {bot_stats['neutral_listens'].mean():.0f} vs Normal: {normal_stats['neutral_listens'].mean():.0f}\"\n",
    "        )\n",
    "\n",
    "    return bots\n",
    "\n",
    "\n",
    "# Detect and filter bots\n",
    "bot_users = detect_bots(reactions_on_others)\n",
    "df_filtered = reactions_on_others[\n",
    "    ~reactions_on_others[\"user_id\"].isin(bot_users)\n",
    "].copy()\n",
    "print(\n",
    "    f\"\\nFiltered data shape: {df_filtered.shape} (removed {len(reactions_on_others) - len(df_filtered)} bot interactions)\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "7ce731fb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Analyzing clip popularity after bot filtering...\n",
      "Distribution of unique likers per clip:\n",
      "  - 1 unique liker(s): 103353 clips\n",
      "  - 2 unique liker(s): 20463 clips\n",
      "  - 3 unique liker(s): 8880 clips\n",
      "  - 4 unique liker(s): 4802 clips\n",
      "  - 5 unique liker(s): 2831 clips\n",
      "  - 6 unique liker(s): 1887 clips\n",
      "  - 7 unique liker(s): 1259 clips\n",
      "  - 8 unique liker(s): 871 clips\n",
      "  - 9 unique liker(s): 693 clips\n",
      "  - 10 unique liker(s): 518 clips\n",
      "  - 11+ unique likers: 2786 clips\n",
      "  - Max unique likers: 304\n"
     ]
    }
   ],
   "source": [
    "# Analyze clip popularity after bot filtering\n",
    "print(\"\\nAnalyzing clip popularity after bot filtering...\")\n",
    "likes_only = df_filtered[df_filtered[\"reaction_type\"] == \"L\"]\n",
    "clip_popularity = (\n",
    "    likes_only.groupby(\"clip_id\")[\"user_id\"].nunique().value_counts().sort_index()\n",
    ")\n",
    "\n",
    "print(f\"Distribution of unique likers per clip:\")\n",
    "for n_likers in range(1, min(11, len(clip_popularity) + 1)):\n",
    "    if n_likers in clip_popularity.index:\n",
    "        print(f\"  - {n_likers} unique liker(s): {clip_popularity[n_likers]} clips\")\n",
    "\n",
    "if clip_popularity.index.max() > 10:\n",
    "    print(\n",
    "        f\"  - 11+ unique likers: {clip_popularity[clip_popularity.index > 10].sum()} clips\"\n",
    "    )\n",
    "    print(f\"  - Max unique likers: {clip_popularity.index.max()}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "8b8d6f46",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "User Selectivity Weight Statistics:\n",
      "  - Total users: 149695\n",
      "  - Mean selectivity weight: 26.26\n",
      "  - Median selectivity weight: 20.00\n",
      "  - Max selectivity weight: 50.00\n",
      "  - Users with weight > 10: 92416\n",
      "  - Users with weight > 20: 67465\n",
      "\n",
      "Examples of user selectivity:\n",
      "Most selective users (high weight):\n",
      "         total_interactions  total_likes  selectivity_weight  like_rate\n",
      "user_id                                                                \n",
      "726                      16            0                50.0        0.0\n",
      "1878                      7            0                50.0        0.0\n",
      "2011                     16            0                50.0        0.0\n",
      "2205                     10            0                50.0        0.0\n",
      "2214                     19            0                50.0        0.0\n",
      "\n",
      "Least selective users (low weight):\n",
      "         total_interactions  total_likes  selectivity_weight  like_rate\n",
      "user_id                                                                \n",
      "115307                    5            3            1.612903        0.6\n",
      "211326                    5            3            1.612903        0.6\n",
      "964009                    5            3            1.612903        0.6\n",
      "1506566                   5            3            1.612903        0.6\n",
      "4740857                   5            3            1.612903        0.6\n",
      "\n",
      "Calculated selectivity weights for 149695 users\n"
     ]
    }
   ],
   "source": [
    "# Calculate user selectivity weights for PageRank\n",
    "def calculate_user_weights(df: pd.DataFrame) -> pd.DataFrame:\n",
    "    \"\"\"\n",
    "    Calculate selectivity weights for each user based on their like behavior.\n",
    "    Selective users (who like rarely) get higher weights.\n",
    "\n",
    "    Weight = total_interactions / total_likes\n",
    "    Example: 100 interactions, 4 likes → weight = 25\n",
    "    Example: 100 interactions, 50 likes → weight = 2\n",
    "    \"\"\"\n",
    "    user_weights = df.groupby(\"user_id\").agg(\n",
    "        {\n",
    "            \"clip_id\": \"count\",  # total interactions\n",
    "            \"reaction_type\": lambda x: (x == \"L\").sum(),  # total likes\n",
    "        }\n",
    "    )\n",
    "\n",
    "    user_weights.columns = [\"total_interactions\", \"total_likes\"]\n",
    "\n",
    "    # Calculate selectivity weight\n",
    "    # Add small epsilon to avoid division by zero\n",
    "    user_weights[\"selectivity_weight\"] = user_weights[\"total_interactions\"] / (\n",
    "        user_weights[\"total_likes\"] + 0.1\n",
    "    )\n",
    "\n",
    "    # Cap weights to avoid extreme values\n",
    "    # Max weight of 50 means even very selective users don't dominate completely\n",
    "    user_weights[\"selectivity_weight\"] = user_weights[\"selectivity_weight\"].clip(\n",
    "        upper=50\n",
    "    )\n",
    "\n",
    "    # Also calculate like rate for reference\n",
    "    user_weights[\"like_rate\"] = (\n",
    "        user_weights[\"total_likes\"] / user_weights[\"total_interactions\"]\n",
    "    )\n",
    "\n",
    "    print(\"User Selectivity Weight Statistics:\")\n",
    "    print(f\"  - Total users: {len(user_weights)}\")\n",
    "    print(\n",
    "        f\"  - Mean selectivity weight: {user_weights['selectivity_weight'].mean():.2f}\"\n",
    "    )\n",
    "    print(\n",
    "        f\"  - Median selectivity weight: {user_weights['selectivity_weight'].median():.2f}\"\n",
    "    )\n",
    "    print(f\"  - Max selectivity weight: {user_weights['selectivity_weight'].max():.2f}\")\n",
    "    print(\n",
    "        f\"  - Users with weight > 10: {len(user_weights[user_weights['selectivity_weight'] > 10])}\"\n",
    "    )\n",
    "    print(\n",
    "        f\"  - Users with weight > 20: {len(user_weights[user_weights['selectivity_weight'] > 20])}\"\n",
    "    )\n",
    "\n",
    "    # Show examples of selective vs non-selective users\n",
    "    print(\"\\nExamples of user selectivity:\")\n",
    "    print(\"Most selective users (high weight):\")\n",
    "    top_selective = user_weights.nlargest(5, \"selectivity_weight\")\n",
    "    print(\n",
    "        top_selective[\n",
    "            [\"total_interactions\", \"total_likes\", \"selectivity_weight\", \"like_rate\"]\n",
    "        ]\n",
    "    )\n",
    "\n",
    "    print(\"\\nLeast selective users (low weight):\")\n",
    "    bottom_selective = user_weights.nsmallest(5, \"selectivity_weight\")\n",
    "    print(\n",
    "        bottom_selective[\n",
    "            [\"total_interactions\", \"total_likes\", \"selectivity_weight\", \"like_rate\"]\n",
    "        ]\n",
    "    )\n",
    "\n",
    "    return user_weights\n",
    "\n",
    "\n",
    "# Calculate user weights after bot filtering\n",
    "user_weights = calculate_user_weights(df_filtered)\n",
    "print(f\"\\nCalculated selectivity weights for {len(user_weights)} users\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "d3d66032",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Clip quality metrics calculated with weighted likes.\n",
      "\n",
      "Clip statistics:\n",
      "  - Total clips: 525265\n",
      "  - Clips with 0 likes: 376922\n",
      "  - Clips with 1-2 likes: 123816\n",
      "  - Clips with 3+ likes: 24527\n",
      "  - Clips with enough unique likers (>=3): 24527\n",
      "\n",
      "Impact of selectivity weighting:\n",
      "  - Mean weight per like: 3.93\n",
      "  - Median weight per like: 2.61\n",
      "  - Max weight amplification: 50.00x\n",
      "\n",
      "Top 10 highest quality clips (with 3+ unique likers):\n",
      "                                      raw_likes  weighted_likes  \\\n",
      "clip_id                                                           \n",
      "e33e8ae1-cd85-4ee4-9618-f2f7f9275744        304     1907.391646   \n",
      "249ac1f8-991b-47f1-98d8-e916c0efd84b        242     1360.541376   \n",
      "0c8fc5be-8895-4ebe-a3f4-5d0f2d2adf66        175     1360.586210   \n",
      "20de0a6d-b89e-45a1-8c1d-7030c602fdd2        144     1218.807056   \n",
      "b8ce68e5-e36b-48ab-bd73-364eb878fc61        112     1184.624732   \n",
      "d03ed0c4-29ea-4a4f-8923-5f8aea1b926b        137     1144.951783   \n",
      "be52d814-b25c-4759-92f8-1737599355c3        149     1121.178632   \n",
      "671b0482-19e5-4d99-b962-2482d021bc0f        155     1069.817867   \n",
      "57654b51-0f61-4d00-8ed0-e8cfabc2f621        174     1037.222012   \n",
      "444b6eec-d131-4b6b-aeae-952be273eb85        131     1036.530994   \n",
      "\n",
      "                                      unique_likers  unique_users  \\\n",
      "clip_id                                                             \n",
      "e33e8ae1-cd85-4ee4-9618-f2f7f9275744          304.0          2927   \n",
      "249ac1f8-991b-47f1-98d8-e916c0efd84b          242.0          2867   \n",
      "0c8fc5be-8895-4ebe-a3f4-5d0f2d2adf66          175.0          4424   \n",
      "20de0a6d-b89e-45a1-8c1d-7030c602fdd2          144.0          1920   \n",
      "b8ce68e5-e36b-48ab-bd73-364eb878fc61          112.0          2565   \n",
      "d03ed0c4-29ea-4a4f-8923-5f8aea1b926b          137.0          4326   \n",
      "be52d814-b25c-4759-92f8-1737599355c3          149.0          3698   \n",
      "671b0482-19e5-4d99-b962-2482d021bc0f          155.0          2080   \n",
      "57654b51-0f61-4d00-8ed0-e8cfabc2f621          174.0          2037   \n",
      "444b6eec-d131-4b6b-aeae-952be273eb85          131.0          4134   \n",
      "\n",
      "                                      like_rate_per_user  avg_play_count  \\\n",
      "clip_id                                                                    \n",
      "e33e8ae1-cd85-4ee4-9618-f2f7f9275744            0.103825        1.376495   \n",
      "249ac1f8-991b-47f1-98d8-e916c0efd84b            0.084379        1.352633   \n",
      "0c8fc5be-8895-4ebe-a3f4-5d0f2d2adf66            0.039548        1.286618   \n",
      "20de0a6d-b89e-45a1-8c1d-7030c602fdd2            0.074961        1.313021   \n",
      "b8ce68e5-e36b-48ab-bd73-364eb878fc61            0.043648        1.245614   \n",
      "d03ed0c4-29ea-4a4f-8923-5f8aea1b926b            0.031662        1.254739   \n",
      "be52d814-b25c-4759-92f8-1737599355c3            0.040281        1.339913   \n",
      "671b0482-19e5-4d99-b962-2482d021bc0f            0.074483        1.258173   \n",
      "57654b51-0f61-4d00-8ed0-e8cfabc2f621            0.085378        1.275896   \n",
      "444b6eec-d131-4b6b-aeae-952be273eb85            0.031681        1.244557   \n",
      "\n",
      "                                      quality_score_norm  \n",
      "clip_id                                                   \n",
      "e33e8ae1-cd85-4ee4-9618-f2f7f9275744            1.000000  \n",
      "249ac1f8-991b-47f1-98d8-e916c0efd84b            0.713488  \n",
      "0c8fc5be-8895-4ebe-a3f4-5d0f2d2adf66            0.713400  \n",
      "20de0a6d-b89e-45a1-8c1d-7030c602fdd2            0.639166  \n",
      "b8ce68e5-e36b-48ab-bd73-364eb878fc61            0.621214  \n",
      "d03ed0c4-29ea-4a4f-8923-5f8aea1b926b            0.600427  \n",
      "be52d814-b25c-4759-92f8-1737599355c3            0.588126  \n",
      "671b0482-19e5-4d99-b962-2482d021bc0f            0.561158  \n",
      "57654b51-0f61-4d00-8ed0-e8cfabc2f621            0.544008  \n",
      "444b6eec-d131-4b6b-aeae-952be273eb85            0.543615  \n"
     ]
    }
   ],
   "source": [
    "# Step 2: Calculate Bot-Resistant Clip Quality Metrics with Weighted Likes\n",
    "def calculate_clip_quality(\n",
    "    df: pd.DataFrame, user_weights: pd.DataFrame\n",
    ") -> pd.DataFrame:\n",
    "    \"\"\"\n",
    "    Calculate quality metrics for clips using weighted likes from selective users.\n",
    "\n",
    "    Key insight: A like from a selective user (high weight) is worth more than\n",
    "    a like from someone who likes everything (low weight).\n",
    "    \"\"\"\n",
    "\n",
    "    # Get unique users per clip\n",
    "    unique_users_per_clip = df.groupby(\"clip_id\")[\"user_id\"].nunique()\n",
    "    likes_df = df[df[\"reaction_type\"] == \"L\"]\n",
    "    unique_likers = likes_df.groupby(\"clip_id\")[\"user_id\"].nunique()\n",
    "\n",
    "    # Calculate WEIGHTED likes - this is the key improvement\n",
    "    weighted_likes_by_clip = {}\n",
    "    for clip_id, clip_likes in likes_df.groupby(\"clip_id\"):\n",
    "        weighted_sum = 0\n",
    "        for _, like in clip_likes.iterrows():\n",
    "            user_id = like[\"user_id\"]\n",
    "            if user_id in user_weights.index:\n",
    "                # Use selectivity weight for this user\n",
    "                weight = user_weights.loc[user_id, \"selectivity_weight\"]\n",
    "            else:\n",
    "                weight = 1.0  # Default weight\n",
    "            weighted_sum += weight\n",
    "        weighted_likes_by_clip[clip_id] = weighted_sum\n",
    "\n",
    "    # Convert to Series\n",
    "    weighted_likes = pd.Series(weighted_likes_by_clip)\n",
    "\n",
    "    # Aggregate metrics\n",
    "    clip_metrics = df.groupby(\"clip_id\").agg(\n",
    "        {\n",
    "            \"user_id\": \"count\",  # total interactions\n",
    "            \"reaction_type\": [\n",
    "                lambda x: (x == \"L\").sum(),  # total likes (raw count)\n",
    "                lambda x: (x == \"D\").sum(),  # total dislikes\n",
    "            ],\n",
    "            \"play_count\": [\"mean\", \"sum\"],\n",
    "            \"flagged\": \"sum\",\n",
    "        }\n",
    "    )\n",
    "\n",
    "    clip_metrics.columns = [\n",
    "        \"total_interactions\",\n",
    "        \"raw_likes\",  # Changed from 'likes' to 'raw_likes' for clarity\n",
    "        \"dislikes\",\n",
    "        \"avg_play_count\",\n",
    "        \"total_play_count\",\n",
    "        \"flagged_count\",\n",
    "    ]\n",
    "\n",
    "    # Add metrics\n",
    "    clip_metrics[\"unique_likers\"] = unique_likers.fillna(0)\n",
    "    clip_metrics[\"unique_users\"] = unique_users_per_clip\n",
    "    clip_metrics[\"weighted_likes\"] = weighted_likes.fillna(0)  # NEW: weighted likes\n",
    "\n",
    "    # Calculate bot-resistant metrics\n",
    "    clip_metrics[\"like_rate_per_user\"] = clip_metrics[\"raw_likes\"] / (\n",
    "        clip_metrics[\"unique_users\"] + 1\n",
    "    )\n",
    "    clip_metrics[\"avg_play_per_liker\"] = clip_metrics[\"total_play_count\"] / (\n",
    "        clip_metrics[\"raw_likes\"] + 1\n",
    "    )\n",
    "    clip_metrics[\"flag_rate\"] = clip_metrics[\"flagged_count\"] / (\n",
    "        clip_metrics[\"total_interactions\"] + 1\n",
    "    )\n",
    "\n",
    "    # Calculate engagement diversity (std of play counts)\n",
    "    engagement_diversity = df.groupby(\"clip_id\")[\"play_count\"].std()\n",
    "    clip_metrics[\"engagement_diversity\"] = engagement_diversity.fillna(0)\n",
    "\n",
    "    # Filter out clips with too few likes to be meaningful\n",
    "    clip_metrics[\"has_enough_likes\"] = clip_metrics[\"unique_likers\"] >= 3\n",
    "\n",
    "    # Composite quality score using WEIGHTED likes\n",
    "    # Now selective users' likes contribute more to quality\n",
    "    clip_metrics[\"quality_score\"] = (\n",
    "        clip_metrics[\"weighted_likes\"]\n",
    "        * 0.4  # Weighted likes from selective users (KEY CHANGE)\n",
    "        + clip_metrics[\"like_rate_per_user\"] * 0.2  # % of listeners who liked it\n",
    "        + clip_metrics[\"avg_play_count\"] * 0.2  # Real engagement\n",
    "        + clip_metrics[\"engagement_diversity\"] * 0.1  # Diverse audience\n",
    "        + (1 - clip_metrics[\"flag_rate\"]) * 0.1  # Not problematic\n",
    "    )\n",
    "\n",
    "    # Set quality to 0 for clips without enough likes\n",
    "    clip_metrics.loc[~clip_metrics[\"has_enough_likes\"], \"quality_score\"] = 0\n",
    "\n",
    "    # Normalize quality score\n",
    "    min_score = clip_metrics[\"quality_score\"].min()\n",
    "    max_score = clip_metrics[\"quality_score\"].max()\n",
    "    clip_metrics[\"quality_score_norm\"] = (clip_metrics[\"quality_score\"] - min_score) / (\n",
    "        max_score - min_score + 1e-10\n",
    "    )\n",
    "\n",
    "    return clip_metrics\n",
    "\n",
    "\n",
    "# Calculate clip quality WITH user weights\n",
    "clip_quality = calculate_clip_quality(df_filtered, user_weights)\n",
    "print(\"Clip quality metrics calculated with weighted likes.\")\n",
    "\n",
    "# Show distribution of likes\n",
    "print(f\"\\nClip statistics:\")\n",
    "print(f\"  - Total clips: {len(clip_quality)}\")\n",
    "print(f\"  - Clips with 0 likes: {len(clip_quality[clip_quality['raw_likes'] == 0])}\")\n",
    "print(\n",
    "    f\"  - Clips with 1-2 likes: {len(clip_quality[(clip_quality['raw_likes'] >= 1) & (clip_quality['raw_likes'] <= 2)])}\"\n",
    ")\n",
    "print(f\"  - Clips with 3+ likes: {len(clip_quality[clip_quality['raw_likes'] >= 3])}\")\n",
    "print(\n",
    "    f\"  - Clips with enough unique likers (>=3): {len(clip_quality[clip_quality['has_enough_likes']])}\"\n",
    ")\n",
    "\n",
    "# Show impact of weighting\n",
    "print(f\"\\nImpact of selectivity weighting:\")\n",
    "liked_clips = clip_quality[clip_quality[\"raw_likes\"] > 0]\n",
    "if len(liked_clips) > 0:\n",
    "    weight_ratio = liked_clips[\"weighted_likes\"] / liked_clips[\"raw_likes\"]\n",
    "    print(f\"  - Mean weight per like: {weight_ratio.mean():.2f}\")\n",
    "    print(f\"  - Median weight per like: {weight_ratio.median():.2f}\")\n",
    "    print(f\"  - Max weight amplification: {weight_ratio.max():.2f}x\")\n",
    "\n",
    "print(f\"\\nTop 10 highest quality clips (with 3+ unique likers):\")\n",
    "top_quality_clips = clip_quality[clip_quality[\"has_enough_likes\"]].nlargest(\n",
    "    10, \"quality_score_norm\"\n",
    ")\n",
    "if len(top_quality_clips) > 0:\n",
    "    print(\n",
    "        top_quality_clips[\n",
    "            [\n",
    "                \"raw_likes\",\n",
    "                \"weighted_likes\",\n",
    "                \"unique_likers\",\n",
    "                \"unique_users\",\n",
    "                \"like_rate_per_user\",\n",
    "                \"avg_play_count\",\n",
    "                \"quality_score_norm\",\n",
    "            ]\n",
    "        ]\n",
    "    )\n",
    "else:\n",
    "    print(\"No clips found with 3+ unique likers!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f8a44973",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Building collaborative filtering graph...\n",
      "Building graph with 22959 users and 148343 clips\n",
      "Graph has 171302 nodes and 607896 edges\n",
      "  - User nodes: 22959\n",
      "  - Clip nodes: 148343\n",
      "  - Avg clips liked per user: 13.2\n",
      "  - Avg users per clip: 2.0\n"
     ]
    }
   ],
   "source": [
    "# Step 3: Simplified Collaborative Filtering Graph\n",
    "def build_collaborative_graph(\n",
    "    df: pd.DataFrame, user_weights: pd.DataFrame\n",
    ") -> nx.DiGraph:\n",
    "    \"\"\"\n",
    "    Build a simplified bipartite graph for collaborative filtering.\n",
    "\n",
    "    Core idea: A user's taste score comes from liking clips that other selective users also like.\n",
    "    - Selective users (high weight) strongly boost clips when they like them\n",
    "    - Users who like highly-boosted clips get higher taste scores\n",
    "    \"\"\"\n",
    "    G = nx.DiGraph()\n",
    "\n",
    "    # Only consider likes for collaborative filtering\n",
    "    likes_df = df[df[\"reaction_type\"] == \"L\"]\n",
    "\n",
    "    # Get unique users and clips that have likes\n",
    "    users_with_likes = likes_df[\"user_id\"].unique()\n",
    "    clips_with_likes = likes_df[\"clip_id\"].unique()\n",
    "\n",
    "    print(\n",
    "        f\"Building graph with {len(users_with_likes)} users and {len(clips_with_likes)} clips\"\n",
    "    )\n",
    "\n",
    "    # Add nodes\n",
    "    for uid in users_with_likes:\n",
    "        G.add_node(f\"u_{uid}\", bipartite=0, type=\"user\")\n",
    "    for cid in clips_with_likes:\n",
    "        G.add_node(f\"c_{cid}\", bipartite=1, type=\"clip\")\n",
    "\n",
    "    # Build edges\n",
    "    for _, like in likes_df.iterrows():\n",
    "        user_id = like[\"user_id\"]\n",
    "        clip_id = like[\"clip_id\"]\n",
    "        user_node = f\"u_{user_id}\"\n",
    "        clip_node = f\"c_{clip_id}\"\n",
    "\n",
    "        # Get user's selectivity weight\n",
    "        if user_id in user_weights.index:\n",
    "            weight = user_weights.loc[user_id, \"selectivity_weight\"]\n",
    "        else:\n",
    "            weight = 1.0\n",
    "\n",
    "        # User -> Clip: selective users boost clip importance\n",
    "        G.add_edge(user_node, clip_node, weight=weight)\n",
    "\n",
    "        # Clip -> User: clips pass score back, but INVERSELY weighted by selectivity\n",
    "        # This ensures selective users get MORE benefit from good clips\n",
    "        # Users who like everything get LESS benefit (diluted across too many clips)\n",
    "        clip_to_user_weight = weight / 10.0  # Higher selectivity = higher return flow\n",
    "        G.add_edge(clip_node, user_node, weight=clip_to_user_weight)\n",
    "\n",
    "    return G\n",
    "\n",
    "\n",
    "# Build the collaborative filtering graph\n",
    "print(\"\\nBuilding collaborative filtering graph...\")\n",
    "cf_graph = build_collaborative_graph(df_filtered, user_weights)\n",
    "print(\n",
    "    f\"Graph has {cf_graph.number_of_nodes()} nodes and {cf_graph.number_of_edges()} edges\"\n",
    ")\n",
    "\n",
    "# Show some statistics\n",
    "user_nodes = [n for n in cf_graph.nodes() if n.startswith(\"u_\")]\n",
    "clip_nodes = [n for n in cf_graph.nodes() if n.startswith(\"c_\")]\n",
    "print(f\"  - User nodes: {len(user_nodes)}\")\n",
    "print(f\"  - Clip nodes: {len(clip_nodes)}\")\n",
    "\n",
    "# Check connectivity\n",
    "avg_edges_per_user = sum(cf_graph.out_degree(u) for u in user_nodes) / len(user_nodes)\n",
    "avg_edges_per_clip = sum(cf_graph.out_degree(c) for c in clip_nodes) / len(clip_nodes)\n",
    "print(f\"  - Avg clips liked per user: {avg_edges_per_user:.1f}\")\n",
    "print(f\"  - Avg users per clip: {avg_edges_per_clip:.1f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "dba36132",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Running PageRank for collaborative filtering...\n",
      "PageRank completed!\n",
      "\n",
      "Score distribution:\n",
      "  - User scores: min=0.000001, max=0.003011\n",
      "  - Clip scores: min=0.000001, max=0.000548\n"
     ]
    }
   ],
   "source": [
    "# Step 4: Run PageRank for Collaborative Filtering\n",
    "print(\"\\nRunning PageRank for collaborative filtering...\")\n",
    "\n",
    "# Simple initialization - let the algorithm find taste through connections\n",
    "# PageRank will naturally flow from selective users (high weight edges) to clips they like,\n",
    "# and then to other users who like those same clips\n",
    "pagerank_scores = nx.pagerank(\n",
    "    cf_graph,\n",
    "    alpha=0.85,  # damping factor\n",
    "    weight=\"weight\",  # use edge weights\n",
    "    max_iter=100,\n",
    "    tol=1e-06,\n",
    ")\n",
    "\n",
    "print(\"PageRank completed!\")\n",
    "\n",
    "# Analyze score distribution\n",
    "user_scores = {\n",
    "    node: score for node, score in pagerank_scores.items() if node.startswith(\"u_\")\n",
    "}\n",
    "clip_scores = {\n",
    "    node: score for node, score in pagerank_scores.items() if node.startswith(\"c_\")\n",
    "}\n",
    "\n",
    "print(f\"\\nScore distribution:\")\n",
    "print(\n",
    "    f\"  - User scores: min={min(user_scores.values()):.6f}, max={max(user_scores.values()):.6f}\"\n",
    ")\n",
    "print(\n",
    "    f\"  - Clip scores: min={min(clip_scores.values()):.6f}, max={max(clip_scores.values()):.6f}\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2d005acf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Top clips by PageRank score (these should be liked by selective users):\n",
      "\n",
      "Top 10 clips:\n",
      "                                   clip_id  pagerank_score  num_likers  \\\n",
      "42    e33e8ae1-cd85-4ee4-9618-f2f7f9275744        0.000548         304   \n",
      "551   249ac1f8-991b-47f1-98d8-e916c0efd84b        0.000408         242   \n",
      "163   0c8fc5be-8895-4ebe-a3f4-5d0f2d2adf66        0.000366         175   \n",
      "3721  6636284a-c63a-4994-9077-0cdb98d349e4        0.000323         200   \n",
      "1094  be52d814-b25c-4759-92f8-1737599355c3        0.000310         149   \n",
      "655   57654b51-0f61-4d00-8ed0-e8cfabc2f621        0.000305         174   \n",
      "6646  20de0a6d-b89e-45a1-8c1d-7030c602fdd2        0.000302         144   \n",
      "74    d03ed0c4-29ea-4a4f-8923-5f8aea1b926b        0.000298         137   \n",
      "2513  adb745e4-835e-44f0-8775-7c22ef0dac33        0.000297         186   \n",
      "3548  671b0482-19e5-4d99-b962-2482d021bc0f        0.000293         155   \n",
      "\n",
      "      total_weight  avg_weight  \n",
      "42     1907.391646    6.274315  \n",
      "551    1360.541376    5.622072  \n",
      "163    1360.586210    7.774778  \n",
      "3721    977.700749    4.888504  \n",
      "1094   1121.178632    7.524689  \n",
      "655    1037.222012    5.961046  \n",
      "6646   1218.807056    8.463938  \n",
      "74     1144.951783    8.357312  \n",
      "2513    932.395550    5.012879  \n",
      "3548   1069.817867    6.902051  \n",
      "\n",
      "\n",
      "Checking if selective users' likes boost clips:\n",
      "\n",
      "Clips liked by highly selective users (avg weight > 10):\n",
      "                                    clip_id  pagerank_score  num_likers  \\\n",
      "170    b8ce68e5-e36b-48ab-bd73-364eb878fc61        0.000273         112   \n",
      "9598   814f6a8e-dc37-4b3b-92c3-cf6ced5d3707        0.000091          35   \n",
      "31974  f2748eba-f40f-4c34-9aec-991c88003c03        0.000058          24   \n",
      "25039  a1416c02-46e6-47ca-b073-0a0a57eb653c        0.000052          20   \n",
      "16158  71d045df-22f4-4801-8b93-7d9c77fd7247        0.000050          19   \n",
      "1678   90f6fca1-bfa2-42cb-aee3-8158e1674b11        0.000046          18   \n",
      "13616  b278585f-115c-4c3a-aff6-65d9cf67426a        0.000042          17   \n",
      "20572  b3d2d1d6-152e-41dc-bd5b-63d851a23fe8        0.000040          18   \n",
      "1110   62bf3ade-e015-4bb0-99e1-d74ea0859bb8        0.000040          15   \n",
      "30726  25add1d3-7d3c-48dc-8cfa-c5cdfefa637e        0.000039          13   \n",
      "\n",
      "       avg_weight  \n",
      "170     10.577007  \n",
      "9598    10.704945  \n",
      "31974   10.942087  \n",
      "25039   11.285176  \n",
      "16158   12.578871  \n",
      "1678    11.566355  \n",
      "13616   10.053759  \n",
      "20572   10.771132  \n",
      "1110    11.142277  \n",
      "30726   12.733145  \n"
     ]
    }
   ],
   "source": [
    "# Analyze which clips got highest scores (should be those liked by selective users)\n",
    "print(\"\\nTop clips by PageRank score (these should be liked by selective users):\")\n",
    "\n",
    "# Get clip scores with metadata\n",
    "clip_analysis = []\n",
    "for clip_node, score in clip_scores.items():\n",
    "    clip_id = clip_node[2:]\n",
    "\n",
    "    # Get who liked this clip and their weights\n",
    "    likers = []\n",
    "    total_weight = 0\n",
    "    for edge in cf_graph.in_edges(clip_node, data=True):\n",
    "        user_node = edge[0]\n",
    "        user_id = int(user_node[2:])\n",
    "        weight = edge[2][\"weight\"]\n",
    "        likers.append((user_id, weight))\n",
    "        total_weight += weight\n",
    "\n",
    "    clip_analysis.append(\n",
    "        {\n",
    "            \"clip_id\": clip_id,\n",
    "            \"pagerank_score\": score,\n",
    "            \"num_likers\": len(likers),\n",
    "            \"total_weight\": total_weight,\n",
    "            \"avg_weight\": total_weight / len(likers) if likers else 0,\n",
    "        }\n",
    "    )\n",
    "\n",
    "# Convert to DataFrame and sort\n",
    "clip_analysis_df = pd.DataFrame(clip_analysis)\n",
    "clip_analysis_df = clip_analysis_df.sort_values(\"pagerank_score\", ascending=False)\n",
    "\n",
    "print(\"\\nTop 10 clips:\")\n",
    "print(\n",
    "    clip_analysis_df.head(10)[\n",
    "        [\"clip_id\", \"pagerank_score\", \"num_likers\", \"total_weight\", \"avg_weight\"]\n",
    "    ]\n",
    ")\n",
    "\n",
    "# Check correlation between selectivity weight and PageRank score\n",
    "print(\"\\n\\nChecking if selective users' likes boost clips:\")\n",
    "high_weight_clips = clip_analysis_df[clip_analysis_df[\"avg_weight\"] > 10].head(10)\n",
    "print(f\"\\nClips liked by highly selective users (avg weight > 10):\")\n",
    "print(high_weight_clips[[\"clip_id\", \"pagerank_score\", \"num_likers\", \"avg_weight\"]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "dfba4ebc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total users with taste scores: 22959\n",
      "\n",
      "DEBUG: Investigating high like-rate users in results...\n",
      "Found 0 users with like_rate > 0.9 in the results\n",
      "\n",
      "Top 20 users with best taste:\n",
      "        user_id  taste_score  total_interactions  total_likes  like_rate  \\\n",
      "228    78364115     1.000000                6101         3653   0.598754   \n",
      "613    89271156     0.940431                6513         3380   0.518962   \n",
      "692    75567253     0.910769                7209         2128   0.295187   \n",
      "287    62795185     0.879819                5278         2818   0.533914   \n",
      "344    72663343     0.850619                4804         2428   0.505412   \n",
      "522     1173818     0.635328                4832         1451   0.300290   \n",
      "304    88712285     0.526536                3062         1343   0.438602   \n",
      "240    96883241     0.523078                4014          848   0.211261   \n",
      "668     5515095     0.491851                3300         1436   0.435152   \n",
      "93     28605241     0.441019                3308         1729   0.522672   \n",
      "1043   86854140     0.435734                3571         1109   0.310557   \n",
      "411    65956664     0.420605                2997         1532   0.511178   \n",
      "1648    6012821     0.419117                2956         1393   0.471245   \n",
      "2     100990846     0.416339                2449         1356   0.553695   \n",
      "201    95915360     0.415847                2877         1584   0.550574   \n",
      "250    86499376     0.387642                2278         1211   0.531607   \n",
      "703    85309214     0.375416                3069          861   0.280547   \n",
      "666    65961470     0.373401                2158         1179   0.546339   \n",
      "33     63392178     0.371392                3232         1452   0.449257   \n",
      "1013   76055629     0.369239                1847         1077   0.583108   \n",
      "\n",
      "      avg_play_count  unique_clips  \n",
      "228         1.165711          6101  \n",
      "613         1.445263          6513  \n",
      "692         1.287696          7209  \n",
      "287         1.709170          5278  \n",
      "344         1.201499          4804  \n",
      "522         1.152318          4832  \n",
      "304         1.183867          3062  \n",
      "240         1.059791          4014  \n",
      "668         1.115152          3300  \n",
      "93          1.174123          3308  \n",
      "1043        1.385046          3571  \n",
      "411         1.275609          2997  \n",
      "1648        1.502368          2956  \n",
      "2           1.265006          2449  \n",
      "201         1.278415          2877  \n",
      "250         1.165496          2278  \n",
      "703         1.327794          3069  \n",
      "666         1.132530          2158  \n",
      "33          1.626238          3232  \n",
      "1013        1.078506          1847  \n"
     ]
    }
   ],
   "source": [
    "# Step 5: Extract and Analyze User Taste Scores\n",
    "def extract_user_taste_scores(\n",
    "    pagerank_scores: Dict, df: pd.DataFrame, min_interactions: int = 1\n",
    ") -> pd.DataFrame:\n",
    "    \"\"\"Extract user taste scores from PageRank results.\"\"\"\n",
    "\n",
    "    # Extract user scores\n",
    "    user_scores = {}\n",
    "    for node, score in pagerank_scores.items():\n",
    "        if node.startswith(\"u_\"):\n",
    "            user_id = int(node[2:])\n",
    "            user_scores[user_id] = score\n",
    "\n",
    "    # Convert to dataframe\n",
    "    taste_df = pd.DataFrame(\n",
    "        list(user_scores.items()), columns=[\"user_id\", \"pagerank_score\"]\n",
    "    )\n",
    "\n",
    "    # Add user statistics\n",
    "    # FIX: Count ALL rows, not just non-null reaction_type\n",
    "    user_stats = df.groupby(\"user_id\").agg(\n",
    "        {\n",
    "            \"clip_id\": \"count\",  # total interactions (counts all rows)\n",
    "            \"reaction_type\": lambda x: (x == \"L\").sum(),  # likes\n",
    "            \"play_count\": \"mean\",\n",
    "        }\n",
    "    )\n",
    "\n",
    "    user_stats.columns = [\n",
    "        \"total_interactions\",\n",
    "        \"total_likes\",\n",
    "        \"avg_play_count\",\n",
    "    ]\n",
    "\n",
    "    # Add unique clips count separately\n",
    "    unique_clips = df.groupby(\"user_id\")[\"clip_id\"].nunique()\n",
    "    user_stats[\"unique_clips\"] = unique_clips\n",
    "\n",
    "    # Calculate like rate to identify potential bots that slipped through\n",
    "    user_stats[\"like_rate\"] = (\n",
    "        user_stats[\"total_likes\"] / user_stats[\"total_interactions\"]\n",
    "    )\n",
    "\n",
    "    taste_df = taste_df.merge(user_stats, on=\"user_id\", how=\"left\")\n",
    "\n",
    "    # Filter by minimum interactions\n",
    "    taste_df = taste_df[taste_df[\"total_interactions\"] >= min_interactions]\n",
    "\n",
    "    # Normalize PageRank scores\n",
    "    min_pr = taste_df[\"pagerank_score\"].min()\n",
    "    max_pr = taste_df[\"pagerank_score\"].max()\n",
    "    taste_df[\"taste_score\"] = (taste_df[\"pagerank_score\"] - min_pr) / (max_pr - min_pr)\n",
    "\n",
    "    # Sort by taste score\n",
    "    taste_df = taste_df.sort_values(\"taste_score\", ascending=False)\n",
    "    taste_df[\"rank\"] = range(1, len(taste_df) + 1)\n",
    "\n",
    "    return taste_df\n",
    "\n",
    "\n",
    "# Extract user taste scores\n",
    "user_taste_scores = extract_user_taste_scores(pagerank_scores, df_filtered)\n",
    "\n",
    "print(f\"Total users with taste scores: {len(user_taste_scores)}\")\n",
    "\n",
    "# Debug: Check why high like-rate users are appearing\n",
    "print(\"\\nDEBUG: Investigating high like-rate users in results...\")\n",
    "high_like_users = user_taste_scores[user_taste_scores[\"like_rate\"] > 0.9]\n",
    "print(f\"Found {len(high_like_users)} users with like_rate > 0.9 in the results\")\n",
    "\n",
    "if len(high_like_users) > 0:\n",
    "    print(\"\\nChecking top 3 high like-rate users:\")\n",
    "    for idx, (_, user) in enumerate(high_like_users.head(3).iterrows()):\n",
    "        uid = user[\"user_id\"]\n",
    "        print(f\"\\nUser {uid}:\")\n",
    "        print(f\"  - In bot_users set: {uid in bot_users}\")\n",
    "        print(\n",
    "            f\"  - Stats in df_filtered: {user['total_interactions']} interactions, {user['total_likes']} likes\"\n",
    "        )\n",
    "\n",
    "        # Check their original stats\n",
    "        orig_data = reactions_on_others[reactions_on_others[\"user_id\"] == uid]\n",
    "        print(\n",
    "            f\"  - Stats in original data: {len(orig_data)} interactions, {(orig_data['reaction_type'] == 'L').sum()} likes\"\n",
    "        )\n",
    "\n",
    "        # Check what interactions remain in df_filtered\n",
    "        filtered_data = df_filtered[df_filtered[\"user_id\"] == uid]\n",
    "        print(f\"  - Interactions in df_filtered: {len(filtered_data)}\")\n",
    "        if len(filtered_data) > 0:\n",
    "            print(\n",
    "                f\"    - Reaction types: {filtered_data['reaction_type'].value_counts().to_dict()}\"\n",
    "            )\n",
    "print(f\"\\nTop 20 users with best taste:\")\n",
    "print(\n",
    "    user_taste_scores.head(20)[\n",
    "        [\n",
    "            \"user_id\",\n",
    "            \"taste_score\",\n",
    "            \"total_interactions\",\n",
    "            \"total_likes\",\n",
    "            \"like_rate\",\n",
    "            \"avg_play_count\",\n",
    "            \"unique_clips\",\n",
    "        ]\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "8c28d47f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Checking specific users' taste scores...\n",
      "\n",
      "User 4619874 Analysis:\n",
      "  - PageRank score: 0.000169\n",
      "  - Selectivity weight: 2.90\n",
      "  - Total likes: 99\n",
      "\n",
      "  Clips this user liked:\n",
      "    - Clip ccbada7e-ec0...: score=0.000005\n",
      "    - Clip 2e0289e6-329...: score=0.000003\n",
      "    - Clip 0f623ce3-5db...: score=0.000003\n",
      "    - Clip 7678dcf5-aee...: score=0.000003\n",
      "    - Clip b482b47d-c88...: score=0.000003\n",
      "\n",
      "  Collaborative connections:\n",
      "  Users who like the same clips:\n",
      "    - User 51232507: weight=7.15\n",
      "    - User 101217203: weight=3.92\n",
      "    - User 65842865: weight=1.72\n",
      "    - User 34630406: weight=2.69\n",
      "    - User 74688582: weight=2.66\n"
     ]
    }
   ],
   "source": [
    "# Check specific user's taste score (for debugging)\n",
    "def check_user_taste(\n",
    "    user_id: int, pagerank_scores: dict, df: pd.DataFrame, user_weights: pd.DataFrame\n",
    "):\n",
    "    \"\"\"Check a specific user's taste score and understand why\"\"\"\n",
    "    user_node = f\"u_{user_id}\"\n",
    "\n",
    "    if user_node not in pagerank_scores:\n",
    "        print(f\"User {user_id} not found in PageRank scores (might not have any likes)\")\n",
    "        return\n",
    "\n",
    "    score = pagerank_scores[user_node]\n",
    "    print(f\"\\nUser {user_id} Analysis:\")\n",
    "    print(f\"  - PageRank score: {score:.6f}\")\n",
    "\n",
    "    # Get user's weight\n",
    "    if user_id in user_weights.index:\n",
    "        weight = user_weights.loc[user_id, \"selectivity_weight\"]\n",
    "        print(f\"  - Selectivity weight: {weight:.2f}\")\n",
    "    else:\n",
    "        print(f\"  - Selectivity weight: Not found (default 1.0)\")\n",
    "\n",
    "    # Get user's likes\n",
    "    user_likes = df[(df[\"user_id\"] == user_id) & (df[\"reaction_type\"] == \"L\")]\n",
    "    print(f\"  - Total likes: {len(user_likes)}\")\n",
    "\n",
    "    # Check what clips they liked and those clips' scores\n",
    "    if len(user_likes) > 0:\n",
    "        print(f\"\\n  Clips this user liked:\")\n",
    "        for _, like in user_likes.head(5).iterrows():\n",
    "            clip_id = like[\"clip_id\"]\n",
    "            clip_node = f\"c_{clip_id}\"\n",
    "            if clip_node in pagerank_scores:\n",
    "                clip_score = pagerank_scores[clip_node]\n",
    "                print(f\"    - Clip {clip_id[:12]}...: score={clip_score:.6f}\")\n",
    "            else:\n",
    "                print(f\"    - Clip {clip_id[:12]}...: not in graph\")\n",
    "\n",
    "    # Check who else likes the same clips (collaborative aspect)\n",
    "    print(f\"\\n  Collaborative connections:\")\n",
    "    shared_taste_users = set()\n",
    "    for _, like in user_likes.iterrows():\n",
    "        clip_id = like[\"clip_id\"]\n",
    "        # Find other users who liked this clip\n",
    "        other_likers = df[\n",
    "            (df[\"clip_id\"] == clip_id)\n",
    "            & (df[\"reaction_type\"] == \"L\")\n",
    "            & (df[\"user_id\"] != user_id)\n",
    "        ]\n",
    "        for other_uid in other_likers[\"user_id\"].unique()[:3]:  # Just show first 3\n",
    "            if other_uid in user_weights.index:\n",
    "                other_weight = user_weights.loc[other_uid, \"selectivity_weight\"]\n",
    "                shared_taste_users.add((other_uid, other_weight))\n",
    "\n",
    "    if shared_taste_users:\n",
    "        print(f\"  Users who like the same clips:\")\n",
    "        for other_uid, other_weight in list(shared_taste_users)[:5]:\n",
    "            print(f\"    - User {other_uid}: weight={other_weight:.2f}\")\n",
    "\n",
    "\n",
    "# Example: Check specific users\n",
    "print(\"Checking specific users' taste scores...\")\n",
    "# You can add specific user IDs here to debug\n",
    "example_users = [4619874]  # Add the user ID mentioned\n",
    "for uid in example_users:\n",
    "    check_user_taste(uid, pagerank_scores, df_filtered, user_weights)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "bd2f6a5e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== VALIDATION: Bot Detection Effectiveness ===\n",
      "✅ Bot detection successful: No users with like_rate > 80% in results\n",
      "\n",
      "=== Like Rate Distribution ===\n",
      "Overall like rate in data: 14.3%\n",
      "\n",
      "Top 100 users:\n",
      "  - Mean like rate: 42.8%\n",
      "  - Median like rate: 45.2%\n",
      "  - Max like rate: 59.9%\n",
      "  - Min like rate: 3.9%\n",
      "\n",
      "=== Selectivity Weights of Top Users ===\n",
      "User ID    | Like Rate | Selectivity Weight | Taste Score\n",
      "------------------------------------------------------------\n",
      "78364115.0 |    59.9% |               1.7 | 1.000\n",
      "89271156.0 |    51.9% |               1.9 | 0.940\n",
      "75567253.0 |    29.5% |               3.4 | 0.911\n",
      "62795185.0 |    53.4% |               1.9 | 0.880\n",
      "72663343.0 |    50.5% |               2.0 | 0.851\n",
      "1173818.0 |    30.0% |               3.3 | 0.635\n",
      "88712285.0 |    43.9% |               2.3 | 0.527\n",
      "96883241.0 |    21.1% |               4.7 | 0.523\n",
      "5515095.0 |    43.5% |               2.3 | 0.492\n",
      "28605241.0 |    52.3% |               1.9 | 0.441\n",
      "86854140.0 |    31.1% |               3.2 | 0.436\n",
      "65956664.0 |    51.1% |               2.0 | 0.421\n",
      "6012821.0 |    47.1% |               2.1 | 0.419\n",
      "100990846.0 |    55.4% |               1.8 | 0.416\n",
      "95915360.0 |    55.1% |               1.8 | 0.416\n",
      "86499376.0 |    53.2% |               1.9 | 0.388\n",
      "85309214.0 |    28.1% |               3.6 | 0.375\n",
      "65961470.0 |    54.6% |               1.8 | 0.373\n",
      "63392178.0 |    44.9% |               2.2 | 0.371\n",
      "76055629.0 |    58.3% |               1.7 | 0.369\n",
      "\n",
      "============================================================\n"
     ]
    }
   ],
   "source": [
    "# Validation: Ensure bot detection worked properly\n",
    "print(\"\\n=== VALIDATION: Bot Detection Effectiveness ===\")\n",
    "\n",
    "# Check if any high like-rate users made it through\n",
    "high_like_rate_threshold = 0.8\n",
    "high_like_rate_users = user_taste_scores[\n",
    "    user_taste_scores[\"like_rate\"] > high_like_rate_threshold\n",
    "]\n",
    "\n",
    "if len(high_like_rate_users) > 0:\n",
    "    print(\n",
    "        f\"⚠️  WARNING: Found {len(high_like_rate_users)} users with like_rate > {high_like_rate_threshold:.0%}!\"\n",
    "    )\n",
    "    print(\"These users should have been caught by bot detection:\")\n",
    "    print(\"\\nTop 10 high like-rate users that slipped through:\")\n",
    "    print(\n",
    "        high_like_rate_users.head(10)[\n",
    "            [\n",
    "                \"user_id\",\n",
    "                \"like_rate\",\n",
    "                \"total_interactions\",\n",
    "                \"total_likes\",\n",
    "                \"taste_score\",\n",
    "                \"rank\",\n",
    "            ]\n",
    "        ]\n",
    "    )\n",
    "\n",
    "    # Show examples of what they liked\n",
    "    print(\"\\nExamining what these users liked...\")\n",
    "    example_user = high_like_rate_users.iloc[0][\"user_id\"]\n",
    "    user_likes = df_filtered[\n",
    "        (df_filtered[\"user_id\"] == example_user) & (df_filtered[\"reaction_type\"] == \"L\")\n",
    "    ]\n",
    "    print(f\"User {example_user} liked {len(user_likes)} clips\")\n",
    "\n",
    "else:\n",
    "    print(\n",
    "        f\"✅ Bot detection successful: No users with like_rate > {high_like_rate_threshold:.0%} in results\"\n",
    "    )\n",
    "\n",
    "# Additional validation checks\n",
    "print(f\"\\n=== Like Rate Distribution ===\")\n",
    "print(\n",
    "    f\"Overall like rate in data: {(df_filtered['reaction_type'] == 'L').sum() / len(df_filtered):.1%}\"\n",
    ")\n",
    "print(f\"\\nTop 100 users:\")\n",
    "top_100 = user_taste_scores.head(100)\n",
    "print(f\"  - Mean like rate: {top_100['like_rate'].mean():.1%}\")\n",
    "print(f\"  - Median like rate: {top_100['like_rate'].median():.1%}\")\n",
    "print(f\"  - Max like rate: {top_100['like_rate'].max():.1%}\")\n",
    "print(f\"  - Min like rate: {top_100['like_rate'].min():.1%}\")\n",
    "\n",
    "# Check selectivity distribution\n",
    "print(f\"\\n=== Selectivity Weights of Top Users ===\")\n",
    "top_20 = user_taste_scores.head(20)\n",
    "print(\"User ID    | Like Rate | Selectivity Weight | Taste Score\")\n",
    "print(\"-\" * 60)\n",
    "for _, user in top_20.iterrows():\n",
    "    uid = user[\"user_id\"]\n",
    "    if uid in user_weights.index:\n",
    "        weight = user_weights.loc[uid, \"selectivity_weight\"]\n",
    "        print(\n",
    "            f\"{uid} | {user['like_rate']:8.1%} | {weight:17.1f} | {user['taste_score']:.3f}\"\n",
    "        )\n",
    "    else:\n",
    "        print(\n",
    "            f\"{uid} | {user['like_rate']:8.1%} | {'N/A':>17} | {user['taste_score']:.3f}\"\n",
    "        )\n",
    "\n",
    "print(\"\\n\" + \"=\" * 60)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "fc86a807",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Investigating potential bot-like behavior in top users:\n",
      "Users with taste_score > 0.8 and like_rate > 0.3:\n",
      "      user_id  taste_score  like_rate  total_interactions  total_likes\n",
      "228  78364115     1.000000   0.598754                6101         3653\n",
      "613  89271156     0.940431   0.518962                6513         3380\n",
      "287  62795185     0.879819   0.533914                5278         2818\n",
      "344  72663343     0.850619   0.505412                4804         2428\n",
      "\n",
      "WARNING: Found 4 users with high taste scores but also high like rates!\n",
      "These users might be sophisticated bots that like popular content.\n",
      "\n",
      "Like rate statistics for top 100 users:\n",
      "  - Mean like rate: 42.79%\n",
      "  - Max like rate: 59.88%\n",
      "  - Users with like_rate > 0.5: 36\n"
     ]
    }
   ],
   "source": [
    "# Check if high like-rate users are still getting high taste scores\n",
    "print(\"\\nInvestigating potential bot-like behavior in top users:\")\n",
    "print(\"Users with taste_score > 0.8 and like_rate > 0.3:\")\n",
    "suspicious_users = user_taste_scores[\n",
    "    (user_taste_scores[\"taste_score\"] > 0.8) & (user_taste_scores[\"like_rate\"] > 0.3)\n",
    "]\n",
    "print(\n",
    "    suspicious_users[\n",
    "        [\"user_id\", \"taste_score\", \"like_rate\", \"total_interactions\", \"total_likes\"]\n",
    "    ]\n",
    ")\n",
    "\n",
    "if len(suspicious_users) > 0:\n",
    "    print(\n",
    "        f\"\\nWARNING: Found {len(suspicious_users)} users with high taste scores but also high like rates!\"\n",
    "    )\n",
    "    print(\"These users might be sophisticated bots that like popular content.\")\n",
    "\n",
    "# Also check the like rate distribution among top users\n",
    "print(f\"\\nLike rate statistics for top 100 users:\")\n",
    "top_100 = user_taste_scores.head(100)\n",
    "print(f\"  - Mean like rate: {top_100['like_rate'].mean():.2%}\")\n",
    "print(f\"  - Max like rate: {top_100['like_rate'].max():.2%}\")\n",
    "print(f\"  - Users with like_rate > 0.5: {len(top_100[top_100['like_rate'] > 0.5])}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "be4f6c84",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Top 20 users with best taste:\n",
      "        user_id  taste_score  total_interactions  total_likes  like_rate  \\\n",
      "228    78364115     1.000000                6101         3653   0.598754   \n",
      "613    89271156     0.940431                6513         3380   0.518962   \n",
      "692    75567253     0.910769                7209         2128   0.295187   \n",
      "287    62795185     0.879819                5278         2818   0.533914   \n",
      "344    72663343     0.850619                4804         2428   0.505412   \n",
      "522     1173818     0.635328                4832         1451   0.300290   \n",
      "304    88712285     0.526536                3062         1343   0.438602   \n",
      "240    96883241     0.523078                4014          848   0.211261   \n",
      "668     5515095     0.491851                3300         1436   0.435152   \n",
      "93     28605241     0.441019                3308         1729   0.522672   \n",
      "1043   86854140     0.435734                3571         1109   0.310557   \n",
      "411    65956664     0.420605                2997         1532   0.511178   \n",
      "1648    6012821     0.419117                2956         1393   0.471245   \n",
      "2     100990846     0.416339                2449         1356   0.553695   \n",
      "201    95915360     0.415847                2877         1584   0.550574   \n",
      "250    86499376     0.387642                2278         1211   0.531607   \n",
      "703    85309214     0.375416                3069          861   0.280547   \n",
      "666    65961470     0.373401                2158         1179   0.546339   \n",
      "33     63392178     0.371392                3232         1452   0.449257   \n",
      "1013   76055629     0.369239                1847         1077   0.583108   \n",
      "\n",
      "      avg_play_count  \n",
      "228         1.165711  \n",
      "613         1.445263  \n",
      "692         1.287696  \n",
      "287         1.709170  \n",
      "344         1.201499  \n",
      "522         1.152318  \n",
      "304         1.183867  \n",
      "240         1.059791  \n",
      "668         1.115152  \n",
      "93          1.174123  \n",
      "1043        1.385046  \n",
      "411         1.275609  \n",
      "1648        1.502368  \n",
      "2           1.265006  \n",
      "201         1.278415  \n",
      "250         1.165496  \n",
      "703         1.327794  \n",
      "666         1.132530  \n",
      "33          1.626238  \n",
      "1013        1.078506  \n"
     ]
    }
   ],
   "source": [
    "# No second-pass filtering needed - bot detection handled in first pass\n",
    "print(\"\\nTop 20 users with best taste:\")\n",
    "print(\n",
    "    user_taste_scores.head(20)[\n",
    "        [\n",
    "            \"user_id\",\n",
    "            \"taste_score\",\n",
    "            \"total_interactions\",\n",
    "            \"total_likes\",\n",
    "            \"like_rate\",\n",
    "            \"avg_play_count\",\n",
    "        ]\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "d276aa71",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== MR TREE (User 4619874) ANALYSIS ===\n",
      "✅ Mr tree was NOT flagged as a bot\n",
      "\n",
      "Original data stats:\n",
      "  - Total interactions: 287\n",
      "  - Likes: 99\n",
      "  - Like rate: 34.5%\n",
      "\n",
      "Filtered data stats:\n",
      "  - Total interactions: 287\n",
      "  - Likes: 99\n",
      "\n",
      "✅ Mr tree IS in final taste scores!\n",
      "  - Taste score: 0.0556\n",
      "  - Rank: 322.0 out of 22959\n",
      "  - PageRank score: 0.000169\n",
      "  - Like rate: 34.5%\n",
      "\n",
      "Selectivity weight: 2.90\n"
     ]
    }
   ],
   "source": [
    "# Check Mr tree's status\n",
    "mr_tree_id = 4619874\n",
    "print(f\"\\n=== MR TREE (User {mr_tree_id}) ANALYSIS ===\")\n",
    "\n",
    "# Check if in bot_users\n",
    "if mr_tree_id in bot_users:\n",
    "    print(f\"❌ Mr tree was incorrectly flagged as a bot!\")\n",
    "else:\n",
    "    print(f\"✅ Mr tree was NOT flagged as a bot\")\n",
    "\n",
    "# Check stats in original data\n",
    "mr_tree_orig = reactions_on_others[reactions_on_others[\"user_id\"] == mr_tree_id]\n",
    "print(f\"\\nOriginal data stats:\")\n",
    "print(f\"  - Total interactions: {len(mr_tree_orig)}\")\n",
    "print(f\"  - Likes: {(mr_tree_orig['reaction_type'] == 'L').sum()}\")\n",
    "print(\n",
    "    f\"  - Like rate: {(mr_tree_orig['reaction_type'] == 'L').sum() / len(mr_tree_orig):.1%}\"\n",
    ")\n",
    "\n",
    "# Check if in filtered data\n",
    "mr_tree_filtered = df_filtered[df_filtered[\"user_id\"] == mr_tree_id]\n",
    "print(f\"\\nFiltered data stats:\")\n",
    "print(f\"  - Total interactions: {len(mr_tree_filtered)}\")\n",
    "print(f\"  - Likes: {(mr_tree_filtered['reaction_type'] == 'L').sum()}\")\n",
    "\n",
    "# Check if in user_taste_scores\n",
    "mr_tree_taste = user_taste_scores[user_taste_scores[\"user_id\"] == mr_tree_id]\n",
    "if len(mr_tree_taste) > 0:\n",
    "    print(f\"\\n✅ Mr tree IS in final taste scores!\")\n",
    "    print(f\"  - Taste score: {mr_tree_taste.iloc[0]['taste_score']:.4f}\")\n",
    "    print(f\"  - Rank: {mr_tree_taste.iloc[0]['rank']} out of {len(user_taste_scores)}\")\n",
    "    print(f\"  - PageRank score: {mr_tree_taste.iloc[0]['pagerank_score']:.6f}\")\n",
    "    print(f\"  - Like rate: {mr_tree_taste.iloc[0]['like_rate']:.1%}\")\n",
    "else:\n",
    "    print(f\"\\n❌ Mr tree is NOT in final taste scores!\")\n",
    "\n",
    "# Check selectivity weight\n",
    "if mr_tree_id in user_weights.index:\n",
    "    print(\n",
    "        f\"\\nSelectivity weight: {user_weights.loc[mr_tree_id, 'selectivity_weight']:.2f}\"\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "45d9747e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== VALIDATION: Selective vs Indiscriminate Users ===\n",
      "\n",
      "Top 100 users:\n",
      "  - Mean like rate: 42.8%\n",
      "  - Median like rate: 45.2%\n",
      "  - Users with like_rate < 20%: 6\n",
      "  - Users with like_rate < 40%: 35\n",
      "  - Users with like_rate > 60%: 0\n",
      "\n",
      "Bottom 100 users:\n",
      "  - Mean like rate: 49.8%\n",
      "  - Median like rate: 50.0%\n",
      "\n",
      "✅ SUCCESS: No users with >60% like rate in top 100!\n",
      "\n",
      "Correlation between like_rate and taste_score: 0.152\n",
      "❌ Problem: Positive correlation means indiscriminate users get higher scores\n"
     ]
    }
   ],
   "source": [
    "# Validate that selective users get higher scores\n",
    "print(\"\\n=== VALIDATION: Selective vs Indiscriminate Users ===\")\n",
    "\n",
    "# Check like rate distribution in top users\n",
    "top_100 = user_taste_scores.head(100)\n",
    "bottom_100 = user_taste_scores.tail(100)\n",
    "\n",
    "print(f\"\\nTop 100 users:\")\n",
    "print(f\"  - Mean like rate: {top_100['like_rate'].mean():.1%}\")\n",
    "print(f\"  - Median like rate: {top_100['like_rate'].median():.1%}\")\n",
    "print(f\"  - Users with like_rate < 20%: {len(top_100[top_100['like_rate'] < 0.2])}\")\n",
    "print(f\"  - Users with like_rate < 40%: {len(top_100[top_100['like_rate'] < 0.4])}\")\n",
    "print(f\"  - Users with like_rate > 60%: {len(top_100[top_100['like_rate'] > 0.6])}\")\n",
    "\n",
    "print(f\"\\nBottom 100 users:\")\n",
    "print(f\"  - Mean like rate: {bottom_100['like_rate'].mean():.1%}\")\n",
    "print(f\"  - Median like rate: {bottom_100['like_rate'].median():.1%}\")\n",
    "\n",
    "# Check if any high like-rate users are in top 100\n",
    "high_like_in_top = top_100[top_100[\"like_rate\"] > 0.6]\n",
    "if len(high_like_in_top) > 0:\n",
    "    print(\n",
    "        f\"\\n⚠️  WARNING: Found {len(high_like_in_top)} users with >60% like rate in top 100!\"\n",
    "    )\n",
    "    print(\"These users might still be gaming the system:\")\n",
    "    print(\n",
    "        high_like_in_top[\n",
    "            [\"user_id\", \"like_rate\", \"total_interactions\", \"taste_score\"]\n",
    "        ].head()\n",
    "    )\n",
    "else:\n",
    "    print(f\"\\n✅ SUCCESS: No users with >60% like rate in top 100!\")\n",
    "\n",
    "# Check correlation between selectivity and taste score\n",
    "if len(user_taste_scores) > 10:\n",
    "    correlation = user_taste_scores[\"like_rate\"].corr(user_taste_scores[\"taste_score\"])\n",
    "    print(f\"\\nCorrelation between like_rate and taste_score: {correlation:.3f}\")\n",
    "    if correlation < 0:\n",
    "        print(\"✅ Good: Negative correlation means selective users get higher scores\")\n",
    "    else:\n",
    "        print(\n",
    "            \"❌ Problem: Positive correlation means indiscriminate users get higher scores\"\n",
    "        )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "9b8c028e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Validation Results:\n",
      "Average quality of clips liked by top 100 taste users: 0.005\n",
      "Average quality of clips liked by bottom 100 taste users: 0.261\n",
      "Quality difference: -0.256\n",
      "\n",
      "Average like rate of top 100 users: 42.79%\n",
      "Average like rate of bottom 100 users: 49.83%\n",
      "\n",
      "Overlap in liked clips between top and bottom users: 0.1%\n"
     ]
    }
   ],
   "source": [
    "# Step 6: Validation - Check if high-taste users like similar quality clips\n",
    "def validate_taste_scores(\n",
    "    user_taste_scores: pd.DataFrame,\n",
    "    df: pd.DataFrame,\n",
    "    clip_quality: pd.DataFrame,\n",
    "    top_n: int = 100,\n",
    ") -> None:\n",
    "    \"\"\"Validate that high-taste users tend to like high-quality clips.\"\"\"\n",
    "\n",
    "    # Get top taste users\n",
    "    top_users = user_taste_scores.head(top_n)[\"user_id\"].tolist()\n",
    "    bottom_users = user_taste_scores.tail(top_n)[\"user_id\"].tolist()\n",
    "\n",
    "    # Get clips liked by each group\n",
    "    top_user_likes = df[(df[\"user_id\"].isin(top_users)) & (df[\"reaction_type\"] == \"L\")][\n",
    "        \"clip_id\"\n",
    "    ].tolist()\n",
    "    bottom_user_likes = df[\n",
    "        (df[\"user_id\"].isin(bottom_users)) & (df[\"reaction_type\"] == \"L\")\n",
    "    ][\"clip_id\"].tolist()\n",
    "\n",
    "    # Calculate average quality of liked clips\n",
    "    top_clips_quality = clip_quality.loc[\n",
    "        clip_quality.index.isin(top_user_likes), \"quality_score_norm\"\n",
    "    ].mean()\n",
    "\n",
    "    bottom_clips_quality = clip_quality.loc[\n",
    "        clip_quality.index.isin(bottom_user_likes), \"quality_score_norm\"\n",
    "    ].mean()\n",
    "\n",
    "    print(f\"Validation Results:\")\n",
    "    print(\n",
    "        f\"Average quality of clips liked by top {top_n} taste users: {top_clips_quality:.3f}\"\n",
    "    )\n",
    "    print(\n",
    "        f\"Average quality of clips liked by bottom {top_n} taste users: {bottom_clips_quality:.3f}\"\n",
    "    )\n",
    "    print(f\"Quality difference: {top_clips_quality - bottom_clips_quality:.3f}\")\n",
    "\n",
    "    # Also show like rates\n",
    "    top_users_df = user_taste_scores[user_taste_scores[\"user_id\"].isin(top_users)]\n",
    "    bottom_users_df = user_taste_scores[user_taste_scores[\"user_id\"].isin(bottom_users)]\n",
    "    print(\n",
    "        f\"\\nAverage like rate of top {top_n} users: {top_users_df['like_rate'].mean():.2%}\"\n",
    "    )\n",
    "    print(\n",
    "        f\"Average like rate of bottom {top_n} users: {bottom_users_df['like_rate'].mean():.2%}\"\n",
    "    )\n",
    "\n",
    "    # Check overlap in liked clips\n",
    "    top_clips_set = set(top_user_likes)\n",
    "    bottom_clips_set = set(bottom_user_likes)\n",
    "    overlap = len(top_clips_set & bottom_clips_set) / len(\n",
    "        top_clips_set | bottom_clips_set\n",
    "    )\n",
    "    print(f\"\\nOverlap in liked clips between top and bottom users: {overlap:.1%}\")\n",
    "\n",
    "\n",
    "validate_taste_scores(user_taste_scores, df_filtered, clip_quality)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "636d2ce8",
   "metadata": {},
   "source": [
    "## Key Issue Found\n",
    "\n",
    "The main problem is that users with 99%+ like rates are appearing in the top results. This happens because:\n",
    "\n",
    "1. **Bot detection threshold is too lenient**: Only flags users with >50% like rate AND >50 interactions\n",
    "2. **These users ARE in df_filtered**: They passed through bot detection somehow\n",
    "3. **PageRank rewards them**: Users who like everything get high scores if they like popular content\n",
    "\n",
    "Run the notebook with the debug code to see exactly what's happening with these suspicious users.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "1c56367e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAPdCAYAAABlRyFLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hU1dr38d9MJoVJMkMIgQBSooggYCg2UEFaBAFRQfToOYIdsIPiwQKIBfAcQURERZoNsSJIiyBSBFEDhK6UgBBSCWRCJpm0/f7Bk3kdkkACA5PkfD/XtZ7jrL1m73vPHnjWvllzb5MkQwAAAAAAAAAAoASzrwMAAAAAAAAAAKCyIokOAAAAAAAAAEAZSKIDAAAAAAAAAFAGkugAAAAAAAAAAJSBJDoAAAAAAAAAAGUgiQ4AAAAAAAAAQBlIogMAAAAAAAAAUAaS6AAAAAAAAAAAlIEkOgAAAAAAAAAAZSCJDlRhY8aMkWEYF+RYq1at0qpVq9yvO3fuLMMw1L9//wty/NmzZyshIeGCHOtsBQcHa8aMGUpKSpJhGJo8ebKvQ8L/uMWLF+uDDz7wdRhVRnn/XnvkkUd08OBBBQQEXKDIAAAAAAC+RBIdqCQGDRokwzDcLScnR4mJiVq2bJkef/xxhYSEeOU49erV05gxYxQdHe2V/XlTZY6tPJ5//nkNHjxY06dP1z//+U99/PHHZY41DENTp04tdVv//v1lGIY6d+58vkItl8aNG3t8J0/XGjdufM7HO5/Xv3bt2nrrrbe0a9cuOZ1OpaSkaOPGjZowYYKCg4O9frzKoGPHjoqJidHEiRPdfcVJ4uKWl5enffv2ae7cuYqKivJhtP/fqd+tzMxM/fTTT7r55pt9HZrbnDlzFBAQoEceecTXoQAAcN6Vdz7ojblrjRo1NGbMmPMyDw4ODtbYsWO1bds2nThxQunp6dq8ebPeeust1atXz+vHq8pOvTc9tV1zzTW+DvF/RlW/RwaqE4uvAwDg6aWXXlJCQoL8/f0VGRmpG2+8UW+99ZaGDx+uW265Rdu2bXOPffXVVzVhwoQK7b9+/foaO3asDhw4oPj4+HK/LyYmpkLHORuni+2hhx6S2Vy5/92va9eu+uWXXzRu3Dhfh+IVaWlp+uc//+nRN2LECF100UV6+umnS4w9V2f73TyTsLAw/f7777LZbJo1a5Z2796t8PBwXXHFFRo6dKimT5+u7Oxsrx2vsnj22We1cuVK7du3r8S2KVOm6LfffpO/v7/atWunhx9+WL1791br1q2VlJTkg2g9xcbG6qOPPpLJZFLjxo01dOhQLVq0SL169VJsbKyvw5PL5dLcuXM1fPjwMv8xDACA6uLU+eC9996rmJiYEv27du0652NZrVaNHTtWY8eO1erVq895f8UsFovWrFmj5s2ba+7cuZo6dapCQkLUsmVL3X333fr2228rxRyosim+Nz3V3r17fRDN/6bzdY8EoOJIogOVzNKlSxUXF+d+PWHCBHXp0kXff/+9Fi5cqBYtWig3N1eSVFhYqMLCwvMaT40aNZSTk6P8/PzzepwzKSgo8Onxy6NOnTrauXOnr8M4K8XX+e+cTqc+/fRTj7677rpLYWFhJforswceeECNGzdWx44dtWHDBo9toaGhysvLu2CxWK1WOZ3O836ciIgI9e7dW0OGDCl1+9q1a/X1119LOrmq+s8//9TUqVM1aNCgCv/D3Pnw559/enzHvv76a+3atUtPPvlkpUiiS9IXX3yh5557Tl26dPEodQUAQHVz6rzv2muvVUxMTJWaD956661q166d7r77bs2bN89jW2Bg4AUt0Xah5oPecOq9KQD8L6vcyzoBSDpZj/yVV15RkyZNPFZ8lFYTvXv37lq7dq2OHTumrKws7d69W6+99pqkk6Ucfv/9d0knE2fFP8cbNGiQ+zjbtm1Tu3bttHr1amVnZ+v11193bystUeTn56fXXntNSUlJOnHihL777jtddNFFHmMSEhI0e/bsUs+reJ9niq20muhWq1X//e9/9ddffyk3N1e7d+/WiBEjShynuHRKv379tG3bNuXm5mr79u266aabyvrIPUREROjDDz9UcnKycnJytGXLFt17773u7cUlMi6++GL16dPHqyVOijVt2lRfffWVkpKSlJOTo0OHDmnevHmy2Wwe4+655x79/vvvcjqdOnr0qObNm1fiepzuOp+NESNG6Oeff1Z6erqcTqd+//33UmtKn8t3U5KuvvpqLV26VMePH1d2drZ++ukndezY8YzxXXLJJSooKNAvv/xSYltWVpZcLpdH39VXX63FixcrIyNDJ06cUHx8vJ544gmPMV26dNGaNWt04sQJHTt2TAsWLFDz5s09xhT/+WzRooU+/fRTZWRkaN26de7t5blW5b3up+rdu7f8/f21YsWKM34+kvTjjz9Kkruky+DBg7Vy5UqlpKQoNzdXO3bsKDUhbzKZNGbMGCUmJio7O1s//vijWrRoUeqfebvdrsmTJ7v/vO7Zs0cjR46UyWQ6Y3y7d+9WWlqaLrnkEo/+W265Rd9//70SExOVm5urvXv36sUXXyzxq5Xi73yLFi30448/Kjs7W4cPH9azzz57xmMHBARo0aJFOn78uDp06ODu37Rpk44ePap+/fqdcR8AAFR35Z07tG/fXsuWLVNaWpqcTqf279+vmTNnSjpZSjA9PV2SNHbsWPd8cMyYMe73X3bZZfryyy919OhR5eTk6LffflPfvn3PGF/xHOLnn38usc3lcikrK8uj77LLLtP8+fOVmpoqp9Op3bt369VXX/UY06ZNGy1ZskSZmZnKysrSihUrSpQ5KS6L0qlTJ02bNk0pKSk6fPiwe3vPnj3dc0qHw6Hvv/9el19++WnPpX379jIMw+N+pFhMTIwMw1Dv3r0lSSEhIZo8ebISEhKUm5urlJQUxcbGqm3btqc9RnkVl38cMWKEHnroIe3du1e5ubn69ddfdeWVV5YYP2DAAO3YsUM5OTnatm2bbr311lLv88p7fxEUFKQpU6YoLS1NDodD3333nerXr1/ieyOdXNE9c+ZMJScnu+8H77vvPo8xxfd1d9xxh0aPHq3Dhw/L4XDoyy+/lM1mU0BAgCZPnqyUlBRlZWVp1qxZpf4DTEXuyU43Py3PPRKAC4eV6EAV8fHHH2v8+PGKiYnRhx9+WOqYyy+/XN9//722bt2q0aNHy+VyqWnTprruuusknfyJ5UsvvaRXXnlF77//vtauXStJWr9+vXsf4eHhWrp0qT7//HN98sknSklJOW1cL7zwggzD0MSJE1WnTh099dRTWrFihdq0aeNeMV8e5YntVAsXLlSXLl00c+ZMbdmyRTfddJP++9//qkGDBho+fLjH2Ouvv16333673n33XWVlZemJJ57Q119/rUaNGikjI6PMYwQFBemnn35S06ZN9c477yghIUF33HGH5s6dq5o1a+rtt9/Wrl279M9//lOTJ0/W4cOH9eabb0ryTokTSfL399fy5csVGBioqVOnKjk5WQ0aNFCfPn1Us2ZNORwOSSdrsr/yyiv64osv9OGHHyoiIkKPP/641qxZo7Zt2yozM9O9z4pe59N58skntXDhQn366acKCAjQXXfdpa+++kq9e/fWkiVLJJ37d7NLly7ulTAvv/yyioqKdN999+nHH3/UDTfcoN9++63M+A4ePCiLxaJ//etf+uijj057Lt27d9f333+vpKQkTZkyRcnJyWrRooX69Omjt99+W5LUrVs3LV26VPv379fYsWNVo0YNPf744/r555/Vrl07HTx40GOfX375pfbs2aPnn3/enTAuz7Uq73UvTceOHZWenq6//vrrtOdbrPjG8ujRo5KkoUOHaseOHVq4cKEKCgrUt29fTZ8+XWazWe+++677fePHj9dzzz2nhQsXavny5YqOjtby5csVFBTksf8aNWpo9erVatCggd5//3399ddf6tixo8aPH6969eqVKA90KpvNprCwsBKlaQYPHqwTJ05o0qRJOnHihLp27apXXnlFNptNI0eO9BgbFhamZcuW6ZtvvtEXX3yhAQMG6I033tC2bdu0bNmyUo8bFBSk7777TldeeaW6d+/uvokptmnTJvd3GACA/2XlmTtEREQoNjZWaWlpmjBhgo4fP64mTZro9ttvl3Ry7jxkyBC99957+uabb/TNN99IkrZu3Srp5Hzy559/VmJioiZMmKDs7GwNHDhQCxYsUP/+/bVgwYIy4yuen917770lkuGnat26tdauXav8/Hx98MEHOnDggC655BL17dtXL774ojuWtWvXyuFw6I033lB+fr4eeeQR/fTTT+rcubN+/fVXj32+++67SktL07hx49zP4/nnP/+puXPnavny5XruuedktVo1dOhQrVu3Tm3bti0xpywWFxenffv2aeDAgSXmtnfeeacyMjK0fPlySdJ7772nAQMG6J133tHOnTsVHh6u66+/Xi1atNDmzZtP+zlIJxdBhIeHe/QZhlHi/unuu+9WaGio3n//fRmGoZEjR+qbb77RxRdf7P5F8c0336z58+dr27ZtGjVqlMLCwjRz5kwlJiaWOG557i+kk4nlO++8Ux999JF++eUXde7cWYsXLy6xvzp16uiXX36RYRh65513lJaWpl69emnWrFmy2WyaMmWKx/hRo0YpJydHEyZMUNOmTfX4448rPz9fRUVFCgsL09ixY3XttdfqvvvuU0JCgl555RX3eytyT3am+enZ3CMDOL8MGo3m+zZo0CDDMAyjffv2ZY45duyYERcX5349ZswYwzi5FN2QZDz55JOGYRhGeHh4mfto3769YRiGMWjQoBLbVq1aZRiGYTz88MOlblu1apX7defOnQ3DMIxDhw4ZISEh7v4BAwYYhmEYjz/+uLsvISHBmD179hn3ebrYZs+ebSQkJLhf33LLLYZhGMbzzz/vMe6LL74wCgsLjYsvvtjdZxiGkZub69HXunVrwzAM49FHHz3tdXniiScMwzCMu+++291nsViMn3/+2XA4HB7nnpCQYCxatKhc19swDGPq1Kmlbuvfv79hGIbRuXNnQ5IRHR1tGIZh9O/fv8z9NWrUyMjPzzdGjRrl0d+yZUsjLy/Po/901/lMbdGiRR7XQZIRFBTk8dpisRhbt241VqxY4bXv5h9//GEsXbq0xHH37dtnLF++/LQx16lTx0hJSTEMwzB27txpvPvuu8Zdd91l2Gw2j3Fms9nYt2+fkZCQYNjt9jL3t2nTJiM5OdkICwvz+D4VFBQYc+bMcfcV//n89NNPz+palee6l9XWrFlj/PbbbyX6i//cDh482AgPDzciIyONXr16Gfv37zcKCwvdf/+cek0lGUuXLjX27t3r8bnm5eUZ33zzjce40aNHG4ZhePyZf+GFF4ysrCyjadOmHmNff/11Iz8/37jooos8/mzMmDHDCA8PN2rXrm20a9fOWLJkiWEYhjFixIjTfvckGdOnTzdOnDhhBAQElPjO//Of/3T3+fv7G0eOHDG+/PLLEp9P//79jeDgYGPVqlVGamqqER0dXern/N577xnZ2dkVvj40Go1Go1XlNnXqVI97EKl8c4d+/fqd8X4nPDzcMAzDGDNmTIltP/zwgxEfH+/x/+MlGevWrTP++OOP08YcFBRk7Nq1yzAMw0hISDBmzZpl3HfffUZERESJsT/99JORmZlpNGzYsMz9ffPNN0Zubq4RFRXl7ouMjDQyMzONn376yd1XfI+3Zs0aw2w2u/uDg4ONjIwM4/333/fYb506dYxjx46V6D+1vfbaa4bL5TJq1qzp7vP39zcyMjKMDz/80N137NixMu85TteK4y5NTk6Oe1zjxo0NwzCMtLQ0j1j69u1rGIZh9O7d290XHx9v/PXXX0ZwcLC7r1OnTu5rcrrvU2n3F23btjUMwzAmTZrkMXbWrFklvkMzZswwEhMTjVq1anmM/eyzz4xjx465j1c8F9y6dathsVjc4z799FOjsLDQWLx4scf7f/75Z4/Yz+ae7Ezz09PdI9FotAvbKOcCVCEnTpxQaGhomduPHz8uSerXr1+5SiSUJjc3t9TSK2X56KOPdOLECffrr776SkeOHNHNN998Vscvr5tvvlkFBQXu1cHF3nzzTZnNZvXq1cujf8WKFdq/f7/79bZt25SZmamLL774jMdJSkryqJ1YfNzQ0FB17tzZC2dzesWrFW666SbVqFGj1DG33367zGazvvjiC4WHh7tbcnKy9uzZoy5duniMr+h1Pp2//+KgZs2astvtWrt2rdq1a+fuP5fvZps2bdSsWTN99tlnHucWHByslStXqlOnTqfdZ2pqqqKjozV9+nSFhYVp6NChmjdvnlJTU92riSSpbdu2uvjii/XWW295rBD5u8jISLVt21Zz5szRsWPH3P3btm3TDz/8UOr3/r333vN4Xd5rVZ7rXpbw8HCP+E41e/ZspaenKykpSUuWLFFwcLAGDRrkrnn592tqs9kUHh6u1atX65JLLnGXkunWrZv8/f09VqZLKvVBm3fccYe7lM/fz3nFihWyWCzq1KmTx/gHH3xQ6enpSktLU1xcnLp166aJEydq0qRJHuP+HmdISIjCw8O1du1aBQcHlyivk5WVpU8++cT9Oj8/X7/++mupfwfY7XbFxsaqefPmuvHGG8t8iNOxY8dktVorfH0AAKhuyjN3KJ4P9unTRxZLxX4UHxYWpq5du+qLL75QaGiox3xi+fLlatasmerXr3/a+K655hq98cYbkqT77rtPs2bNUlJSkt5++213SY7atWurc+fOmjVrlg4dOlTqvsxms2JiYrRgwQKPMiTJycn67LPPdP3115e4Z5sxY4aKiorcr3v06KGwsDDNmzfP41wKCwu1cePGEnP3U82fP18BAQHuVfzSyVIuYWFhmj9/vrvv+PHjuuaaa1SvXr3T7q8sw4YNU/fu3T3aqfdZxfEUX19J7hXTxfOsevXq6YorrtBHH32k7Oxs97g1a9a4f2nwd+W5v+jZs6cklWsu2r9/fy1atEgmk6nEd6dmzZoe+5VO3uP+/ZlcGzdulNls1qxZszzGbdy4UQ0bNpSfn5+kit+TVWR+CsD3KOcCVCEhISFKTU0tc/v8+fP14IMPaubMmZowYYJWrlypb775Rl999VWJ2ullSUxMrNBDRPfs2VOib+/evWrSpEm593E2GjdurCNHjngk8KWTZUGKt/9daWUtjh07prCwsDMeZ8+ePSU+v7KO403Fxzxw4IDefPNNjRgxQvfcc4/Wrl2rhQsX6pNPPnGX9Lj00ktlNpu1d+/eUvd16jWt6HU+nd69e+vFF19UmzZtPMp4/P1G4Vy+m5deeqkknbYUi91u95i4nyo5OVnDhg3TsGHDdOmll+qmm27Sc889p1deeUVJSUmaOXOmu6TJ9u3by9xP8fX+448/SmzbtWuXevbsWeJhUafWeCzvtSrPdT+d0/3Dwssvv6y1a9eqsLBQ6enp2rVrl8dDijt27KiXX35ZHTp0cP/kuJjdbpfD4XB/Fqeex7Fjx0r8xPfSSy9VdHS0u87pqerUqePxesGCBXrnnXcUEBCgq666Ss8//7ysVmuJ78rll1+uV199VV27dpXdbi8R59/9vf7o32O94oorSvS/9dZbCgoKUtu2bU/7sODiz7i8f78CAFBdlWfusHr1an311VcaO3asnn76af30009asGCBPvvsszM+6L1p06Yym8169dVXyyzHUqdOHR05cqTMfTgcDj333HN67rnn1KhRI3Xr1k3PPPOMHn/8cWVmZuqll15yJy9PNx+MiIhQcHBwmfNBPz8/NWzY0GMOUdp8UFKZDycva0FHsa1bt2rXrl2688473YndO++8U2lpae5n3UjSyJEjNXfuXB06dEhxcXFasmSJPvrooxLxlOXXX38t14NFT73XKp6XF99rlTVvLO47NYldnvuLxo0bq7CwsMS5nHqMiIgIhYWF6ZFHHtEjjzxSavynzkVPPZ/i63HqP6xkZmbKz89PdrtdGRkZFb4nq8j8FIDvkUQHqogGDRqoZs2aZf4/ZOnkv9h36tRJXbp0Ue/evdWzZ0/dddddWrlypWJiYjwmHWXJycnxZtiSyk4w+fn5eSTuzqeyjnO2K/bPVW5ubpmrV61Wq3tMsWeeeUZz5sxRv379FBMTo7ffflujRo3Stddeq8TERJnNZhUVFalXr16lnuup/9jgret8/fXXa+HChVqzZo2GDRumpKQk5efn67777tM999zjHncu383ih0Q+88wz2rJlS6ljTj2/09mzZ4/27NmjxYsXa8+ePbrnnnvcD7Q6H079rCtyrc503cty9OjR0/4D0bZt27Ry5cpSt1188cVauXKldu/ereHDh+vQoUPKy8vTzTffrOHDh5d4aGd5mM1mxcbGuld/nerPP//0eH348GF3fEuXLlV6erqmTZumVatW6dtvv5V08oZ89erVcjgcGj16tPbt26fc3Fy1a9dOb7zxRok4K/J3wHfffae77rpL//73v3XvvfeW+XdYWFiYsrOzK/T8BwAAqpuKzB3uuOMOXXPNNerbt69uuukmzZ49WyNGjNC1117rsUL5VMX7+M9//uOu932q090nneqvv/7S7Nmz9e2332r//v2655579NJLL5X7/RVV2nxQOlkXPTk5ucT4v6+CLsv8+fP1wgsvKDw8XFlZWbrllls0b948jznPl19+qbVr1+q2225TTEyMnn32WT333HO6/fbby3wmzNnw5r1Wee8vyqv4s/744481d+7cUsecuhq+rPM503lW9J6sst2jAjg9kuhAFfGvf/1LksqcNBYzDEM//vijfvzxR40YMUKjRo3S66+/ri5dumjlypVeXzFZvIri75o2beoxETl27Jhq1qxZYlzjxo09SqxUJLaDBw+qe/fuCgkJ8ZiMFJdwKOtBPBV18OBBXXHFFTKZTB7xnetxDh48qMsuu6zUbcX9p+57+/bt2r59u1577TV16NBB69ev15AhQ/TSSy9p3759MpvNSkhIKPXXAedL//79lZubq5tuusljBdGpT7qXzv67WfwwSYfDUWbi92wkJCTo2LFj7p+3Fh+nVatWZR6n+JqUdu2aN2+utLQ0j1XopanotTrddS/L7t271b9//zPuuzR9+/ZVUFCQbrnlFo/VNqf+/LT4s2jatKkOHDjg7q9Vq5Zq1arlMXbfvn0KCQk56+v3/vvv6+mnn9arr77qTqLfeOONql27tm6//Xb3T4YlKSoq6qyO8XcLFixQbGys5syZo6ysLA0bNqzUcVFRUe5fpQAA8L+qvHOHYhs3btTGjRv14osv6h//+Ic+++wz3XXXXZo5c2aZ88Hie4b8/HyvzgePHz+uffv2qVWrVh7HKX5dmrS0NGVnZ5c5HywsLCyzFEyx4nlnamrqWZ/P/PnzNXbsWPXv318pKSmy2+36/PPPS4xLTk7W9OnTNX36dEVERGjTpk164YUXvJpEP5O/zxtPdWpfee8vDh48KD8/P0VFRXn8A8qp+0tLS5PD4ZCfn59XvzulOR/3ZPziEag8qIkOVAFdunTRSy+9pP379+vTTz8tc1xpK0+LV+4GBgZKknuFR2lJ7bNx7733KiQkxP16wIABql+/vpYuXeru27dvn6699lr5+/u7+3r37q1GjRp57KsisS1ZskQWi0WPPfaYR//TTz+toqIij+OfiyVLlqhevXq688473X1+fn56/PHHlZWVpdWrV5/1fq+99toSP1202+265557tHnzZqWkpEiSQkND3XX2im3btk2FhYXu6/rNN9+ooKBAY8aMKfV4pyY1vaWwsFCGYXjE17hxY916660e487luxkXF6e9e/fqmWeeKfHzYOlk7crTufrqq92r+//uqquuUu3atd0/xd20aZP279+vp556qkQpkGLJycnavHmzBg0a5DGmZcuWiomJ0ZIlS04bi1T+a1We616WDRs2qFatWmeVUC5eEfP3FTA2m63EjcvKlSuVn5+voUOHevSf+mdSkr744gt17NhRMTExJbbZ7fYS51laTG+++aYuv/xy9evXr8w4/f39y0x4V9THH3+sJ554QkOHDtWECRNKHdOuXTutX7/eK8cDAKCqKu/cobQ5/qnzweLFCKeOTUtL06pVq/TII48oMjKyxH7ONB+84oorFB4eXqK/UaNGuvzyy93zwfT0dK1evVr333+/GjZsWOq+ioqKFBsbq379+nmUdqxTp47uvvturVu3TllZWaeNZ/ny5crMzNTzzz9fan34M52PdHLRxNatW3XnnXfqzjvv1JEjR7RmzRr3drPZ7K5HXywtLU1Hjhw541zS25KSkrRt2zbde++9HvP5Tp06lShdUt77i+LFZafO/R5//HGP10VFRfr666/Vv39/tWzZskRs5fmsy+t83JN5+/4dwNljJTpQyfTq1UvNmzeXxWJR3bp11bVrV/Xo0UMHDx7ULbfcIpfLVeZ7R48erU6dOmnx4sU6ePCg6tSpo2HDhunQoUNat26dpJMJ7WPHjmnIkCHKyspSdna2Nm7c6LGStCIyMjK0bt06zZ49W3Xr1tVTTz2lPXv2aMaMGe4xH374oe644w4tW7ZMX3zxhS655BL985//LPGTy4rEtmjRIv3444967bXX1KRJE8XHxysmJka33nqrJk+e7LHC/Vx88MEHeuSRRzRnzhy1b99eBw4c0IABA3T99dfrySefrFAZkb+bMGGC7rjjDq1Zs0bvv/++du/erfr162vw4MGqV6+ex01H165d9c477+jLL7/U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m9LS0s5rYAAAAAAunEmTJumdd95RRESEfvzxR0lSt27dNGLECD311FO+Da4Satc7RrUbXaTs48eUl5MrS0Cg6jZprHQ/P7mynbLabSTRAQAAqolyJdH/zs/P73zEAQAAAMCHZs+ercDAQL3wwgt66aWXJEkHDhzQ0KFD9fHHH/s4usrFarcpsuklcmU7VVRoqKiwSHk5OZKk8IYX6dD2nSTQAQAAqpEKJ9El6eKLL9ZTTz2lFi1aSJJ27typKVOm8DNPAAAAoAp777339N5776l27drKyclRdna2r0OqlKx2m/wsFh09fFi1GzWUJBXkuWQymxVotSp5736S6AAAANWIuaJviImJ0c6dO3X11Vdr69at2rp1q6655hrt2LFD3bt3Px8xAgAAALiA0tPT1b59e/Xs2VM1a9b0dTiVjjPTIZfTKUd6hlITDshkMqlGSIj8AwKUfuiwNi35wdchAgAAwIsqvBJ9woQJmjx5skaNGuXRP378eE2cOFHt27f3WnAAAAAAzq+RI0cqJCREo0ePdvctXbpUMTExkqTU1FR169ZNO3fu9FWIlY4z06GEzfFq1bWzHOkZyjiSrJBaYQoKCVb88pVypPL8KAAAgOqkwivRW7RooZkzZ5bonzVrli6//HKvBAUAAADgwrjzzju1fft29+sBAwaoU6dOuuGGG1S7dm39/vvvGjNmjA8jrJziY1dp+4+rZTabFVorTHnOHMUvX6n42FW+Dg0AAABeVuGV6GlpaWrTpo327t3r0d+mTRulpqZ6LTAAAAAA519UVJS2bt3qfn3zzTfrq6++0vr16yVJr776qr788ktfhVdpFbhcilu0TLvWrJfVbpMz00EddAAAgGqqwkn0GTNm6IMPPtDFF1/snlhfd911eu655zRp0iSvBwgAAADg/LFYLHK5XO7XHTp00FtvveV+feTIEdWuXdsHkVUNJM8BAACqvwon0V955RVlZWVpxIgRGj9+vKSTE+uxY8fq7bff9nqAAAAAAM6fffv2qVOnTkpISFDDhg3VrFkzrVmzxr39oosu0tGjR30YIQAAAOBbFU6iS9Jbb72lt956SyEhIZKkEydOeDUoAAAAABfGtGnT9M477+iGG27Qtddeqw0bNmjXrl3u7V27dtXmzZt9GGHlZ7XbKOkCAABQjZ1VEr0YyXMAAACgavvwww9VWFiovn37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yWQqsTodJ1ntNnX6112qYbOpqKBAhQUFMvuZ5R8YoLB6kbr0miu1a816SroAAABUceYzD/H0yiuvaNy4cbLb7YqKitLFF1/sbpdcconXAktISFBSUpK6devm7gsNDdU111yjDRs2SDr58M+wsDC1a9fOPaZr164ym83auHGje0ynTp08Hnjao0cP7d69W8ePH3eP+ftxiscUHwcAAACo7saPH6///ve/uuKKK5Sbm6v+/furYcOGWr16tb788ktfh1cpNWh+qWx1ImQUFamwoEAyDBUVFKoov0ABNWrIXreOrHabr8MEAADAOapwEt1qterzzz/3WIF+toKDgxUdHa3o6GhJJx8mGh0drYYNG0qS3nrrLb344ovq27evWrVqpY8++khHjhzRggULJEm7d+/W0qVLNWPGDF111VXq2LGj3nnnHX3++edKSkqSJH322WfKy8vTzJkzdfnll2vgwIF68sknPeqZT5kyRT179tTw4cN12WWXacyYMbryyiv1zjvvnPM5AgAAAFVBixYt9NFHH0mSCgoKVKNGDWVnZ2v06NF67rnnfBxd5RQYEiKTSTKKCmUym9z9RYYhk9mkosJCVqEDAABUAxVOos+cOVN33HGHVw5+5ZVXasuWLe7yLJMnT9aWLVs0btw4SdIbb7yhqVOn6oMPPtBvv/2mkJAQ9ezZUy6Xy72Pe+65R7t379bKlSu1ZMkSrVu3Tg8//LB7u8PhUExMjKKiohQXF6c333xT48aN04wZM9xjNmzYoLvvvlsPP/yw4uPjNWDAAN16663asWOHV84TAAAAqOyys7PdddCTkpI8fmVau3ZtX4VVqSX9uVe5J7IlmeRnscjs5yeTn5/8AvxlFBbpzw2/kkQHAACoBkySKrSk3Gw26/vvv1eNGjW0bds25efne2z/X33gUGhoqBwOh2w2m7Kysi7osW11aitmyAOyRZz55saRlq7Y92bKkZp+ASIDAADA6fhyDlnspZde0ptvvqlPP/1Uixcv1ocffqj//Oc/6tevn+bMmaPbb79dx44dU48ePXwSX3n56rO8Y+woXdGji/wsfjKZzTKZT65TOhi/XTOGDlfB3xYAAQAAoHIp7xyywivRR40apZtuukl169ZV69at1bZtW3dr06bNucQMAAAA4AIbM2aMgoODNXz4cPdzhcaMGaOVK1fqzjvv1IEDB/TAAw9UeL/Dhg1TQkKCcnJy9Msvv+iqq64q1/vuvPNOGYahb7/9tsLH9IVFk97RluUrlJmaphxHlhyp6dq85AfNfurfJNABAACqCcuZh3gaMWKE7r//fs2dO/d8xAMAAADgAjKZTtbyTkhIcPc5nU4NHTr0rPc5cOBATZo0SUOGDNHGjRv11FNPafny5brsssuUlpZW5vsaN26s//73v1qzZs1ZH/tCy3Vk6etxbyi8YQPValBPGYlJOnoo0ddhAQAAwIsqvBLd5XLp559/Ph+xAAAAAPABw6hQhcczGj58uGbMmKE5c+Zo165dGjJkiJxOp+6///4y32M2m/Xpp59qzJgx2r9//xmPERAQoNDQUI/mS0cPJWrPL7+TQAcAAKiGKpxEnzJlih5//PHzEQsAAAAAH/jzzz919OjR07by8vf3V/v27bVixQp3n2EYWrFihTp06FDm+0aPHq3U1FTNmjWrXMcZNWqUHA6HuyUmkrwGAADA+VHhci5XX321unbtqj59+mjHjh0lHizav39/rwUHAAAA4PwbM2aMMjMzvbKv2rVry2KxKCUlxaM/JSVFzZs3L/U91113nR544IEKPWNp/PjxmjRpkvt1aGiozxLpVrtNVrtNzkyHnJkOn8QAAACA86fCSfTjx4/rm2++OR+xAAAAAPCBzz///LS1ys+nkJAQffzxx3rooYcqtOI9Ly9PeXl55zGyM7MEBio6poui2kYr0GqVy+lUwuZ4xceu4qGiAAAA1UiFk+inq2MIAAAAoGrxdj309PR0FRQUqG7duh79devWVXJyconxl1xyiaKiorRo0SJ3n9l8supkfn6+LrvssnLVSPeF6JguatW1s7KOZuhYUpKCQkPVqmtnSVLcomU+jg4AAADeUuGa6AAAAACqD5PJ5NX95efnKy4uTt26dfM4Rrdu3bRhw4YS43fv3q1WrVqpTZs27rZw4UKtWrVKbdq00aFDh7wan7dY7TZFtY1W1tEMnTiaoYK8fJ04mqGsoxmKahstq93m6xABAADgJRVeib5///7Trla55JJLzikgAAAAABeOn5+f1/c5adIkzZ07V7///rt+/fVXPfXUUwoODtbs2bMlSXPnzlViYqKef/55uVwu7dixw+P9x48fl6QS/ZWJ1W5ToNWqY0lJHv25WVkKqxfprpEOAACAqq/CSfS33nrL47W/v7/a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C+X4zu3hxWq1mqysLHP99df7/VgolXN+rVarWbZsmbn55pvN1KlTSaJX01LRczt69Gizbds2ExgY6PfYKZV/ft944w2zePFir7qXX37Z/Pzzz34/ForvUp4k+gsvvGDWrVvnVTdz5kzz3Xff+T1+yokrx9tfo5wcpUGDBsYYY84//3wjyURERBi3222GDh3qadO2bVtjjDFnn3223+OlnPgSFhZmtmzZYvr27Wvi4+M9SXSuFUpJef75581PP/10xDZ79+41DzzwgOd1RESEycvLM8OHD/d7/JQTV+bNm2c++OADr7ovvvjCfPzxx57XXCtVU5jOpRoLCgpS165dtXjxYk+dMUaLFy9Wz549y1ynZ8+eXu0laeHChT7bwz+O5dwezmazKSgoSBkZGVUVJo7RsZ7ff//730pLS9OUKVNORJg4BsdybgcPHqzly5frrbfeUkpKitatW6dx48bJauWf4OrmWM7vr7/+qq5du3qmd4iNjdXAgQM1f/78ExIzqg59KlRGfw0nh8jISEny9Mu7du2q4OBgr2tny5Yt2rVrF9fOSeqtt97St99+qyVLlnjVc62gxODBg/XHH39o9uzZSk1N1erVq3XLLbd4lsfGxqpx48Ze10p2drZWrlzJtXKS+fXXX9W3b1+1bt1aknTmmWfqvPPO03fffSeJa6UqBfo7APjWoEEDBQYGKjU11as+NTVV7dq1K3OdmJiYMtvHxMRUWZyouGM5t4f7z3/+o71795a6wYf/Hcv5PffcczVq1Ch16tTpBESIY3Us57ZFixbq06ePZsyYoYEDB6pVq1Z6++23FRQUpIkTJ56IsFFOx3J+Z86cqQYNGmjZsmWyWCwKCgrSO++8o+eff/5EhIwq5KtPFRkZqdDQULlcLj9FhhOlMvprqP0sFoteffVVLVu2TBs2bJB08PvD7XYrKyvLqy33ZSen4cOHq0uXLmU+T4FrBSVatGih22+/XZMmTdJzzz2n7t276/XXX1d+fr4++ugjz/VAvgcvvPCCIiIitHnzZhUVFSkgIECPP/64Pv30U0niWqlCJNGBGuiRRx7R1VdfrQsvvFBut9vf4eA4hYeH6+OPP9att96q9PR0f4eDSma1WpWWlqbbbrtNxcXFWr16tZo0aaKHHnqIJHot0KtXLz322GMaO3asVq5cqVatWum1117TE088oWeeecbf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yEg98cQT+v3331VYWKhevXrpxRdf1A8//KCsrKwTEgsAVBZDoVAolNpVRo4caTIzMz2vW7RoYebOnWtSUlKMw+Ewv/32m+nbt6/XOrfffrv566+/TF5enklJSTGff/65kWSmTp1qDtesWTMjyZx++ulm/vz5xuFwmJSUFPPRRx+ZqKgon3HNmTPHTJky5ajx33TTTWb9+vXG5XKZvXv3mjfeeMOz7LTTTjNz5841DofDZGVlmVmzZplGjRp5lo8fP96sWbPGjBo1yuzYscMUFRUZSSYyMtK8//77Ji0tzWRlZZklS5aYM8880+/nikKhUCgUCoVSdSUsLMxkZ2ebNm3amJkzZ5px48Z5ls2YMcN89tlnXu0DAwPNvn37zPXXX28kGYvFYh599FGzY8cO43Q6zdq1a83QoUM97Xv16mWMMWbAgAHmjz/+MG632/Tq1atc/e+YmBjzzTffGKfTaXbs2GGuueYak5iYaO655x5Pm2PpwxpjzJAhQzyvGzdubIwx5rbbbjOSTHx8vJk8ebJn+XXXXWd+//13k52dbZKTk82MGTNMw4YNPcu3bt1qHnjgAa99xMXFGWOMadmyZZkxvPXWW8bhcJjGjRuXeU4CAgKMJFO3bl0zffp0k5GRYXJzc838+fNNq1atPG1L+vaHrn/PPfeYxMREz+upU6eaOXPmmAceeMDs3bvX7N+/37z55psmMDDQc7yH8/d1SaFQal5hOhcAOAmEh4dr/vz56tu3rzp37qwFCxZo3rx5Ou200yRJXbt21euvv65///vfatu2rQYMGKCffvpJknTPPffo119/1XvvvaeYmBjFxMRo9+7dioyM1A8//KA1a9aoW7duGjBggKKjozV79myfcaSkpKhHjx5q2rSpzzZjxozRW2+9pffee09nnHGGBg8erG3btkmSLBaLvvrqK9WvX1+9evVSv3791KJFC82aNctrG61atdLQoUN15ZVXqlOnTpKkzz//XI0aNdIll1yirl27avXq1VqyZInq1at3PG8tAAAAqrFhw4Zp8+bN+uuvv/TJJ5/o5ptv9iybMWOGBg0apLCwME/dxRdfLJvNpjlz5kiSxo0bpxtuuEFjxozR6aefrsmTJ+uTTz7RBRdc4LWfF154QY8++qjat2+vP//886j9b0n66KOPdMopp+jCCy/U0KFDddttt6lRo0Ze262M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8nn8ixcv1vLlyzV37lz169dPzZo1U8+ePfXMM8+oa9eulfU2AwAAoJq47LLLVK9ePX344YeeX0GWlC+//NIzpYskffrppxozZoz69evnmcpFOvhrzZdfflmTJ0/WDTfcoBYtWnj6pjfccMMR93+0/veWLVv0/fff67333lP37t3VqVMnvffee3I6nTLGSDoxfdi///5bbrdbd911l2JjYzVo0CA9+eSTpdoVFxdr2rRpev7557V161atWLHiiNt9/PHHtXv3bq1cuVLXX3+92rdvr1atWummm27SmjVrFB4erm3btmnu3Ll6//33de655+rMM8/UJ598oqSkJH311VeSpB9//FENGzbUww8/rBYtWmjs2LG65JJLKnycO3fu1AUXXKBTTjlFUVFRFV4fAKRqMDE7hUKhUCq3HP5g0WbNmpklS5aY3Nxcs2vXLjN27FivBwqde+65Jj4+3qSnp5vc3Fyzdu1a869//cuzfuvWrc2vv/5qcnNzjTHGNGvWzEgHHwb05ZdfmoyMDJObm2s2btxoJk2a5DOuK6+80nzzzTcmKSnJuFwus2fPHvP555+bjh07erW77bbbzKZNm4zb7TZJSUnmtdde8yw77bTTzNy5c43D4TBZWVlm1qxZplGjRp7lZT18SJIJDw83r732mtmzZ49xu91m165d5uOPP/Z6SCmFQqFQKBQKpXaUr7/+2nzzzTdlLuvevbsxxngetNmuXTtjjPF6WOWh5e677/b0TVNTU813331nzj//fCP9/4NFIyMjvdY5Wv9bkomJiTHffvutycvLM4mJiebqq682KSkp5rbbbvO0OZY+7KEPFi2rHB7H1VdfbXbs2GHy8vLML7/8Yi677DJjjDFxcXFe68XGxhpjjHnwwQfLdQ4iIiLMc889Z7Zs2WJcLpdJTk42ixYt8oqtbt26Zvr06SYzM9Pk5uaa7777zrRq1cprO6NHjza7du0yDofDTJs2zYwbN67Ug0XnzJnjtc7kyZNNfHy85/XZZ59t1q5da/Ly8ow5+FcKCoVCqVCx/PMfAAAAAAAA8JMmTZpoz5496tu3r3744Qd/h1PKeeedpyVLlui0005TWlqav8MBgBOKJDoAAAAAAMAJ1rt3b4WHh2vdunVq3LixXnzxRTVp0kRt2rTxzMteHQQHB6thw4aaPn26UlJSdN111/k7JAA44ZgTHQAAAAAA4AQLCgrSc889pw0bNmjOnDnat2+fLrzwwmqVQJeka665Rrt27VLdunX18MMP+zscAPALRqIDAAAAAAAAAOADI9EBAAAAAAAAAPCBJDoAAAAAAAAAAD6QRAcAAAAAAAAAwAeS6AAAAAAAAAAA+EASHQAAAAAAAAAAH0iiAwAAAAAAAADgA0l0AAAAAAAAAAB8IIkOAAAAAAAAAIAPJNEBAAAAAAAAAPCBJDoAAAAAAAAAAD6QRAcAAAAAAAAAwAeS6AAAAAAAAAAA+EASHQAAAAAAAAAAH0iiAwAAAAAAAADgA0l0AMBJZerUqUpMTKzwes2aNZMxRiNHjqyCqGqO8ePHyxjj7zAAAAAq7Fj7gTi5xMfHKz4+3t9hVJr4+HitW7fuhO+X+yfUNiTRAVQ7xphylV69eh33vurUqaPx48dXyrYOFxYWpgkTJmjdunXKycnR/v37tWbNGr366qtq3Lhxpe+vtrj99ttljNGKFSuOeRuNGzfW+PHjFRcXV4mRlXbJJZdo/Pjxlb7dxMREzZs3r9K3CwAAjt3IkSNL9UdTU1P1ww8/aMCAAce83XHjxmnIkCGVGOmx69Wrl+fYunTpUmr51KlT5XA4/BDZiXWkvljXrl2rZWKwRYsW+u9//6vt27crLy9PWVlZWrZsme6++26Fhob6O7xqp3379ho/fryaNWvm71A8Dv38lZT09HQtX75c1157rb/DA056gf4OAAAOd91113m9vuGGG9S/f/9S9Zs2bTrufdlsNk2YMEETJkzQ0qVLj3t7JQIDA/XTTz+pXbt2mj59ut544w2Fh4fr9NNP17XXXqs5c+YoOTm50vZXm4wYMUKJiYk6++yz1bJlS23fvr3C2zjllFM0YcIE7dy5UwkJCV7Lbr31VlmtFf8b8q5duxQaGqqCggJP3cCBA3XnnXfqqaeeqvD2AABAzfTkk08qMTFRFotF0dHRuvHGG/Xdd9/psssu07ffflvh7T322GP64osv9NVXX1VBtMduwoQJGjx4sL/DQDkMHDhQn3/+udxutz766COtX79ewcHBOu+88/TSSy/p9NNP1+jRo/0dZrXSoUMHTZgwQT/++KN27drltax///5+iuqg1157Tb///rskKSoqSsOHD9eMGTNUt25dvf32236NrSLKun8CajKS6ACqnRkzZni97tGjh/r371+qvjq7/PLL1aVLF1177bWaOXOm17KQkBAFBwefsFhsNpucTucJ29/xaN68uc4991xdccUVevfddzVixAhNnDixUvdRWFh4zOu63e5KjAQAANRE3333nVatWuV5/eGHHyo1NVXXXHPNMSXRq6M1a9Zo0KBB6ty5s9asWVNl+6lTp47y8vKqbPu1xZH6882bN9dnn32mXbt2qU+fPkpJSfEse/vtt9WyZUtdeumlJyrUWsHfSd+ff/5ZX375pef1O++8ox07dujaa6+tUUl0qXLvn2rSfS1qJ6ZzAVAj3XjjjVqyZIlSU1Plcrm0YcMGjRkzplS7rl27asGCBdq3b5+cTqd27NihDz/8UNLBOdr2798v6eBIm5KfzB06PUfbtm31+eefKz09XXl5efr99981aNCgo8bXsmVLSdIvv/xSapnb7S71M9i2bdtq1qxZSktLk9Pp1ObNm/XMM894tenUqZPmz5+vrKwsORwOLV68WGeffbZXm5KfGV9wwQV66623lJqaqj179niWDxgwQD/99JNycnKUnZ2tb775Rh06dDjisZT8ZPWGG24otax///4yxng65uHh4Zo8ebISExPlcrmUmpqqRYsWqXPnzkfcR4kRI0YoIyND3377rb744guNGDGizHaRkZGaNGmSZz+7d+/W9OnTFRUVpV69eumPP/6QJE2bNs1zXkt+cnvoXJiBgYFKT0/XlClTSu3DbrcrLy9PL730kqTSc/pNnTpVd955pyTvKYikgz8Bnjt3bqlthoSE6MCBA/rvf/9brvfjaEaMGKE//vhDTqdT6enpmjlzpk499VTP8jfeeEMOh0N16tQpte6nn36q5ORkr1H5x3J9AABwsjtw4IDy8vJK/aHeZrPp5Zdf1t9//y2Xy6XNmzfrgQce8GpjjFF4eLhuvPFGT19i6tSpZe6nUaNGKigo0L///e9Sy9q0aSNjjO644w5JB/s4//73v/XXX38pLy9P+/fv188//6yLLrqoXMf0xhtvKCMjQxMmTChX+9tvv13r16+Xy+VSUlKS3nzzTUVGRnq1KZmXuUuXLlq6dKlyc3P13HPPefpYDzzwgMaOHavt27crNzdXCxcu9PRrnnjiCe3evVtOp1Nz585VvXr1vLY9ePBgffPNN0pKSpLL5dK2bdv0xBNPHNOvD49FdHS0pkyZot27d8vlcmnv3r2aO3duqalCytPXKpkyp0WLFvr222+VnZ19xMFEDz/8sOx2u0aNGuWVQC+xfft2vf76657XAQEBeuKJJ7Rt2za5XC4lJibq2WefLTXIp2RKm3PPPVcrV65UXl6etm/fruuvv96rXXmuNV9zjB8+R31lXAslcffr109r1qxRXl6eNmzYoCuuuMLTZuTIkfriiy8kST/++GOp6ULLirdhw4b64IMPlJKSory8PK1du7bU/dGh8d96662e9/i3335Tt27dSh1/eRUUFCgzM7PMwUBHux84VPv27fXDDz8oNzdXe/bs0UMPPeS1PCgoSE899ZT++OMPHThwQDk5Ofrpp5904YUXetocz/1Tid69e3s+B5mZmZo7d67atWvn1abkOUzt27fXjBkzlJGRoWXLlpXr/QKqkqFQKJTqXN544w1jDmYnPWXlypVmypQp5p577jF33HGHWbBggTHGmLFjx3raNGzY0KSnp5vNmzebBx54wIwaNco8/fTTZsOGDUaSsdlsZvTo0cYYY7788kszYsQIM2LECHPGGWcYSaZDhw4mMzPTrF+/3jz00ENm7Nix5scffzRFRUXm8ssvP2LMV199tTHGmCeeeOKox3fGGWeYAwcOmH379plnn33W3HrrreaFF14wCQkJnjYdOnQwDofDJCUlmccff9w8/PDDZvv27SYvL8+cddZZnnYjR440xhizfv16Ex8fb+644w7z8MMPG0nmuuuuM0VFRWb+/PnmjjvuMA899JDZsWOHycjIMM2aNTtijNu2bTPffPNNqfoPP/zQpKenm8DAQCPJfPLJJ8blcpmXX37Z3Hzzzeahhx4yX331lbn22mvLda43btxo3n//fSPJnHfeecYYY7p16+bVJiwszPz555+moKDAvPvuu2b06NHm8ccfNytXrjRxcXGmUaNG5oknnjDGGPPf//7Xc15jY2ONJDN16lSTmJjo2d4HH3xgMjIyTFBQkNd+rr/+emOMMV27djWSTLNmzYwxxowcOdJIMj169DALFy40xhjPPkaMGGEkmaefftq43W5Tr149r21eddVVxhhjzjvvvCO+D4mJiWbevHlHbPPYY4+ZoqIiM3PmTDNmzBjz5JNPmrS0NLNjxw4TGRnp9R5eddVVXuvWqVPHOBwO88Ybb3jqynt9jB8/vtTnkUKhUCiUk6GU9LP69OljoqKiTIMGDUyHDh3MO++8YwoLC81FF13k1X7x4sWmqKjIvPfee2bs2LHmq6++MsYYM2nSJE+bESNGmLy8PLN06VJPX6JHjx4+Y1i8eLFZv359qfonn3zSFBQUmEaNGhlJ5plnnjFFRUXm3XffNaNGjTL33XefmTFjhqdf6Kv06tXLGGPM0KFDPf2pzp07e5ZPnTrVOBwOr3VK+gaLFi0yd9xxh3n99ddNQUGBWblypaePKMnEx8ebvXv3mtTUVPPaa6+ZW2+91QwePNjTx1q9erVZv369uffee83EiRONy+Uyv/76q3nmmWfMsmXLzJ133mleffVVU1RUZD788EOvGP73v/+Zzz77zDzwwANm9OjRZtasWcYYY1588UWvdof3A32VI/XFunbt6tUnlGSWLVtmMjMzzcSJE83NN99sHn30UbNkyRJz/vnne9qUt681depUk5eXZ7Zu3WqmTp1qbrvtNnPdddf5jHX37t1m27Zt5b6Op06daowxZvbs2eb2228306ZNM8YY87///a/Ue7Bp0yaTnJxsnnnmGTN27Fjzxx9/mKKiItOhQwdPu/Jca/Hx8SY+Pr7MWA49H5VxLSQmJprNmzebjIwM89xzz5l7773XJCQkeH1GY2NjzauvvmqMMeaZZ57xfPZKPj+HxxsaGmo2bNhg3G63eeWVV8ydd95pli5daowx5u677y4V/6pVq8xff/1lHnroIfPggw+atLQ08/fff3t9Ho70+bvxxhtNVFSUiYqKMq1bt/Z8xm666Sav9uW5Hyg5nj179phdu3aZyZMnmzFjxpjFixcbY4wZMGCAp11UVJRJSkoyL7/8shk9erR58MEHzaZNm4zb7TZxcXGedsd6/yTJ9O3b1+Tn55vNmzebBx980BNzenp6mfcc69evN3PmzDFjxowxt99+e4W+symUKih+D4BCoVCOWMpKooeGhpZq991333l1IIcMGeL1j3hZJSoqyhhjzPjx40st+/77701CQoIJDg72ql+2bJnZsmXLEWMODQ01mzZtMsYYk5iYaKZMmWJuuukm07Bhw1Jtf/zxR5OVlWVOO+00n9v73//+Z1wulycRLMnExMSYrKws8+OPP3rqSm7ufvrpJ2O1Wj31YWFhJiMjw7z77rte223UqJHJzMwsVX94efbZZ43b7TZ169b11AUFBZmMjAzzwQcfeOoyMzO9ErMVKV26dDHGGNO3b19P3d9//20mT57s1W7ChAnGGHPEP2SUdXNTUg7vrPfr188YY8yll17q1e6bb77xup7K6gSWdW1KMq1btzbGGDN69Giv+rlz55odO3Yc9b04WhK9adOmpqCgwIwbN86r/vTTTzf5+fle9bt37zaff/65V7vDk/kVuT5IolMoFArlZC0l/azD5eXlmRtuuMGr7eDBg40xxjz22GNe9bNnzzZFRUWmRYsWnjqHw2GmTp1arhhuvfVWY4wxp59+ulf9+vXrzeLFiz2v16xZc9Q/yJdVDk2iR0REmPT0dDN37lzP8sOT6A0aNDAul8ssWLDAWCwWT/3YsWM9ycCSuvj4eGOMMbfddpvXPkv6WKmpqSYiIsJT/+yzzxpjjFmzZo0JCAjw1M+YMcO4XC6vPnpZ9wbvvPOOycnJ8WpXFUn0yMhIY4wxDzzwgM/tVaSvVZLkfu65544ap91uN8YYM2fOnHKd3zPPPNMYY8x7773nVf/iiy8aY4y58MILvd6DQ/uLJec7Ly/PvPTSSxW61iqaRD+ea6Ek7iuuuMLrfUpKSjKrVq3y1A0dOtQYY0yvXr2OGu/dd99tjDFeA4MCAwPNL7/8YrKzs014eLhX/Pv27fO6bxo0aFCZ9xu+Pn+HKywsLNXvr8j9QMln79A/xgQFBZm9e/d63SdYrdZSifHIyEiTnJzsdc93PPdPq1evNikpKV6Djc444wxTWFhopk2b5qkrueeYMWNGua5tCuVEFKZzAVAjuVwuz39HREQoKipKS5cuVcuWLRURESHp4E9rJemyyy5TYGDFHgFRr1499enTR7Nnz5bdbldUVJSnLFy4UG3atNEpp5xyxPjOPvtsvfjii5Kkm266SVOmTFFycrJef/11z88lGzRooF69enl+/lkWq9Wq/v37a+7cuV4/d0xJSdGnn36q8847T3a73Wud999/X8XFxZ7X/fr1U7169TRz5kyvYykqKtLKlSvVu3fvI74fs2bNUnBwsK688kpPXf/+/VWvXj3NmjXLU3fgwAGdffbZaty48RG3V5YRI0YoJSXF66eTs2bN0tVXX+31U9yhQ4dq7dq1ZU6Xcix++OEH7du3T8OHD/fU1a1bV/369fM6torYunWrVqxY4TUdTb169XTJJZdUytz+V155paxWq2bPnu11PlNSUrR161av8/n5559r4MCBCgsL89QNHz5ce/bs8fwk8nivDwAATiZjx47VRRddpIsuukgjRoxQfHy8PvjgA6/pIgYOHKjCwkKvaTQk6ZVXXpHVatUll1xyTPv+3//+p4KCAq9+y+mnn67TTz+9VJ/s9NNPV6tWrY5pP5KUnZ2tV199VUOGDFGnTp3KbHPRRRcpJCREr776qmdaO+lgXzQrK6vUXNwul8vndDWff/65srOzPa9XrlwpSfrkk09UVFTkVR8SEqImTZp4bbdEeHi4oqKi9PPPPyssLKzUNBGVLS8vT263WxdeeKHq1q1bZptj6Wu98847R913yX3P4VNF+jJw4EBJ0qRJk7zqX3nlFUkqdb42bNjgNYXG/v37tWXLFrVo0cJTVxnX2uGO51qQpKSkJM2ZM8fz2uFw6KOPPlKXLl0UHR1d4XgGDhyo5ORkr2ddlXy+7Xa7ZxqYErNmzfLci0oH5ziX5PW+HclTTz3l+Y4ZNmyYZs6cqeeee0533323p01F7gekg+/BJ5984nldUFCg3377zSum4uJiz3zwFotF9erVU2BgoP744w916dLF0+5Y759iYmLUuXNnTZs2TZmZmZ76devW6fvvv/dcn4eqrGkwgcpAEh1AjXTOOefo+++/V05OjrKysrR//349//zzkuSZf3Hp0qX64osvNGHCBO3fv19z587VjTfeWK6HerZq1UpWq1XPPPOM9u/f71VKHnTZqFGjI24jOztbjzzyiGJjY9WsWTPdfPPN2rJli+666y49+eSTkv6/I7V+/Xqf22nYsKHCwsK0ZcuWUss2bdqkgIAAnXbaaV71hybbJal169aSDs7vd/jxXHzxxUc9lj///FObNm3y6igNHz5c+/bt0w8//OCpe/jhh9WxY0ft3r1bK1eu1Pjx4xUbG3vEbUsH/1Bw9dVXKz4+XrGxsWrZsqVatmyplStXKiYmRn379vW0bdmy5RHfr4oqKirSl19+qSFDhniujSuvvFLBwcHHnESXpI8++kjnnnuumjZtKkn617/+peDgYH388cfHHXPr1q1ltVq1bdu2UuezQ4cOXudz1qxZstlsGjx4sCQpLCxMAwcO1Oeff+61PenYrw8AAE4mv/32m5YsWaIlS5bo008/1aWXXqqNGzfqzTffVFBQkKSDcwHv3btXOTk5Xutu2rTJs/xYpKena8mSJRo2bJinbvjw4SooKND//vc/T92///1v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VSs9/vjjperXrFmj+fPn64knntALL7yg5s2ba+7cuXI4HIqNjdUVV1yh9957z/OAqJJ1tm7dqmeffVahoaGlOriVdX0AAHAyuOSSSzwjUEsGNbRp00bPP/+8Z2DDvHnz9MMPP+jZZ59V8+bNlZCQoP79++vyyy/X5MmTPb9GlA72Jy666CLdd9992rt3rxITE/Xbb78dMYZZs2ZpxowZGjt2rCdBe6iNGzfqxx9/1KpVq5SRkaFu3brpqquu0ptvvnlMx/zaa6/pvvvuU6dOnbxG1pc8l2jChAlasGCBvv76a7Vt21Zjx47Vb7/95vUgw6ry66+/KiMjQ9OnT9frr78uY4yuv/7645o647333tPNN9/s6W+uWbNGUVFRGj58uDp27KgbbrjBM7d7mzZttGTJEs2ePVsbN25UYWGhrrjiCsXExHgGUFRlX2vHjh269tprNWvWLG3atEkfffSR1q9fr+DgYJ1zzjn617/+pWnTpkk6+JyjadOmafTo0apbt66WLl2qs846SzfeeKPmzJmjH3/8scL7L8+1NmXKFN1///1auHChPvzwQzVq1EhjxozRhg0bSg3CqQxbtmzRhx9+qO7duys1NVU333yzoqOjvQZdrV27VoWFhXrkkUcUGRkpt9vteWDm4d577z2NHj1a06ZNU9euXbVz505dddVVOu+883TPPfeUmjrleJ1//vkKDQ2VJM99zoUXXqiZM2d6BmPt2LGjQvcD5fHNN99o6NChmjNnjr799lvFxsZqzJgx2rhxo2cE/KGO5f7poYce0nfffafly5frww8/VJ06dXTXXXcpKyvL57MXgOrEUCgUSnUub7zxhjEHs7Wectlll5m1a9cap9NpduzYYR566CFz4403GmOMadasmZFkOnXqZGbMmGF27txp8vLyTEpKivn6669Nly5dvLbVo0cP8/vvvxuXy2WMMWb8+PGeZbGxsWbatGlm7969xu12m927d5uvv/7aXHnllUeMuXnz5mbChAnm119/NSkpKSY/P9+kpqaaefPmmQsvvLBU+w4dOpgvv/zSZGRkGKfTaTZt2mSeeuoprzadOnUy3333ncnOzjY5OTlmyZIlpkePHl5tRo4caYwxpmvXrmXG1atXL/Pdd9+ZzMxM43Q6zdatW82UKVNKvSe+SsuWLU2Jc845x2tZUFCQ+c9//mPWrFljsrKy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fz+33XbbiK9TXV2NZVns2bNn2PqePXuoq6s75HOmTp3KBz/4QVwuF5dddhnf+c53uPHGG/n6179+2PvcdtttRCKR0ldDQ8OIaxQREREROZn+9m//lldeeYUnnniCdDpNOp3m8ccfZ9u2bXzhC18od3kiIiIiIqPaqBnnsmzZMu6++25uuukm4vF4af3hhx/mP//zP0/ovU3TpLOzk7/+67/Gtm02btxIQ0MDX/7yl7n11lsP+ZxsNqtffRURERGRMaG/v5/3ve99TJs2jdmzZwOwZcsWXnnllTJXJiIiIiIy+o2aEP3cc8/lM5/5zEHrbW1th+0gP5Suri7y+Ty1tbXD1mtra+no6Djkc9rb28nlcti2XVrbsmUL9fX1uN1ucrnciO8vIiIiIjKahMNhBgYGcByHV155pRScG4ZBOBwmkUiUuUIRERERkdFt1IxzyWQyRCKRg9ZnzJjB3r17R3ydXC7Hhg0bWLx4cWnNMAwWL17ME088ccjnPP7440yfPh3DMIbdd/fu3QrQRURERGTMet/73sf69evx+XwHPeb3+3n66ad597vfXYbKRERERETGjlEToj/wwAN885vfxLKKzfGO4zBx4kRuv/127rvvvqO61rJly/j0pz/Nxz/+cWbNmsVPf/pTgsEgd911FwD33HMP3/3ud0vn//SnP6Wqqoof//jHnHHGGVx22WV87Wtf44477jh+L1BERERE5CT77Gc/y/e+9z1SqdRBjyWTSW6//XY+//nPl6EyEREREZGxY9SE6DfeeCOhUIjOzk78fj+rV69m27ZtJBIJ/u7v/u6ornXvvffypS99iVtvvZVnnnmGc845h6VLl9LZ2QnApEmTqK+vL52/a9cuLr30Us4991yeffZZ/vmf/5kf//jH/OM//uNxfY0iIiIiIifTnDlz+POf/3zYx9esWcNZZ5118goSERERERmDRs1M9Hg8zpIlS7jgggtoamoiFAqxceNGHnvssWO63h133HHYTvJLLrnkoLUnn3ySBQsWHNO9RERERERGo8rKytJveh6K2+2msrLyJFYkIiIiIjL2jIoQ3bIsUqkU55xzDmvXrmXt2rXlLklEREREZMzbsWMH8+fP56WXXjrk4/Pnz+fVV189yVWJiIiIiIwto2KcSz6f57XXXsPlcpW7FBERERGRU8Zvf/tb/uEf/oFx48Yd9FhtbS1///d/f9T7D4mIiIiInG5GRSc6wD/8wz/w3e9+l//9v/83vb295S5HRERERGTM+8d//EeuuOIKtm7dyi9/+ctSR/qsWbP46Ec/ys6dO7UPkIiIiIjIEYyaEP3zn/8806dPZ/fu3bz66qsMDg4Oe3zevHllqkxEREREZGwaGBjgbW97G7fddhsf+tCHSvPP+/r6+OUvf8nf/d3fMTAwUOYqRURERERGt1ETov/+978vdwkiIiIiIqeceDzOddddx3XXXUd1dTWGYbB3795ylyUiIiIiMmaMmhD91ltvLXcJIiIiIiKntK6urnKXICIiIiIy5oyaEH3I3LlzmT17NgDPP/88zzzzTHkLEhEREREREREREZHT1qgJ0Wtqaviv//ovLr74Yvr6+gCoqKhg1apVXHXVVeqaEREREREREREREZGTzix3AUP+7//9v4TDYc4880xisRixWIw5c+YQiUT453/+53KXJyIiIiIiwIUXXsgDDzxAW1sbjuNwxRVXHPE5CxcuZMOGDaTTabZu3conPvGJg8753Oc+R2trK6lUiieffJJzzz33RJQvIiIiInLURk2IvnTpUj73uc/x4osvlta2bNnCddddx7ve9a4yViYiIiIiMrY1NjYet2sFg0FaWlq47rrrRnT+lClTeOihh1i1ahXnnHMOP/rRj/j5z3/OkiVLSudceeWVLFu2jG9/+9vMnTuXlpYWli9fTk1NzXGrW0RERETkWI2aEN00TXK53EHruVwO0xw1ZYqIiIiIjDnbtm1j5cqVfPSjH8Xr9b6paz3yyCN84xvf4Pe///2Izr/22mtpbW3lS1/6Ei+++CJ33HEH/+///T+++MUvls654YYbuPPOO7n77rvZsmUL1157Lclkkquvvvqw1/V4PITD4WFfIiIiIiInwqhJp1euXMmPf/xj6uvrS2vjx4/nhz/8IY899lgZKxMRERERGdvmzp3Ls88+y7Jly+jo6OBnP/vZSRuXsmDBAh599NFha8uXL2fBggUAuN1u5s2bN+wcx3F49NFHS+ccys0330w8Hi99tbW1nZgXICIiIiKnvVETon/+858nEomwY8cOtm3bxrZt22htbSUSifA3f/M35S5PRERERGTMamlp4frrr2f8+PFcffXV1NfX85e//IXnnnuOL37xi1RXV5+we9fV1bFnz55ha3v27CEajeLz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2UN0gLvuuou77rrrkI9dd911J7kaEREREQFoWnIJcxYtJNHdQ297O75wmDmLFgKw4cFHylydjNTkyZN55zvfidvtZvXq1bzwwgvlLklEREREZEwZFSG6iIiIiIwugWiExuYmEt09DHT3AJS+NzY3sWXNWo12GQMuvvhi/vCHP+D3+wHI5/NcffXV/OpXvypzZSIiIiIiY4dZ7gJEREREZPQJRCN4AwHSicSw9XQigTfgJxCNlKkyORrf+c53+NOf/kRDQwOxWIw777yT733ve+UuS0RERERkTFGILiIiIiIHSfbHySST+MLhYeu+cJhMMqUu9DFizpw5fO1rX6Ojo4O+vj6+/OUvM27cOKqqqspdmoiIiIjImKEQXUREREQOkuyP07qphXCsilCsCsvjJhSrIhyronVTi0L0MSISidDV1VU6TqVSpFIpotFoGasSERERERlbRt1M9GnTpjFt2jTWrFlDOp0udzkiIiIip62WFauA4gz0yvo6MskUm1euLq3L2HDppZfS399fOjZNk8WLF7Nnz57S2oMPPliO0kRERERExoRRE6JXVVXxm9/8hkWLFuE4DmeccQatra3827/9G729vXzpS18qd4kiIiIip5V8JsOGBx9hy5q1BKIRkv1xdaCPQffcc89Ba//yL/9S+rPjOFjWqPnPAhERERGRUWfUjHP54Q9/SD6fZ9KkSSSTydL6b37zG5YuXVrGykREREROb8n+OF2v7VKAPga5XK4jfilAFxERERF5Y6PmHfOSJUu49NJLaWtrG7a+detWJk+eXKaqREREREREREREROR0Nmo60YPB4LAO9CFVVVVkMpkyVCQiIiIiIiIiIiIip7tRE6L/z//8Dx//+MdLx47jYBgGX/nKV1i1SptXiYiIiIiIiIiIiMjJN2rGuXzlK1/hscceY/78+Xg8Hr73ve9x5plnUlVVxdve9rZylyciIiIiIiIiIiIip6FR04n+/PPPM2PGDP7yl79w//33EwwG+e1vf0tzczPbt28vd3kiIiIiIiIiIiIichoaNZ3oEydOZOfOnXz3u9897GMiIiIiInJsotEoH/zgB5k2bRr/9E//RG9vL83NzezZs4fdu3eXuzwRERERkVFr1ITora2t1NfXs3fv3mHrVVVVtLa2YlmjplQRERERkTHlrLPO4tFHH6W/v58pU6Zw55130tvby/vf/34mTZrEJz7xiXKXKCIiIiIyao2acS6GYeA4zkHroVCIdDpdhopERERERE4Ny5Yt4+6772bGjBnD3ls//PDDXHTRRWWsTERERERk9Ct7e/cPfvADABzH4Tvf+Q7JZLL0mMvl4rzzzuOZZ54pU3UiIiIiImPfueeey2c+85mD1tva2qirqytDRSIiIiIiY0fZQ/Tm5mag2Il+1llnkc1mS49ls1laWlr4/ve/X67yRERERE57gWiEQDRCsj9Osj9e7nLkGGQyGSKRyEHrM2bMOGicooiIiIiIDFf2EH3RokUA/OIXv+ALX/gCiUSizBWJiIiICIDl9dK05BIam5vwBgJkkklaN7XQsmIV+Uym3OXJUXjggQf45je/yZVXXgkUfwt04sSJ3H777dx3331lrk5EREREZHQbNTPRr7766mEBejgc5oorrmDmzJllrEpERETk9NW05BLmLFqIbdv0trdj2zZzFi2kacklQLFDvXrSBALRgzucZXS58cYbCYVCdHZ24vf7Wb16Ndu2bSORSPB3f/d35S5PRERERGRUK3sn+pDf/OY3rFmzhjvuuAOfz8f69euZMmUKhmFw1VVX8dvf/rbcJYqIiIicNgLRCI3NTSS6exjo7gEofZ82rxmP30/DrBnqUB8j4vE4S5Ys4W1vextnn302oVCIjRs38thjj5W7NBERERGRUW/UhOgXXXQR//AP/wDA//pf/wvDMKioqOATn/gEX//61xWii4iIiJxEgWgEbyBAb3v7sPV0IsHU+c1U1I2ja9duetvb8YXDzFm0EIANDz5SjnJlhB5//HEef/zxcpchIiIiIjKmjJoQPRqN0tNT7G5aunQp9913H6lUioceeoh/+qd/KnN1IiIiIqeXZH+cTDKJLxwudaADhGIxApEIna2vHtSh3tjcxJY1a7X56Cj0N3/zN4dcdxyHdDrNtm3bWLNmDbZtn+TKRERERERGv1ETou/cuZMFCxbw0EMPsXTpUq666ioAKisrSafTZa5ORERE5PSS7I/Tuqml1GGeTiTwhcNEx9WQiieGBetDj1fW1xGIRhSij0Jf/OIXqampIRAI0NvbCxTfZyeTSQYGBhg3bhzbt2/nkksuYdeuXWWuVkRERERkdBk1G4v+6Ec/4le/+hW7du1i9+7d/PnPfwaKY16ee+658hYnIiIichpqWbGKzStXY5omlfV1mKbJ5pWr2bN9B75weNi5vnCYTDKlAH2U+trXvsbTTz/NGWecQXV1NdXV1cyYMYN169bxhS98gUmTJtHR0cEPf/jDcpcqIiIiIjLqGIBT7iKGzJ07l0mTJvGnP/2JwcFBAC677DL6+vpYu3Ztmat7Y+FwmHg8TiQSIZFIlLscERERkRELRCNUTRiPAXTv2n1QEB6IRkod5sn+OPPes5Q5ixaS6O4pdaiHY1VsXrlaM9GP0sl6D7lt2zY+8IEP0NLSMmz9nHPO4b777mPatGksWLCA++67j/Hjx5+wOk6kcr4ff+Ck3k1Expr3lruA0eTD5S5AREa1X5/8W470PeSoGecCsHHjRjZu3Dhs7eGHHy5TNSIiIiJjz4GB9xuxvF7mXraEee++lGjdOAwMetv3sPGhR9j48J/IZzIAB12rZcUqoDgDvbK+jkwyxeaVq0vrMvrU19djWQe/9bcsi7q6OgB2795N+IDfMBARERERkVEWojc0NPDe976XSZMm4fF4hj124403lqkqERERkdHP8nppWnIJjc1NeAMBMskkrZtaaFmxqhSGH+jcKy7jbVe9H28wyGBfHMNwqGyoY8GV76eQzx+2qzyfybDhwUfYsmbtiAN7Ka9Vq1bxL//yL3zqU5/imWeeAYpd6D/96U9ZuXIlAGeddRatra1lrFJEREREZHQaNSH6okWLeOCBB9i+fTuzZs1i8+bNTJkyBcMwDupOFxEREZHhmpZcUhqx0tveji8cLm0KemAYbnm9nHvFZVz0v68iHKuikMuR9aUZ7OnDLjh4/D7OOG8+W9asfcNwXOH52HHNNdfwH//xH2zYsIFcLgcUu9Afe+wxrrnmGgAGBgbUuCIiIiIicgijJkS/7bbb+P73v8+3vvUt4vE4H/jAB+js7ORXv/oVjzyi2ZoiIiIihxOIRmhsbiLR3cNAdw9A6Xtjc9NBYXjTkks4a9FFuNwWhXwOu1AgVFEBQLKvH4/PSyDy+lgYGfv27NnDkiVLmDlzJjNmzADgpZde4uWXXy6d8+c//7lM1YmIiIiIjG6jJkSfPXs2H/5wcYeJfD6P3+9ncHCQb37zm9x///387Gc/K3OFIiIiIqNTIBrBGwjQ294+bD2dSFBZXzcsDB8K3Ps69xKKxfD6/TiOQyGXxx8Kkc/kwDBIxtVlfip66aWXeOmll8pdhoiIiIjImDJqQvTBwcHSHPT29namTZvGCy+8AEB1dXU5SxMREREZ1ZL9cTLJJL5wuNSBDuALh8kkU8PC8P0D9562NkJVFbh9XnLZHG63RaAywkBXL1vXrVeIforR/kMiIiIiIsem7CH6N77xDX7wgx/w5JNP8va3v50XX3yRhx9+mB/84AecddZZvP/97+fJJ58sd5kiIiIio1ayP07rppbSDPR0IoEvHCYcq2LzytXDwvD9A/eOV3ZgmC7qZ0zDHw5jGAa9bR2sv/8hWlasKtfLkRNA+w+JiIiIiBw7s9wF3HLLLQSDQW644QbWrVtXWnvsscf40Ic+xI4dO0qbHR2Nz33uc7S2tpJKpXjyySc599xzR/S8D33oQziOw+9+97ujvqeIiIhIubSsWMXmlasxTZPK+jpM02TzytUHheFDgXs4VkUgGmHPK9vZ9tQG2l58mTX//mvu/sJNPPW7P5DPZMr0SuREGNp/6OyzzyadTvOBD3yAiRMnsnr1av77v//7mK55NO+3V61aheM4B3394Q9/KJ1z1113HfT4H//4x2OqTURERETkeCp7J7phGAC0traW1pLJJJ/97GeP+ZpXXnkly5Yt49prr2XdunVcf/31LF++nJkzZ7J3797DPm/y5Ml8//vfZ82aNcd8bxEREZFyyGcybHjwEbasWVuagX64cSxDwXpjcxOV9XVkkime/v0faFmxSuH5Kep47z90tO+33//+9w8bIROLxWhpaTkowP/jH//IJz/5ydJxRv8eRURERGQUKHuIDuA4znG93g033MCdd97J3XffDcC1117L5ZdfztVXX83tt99+yOeYpsmvfvUrbrnlFi688EIqKiqOa00iIiIiJ8MbhedDjiZwl1PD8d5/6Gjfb/f29g47vuqqq0gmkweF6JlMhj179hx1PSIiIiIiJ9KoCNFffvnlIwbpsVhsRNdyu93MmzeP2267rbTmOA6PPvooCxYsOOzzvvnNb9LZ2ckvfvELLrzwwiPex+Px4PV6S8fhcHhE9YmIiIiMFgrPTx/Hc/+hY32/vb9rrrmG//qv/yKZTA5bv/jii9mzZw+9vb2sXLmSr3/96/T09BzyGno/LiIiIiIny6gI0W+55Rb6+/uPy7Wqq6uxLOugDpY9e/Ywa9asQz7nbW97G9dccw3nnHPOiO9z8803861vfetNVCoiIiJy7ALRiLrIZcRuuOEGQqEQUHzvHQqF+NCHPsTWrVu54YYbjupax/J+e3/nnnsuZ5111kH7Hj3yyCP89re/pbW1lWnTpvHd736XP/7xjyxYsADbtg+6jt6Pi4iIiMjJMipC9P/6r/96w1nlJ1IoFOI//uM/+PSnP013d/eIn3fbbbexbNmy0nE4HKatre1ElCgiIiJSYnm9NC25hMbmJryBAJlkktZNLZpnLodlmiYTJkzg2WefBd78/kNv1jXXXMOzzz7L008/PWz9N7/5TenPmzdv5tlnn2X79u1cfPHFrFy58qDr6P24iIiIiJwsZQ/Rj/c89K6uLvL5PLW1tcPWa2tr6ejoOOj8adOm0djYyIMPPlhaM00TgFwux8yZM9m+fftBz8tms2Sz2eNau4iIiMiRNC25hDmLFpLo7qG3vR1fOMycRQsB2PDgI2WuTkYj27ZZsWIFs2fPPi6//Xm077f3FwgEuOqqq/jmN795xPu0trayd+9epk+ffsgQXe/HRURERORkMctdgGEYx/V6uVyODRs2sHjx4mH3WLx4MU888cRB57/44ovMmTOHc845p/T1wAMPsGrVKs455xx27tx5XOsTEREROVaBaITG5iYS3T0MdPeQz+YY6O4h0d1DY3MTgWik3CXKKLV582amTp16XK51tO+39/dXf/VXeL1efvnLXx7xPg0NDcRiMdrb2990zSIiIiIib0bZO9FdLtdxv+ayZcu45557WL9+PU899RTXX389wWCQu+66C4B77rmHtrY2vva1r5HJZHj++eeHPb+vrw/goHURERGRcgpEI3gDAXoPCBXTiQSV9XWlGekiB/r617/O97//fb7xjW+wYcMGBgcHhz2eSCSO6npH8357f9dccw2///3vD9osNBgMcsstt3DffffR0dHBtGnT+N73vse2bdtYvnz5MbxiEREREZHjp+wh+olw7733UlNTw6233kpdXR3PPPMMS5cupbOzE4BJkyYdcnMiERERkdEqEI3gC4co5HP4wmEGul8PIX3hMJlk6rgE6Nqw9NT08MMPA/DAAw8MG6doGAaO42BZR/efBcfyfnvGjBlceOGFvPOd7zzoeoVCgbPPPptPfOITVFRUsHv3blasWME3vvENjWwRERERkbIzgOM7lPw0FQ6HicfjRCKRo+7kERERETmcAzcSjdTE8AQCtL34Esm+fnzhMOFYFZtXrn5TM9EPt2Hp1nUb8Pi8CtVPkJP1HvKiiy56w8fXrFlzwu59spTz/fgDJ/VuIjLWvLfcBYwmHy53ASIyqv365N9ypO8hT8lOdBEREZGxYKjr23EcDMM4ZFB94EaimVSKCbNnUD1xIgm/n0wyxeaVq2lZsepN1XLgfQIVUd7+kSt56/veTXxvdylUb1mxinwm86buJSffqRCSi4iIiIiUi0J0ERERkZNsqOt72rxmxk1rJBAJk4on2LN9B6+s31gKqg/cSBQg3rmX3S4X/nCQp373IG0vbn3THeKHuk+wsoJARQSPz0fbS1uxPB7mLFoI8KY63qV83v72t/OZz3yGqVOn8ld/9Vfs3r2bj33sY7S2tvL444+XuzwRERERkVHLLHcBIiIiIqeboa7vyoZ6gtEIdsEmEI1Q1VDHnEULaVpyCfD6RqLpfb9WaLpc1M+czoTZM5gwexbnfeAKZl90AZbX+6bqOfA+bq+Xyro60okEjl3ANE0GuntIdPfQ2NxEIBp5cz8AOene//73s3z5clKpFHPnzsW7799MNBo9aPNPEREREREZTiG6iIiIyEk01PWdSgzgD4dJDyYZ7OsjPZjEFwqTSiRKQXWyP04mmcQXDgNQO72R2imTMV0WyXiCbDo9LHQ/Vgfex+3zYrktHMcgn8uT2ze+JZ1I4A34FaKPQV//+te59tpr+eu//mtyuVxp/fHHH2fu3LllrExEREREZPRTiC4iIiJyEg11fRdyWSy3RT5bDKjz2QyW26KQy5eC6mR/nNZNLYRjVVTU1xFrGI9tO5guk97du+lr33NcusP3v08oVoVt2xguF4FIiL6ODnLpYo2+cJhMMqUNRsegmTNnHnIuen9/PxUVFSe/IBERERGRMUQhuoiIiMhJNNT17XJ7yOfyWJ7iWA3L4yWfy+NyW8OC6pYVq9i8cjUenxd/OEwhn6ezdQcdr+wAjl93+NB9TNMkXFVJoquHZH+cgd5+LI+bUKyKcKyK1k0tCtHHoI6ODqZPn37Q+tvf/na2b99ehopERERERMYObSwqIiIichINdX3PWbSQVCJBRe043F4vLstFf2cn/nCYzStXl4LqfCbDhgcfYcczz/Guv/kM2XSavvY9pesdr+7woftsWbOWQDRCNpXmjPPn09jcRGV9HZlkis0rV9OyYtWbuo+Ux5133smPf/xjrr76ahzHYfz48SxYsIDvf//7fOc73yl3eSIiIiIio5pCdBEREZGTbCiInjavGbfPSyAcJtkfp6etg1fWbzxkUN29s40t/7OWOYsWks/mSCcS+MJhwrGqYaH7oQSikdJ4mCOF7fufs3+oPpLnyuj1j//4j5imyWOPPUYgEGDNmjVkMhm+//3v85Of/KTc5YmIiIiIjGoG4JS7iFNBOBwmHo8TiURIJBLlLkdERETGgKFw23EcDMM4YlBteb00LbmExuYmvAE/mWSK1k0ttKxYRX7f5p+HPz9AJpl8w/Pl5DvZ7yHdbjfTp08nFArxwgsvMDg4eMLvebKU8/34Ayf1biIy1ry33AWMJh8udwEiMqr9+uTfcqTvIdWJLiIiIlImR9vdfeDIlSM9v2nJJcxZtJBEdw+97e34wmHmLFoIFLvM5fTx0Y9+lN/+9rekUim2bNlS7nJERERERMYUbSwqIiIiMsYk++N0vbbriCNcGpubSHT3MNDdQz6bY6C7h0R3D43NTW96I1IZW374wx/S2dnJr371K971rndhmvrPABERERGRkdK7ZxEREZFTUCAawRsIkD7gVxLTiQTegF8h+mmmvr6eq666CsdxuPfee2lvb+cnP/kJCxYsKHdpIiIiIiKjnkJ0ERERkVNQsj9OJpnEFw4PW/eFw2SSqcN2sQeiEaonTVDIfoopFAo89NBDfOxjH2PcuHF88YtfZMqUKaxatYpt27aVuzwRERERkVFNM9FFRERETkHJ/jitm1pKM9DTiQS+cJhwrIrNK1cfFKJrE9LTRyqVYvny5VRWVjJ58mRmz55d7pJEREREREY1daKLiIiInKJaVqxi88rVmKZJZX0dpmmyeeVqWlasOujcoU1Ibdumt70d27aZs2ghTUsuKUPlciL4/X4+8pGP8NBDD9HW1sb111/P7373O84888xylyYiIiIiMqqpE11ERERkFApEIwSiEZL98TfcQPSN5DMZNjz4CFvWrH3Dax24CSlQ+t7Y3MSWNWuPuQYZHX7961/z7ne/m2Qyyb333st3vvMdnnzyyXKXJSIiIiIyJihEFxERERlFTsRYlSMF8UObkPa2tw9bTycSVNbXlQJ4GbsKhQJXXnkly5cvx7btYY+deeaZPP/882WqTERERERk9FOILiIiIjKKDI1VSXT30Nveji8cLs013/DgI8ftPgd2ug9tQjrUgQ5H3oRUxo6Pfexjw45DoRAf/vCH+dSnPsW8efOwLP1ngYiIiIjI4ejdsoiIiMgocTLGqhyu0/21555n9kVvA468CamMXRdeeCHXXHMNH/jAB9i9eze//e1vue6668pdloiIiIjIqKaNRUVERERGiaGxKulEYth6OpHAG/ATiEaGnVs9acKwtZE43AaiYIx4E1IZW2pra7npppt4+eWX+e///m/i8Ther5f3ve993Hzzzaxfv77cJYqIiIiIjGrqRBcREREZJUYyVuXNzEx/o073SWe9hYd//NMjbkIqY8sDDzzARRddxEMPPcT111/PI488gm3bXHvtteUuTURERERkzFAnuoiIiMgokeyP07qphXCsilCsCsvjJhSrIhyronVTC8n++GE7yZuWXHLE6+/f6e72eglEI7i93mGd7sn+OF2v7VKAfop417vexb/9279xyy238PDDDx+0qaiIiIiIiByZQnQRERGRUaRlxarDjlU5sJM8n80x0N1DoruHxuamI452SfbHyaXTTJzzFs44/1ymnzuXM84/l4lz3kIunVFwfgp6+9vfTjgcZsOGDTz55JNcd911xGKxcpclIiIiIjKmaJyLiIiIyCiSz2TY8OAjhxyrUlFbgzcQoLe9fdhz0okElfV1pfMPJ9kfp2AXqJ06hWR/gvTgAL5giNqpU+jaqe7zU9G6detYt24d119/PR/60Ie4+uqrWbZsGaZp8s53vpOdO3cyMDBQ7jJFREREREY1daKLiIiIjEKHGquy/8z0/e0/M/2NBKIRXC6LztYd5LNZfIEA+WyWztYduFzWUW9SKmNHMpnkrrvu4sILL+Sss87iBz/4AV/96lfp7Ozk/vvvL3d5IiIiIiKjmkJ0ERERkVEkEI1QPWnCIQPtkcxMP9K13V4vrz33AlvXPc22pzeydd3TvPbcC7i9HoXop4mXX36Zm266iQkTJvDhD3+43OWIiIiIiIx6GuciIiIiMgpYXi9NSy6hsbkJbyBAJpmkdVMLLStWkc9kSue1rFgFQGNzE5X1dWSSqdLM9CPZv5N9oLuHXLp43VCsakSd7HJqsW2b+++/X53oIiIiIiJHoBBdREREZBRoWnIJcxYtJNHdQ297O75wmDmLFgKw4cFHgGIneSAaYcuatYecmX4kQ53sQ9dNJxL4wmHCsSo2r1ytEF1ERERE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iDc2N+ELBijk8zz36CqyqQx10xvJDCbZ+fwLdGzbzsaHVhDf21XmikUOz+12M2/ePG677bbSmuM4PProoyxYsOCwzwuFQuzYsQPTNNm4cSNf+9rXeOGFFwBobGykvr6eRx99tHR+PB5n3bp1LFiwgN/85jcHXc/j8QzrUg+Hw8fj5YmIiIiIHEQhuoiIiMgJ5vF5ebVlM7teeInZFy6gbvo06s+YTiaZpO3Fl2nd2EJ8b5fGt8iYUF1djWVZ7NmzZ9j6nj17mDVr1iGf89JLL3H11Vfz7LPPEo1G+dKXvsTatWs588wzaWtro66urnSNA6859NiBbr75Zr71rW+9+RckIiIiInIECtFFREREThDL66VpySU0NjfhDQSI1MTwBAK0vfgS8b178YXDzFjwVrKpFB3btpe7XJET5sknn+TJJ58sHa9du5YtW7bwmc98hm9+85vHdM3bbruNZcuWlY7D4TBtbW1vulYRERERkQNpJrqIiIictgLRCNWTJhCIRk7INZuWXMKcRQuxbZtETw+hqioCFRGClRXkszkGuntIdPfQ2Nx0XGsQOZG6urrI5/PU1tYOW6+traWjo2NE18jn82zatInp06cDlJ53NNfMZrMkEolhXyIiIiIiJ4I60UVEROS0c2CHeCaZpHVTCy0rVpHPZI7LNQv5PBV1tXTt3MlAdw+BaATHtkknElTW1dK1Yye5TKZ4XF9HIBrROBcZE3K5HBs2bGDx4sXcf//9ABiGweLFi/nJT34yomuYpslZZ53Fww8/DEBrayvt7e0sXryYlpYWoNhZft555/HTn/70xLwQEREREZERUie6iIiInHb27xDvbW/Htm3mLFpI05JLjts1TctF9aQJRKpjAOQyGfK5HI5j4HK7cfuKGyL6wmEyyZQCdBlTli1bxqc//Wk+/vGPM2vWLH76058SDAa56667ALjnnnv47ne/Wzr/G9/4Bu985ztpbGykubmZX/7yl0yePJmf//znpXN+9KMf8fWvf533vOc9zJkzh3//939n9+7d/P73vz/ZL09EREREZBh1oouIiMhpJRCN0NjcRKK7h4HuHoDS98bmJrasWXvUgfahrtm/p5PMYJLYxAnseWUHuXSGRFcX9TOnk01lsG2bUKyKcKyKzStXK0SXMeXee++lpqaGW2+9lbq6Op555hmWLl1KZ2cnAJMmTcK2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3ylVz10IAQD2c1+/fj26du2KL774Ar1798aJEycwffr0O5ofERERERERETUtFtGJiJoZrVaLrKwsREVFObRHRUXh3LlzAACz2QwADg/prOyzatUq7NmzB+fOnYPJZEJAQECT52w2m6vlcurUKYSFhSEtLa1aVBajaxIVFYWjR49izZo1SEpKQlpaGu699177dp1Oh/T0dDz55JP1yqcqZ95jZ2VmZmLt2rV47rnnsGzZMrzxxhv12p+IiIiIiIiImjfezoWIqBlaunQpFixYgLS0NCQlJeHVV19Fnz59MGHCBABAfn4+9Ho9hg4diszMTBiNRmg0Gly6dAmvvPIKTpw4AbVajaVLl0Kv1zd5vleuXMGTTz6JI0eOwGQyoaSkBAsXLsTu3btx9epVfPvtt7DZbAgPD0evXr0wb968Wse6dOkSJk6ciCFDhiA9PR2vvPIKBgwYgPT0dHuf2NhYfPLJJ8jPz8eePXugUqkQFRWFjz76qNZ8bnar99gZK1aswJ49e3Dx4kX4+vri8ccfx/nz551/44iIiIiIiIio2eNKdCKiZmjVqlVYvnw5li1bhjNnzmDo0KEYNWoUfvvtNwCA1WpFdHQ03nzzTWRnZ2Pnzp0AgD/96U/w9fXFqVOn8MUXX2DVqlXIz89v8nz/53/+B3/4wx+QkZGBxMREAMDevXvxzDPPYMiQIUhISEB8fDz++te/4vfff69zrLVr12Lbtm34+uuvcezYMfj5+eFf//qXQ59NmzZhxowZmDZtGs6ePYvdu3ejW7dudeZzs1u9x86QyWT4+OOPcf78efz444+4ePEipk2b5vT+RERERERERNT8SVDxhFEiIiIiIiIiIiIiIroJV6ITEREREREREREREdWCRXQiIiIiIiIiIiIiolqwiE5EREREREREREREVAsW0YmIiIiIiIiIiIiIasEiOhERERERERERERFRLVhEJyIiIiIiIiIiIiKqBYvoRERERERERERERES1YBGdiIiIiIiIiIiIiKgWLKITEREREREREREREdWCRXQiIiIiIiIiIiIiolqwiE5EREREREREREREVIv/Dw6e4cxfhpfXAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1500x1000 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Visualize taste score distribution\n",
    "fig, axes = plt.subplots(2, 2, figsize=(15, 10))\n",
    "\n",
    "# 1. Taste score distribution\n",
    "axes[0, 0].hist(user_taste_scores[\"taste_score\"], bins=50, edgecolor=\"black\", alpha=0.7)\n",
    "axes[0, 0].set_xlabel(\"Taste Score\")\n",
    "axes[0, 0].set_ylabel(\"Number of Users\")\n",
    "axes[0, 0].set_title(\"Distribution of User Taste Scores (PageRank)\")\n",
    "\n",
    "# 2. Taste score vs play count\n",
    "axes[0, 1].scatter(\n",
    "    user_taste_scores[\"avg_play_count\"],\n",
    "    user_taste_scores[\"taste_score\"],\n",
    "    alpha=0.5,\n",
    "    s=20,\n",
    ")\n",
    "axes[0, 1].set_xlabel(\"Average Play Count\")\n",
    "axes[0, 1].set_ylabel(\"Taste Score\")\n",
    "axes[0, 1].set_title(\"Taste Score vs Engagement\")\n",
    "\n",
    "# 3. Taste score vs number of interactions\n",
    "axes[1, 0].scatter(\n",
    "    user_taste_scores[\"total_interactions\"],\n",
    "    user_taste_scores[\"taste_score\"],\n",
    "    alpha=0.5,\n",
    "    s=20,\n",
    ")\n",
    "axes[1, 0].set_xlabel(\"Total Interactions\")\n",
    "axes[1, 0].set_ylabel(\"Taste Score\")\n",
    "axes[1, 0].set_xscale(\"log\")\n",
    "axes[1, 0].set_title(\"Taste Score vs Activity Level\")\n",
    "\n",
    "# 4. Compare bot vs non-bot behavior\n",
    "bot_interactions = reactions_on_others[reactions_on_others[\"user_id\"].isin(bot_users)]\n",
    "bot_stats = bot_interactions.groupby(\"user_id\")[\"play_count\"].mean().mean()\n",
    "normal_stats = df_filtered.groupby(\"user_id\")[\"play_count\"].mean().mean()\n",
    "\n",
    "axes[1, 1].bar(\n",
    "    [\"Bot Users\", \"Normal Users\"],\n",
    "    [bot_stats, normal_stats],\n",
    "    color=[\"red\", \"green\"],\n",
    "    alpha=0.7,\n",
    ")\n",
    "axes[1, 1].set_ylabel(\"Average Play Count\")\n",
    "axes[1, 1].set_title(\"Bot vs Normal User Consumption Behavior\")\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "fb00cd6b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=== PAGERANK TASTE ANALYSIS SUMMARY ===\n",
      "\n",
      "1. Bot Detection:\n",
      "   - Detected 4277 bot users\n",
      "   - Removed 1210799 bot interactions\n",
      "   - Bot avg play count: 1.75 vs Normal: 1.17\n",
      "\n",
      "2. Selectivity Weight Distribution:\n",
      "   - Total users with weights: 149695\n",
      "   - Mean selectivity weight: 26.26\n",
      "   - Median selectivity weight: 20.00\n",
      "   - Users with weight > 10 (very selective): 92416\n",
      "   - Users with weight > 20 (extremely selective): 67465\n",
      "\n",
      "   Weight percentiles:\n",
      "   - 10th percentile: 8.18\n",
      "   - 25th percentile: 10.00\n",
      "   - 50th percentile: 20.00\n",
      "   - 75th percentile: 50.00\n",
      "   - 90th percentile: 50.00\n",
      "   - 95th percentile: 50.00\n",
      "   - 99th percentile: 50.00\n",
      "\n",
      "3. User Taste Distribution:\n",
      "   - Total users analyzed: 22959\n",
      "   - Average taste score: 0.006\n",
      "   - Std deviation: 0.024\n",
      "\n",
      "4. Curator Candidates (taste >= 0.8, interactions >= 20):\n",
      "   - Found 5 potential curators\n",
      "   - They have 1.4x average play count\n",
      "   - They interact with 5981 unique clips on average\n"
     ]
    }
   ],
   "source": [
    "# Summary and Export Results\n",
    "print(\"=== PAGERANK TASTE ANALYSIS SUMMARY ===\\n\")\n",
    "\n",
    "# Key statistics\n",
    "print(f\"1. Bot Detection:\")\n",
    "print(f\"   - Detected {len(bot_users)} bot users\")\n",
    "print(f\"   - Removed {len(reactions_on_others) - len(df_filtered)} bot interactions\")\n",
    "print(f\"   - Bot avg play count: {bot_stats:.2f} vs Normal: {normal_stats:.2f}\")\n",
    "\n",
    "print(f\"\\n2. Selectivity Weight Distribution:\")\n",
    "print(f\"   - Total users with weights: {len(user_weights)}\")\n",
    "print(f\"   - Mean selectivity weight: {user_weights['selectivity_weight'].mean():.2f}\")\n",
    "print(\n",
    "    f\"   - Median selectivity weight: {user_weights['selectivity_weight'].median():.2f}\"\n",
    ")\n",
    "print(\n",
    "    f\"   - Users with weight > 10 (very selective): {len(user_weights[user_weights['selectivity_weight'] > 10])}\"\n",
    ")\n",
    "print(\n",
    "    f\"   - Users with weight > 20 (extremely selective): {len(user_weights[user_weights['selectivity_weight'] > 20])}\"\n",
    ")\n",
    "\n",
    "# Show weight distribution by percentiles\n",
    "percentiles = [10, 25, 50, 75, 90, 95, 99]\n",
    "print(f\"\\n   Weight percentiles:\")\n",
    "for p in percentiles:\n",
    "    value = user_weights[\"selectivity_weight\"].quantile(p / 100)\n",
    "    print(f\"   - {p}th percentile: {value:.2f}\")\n",
    "\n",
    "print(f\"\\n3. User Taste Distribution:\")\n",
    "print(f\"   - Total users analyzed: {len(user_taste_scores)}\")\n",
    "print(f\"   - Average taste score: {user_taste_scores['taste_score'].mean():.3f}\")\n",
    "print(f\"   - Std deviation: {user_taste_scores['taste_score'].std():.3f}\")\n",
    "\n",
    "# Find curator candidates\n",
    "high_taste_active = user_taste_scores[\n",
    "    (user_taste_scores[\"taste_score\"] >= 0.8)\n",
    "    & (user_taste_scores[\"total_interactions\"] >= 20)\n",
    "]\n",
    "\n",
    "print(f\"\\n4. Curator Candidates (taste >= 0.8, interactions >= 20):\")\n",
    "print(f\"   - Found {len(high_taste_active)} potential curators\")\n",
    "print(\n",
    "    f\"   - They have {high_taste_active['avg_play_count'].mean():.1f}x average play count\"\n",
    ")\n",
    "print(\n",
    "    f\"   - They interact with {high_taste_active['unique_clips'].mean():.0f} unique clips on average\"\n",
    ")\n",
    "\n",
    "# # Save results\n",
    "# user_taste_scores.to_csv(\n",
    "#     \"/home/tony/Data/Preference/pagerank_user_taste_scores.csv\", index=False\n",
    "# )\n",
    "# clip_quality.to_csv(\"/home/tony/Data/Preference/pagerank_clip_quality.csv\")\n",
    "# high_taste_active.to_csv(\n",
    "#     \"/home/tony/Data/Preference/curator_candidates.csv\", index=False\n",
    "# )\n",
    "\n",
    "# print(f\"\\n4. Files saved:\")\n",
    "# print(\n",
    "#     f\"   - User taste scores: /home/tony/Data/Preference/pagerank_user_taste_scores.csv\"\n",
    "# )\n",
    "# print(f\"   - Clip quality scores: /home/tony/Data/Preference/pagerank_clip_quality.csv\")\n",
    "# print(f\"   - Curator candidates: /home/tony/Data/Preference/curator_candidates.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "055f049f",
   "metadata": {},
   "source": [
    "## Summary of Key Issues Found\n",
    "\n",
    "### 1. Clip Quality Calculation was Flawed\n",
    "- **Problem**: Top \"quality\" clips had only 1 like but high play counts\n",
    "- **Fix**: Now requires minimum 3 unique likers and weights unique likers heavily (40%)\n",
    "- **Result**: Only clips liked by multiple users can be considered \"good\"\n",
    "\n",
    "### 2. Bot Detection was Too Aggressive  \n",
    "- **Problem**: Removed 50% of all interactions, leaving too few users\n",
    "- **Fix**: Adjusted thresholds - now only flag users with >50% like rate AND 50+ interactions\n",
    "- **Result**: More reasonable filtering that preserves genuine selective users\n",
    "\n",
    "### 3. Neutral Listens are Critical\n",
    "- **Finding**: 60.6% of interactions are neutral listens (no like/dislike)\n",
    "- **Insight**: Good taste users listen to many clips but only like the exceptional ones\n",
    "- **Implementation**: All interactions now contribute to the PageRank graph\n",
    "\n",
    "### 4. Data Sparsity Issue\n",
    "- Most clips have very few likes after bot filtering\n",
    "- This makes it hard to identify consensus about quality\n",
    "- Need either more data or different approach for sparse interaction data\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6fae43e4",
   "metadata": {},
   "source": [
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ee982372",
   "metadata": {},
   "source": [
    "## Key Insights\n",
    "\n",
    "### Including Neutral Listens Changes Everything\n",
    "\n",
    "By counting all interactions (not just likes/dislikes), we reveal the true behavior patterns:\n",
    "\n",
    "1. **Real Users are Selective**: They listen to many clips but only like the truly good ones (low like rate)\n",
    "2. **Bots are Indiscriminate**: They like most of what they interact with (high like rate) and rarely just listen without reacting\n",
    "3. **Engagement Matters**: Neutral listens with high play counts show genuine interest even without explicit likes\n",
    "\n",
    "### PageRank Captures Good Taste\n",
    "\n",
    "The algorithm naturally identifies users with good taste through recursive scoring:\n",
    "\n",
    "1. **Selective Users Win**: Users who listen to many but like few get higher scores when those few likes align with other high-score users\n",
    "2. **Bot Filtering is Critical**: By removing users with high like rates and low consumption, we prevent bots from polluting the taste network\n",
    "3. **Quality Emerges from Consensus**: Clips become \"good\" when selectively liked by users who themselves have good taste\n",
    "\n",
    "This creates a virtuous circle where discerning users and quality content mutually identify each other.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "057666c4",
   "metadata": {},
   "source": [
    "## Improvements Implemented\n",
    "\n",
    "This notebook has been updated with the following improvements based on the instructions:\n",
    "\n",
    "### 1. **Bot Detection (Fixed)**\n",
    "- ✅ Threshold updated to >80% like rate (as per instructions)\n",
    "- ✅ Added detection for users with >100 likes but avg_play_per_like < 0.1\n",
    "- ✅ Consolidated redundant criteria for cleaner code\n",
    "- ✅ Removed second-pass filtering - all bots caught in first pass\n",
    "\n",
    "### 2. **Selective User Vote Weighting (New Feature)**\n",
    "- ✅ Implemented weight = total_interactions / total_likes\n",
    "- ✅ Selective users (few likes) get higher weights up to 50\n",
    "- ✅ Example: 100 interactions, 4 likes → weight = 25\n",
    "- ✅ Example: 100 interactions, 50 likes → weight = 2\n",
    "\n",
    "### 3. **Graph Construction (Enhanced)**\n",
    "- ✅ User → Clip edges weighted by: selectivity_weight × (1 + log(play_count))\n",
    "- ✅ Selective users who actually listen have the most influence\n",
    "- ✅ Neutral listens included with lower weight (0.1 + 0.1 × log(play_count))\n",
    "- ✅ Dislikes weighted negatively by selectivity\n",
    "\n",
    "### 4. **Validation & Monitoring (Added)**\n",
    "- ✅ Automatic check for users with >80% like rate in results\n",
    "- ✅ Selectivity weight distribution statistics\n",
    "- ✅ Clear warnings if bot detection fails\n",
    "- ✅ Top user selectivity weights displayed\n",
    "\n",
    "### 5. **Code Quality**\n",
    "- ✅ Removed duplicate bot detection criteria\n",
    "- ✅ Cleaned up commented debug code\n",
    "- ✅ Added comprehensive documentation\n",
    "- ✅ Better organized summary statistics\n",
    "\n",
    "### Key Insight\n",
    "The algorithm now properly rewards **selective users** - those who listen to many clips but only like the truly exceptional ones. Their votes carry more weight in determining clip quality and user taste scores through the PageRank algorithm.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "e3fce4f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 4619874 is Mr tree"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f94f98eb",
   "metadata": {},
   "source": [
    "## How the Collaborative Filtering Works\n",
    "\n",
    "The simplified algorithm works as follows:\n",
    "\n",
    "1. **User Selectivity Weights**: \n",
    "   - Users who rarely like things get high weights (up to 50)\n",
    "   - Users who like everything get low weights (~2)\n",
    "\n",
    "2. **Bipartite Graph**:\n",
    "   - Only includes likes (positive signals)\n",
    "   - User → Clip edges weighted by user's selectivity\n",
    "   - Clip → User edges have weight 1.0\n",
    "\n",
    "3. **PageRank Flow**:\n",
    "   - Selective users (high weight) strongly boost clips they like\n",
    "   - Users who like the same clips as selective users get higher scores\n",
    "   - This creates collaborative filtering where taste propagates through shared preferences\n",
    "\n",
    "4. **Key Insight**:\n",
    "   - If you like clips that selective users also like, you probably have good taste\n",
    "   - If you like clips that only non-selective users like, you probably don't\n",
    "\n",
    "### Debugging Tips:\n",
    "- Use `check_user_taste()` to understand why a specific user has a certain score\n",
    "- Look at clip scores to see which clips are considered \"good\" by the algorithm\n",
    "- Check if users share taste with selective users for high scores\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "69becb5c",
   "metadata": {},
   "source": [
    "## Key Addition: Weighted Likes in Clip Quality\n",
    "\n",
    "The clip quality calculation now uses **weighted likes** instead of raw like counts. This is crucial because:\n",
    "\n",
    "1. **Selective users' likes matter more**: A like from someone who rarely likes anything (weight=25) contributes much more to clip quality than a like from someone who likes everything (weight=2).\n",
    "\n",
    "2. **Bot-resistant quality scores**: Even if bots slip through detection, their low selectivity weights minimize their impact on clip quality.\n",
    "\n",
    "3. **True quality emerges**: Clips that are liked by discerning, selective users will have higher quality scores than clips liked by indiscriminate users.\n",
    "\n",
    "### Example:\n",
    "- Clip A: 10 likes from users who like everything (avg weight = 2) → weighted likes = 20\n",
    "- Clip B: 5 likes from selective users (avg weight = 10) → weighted likes = 50\n",
    "- Result: Clip B has higher quality despite fewer raw likes\n",
    "\n",
    "This ensures the PageRank algorithm propagates quality signals from truly good clips, as determined by selective users.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "6e2d605a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.00016855430293135392"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pagerank_scores[\"u_4619874\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "cf8f6e2b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>pagerank_score</th>\n",
       "      <th>total_interactions</th>\n",
       "      <th>total_likes</th>\n",
       "      <th>avg_play_count</th>\n",
       "      <th>unique_clips</th>\n",
       "      <th>like_rate</th>\n",
       "      <th>taste_score</th>\n",
       "      <th>rank</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1089</th>\n",
       "      <td>4619874</td>\n",
       "      <td>0.000169</td>\n",
       "      <td>287</td>\n",
       "      <td>99</td>\n",
       "      <td>1.324042</td>\n",
       "      <td>287</td>\n",
       "      <td>0.344948</td>\n",
       "      <td>0.055622</td>\n",
       "      <td>322</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      user_id  pagerank_score  total_interactions  total_likes  \\\n",
       "1089  4619874        0.000169                 287           99   \n",
       "\n",
       "      avg_play_count  unique_clips  like_rate  taste_score  rank  \n",
       "1089        1.324042           287   0.344948     0.055622   322  "
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_taste_scores[user_taste_scores[\"user_id\"] == 4619874]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "0b03fe26",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>clip_id</th>\n",
       "      <th>user_id</th>\n",
       "      <th>updated_at</th>\n",
       "      <th>play_count</th>\n",
       "      <th>skip_count</th>\n",
       "      <th>flagged</th>\n",
       "      <th>flagged_reason</th>\n",
       "      <th>reaction_type</th>\n",
       "      <th>is_pro_user</th>\n",
       "      <th>clip_creator_id</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>309749</th>\n",
       "      <td>20f542bb-bcca-4b1c-a033-8cf4e9e586ae</td>\n",
       "      <td>4619874</td>\n",
       "      <td>2025-07-24 21:09:17.960218+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>None</td>\n",
       "      <td>None</td>\n",
       "      <td>True</td>\n",
       "      <td>6227557.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>366091</th>\n",
       "      <td>a3915b43-e78d-4fb7-b025-d6e0e06e7c30</td>\n",
       "      <td>4619874</td>\n",
       "      <td>2025-07-24 21:31:19.095337+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>None</td>\n",
       "      <td>None</td>\n",
       "      <td>True</td>\n",
       "      <td>6227557.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>395709</th>\n",
       "      <td>0b3bd2a1-5d6d-45d8-a7d2-07120107257f</td>\n",
       "      <td>4619874</td>\n",
       "      <td>2025-07-24 21:42:38.563529+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>None</td>\n",
       "      <td>None</td>\n",
       "      <td>True</td>\n",
       "      <td>6227557.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>436800</th>\n",
       "      <td>9845cb95-f2fe-47fe-b7b7-3a3e89bdf642</td>\n",
       "      <td>4619874</td>\n",
       "      <td>2025-07-24 22:03:54.986201+00:00</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>None</td>\n",
       "      <td>None</td>\n",
       "      <td>True</td>\n",
       "      <td>6227557.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>450673</th>\n",
       "      <td>18597fc6-0b8c-431b-ad18-7067e2174744</td>\n",
       "      <td>4619874</td>\n",
       "      <td>2025-07-24 22:06:54.510620+00:00</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>None</td>\n",
       "      <td>None</td>\n",
       "      <td>True</td>\n",
       "      <td>6227557.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>126080208</th>\n",
       "      <td>a628be62-4108-402c-abab-c91367751d93</td>\n",
       "      <td>4619874</td>\n",
       "      <td>2025-08-18 10:21:19.333225+00:00</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>None</td>\n",
       "      <td>L</td>\n",
       "      <td>True</td>\n",
       "      <td>14688.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>126130329</th>\n",
       "      <td>c642462a-5751-43d7-8e58-82b21d5be326</td>\n",
       "      <td>4619874</td>\n",
       "      <td>2025-08-18 10:31:07.121207+00:00</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>None</td>\n",
       "      <td>L</td>\n",
       "      <td>True</td>\n",
       "      <td>63411148.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>126139764</th>\n",
       "      <td>cea2fd30-ef97-478c-9b13-5858fd867581</td>\n",
       "      <td>4619874</td>\n",
       "      <td>2025-08-15 13:00:21.868782+00:00</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>None</td>\n",
       "      <td>L</td>\n",
       "      <td>True</td>\n",
       "      <td>100835929.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>126146341</th>\n",
       "      <td>fa50cde9-1d30-4d84-9900-33f7602180e1</td>\n",
       "      <td>4619874</td>\n",
       "      <td>2025-08-15 01:39:57.286158+00:00</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>None</td>\n",
       "      <td>L</td>\n",
       "      <td>True</td>\n",
       "      <td>174639.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>126651377</th>\n",
       "      <td>8c159961-879e-4218-8175-c8a4ada14819</td>\n",
       "      <td>4619874</td>\n",
       "      <td>2025-08-08 13:08:38.886776+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>None</td>\n",
       "      <td>None</td>\n",
       "      <td>True</td>\n",
       "      <td>105757528.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>287 rows × 10 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                        clip_id  user_id  \\\n",
       "309749     20f542bb-bcca-4b1c-a033-8cf4e9e586ae  4619874   \n",
       "366091     a3915b43-e78d-4fb7-b025-d6e0e06e7c30  4619874   \n",
       "395709     0b3bd2a1-5d6d-45d8-a7d2-07120107257f  4619874   \n",
       "436800     9845cb95-f2fe-47fe-b7b7-3a3e89bdf642  4619874   \n",
       "450673     18597fc6-0b8c-431b-ad18-7067e2174744  4619874   \n",
       "...                                         ...      ...   \n",
       "126080208  a628be62-4108-402c-abab-c91367751d93  4619874   \n",
       "126130329  c642462a-5751-43d7-8e58-82b21d5be326  4619874   \n",
       "126139764  cea2fd30-ef97-478c-9b13-5858fd867581  4619874   \n",
       "126146341  fa50cde9-1d30-4d84-9900-33f7602180e1  4619874   \n",
       "126651377  8c159961-879e-4218-8175-c8a4ada14819  4619874   \n",
       "\n",
       "                                updated_at  play_count  skip_count  flagged  \\\n",
       "309749    2025-07-24 21:09:17.960218+00:00           1           0    False   \n",
       "366091    2025-07-24 21:31:19.095337+00:00           1           0    False   \n",
       "395709    2025-07-24 21:42:38.563529+00:00           1           0    False   \n",
       "436800    2025-07-24 22:03:54.986201+00:00           2           0    False   \n",
       "450673    2025-07-24 22:06:54.510620+00:00           2           0    False   \n",
       "...                                    ...         ...         ...      ...   \n",
       "126080208 2025-08-18 10:21:19.333225+00:00           4           0    False   \n",
       "126130329 2025-08-18 10:31:07.121207+00:00           4           0    False   \n",
       "126139764 2025-08-15 13:00:21.868782+00:00           4           0    False   \n",
       "126146341 2025-08-15 01:39:57.286158+00:00           3           0    False   \n",
       "126651377 2025-08-08 13:08:38.886776+00:00           1           0    False   \n",
       "\n",
       "          flagged_reason reaction_type  is_pro_user  clip_creator_id  \n",
       "309749              None          None         True        6227557.0  \n",
       "366091              None          None         True        6227557.0  \n",
       "395709              None          None         True        6227557.0  \n",
       "436800              None          None         True        6227557.0  \n",
       "450673              None          None         True        6227557.0  \n",
       "...                  ...           ...          ...              ...  \n",
       "126080208           None             L         True          14688.0  \n",
       "126130329           None             L         True       63411148.0  \n",
       "126139764           None             L         True      100835929.0  \n",
       "126146341           None             L         True         174639.0  \n",
       "126651377           None          None         True      105757528.0  \n",
       "\n",
       "[287 rows x 10 columns]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_filtered[df_filtered[\"user_id\"] == 4619874]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c5bf4c8",
   "metadata": {},
   "source": [
    "## 🔧 FIXES APPLIED TO ADDRESS MR TREE'S LOW SCORE\n",
    "\n",
    "### Problems Found:\n",
    "1. **Like rate calculation was broken** - It only counted non-null reaction_type values, making users who liked everything appear to have 100% like rate\n",
    "2. **Bot detection too lenient** - Users with 60-80% like rates were passing through\n",
    "3. **PageRank rewarded wrong behavior** - Users who liked everything got highest scores\n",
    "4. **Second-pass filter too aggressive** - Removed almost all users, leaving only 164\n",
    "\n",
    "### Fixes Applied:\n",
    "1. ✅ **Fixed like rate calculation** - Now properly counts ALL interactions including neutral listens\n",
    "2. ✅ **Lowered bot threshold to 60%** - More aggressive filtering (mean like rate is only 5.6%)\n",
    "3. ✅ **Modified graph weights** - Clip→User edges now weighted by selectivity, so selective users benefit more\n",
    "4. ✅ **Removed second-pass filter** - All bot detection handled in first pass\n",
    "5. ✅ **Added Mr tree validation** - Specific check to ensure he appears with appropriate score\n",
    "\n",
    "### Expected Results:\n",
    "- Mr tree (34.5% like rate) should now appear in results with a reasonable score\n",
    "- Top users should be selective (low like rates), not indiscriminate likers\n",
    "- Bot users with >60% like rates should be filtered out\n",
    "- Many more users should appear in final results (not just 164)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fd011cac",
   "metadata": {},
   "source": [
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c486531a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "suno_env_dev",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
