;(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

Após polêmica com Uber, Russomanno encontra motoristas de app na 1ª agenda

Russomanno (à esquerda) conversa com a imprensa após encontro no sindicato dos motoristas de aplicativo - Wanderley Preite Sobrinho/UOL
Russomanno (à esquerda) conversa com a imprensa após encontro no sindicato dos motoristas de aplicativo Imagem: Wanderley Preite Sobrinho/UOL

Wanderley Preite Sobrinho

Do UOL, em São Paulo

29/09/2020 12h33

Em sua primeira agenda de campanha, o candidato a prefeito de São Paulo Celso Russomanno (Republicanos) decidiu fazer as pazes com os motoristas de aplicativo após polêmica na campanha municipal de 2016, quando criticou o uso de Uber.

Nesta terça-feira (29), ele foi ao Sindicato dos Motoristas de Aplicativos, em São Miguel Paulista, zona leste da cidade. No encontro, Russomanno recebeu uma lista de reivindicações que buscam equiparar os direitos desses trabalhadores ao de taxistas, como a possibilidade de usar o mesmo veículo por dez anos.

"Nunca fui contrário aos aplicativos", afirmou o candidato após o encontro. "Na época, [os apps] estavam chegando e não sabíamos o resultado."

Declaração polêmica

Em 2016, o candidato a prefeito buscava o voto dos taxistas, que estavam mobilizados contra o decreto do então prefeito Fernando Haddad (PT) que autorizava o uso do app na cidade.

"A questão do Uber está na ilegalidade", afirmou, à época. "O Código de Trânsito estabelece que, para transporte coletivo, individual ou de carga, os veículos têm que transitar com placas vermelhas."

Hoje, ele defendeu que, desde a campanha de 2016, "o modal por aplicativo é um sucesso".

Presidente do sindicato, Leandro da Cruz minimizou as declarações de Russumanno feitas há quatro anos. "A gente não é contra uma declaração de 2016", afirmou ele, que disse preferir se concentrar em fechar acordo com todos os candidatos a prefeito "porque não houve mesa de negociação com atual prefeito".

Debates

Russomanno, que não fez pré-campanha nem saiu de casa no domingo (27), primeiro dia oficial de campanha, seguirá com poucos compromissos externos nos próximos dias.

Depois de participar de reuniões na segunda-feira (28) e só buscar votos hoje, ele deverá ar a quarta e quinta-feira se preparando para o primeiro debate entre os candidatos, marcado para a noite de quinta (1º), na TV Bandeirantes.

O candidato do Republicanos lidera a primeira pesquisa de intenções de voto do Datafolha e já se prepara para os ataques de adversários. Sua postura no debate, contudo, será definida pelo marqueteiro, ainda a ser escolhido. Pelo menos três são avaliados pela coordenação da campanha, que pretende bater o martelo antes do debate.

Ontem, o partido de Russomanno divulgou nota dizendo que não pretende comparecer a debates em que faltem candidatos. O texto foi interpretado como um recado à Rede Globo, que decidiu recentemente que só reunirá os primeiros colocados nas pesquisas a fim de evitar aglomerações nos estúdios em meio à pandemia do novo coronavírus.

Mais carreatas, menos corpo a corpo

Embora tenha tido uma reunião com os motoristas de aplicativo, Russomanno pediu a seus colaboradores que evitem agendas de corpo a corpo, envolvendo mais gente. Ele considera que alguns encontros serão inevitáveis, mas a ordem é privilegiar as carreatas.

O candidato espera que a opção estabeleça contato visual com o eleitor e, ao mesmo tempo, evite a disseminação do vírus pelo contato físico.