CARREGAR PACOTES NECESSÁRIOS

PERIODO 1

JUNTAR TODOS OS ARQUIVOS DO PICARRO EM UMA ÚNICA TABELA

# Set the file path

file_periodo1 <- "C:/Users/Samsung/OneDrive/Documentos/1 - PósDoc/2 - FAPESP - Silvipastoril/Responsabilidades/Picarro/Laura/Periodo 1"
file_periodo1
[1] "C:/Users/Samsung/OneDrive/Documentos/1 - PósDoc/2 - FAPESP - Silvipastoril/Responsabilidades/Picarro/Laura/Periodo 1"
# Get the list of files
file_list_periodo1 <- list.files(file_periodo1, pattern = ".dat", full.names = TRUE)

# Read in the data from each file
data_list_periodo1 <- lapply(file_list_periodo1, read.table, header = TRUE, sep = "",fill = TRUE)

# Combine the data frames
dados_periodo1 <- do.call(rbind, data_list_periodo1)

# Remove the temporary data frame
rm(data_list_periodo1)
rm(file_periodo1)
rm(file_list_periodo1)
print(dados_periodo1)

CRIAR UM DATAFRAME SÓ COM AS COLUNAS NECESSÁRIAS

CRIAR COLUNA DATATEMPO

ASSIGNAR SAMPLE NUMBERS

print(summary(dados_periodo1$samplenum))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    1.0   245.0   977.0   965.9  1588.0  2012.0 

FILTRAR OS DADOS, TIRAR O PRIMEIRO MINUTO DE CADA CAMARA

CARREGAR INFORMAÇÕES SOBRE OS ANIMAIS NAS CAMARAS

info_periodo1 = read.csv("C:/Users/Samsung/OneDrive/Documentos/1 - PósDoc/2 - FAPESP - Silvipastoril/Responsabilidades/Picarro/Laura/Periodo 1/Infoposition1.csv")

FAZER UMA MEDIANA DOS GASES USANDO OS DADOS DE 3 MIN

FILTRAR NO TEMPO DESEJADO

summary(df_filtrado$DATATEMPO)
                      Min.                    1st Qu.                     Median 
"2024-10-08 09:01:45.4679" "2024-10-08 19:12:54.4530" "2024-10-09 10:48:41.4465" 
                      Mean                    3rd Qu.                       Max. 
"2024-10-09 08:08:30.1702" "2024-10-09 20:59:26.2460" "2024-10-10 07:28:00.7430" 

PERIODO 2

JUNTAR TODOS OS ARQUIVOS DO PICARRO EM UMA ÚNICA TABELA

CRIAR UM DATAFRAME SÓ COM AS COLUNAS NECESSÁRIAS

CRIAR COLUNA DATATEMPO

ASSIGNAR SAMPLE NUMBERS

print(summary(dados_periodo2$samplenum))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    1.0    97.0   193.0   272.5   454.0   723.0 

FILTRAR OS DADOS, TIRAR O PRIMEIRO MINUTO DE CADA CAMARA

CARREGAR INFORMAÇÕES SOBRE OS ANIMAIS NAS CAMARAS

FAZER UMA MEDIANA DOS GASES USANDO OS DADOS DE 3 MIN

FILTRAR NO TEMPO DESEJADO

summary(df_filtrado2$DATATEMPO)
                      Min.                    1st Qu.                     Median 
"2024-10-29 06:03:20.7699" "2024-10-29 09:53:03.4967" "2024-10-29 13:02:23.0317" 
                      Mean                    3rd Qu.                       Max. 
"2024-10-29 12:50:50.6624" "2024-10-29 16:11:57.7337" "2024-10-29 18:55:04.0429" 

PERIODO 3

JUNTAR TODOS OS ARQUIVOS DO PICARRO EM UMA ÚNICA TABELA

CRIAR UM DATAFRAME SÓ COM AS COLUNAS NECESSÁRIAS

CRIAR COLUNA DATATEMPO

ASSIGNAR SAMPLE NUMBERS

print(summary(dados_periodo3$samplenum))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      1     522    1311    1295    2070    2524 

FILTRAR OS DADOS, TIRAR O PRIMEIRO MINUTO DE CADA CAMARA

CARREGAR INFORMAÇÕES SOBRE OS ANIMAIS NAS CAMARAS

FAZER UMA MEDIANA DOS GASES USANDO OS DADOS DE 3 MIN

FILTRAR NO TEMPO DESEJADO

summary(df_filtrado3$DATATEMPO)
                      Min.                    1st Qu.                     Median 
"2024-11-17 09:10:44.5280" "2024-11-17 20:24:09.8577" "2024-11-18 09:39:13.0862" 
                      Mean                    3rd Qu.                       Max. 
"2024-11-18 08:41:13.7678" "2024-11-18 20:52:35.8397" "2024-11-19 07:56:24.1630" 

PERIODO 4

JUNTAR TODOS OS ARQUIVOS DO PICARRO EM UMA ÚNICA TABELA

CRIAR UM DATAFRAME SÓ COM AS COLUNAS NECESSÁRIAS

CRIAR COLUNA DATATEMPO

ASSIGNAR SAMPLE NUMBERS

print(summary(dados_periodo4$samplenum))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      1     596    1367    1288    2051    2340 

FILTRAR OS DADOS, TIRAR O PRIMEIRO MINUTO DE CADA CAMARA

CARREGAR INFORMAÇÕES SOBRE OS ANIMAIS NAS CAMARAS

FAZER UMA MEDIANA DOS GASES USANDO OS DADOS DE 3 MIN

FILTRAR NO TEMPO DESEJADO

summary(df_filtrado4$DATATEMPO)
                      Min.                    1st Qu.                     Median 
"2024-12-08 09:10:43.6280" "2024-12-08 20:03:03.1776" "2024-12-09 08:34:48.1007" 
                      Mean                    3rd Qu.                       Max. 
"2024-12-09 08:06:50.4157" "2024-12-09 20:01:31.8047" "2024-12-10 07:29:59.2755" 

JUNTAR PERIODOS e EXPORTAR DADOS

PLOT

