{"id":5718,"date":"2025-09-07T13:47:14","date_gmt":"2025-09-07T18:47:14","guid":{"rendered":"https:\/\/itishoemath.com\/?p=5718"},"modified":"2025-09-07T17:36:25","modified_gmt":"2025-09-07T22:36:25","slug":"meritant","status":"publish","type":"post","link":"https:\/\/itishoemath.com\/fr\/meritant\/","title":{"rendered":"THE DESERVENING [Liste de classement des drames de l'E-girl de droite]"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"5718\" class=\"elementor elementor-5718\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-97dd7a3 e-flex e-con-boxed e-con e-parent\" data-id=\"97dd7a3\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ce1c704 elementor-widget elementor-widget-html\" data-id=\"ce1c704\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4>Le drame de la fille \u00e9lectronique d'extr\u00eame droite<\/h4>\n\nUn r\u00e9cent conflit sur Twitter entre des influenceuses de droite est utilis\u00e9 pour illustrer les concepts de \"fournir\" et de \"m\u00e9riter\". <span>h<\/span>oe_math met en \u00e9vidence la fa\u00e7on dont les comportements de recherche d'attention se manifestent dans le monde des influenceurs conservateurs en ligne. Il critique la tendance qu'ont les femmes conservatrices \u00e0 rechercher la validation et les ressources sans les fournir.<!--preview--> la valeur correspondante en retour.<br><br><span>h<\/span>oe_math utilise les principes de \"m\u00e9riter\" et de \"fournir\" pour classer les e-girls conservatrices r\u00e9cemment impliqu\u00e9es dans la guerre Twitter\/X de Sarah Stock Engagement. Il encourage les t\u00e9l\u00e9spectateurs \u00e0 reconna\u00eetre et \u00e0 fixer des limites aux demandes imm\u00e9rit\u00e9es d'attention et de ressources. Il suffit d'apprendre l'importance de dire NON aux m\u00e9ritants qui ne fournissent que peu ou rien en retour.\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8858505 elementor-widget elementor-widget-html\" data-id=\"8858505\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p> <\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4860eef elementor-widget elementor-widget-html\" data-id=\"4860eef\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- CSV for video links and summaries -->\n<!-- Header: Not Translated -->\n<script id=\"video-data-header\" type=\"text\/plain\">\ntime|stop|tab|title|description\n<\/script>\n<div id=\"tp-translatable-strings2\"\n     style=\"color:#000101; background:#000101; width:100vw; height:auto; position:static; z-index:1; font-size:1px;\">\n<pre id=\"video-data-rows\">\n0|66|Drame|Drame Twitter des femmes de droite| \"L'\u00e9pisode commence par un r\u00e9sum\u00e9 d'une r\u00e9cente querelle sur Twitter entre influenceuses de droite, d\u00e9clench\u00e9e par une annonce de fian\u00e7ailles et qui a d\u00e9g\u00e9n\u00e9r\u00e9 en attaques personnelles et en comp\u00e9tition de statuts.\"\n66|180|M\u00e9riter|Le concept de m\u00e9riter expliqu\u00e9|\"Le concept de \"m\u00e9riter\" est introduit, d\u00e9crivant comment certaines personnes, en particulier les femmes dans ce contexte, sont consid\u00e9r\u00e9es comme attendant des ressources, de l'attention ou de la validation sans fournir de valeur r\u00e9ciproque.\"  \n180|360|Fournir|Concept de fournir expliqu\u00e9|\"La contrepartie de m\u00e9riter, 'fournir', est expliqu\u00e9e comme une contribution active \u00e0 la valeur, que ce soit par l'action, le contenu ou le soutien, et les probl\u00e8mes qui se posent lorsque les m\u00e9ritants sont en charge des fournisseurs.\"  \n360|540|Exemples|Le drame comme \u00e9tude de cas|\"Le drame de Twitter est diss\u00e9qu\u00e9 comme un exemple r\u00e9el de m\u00e9riter versus fournir, montrant comment le comportement des influenceurs peut \u00eatre \u00e9valu\u00e9 selon qu'ils apportent de la valeur ou qu'ils demandent simplement de l'attention.\"  \n540|900|Tier_List|Analyse de la liste des e-girls|\"Une liste de niveau est pr\u00e9sent\u00e9e, classant diverses e-girls de droite en fonction de leur ratio de fourniture par rapport \u00e0 leur m\u00e9rite, avec des commentaires sur des individus sp\u00e9cifiques et leurs actions en ligne pendant le drame.\"  \n900|1100|R\u00e9flexion|Implications sociales plus larges|\"La discussion s'\u00e9largit pour r\u00e9fl\u00e9chir aux dangers d'un comportement m\u00e9ritant incontr\u00f4l\u00e9 dans la soci\u00e9t\u00e9, \u00e0 l'importance de fixer des limites et \u00e0 la n\u00e9cessit\u00e9 d'un \u00e9change mutuel dans les relations et les communaut\u00e9s.\"  \n1100|1168|Conseils|Encouragement \u00e0 fixer des limites|\"L'\u00e9pisode se termine en encourageant les t\u00e9l\u00e9spectateurs \u00e0 reconna\u00eetre les comportements m\u00e9ritants, \u00e0 d\u00e9fendre leurs limites et \u00e0 s'assurer qu'ils s'engagent dans des \u00e9changes \u00e9quitables plut\u00f4t que d'\u00eatre exploit\u00e9s par ceux qui ne font que prendre.\"\n<\/pre>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d08897e elementor-widget elementor-widget-html\" data-id=\"d08897e\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"tp-translatable-strings5\"\n     style=\"color:#000101; background:#000101; width:100vw; height:auto; position:static; z-index:1; font-size:1px;\">\n<span id=\"hiddenText\">\n0 Je suis d\u00e9sol\u00e9, mais le nombre de gar\u00e7ons blancs de 19 ans portant des chapeaux MAGA qui m'envoient des messages pour me dire que je dois trouver Dieu et me traiter de d\u00e9g\u00e9n\u00e9r\u00e9 est incroyable. Pourquoi ne t'inqui\u00e8tes-tu pas pour toi-m\u00eame ? Je vibre, j'\u00e9crase et je m'amuse.\n12 Le drame de l'e-girl de droite sur Twitter - si vous ne l'avez pas vu, c'est bien. Il y a eu un gros cr\u00eapage de chignon sur Twitter r\u00e9cemment, ce qui, honn\u00eatement, est une preuve de plus que les femmes n'ont rien \u00e0 faire en politique.\n27 Sarah Stock, une jeune et jolie e-girl de droite, s'est fianc\u00e9e, mais au lieu de la f\u00e9liciter, tout le monde a eu un probl\u00e8me. Il a fallu une dizaine de minutes pour que les choses passent de \"Je vais me marier\" au chaos.\n41 Vous avez probablement d\u00e9j\u00e0 entendu l'expression \"le personnel est politique\", qui signifie que vos \u00e9motions fa\u00e7onnent vos convictions. Selon l'orateur, les \u00e9motions f\u00e9minines sont comme le plutonium : elles doivent \u00eatre manipul\u00e9es avec pr\u00e9caution sous peine de devenir incontr\u00f4lables.\n55 Pourquoi est-ce que je vous parle du drame des e-girls de droite sur Twitter ? Tout d'abord, parce que cela rapporte des clics. Ensuite, c'est un excellent exemple pour vous apprendre la diff\u00e9rence entre fournir et m\u00e9riter.\n73 M\u00eame si les femmes se disent conservatrices, elles restent des femmes, et les femmes sont naturellement des \"m\u00e9ritantes\". Par d\u00e9faut, elles m\u00e9ritent, et c'est tr\u00e8s bien ainsi tant qu'elles obtiennent des choses de personnes qui acceptent de les leur fournir.\n90 Le probl\u00e8me se pose lorsque les gens m\u00e9ritent des choses de la part de ceux qui n'acceptent pas de les fournir. Cela rompt toute la cha\u00eene - si les fournisseurs ne veulent pas fournir, ils s'arr\u00eatent, et rien ne se construit.\n113 C'est pourquoi les m\u00e9ritants ne peuvent jamais \u00eatre \u00e0 la t\u00eate des fournisseurs ; cela donne l'impression que fournir est une mauvaise affaire, alors les fournisseurs abandonnent, et vous ne pouvez pas simplement aller dans la nature et attendre que les choses apparaissent pour vous.\n139 Lorsque le m\u00e9ritant est en charge, les hommes sont frustr\u00e9s parce que les femmes commencent \u00e0 tout m\u00e9riter des hommes, jusqu'\u00e0 ce que les hommes n'aient plus assez pour \u00eatre m\u00e9rit\u00e9s, et alors ils ne se marient pas - soit parce qu'ils n'en ont pas les moyens, soit parce qu'ils ont peur qu'elle m\u00e9rite leur maison.\n163 Ce drame sur Twitter est un excellent exemple de la fa\u00e7on dont fonctionne le fait de m\u00e9riter. Les filles se sont d\u00e9chir\u00e9es parce que quelqu'un a re\u00e7u une bague, ce qui signifie \" je m\u00e9rite l'attention et le statut \", mais elles n'ont pas toutes fourni un contenu de valeur.\n185 Ainsi, m\u00eame si elles se disent conservatrices, elles agissent de mani\u00e8re \"m\u00e9ritante\". L'orateur va passer en revue le drame petit \u00e0 petit et donner une liste de classement des e-girls de droite bas\u00e9e sur le fait de fournir ou de m\u00e9riter.\n201 La fl\u00e8che rouge vers le haut du logo Self-Max symbolise le fait de faire bouger les choses, de transformer les id\u00e9es en actions qui fa\u00e7onnent votre environnement. Selfmax vous apprend \u00e0 le faire.\n221 La section environnement est bleue parce que c'est de l\u00e0 que viennent les choses. Les m\u00e9ritants veulent que les choses viennent tout simplement de l'environnement, comme le P\u00e8re No\u00ebl. L'orateur veut que vous sachiez comment faire de vos d\u00e9sirs une r\u00e9alit\u00e9, mais aussi que vous compreniez ce qu'est le m\u00e9rite.\n243 L'orateur se plaint souvent de m\u00e9riter, qu'il appelle \"\u00eatre la table\". C'est la raison pour laquelle certaines personnes pr\u00e9tendent \u00eatre des victimes - si quelqu'un vous fait du mal, c'est qu'il vous est redevable. C'est la raison pour laquelle tant de femmes divorc\u00e9es pr\u00e9tendent avoir \u00e9t\u00e9 maltrait\u00e9es ; parfois, cela signifie simplement qu'elles veulent plus de choses.\n278 Le m\u00e9rite est la raison d'\u00eatre de la \"zone de myst\u00e8re\" - pour dissimuler le m\u00e9rite. Par exemple, \"Tu dois faire ce que je veux m\u00eame si je ne le dis pas\". Au cours de l'\u00e9volution, les hommes ont d\u00fb obtenir des choses de l'environnement, les femmes ont d\u00fb les m\u00e9riter. C'est pourquoi elles veulent toutes \u00eatre des princesses - la plus m\u00e9ritante.\n316 Ces fl\u00e8ches - fournir et m\u00e9riter - sont essentiellement masculines\/f\u00e9minines, actives\/passives, cr\u00e9er\/consommer. \"Je vais obtenir ce que je veux du monde\" contre \"Je m\u00e9rite ce que je veux de ce que tu as obtenu\".\n329 M\u00e9riter n'est pas mauvais. Les femmes et les enfants sont cens\u00e9s m\u00e9riter, les hommes sont cens\u00e9s fournir. On ne dit pas \u00e0 une femme : \"Va chasser le mammouth toi-m\u00eame\". Cela ne s'est jamais produit, malgr\u00e9 ce que certains pr\u00e9tendent.\n346 Les pourvoyeurs ne fournissent que s'ils se soucient des personnes qu'ils fournissent. L'orateur ne veut pas que n'importe qui m\u00e9rite son aide, mais \u00e0 l'heure actuelle, il a l'impression qu'il doit payer une infinit\u00e9 de personnes qui m\u00e9ritent son aide, sinon la police vient la chercher.\n361 Il faut savoir reconna\u00eetre les m\u00e9rites quand on les voit. L'orateur le souligne et commente en m\u00eame temps le drame des filles. \u00c0 la fin de la vid\u00e9o, vous devriez \u00eatre en mesure de savoir si quelqu'un apporte une valeur ajout\u00e9e ou s'il m\u00e9rite simplement votre attention.\n376 R\u00e9sum\u00e9 : des influenceuses de droite ont eu un gros cr\u00eapage de chignon, apparemment parce que l'une d'entre elles s'est mari\u00e9e. Aucune raison plus profonde n'a \u00e9t\u00e9 \u00e9voqu\u00e9e.\n393 La premi\u00e8re chose que l'orateur a vue, c'est que quelqu'un \u00e9tait en col\u00e8re contre quelqu'un qui \u00e9tait en col\u00e8re contre les fian\u00e7ailles de Sarah Stock. Il y a eu des tensions entre les e-girls de droite parce que ce sont des filles et qu'elles se d\u00e9testent. Sarah affiche sa bague ; drame imm\u00e9diat.\n415 Les r\u00e9ponses sont divis\u00e9es en deux cat\u00e9gories : \"avait en quelque sorte raison\" et \"d\u00e9plac\u00e9\". Cela est important pour rep\u00e9rer les m\u00e9ritants, mais pas pour le discours public, car les deux ont conduit \u00e0 une escalade.\n430 La cl\u00e9 pour identifier les m\u00e9ritants : cette personne apporte-t-elle quelque chose de valeur ou ne fait-elle que rediriger les ressources (comme l'attention) vers elle ?\n446 Sur un march\u00e9, vous devez faire quelque chose de valable et \u00e9changer contre quelque chose que quelqu'un d'autre a fait et que vous appr\u00e9ciez. Fournir, c'est se battre pour quelque chose et l'\u00e9changer ; m\u00e9riter, c'est simplement dire : \"Je veux ma part\".\n470 Cette vid\u00e9o vous aide \u00e0 comprendre les gens - l'orateur a pass\u00e9 20 ans \u00e0 gagner de la compr\u00e9hension et vous la donne maintenant, et vous lui donnez de l'attention (qui devient de l'argent). Il s'agit d'un \u00e9change, d'une prestation.\n499 Fournir et m\u00e9riter ne sont pas oppos\u00e9s ; c'est comme demander et r\u00e9pondre. Lorsque l'orateur publie une vid\u00e9o, il m\u00e9rite votre attention, mais vous n'\u00eates pas oblig\u00e9 de la regarder. M\u00e9riter sans \u00e9change, c'est simplement vouloir de l'attention pour rien.\n517 M\u00e9riter n'a de sens que s'il y a un \u00e9change - par exemple, si quelqu'un travaille pour vous, il m\u00e9rite d'\u00eatre pay\u00e9. Ou si vous blessez quelqu'un, il m\u00e9rite une compensation. Ou vos proches m\u00e9ritent d'\u00eatre soutenus parce que vous les aimez, et vous obtenez du bonheur en retour.\n541 M\u00e9fiez-vous des personnes qui m\u00e9ritent ce que vous leur offrez alors que vous n'obtenez rien. Cela contrarie les prestataires, qui d\u00e9missionnent ou essaient de faire quelque chose pour y rem\u00e9dier.\n552 Le tableau des niveaux est un rapport entre ce qui est fourni et ce qui est m\u00e9rit\u00e9. Si l'e-girl apporte de la valeur, elle obtient des points ; si elle d\u00e9nigre les autres ou demande de l'attention pour rien, des points sont soustraits. La liste n'est que le point de vue de l'orateur.\n573 Plus on est m\u00e9ritant, moins on est conservateur, parce que ces femmes font des carri\u00e8res bas\u00e9es sur le fait qu'elles ne sont pas au bas de l'\u00e9chelle. Le m\u00e9rite s'est manifest\u00e9 rapidement - environ 10 minutes entre \"je suis fianc\u00e9e\" et \"tout le monde sauf moi est...\".\n601 \u00c0 ce stade, il ne s'agissait plus de se marier, mais de savoir qui avait couch\u00e9 avec qui et qui \u00e9tait fauch\u00e9. Il a fallu environ deux r\u00e9ponses pour passer de \"J'ai une bague\" au chaos. Le drame a pris de l'ampleur et pourrait bien se poursuivre encore aujourd'hui.\n628 Il y a \u00e9galement eu des prises de position de la part des spectateurs. Les e-girls de droite qui ont obtenu les meilleurs scores sont rest\u00e9es en dehors du drame et n'ont fait que commenter le comportement, sans s'impliquer.\n644 C'est dans le drame lui-m\u00eame que le m\u00e9rite est apparu. Voici comment cela s'est pass\u00e9 : Sarah Stock a publi\u00e9 ses fian\u00e7ailles. Le locuteur donne \u00e0 Sarah une note A avec une certitude de 30% - elle a \u00e9t\u00e9 coh\u00e9rente, et le locuteur a vu un clip o\u00f9 elle a \"g\u00e2ch\u00e9 la journ\u00e9e d'un gars\" avec un fait vrai mais impopulaire.\n688 Dire des choses vraies, m\u00eame si elles sont impopulaires, est un signe de valeur. Sarah obtient un A, et non un S, parce que Pearl Davis a soulev\u00e9 un point valable : Sarah a affich\u00e9 sa bague pour attirer l'attention et s'est sentie offens\u00e9e lorsqu'on l'a qualifi\u00e9e de cycle classique de \"femme moderne\".\n716 L'orateur pense qu'il n'y a pas de mal \u00e0 afficher son alliance, mais que les influenceurs utilisent leur famille et leurs relations pour attirer l'attention, ce qui est \"d\u00e9sirable\". C'est demander \u00e0 \u00eatre incluse pour ce que l'on est, pas pour ce que l'on a fait.\n743 Pearl obtient un A pour des raisons similaires : le drame et la \"peur de la pute\". Pearl souligne que les femmes conservatrices utilisent leur jeunesse pour elles-m\u00eames, puis essaient d'atterrir \u00e0 32 ans. Le fait de dire les choses telles qu'elles sont fait peur aux \"putes\", mais Pearl a raison de dire que montrer la bague et non l'homme peut \u00eatre un mauvais signe.\n793 Dans le pire des cas, l'homme ne fait que payer pour faire de la publicit\u00e9 au prochain homme - le maximum de m\u00e9rite. On ne peut pas \u00eatre conservateur et utiliser les hommes comme des tremplins ; c'est du f\u00e9minisme.\n815 La moiti\u00e9 de ces femmes peuvent divorcer de leur mari, et le feront, et utiliseront leur marque pour faire du marketing pour le mari num\u00e9ro deux. L'orateur dit qu'il ne peut pas dire si Pearl sait quelque chose ou non, mais elle semble sinc\u00e8re et frustr\u00e9e par les femmes.\n843 Pearl est tr\u00e8s dou\u00e9e pour mettre en \u00e9vidence les tours que jouent les femmes, mais elle les joue elle-m\u00eame et l'admet. Elle critique les femmes pour les choses qu'elle fait, mais elle est honn\u00eate \u00e0 ce sujet. Pearl obtient un A, certitude 90%.\n860 Isabella Maria de Luca : le locuteur ne la conna\u00eet pas, mais elle a jou\u00e9 un r\u00f4le important dans le drame de fa\u00e7on improductive. Elle dit qu'elle ne poste pas de photos de bikini mais le fait, revendique une grande puret\u00e9-so, F, 20% certitude.\n876 Morgan Ariel : le locuteur n'avait jamais entendu parler d'elle auparavant, mais il la conna\u00eet maintenant pour avoir dit \" tu le donnes gratuitement \" et pour d'autres drames. F, 20% certitude.\n888 Les trois e-girls de droite qui ont obtenu un S ne se sont pas impliqu\u00e9es dans le drame, elles ont juste comment\u00e9 que le drame est mauvais, ce qui est suffisant. Shoe on Head, une e-girl de longue date maintenant plus \u00e0 droite, obtient S, 80% certainty.\n915 Rachel Wilson, e-matrone de droite, mari\u00e9e \u00e0 Andrew Wilson, obtient S, 99% certitude. Elle dit que ce qui rend les femmes heureuses n'est pas ce qui fait fonctionner la civilisation - le f\u00e9minisme est un m\u00e9rite syst\u00e9matique.\n950 Leonardo Joanie est peut-\u00eatre la seule femme humoriste qui ait jamais dit quelque chose de vrai sur les femmes en se moquant des drames sans s'y impliquer. S, 85% certitude.\n963 Le grand perdant est Emily Saves America, F, 9% certitude. L'orateur n'avait jamais entendu parler d'elle auparavant, mais elle a r\u00e9pondu aux critiques en devenant personnelle et en d\u00e9molissant les autres, n'offrant rien d'autre que de la n\u00e9gativit\u00e9.\n992 Emily vit \u00e0 Los Angeles, a l'air d'une f\u00eatarde et dit qu'elle vibre, qu'elle fait la f\u00eate et qu'elle se drogue parce que cela la rend heureuse, tout en insultant ses d\u00e9tracteurs. L'orateur dit qu'il s'agit l\u00e0 d'un comportement classique de m\u00e9ritante.\n1037 Emily dit en substance que peu importe le type de contenu qu'elle fournit, elle m\u00e9rite une r\u00e9action qui la rende heureuse de la part de ceux qui la soutiennent. L'intervenant pense qu'elle n'a pas l'air heureuse - elle utilise juste sa voix ext\u00e9rieure pour convaincre tout le monde qu'elle va bien.\n1064 Pour tous les autres : continuez \u00e0 chercher \u00e0 m\u00e9riter. L'orateur montre une image opposant le fait de fournir \u00e0 celui de m\u00e9riter ; lorsqu'on laisse le soin \u00e0 celui de m\u00e9riter, il ne reste plus que la facture.\n1086 Il ne s'agit pas seulement des femmes, mais de toute personne qui veut quelque chose de vous et ne donne rien en retour. La soci\u00e9t\u00e9 nous apprend \u00e0 avoir peur de dire non, mais si vous ne d\u00e9fendez pas vos limites, personne ne vous respecte.\n1110 Merci d'avoir regard\u00e9. Le conf\u00e9rencier a un nouveau site web et des liens vers ses livres se trouvent dans la description de la vid\u00e9o.\n\n<\/span>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-eddabf7 elementor-widget elementor-widget-html\" data-id=\"eddabf7\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\n\/\/ 1. Define which video to play for each language:\nconst videoMap = {\n  en: { type: \"youtube\", id: \"KG3W-df-V-8\" },\n  es: { type: \"youtube\", id: \"G2g6SBrzuwg\" }, \n  fr: { type: \"youtube\", id: \"pM14tnA4-wA\" },\n  ja: { type: \"youtube\", id: \"\" },\n  pt: { type: \"youtube\", id: \"\" } \n};\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a010ab1 e-flex e-con-boxed e-con e-parent\" data-id=\"a010ab1\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4c437ca elementor-widget elementor-widget-template\" data-id=\"4c437ca\" data-element_type=\"widget\" data-widget_type=\"template.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-template\">\n\t\t\t\t\t<div data-elementor-type=\"section\" data-elementor-id=\"3172\" class=\"elementor elementor-3172\" data-elementor-post-type=\"elementor_library\">\n\t\t\t<div class=\"elementor-element elementor-element-7079b43 e-flex e-con-boxed e-con e-parent\" data-id=\"7079b43\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-800d60f elementor-widget elementor-widget-html\" data-id=\"800d60f\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n#simplified-transcript-note {\n  display: none !important;\n}\n<\/style>\n<div id=\"simplified-transcript-note\">Les traductions et la transcription simplifi\u00e9e sont bas\u00e9es sur les traductions du mat\u00e9riel original, localis\u00e9 en plusieurs langues. R\u00e9alis\u00e9 par PeakCreatorRoyalty.com sous licence de <span>h<\/span>oe_math.<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3a02ec9 elementor-widget elementor-widget-html\" data-id=\"3a02ec9\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\n  \/\/ Auto-hide translation block after page load\n  window.addEventListener('DOMContentLoaded', function() {\n    for (let i = 1; i <= 5; i++) {\n      document.querySelectorAll(`[id$=\"${i}\"]`).forEach(el => {\n        el.style.display = 'none';\n      });\n    }\n  });\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2f7b1d elementor-widget elementor-widget-html\" data-id=\"f2f7b1d\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n  h3 {\n    margin-left: 0px; \/* Adjust as needed *\/\n    \/* Optionally add: *\/\n    text-align: left;  \n  }\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e3ade12 elementor-widget elementor-widget-html\" data-id=\"e3ade12\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- VIDEO PLAYER CONTAINER -->\n<div id=\"videoPlayerContainer\" style=\"max-width: 800px; margin: auto; text-align: center;\">\n  <!-- Video player is injected here -->\n<\/div>\n\n<!-- SCROLLING TABS & CHAPTER DETAILS -->\n<div style=\"max-width: 1000px; margin: 32px auto 0 auto;\">\n  <div id=\"chapterTabs\" class=\"chapter-tabs-scroll\">\n    <!-- Tabs will be generated by JavaScript -->\n  <\/div>\n  <!-- div id=\"chapterPlayPause\" style=\"margin:1em 0 0.5em 0;\">\n  <\/div -->\n  <div id=\"chapterPanel\" class=\"chapter-panel\">\n    <!-- Chapter text will appear here  -->\n  <\/div>\n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-928f586 elementor-widget elementor-widget-html\" data-id=\"928f586\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- NO TOUCH Scripts -->\n<!-- Video script v1.0 -->\n<!--[wpcode id=\"1824\"] -->\n\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/hls.js@latest\"><\/script> <!-- Include HLS.js -->\r\n\r\n<style>\r\n  .half-br {\r\n    display: block;\r\n    height: 1px;\r\n    width: 100%;\r\n    border: none;\r\n    margin: 0;\r\n    padding: 0;\r\n  }\r\n<\/style>\r\n\r\n<script>\r\n\r\nlet currentChapterIdx = 0;\r\n\t\r\nfunction getCurrentLang() {\r\n  return document.documentElement.lang ? document.documentElement.lang.substring(0,2) : 'en';\r\n}\r\n\r\n\/\/ function waitTranslate(ms=1000) {\r\n\/\/   const end = Date.now() + ms; \/\/ 100 milliseconds = 1\/10 second\r\n\/\/   while (Date.now() < end) {\r\n\/\/     \/\/ Busy-wait: blocks the main thread!\r\n\/\/   }\r\n\/\/ }\r\n\r\n\/\/ const lang = getCurrentLang();\r\n\/\/ if (lang !== \"en\") {\r\n\/\/   var marker = document.getElementById('language-marker');\r\n\/\/   if (marker) {\r\n\/\/     \/\/ You can check for known translations of the phrase\r\n\/\/     var currentLangPhrase = marker.textContent.trim();\r\n\/\/ \r\n\/\/     \/\/ Example for English vs French\r\n\/\/     if (currentLangPhrase === \"Currently English language.\") {\r\n\/\/       console.log(\"Miss, translation in progress to '\/\"+lang+\"\/', 3 second delay.\")\r\n\/\/       waitTranslate(ms=3000);\r\n\/\/     } else {\r\n\/\/       console.log(\"Hit, pre-translated page in '\/\"+lang+\"\/'.\")\r\n\/\/     }\r\n\/\/   }\r\n\/\/ } else {\r\n\/\/   console.log(\"English, no translation needed.\")\r\n\/\/ }\r\n\r\n\/* ====== CONFIGURATION SECTION ====== *\/\r\n\/\/ const BUNNY_VIDEO_LIBRARY_ID = \"vz-c02c9ec9-42b.b-cdn.net\"; \/\/ Replace with your actual Bunny Video Library ID\r\nconst BUNNY_VIDEO_LIBRARY_ID = \"vz-d8eb6cfe-1f7.b-cdn.net\"; \/\/ Replace with your actual Bunny Video Library ID\r\n\r\n\/\/ 1. Define which video to play for each language:\r\n\/\/const videoMap = {\r\n\/\/  en: { type: \"youtube\", id: \"wWrsW76bG88\" },\r\n\/\/  fr: { type: \"bunny\", id: \"fc57904c-7f56-4b36-8d13-d1d715b82e81\" }, \/\/ This is the VIDEO ID\r\n\/\/  de: { type: \"bunny\", id: \"YOUR_GERMAN_VIDEO_ID\" }                   \/\/ This is the VIDEO ID\r\n  \/\/ Add more: es, it, etc.\r\n\/\/};\r\n\r\n\/\/ 2. Define chapters for each language:\r\nfunction parseCSVFromHeaderRows(headerText, rowsText) {\r\n  const headers = headerText.trim().split('|').map(h => h.trim());\r\n  const lines = rowsText.trim().split('\\n').filter(line => line.trim().length);\r\n\r\n  return lines.map(line => {\r\n    const values = [];\r\n    \/\/ Split by |, but don't split inside quotes (simple version assumes no | inside quotes)\r\n    \/\/ If you need to handle | inside quoted fields, regex needs to be more complex\r\n    let regex = \/(\"(?:[^\"]|\"\")*\"|'(?:[^']|'')*'|[^|]+)\/g;\r\n    let match;\r\n    while ((match = regex.exec(line))) {\r\n      let value = match[0].trim();\r\n      \/\/ Remove leading and trailing single or double quotes\r\n      value = value.replace(\/^(['\"])(.*)\\1$\/, '$2');\r\n      values.push(isNaN(value) ? value : Number(value));\r\n    }\r\n    const obj = {};\r\n    headers.forEach((h, i) => { obj[h] = values[i]; });\r\n    return obj;\r\n  });\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\/\/ Parse hiddenText into [{time: number, text: string}]\r\n\/\/ Parses lines like: 12.0 Text, or * Bullet point, or 1. Numbered item\r\nfunction parseHiddenText() {\r\n  const hiddenText = document.getElementById('hiddenText')?.textContent || '';\r\n  const lines = hiddenText.split('\\n').map(line => line.trim()).filter(Boolean);\r\n  const results = [];\r\n  let lastTime = null;\r\n\r\n  for (let line of lines) {\r\n    \/\/ Match timestamps with comma or dot\r\n    let match = \/^(\\d+(?:[.,]\\d+)?)\\s+(.*)$\/.exec(line);\r\n    if (match) {\r\n      lastTime = parseFloat(match[1].replace(',', '.'));\r\n      results.push({ time: lastTime, text: match[2] });\r\n      continue;\r\n    }\r\n    \/\/ Match bullets or numbers\r\n    match = \/^(\\*|\\-|\\d+\\.)\\s+(.*)$\/.exec(line);\r\n    if (match && lastTime !== null) {\r\n      results.push({ time: lastTime, text: line });\r\n      continue;\r\n    }\r\n    if (lastTime !== null) {\r\n      results.push({ time: lastTime, text: line });\r\n    }\r\n  }\r\n  return results;\r\n}\r\n\r\n\r\n\r\n\r\nconst hiddenTextLines = parseHiddenText(); \/\/ Global for later use\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\/\/ Get the header and rows from the DOM\r\nconst csvHeader = document.getElementById('video-data-header').textContent;\r\nconst csvRows = document.getElementById('video-data-rows').textContent;\r\n\r\nconst chapterMap = {\r\n  en: parseCSVFromHeaderRows(csvHeader, csvRows)\r\n};\r\n\r\n\/\/ List of properties to process\r\nconst properties = ['tab', 'title', 'description'];\r\n\r\n\/\/ Loop through each row in chapterMap.en\r\nchapterMap.en.forEach(row => {\r\n  properties.forEach(prop => {\r\n    const val = row[prop];\r\n    if (typeof val === 'string') {\r\n      row[prop] = val.replace(\/^[\\'\\\"]+|[\\'\\\"]+$\/g, '');\r\n    }\r\n  });\r\n});\r\n\r\n\/\/ console.log(chapterMap.en); \/\/ Output objects in browser console\r\n\r\n\r\n\/* ====== END CONFIGURATION ====== *\/\r\n\r\n\/* ----- Global Player Variables ----- *\/\r\nlet ytPlayer, ytReady = false, stopTimer = null;\r\nlet hlsInstance = null; \/\/ To store the HLS.js instance\r\nlet html5VideoElement = null; \/\/ To store the HTML5 video element for Bunny\r\n\r\n\r\n\/* ----- Player and Chapters Logic ----- *\/\r\nfunction cleanupPlayers() {\r\n    \/\/ Clear existing stop timer\r\n    if (stopTimer) {\r\n        clearInterval(stopTimer);\r\n        stopTimer = null;\r\n    }\r\n\r\n    \/\/ Cleanup YouTube Player\r\n    if (ytPlayer && typeof ytPlayer.destroy === 'function') {\r\n        ytPlayer.destroy();\r\n    }\r\n    ytPlayer = null;\r\n    ytReady = false;\r\n\r\n    \/\/ Cleanup HLS.js Player\r\n    if (hlsInstance) {\r\n        hlsInstance.destroy();\r\n        hlsInstance = null;\r\n    }\r\n    html5VideoElement = null; \/\/ Clear reference\r\n\r\n    \/\/ Clear the container\r\n    const container = document.getElementById('videoPlayerContainer');\r\n    if (container) container.innerHTML = \"\";\r\n}\r\n\r\nfunction setVideoPlayer(langObj) {\r\n  cleanupPlayers(); \/\/ Ensure previous players are cleaned up\r\n\r\n  const container = document.getElementById('videoPlayerContainer');\r\n  if (!container) return;\r\n\r\n  if (langObj.type === \"youtube\") {\r\n    container.innerHTML = `<div style=\"position: relative; width: 100%; padding-top: 56.25%;\">\r\n<iframe id=\"myVideo\" style=\"position: absolute;  top: 0; left: 0; width: 100%; height: 100%;\" \r\n            src=\"https:\/\/www.youtube.com\/embed\/${langObj.id}?enablejsapi=1&rel=0&origin=${window.location.origin}\"\r\n            frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n            allowfullscreen><\/iframe><\/div>`;\r\n    \/\/ YT API will be loaded\/re-initialized later\r\n  } else if (langObj.type === \"bunny\") {\r\n    const bunnyStreamUrl = `https:\/\/${BUNNY_VIDEO_LIBRARY_ID}\/${langObj.id}\/playlist.m3u8`;\r\n    container.innerHTML = `<video id=\"myVideo\" width=\"100%\" height=\"390\" controls playsinline poster=\"https:\/\/itishoemath.com\/wp-content\/uploads\/2025\/05\/UCsEPI9OwGEw5Lm0E7Paq62g_0003_wWrsW76bG88_en.jpg\"><\/video>`;\r\n    html5VideoElement = document.getElementById('myVideo'); \/\/ Get the new video element\r\n\r\n\tif (html5VideoElement) {\r\n        html5VideoElement.addEventListener('play', () => renderPlayPauseButton(currentChapterIdx));\r\n        html5VideoElement.addEventListener('pause', () => renderPlayPauseButton(currentChapterIdx));\r\n    }\r\n\r\n\t  \r\n    if (Hls.isSupported()) {\r\n        hlsInstance = new Hls();\r\n        hlsInstance.loadSource(bunnyStreamUrl);\r\n        hlsInstance.attachMedia(html5VideoElement);\r\n        hlsInstance.on(Hls.Events.MANIFEST_PARSED, function() {\r\n            \/\/ console.log(\"Bunny HLS: Manifest parsed and video ready.\");\r\n            \/\/ html5VideoElement.play(); \/\/ Optional: Autoplay (mind browser restrictions)\r\n        });\r\n        hlsInstance.on(Hls.Events.ERROR, function(event, data) {\r\n            \/\/ console.error('Bunny HLS Error:', data);\r\n            if (data.fatal) {\r\n                switch(data.type) {\r\n                    case Hls.ErrorTypes.NETWORK_ERROR: hlsInstance.startLoad(); break;\r\n                    case Hls.ErrorTypes.MEDIA_ERROR: hlsInstance.recoverMediaError(); break;\r\n                    default: hlsInstance.destroy(); break;\r\n                }\r\n            }\r\n        });\r\n    } else if (html5VideoElement.canPlayType('application\/vnd.apple.mpegurl')) {\r\n        \/\/ Native HLS support (e.g., Safari)\r\n        html5VideoElement.src = bunnyStreamUrl;\r\n        html5VideoElement.addEventListener('loadedmetadata', function() {\r\n            \/\/ console.log('Bunny Native HLS: Metadata loaded.');\r\n        });\r\n    } else {\r\n        \/\/ console.error('HLS is not supported in this browser for Bunny.net video.');\r\n        container.innerHTML = '<p>Sorry, HLS video playback is not supported in your browser.<\/p>';\r\n    }\r\n  }\r\n}\r\n\r\nfunction renderTabs(activeIdx, chapters) {\r\n  const tabRow = document.getElementById('chapterTabs');\r\n  tabRow.innerHTML = chapters.map((ch, i) =>\r\n    `<button class=\"chapter-tab${i === activeIdx ? \" active\" : \"\"}\" onclick=\"showChapter(${i})\">${ch.tab}<\/button>`\r\n  ).join('');\r\n}\r\n\r\n\r\n\r\n\t\r\nfunction renderPlayPauseButton(idx) {\r\n  const lang = getCurrentLang();\r\n  const chapters = chapterMap['en'];\r\n  const ch = chapters[idx];\r\n  if (!ch) return \"\";\r\n\r\n  let isPlaying = false;\r\n  const videoObj = videoMap[lang] || videoMap['en'];\r\n\r\n  if (videoObj.type === \"youtube\" && ytPlayer && ytReady) {\r\n    isPlaying = ytPlayer.getPlayerState && ytPlayer.getPlayerState() === 1;\r\n  } else if (videoObj.type === \"bunny\" && html5VideoElement) {\r\n    isPlaying = !html5VideoElement.paused;\r\n  }\r\n\r\n  const buttonLabel = isPlaying ? \"Pause\" : \"Play\";\r\n  const buttonIcon = isPlaying ? \"\u23f8\" : \"\u25b6\ufe0f\";\r\n\r\n  const btnHtml = `<button id=\"playPauseBtn\" style=\"padding:0.5em 1em;font-size:1em;border-radius:6px;background: #0F3F91;color:#fff;border:none;cursor:pointer;margin-bottom:1em;transition: background 0.2s;display: block;\">\r\n      ${buttonIcon} ${buttonLabel}\r\n    <\/button>`;\r\n\r\n  const container = document.getElementById('playPauseContainer');\r\n  if (container) {\r\n    container.innerHTML = btnHtml;\r\n    const playPauseBtn = document.getElementById('playPauseBtn');\r\n    if (playPauseBtn) {\r\n      playPauseBtn.onclick = function() {\r\n        let isPlayingNow = false;\r\n        if (videoObj.type === \"youtube\" && ytPlayer && ytReady) {\r\n          isPlayingNow = ytPlayer.getPlayerState && ytPlayer.getPlayerState() === 1;\r\n          ytPlayer.seekTo(ch.time, true);\r\n          if (isPlayingNow) {\r\n            ytPlayer.pauseVideo();\r\n          } else {\r\n            ytPlayer.playVideo();\r\n          }\r\n        } else if (videoObj.type === \"bunny\" && html5VideoElement) {\r\n          isPlayingNow = !html5VideoElement.paused;\r\n          html5VideoElement.currentTime = ch.time;\r\n          if (isPlayingNow) {\r\n            html5VideoElement.pause();\r\n          } else {\r\n            html5VideoElement.play();\r\n          }\r\n        }\r\n        \/\/ No manual re-render here!\r\n      };\r\n    }\r\n  }\r\n}\r\n\r\n\r\nfunction formatTranscriptBlock(lines) {\r\n  let prevTime = null;\r\n  let out = [];\r\n  for (let i = 0; i < lines.length; i++) {\r\n    const { time, text } = lines[i];\r\n    \/\/ Convert seconds to MM:SS\r\n    const min = Math.floor(time \/ 60);\r\n    const sec = Math.floor(time % 60);\r\n    const mmss = `${min}:${sec.toString().padStart(2, '0')}`;\r\n    if (time !== prevTime) {\r\n      out.push(`<br><b><span style=\"color:#FFF\">${mmss}<\/span><\/b> ${text}`);\r\n    } else {\r\n      out.push(text);\r\n    }\r\n    prevTime = time;\r\n  }\r\n  return out.join('<br>');\r\n}\r\n\r\n\r\n\r\n\r\nfunction renderPanel(idx) {\r\n  const lang = getCurrentLang();\r\n\r\n  const simplifiedLabel = document.getElementById('simplified-transcript-label')?.textContent || \"\";\r\n  const simplifiedNote = document.getElementById('simplified-transcript-note')?.textContent || \"Note: ...\";\r\n\r\n  const chapters = chapterMap['en'];\r\n  const ch = chapters[idx];\r\n  if (!ch) {\r\n      console.error(`Chapter index ${idx} not found for language ${lang}.`);\r\n      return;\r\n  }\r\n\r\n  \/\/ --- Find hiddenText lines within this chapter's time range ---\r\n  const linesInRangeArr = hiddenTextLines\r\n    .filter(line => line.time >= ch.time && line.time < ch.stop);\r\n\r\n  const transcriptHTML = formatTranscriptBlock(linesInRangeArr);\r\n\r\n  let extra = \"\";\r\n  if (linesInRangeArr.length) {\r\n    extra = `\r\n      <br><br>\r\n      <!--span style=\"display:block;margin-top:1em;margin-bottom:0.25em;font-weight:bold\">${simplifiedLabel}<\/span-->\r\n      <span style=\"color:#f5f5f5;font-size:100%\">${transcriptHTML}<\/span>\r\n      <br>\r\n      <span style=\"display:block;margin-top:0.75em;font-size:75%;color:#00C2C2;\">\r\n        <br>${simplifiedNote}\r\n      <\/span>\r\n    `;\r\n  }\r\n\r\n  \/\/ Insert the Play\/Pause button at the very top of the panel\r\n  const playPauseButton = renderPlayPauseButton(idx);\r\n\r\n  document.getElementById('chapterPanel').innerHTML =\r\n    `<h3 style=\"margin-top:0;color:#fff\">${ch.title}<\/h3>\r\n     <div id=\"playPauseContainer\" style=\"margin-bottom:1em\"><\/div>\r\n     <p style=\"margin-bottom:0;color:#fff\">${ch.description}${extra}<\/p>`;\r\n\r\n  renderPlayPauseButton(idx);\r\n  renderTabs(idx, chapters);\r\n\r\n  \/\/ Attach the event handler after the button is inserted\r\n  const playPauseBtn = document.getElementById('playPauseBtn');\r\n  if (playPauseBtn) {\r\n    playPauseBtn.onclick = function() {\r\n      const videoObj = videoMap[lang] || videoMap['en'];\r\n      let isPlaying = false;\r\n      if (videoObj.type === \"youtube\" && ytPlayer && ytReady) {\r\n        isPlaying = ytPlayer.getPlayerState && ytPlayer.getPlayerState() === 1;\r\n        ytPlayer.seekTo(ch.time, true);\r\n        if (isPlaying) {\r\n          ytPlayer.pauseVideo();\r\n        } else {\r\n          ytPlayer.playVideo();\r\n        }\r\n      } else if (videoObj.type === \"bunny\" && html5VideoElement) {\r\n        isPlaying = !html5VideoElement.paused;\r\n        html5VideoElement.currentTime = ch.time;\r\n        if (isPlaying) {\r\n          html5VideoElement.pause();\r\n        } else {\r\n          html5VideoElement.play();\r\n        }\r\n      }\r\n      \/\/ Optionally update button after action\r\n      \/\/ setTimeout(() => renderPanel(idx), 300);\r\n    };\r\n  }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nwindow.showChapter = function(idx) {\r\n  currentChapterIdx = idx;\r\n\r\n  const lang = getCurrentLang();\r\n  \/\/ const chapters = chapterMap[lang] || chapterMap['en']; \/\/ Fallback to 'en'   \r\n  \/\/ will switch for video but NOT for text (translatepress will accomplish)\r\n  const chapters = chapterMap['en']; \/\/ Fallback to 'en' chapters\r\n  const chapterData = chapters[idx];\r\n\r\n  if (!chapterData) {\r\n      console.error(`Chapter data for index ${idx} not found.`);\r\n      return;\r\n  }\r\n  renderPanel(idx); \/\/ Update panel and tabs\r\n\r\n  \/\/ Scroll tab into view\r\n  const buttons = document.getElementsByClassName('chapter-tab');\r\n  if (buttons[idx]) buttons[idx].scrollIntoView({ behavior: 'smooth', inline: 'center', block: 'nearest' });\r\n\r\n  const videoObj = videoMap[lang] || videoMap['en'];\r\n\r\n  \/\/ Clear previous stop timer\r\n  if (stopTimer) clearInterval(stopTimer);\r\n\r\n  if (videoObj.type === \"youtube\") {\r\n    if (ytReady && ytPlayer && typeof ytPlayer.seekTo === 'function') {\r\n      ytPlayer.seekTo(chapterData.time, true);\r\n      ytPlayer.playVideo();\r\n      \r\n    } else {\r\n        console.warn(\"YouTube player not ready or seekTo not available.\");\r\n    }\r\n  } else if (videoObj.type === \"bunny\" && html5VideoElement) {\r\n    html5VideoElement.currentTime = chapterData.time;\r\n    html5VideoElement.play().catch(e => console.warn(\"Autoplay after seek prevented:\", e));\r\n  }\r\n};\r\n\r\nfunction reInitChaptersAndPlayer() {\r\n  const lang = getCurrentLang();\r\n  const videoObj = videoMap[lang] || videoMap['en']; \/\/ Fallback to 'en' video\r\n\r\n  if (!videoObj) {\r\n      console.error(`No video configuration found for language: ${lang} or fallback 'en'.`);\r\n      return;\r\n  }\r\n\r\n  setVideoPlayer(videoObj); \/\/ This now also cleans up old players\r\n\r\n  \/\/ Short delay to ensure DOM is updated, especially for iframe\r\n  setTimeout(function(){\r\n    renderPanel(0); \/\/ Render first chapter panel\r\n    if (videoObj.type === \"youtube\") {\r\n      \/\/ Load or re-initialize YT API for new iframe\r\n      if (typeof YT === 'undefined' || !YT.Player) { \/\/ Check if YT object or YT.Player is undefined\r\n        var tag = document.createElement('script');\r\n        tag.src = \"https:\/\/www.youtube.com\/iframe_api\";\r\n        var firstScriptTag = document.getElementsByTagName('script')[0];\r\n        firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n      } else {\r\n        \/\/ If API is loaded, re-initialize player for the new iframe if needed\r\n        onYouTubeIframeAPIReady();\r\n      }\r\n    }\r\n  }, 100); \/\/ Reduced delay, might need adjustment\r\n}\r\n\r\n\/* ----- YT API Bootstrapping ----- *\/\r\n\/\/ This global function is called by the YouTube Iframe API script\r\nwindow.onYouTubeIframeAPIReady = function() {\r\n  const iframe = document.getElementById('myVideo');\r\n  if (iframe && iframe.tagName === 'IFRAME' && !ytPlayer) { \/\/ Ensure it's an iframe and player not already set\r\n    \/\/ console.log(\"onYouTubeIframeAPIReady called, initializing YT Player.\");\r\n    ytPlayer = new YT.Player('myVideo', {\r\n      events: {\r\n        'onReady': function(event) {\r\n          ytReady = true;\r\n          \/\/ console.log(\"YouTube Player Ready.\");\r\n          \/\/ If a chapter was clicked before YT was ready, try to apply it now.\r\n          \/\/ This requires knowing the current chapter index, which might need to be stored.\r\n          \/\/ For simplicity, we'll assume the user might click a chapter again or it starts at 0.\r\n        },\r\n        'onStateChange': function(event) {\r\n\t\t\t\/\/ 1 = playing, 2 = paused\r\n\t\t\trenderPlayPauseButton(currentChapterIdx); \/\/ currentChapterIdx should be tracked globally\r\n\t\t}\r\n      }\r\n    });\r\n  } else if (iframe && iframe.tagName === 'IFRAME' && ytPlayer && typeof ytPlayer.destroy === 'function') {\r\n    \/\/ This case handles if the API is reloaded or if reInit is called and iframe exists\r\n    \/\/ It's a bit tricky; ideally, we destroy and recreate fully.\r\n    \/\/ The cleanupPlayers function should handle most of this.\r\n    \/\/ console.log(\"onYouTubeIframeAPIReady called, player might exist. Attempting to re-bind if necessary.\");\r\n  }\r\n};\r\n\r\n\/* ----- Event Hooks ----- *\/\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n    if (document.getElementById('videoPlayerContainer')) { \/\/ Only run if the container exists\r\n        reInitChaptersAndPlayer();\r\n\r\n\t\t\r\n\r\n\r\n    }\r\n});\r\n\/\/ TranslatePress fires this event on language change\r\ndocument.addEventListener('trp_language_changed', function() {\r\n    if (document.getElementById('videoPlayerContainer')) { \/\/ Only run if the container exists\r\n        reInitChaptersAndPlayer();\r\n\t\t\r\n\r\n    }\r\n});\r\n\r\n<\/script>\r\n\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-40859b7 elementor-widget elementor-widget-html\" data-id=\"40859b7\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n\/* Your existing CSS is good, no changes needed unless you want to refine *\/\n.chapter-tabs-scroll {\n  display: flex;\n  overflow-x: auto;\n  gap: 10px;\n  margin-bottom: 18px;\n  scrollbar-width: thin;\n  scrollbar-color: #a0aec0 #f7fafc; \/* For Firefox *\/\n  -webkit-overflow-scrolling: touch;\n  padding-bottom: 5px; \/* To make scrollbar visible without cutting content *\/\n  border-radius: 8px; \/* Optional: if you want rounded corners for the scroll area *\/\n}\n\/* Webkit Scrollbar Styles *\/\n.chapter-tabs-scroll::-webkit-scrollbar {\n  height: 7px;\n}\n.chapter-tabs-scroll::-webkit-scrollbar-track {\n  background: #111; \/* Or a lighter color if preferred *\/\n  border-radius: 4px;\n}\n.chapter-tabs-scroll::-webkit-scrollbar-thumb {\n  background: #333; \/* Or a contrasting color *\/\n  border-radius: 4px;\n}\n.chapter-tab {\n  white-space: nowrap;\n  border: none;\n  background: #222; \/* Darker tab background *\/\n  color: #fff;\n  font-size: 1.1em;\n  padding: 8px 22px;\n  border-radius: 999px; \/* Pill shape *\/\n  cursor: pointer;\n  transition: background 0.2s, color 0.2s, font-weight 0.2s, box-shadow 0.2s;\n  margin-bottom: 0; \/* Ensure no extra space below tabs if they wrap *\/\n  outline: none; \/* Remove default focus outline if you have custom focus styles *\/\n  margin-right: 0; \/* Reset if previously set for spacing between items *\/\n}\n.chapter-tab.active,\n.chapter-tab:hover {\n  background: #e0e7ff; \/* Light blue for active\/hover *\/\n  color: #111; \/* Dark text for active\/hover *\/\n  font-weight: bold;\n  box-shadow: 0 2px 8px #dbeafe66; \/* Softer shadow *\/\n}\n.chapter-panel {\n  background: rgba(20,20,20,0.88); \/* Semi-transparent dark background *\/\n  border-radius: 8px;\n  box-shadow: 0 2px 6px #111; \/* Subtle shadow *\/\n  padding: 20px 24px;\n  min-height: 80px; \/* Ensure panel has some height even if description is short *\/\n  transition: box-shadow 0.3s; \/* Smooth shadow transition on hover (if any) *\/\n}\n\/* Add a class for the video player container if you want to target its children more easily *\/\n#videoPlayerContainer video { \/* Ensure video tag fits container *\/\n    display: block; \/* Removes extra space below if it's inline *\/\n}\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e4bc449 e-flex e-con-boxed e-con e-parent\" data-id=\"e4bc449\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-fdce02d e-con-full e-flex e-con e-child\" data-id=\"fdce02d\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6160f3a elementor-widget elementor-widget-shortcode\" data-id=\"6160f3a\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- Post Page Mid Roll -->\r\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ea60902 elementor-widget elementor-widget-html\" data-id=\"ea60902\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- 4. NO TOUCH Scripts -->\n<!-- ImageID_4 HTML external scripts to call + JS -->\n<!-- script src=\"https:\/\/code.jquery.com\/jquery-3.7.1.min.js\"><\/script -->\r\n<script>\r\njQuery(document).ready(function ($) {\r\n\r\n  \/\/ --- IMAGE HOTSPOTS AND BUTTONS INIT ---\r\n  $('.hotspot-block').each(function () {\r\n    const $block = $(this);\r\n    const id = $block.data('id');\r\n    const $image = $block.find(`.main-image[data-id=\"${id}\"]`);\r\n    const $container = $block.find('.hotspot-container');\r\n    const $buttons = $block.find('.hotspot-buttons');\r\n    const imageUrl = imageMap[id];\r\n\r\n\r\n\t\r\n    const csvRaw = $(`pre#hotspot-data-${id}`).text().trim();\r\n\r\n    const activeNumbers = [];\r\n    $block.data('activeNumbers', activeNumbers);\r\n\r\n    if (!imageUrl) return;\r\n    $image.attr('src', imageUrl);\r\n\r\n    $image.on('load', function () {\r\n      const imgWidth = $image[0].naturalWidth;\r\n      const imgHeight = $image[0].naturalHeight;\r\n\r\n      \/\/ --- Simple Pipe-Delimited Parse ---\r\n\tconst lines = csvRaw.split('\\n').map(line => line.trim()).filter(Boolean);\r\n\tif (lines.length < 2) return;\r\n\t\/\/ Optionally check header here if you want\r\n\tconst data = lines.slice(1).map(line => {\r\n\t  \/\/ Split by pipe instead of comma, but allow pipes in the text field (by joining the rest)\r\n\t  const parts = line.split('|');\r\n\t  const order = parts[0] ? parts[0].trim() : '';\r\n\t  const x_px = parts[1] ? parts[1].trim() : '';\r\n\t  const y_px = parts[2] ? parts[2].trim() : '';\r\n\t  const direction = parts[3] ? parts[3].trim() : '';\r\n\t  const text = parts.length > 4 ? parts.slice(4).join('|').trim() : '';\r\n\t  return { order, x_px, y_px, direction, text };\r\n\t});\r\n\r\n\t\/\/ console.log('Parsed data:', data);\r\n\r\n\r\n      data.forEach(row => {\r\n        const number = String($.trim(row.order));\r\n        const xPx = parseFloat(row.x_px);\r\n        const yPx = parseFloat(row.y_px);\r\n        const dir = (row.direction || \"A\").trim().toUpperCase();\r\n        const text = $.trim(row.text);\r\n        const leftPercent = (xPx \/ imgWidth) * 100;\r\n        const topPercent = (yPx \/ imgHeight) * 100;\r\n\r\n        const tooltipClass = {\r\n          A: 'tooltip-above',\r\n          B: 'tooltip-below',\r\n          L: 'tooltip-left',\r\n          R: 'tooltip-right'\r\n        }[dir] || 'tooltip-above';\r\n\r\n        \/\/ Tooltip text present in DOM for TranslatePress!\r\n        const formattedText = `${number}. ` + text.replace(\/\\n\/g, '<br>');\r\n        const $hotspot = $(`\r\n          <div class=\"hotspot ${tooltipClass}\" data-number=\"${number}\">\r\n            <span class=\"hotspot-number\">${number}<\/span>\r\n            <span class=\"hotspot-tooltip\" style=\"display:none;\">${formattedText}<\/span>\r\n          <\/div>\r\n        `).css({\r\n          left: `${leftPercent}%`,\r\n          top: `${topPercent}%`,\r\n          transform: 'translate(-50%, -50%)',\r\n          position: 'absolute'\r\n        });\r\n\r\n        $container.append($hotspot);\r\n        $buttons.append(`<button class=\"hotspot-btn\" data-number=\"${number}\">${number}<\/button>`);\r\n      });\r\n    });\r\n  });\r\n\r\n  \/\/ --- STYLE UPDATE FUNCTION ---\r\nfunction updateStyles($block) {\r\n  const active = $block.data('activeNumbers') || [];\r\n  $block.find('.hotspot').each(function () {\r\n    const num = String($(this).data('number'));\r\n    const $tooltip = $(this).find('.hotspot-tooltip');\r\n    if (active.includes(num)) {\r\n      $(this).addClass('enlarged active');\r\n      $tooltip.show(); \/\/ <-- Show tooltip!\r\n    } else {\r\n      $(this).removeClass('enlarged active');\r\n      $tooltip.hide(); \/\/ <-- Hide tooltip!\r\n    }\r\n  });\r\n  $block.find('.hotspot-btn').each(function () {\r\n    const num = String($(this).data('number'));\r\n    $(this)\r\n      .toggleClass('highlight', active.includes(num))\r\n      .toggleClass('enlarged', active.includes(num));\r\n  });\r\n}\r\n\r\n\r\n  \/\/ --- HOTSPOT\/BUTTON CLICK ---\r\n  $(document).on('click', '.hotspot, .hotspot-btn', function (e) {\r\n    e.preventDefault();\r\n    const $clicked = $(e.target).closest('.hotspot, .hotspot-btn');\r\n    const num = String($clicked.data('number'));\r\n    const $block = $clicked.closest('.hotspot-block');\r\n    let active = $block.data('activeNumbers') || [];\r\n\r\n    const wasActive = active.includes(num);\r\n\r\n    \/\/ Clear Hide if checked\r\n    const $hide = $block.find('.hide-numbers-toggle');\r\n    if ($hide.is(':checked')) {\r\n      $hide.prop('checked', false).trigger('change');\r\n    }\r\n\r\n    if (wasActive) {\r\n      active = active.filter(n => n !== num);\r\n    } else {\r\n      active = [num]; \/\/ Only one active at a time\r\n    }\r\n    $block.data('activeNumbers', active);\r\n    updateStyles($block);\r\n\r\n    \/\/ Uncheck \"Show all\" if not all hotspots are active\r\n    const allNums = $block.find('.hotspot').map((_, el) => String($(el).data('number'))).get();\r\n    const $toggle = $block.find('.show-all-toggle');\r\n    const isAllActive = allNums.every(n => active.includes(n));\r\n    $toggle.prop('checked', isAllActive);\r\n  });\r\n\r\n  \/\/ --- SHOW ALL \/ HIDE MUTUAL EXCLUSIVITY AND BEHAVIOR ---\r\n  $(document).on('change', '.show-all-toggle', function() {\r\n    const id = $(this).data('id');\r\n    const $block = $(`.hotspot-block[data-id=\"${id}\"]`);\r\n    const $hide = $block.find('.hide-numbers-toggle');\r\n    const $hotspots = $block.find('.hotspot');\r\n    const allNums = $hotspots.map((_, el) => String($(el).data('number'))).get();\r\n\r\n    \/\/ Mutually exclusive: uncheck Hide if Show All is checked\r\n    if ($(this).is(':checked')) {\r\n      if ($hide.is(':checked')) {\r\n        $hide.prop('checked', false).trigger('change');\r\n      }\r\n      $block.data('activeNumbers', allNums);\r\n    } else {\r\n      $block.data('activeNumbers', []);\r\n    }\r\n\r\n    updateStyles($block);\r\n  });\r\n\r\n  \/\/ Hide handler\r\n  $(document).on('change', '.hide-numbers-toggle', function() {\r\n    const id = $(this).data('id');\r\n    const $block = $(`.hotspot-block[data-id=\"${id}\"]`);\r\n    const $showAll = $block.find('.show-all-toggle');\r\n    const $hotspots = $block.find('.hotspot');\r\n    const checked = $(this).is(':checked');\r\n\r\n    \/\/ Mutually exclusive: uncheck Show All if Hide is checked\r\n    if (checked && $showAll.is(':checked')) {\r\n      $showAll.prop('checked', false).trigger('change');\r\n    }\r\n\r\n    if (checked) {\r\n      $hotspots.hide();\r\n      $block.find('.enlarged, .active').removeClass('enlarged active');\r\n    } else {\r\n      $hotspots.show();\r\n    }\r\n  });\r\n\r\n  \/\/ --- CLICKING OUTSIDE CLEARS EVERYTHING ---\r\n  $(document).on('click', function (e) {\r\n    const $target = $(e.target);\r\n    const $block = $target.closest('.hotspot-block');\r\n    $('.hotspot-block').each(function () {\r\n      const $thisBlock = $(this);\r\n      if (!$block.length || !$block.is(this)) {\r\n        $thisBlock.data('activeNumbers', []);\r\n        $thisBlock.find('.show-all-toggle').prop('checked', false);\r\n        updateStyles($thisBlock);\r\n      }\r\n    });\r\n  });\r\n\r\n});\r\n<\/script>\r\n \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Un conflit r\u00e9cent sur Twitter entre des influenceuses de droite est utilis\u00e9 pour illustrer les concepts de \"fournir\" et de \"m\u00e9riter\". hoe_math met en \u00e9vidence la fa\u00e7on dont les comportements de recherche d'attention se manifestent dans le monde des influenceurs conservateurs en ligne. Il critique la tendance des femmes conservatrices \u00e0 rechercher la validation et les ressources sans fournir de valeur correspondante en retour. hoe_math utilise la [...]<\/p>","protected":false},"author":6,"featured_media":5719,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[150,104,144,102,130,108,132],"tags":[127,126],"class_list":["post-5718","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-drama","category-emotional-behavior","category-marriage","category-public","category-recent","category-social-commentary","category-social-dynamics","tag-es","tag-fr"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/posts\/5718","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/comments?post=5718"}],"version-history":[{"count":27,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/posts\/5718\/revisions"}],"predecessor-version":[{"id":5756,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/posts\/5718\/revisions\/5756"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/media\/5719"}],"wp:attachment":[{"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/media?parent=5718"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/categories?post=5718"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/tags?post=5718"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}