{"id":3573,"date":"2025-08-27T11:53:59","date_gmt":"2025-08-27T16:53:59","guid":{"rendered":"https:\/\/itishoemath.com\/?p=3573"},"modified":"2025-10-17T10:18:46","modified_gmt":"2025-10-17T15:18:46","slug":"maos-de-passaro","status":"publish","type":"post","link":"https:\/\/itishoemath.com\/pt_pt\/maos-de-passaro\/","title":{"rendered":"M\u00e3os de p\u00e1ssaro"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"3573\" class=\"elementor elementor-3573\" 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-c4dae98 elementor-widget elementor-widget-text-editor\" data-id=\"c4dae98\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h4><strong>M\u00e3os de p\u00e1ssaro = Poder social ?<\/strong><\/h4>\nNeste v\u00eddeo, <span>h<\/span>oe_math tra\u00e7a com humor a ascens\u00e3o do gesto \"m\u00e3os de p\u00e1ssaro\" - em que as mulheres no TikTok usam movimentos de m\u00e3o pontiagudos e bicados - para tend\u00eancias mais amplas na influ\u00eancia social, comportamento de grupo e linguagem corporal. Explica o significado psicol\u00f3gico subjacente a estes gestos, a forma como reflectem lutas mais profundas pelo poder, aceita\u00e7\u00e3o e estatuto, e associa-os a mudan\u00e7as sociais nos encontros, na din\u00e2mica do local de trabalho e no ativismo online. O v\u00eddeo relaciona a linguagem corporal com<!--preview--> t\u00e1cticas de negocia\u00e7\u00e3o colectiva, lealdade de grupo e as armadilhas da unidade social performativa, ao mesmo tempo que fornece dicas pr\u00e1ticas para reconhecer quando se est\u00e1 a ser manipulado ou pressionado por narrativas populares.\t\t\t\t\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\n<!-- Header: Not Translated -->\n<script id=\"video-data-header\" type=\"text\/plain\">\ntime|stop|tab|title|description\n<\/script>\n\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|25|Origens|Origens do Decl\u00ednio|A discuss\u00e3o come\u00e7a com um humor que atribui o decl\u00ednio da Am\u00e9rica ao aumento do n\u00famero de mulheres que usam gestos de \"m\u00e3os de p\u00e1ssaro\" nas redes sociais, sugerindo que estes comportamentos s\u00e3o sintom\u00e1ticos de problemas sociais mais profundos.\n25|71|Hist\u00f3ria|Hist\u00f3ria do Poder Feminino|Uma retrospetiva das atitudes hist\u00f3ricas em rela\u00e7\u00e3o \u00e0 agressividade feminina e de como as mulheres eram castigadas por se queixarem, contrastando com a atual liberdade que as mulheres t\u00eam para se expressarem.\n71|155|Gestos|Significado dos gestos com as m\u00e3os|O significado de v\u00e1rios gestos com as m\u00e3os, especialmente as \"m\u00e3os de p\u00e1ssaro\" vistas no TikTok, \u00e9 explicado em pormenor, destacando a sua utiliza\u00e7\u00e3o inconsciente e o que indicam sobre as inten\u00e7\u00f5es e o estado de esp\u00edrito do orador.\n155|210|SocialSpread|Spread of Social Behaviors|A narrativa explora a forma como estes gestos e comportamentos se espalham pela sociedade, particularmente entre as mulheres, e o seu papel na din\u00e2mica de grupo e nas negocia\u00e7\u00f5es.\n210|293|GroupDynamics|Negocia\u00e7\u00e3o em grupo feminino|O conte\u00fado analisa a forma como as mulheres se apoiam mutuamente atrav\u00e9s de estrat\u00e9gias de negocia\u00e7\u00e3o colectiva, muitas vezes inflacionando a autoestima de cada uma e excluindo as dissidentes, especialmente em contextos profissionais.\n293|356|Poder|Quest\u00f5es de Poder e Controlo| Argumenta-se que estes comportamentos s\u00e3o, em \u00faltima an\u00e1lise, sobre a obten\u00e7\u00e3o de poder e controlo, com a lealdade do grupo a ser demonstrada atrav\u00e9s da mentira colectiva e da manipula\u00e7\u00e3o das normas sociais.\n356|496|Consequ\u00eancias|Consequ\u00eancias para as rela\u00e7\u00f5es|O segmento final discute as consequ\u00eancias sociais mais amplas destas tend\u00eancias, incluindo a deteriora\u00e7\u00e3o das rela\u00e7\u00f5es entre homens e mulheres, a perda de respeito e o aumento da divis\u00e3o social, concluindo com o conselho de resistir a estas press\u00f5es colectivas.\n<\/pre>\n\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9265a2c elementor-widget elementor-widget-html\" data-id=\"9265a2c\" 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<!-- 2.1. MOD Image CSV -->\n<!-- 1st image, update this\n     ImageID_3 image data locations and text -->\n<div id=\"tp-translatable-strings3\"\n     style=\"color:#000101; background:#000101; width:100vw; height:auto; position:static; z-index:1; font-size:1px;\">\n<!-- CSV for image1  style=\"display:none;\" -->\n<pre id=\"hotspot-data-image1\">\n<span class=\"notranslate\">ordem|x_px|y_px|Esquerda_Direita_Acima_Baixo|texto\n1|163|692|R|<span class=\"translate\">Ele deve levar spray de urso ou de homem?<\/span>\n2|816|594|A|<span class=\"translate\">Muitas mulheres dizem que preferem ir contra um urso. Parece-me mais seguro!<\/span>\n3|816|713|A|<span class=\"translate\">Mas porqu\u00ea? Numa cidade, as mulheres passam por centenas de homens estranhos todos os dias.<\/span>\n4|16|159|R|<span class=\"translate\"><span>h<\/span>oe_math faz as contas: os ursos s\u00e3o pelo menos 10 vezes mais perigosos.\n<\/span>\n5|399|148|R|<span class=\"translate\">Ent\u00e3o, qual \u00e9 a verdadeira raz\u00e3o? Dizer \"o homem\" pode ser uma jogada de poder - para insinuar que eles s\u00e3o mais perigosos do que os ursos.<\/span>\n6|399|287|L|<span class=\"translate\">Mais uma forma de fazer passar a ideia de que os homens s\u00e3o a amea\u00e7a... e t\u00eam de ser controlados! Parece conversa de \"Recursos Humanos\"!<\/span>\n<\/span>\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-53abaad elementor-widget elementor-widget-html\" data-id=\"53abaad\" 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<!-- 2.2. OPTIONAL 2nd Image CSV -->\n<!-- 2nd image, update this, else delete\n     ImageID_3 image data locations and text -->\n\n<div id=\"tp-translatable-strings4\"\n     style=\"color:#000101; background:#000101; width:100vw; height:auto; position:static; z-index:1; font-size:1px;\">\n<pre id=\"hotspot-data-image2\">\n<span class=\"notranslate\">ordem|x_px|y_px|Esquerda_Direita_Acima_Baixo|texto\n1|278|90|R|<span class=\"translate\">Ao longo da hist\u00f3ria, as mulheres sempre procuraram homens que pudessem \"prover\".<\/span>\n2|612|127|B|<span class=\"translate\">Assim, os homens trabalhavam arduamente para sustentar as suas mulheres e filhos. Por conseguinte, ganhavam normalmente mais.<\/span>\n3|294|188|L|<span class=\"translate\">Os defensores da igualdade de remunera\u00e7\u00e3o disseram que isto n\u00e3o estava correto. Porque \u00e9 que os homens ganham mais?<\/span>\n4|296|318|R|<span class=\"translate\">As mulheres da Equal Pay exigiram que o governo interviesse e obrigasse \u00e0 igualdade de remunera\u00e7\u00e3o.<\/span>\n5|515|449|R|<span class=\"translate\">Atualmente, muitos homens n\u00e3o conseguem ser um provedor superior. Assim, o encontro para \"apenas tomar um caf\u00e9\".<\/span>\n6|229|439|L|<span class=\"translate\">Agora, muitas mulheres est\u00e3o confusas porque j\u00e1 n\u00e3o conseguem \"encontrar fornecedores\" e est\u00e3o a \"elevar os seus padr\u00f5es\".<\/span>\n<\/span>\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-1417dae elementor-widget elementor-widget-html\" data-id=\"1417dae\" 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<!-- 1. MOD Image Links -->\n<!-- ImageID_5 image urls -->\n\n<script>\n  const imageMap = {\n    image1: \"https:\/\/itishoemath.com\/wp-content\/uploads\/2025\/06\/Bear-Man-Woods-Which.jpg\",\n    image2: \"\"\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-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 Ei l\u00e1, estas \"deporta\u00e7\u00f5es em massa\" v\u00e3o ajudar os verdadeiros americanos, certo?\n1 Vou parar por aqui - aposto que est\u00e3o a pensar como \u00e9 que a Am\u00e9rica chegou aqui.\n6 Bem, tudo come\u00e7ou com \"m\u00e3os de p\u00e1ssaro\". \u00c9 isso mesmo.\n9 A Am\u00e9rica foi pelo cano abaixo assim que come\u00e7ou a permitir que mulheres rabugentas e insatisfeitas (de um tr\u00eas a um seis) fizessem estes gestos de \"henpeck\" no TikTok.\n14 Eu sei que parece uma loucura, mas vamos voltar ao in\u00edcio. H\u00e1 muito tempo, as pessoas entendiam que as mulheres tamb\u00e9m eram violentas.\n29 Um homem vai simplesmente sair \u00e0 rua e dar-te um murro no nariz, mas as mulheres s\u00e3o pequenas e fracas, por isso mentem que s\u00e3o v\u00edtimas at\u00e9 que algu\u00e9m o fa\u00e7a por elas.\n38 Isso faz com que todos os idiotas saiam da toca e fa\u00e7am o que eles querem como insectos. Antigamente compreend\u00edamos isto, e as mulheres que se queixavam tamb\u00e9m costumavam ser castigadas por outras coisas.\n49 Este chama-se o freio do repreensor - faz com que ela n\u00e3o possa falar. \u00c9 uma loucura, n\u00e3o \u00e9? Mas hoje em dia, as mulheres podem fazer o que quiserem, quando quiserem. E se tu apontares para isso, sabes que mais? \u00c9s o mau da fita. Diz-me que isso n\u00e3o \u00e9 uma loucura.\n64 O que \u00e9 que tudo isto tem a ver com m\u00e3os de p\u00e1ssaro? Tudo.\n71 Tudo bem, foi divertido. Finalmente consegui p\u00f4r o Ableton a funcionar outra vez. De qualquer forma, o Podcast perguntou: \"Porque \u00e9 que elas fazem sempre a coisa da m\u00e3o?\", referindo-se a este pequeno gesto de \"henpeck\" que as raparigas t\u00eam feito com as m\u00e3os. Pensei em trazer-vos a resposta.\n84 Aqui est\u00e1: a coisa da m\u00e3o que as raparigas do TikTok est\u00e3o a fazer \u00e9 que as m\u00e3os est\u00e3o fechadas e apontadas para ti. Significa: \"\u00c9 melhor ouvires-me. Estou a dizer-te que \u00e9 nisto que acreditas agora\".\n93 Quando apontamos para n\u00f3s pr\u00f3prios, temos a cena do beijo do chefe italiano: \"Oh, estou a dizer-te, isto \u00e9 assim - olha o que eu fiz aqui. Eu fiz isso inconscientemente.\" Ou seja, \"Isto \u00e9 t\u00e3o bom, devias experimentar\".\n110 M\u00e3os fechadas aqui: \"Tenho a certeza do que estou a dizer e recebo as vossas necessidades. Devias experimentar isto, \u00e9 \u00f3timo\".\n118 Isto tamb\u00e9m \u00e9 usado em argumentos italianos. O que Trump faz \u00e9 o duplo abrir de m\u00e3os, e mexe-as muito: \"Estou a ouvir-vos, compreendo as vossas necessidades.\"\n130 Quando as m\u00e3os est\u00e3o abertas para si, significa: \"Ouve-me, estou a implorar-te.\" Nunca farias isto com aquilo.\n141 Ent\u00e3o os sinais das m\u00e3os - eles n\u00e3o s\u00e3o nada. Eles s\u00e3o inconscientes. Se deixares as tuas m\u00e3os fazerem o que querem enquanto falas, elas fazem parte da conversa por ti.\n155 O facto de as raparigas do TikTok estarem todas a fazer isto \u00e9 um mau sinal. Significa que elas est\u00e3o no fim da corda, na minha opini\u00e3o, e est\u00e3o apenas a dizer, \"Faz o que eu quero, faz o que eu quero\".\n162 Ent\u00e3o \u00e9 assim que as mulheres est\u00e3o a fazer, acho eu. E, sim, s\u00e3o as mulheres. S\u00e3o sempre as mulheres que est\u00e3o a cair primeiro - s\u00e3o elas que s\u00e3o mais suscept\u00edveis \u00e0s mudan\u00e7as sociais.\n174 Mas estas coisas espalham-se sempre. Por exemplo, h\u00e1 20 anos, toda a gente dizia: \"N\u00e3o conhe\u00e7as ningu\u00e9m da Internet\", e agora \u00e9 s\u00f3 isso que fazemos. Portanto, isto pode seguir um padr\u00e3o semelhante.\n182 Li um pouco sobre linguagem corporal no Shortform - \u00e9 um \u00f3timo recurso para complementar o que estamos a aprender. \u00c9 preciso prestar aten\u00e7\u00e3o ao que as pessoas est\u00e3o a fazer quando falam, e o Shortform pode ajudar.\n191 (patroc\u00ednio\/an\u00fancio) Ganhe o 20% com o meu link.\n193 Este \u00e9 o meu gr\u00e1fico \"Quem \u00e9 um 10\". Explica porque \u00e9 que as mulheres que n\u00e3o s\u00e3o dez est\u00e3o sempre a dizer que o s\u00e3o. Tamb\u00e9m falei sobre isto no gr\u00e1fico padr\u00e3o de ilus\u00e3o feminina - \u00e9 assim que elas falam em p\u00fablico: toda a gente \u00e9 perfeita. E depois \u00e9 assim que elas falam em privado: elas e os seus melhores amigos est\u00e3o no topo e todos os outros s\u00e3o lixo.\n210 \u00c9 uma estrat\u00e9gia de negocia\u00e7\u00e3o colectiva. A forma como funciona \u00e9 que as m\u00e9dias e as subm\u00e9dias est\u00e3o sempre a enaltecer-se umas \u00e0s outras e a desculpar o comportamento umas das outras, porque essa \u00e9 a \u00fanica forma de competirem com as mulheres de topo - que tamb\u00e9m t\u00eam de fingir que toda a gente \u00e9 bonita ou ent\u00e3o n\u00e3o podem fazer parte do pequeno grupo de apoio.\n230 Isso normalmente n\u00e3o tem import\u00e2ncia at\u00e9 que todas trabalhem em recursos humanos. Quando est\u00e3o num grupo unificado, controlam o acesso a tudo, especialmente quando convencem os homens do meio a alinhar como se fossem receber alguma coisa por isso. (Elas nunca recebem.)\n244 A raz\u00e3o pela qual isto \u00e9 t\u00e3o perigoso - e n\u00f3s costum\u00e1vamos atirar-lhes fruta podre por o fazerem - \u00e9 que o grupo que d\u00e1 a m\u00e3o s\u00f3 funciona quando eles mentem.\n253 \u00c9 assim que se mostra lealdade ao grupo: dizem-se mentiras rid\u00edculas, porque quanto maior for a mentira, mais se prova que se diz qualquer coisa para ser inclu\u00eddo. \u00c9 um sinal de submiss\u00e3o.\n265 \u00c9 por isso que \u00e9 t\u00e3o nojento quando os homens o fazem, e \u00e9 por isso que est\u00e1 tudo t\u00e3o de pernas para o ar neste momento.\n269 Porque quando as mulheres ganham poder, n\u00e3o se limitam a dizer: \"Sou melhor do que tu no teu trabalho\", como faria um homem (e normalmente n\u00e3o \u00e9 verdade). Em vez disso, dizem coisas como: \"Os beb\u00e9s tamb\u00e9m podem ser pilotos\".\n282 Porque se isso \u00e9 verdade, significa que todos devem ser aceites em todo o lado, mesmo que n\u00e3o sejam suficientemente bons. E com \"em todo o lado\", querem dizer apenas nos melhores s\u00edtios - o que \u00e9 a mesma coisa que dizer \"Eu sou um 10\".\n296 Est\u00e3o a ver como est\u00e1 tudo ligado? Fazer uma exig\u00eancia e depois mentir coletivamente para a justificar. \"Eu sou um 10\" significa: \"Eu sou material de casamento para qualquer um. Eu deveria receber o mesmo que algu\u00e9m que realmente pode fazer o trabalho. N\u00e3o importa o que fa\u00e7o, importa o que recebo, mesmo que n\u00e3o o esteja a ganhar - e outra pessoa pode compensar o que n\u00e3o estou a fazer, mesmo que n\u00e3o receba nada.\"\n324 Por isso, votam para receber, mesmo que n\u00e3o o estejam a ganhar. E depois, quando est\u00e3o a receber igual ou mais, pensam que s\u00e3o melhores do que tu, o que te torna \"nojento\", e depois todas as mulheres andam \u00e0 procura de uns poucos homens, e depois ningu\u00e9m se casa e tem filhos, e toda a gente se odeia.\n339 \u00c9 por isso que quero que procures coisas como as m\u00e3os de p\u00e1ssaro. Isto \u00e9 tudo sobre dar instru\u00e7\u00f5es: \"Isto \u00e9 o que acreditamos agora,\" e eles est\u00e3o a tentar fazer-vos simp - e voc\u00eas n\u00e3o o podem fazer, porque perdem. Todos n\u00f3s perdemos.\n352 As m\u00e3os de p\u00e1ssaro s\u00e3o um sinal de desespero. N\u00e3o \u00e9 preciso ser en\u00e9rgico se estivermos realmente em controlo.\n359 Por isso, quando vemos mulheres a fazer isto, est\u00e3o a dizer: \"\u00c9 com isto que tens de concordar, ou n\u00e3o est\u00e1s no clube - e n\u00e3o queres estar no clube.\"\n366 Aqui est\u00e1 uma antevis\u00e3o do meu novo gr\u00e1fico de n\u00edveis - este \u00e9 mais f\u00e1cil de ler. O v\u00eddeo estar\u00e1 dispon\u00edvel em breve.\n372 As m\u00e3os de p\u00e1ssaro v\u00eam deste n\u00edvel - est\u00e3o a tentar controlar-te para obterem poder.\n376 Aqui est\u00e3o alguns exemplos: Homens a responder \u00e0 \"epidemia do homem cortado\".\n380 As raparigas est\u00e3o a dar o mesmo tipo de energia que o tipo de homem que se atiraria a ti e, quando o rejeitasse, diria: \"Bem, n\u00e3o \u00e9s assim t\u00e3o giro\".\n389 Aqui est\u00e1 a rapariga - ela est\u00e1 a falar de, tipo, aquela \u00e9 uma rapariga gira.\n393 Aqui est\u00e1 como as coisas v\u00e3o ser. Eu quero partilhar os meus pensamentos sobre esta coisa da epidemia de homens cortados, mas \u00e9 assim:\n398 A maioria dos homens n\u00e3o est\u00e1 a fazer qualquer esfor\u00e7o para se tornar atraente para as mulheres. Eu consigo ver a atratividade das pessoas objetivamente e, mesmo que n\u00e3o me sinta pessoalmente atra\u00eddo por elas, consigo reconhecer quando algu\u00e9m \u00e9 atraente.\n413 Reparem nas bicadas excessivas - ela est\u00e1 a dizer: \"Acredita em mim, acredita em mim\", apesar de saber, no fundo, que n\u00e3o veria estes tipos como t\u00e3o nojentos se n\u00e3o fosse o desequil\u00edbrio de poder causado pelo seu pr\u00f3prio comportamento.\n419 Esta era de ativismo pol\u00edtico, e ela sabe que est\u00e1 cheia de si. \"Se ver fam\u00edlias a serem despeda\u00e7adas n\u00e3o apela \u00e0 sua humanidade, deixe-me tentar apelar-lhe financeiramente, porque estas deporta\u00e7\u00f5es em massa do ICE s\u00e3o m\u00e1s para a economia.\"\n438 N\u00e3o \u00e9 essa a face da persuas\u00e3o? N\u00e3o queres acreditar em tudo o que ela diz?\n442 Aqui vai mais uma rapidinha - os homens queixam-se sempre que as mulheres est\u00e3o sempre a chatear. Se calhar ela n\u00e3o est\u00e1 a chatear e \u00e9 s\u00f3 porque voc\u00eas est\u00e3o sempre a fazer a mesma coisa. Uma mulher n\u00e3o quer estar na posi\u00e7\u00e3o de agir como sua m\u00e3e. N\u00e3o te coloques na posi\u00e7\u00e3o de agir como um filho dela.\n455 \u00c9 um bom conselho numa rela\u00e7\u00e3o. Mas, \u00e0 escala da sociedade, votaste no igual, o que te faz olhar para os homens como crian\u00e7as. N\u00e3o sei se conseguem fazer as contas - as mulheres t\u00eam de respeitar os homens ou eles n\u00e3o gostam de n\u00f3s, e est\u00e3o a eliminar coletivamente as coisas que os fazem respeitar-nos.\n470 Portanto, os problemas n\u00e3o s\u00e3o todos culpa dos homens. \u00c9 como se todas as mulheres ao mesmo tempo dissessem: \"Porque \u00e9 que tens de respirar t\u00e3o alto?\"\n478 Por isso, h\u00e1 que ter aten\u00e7\u00e3o \u00e0 linguagem corporal. M\u00e3os de p\u00e1ssaro nem sempre significa que ela est\u00e1 errada, mas significa que ela est\u00e1 a falar mal de ti.\n485 Mais uma vez, v\u00ea como isto n\u00e3o bate certo: \"Oh meu Deus, conseguiste o emprego! Estou t\u00e3o orgulhosa de ti!\"\n491 A \u00fanica maneira de sair desta confus\u00e3o \u00e9 deixar de ouvir estas mentiras.\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: \"B3e5v3zQlpI\" },\n  es: { type: \"youtube\", id: \"XSV1Xc9Ddas\"},  \n  fr: { type: \"youtube\", id: \"ZdC1xyaO5bw\" }, \n  ja: { type: \"youtube\", id: \"cOwPSDHO1GY\"},\n  pt: { type: \"youtube\", id: \"pfLSZI7xQK8\"},   \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\">As tradu\u00e7\u00f5es e a transcri\u00e7\u00e3o simplificada baseiam-se em tradu\u00e7\u00f5es do material original, localizadas em v\u00e1rias l\u00ednguas. Criado por PeakCreatorRoyalty.com sob licen\u00e7a com <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 pa-display-conditions-yes e-flex e-con-boxed e-con e-parent\" data-id=\"e4bc449\" data-element_type=\"container\" data-settings=\"{&quot;pa_display_conditions_switcher&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7e49f44 elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-template\" data-id=\"7e49f44\" 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=\"3491\" class=\"elementor elementor-3491\" data-elementor-post-type=\"elementor_library\">\n\t\t\t<div class=\"elementor-element elementor-element-f38bb46 e-flex e-con-boxed e-con e-parent\" data-id=\"f38bb46\" 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-8baae73 elementor-widget elementor-widget-shortcode\" data-id=\"8baae73\" 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-77ae7ae elementor-widget elementor-widget-heading\" data-id=\"77ae7ae\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Obras-primas interactivas<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-efd0efb elementor-widget elementor-widget-html\" data-id=\"efd0efb\" 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<!-- 3.1 CSS and 1st Image HTML -->\n<!-- ImageID_1 CSS -->\n\n<style class=\"wpcode-css-snippet\"><style>\r\n\r\n.hotspot-block,\r\n.hotspot,\r\n.hotspot-tooltip,\r\n.hotspot-btn {\r\n  font-family: \"HM Saira-VariableFont_wdth,wght\", sans-serif;\r\n}\r\n\r\n.hotspot-block {\r\n  position: relative;\r\n  margin: 40px auto;\r\n  max-width: 1280px;\r\n}\r\n\r\n.hotspot-controls {\r\n  margin-bottom: 15px;\r\n  display: flex;\r\n  justify-content: center;\r\n  flex-wrap: wrap;\r\n  gap: 15px;\r\n  align-items: center;\r\n  position: relative;\r\n  z-index: 10;\r\n}\r\n\r\n.hotspot-container {\r\n  position: absolute;\r\n  top: 0;\r\n  left: 0;\r\n  width: 100%;\r\n  height: 100%;\r\n  pointer-events: none;\r\n  z-index: 2000;\r\n}\r\n\r\n.main-image {\r\n  width: 100%;\r\n  display: block;\r\n}\r\n\r\n.hotspot {\r\n  overflow: visible;\r\n  width: 36px;\r\n  height: 36px;\r\n  background: #007BFF;\r\n  color: white;\r\n  font-size: 16px;\r\n  border-radius: 50%;\r\n  text-align: center;\r\n  line-height: 36px;\r\n  font-weight: bold;\r\n  cursor: pointer;\r\n  transition: transform 0.4s, background 0.3s;\r\n  position: absolute;\r\n  pointer-events: auto;\r\n}\r\n\r\n.hotspot.enlarged {\r\n  transform: scale(1.18);\r\n  background: red;\r\n}\r\n\r\n.hotspot:hover {\r\n  transform: scale(1.18);\r\n}\r\n\r\n\/* ----------- TOOLTIP: Modern Approach ----------- *\/\r\n.hotspot-tooltip {\r\n  display: none;\r\n  position: absolute;\r\n  left: 50%;\r\n  top: auto; \/* default, will be set by direction *\/\r\n  bottom: auto;\r\n  max-width: 300px;\r\n  min-width: 0;\r\n  width: max-content; \/* will grow up to max-width, shrink for short items *\/\r\n  white-space: normal;\r\n  word-break: break-word;\r\n  padding: 10px 16px;\r\n  background: rgba(20, 20, 30, 0.92);\r\n  color: #fff;\r\n  font-size: 15px;\r\n  border-radius: 10px;\r\n  box-shadow: 0 6px 16px rgba(0,0,0,0.13);\r\n  z-index: 5000;\r\n  line-height: 1.5;\r\n  text-align: left;\r\n  border: 2px solid red;\r\n  box-sizing: border-box;\r\n  transform: translateX(-50%);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\/* Tooltip direction and placement *\/\r\n.tooltip-above .hotspot-tooltip {\r\n  left: 50%;\r\n  bottom: 110%;\r\n  transform: translateX(-50%);\r\n  margin-bottom: 10px;\r\n}\r\n.tooltip-below .hotspot-tooltip {\r\n  left: 50%;\r\n  top: 110%;\r\n  transform: translateX(-50%);\r\n  margin-top: 10px;\r\n}\r\n.tooltip-left .hotspot-tooltip {\r\n  right: 110%;          \/* Puts tooltip fully to the left of the hotspot, with a gap *\/\r\n  top: 50%;\r\n  left: auto;           \/* Prevent any left property conflict *\/\r\n  transform: translateY(-50%);\r\n  margin-right: 10px;   \/* Space between tooltip and hotspot *\/\r\n  margin-left: 0;\r\n}\r\n\r\n.tooltip-right .hotspot-tooltip {\r\n  left: 110%;\r\n  top: 50%;\r\n  transform: translateY(-50%);\r\n  margin-left: 10px;\r\n}\r\n\r\n\/* Tooltip shown on enlarged\/active hotspot *\/\r\n.hotspot.enlarged .hotspot-tooltip,\r\n.hotspot.active .hotspot-tooltip,\r\n.hotspot.show-all .hotspot-tooltip {\r\n  display: block;\r\n}\r\n\r\n\/* ----------- Button styling ----------- *\/\r\n.hotspot-btn {\r\n  width: 36px;\r\n  height: 36px;\r\n  border-radius: 50%;\r\n  font-size: 16px;\r\n  background: #007BFF;\r\n  color: white;\r\n  font-weight: bold;\r\n  border: none;\r\n  cursor: pointer;\r\n  transition: background 0.2s, transform 0.2s;\r\n  position: relative;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  line-height: 1;\r\n  padding: 0;\r\n}\r\n\r\n.hotspot-btn.highlight {\r\n  background: red;\r\n}\r\n\r\n.hotspot-btn.enlarged {\r\n  transform: scale(1.18);\r\n}\r\n\r\n.hotspot-btn:hover {\r\n  background: #0056b3;\r\n}\r\n\r\n\/* Mobile responsive adjustments *\/\r\n@media (max-width: 600px) {\r\n  .hotspot {\r\n    width: 22px;\r\n    height: 22px;\r\n    font-size: 12px;\r\n    line-height: 22px;\r\n  }\r\n\r\n  .hotspot-btn {\r\n    width: 28px;\r\n    height: 28px;\r\n    font-size: 13px;\r\n  }\r\n\r\n    .hotspot-tooltip {\r\n    padding: 6px 8px;\r\n    font-size: 0.9em;\r\n  font-weight: normal;\r\n    max-width: 250px;\r\n    min-width: 120px;\r\n    width: auto;\r\n  }\r\n}\r\n<\/style><\/style>\n\n<!-- 1st image, keep this\n     ImageID_2 HTML -->\n\n<!-- Image Block 1 -->\n\n<div class=\"hotspot-block\" data-id=\"image1\" style=\"max-width:1280px; margin:40px auto; position:relative;\">\n\n  <!-- Buttons and Checkbox ABOVE the Image -->\n  <div class=\"hotspot-controls\" data-id=\"image1\" style=\"margin-bottom:15px; display:flex; justify-content:center; flex-wrap:wrap; gap:15px; align-items:center; position:relative; z-index:10;\">\n    <div class=\"hotspot-buttons\" style=\"display:flex; gap:10px; flex-wrap:wrap;\"><\/div>\n    <label style=\"font-family:sans-serif; font-size:14px;\">\n      <input type=\"checkbox\" class=\"show-all-toggle\" data-id=\"image1\" style=\"margin-right:5px;\">\n      Todos\n    <\/label>\n    <label style=\"font-family: sans-serif; font-size: 14px;\">\n       <input type=\"checkbox\" class=\"hide-numbers-toggle\" data-id=\"image1\" style=\"margin-left: 12px; margin-right: 5px;\">\n       Esconder\n    <\/label>\n  <\/div>\n\n  <!-- Image and Hotspot container -->\n  <div style=\"position: relative;\">\n    <img decoding=\"async\" class=\"main-image\" data-id=\"image1\" src=\"\" style=\"width:100%; display:block;\">\n    \n    <!-- Hotspot container positioned absolutely over the image -->\n    <div class=\"hotspot-container\" style=\"position:absolute; top:0; left:0; width:100%; height:100%; pointer-events:none; z-index:2000;\">\n      <!-- Hotspots injected by JS here -->\n    <\/div>\n  <\/div>\n\n<\/div>\n\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6671c31 elementor-widget elementor-widget-html\" data-id=\"6671c31\" 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\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\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>M\u00e3os de p\u00e1ssaro = poder social? Neste v\u00eddeo, hoe_math tra\u00e7a com humor a ascens\u00e3o do gesto \"m\u00e3os de p\u00e1ssaro\" - em que as mulheres no TikTok usam movimentos de m\u00e3o pontiagudos e bicados - para tend\u00eancias mais amplas na influ\u00eancia social, comportamento de grupo e linguagem corporal. Ele explica o significado psicol\u00f3gico por detr\u00e1s destes gestos, a forma como reflectem lutas mais profundas pelo poder, aceita\u00e7\u00e3o e estatuto, [...]<\/p>","protected":false},"author":6,"featured_media":3575,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[131,106,100,130,108],"tags":[127,126,129,128],"class_list":["post-3573","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-body-language","category-gender-roles","category-free-newsletter-insider-exclusives","category-recent","category-social-commentary","tag-es","tag-fr","tag-ja","tag-pt"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/itishoemath.com\/pt_pt\/wp-json\/wp\/v2\/posts\/3573","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itishoemath.com\/pt_pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itishoemath.com\/pt_pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itishoemath.com\/pt_pt\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/itishoemath.com\/pt_pt\/wp-json\/wp\/v2\/comments?post=3573"}],"version-history":[{"count":61,"href":"https:\/\/itishoemath.com\/pt_pt\/wp-json\/wp\/v2\/posts\/3573\/revisions"}],"predecessor-version":[{"id":5765,"href":"https:\/\/itishoemath.com\/pt_pt\/wp-json\/wp\/v2\/posts\/3573\/revisions\/5765"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itishoemath.com\/pt_pt\/wp-json\/wp\/v2\/media\/3575"}],"wp:attachment":[{"href":"https:\/\/itishoemath.com\/pt_pt\/wp-json\/wp\/v2\/media?parent=3573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itishoemath.com\/pt_pt\/wp-json\/wp\/v2\/categories?post=3573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itishoemath.com\/pt_pt\/wp-json\/wp\/v2\/tags?post=3573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}