LS0tDQp0aXRsZTogIkRhZG9zIGRlIE1ldGFubyBMYXVyYSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzDQogICAgdGhlbWU6IGNvc21vDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAnMycNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogJzMnDQotLS0NCg0KIyMgKkNBUlJFR0FSIFBBQ09URVMgTkVDRVNTw4FSSU9TKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCm9wdGlvbnMobWF4LnByaW50ID0gMTApDQpgYGANCg0KIyAqUEVSSU9ETyAxKg0KDQojIyBfSlVOVEFSIFRPRE9TIE9TIEFSUVVJVk9TIERPIFBJQ0FSUk8gRU0gVU1BIMOaTklDQSBUQUJFTEFfDQoNCmBgYHtyfQ0KIyBTZXQgdGhlIGZpbGUgcGF0aA0KDQpmaWxlX3BlcmlvZG8xIDwtICJDOi9Vc2Vycy9TYW1zdW5nL09uZURyaXZlL0RvY3VtZW50b3MvMSAtIFDDs3NEb2MvMiAtIEZBUEVTUCAtIFNpbHZpcGFzdG9yaWwvUmVzcG9uc2FiaWxpZGFkZXMvUGljYXJyby9MYXVyYS9QZXJpb2RvIDEiDQpmaWxlX3BlcmlvZG8xDQoNCiMgR2V0IHRoZSBsaXN0IG9mIGZpbGVzDQpmaWxlX2xpc3RfcGVyaW9kbzEgPC0gbGlzdC5maWxlcyhmaWxlX3BlcmlvZG8xLCBwYXR0ZXJuID0gIi5kYXQiLCBmdWxsLm5hbWVzID0gVFJVRSkNCg0KIyBSZWFkIGluIHRoZSBkYXRhIGZyb20gZWFjaCBmaWxlDQpkYXRhX2xpc3RfcGVyaW9kbzEgPC0gbGFwcGx5KGZpbGVfbGlzdF9wZXJpb2RvMSwgcmVhZC50YWJsZSwgaGVhZGVyID0gVFJVRSwgc2VwID0gIiIsZmlsbCA9IFRSVUUpDQoNCiMgQ29tYmluZSB0aGUgZGF0YSBmcmFtZXMNCmRhZG9zX3BlcmlvZG8xIDwtIGRvLmNhbGwocmJpbmQsIGRhdGFfbGlzdF9wZXJpb2RvMSkNCg0KIyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBkYXRhIGZyYW1lDQpybShkYXRhX2xpc3RfcGVyaW9kbzEpDQpybShmaWxlX3BlcmlvZG8xKQ0Kcm0oZmlsZV9saXN0X3BlcmlvZG8xKQ0KcHJpbnQoZGFkb3NfcGVyaW9kbzEpDQpgYGANCg0KIyMgX0NSSUFSIFVNIERBVEFGUkFNRSBTw5MgQ09NIEFTIENPTFVOQVMgTkVDRVNTw4FSSUFTXw0KDQpgYGB7cn0NCmRhZG9zX3BlcmlvZG8xIDwtIHN1YnNldChkYWRvc19wZXJpb2RvMSwgc2VsZWN0ID0gYygiREFURSIsIlRJTUUiLCJKVUxJQU5fREFZUyIsIk1QVlBvc2l0aW9uIiwiTjJPX2RyeSIsIkNPMl9kcnkiLCJDSDRfZHJ5IiwiSDJPIiwiTkgzIikpDQpwcmludChkYWRvc19wZXJpb2RvMSkNCmBgYA0KDQojIyBfQ1JJQVIgQ09MVU5BIERBVEFURU1QT18NCg0KYGBge3J9DQojIElkZW50aWZpY2FyIGxpbmhhcyBjb20gdmFsb3JlcyBuw6NvIFVURi04DQpsaWJyYXJ5KHN0cmluZ2kpDQpsaW5oYXNfaW52YWxpZGFzIDwtIHdoaWNoKCFzdHJpX2VuY19pc3V0ZjgoZGFkb3NfcGVyaW9kbzEkREFURSkgfCAhc3RyaV9lbmNfaXN1dGY4KGRhZG9zX3BlcmlvZG8xJFRJTUUpKQ0KbGluaGFzX2ludmFsaWRhcw0KDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmRhZG9zX3BlcmlvZG8xJERBVEFURU1QTyA8LSB5bWRfaG1zKHBhc3RlKGRhZG9zX3BlcmlvZG8xJERBVEUsIGRhZG9zX3BlcmlvZG8xJFRJTUUpLCB0eiA9ICJVVEMiKQ0KaGVhZChkYWRvc19wZXJpb2RvMSREQVRBVEVNUE8pDQpwcmludChkYWRvc19wZXJpb2RvMSkNCmBgYA0KDQojIyBfQVNTSUdOQVIgU0FNUExFIE5VTUJFUlNfDQoNCmBgYHtyfQ0Kdm51bXMgPC0gZGFkb3NfcGVyaW9kbzEkTVBWUG9zaXRpb24NCnJsZV92bnVtcyA8LSBybGUodm51bXMpDQpkYWRvc19wZXJpb2RvMSRzYW1wbGVudW0gPC0gcmVwKHNlcV9hbG9uZyhybGVfdm51bXMkbGVuZ3RocyksIHJsZV92bnVtcyRsZW5ndGhzKQ0KcHJpbnQoc3VtbWFyeShkYWRvc19wZXJpb2RvMSRzYW1wbGVudW0pKQ0KYGBgDQoNCiMjIF9GSUxUUkFSIE9TIERBRE9TLCBUSVJBUiBPIFBSSU1FSVJPIE1JTlVUTyBERSBDQURBIENBTUFSQV8NCg0KYGBge3J9DQpkYWRvc19wZXJpb2RvMSAlPiUNCiAgZmlsdGVyKE1QVlBvc2l0aW9uID09IGZsb29yKE1QVlBvc2l0aW9uKSkgJT4lDQogIGFycmFuZ2UoREFUQVRFTVBPKSAlPiUNCiAgZ3JvdXBfYnkoc2FtcGxlbnVtKSAlPiUNCiAgbXV0YXRlKGVsYXBzZWRfc2Vjb25kcyA9IGFzLm51bWVyaWMoREFUQVRFTVBPIC0gbWluKERBVEFURU1QTykpKSAlPiUNCiAgZmlsdGVyKGVsYXBzZWRfc2Vjb25kcyA+PSA2MCAmIGVsYXBzZWRfc2Vjb25kcyA8PSAxODApICU+JQ0KICBmaWx0ZXIoIU1QVlBvc2l0aW9uID09IDApICU+JQ0KICBuYS5vbWl0KCkgLT4gbGltcG9fZGFkb3NfcGVyaW9kbzENCg0KcHJpbnQobGltcG9fZGFkb3NfcGVyaW9kbzEpDQpgYGANCg0KIyMgX0NBUlJFR0FSIElORk9STUHDh8OVRVMgU09CUkUgT1MgQU5JTUFJUyBOQVMgQ0FNQVJBU18NCg0KYGBge3J9DQppbmZvX3BlcmlvZG8xID0gcmVhZC5jc3YoIkM6L1VzZXJzL1NhbXN1bmcvT25lRHJpdmUvRG9jdW1lbnRvcy8xIC0gUMOzc0RvYy8yIC0gRkFQRVNQIC0gU2lsdmlwYXN0b3JpbC9SZXNwb25zYWJpbGlkYWRlcy9QaWNhcnJvL0xhdXJhL1BlcmlvZG8gMS9JbmZvcG9zaXRpb24xLmNzdiIpDQpgYGANCg0KIyMgX0ZBWkVSIFVNQSBNRURJQU5BIERPUyBHQVNFUyBVU0FORE8gT1MgREFET1MgREUgMyBNSU5fDQoNCmBgYHtyfQ0KbGltcG9fZGFkb3NfcGVyaW9kbzEgJT4lDQogICAgbXV0YXRlKHRpbWVvZmRheSA9IGhvdXIoREFUQVRFTVBPKSkgJT4lDQogICAgc3VtbWFyaXplKERBVEFURU1QTyA9IG1lZGlhbihEQVRBVEVNUE8pLCANCiAgICAgICAgICAgICAgSlVMSUFOX0RBWVMgPSBtZWRpYW4oSlVMSUFOX0RBWVMpLA0KICAgICAgICAgICAgICBNUFZQb3NpdGlvbiA9IG1lZGlhbihNUFZQb3NpdGlvbiksDQogICAgICAgICAgICAgIE4yT19kcnkgPSBtZWRpYW4oTjJPX2RyeSksDQogICAgICAgICAgICAgIENPMl9kcnkgPSBtZWRpYW4oQ08yX2RyeSksDQogICAgICAgICAgICAgIENINF9kcnkgPSBtZWRpYW4oQ0g0X2RyeSksDQogICAgICAgICAgICAgIEgyTyA9IG1lZGlhbihIMk8pLA0KICAgICAgICAgICAgICBOSDMgPSBtZWRpYW4oTkgzKSwNCiAgICAgICAgICAgICAgc2FtcGxlbnVtID0gbWVkaWFuKHNhbXBsZW51bSkpJT4lDQogICByaWdodF9qb2luKGluZm9fcGVyaW9kbzEsIGJ5ID0gIk1QVlBvc2l0aW9uIiklPiUNCiAgIHJlbG9jYXRlKGFuaW1hbCwgdHJhdCwgTVBWUG9zaXRpb24sIE4yT19kcnksIENPMl9kcnksIENINF9kcnksIEgyTywgTkgzLCBEQVRBVEVNUE8sIEpVTElBTl9EQVlTLCBzYW1wbGVudW0pJT4lDQogICBhcnJhbmdlKGFuaW1hbCkgLT4gbWVkaWFuX2RhZG9zX3BlcmlvZG8xDQptZWRpYW5fZGFkb3NfcGVyaW9kbzE9c3Vic2V0KG1lZGlhbl9kYWRvc19wZXJpb2RvMSwgYW5pbWFsIT0gIk5BIikNCnByaW50KG1lZGlhbl9kYWRvc19wZXJpb2RvMSkNCmBgYA0KDQojIyBfRklMVFJBUiBOTyBURU1QTyBERVNFSkFET18NCg0KYGBge3J9DQptZWRpYW5fZGFkb3NfcGVyaW9kbzEkREFUQVRFTVBPID0gYXMuUE9TSVhjdChtZWRpYW5fZGFkb3NfcGVyaW9kbzEkREFUQVRFTVBPLCBmb3JtYXQgPSAiJVktJW0tJWQgJUg6JU06JVMiLHR6ID0gIkFtZXJpY2EvU2FvX1BhdWxvIikNCnN0cihtZWRpYW5fZGFkb3NfcGVyaW9kbzEpDQoNCg0KIyBEZWZpbmEgb3MgaW50ZXJ2YWxvcyBkZXNlamFkb3MNCmluaWNpbzEgPSBhcy5QT1NJWGN0KCIyMDI0LTEwLTA4IDA5OjAwOjAwIiwgdHogPSAiQW1lcmljYS9TYW9fUGF1bG8iKQ0KZmltMSAgICA9IGFzLlBPU0lYY3QoIjIwMjQtMTAtMDkgMDg6MDA6MDAiLCB0eiA9ICJBbWVyaWNhL1Nhb19QYXVsbyIpDQoNCmluaWNpbzIgPSBhcy5QT1NJWGN0KCIyMDI0LTEwLTA5IDA5OjAwOjAwIiwgdHogPSAiQW1lcmljYS9TYW9fUGF1bG8iKQ0KZmltMiAgICA9IGFzLlBPU0lYY3QoIjIwMjQtMTAtMTAgMDg6MDA6MDAiLCB0eiA9ICJBbWVyaWNhL1Nhb19QYXVsbyIpDQoNCiMgRmlsdHJlIG9zIGRhZG9zIHF1ZSBlc3RlamFtIGVtIHVtIGRvcyBkb2lzIGludGVydmFsb3MNCmRmX2ZpbHRyYWRvID0gbWVkaWFuX2RhZG9zX3BlcmlvZG8xWw0KICAobWVkaWFuX2RhZG9zX3BlcmlvZG8xJERBVEFURU1QTyA+PSBpbmljaW8xICYgbWVkaWFuX2RhZG9zX3BlcmlvZG8xJERBVEFURU1QTyA8PSBmaW0xKSB8DQogIChtZWRpYW5fZGFkb3NfcGVyaW9kbzEkREFUQVRFTVBPID49IGluaWNpbzIgJiBtZWRpYW5fZGFkb3NfcGVyaW9kbzEkREFUQVRFTVBPIDw9IGZpbTIpLCANCl0NClZpZXcoZGZfZmlsdHJhZG8pDQpzdW1tYXJ5KGRmX2ZpbHRyYWRvJERBVEFURU1QTykNCmBgYA0KDQoNCg0KIyAqUEVSSU9ETyAyKg0KDQojIyBfSlVOVEFSIFRPRE9TIE9TIEFSUVVJVk9TIERPIFBJQ0FSUk8gRU0gVU1BIMOaTklDQSBUQUJFTEFfDQoNCmBgYHtyfQ0KIyBTZXQgdGhlIGZpbGUgcGF0aA0KDQpmaWxlX3BlcmlvZG8yIDwtICJDOi9Vc2Vycy9TYW1zdW5nL09uZURyaXZlL0RvY3VtZW50b3MvMSAtIFDDs3NEb2MvMiAtIEZBUEVTUCAtIFNpbHZpcGFzdG9yaWwvUmVzcG9uc2FiaWxpZGFkZXMvUGljYXJyby9MYXVyYS9QZXJpb2RvIDIiDQpmaWxlX3BlcmlvZG8yDQoNCiMgR2V0IHRoZSBsaXN0IG9mIGZpbGVzDQpmaWxlX2xpc3RfcGVyaW9kbzIgPC0gbGlzdC5maWxlcyhmaWxlX3BlcmlvZG8yLCBwYXR0ZXJuID0gIi5kYXQiLCBmdWxsLm5hbWVzID0gVFJVRSkNCg0KIyBSZWFkIGluIHRoZSBkYXRhIGZyb20gZWFjaCBmaWxlDQpkYXRhX2xpc3RfcGVyaW9kbzIgPC0gbGFwcGx5KGZpbGVfbGlzdF9wZXJpb2RvMiwgcmVhZC50YWJsZSwgaGVhZGVyID0gVFJVRSwgc2VwID0gIiIsZmlsbCA9IFRSVUUpDQoNCiMgQ29tYmluZSB0aGUgZGF0YSBmcmFtZXMNCmRhZG9zX3BlcmlvZG8yIDwtIGRvLmNhbGwocmJpbmQsIGRhdGFfbGlzdF9wZXJpb2RvMikNCg0KIyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBkYXRhIGZyYW1lDQpybShkYXRhX2xpc3RfcGVyaW9kbzIpDQpybShmaWxlX3BlcmlvZG8yKQ0Kcm0oZmlsZV9saXN0X3BlcmlvZG8yKQ0KcHJpbnQoZGFkb3NfcGVyaW9kbzIpDQpgYGANCg0KIyMgX0NSSUFSIFVNIERBVEFGUkFNRSBTw5MgQ09NIEFTIENPTFVOQVMgTkVDRVNTw4FSSUFTXw0KDQpgYGB7cn0NCmRhZG9zX3BlcmlvZG8yIDwtIHN1YnNldChkYWRvc19wZXJpb2RvMiwgc2VsZWN0ID0gYygiREFURSIsIlRJTUUiLCJKVUxJQU5fREFZUyIsIk1QVlBvc2l0aW9uIiwiTjJPX2RyeSIsIkNPMl9kcnkiLCJDSDRfZHJ5IiwiSDJPIiwiTkgzIikpDQpwcmludChkYWRvc19wZXJpb2RvMikNCmBgYA0KDQojIyBfQ1JJQVIgQ09MVU5BIERBVEFURU1QT18NCg0KYGBge3J9DQpkYWRvc19wZXJpb2RvMiREQVRBVEVNUE8gPC0geW1kX2htcyhwYXN0ZShkYWRvc19wZXJpb2RvMiREQVRFLCBkYWRvc19wZXJpb2RvMiRUSU1FKSwgdHogPSAiVVRDIikNCmhlYWQoZGFkb3NfcGVyaW9kbzIkREFUQVRFTVBPKQ0KcHJpbnQoZGFkb3NfcGVyaW9kbzIpDQpgYGANCg0KIyMgX0FTU0lHTkFSIFNBTVBMRSBOVU1CRVJTXw0KDQpgYGB7cn0NCnZudW1zIDwtIGRhZG9zX3BlcmlvZG8yJE1QVlBvc2l0aW9uDQpybGVfdm51bXMgPC0gcmxlKHZudW1zKQ0KZGFkb3NfcGVyaW9kbzIkc2FtcGxlbnVtIDwtIHJlcChzZXFfYWxvbmcocmxlX3ZudW1zJGxlbmd0aHMpLCBybGVfdm51bXMkbGVuZ3RocykNCnByaW50KHN1bW1hcnkoZGFkb3NfcGVyaW9kbzIkc2FtcGxlbnVtKSkNCmBgYA0KDQojIyBfRklMVFJBUiBPUyBEQURPUywgVElSQVIgTyBQUklNRUlSTyBNSU5VVE8gREUgQ0FEQSBDQU1BUkFfDQoNCmBgYHtyfQ0KZGFkb3NfcGVyaW9kbzIgJT4lDQogIGZpbHRlcihNUFZQb3NpdGlvbiA9PSBmbG9vcihNUFZQb3NpdGlvbikpICU+JQ0KICBhcnJhbmdlKERBVEFURU1QTykgJT4lDQogIGdyb3VwX2J5KHNhbXBsZW51bSkgJT4lDQogIG11dGF0ZShlbGFwc2VkX3NlY29uZHMgPSBhcy5udW1lcmljKERBVEFURU1QTyAtIG1pbihEQVRBVEVNUE8pKSkgJT4lDQogIGZpbHRlcihlbGFwc2VkX3NlY29uZHMgPj0gNjAgJiBlbGFwc2VkX3NlY29uZHMgPD0gMTgwKSAlPiUNCiAgZmlsdGVyKCFNUFZQb3NpdGlvbiA9PSAwKSAlPiUNCiAgbmEub21pdCgpIC0+IGxpbXBvX2RhZG9zX3BlcmlvZG8yDQoNCnByaW50KGxpbXBvX2RhZG9zX3BlcmlvZG8yKQ0KYGBgDQoNCiMjIF9DQVJSRUdBUiBJTkZPUk1Bw4fDlUVTIFNPQlJFIE9TIEFOSU1BSVMgTkFTIENBTUFSQVNfDQoNCmBgYHtyfQ0KaW5mb19wZXJpb2RvMiA9IHJlYWQuY3N2KCJDOi9Vc2Vycy9TYW1zdW5nL09uZURyaXZlL0RvY3VtZW50b3MvMSAtIFDDs3NEb2MvMiAtIEZBUEVTUCAtIFNpbHZpcGFzdG9yaWwvUmVzcG9uc2FiaWxpZGFkZXMvUGljYXJyby9MYXVyYS9QZXJpb2RvIDIvSW5mb3Bvc2l0aW9uMi5jc3YiKQ0KYGBgDQoNCiMjIF9GQVpFUiBVTUEgTUVESUFOQSBET1MgR0FTRVMgVVNBTkRPIE9TIERBRE9TIERFIDMgTUlOXw0KDQpgYGB7cn0NCmxpbXBvX2RhZG9zX3BlcmlvZG8yICU+JQ0KICAgIG11dGF0ZSh0aW1lb2ZkYXkgPSBob3VyKERBVEFURU1QTykpICU+JQ0KICAgIHN1bW1hcml6ZShEQVRBVEVNUE8gPSBtZWRpYW4oREFUQVRFTVBPKSwgDQogICAgICAgICAgICAgIEpVTElBTl9EQVlTID0gbWVkaWFuKEpVTElBTl9EQVlTKSwNCiAgICAgICAgICAgICAgTVBWUG9zaXRpb24gPSBtZWRpYW4oTVBWUG9zaXRpb24pLA0KICAgICAgICAgICAgICBOMk9fZHJ5ID0gbWVkaWFuKE4yT19kcnkpLA0KICAgICAgICAgICAgICBDTzJfZHJ5ID0gbWVkaWFuKENPMl9kcnkpLA0KICAgICAgICAgICAgICBDSDRfZHJ5ID0gbWVkaWFuKENINF9kcnkpLA0KICAgICAgICAgICAgICBIMk8gPSBtZWRpYW4oSDJPKSwNCiAgICAgICAgICAgICAgTkgzID0gbWVkaWFuKE5IMyksDQogICAgICAgICAgICAgIHNhbXBsZW51bSA9IG1lZGlhbihzYW1wbGVudW0pKSU+JQ0KICAgcmlnaHRfam9pbihpbmZvX3BlcmlvZG8yLCBieSA9ICJNUFZQb3NpdGlvbiIpJT4lDQogICByZWxvY2F0ZShhbmltYWwsIHRyYXQsIE1QVlBvc2l0aW9uLCBOMk9fZHJ5LCBDTzJfZHJ5LCBDSDRfZHJ5LCBIMk8sIE5IMywgREFUQVRFTVBPLCBKVUxJQU5fREFZUywgc2FtcGxlbnVtKSU+JQ0KICAgYXJyYW5nZShhbmltYWwpIC0+IG1lZGlhbl9kYWRvc19wZXJpb2RvMg0KbWVkaWFuX2RhZG9zX3BlcmlvZG8yPXN1YnNldChtZWRpYW5fZGFkb3NfcGVyaW9kbzIsIGFuaW1hbCE9ICJOQSIpDQpwcmludChtZWRpYW5fZGFkb3NfcGVyaW9kbzIpDQpgYGANCg0KIyMgX0ZJTFRSQVIgTk8gVEVNUE8gREVTRUpBRE9fDQoNCmBgYHtyfQ0KbWVkaWFuX2RhZG9zX3BlcmlvZG8yJERBVEFURU1QTyA9IGFzLlBPU0lYY3QobWVkaWFuX2RhZG9zX3BlcmlvZG8yJERBVEFURU1QTywgZm9ybWF0ID0gIiVZLSVtLSVkICVIOiVNOiVTIix0eiA9ICJBbWVyaWNhL1Nhb19QYXVsbyIpDQpzdHIobWVkaWFuX2RhZG9zX3BlcmlvZG8yKQ0KDQojIERlZmluYSBvcyBpbnRlcnZhbG9zIGRlc2VqYWRvcw0KaW5pY2lvMSA9IGFzLlBPU0lYY3QoIjIwMjQtMTAtMjggMDk6MDA6MDAiLCB0eiA9ICJBbWVyaWNhL1Nhb19QYXVsbyIpDQpmaW0xICAgID0gYXMuUE9TSVhjdCgiMjAyNC0xMC0yOSAwODowMDowMCIsIHR6ID0gIkFtZXJpY2EvU2FvX1BhdWxvIikNCg0KaW5pY2lvMiA9IGFzLlBPU0lYY3QoIjIwMjQtMTAtMjkgMDk6MDA6MDAiLCB0eiA9ICJBbWVyaWNhL1Nhb19QYXVsbyIpDQpmaW0yICAgID0gYXMuUE9TSVhjdCgiMjAyNC0xMC0yOSAyMDowMDowMCIsIHR6ID0gIkFtZXJpY2EvU2FvX1BhdWxvIikNCg0KIyBGaWx0cmUgb3MgZGFkb3MgcXVlIGVzdGVqYW0gZW0gdW0gZG9zIGRvaXMgaW50ZXJ2YWxvcw0KZGZfZmlsdHJhZG8yID0gbWVkaWFuX2RhZG9zX3BlcmlvZG8yWw0KICAobWVkaWFuX2RhZG9zX3BlcmlvZG8yJERBVEFURU1QTyA+PSBpbmljaW8xICYgbWVkaWFuX2RhZG9zX3BlcmlvZG8yJERBVEFURU1QTyA8PSBmaW0xKSB8DQogIChtZWRpYW5fZGFkb3NfcGVyaW9kbzIkREFUQVRFTVBPID49IGluaWNpbzIgJiBtZWRpYW5fZGFkb3NfcGVyaW9kbzIkREFUQVRFTVBPIDw9IGZpbTIpLCANCl0NClZpZXcoZGZfZmlsdHJhZG8yKQ0Kc3VtbWFyeShkZl9maWx0cmFkbzIkREFUQVRFTVBPKQ0KYGBgDQoNCg0KIyAqUEVSSU9ETyAzKg0KDQojIyBfSlVOVEFSIFRPRE9TIE9TIEFSUVVJVk9TIERPIFBJQ0FSUk8gRU0gVU1BIMOaTklDQSBUQUJFTEFfDQoNCmBgYHtyfQ0KIyBTZXQgdGhlIGZpbGUgcGF0aA0KDQpmaWxlX3BlcmlvZG8zIDwtICJDOi9Vc2Vycy9TYW1zdW5nL09uZURyaXZlL0RvY3VtZW50b3MvMSAtIFDDs3NEb2MvMiAtIEZBUEVTUCAtIFNpbHZpcGFzdG9yaWwvUmVzcG9uc2FiaWxpZGFkZXMvUGljYXJyby9MYXVyYS9QZXJpb2RvIDMiDQpmaWxlX3BlcmlvZG8zDQoNCiMgR2V0IHRoZSBsaXN0IG9mIGZpbGVzDQpmaWxlX2xpc3RfcGVyaW9kbzMgPC0gbGlzdC5maWxlcyhmaWxlX3BlcmlvZG8zLCBwYXR0ZXJuID0gIi5kYXQiLCBmdWxsLm5hbWVzID0gVFJVRSkNCg0KIyBSZWFkIGluIHRoZSBkYXRhIGZyb20gZWFjaCBmaWxlDQpkYXRhX2xpc3RfcGVyaW9kbzMgPC0gbGFwcGx5KGZpbGVfbGlzdF9wZXJpb2RvMywgcmVhZC50YWJsZSwgaGVhZGVyID0gVFJVRSwgc2VwID0gIiIsZmlsbCA9IFRSVUUpDQoNCiMgQ29tYmluZSB0aGUgZGF0YSBmcmFtZXMNCmRhZG9zX3BlcmlvZG8zIDwtIGRvLmNhbGwocmJpbmQsIGRhdGFfbGlzdF9wZXJpb2RvMykNCg0KIyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBkYXRhIGZyYW1lDQpybShkYXRhX2xpc3RfcGVyaW9kbzMpDQpybShmaWxlX3BlcmlvZG8zKQ0Kcm0oZmlsZV9saXN0X3BlcmlvZG8zKQ0KcHJpbnQoZGFkb3NfcGVyaW9kbzMpDQpgYGANCg0KIyMgX0NSSUFSIFVNIERBVEFGUkFNRSBTw5MgQ09NIEFTIENPTFVOQVMgTkVDRVNTw4FSSUFTXw0KDQpgYGB7cn0NCmRhZG9zX3BlcmlvZG8zIDwtIHN1YnNldChkYWRvc19wZXJpb2RvMywgc2VsZWN0ID0gYygiREFURSIsIlRJTUUiLCJKVUxJQU5fREFZUyIsIk1QVlBvc2l0aW9uIiwiTjJPX2RyeSIsIkNPMl9kcnkiLCJDSDRfZHJ5IiwiSDJPIiwiTkgzIikpDQpwcmludChkYWRvc19wZXJpb2RvMykNCmBgYA0KDQojIyBfQ1JJQVIgQ09MVU5BIERBVEFURU1QT18NCg0KYGBge3J9DQpkYWRvc19wZXJpb2RvMyREQVRBVEVNUE8gPC0geW1kX2htcyhwYXN0ZShkYWRvc19wZXJpb2RvMyREQVRFLCBkYWRvc19wZXJpb2RvMyRUSU1FKSwgdHogPSAiVVRDIikNCmhlYWQoZGFkb3NfcGVyaW9kbzMkREFUQVRFTVBPKQ0KcHJpbnQoZGFkb3NfcGVyaW9kbzMpDQpgYGANCg0KIyMgX0FTU0lHTkFSIFNBTVBMRSBOVU1CRVJTXw0KDQpgYGB7cn0NCnZudW1zIDwtIGRhZG9zX3BlcmlvZG8zJE1QVlBvc2l0aW9uDQpybGVfdm51bXMgPC0gcmxlKHZudW1zKQ0KZGFkb3NfcGVyaW9kbzMkc2FtcGxlbnVtIDwtIHJlcChzZXFfYWxvbmcocmxlX3ZudW1zJGxlbmd0aHMpLCBybGVfdm51bXMkbGVuZ3RocykNCnByaW50KHN1bW1hcnkoZGFkb3NfcGVyaW9kbzMkc2FtcGxlbnVtKSkNCmBgYA0KDQojIyBfRklMVFJBUiBPUyBEQURPUywgVElSQVIgTyBQUklNRUlSTyBNSU5VVE8gREUgQ0FEQSBDQU1BUkFfDQoNCmBgYHtyfQ0KZGFkb3NfcGVyaW9kbzMgJT4lDQogIGZpbHRlcihNUFZQb3NpdGlvbiA9PSBmbG9vcihNUFZQb3NpdGlvbikpICU+JQ0KICBhcnJhbmdlKERBVEFURU1QTykgJT4lDQogIGdyb3VwX2J5KHNhbXBsZW51bSkgJT4lDQogIG11dGF0ZShlbGFwc2VkX3NlY29uZHMgPSBhcy5udW1lcmljKERBVEFURU1QTyAtIG1pbihEQVRBVEVNUE8pKSkgJT4lDQogIGZpbHRlcihlbGFwc2VkX3NlY29uZHMgPj0gNjAgJiBlbGFwc2VkX3NlY29uZHMgPD0gMTgwKSAlPiUNCiAgZmlsdGVyKCFNUFZQb3NpdGlvbiA9PSAwKSAlPiUNCiAgbmEub21pdCgpIC0+IGxpbXBvX2RhZG9zX3BlcmlvZG8zDQoNCnByaW50KGxpbXBvX2RhZG9zX3BlcmlvZG8zKQ0KYGBgDQoNCiMjIF9DQVJSRUdBUiBJTkZPUk1Bw4fDlUVTIFNPQlJFIE9TIEFOSU1BSVMgTkFTIENBTUFSQVNfDQoNCmBgYHtyfQ0KaW5mb19wZXJpb2RvMyA9IHJlYWQuY3N2KCJDOi9Vc2Vycy9TYW1zdW5nL09uZURyaXZlL0RvY3VtZW50b3MvMSAtIFDDs3NEb2MvMiAtIEZBUEVTUCAtIFNpbHZpcGFzdG9yaWwvUmVzcG9uc2FiaWxpZGFkZXMvUGljYXJyby9MYXVyYS9QZXJpb2RvIDMvSW5mb3Bvc2l0aW9uMy5jc3YiKQ0KYGBgDQoNCiMjIF9GQVpFUiBVTUEgTUVESUFOQSBET1MgR0FTRVMgVVNBTkRPIE9TIERBRE9TIERFIDMgTUlOXw0KDQpgYGB7cn0NCmxpbXBvX2RhZG9zX3BlcmlvZG8zICU+JQ0KICAgIG11dGF0ZSh0aW1lb2ZkYXkgPSBob3VyKERBVEFURU1QTykpICU+JQ0KICAgIHN1bW1hcml6ZShEQVRBVEVNUE8gPSBtZWRpYW4oREFUQVRFTVBPKSwgDQogICAgICAgICAgICAgIEpVTElBTl9EQVlTID0gbWVkaWFuKEpVTElBTl9EQVlTKSwNCiAgICAgICAgICAgICAgTVBWUG9zaXRpb24gPSBtZWRpYW4oTVBWUG9zaXRpb24pLA0KICAgICAgICAgICAgICBOMk9fZHJ5ID0gbWVkaWFuKE4yT19kcnkpLA0KICAgICAgICAgICAgICBDTzJfZHJ5ID0gbWVkaWFuKENPMl9kcnkpLA0KICAgICAgICAgICAgICBDSDRfZHJ5ID0gbWVkaWFuKENINF9kcnkpLA0KICAgICAgICAgICAgICBIMk8gPSBtZWRpYW4oSDJPKSwNCiAgICAgICAgICAgICAgTkgzID0gbWVkaWFuKE5IMyksDQogICAgICAgICAgICAgIHNhbXBsZW51bSA9IG1lZGlhbihzYW1wbGVudW0pKSU+JQ0KICAgcmlnaHRfam9pbihpbmZvX3BlcmlvZG8zLCBieSA9ICJNUFZQb3NpdGlvbiIpJT4lDQogICByZWxvY2F0ZShhbmltYWwsIHRyYXQsIE1QVlBvc2l0aW9uLCBOMk9fZHJ5LCBDTzJfZHJ5LCBDSDRfZHJ5LCBIMk8sIE5IMywgREFUQVRFTVBPLCBKVUxJQU5fREFZUywgc2FtcGxlbnVtKSU+JQ0KICAgYXJyYW5nZShhbmltYWwpIC0+IG1lZGlhbl9kYWRvc19wZXJpb2RvMw0KbWVkaWFuX2RhZG9zX3BlcmlvZG8zPXN1YnNldChtZWRpYW5fZGFkb3NfcGVyaW9kbzMsIGFuaW1hbCE9ICJOQSIpDQpwcmludChtZWRpYW5fZGFkb3NfcGVyaW9kbzMpDQpgYGANCg0KIyMgX0ZJTFRSQVIgTk8gVEVNUE8gREVTRUpBRE9fDQoNCmBgYHtyfQ0KbWVkaWFuX2RhZG9zX3BlcmlvZG8zJERBVEFURU1QTyA9IGFzLlBPU0lYY3QobWVkaWFuX2RhZG9zX3BlcmlvZG8zJERBVEFURU1QTywgZm9ybWF0ID0gIiVZLSVtLSVkICVIOiVNOiVTIix0eiA9ICJBbWVyaWNhL1Nhb19QYXVsbyIpDQpzdHIobWVkaWFuX2RhZG9zX3BlcmlvZG8zKQ0KDQojIERlZmluYSBvcyBpbnRlcnZhbG9zIGRlc2VqYWRvcw0KaW5pY2lvMSA9IGFzLlBPU0lYY3QoIjIwMjQtMTEtMTcgMDk6MDA6MDAiLCB0eiA9ICJBbWVyaWNhL1Nhb19QYXVsbyIpDQpmaW0xICAgID0gYXMuUE9TSVhjdCgiMjAyNC0xMS0xOCAwODowMDowMCIsIHR6ID0gIkFtZXJpY2EvU2FvX1BhdWxvIikNCg0KaW5pY2lvMiA9IGFzLlBPU0lYY3QoIjIwMjQtMTEtMTggMDk6MDA6MDAiLCB0eiA9ICJBbWVyaWNhL1Nhb19QYXVsbyIpDQpmaW0yICAgID0gYXMuUE9TSVhjdCgiMjAyNC0xMS0xOSAwODowMDowMCIsIHR6ID0gIkFtZXJpY2EvU2FvX1BhdWxvIikNCg0KIyBGaWx0cmUgb3MgZGFkb3MgcXVlIGVzdGVqYW0gZW0gdW0gZG9zIGRvaXMgaW50ZXJ2YWxvcw0KZGZfZmlsdHJhZG8zID0gbWVkaWFuX2RhZG9zX3BlcmlvZG8zWw0KICAobWVkaWFuX2RhZG9zX3BlcmlvZG8zJERBVEFURU1QTyA+PSBpbmljaW8xICYgbWVkaWFuX2RhZG9zX3BlcmlvZG8zJERBVEFURU1QTyA8PSBmaW0xKSB8DQogIChtZWRpYW5fZGFkb3NfcGVyaW9kbzMkREFUQVRFTVBPID49IGluaWNpbzIgJiBtZWRpYW5fZGFkb3NfcGVyaW9kbzMkREFUQVRFTVBPIDw9IGZpbTIpLCANCl0NClZpZXcoZGZfZmlsdHJhZG8zKQ0Kc3VtbWFyeShkZl9maWx0cmFkbzMkREFUQVRFTVBPKQ0KYGBgDQoNCiMgKlBFUklPRE8gNCoNCg0KIyMgX0pVTlRBUiBUT0RPUyBPUyBBUlFVSVZPUyBETyBQSUNBUlJPIEVNIFVNQSDDmk5JQ0EgVEFCRUxBXw0KDQpgYGB7cn0NCiMgU2V0IHRoZSBmaWxlIHBhdGgNCg0KZmlsZV9wZXJpb2RvNCA8LSAiQzovVXNlcnMvU2Ftc3VuZy9PbmVEcml2ZS9Eb2N1bWVudG9zLzEgLSBQw7NzRG9jLzIgLSBGQVBFU1AgLSBTaWx2aXBhc3RvcmlsL1Jlc3BvbnNhYmlsaWRhZGVzL1BpY2Fycm8vTGF1cmEvUGVyaW9kbyA0Ig0KZmlsZV9wZXJpb2RvNA0KDQojIEdldCB0aGUgbGlzdCBvZiBmaWxlcw0KZmlsZV9saXN0X3BlcmlvZG80IDwtIGxpc3QuZmlsZXMoZmlsZV9wZXJpb2RvNCwgcGF0dGVybiA9ICIuZGF0IiwgZnVsbC5uYW1lcyA9IFRSVUUpDQoNCiMgUmVhZCBpbiB0aGUgZGF0YSBmcm9tIGVhY2ggZmlsZQ0KZGF0YV9saXN0X3BlcmlvZG80IDwtIGxhcHBseShmaWxlX2xpc3RfcGVyaW9kbzQsIHJlYWQudGFibGUsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICIiLGZpbGwgPSBUUlVFKQ0KDQojIENvbWJpbmUgdGhlIGRhdGEgZnJhbWVzDQpkYWRvc19wZXJpb2RvNCA8LSBkby5jYWxsKHJiaW5kLCBkYXRhX2xpc3RfcGVyaW9kbzQpDQoNCiMgUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZGF0YSBmcmFtZQ0Kcm0oZGF0YV9saXN0X3BlcmlvZG80KQ0Kcm0oZmlsZV9wZXJpb2RvNCkNCnJtKGZpbGVfbGlzdF9wZXJpb2RvNCkNCnByaW50KGRhZG9zX3BlcmlvZG80KQ0KYGBgDQoNCiMjIF9DUklBUiBVTSBEQVRBRlJBTUUgU8OTIENPTSBBUyBDT0xVTkFTIE5FQ0VTU8OBUklBU18NCg0KYGBge3J9DQpkYWRvc19wZXJpb2RvNCA8LSBzdWJzZXQoZGFkb3NfcGVyaW9kbzQsIHNlbGVjdCA9IGMoIkRBVEUiLCJUSU1FIiwiSlVMSUFOX0RBWVMiLCJNUFZQb3NpdGlvbiIsIk4yT19kcnkiLCJDTzJfZHJ5IiwiQ0g0X2RyeSIsIkgyTyIsIk5IMyIpKQ0KcHJpbnQoZGFkb3NfcGVyaW9kbzQpDQpgYGANCg0KIyMgX0NSSUFSIENPTFVOQSBEQVRBVEVNUE9fDQoNCmBgYHtyfQ0KZGFkb3NfcGVyaW9kbzQkREFUQVRFTVBPIDwtIHltZF9obXMocGFzdGUoZGFkb3NfcGVyaW9kbzQkREFURSwgZGFkb3NfcGVyaW9kbzQkVElNRSksIHR6ID0gIlVUQyIpDQpoZWFkKGRhZG9zX3BlcmlvZG80JERBVEFURU1QTykNCnByaW50KGRhZG9zX3BlcmlvZG80KQ0KYGBgDQoNCiMjIF9BU1NJR05BUiBTQU1QTEUgTlVNQkVSU18NCg0KYGBge3J9DQp2bnVtcyA8LSBkYWRvc19wZXJpb2RvNCRNUFZQb3NpdGlvbg0KcmxlX3ZudW1zIDwtIHJsZSh2bnVtcykNCmRhZG9zX3BlcmlvZG80JHNhbXBsZW51bSA8LSByZXAoc2VxX2Fsb25nKHJsZV92bnVtcyRsZW5ndGhzKSwgcmxlX3ZudW1zJGxlbmd0aHMpDQpwcmludChzdW1tYXJ5KGRhZG9zX3BlcmlvZG80JHNhbXBsZW51bSkpDQpgYGANCg0KIyMgX0ZJTFRSQVIgT1MgREFET1MsIFRJUkFSIE8gUFJJTUVJUk8gTUlOVVRPIERFIENBREEgQ0FNQVJBXw0KDQpgYGB7cn0NCmRhZG9zX3BlcmlvZG80ICU+JQ0KICBmaWx0ZXIoTVBWUG9zaXRpb24gPT0gZmxvb3IoTVBWUG9zaXRpb24pKSAlPiUNCiAgYXJyYW5nZShEQVRBVEVNUE8pICU+JQ0KICBncm91cF9ieShzYW1wbGVudW0pICU+JQ0KICBtdXRhdGUoZWxhcHNlZF9zZWNvbmRzID0gYXMubnVtZXJpYyhEQVRBVEVNUE8gLSBtaW4oREFUQVRFTVBPKSkpICU+JQ0KICBmaWx0ZXIoZWxhcHNlZF9zZWNvbmRzID49IDYwICYgZWxhcHNlZF9zZWNvbmRzIDw9IDE4MCkgJT4lDQogIGZpbHRlcighTVBWUG9zaXRpb24gPT0gMCkgJT4lDQogIG5hLm9taXQoKSAtPiBsaW1wb19kYWRvc19wZXJpb2RvNA0KDQpwcmludChsaW1wb19kYWRvc19wZXJpb2RvNCkNCmBgYA0KDQojIyBfQ0FSUkVHQVIgSU5GT1JNQcOHw5VFUyBTT0JSRSBPUyBBTklNQUlTIE5BUyBDQU1BUkFTXw0KDQpgYGB7cn0NCmluZm9fcGVyaW9kbzQgPSByZWFkLmNzdigiQzovVXNlcnMvU2Ftc3VuZy9PbmVEcml2ZS9Eb2N1bWVudG9zLzEgLSBQw7NzRG9jLzIgLSBGQVBFU1AgLSBTaWx2aXBhc3RvcmlsL1Jlc3BvbnNhYmlsaWRhZGVzL1BpY2Fycm8vTGF1cmEvUGVyaW9kbyA0L0luZm9wb3NpdGlvbjQuY3N2IikNCmBgYA0KDQojIyBfRkFaRVIgVU1BIE1FRElBTkEgRE9TIEdBU0VTIFVTQU5ETyBPUyBEQURPUyBERSAzIE1JTl8NCg0KYGBge3J9DQpsaW1wb19kYWRvc19wZXJpb2RvNCAlPiUNCiAgICBtdXRhdGUodGltZW9mZGF5ID0gaG91cihEQVRBVEVNUE8pKSAlPiUNCiAgICBzdW1tYXJpemUoREFUQVRFTVBPID0gbWVkaWFuKERBVEFURU1QTyksIA0KICAgICAgICAgICAgICBKVUxJQU5fREFZUyA9IG1lZGlhbihKVUxJQU5fREFZUyksDQogICAgICAgICAgICAgIE1QVlBvc2l0aW9uID0gbWVkaWFuKE1QVlBvc2l0aW9uKSwNCiAgICAgICAgICAgICAgTjJPX2RyeSA9IG1lZGlhbihOMk9fZHJ5KSwNCiAgICAgICAgICAgICAgQ08yX2RyeSA9IG1lZGlhbihDTzJfZHJ5KSwNCiAgICAgICAgICAgICAgQ0g0X2RyeSA9IG1lZGlhbihDSDRfZHJ5KSwNCiAgICAgICAgICAgICAgSDJPID0gbWVkaWFuKEgyTyksDQogICAgICAgICAgICAgIE5IMyA9IG1lZGlhbihOSDMpLA0KICAgICAgICAgICAgICBzYW1wbGVudW0gPSBtZWRpYW4oc2FtcGxlbnVtKSklPiUNCiAgIHJpZ2h0X2pvaW4oaW5mb19wZXJpb2RvNCwgYnkgPSAiTVBWUG9zaXRpb24iKSU+JQ0KICAgcmVsb2NhdGUoYW5pbWFsLCB0cmF0LCBNUFZQb3NpdGlvbiwgTjJPX2RyeSwgQ08yX2RyeSwgQ0g0X2RyeSwgSDJPLCBOSDMsIERBVEFURU1QTywgSlVMSUFOX0RBWVMsIHNhbXBsZW51bSklPiUNCiAgIGFycmFuZ2UoYW5pbWFsKSAtPiBtZWRpYW5fZGFkb3NfcGVyaW9kbzQNCm1lZGlhbl9kYWRvc19wZXJpb2RvND1zdWJzZXQobWVkaWFuX2RhZG9zX3BlcmlvZG80LCBhbmltYWwhPSAiTkEiKQ0KcHJpbnQobWVkaWFuX2RhZG9zX3BlcmlvZG80KQ0KYGBgDQoNCiMjIF9GSUxUUkFSIE5PIFRFTVBPIERFU0VKQURPXw0KDQpgYGB7cn0NCm1lZGlhbl9kYWRvc19wZXJpb2RvNCREQVRBVEVNUE8gPSBhcy5QT1NJWGN0KG1lZGlhbl9kYWRvc19wZXJpb2RvNCREQVRBVEVNUE8sIGZvcm1hdCA9ICIlWS0lbS0lZCAlSDolTTolUyIsdHogPSAiQW1lcmljYS9TYW9fUGF1bG8iKQ0Kc3RyKG1lZGlhbl9kYWRvc19wZXJpb2RvNCkNCg0KIyBEZWZpbmEgb3MgaW50ZXJ2YWxvcyBkZXNlamFkb3MNCmluaWNpbzEgPSBhcy5QT1NJWGN0KCIyMDI0LTEyLTA4IDA5OjAwOjAwIiwgdHogPSAiQW1lcmljYS9TYW9fUGF1bG8iKQ0KZmltMSAgICA9IGFzLlBPU0lYY3QoIjIwMjQtMTItMDkgMDg6MDA6MDAiLCB0eiA9ICJBbWVyaWNhL1Nhb19QYXVsbyIpDQoNCmluaWNpbzIgPSBhcy5QT1NJWGN0KCIyMDI0LTEyLTA5IDA5OjAwOjAwIiwgdHogPSAiQW1lcmljYS9TYW9fUGF1bG8iKQ0KZmltMiAgICA9IGFzLlBPU0lYY3QoIjIwMjQtMTItMTAgMDg6MDA6MDAiLCB0eiA9ICJBbWVyaWNhL1Nhb19QYXVsbyIpDQoNCiMgRmlsdHJlIG9zIGRhZG9zIHF1ZSBlc3RlamFtIGVtIHVtIGRvcyBkb2lzIGludGVydmFsb3MNCmRmX2ZpbHRyYWRvNCA9IG1lZGlhbl9kYWRvc19wZXJpb2RvNFsNCiAgKG1lZGlhbl9kYWRvc19wZXJpb2RvNCREQVRBVEVNUE8gPj0gaW5pY2lvMSAmIG1lZGlhbl9kYWRvc19wZXJpb2RvNCREQVRBVEVNUE8gPD0gZmltMSkgfA0KICAobWVkaWFuX2RhZG9zX3BlcmlvZG80JERBVEFURU1QTyA+PSBpbmljaW8yICYgbWVkaWFuX2RhZG9zX3BlcmlvZG80JERBVEFURU1QTyA8PSBmaW0yKSwgDQpdDQoNClZpZXcoZGZfZmlsdHJhZG80KQ0Kc3VtbWFyeShkZl9maWx0cmFkbzQkREFUQVRFTVBPKQ0KYGBgDQoNCg0KDQojIyAqSlVOVEFSIFBFUklPRE9TIGUgRVhQT1JUQVIgREFET1MqDQoNCmBgYHtyfQ0KQWxsLnBlcmlvZHMgPC0gYmluZF9yb3dzKGRmX2ZpbHRyYWRvLCBkZl9maWx0cmFkbzIsIGRmX2ZpbHRyYWRvMywgZGZfZmlsdHJhZG80KQ0KVmlldyhBbGwucGVyaW9kcykNCndyaXRlLnRhYmxlKEFsbC5wZXJpb2RzLCBmaWxlID0gIkM6L1VzZXJzL1NhbXN1bmcvT25lRHJpdmUvRG9jdW1lbnRvcy8xIC0gUMOzc0RvYy8yIC0gRkFQRVNQIC0gU2lsdmlwYXN0b3JpbC9SZXNwb25zYWJpbGlkYWRlcy9QaWNhcnJvL0xhdXJhL0RhZG9zX0FsbC5wZXJpb2RzLmNzdiIsIHNlcCA9ICI7IiwgZGVjID0gIiwiLCByb3cubmFtZXMgPSBGQUxTRSkNCmBgYA0KDQojIyAqUExPVCoNCg0KYGBge3J9DQojIEV4ZW1wbG8gc2ltcGxlczogQ0g0X2RyeSBhbyBsb25nbyBkbyB0ZW1wbw0KcDE9Z2dwbG90KEFsbC5wZXJpb2RzLCBhZXMoeCA9IERBVEFURU1QTywgeSA9IENINF9kcnksIGNvbG9yID0gdHJhdCkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZmFjZXRfd3JhcCh+UGVyaW9kbyxzY2FsZXMgPSAiZnJlZV94IikgKw0KICBsYWJzKHggPSAiRGF0YSBlIEhvcmEiLCB5ID0gIkNINCAocHBtKSIsIHRpdGxlID0gIkNINF9kcnkgYW8gbG9uZ28gZG8gdGVtcG8gcG9yIHRyYXRhbWVudG8gZSBwZXLDrW9kbyIpICsNCiAgdGhlbWVfbWluaW1hbCgpKw0KIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpwMQ0KYGBgDQoNCg0K