Detecting, understanding, and resolving build and test conflicts

Detalhes bibliográficos
Ano de defesa: 2022
Autor(a) principal: SILVA, Léuson Mário Pedro da
Orientador(a): BORBA, Paulo Henrique Monteiro
Banca de defesa: Não Informado pela instituição
Tipo de documento: Tese
Tipo de acesso: Acesso aberto
Idioma: eng
Instituição de defesa: Universidade Federal de Pernambuco
Programa de Pós-Graduação: Programa de Pos Graduacao em Ciencia da Computacao
Departamento: Não Informado pela instituição
País: Brasil
Palavras-chave em Português:
Link de acesso: https://repositorio.ufpe.br/handle/123456789/44894
Resumo: During collaborative software development, developers usually adopt branching and merging practices when making their contributions, allowing them to contribute to a software project independently. Despite such benefits, branching and merging come at a cost — the need to merge software and to resolve merge conflicts, which often occur in practice. While modern merge techniques, such as 3-way or structured merge, can automatically resolve many such conflicts, they fail when conflicts arise at the semantic level, known as semantic conflicts. These conflicts are revealed by failures when building and testing integrated code, build and test conflicts, respectively. Detecting such semantic conflicts requires understanding the software’s behavior, which is beyond the capabilities of most existing merge and assistive tools. To address the need for better assistive tools, we investigate semantic conflict occurrence by finding their causes and proposing tools that could support developers when facing these conflicts during merge scenario integrations. Initially, we perform a study investigating the frequency, structure, and adopted resolution patterns of build conflicts by empirically analyzing 451 open-source Java projects. As a result, we provide a catalogue of conflicts with 239 occurrences spread into six categories. Most build conflicts are caused by missing declarations removed or renamed by one developer but referenced by someone else. Further, analyzing some of these conflicts, we also report a catalogue of resolution patterns. In order to evaluate the occurrence of test conflicts, we adopt a different approach as these conflicts involve the semantics of a program. Consequently, they can not be detected during the compilation phase of the build process. This way, initially, we perform a second study investigating their occurrence by exploring the automated creation of unit tests as partial specifications to detect conflicts. Relying on a ground-truth dataset of more than 80 mutually integrated changes’ pairs on class elements from 51 software merge scenarios, we manually analyzed them and investigated whether test conflicts exist. Next, we systematically explore the detection of conflicts through four unit-test generation tools, as also the adoption of Testability Transformations aiming to increase the testability of the code under analysis. As a result, we provide a catalogue of 28 test conflicts, of which 9 of them were detected by our approach. Our results show that the best approach to detect conflicts involves combining the tools Differential EvoSuite and EvoSuite applied with Testability Transformations. As a final contribution, we present SAM, a semantic merge tool based on unit test generation, which warns developers about prominent conflicts on ongoing merge scenario integration. Overall, our results bridge a gap in the literature regarding the occurrence of code integration semantic conflicts during software development. Based on each conflict type, we investigate their causes and options to deal with them. While build conflicts could be automatically detected and fixed by an automatic repair tool, test conflicts might be detected by a semantic merge tool based on unit test generation.
id UFPE_88dccc19799e41dc5600e5de251dd518
oai_identifier_str oai:repositorio.ufpe.br:123456789/44894
network_acronym_str UFPE
network_name_str Repositório Institucional da UFPE
repository_id_str
spelling SILVA, Léuson Mário Pedro dahttp://lattes.cnpq.br/8681457281512244http://lattes.cnpq.br/9395715443254344BORBA, Paulo Henrique MonteiroBERGER, Thorsten2022-06-28T16:05:57Z2022-06-28T16:05:57Z2022-02-24SILVA, Léuson Mário Pedro da. Detecting, understanding, and resolving build and test conflicts. 2022. Tese (Doutorado em Ciência da Computação) - Universidade Federal de Pernambuco, Recife, 2022.-https://repositorio.ufpe.br/handle/123456789/44894During collaborative software development, developers usually adopt branching and merging practices when making their contributions, allowing them to contribute to a software project independently. Despite such benefits, branching and merging come at a cost — the need to merge software and to resolve merge conflicts, which often occur in practice. While modern merge techniques, such as 3-way or structured merge, can automatically resolve many such conflicts, they fail when conflicts arise at the semantic level, known as semantic conflicts. These conflicts are revealed by failures when building and testing integrated code, build and test conflicts, respectively. Detecting such semantic conflicts requires understanding the software’s behavior, which is beyond the capabilities of most existing merge and assistive tools. To address the need for better assistive tools, we investigate semantic conflict occurrence by finding their causes and proposing tools that could support developers when facing these conflicts during merge scenario integrations. Initially, we perform a study investigating the frequency, structure, and adopted resolution patterns of build conflicts by empirically analyzing 451 open-source Java projects. As a result, we provide a catalogue of conflicts with 239 occurrences spread into six categories. Most build conflicts are caused by missing declarations removed or renamed by one developer but referenced by someone else. Further, analyzing some of these conflicts, we also report a catalogue of resolution patterns. In order to evaluate the occurrence of test conflicts, we adopt a different approach as these conflicts involve the semantics of a program. Consequently, they can not be detected during the compilation phase of the build process. This way, initially, we perform a second study investigating their occurrence by exploring the automated creation of unit tests as partial specifications to detect conflicts. Relying on a ground-truth dataset of more than 80 mutually integrated changes’ pairs on class elements from 51 software merge scenarios, we manually analyzed them and investigated whether test conflicts exist. Next, we systematically explore the detection of conflicts through four unit-test generation tools, as also the adoption of Testability Transformations aiming to increase the testability of the code under analysis. As a result, we provide a catalogue of 28 test conflicts, of which 9 of them were detected by our approach. Our results show that the best approach to detect conflicts involves combining the tools Differential EvoSuite and EvoSuite applied with Testability Transformations. As a final contribution, we present SAM, a semantic merge tool based on unit test generation, which warns developers about prominent conflicts on ongoing merge scenario integration. Overall, our results bridge a gap in the literature regarding the occurrence of code integration semantic conflicts during software development. Based on each conflict type, we investigate their causes and options to deal with them. While build conflicts could be automatically detected and fixed by an automatic repair tool, test conflicts might be detected by a semantic merge tool based on unit test generation.FACEPEDurante o desenvolvimento colaborativo de software, desenvolvedores adotam práticas de criação e integração de ramos de desenvolvimento quando trabalham em suas contribuições, permitindo que eles contribuam para um projeto de software independentemente. Apesar destes benefícios, estas práticas vem com um custo, a necessidade de integrar software e resolver conflitos de merge. Enquanto técnicas modernas de merge podem resolver automaticamente muitos destes conflitos, elas falham quando o conflito surge no nível semântico conhecidos como conflitos semânticos. Estes conflitos são revelados por falhas durante o processo de build e execução de testes do código integrado conhecidos como conflitos de build e teste, respectivamente. Detectar estes conflitos semânticos requer um entendimento do comportamento do software, o que está além da capacidade da maioria das ferramentas assistentes e de integração de código. Dada a necessidade de melhores ferramentas assistentes, nós investigamos a ocorrência de conflitos semânticos identificando suas causas e propondo ferramentas que possam apoiar os desenvolvedores. Inicialmente, nós realizamos um estudo identificando a frequência, estrutura e padrões de resolução adotados em conflitos de build analisando empiricamente 451 projetos Java open-source. Como resultado, nós provemos um catálogo de conflitos com 239 ocorrências divididos em seis categorias. A maioria dos conflitos de build são causados por declarações não-resolvidas, removidas ou renomeadas por um desenvolvedor mas referenciadas por outra pessoa. Além disso, analisando alguns destes conflitos, nós também reportamos um catálogo de padrões de resolução. Para avaliar a ocorrência de conflitos de teste, nós adotamos uma abordagem diferente, pois estes conflitos envolvem a semântica de um programa. Consequentemente, eles não podem ser detectados durante a fase de compilação do processo de build. Desta forma, nós realizamos um segundo estudo investigando sua ocorrência, explorando a criação automática de testes unitários como especificações parciais para detectar conflitos. Baseando-se em um conjunto de mais de 80 mudanças mútuas em elementos de classes de 51 cenários de merge com ground-truth, nós analisamos e investigamos se conflitos de teste existiam. Em seguida, nós exploramos sistematicamente a detecção de conflitos por meio de ferramentas de geração de testes, como também a adoção de Transformações de Testabilidade visando aumentar a testabilidade do código em análise. Como resultado, nós apresentamos um catálogo de 28 conflitos de testes, dos quais 9 foram detectados por nossa abordagem. Nossos resultados mostram que a melhor abordagem para detectar conflitos envolve a combinação das ferramentas Differential EvoSuite e EvoSuite aplicadas com Transformações de Testabilidade. Como contribuição final, nós apresentamos SAM, uma ferramenta de merge semântica baseada na geração de testes unitários, que avisa desenvolvedores sobre conflitos em cenários de merge em andamento. No geral, nossos resultados se atentam a uma lacuna na literatura sobre a ocorrência de conflitos de integração de código semânticos durante o desenvolvimento de software. Baseado no tipo de conflito, nós investigamos suas causas e opções para lidar com eles. Enquanto conflitos de build podem ser detectados e solucionados por uma ferramenta de reparo automático, conflitos de teste poderiam ser detectados por uma ferramenta de merge semântica baseada na geração de testes unitários.engUniversidade Federal de PernambucoPrograma de Pos Graduacao em Ciencia da ComputacaoUFPEBrasilAttribution-NonCommercial-NoDerivs 3.0 Brazilhttp://creativecommons.org/licenses/by-nc-nd/3.0/br/info:eu-repo/semantics/openAccessEngenharia de softwareIntegração de códigoDetecting, understanding, and resolving build and test conflictsinfo:eu-repo/semantics/publishedVersioninfo:eu-repo/semantics/doctoralThesisdoutoradoreponame:Repositório Institucional da UFPEinstname:Universidade Federal de Pernambuco (UFPE)instacron:UFPEORIGINALTESE Léuson Mário Pedro da Silva.pdfTESE Léuson Mário Pedro da Silva.pdfapplication/pdf2912506https://repositorio.ufpe.br/bitstream/123456789/44894/1/TESE%20L%c3%a9uson%20M%c3%a1rio%20Pedro%20da%20Silva.pdf391a1cd8dadb2948f133aaf1c8bf86a7MD51TEXTTESE Léuson Mário Pedro da Silva.pdf.txtTESE Léuson Mário Pedro da Silva.pdf.txtExtracted texttext/plain400587https://repositorio.ufpe.br/bitstream/123456789/44894/4/TESE%20L%c3%a9uson%20M%c3%a1rio%20Pedro%20da%20Silva.pdf.txtd0defdf3ccc5904de1028cf67ab85a2fMD54THUMBNAILTESE Léuson Mário Pedro da Silva.pdf.jpgTESE Léuson Mário Pedro da Silva.pdf.jpgGenerated Thumbnailimage/jpeg1230https://repositorio.ufpe.br/bitstream/123456789/44894/5/TESE%20L%c3%a9uson%20M%c3%a1rio%20Pedro%20da%20Silva.pdf.jpg32265c3f4bb11bf11319c2adc3c802b3MD55CC-LICENSElicense_rdflicense_rdfapplication/rdf+xml; charset=utf-8811https://repositorio.ufpe.br/bitstream/123456789/44894/2/license_rdfe39d27027a6cc9cb039ad269a5db8e34MD52LICENSElicense.txtlicense.txttext/plain; charset=utf-82142https://repositorio.ufpe.br/bitstream/123456789/44894/3/license.txt6928b9260b07fb2755249a5ca9903395MD53123456789/448942022-06-29 02:16:43.039oai:repositorio.ufpe.br:123456789/44894VGVybW8gZGUgRGVww7NzaXRvIExlZ2FsIGUgQXV0b3JpemHDp8OjbyBwYXJhIFB1YmxpY2HDp8OjbyBkZSBEb2N1bWVudG9zIG5vIFJlcG9zaXTDs3JpbyBEaWdpdGFsIGRhIFVGUEUKIAoKRGVjbGFybyBlc3RhciBjaWVudGUgZGUgcXVlIGVzdGUgVGVybW8gZGUgRGVww7NzaXRvIExlZ2FsIGUgQXV0b3JpemHDp8OjbyB0ZW0gbyBvYmpldGl2byBkZSBkaXZ1bGdhw6fDo28gZG9zIGRvY3VtZW50b3MgZGVwb3NpdGFkb3Mgbm8gUmVwb3NpdMOzcmlvIERpZ2l0YWwgZGEgVUZQRSBlIGRlY2xhcm8gcXVlOgoKSSAtICBvIGNvbnRlw7pkbyBkaXNwb25pYmlsaXphZG8gw6kgZGUgcmVzcG9uc2FiaWxpZGFkZSBkZSBzdWEgYXV0b3JpYTsKCklJIC0gbyBjb250ZcO6ZG8gw6kgb3JpZ2luYWwsIGUgc2UgbyB0cmFiYWxobyBlL291IHBhbGF2cmFzIGRlIG91dHJhcyBwZXNzb2FzIGZvcmFtIHV0aWxpemFkb3MsIGVzdGFzIGZvcmFtIGRldmlkYW1lbnRlIHJlY29uaGVjaWRhczsKCklJSSAtIHF1YW5kbyB0cmF0YXItc2UgZGUgVHJhYmFsaG8gZGUgQ29uY2x1c8OjbyBkZSBDdXJzbywgRGlzc2VydGHDp8OjbyBvdSBUZXNlOiBvIGFycXVpdm8gZGVwb3NpdGFkbyBjb3JyZXNwb25kZSDDoCB2ZXJzw6NvIGZpbmFsIGRvIHRyYWJhbGhvOwoKSVYgLSBxdWFuZG8gdHJhdGFyLXNlIGRlIFRyYWJhbGhvIGRlIENvbmNsdXPDo28gZGUgQ3Vyc28sIERpc3NlcnRhw6fDo28gb3UgVGVzZTogZXN0b3UgY2llbnRlIGRlIHF1ZSBhIGFsdGVyYcOnw6NvIGRhIG1vZGFsaWRhZGUgZGUgYWNlc3NvIGFvIGRvY3VtZW50byBhcMOzcyBvIGRlcMOzc2l0byBlIGFudGVzIGRlIGZpbmRhciBvIHBlcsOtb2RvIGRlIGVtYmFyZ28sIHF1YW5kbyBmb3IgZXNjb2xoaWRvIGFjZXNzbyByZXN0cml0bywgc2Vyw6EgcGVybWl0aWRhIG1lZGlhbnRlIHNvbGljaXRhw6fDo28gZG8gKGEpIGF1dG9yIChhKSBhbyBTaXN0ZW1hIEludGVncmFkbyBkZSBCaWJsaW90ZWNhcyBkYSBVRlBFIChTSUIvVUZQRSkuCgogClBhcmEgdHJhYmFsaG9zIGVtIEFjZXNzbyBBYmVydG86CgpOYSBxdWFsaWRhZGUgZGUgdGl0dWxhciBkb3MgZGlyZWl0b3MgYXV0b3JhaXMgZGUgYXV0b3IgcXVlIHJlY2FlbSBzb2JyZSBlc3RlIGRvY3VtZW50bywgZnVuZGFtZW50YWRvIG5hIExlaSBkZSBEaXJlaXRvIEF1dG9yYWwgbm8gOS42MTAsIGRlIDE5IGRlIGZldmVyZWlybyBkZSAxOTk4LCBhcnQuIDI5LCBpbmNpc28gSUlJLCBhdXRvcml6byBhIFVuaXZlcnNpZGFkZSBGZWRlcmFsIGRlIFBlcm5hbWJ1Y28gYSBkaXNwb25pYmlsaXphciBncmF0dWl0YW1lbnRlLCBzZW0gcmVzc2FyY2ltZW50byBkb3MgZGlyZWl0b3MgYXV0b3JhaXMsIHBhcmEgZmlucyBkZSBsZWl0dXJhLCBpbXByZXNzw6NvIGUvb3UgZG93bmxvYWQgKGFxdWlzacOnw6NvKSBhdHJhdsOpcyBkbyBzaXRlIGRvIFJlcG9zaXTDs3JpbyBEaWdpdGFsIGRhIFVGUEUgbm8gZW5kZXJlw6dvIGh0dHA6Ly93d3cucmVwb3NpdG9yaW8udWZwZS5iciwgYSBwYXJ0aXIgZGEgZGF0YSBkZSBkZXDDs3NpdG8uCgogClBhcmEgdHJhYmFsaG9zIGVtIEFjZXNzbyBSZXN0cml0bzoKCk5hIHF1YWxpZGFkZSBkZSB0aXR1bGFyIGRvcyBkaXJlaXRvcyBhdXRvcmFpcyBkZSBhdXRvciBxdWUgcmVjYWVtIHNvYnJlIGVzdGUgZG9jdW1lbnRvLCBmdW5kYW1lbnRhZG8gbmEgTGVpIGRlIERpcmVpdG8gQXV0b3JhbCBubyA5LjYxMCBkZSAxOSBkZSBmZXZlcmVpcm8gZGUgMTk5OCwgYXJ0LiAyOSwgaW5jaXNvIElJSSwgYXV0b3Jpem8gYSBVbml2ZXJzaWRhZGUgRmVkZXJhbCBkZSBQZXJuYW1idWNvIGEgZGlzcG9uaWJpbGl6YXIgZ3JhdHVpdGFtZW50ZSwgc2VtIHJlc3NhcmNpbWVudG8gZG9zIGRpcmVpdG9zIGF1dG9yYWlzLCBwYXJhIGZpbnMgZGUgbGVpdHVyYSwgaW1wcmVzc8OjbyBlL291IGRvd25sb2FkIChhcXVpc2nDp8OjbykgYXRyYXbDqXMgZG8gc2l0ZSBkbyBSZXBvc2l0w7NyaW8gRGlnaXRhbCBkYSBVRlBFIG5vIGVuZGVyZcOnbyBodHRwOi8vd3d3LnJlcG9zaXRvcmlvLnVmcGUuYnIsIHF1YW5kbyBmaW5kYXIgbyBwZXLDrW9kbyBkZSBlbWJhcmdvIGNvbmRpemVudGUgYW8gdGlwbyBkZSBkb2N1bWVudG8sIGNvbmZvcm1lIGluZGljYWRvIG5vIGNhbXBvIERhdGEgZGUgRW1iYXJnby4KRepositório InstitucionalPUBhttps://repositorio.ufpe.br/oai/requestattena@ufpe.bropendoar:22212022-06-29T05:16:43Repositório Institucional da UFPE - Universidade Federal de Pernambuco (UFPE)false
dc.title.pt_BR.fl_str_mv Detecting, understanding, and resolving build and test conflicts
title Detecting, understanding, and resolving build and test conflicts
spellingShingle Detecting, understanding, and resolving build and test conflicts
SILVA, Léuson Mário Pedro da
Engenharia de software
Integração de código
title_short Detecting, understanding, and resolving build and test conflicts
title_full Detecting, understanding, and resolving build and test conflicts
title_fullStr Detecting, understanding, and resolving build and test conflicts
title_full_unstemmed Detecting, understanding, and resolving build and test conflicts
title_sort Detecting, understanding, and resolving build and test conflicts
author SILVA, Léuson Mário Pedro da
author_facet SILVA, Léuson Mário Pedro da
author_role author
dc.contributor.authorLattes.pt_BR.fl_str_mv http://lattes.cnpq.br/8681457281512244
dc.contributor.advisorLattes.pt_BR.fl_str_mv http://lattes.cnpq.br/9395715443254344
dc.contributor.author.fl_str_mv SILVA, Léuson Mário Pedro da
dc.contributor.advisor1.fl_str_mv BORBA, Paulo Henrique Monteiro
dc.contributor.advisor-co1.fl_str_mv BERGER, Thorsten
contributor_str_mv BORBA, Paulo Henrique Monteiro
BERGER, Thorsten
dc.subject.por.fl_str_mv Engenharia de software
Integração de código
topic Engenharia de software
Integração de código
description During collaborative software development, developers usually adopt branching and merging practices when making their contributions, allowing them to contribute to a software project independently. Despite such benefits, branching and merging come at a cost — the need to merge software and to resolve merge conflicts, which often occur in practice. While modern merge techniques, such as 3-way or structured merge, can automatically resolve many such conflicts, they fail when conflicts arise at the semantic level, known as semantic conflicts. These conflicts are revealed by failures when building and testing integrated code, build and test conflicts, respectively. Detecting such semantic conflicts requires understanding the software’s behavior, which is beyond the capabilities of most existing merge and assistive tools. To address the need for better assistive tools, we investigate semantic conflict occurrence by finding their causes and proposing tools that could support developers when facing these conflicts during merge scenario integrations. Initially, we perform a study investigating the frequency, structure, and adopted resolution patterns of build conflicts by empirically analyzing 451 open-source Java projects. As a result, we provide a catalogue of conflicts with 239 occurrences spread into six categories. Most build conflicts are caused by missing declarations removed or renamed by one developer but referenced by someone else. Further, analyzing some of these conflicts, we also report a catalogue of resolution patterns. In order to evaluate the occurrence of test conflicts, we adopt a different approach as these conflicts involve the semantics of a program. Consequently, they can not be detected during the compilation phase of the build process. This way, initially, we perform a second study investigating their occurrence by exploring the automated creation of unit tests as partial specifications to detect conflicts. Relying on a ground-truth dataset of more than 80 mutually integrated changes’ pairs on class elements from 51 software merge scenarios, we manually analyzed them and investigated whether test conflicts exist. Next, we systematically explore the detection of conflicts through four unit-test generation tools, as also the adoption of Testability Transformations aiming to increase the testability of the code under analysis. As a result, we provide a catalogue of 28 test conflicts, of which 9 of them were detected by our approach. Our results show that the best approach to detect conflicts involves combining the tools Differential EvoSuite and EvoSuite applied with Testability Transformations. As a final contribution, we present SAM, a semantic merge tool based on unit test generation, which warns developers about prominent conflicts on ongoing merge scenario integration. Overall, our results bridge a gap in the literature regarding the occurrence of code integration semantic conflicts during software development. Based on each conflict type, we investigate their causes and options to deal with them. While build conflicts could be automatically detected and fixed by an automatic repair tool, test conflicts might be detected by a semantic merge tool based on unit test generation.
publishDate 2022
dc.date.accessioned.fl_str_mv 2022-06-28T16:05:57Z
dc.date.available.fl_str_mv 2022-06-28T16:05:57Z
dc.date.issued.fl_str_mv 2022-02-24
dc.type.status.fl_str_mv info:eu-repo/semantics/publishedVersion
dc.type.driver.fl_str_mv info:eu-repo/semantics/doctoralThesis
format doctoralThesis
status_str publishedVersion
dc.identifier.citation.fl_str_mv SILVA, Léuson Mário Pedro da. Detecting, understanding, and resolving build and test conflicts. 2022. Tese (Doutorado em Ciência da Computação) - Universidade Federal de Pernambuco, Recife, 2022.-
dc.identifier.uri.fl_str_mv https://repositorio.ufpe.br/handle/123456789/44894
identifier_str_mv SILVA, Léuson Mário Pedro da. Detecting, understanding, and resolving build and test conflicts. 2022. Tese (Doutorado em Ciência da Computação) - Universidade Federal de Pernambuco, Recife, 2022.-
url https://repositorio.ufpe.br/handle/123456789/44894
dc.language.iso.fl_str_mv eng
language eng
dc.rights.driver.fl_str_mv Attribution-NonCommercial-NoDerivs 3.0 Brazil
http://creativecommons.org/licenses/by-nc-nd/3.0/br/
info:eu-repo/semantics/openAccess
rights_invalid_str_mv Attribution-NonCommercial-NoDerivs 3.0 Brazil
http://creativecommons.org/licenses/by-nc-nd/3.0/br/
eu_rights_str_mv openAccess
dc.publisher.none.fl_str_mv Universidade Federal de Pernambuco
dc.publisher.program.fl_str_mv Programa de Pos Graduacao em Ciencia da Computacao
dc.publisher.initials.fl_str_mv UFPE
dc.publisher.country.fl_str_mv Brasil
publisher.none.fl_str_mv Universidade Federal de Pernambuco
dc.source.none.fl_str_mv reponame:Repositório Institucional da UFPE
instname:Universidade Federal de Pernambuco (UFPE)
instacron:UFPE
instname_str Universidade Federal de Pernambuco (UFPE)
instacron_str UFPE
institution UFPE
reponame_str Repositório Institucional da UFPE
collection Repositório Institucional da UFPE
bitstream.url.fl_str_mv https://repositorio.ufpe.br/bitstream/123456789/44894/1/TESE%20L%c3%a9uson%20M%c3%a1rio%20Pedro%20da%20Silva.pdf
https://repositorio.ufpe.br/bitstream/123456789/44894/4/TESE%20L%c3%a9uson%20M%c3%a1rio%20Pedro%20da%20Silva.pdf.txt
https://repositorio.ufpe.br/bitstream/123456789/44894/5/TESE%20L%c3%a9uson%20M%c3%a1rio%20Pedro%20da%20Silva.pdf.jpg
https://repositorio.ufpe.br/bitstream/123456789/44894/2/license_rdf
https://repositorio.ufpe.br/bitstream/123456789/44894/3/license.txt
bitstream.checksum.fl_str_mv 391a1cd8dadb2948f133aaf1c8bf86a7
d0defdf3ccc5904de1028cf67ab85a2f
32265c3f4bb11bf11319c2adc3c802b3
e39d27027a6cc9cb039ad269a5db8e34
6928b9260b07fb2755249a5ca9903395
bitstream.checksumAlgorithm.fl_str_mv MD5
MD5
MD5
MD5
MD5
repository.name.fl_str_mv Repositório Institucional da UFPE - Universidade Federal de Pernambuco (UFPE)
repository.mail.fl_str_mv attena@ufpe.br
_version_ 1797782466075820032