;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Funeral e flashbacks: como foi o episódio final de 'This is Us'

Kevin, Kate e Randall, os "Big 3", no final de "This is Us" - Reprodução/Twitter
Kevin, Kate e Randall, os 'Big 3', no final de 'This is Us' Imagem: Reprodução/Twitter

De Splash, em São Paulo

26/05/2022 13h06

Acabou! Depois de fazer muita gente chorar, "This is Us" chegou ao seu final definitivo com o 18º episódio da sexta temporada. No Brasil, a última temporada está disponível no Star+.

Chamado apenas de "Us" ("Nós"), o episódio final foca nos irmãos Kate (Chrissy Metz), Kevin (Justin Hartley) e Randall (Sterling K. Brown) e seus aprendizados no presente. Para isso, há muitos flashbacks, inclusive conteúdo inédito gravado anos atrás, na quarta temporada, para garantir que os atores mirins que representam o trio ainda estivessem com a mesma aparência.

Atenção: a partir daqui o texto traz spoilers sobre o final da temporada. Não prossiga se não quiser saber o que acontece.

O final da série, na verdade, começou no penúltimo episódio, quando o trio perde a mãe, Rebecca (Mandy Moore). "Us" mostra os irmãos juntos no funeral, enquanto refletem sobre família, a relação atual entre eles e também as conquistas de agora com suas próprias famílias.

Um dos pontos altos do episódio é o momento em que Deja (Lyric Ross) conta para Randall que ele será avô... de um menino! Mesmo que abalado pela morte da mãe, o vereador consegue explodir de alegria ao receber a notícia, já que é pai de três filhas e viveu cercado por mulheres em casa durante muitos anos.

Com a notícia, outro personagem que volta à tona é William (Ron Cephas Jones), o pai biológico de Randall que morreu de câncer anos antes. Ele reflete sobre como será como avô com base no que viu da curta convivência de seu pai com duas de suas filhas. Nas cenas de flashback, William reflete sobre sua condição:

"É uma coisa louca. Você ama os netos incondicionalmente mesmo sabendo que o tempo provavelmente não deixará você fazer parte da história deles."

Diferentemente das outras temporadas marcadas por grandes viradas ou momentos dramáticos, como o incêndio que matou Jack (Milo Ventimiglia), e episódio final foca em momentos sutis da convivência familiar que são o verdadeiro coração da série.