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

Esse conteúdo é antigo

PM diz que imagens sugerem abuso em operação e afirma ter sido atacada

favela de Paraisópolis, em São Paulo - Lalo de Almeida
favela de Paraisópolis, em São Paulo Imagem: Lalo de Almeida

Do UOL, em São Paulo

01/12/2019 14h42

O tenente-coronel Emerson Massera, porta-voz da Polícia Militar de São Paulo, concedeu entrevista coletiva para explicar a ação da PM na Paraisópolis, em São Paulo, que terminou com nove pessoas mortas após serem pisoteadas.

Segundo Massera, a ação dos policiais teve início após flagrarem dois homens em uma moto em atitude suspeita. Então, os suspeitos fugiram dos PMs, que iniciaram uma perseguição. Ao chegarem em um baile, os homens teriam entrado no meio da multidão, que, segundo o porta-voz, atacou os policiais.

"A fuga foi breve. (Os suspeitos) Entraram na comunidade atirando contra os policiais. A moto ainda não foi apreendida, nem os indivíduos foram presos. Todos os policiais relataram a mesma coisa. Estamos apurando se existem câmeras na região para esclarecer melhor. A tentativa de abordagem realmente se deu, isso temos comprovado pela comunicação de rádio", explicou o porta-voz da PM, que continuou:

"Criminosos usaram pessoas que frequentavam o baile como escudos humanos. Pessoas foram em direção aos PMs arremessando pedras e garrafas. A atuação dos PMs foi de proteção aos policiais."

O porta-voz da PM também disse ser "difícil analisar" neste primeiro momento "se o procedimento foi correto" e que a atuação da PM "deve ser preventiva" em casos como esse. Massera ainda afirmou que, com base nos primeiros relatos, a utilização das balas de borracha foi "razoável" e que "possivelmente foi aplicada de forma correta", mas que tudo será investigado. Em uma entrevista à Globonews, ele relatou que a catástrofe seria maior "se fosse dispersar toda aquela multidão".

"Nós recebemos as imagens, todas as imagens estão incluídas no inquérito policial militar para ser analisadas. Não temos certeza que tudo tenha acontecido nesta madrugada. Algumas imagens nos sugerem abuso, ação desproporcional. Evidentemente, o rigor vai responsabilizar quem cometeu algum excesso, algum abuso. O relato que temos é que os policiais, para conseguirem recuar, fizeram uso de munições químicas (duas de efeito moral, mais duas de gás lacrimogênio), mais oito disparos de balas de borracha", explicou Massera.