Mapa Base
palacio_gobierno = fl.Map()
palacio_gobierno
Make this Notebook Trusted to load map: File -> Trust Notebook
Latitud - Longitud
# Mapa Interactivo - latitud - longitud
# Palacio de Gobierno -12.04464623130505, -77.02979723204017
# tiles: stamenterrain - stamentoner - stamenwatercolor - cartdbpositron - OpenStreetMap
palacio_gobierno = fl.Map(location=[-12.04464623130505, -77.02979723204017],zoom_start=16,tiles="stamenterrain")
palacio_gobierno
Make this Notebook Trusted to load map: File -> Trust Notebook
Marcadores - Círculos - MiniMap - Caso I
text_001 = "<b>Palacio de Gobierno</b>"
text_002 = "<b>Convento de Santo Domingo</b>"
text_003 = "<b>Convento de San Francisco</b>"
img_001 = "python_logo.png"
palacio_gobierno = fl.Map(location=[-12.045821404826157, -77.03054825051527],zoom_start=16,tiles="stamenterrain")
fl.Marker(location=[-12.04464623130505, -77.02979723204017],icon=fl.Icon(color="darkblue",icon="fire"),
popup =fl.Popup(text_001,max_width=200)).add_to(palacio_gobierno) # Palacio de Gobierno
fl.Marker(location=[-12.044142583935876, -77.03202882979477],icon=fl.Icon(color="darkblue",icon="cloud"),
popup =fl.Popup(text_002,max_width=200)).add_to(palacio_gobierno) # Convento de Santo Domingo
fl.Marker(location=[-12.045128892480767, -77.02697554834083],icon=fl.Icon(color="darkblue",icon="ok-sign"),
popup =fl.Popup(text_003,max_width=200)).add_to(palacio_gobierno) # Convento de San Francisco
fl.Circle(location=[-12.04464623130505, -77.02979723204017],color="orange",fill_color="red",weight=4,fill_opacity=0.4,radius=40,tooltip="La Casa de Pizarro").add_to(palacio_gobierno)
fl.Circle(location=[-12.044142583935876, -77.03202882979477],color="red",fill_color="red",weight=4,fill_opacity=0.4,radius=40,tooltip="Santo Domingo").add_to(palacio_gobierno)
fl.Circle(location=[-12.045128892480767, -77.02697554834083],color="blue",fill_color="red",weight=4,fill_opacity=0.4,radius=40,tooltip="San Francisco").add_to(palacio_gobierno)
FloatImage(img_001,left=90,bottom=90).add_to(palacio_gobierno)
minimap = MiniMap(tile_layer="stamenterrain",position="bottomleft")
# Para que coincidan tanto el Mapa Base como el minimap se debe utilizar el parametro tile_layer
palacio_gobierno.add_child(minimap)
Make this Notebook Trusted to load map: File -> Trust Notebook
Marcadores - Pandas - Data Frame - Caso II
dataframe_centro = pd.DataFrame({'lugar':['Palacio de Gobierno','Convento de Santo Domingo','Convento de San Francisco'],
'latitud':[-12.0441216,-12.04414258,-12.04514988],
'longitud':[-77.02953974,-77.0320181,-77.02701846],
'simbolo':['ok-sign','cloud','fire'],
'color':['orange','blue','purple']})
dataframe_centro
centro_lima = fl.Map(location=[-12.045842390020844, -77.03055897935063],zoom_start=16)
for i in dataframe_centro.itertuples():
fl.Marker(location=[i.latitud,i.longitud],icon=fl.Icon(icon=i.simbolo,color=i.color),popup=fl.Popup(i.lugar,max_width=200)).add_to(centro_lima)
centro_lima
Make this Notebook Trusted to load map: File -> Trust Notebook
Marcadores - Pandas - Caso III
puntos = pd.read_csv("puntos.txt")
puntos
data_puntos = pd.DataFrame(puntos)
centro_lima = fl.Map(location=[-12.045821404826157, -77.03053752167992],zoom_start=16)
for i in data_puntos.itertuples():
fl.Marker(location=[i.latitud,i.longitud]).add_to(centro_lima)
centro_lima
Make this Notebook Trusted to load map: File -> Trust Notebook
LS0tDQp0aXRsZTogIk1hcGFzIEludGVyYWN0aXZvcyBlbiBQeXRob24iDQphdXRob3I6ICJSZW56byBDw6FjZXJlcyBSb3NzaSINCmRhdGU6ICIyMDIyLzAyLzIzIg0Kc3VidGl0bGU6IEZvbGl1bSAtIExlYWZsZXQgLSBSTWFya2Rvd24NCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgc2VsZl9jb250YWluZWQ6IG5vDQotLS0NCg0KPCEtLSBDcmVhbmRvIG1hcGFzIGludGVyYWN0aXZvcyBlbiBQeXRob24gdXNhbmRvIGxhIGxpYnJlcsOtYSBGb2xpdW0gLS0+DQoNCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9DQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCg0KbGlicmFyeShyZXRpY3VsYXRlKQ0KDQp1c2VfcHl0aG9uKCJDOi9Vc2Vycy9yZW56b3Jvc3Npdi9BcHBEYXRhL0xvY2FsL1Byb2dyYW1zL1B5dGhvbi9QeXRob24zMTAvcHl0aG9uLmV4ZSIpDQoNCmBgYA0KDQpgYGB7cHl0aG9uLGluY2x1ZGU9RkFMU0V9DQoNCiMgQ3JlYXIgTWFwYXMgSW50ZXJhY3Rpdm9zIGVuIFB5dGhvbiAtIExpYnJlcsOtYSBGb2xpdW0NCg0KIyBDYXJnYXIgbGlicmVyw61hcyB5IHBsdWdpbnMNCg0KaW1wb3J0IGZvbGl1bSBhcyBmbA0KDQppbXBvcnQgcGFuZGFzIGFzIHBkDQoNCmZyb20gZm9saXVtLnBsdWdpbnMgaW1wb3J0IE1pbmlNYXANCg0KZnJvbSBmb2xpdW0ucGx1Z2lucyBpbXBvcnQgRmxvYXRJbWFnZQ0KYGBgDQoNCiMjIyBNYXBhIEJhc2UNCg0KYGBge3B5dGhvbn0NCnBhbGFjaW9fZ29iaWVybm8gPSBmbC5NYXAoKQ0KDQpwYWxhY2lvX2dvYmllcm5vDQpgYGANCg0KDQojIyMgTGF0aXR1ZCAtIExvbmdpdHVkDQoNCmBgYHtweXRob259DQojIE1hcGEgSW50ZXJhY3Rpdm8gLSBsYXRpdHVkIC0gbG9uZ2l0dWQNCg0KIyBQYWxhY2lvIGRlIEdvYmllcm5vIC0xMi4wNDQ2NDYyMzEzMDUwNSwgLTc3LjAyOTc5NzIzMjA0MDE3DQoNCiMgdGlsZXM6IHN0YW1lbnRlcnJhaW4gLSBzdGFtZW50b25lciAtIHN0YW1lbndhdGVyY29sb3IgLSBjYXJ0ZGJwb3NpdHJvbiAtIE9wZW5TdHJlZXRNYXANCg0KcGFsYWNpb19nb2JpZXJubyA9IGZsLk1hcChsb2NhdGlvbj1bLTEyLjA0NDY0NjIzMTMwNTA1LCAtNzcuMDI5Nzk3MjMyMDQwMTddLHpvb21fc3RhcnQ9MTYsdGlsZXM9InN0YW1lbnRlcnJhaW4iKQ0KDQoNCnBhbGFjaW9fZ29iaWVybm8NCmBgYA0KDQojIyMgTWFyY2Fkb3JlcyAtIEPDrXJjdWxvcyAtIFBvcHVwIC0gTG9nbw0KDQpgYGB7cHl0aG9uLHJlc3VsdHM9J2hpZGUnfQ0KIyBNYXBhIEludGVyYWN0aXZvIC0gbGF0aXR1ZCAtIGxvbmdpdHVkDQoNCiMgUGFsYWNpbyBkZSBHb2JpZXJubyAtMTIuMDQ0NjQ2MjMxMzA1MDUsIC03Ny4wMjk3OTcyMzIwNDAxNw0KDQojIEHDsWFkaXIgbWFyY2Fkb3IsY2lyY3Vsbyxwb3B1cCxsb2dvDQoNCnRleHRfMDAxID0gIjxiPlBhbGFjaW8gZGUgR29iaWVybm88L2I+Ig0KDQppbWdfMDAxID0gInB5dGhvbl9sb2dvLnBuZyINCg0KcGFsYWNpb19nb2JpZXJubyA9IGZsLk1hcChsb2NhdGlvbj1bLTEyLjA0NDY0NjIzMTMwNTA1LCAtNzcuMDI5Nzk3MjMyMDQwMTddLHpvb21fc3RhcnQ9MTYpDQoNCmZsLk1hcmtlcihsb2NhdGlvbj1bLTEyLjA0NDY0NjIzMTMwNTA1LCAtNzcuMDI5Nzk3MjMyMDQwMTddLGljb249ZmwuSWNvbihjb2xvcj0iZGFya2JsdWUiLGljb249ImZpcmUiKSwNCiAgICAgICAgIHBvcHVwID1mbC5Qb3B1cCh0ZXh0XzAwMSxtYXhfd2lkdGg9MjAwKSkuYWRkX3RvKHBhbGFjaW9fZ29iaWVybm8pDQoNCmZsLkNpcmNsZShsb2NhdGlvbj1bLTEyLjA0NDY0NjIzMTMwNTA1LCAtNzcuMDI5Nzk3MjMyMDQwMTddLA0KICAgICAgICAgIGNvbG9yPSJvcmFuZ2UiLGZpbGxfY29sb3I9InJlZCIsd2VpZ2h0PTQsZmlsbF9vcGFjaXR5PTAuNCxyYWRpdXM9NDAsdG9vbHRpcD0iTGEgQ2FzYSBkZSBQaXphcnJvIikuYWRkX3RvKHBhbGFjaW9fZ29iaWVybm8pDQoNCkZsb2F0SW1hZ2UoaW1nXzAwMSxsZWZ0PTkwLGJvdHRvbT05MCkuYWRkX3RvKHBhbGFjaW9fZ29iaWVybm8pDQoNCg0KcGFsYWNpb19nb2JpZXJubw0KYGBgDQoNCiMjIyBUaWxlcyBNZW51DQoNCmBgYHtweXRob24scmVzdWx0cz0naGlkZSd9DQp0ZXh0XzAwMSA9ICI8Yj5QYWxhY2lvIGRlIEdvYmllcm5vPC9iPiINCg0KaW1nXzAwMSA9ICJweXRob25fbG9nby5wbmciDQoNCnBhbGFjaW9fZ29iaWVybm8gPSBmbC5NYXAobG9jYXRpb249Wy0xMi4wNDQ2NDYyMzEzMDUwNSwgLTc3LjAyOTc5NzIzMjA0MDE3XSx6b29tX3N0YXJ0PTE2KQ0KDQpmbC5NYXJrZXIobG9jYXRpb249Wy0xMi4wNDQ2NDYyMzEzMDUwNSwgLTc3LjAyOTc5NzIzMjA0MDE3XSxpY29uPWZsLkljb24oY29sb3I9ImRhcmtibHVlIixpY29uPSJmaXJlIiksDQogICAgICAgICBwb3B1cCA9ZmwuUG9wdXAodGV4dF8wMDEsbWF4X3dpZHRoPTIwMCkpLmFkZF90byhwYWxhY2lvX2dvYmllcm5vKQ0KDQpmbC5DaXJjbGUobG9jYXRpb249Wy0xMi4wNDQ2NDYyMzEzMDUwNSwgLTc3LjAyOTc5NzIzMjA0MDE3XSwNCiAgICAgICAgICBjb2xvcj0ib3JhbmdlIixmaWxsX2NvbG9yPSJyZWQiLHdlaWdodD00LGZpbGxfb3BhY2l0eT0wLjQscmFkaXVzPTQwLHRvb2x0aXA9IkxhIENhc2EgZGUgUGl6YXJybyIpLmFkZF90byhwYWxhY2lvX2dvYmllcm5vKQ0KDQpGbG9hdEltYWdlKGltZ18wMDEsbGVmdD05MCxib3R0b209OTApLmFkZF90byhwYWxhY2lvX2dvYmllcm5vKQ0KDQpmbC5UaWxlTGF5ZXIoInN0YW1lbnRlcnJhaW4iKS5hZGRfdG8ocGFsYWNpb19nb2JpZXJubykNCg0KZmwuVGlsZUxheWVyKCJzdGFtZW53YXRlcmNvbG9yIikuYWRkX3RvKHBhbGFjaW9fZ29iaWVybm8pDQoNCmZsLlRpbGVMYXllcigic3RhbWVudG9uZXIiKS5hZGRfdG8ocGFsYWNpb19nb2JpZXJubykNCg0KZmwuVGlsZUxheWVyKCJjYXJ0b2RicG9zaXRyb24iKS5hZGRfdG8ocGFsYWNpb19nb2JpZXJubykNCg0KZmwuVGlsZUxheWVyKCJPcGVuU3RyZWV0TWFwIikuYWRkX3RvKHBhbGFjaW9fZ29iaWVybm8pDQoNCmZsLkxheWVyQ29udHJvbChwb3NpdGlvbj0iYm90dG9tbGVmdCIpLmFkZF90byhwYWxhY2lvX2dvYmllcm5vKQ0KDQoNCnBhbGFjaW9fZ29iaWVybm8NCmBgYA0KDQojIyMgQ29uZmlndXJhY2nDs24gUG9wdXANCg0KYGBge3B5dGhvbixyZXN1bHRzPSdoaWRlJ30NCiMgQ29uZmlndXJhY2nDs24gUG9wdXANCg0KDQoNCmltZ18wMDEgPSAicHl0aG9uX2xvZ28ucG5nIg0KDQoNCmh0bWw9JycnDQo8Yj5MdWdhcjogUGFsYWNpbyBkZSBHb2JpZXJubzwvYj48YnI+DQo8Yj5MYXRpdHVkOiAtMTIuMDQ0NTYyMjkwMTQyMDY4PC9iPjxicj4NCjxiPkxvbmdpdHVkOiAtNzcuMDI5NzY1MDQ1NTcxODQ8L2I+PGJyPjxicj4NCjxjZW50ZXI+PGltZyBzcmM9Imh0dHBzOi8vYml0Lmx5LzNIWFplTmsiIHdpZHRoPTIwMCBoZWlnaHQ9MTAwPjwvY2VudGVyPg0KJycnDQoNCmlmcmFtZSA9IGZsLklGcmFtZShodG1sPWh0bWwsd2lkdGg9MjUwLGhlaWdodD0yMDApDQoNCnBhbGFjaW9fZ29iaWVybm8gPSBmbC5NYXAobG9jYXRpb249Wy0xMi4wNDQ2NDYyMzEzMDUwNSwgLTc3LjAyOTc5NzIzMjA0MDE3XSx6b29tX3N0YXJ0PTE2KQ0KDQpmbC5NYXJrZXIobG9jYXRpb249Wy0xMi4wNDQ2NDYyMzEzMDUwNSwgLTc3LjAyOTc5NzIzMjA0MDE3XSxpY29uPWZsLkljb24oY29sb3I9ImRhcmtibHVlIixpY29uPSJmaXJlIiksDQogICAgICAgICBwb3B1cCA9ZmwuUG9wdXAoaWZyYW1lKSkuYWRkX3RvKHBhbGFjaW9fZ29iaWVybm8pDQoNCmZsLkNpcmNsZShsb2NhdGlvbj1bLTEyLjA0NDY0NjIzMTMwNTA1LCAtNzcuMDI5Nzk3MjMyMDQwMTddLA0KICAgICAgICAgIGNvbG9yPSJvcmFuZ2UiLGZpbGxfY29sb3I9InJlZCIsd2VpZ2h0PTQsZmlsbF9vcGFjaXR5PTAuNCxyYWRpdXM9NDAsdG9vbHRpcD0iTGEgQ2FzYSBkZSBQaXphcnJvIikuYWRkX3RvKHBhbGFjaW9fZ29iaWVybm8pDQoNCkZsb2F0SW1hZ2UoaW1nXzAwMSxsZWZ0PTkwLGJvdHRvbT05MCkuYWRkX3RvKHBhbGFjaW9fZ29iaWVybm8pDQoNCmZsLlRpbGVMYXllcigic3RhbWVudGVycmFpbiIpLmFkZF90byhwYWxhY2lvX2dvYmllcm5vKQ0KDQpmbC5UaWxlTGF5ZXIoInN0YW1lbndhdGVyY29sb3IiKS5hZGRfdG8ocGFsYWNpb19nb2JpZXJubykNCg0KZmwuVGlsZUxheWVyKCJzdGFtZW50b25lciIpLmFkZF90byhwYWxhY2lvX2dvYmllcm5vKQ0KDQpmbC5UaWxlTGF5ZXIoImNhcnRvZGJwb3NpdHJvbiIpLmFkZF90byhwYWxhY2lvX2dvYmllcm5vKQ0KDQpmbC5UaWxlTGF5ZXIoIk9wZW5TdHJlZXRNYXAiKS5hZGRfdG8ocGFsYWNpb19nb2JpZXJubykNCg0KZmwuTGF5ZXJDb250cm9sKHBvc2l0aW9uPSJib3R0b21sZWZ0IikuYWRkX3RvKHBhbGFjaW9fZ29iaWVybm8pDQoNCg0KcGFsYWNpb19nb2JpZXJubw0KYGBgDQoNCiMjIyBNYXJjYWRvcmVzIC0gQ8OtcmN1bG9zIC0gTWluaU1hcCAtIENhc28gSQ0KDQpgYGB7cHl0aG9uLHJlc3VsdHM9J2hpZGUnfQ0KDQoNCnRleHRfMDAxID0gIjxiPlBhbGFjaW8gZGUgR29iaWVybm88L2I+Ig0KDQp0ZXh0XzAwMiA9ICI8Yj5Db252ZW50byBkZSBTYW50byBEb21pbmdvPC9iPiINCg0KdGV4dF8wMDMgPSAiPGI+Q29udmVudG8gZGUgU2FuIEZyYW5jaXNjbzwvYj4iDQoNCmltZ18wMDEgPSAicHl0aG9uX2xvZ28ucG5nIg0KDQpwYWxhY2lvX2dvYmllcm5vID0gZmwuTWFwKGxvY2F0aW9uPVstMTIuMDQ1ODIxNDA0ODI2MTU3LCAtNzcuMDMwNTQ4MjUwNTE1MjddLHpvb21fc3RhcnQ9MTYsdGlsZXM9InN0YW1lbnRlcnJhaW4iKQ0KDQpmbC5NYXJrZXIobG9jYXRpb249Wy0xMi4wNDQ2NDYyMzEzMDUwNSwgLTc3LjAyOTc5NzIzMjA0MDE3XSxpY29uPWZsLkljb24oY29sb3I9ImRhcmtibHVlIixpY29uPSJmaXJlIiksDQogICAgICAgICBwb3B1cCA9ZmwuUG9wdXAodGV4dF8wMDEsbWF4X3dpZHRoPTIwMCkpLmFkZF90byhwYWxhY2lvX2dvYmllcm5vKSAjIFBhbGFjaW8gZGUgR29iaWVybm8NCg0KDQpmbC5NYXJrZXIobG9jYXRpb249Wy0xMi4wNDQxNDI1ODM5MzU4NzYsIC03Ny4wMzIwMjg4Mjk3OTQ3N10saWNvbj1mbC5JY29uKGNvbG9yPSJkYXJrYmx1ZSIsaWNvbj0iY2xvdWQiKSwNCiAgICAgICAgIHBvcHVwID1mbC5Qb3B1cCh0ZXh0XzAwMixtYXhfd2lkdGg9MjAwKSkuYWRkX3RvKHBhbGFjaW9fZ29iaWVybm8pICMgQ29udmVudG8gZGUgU2FudG8gRG9taW5nbw0KDQpmbC5NYXJrZXIobG9jYXRpb249Wy0xMi4wNDUxMjg4OTI0ODA3NjcsIC03Ny4wMjY5NzU1NDgzNDA4M10saWNvbj1mbC5JY29uKGNvbG9yPSJkYXJrYmx1ZSIsaWNvbj0ib2stc2lnbiIpLA0KICAgICAgICAgcG9wdXAgPWZsLlBvcHVwKHRleHRfMDAzLG1heF93aWR0aD0yMDApKS5hZGRfdG8ocGFsYWNpb19nb2JpZXJubykgIyBDb252ZW50byBkZSBTYW4gRnJhbmNpc2NvDQoNCg0KZmwuQ2lyY2xlKGxvY2F0aW9uPVstMTIuMDQ0NjQ2MjMxMzA1MDUsIC03Ny4wMjk3OTcyMzIwNDAxN10sY29sb3I9Im9yYW5nZSIsZmlsbF9jb2xvcj0icmVkIix3ZWlnaHQ9NCxmaWxsX29wYWNpdHk9MC40LHJhZGl1cz00MCx0b29sdGlwPSJMYSBDYXNhIGRlIFBpemFycm8iKS5hZGRfdG8ocGFsYWNpb19nb2JpZXJubykNCg0KZmwuQ2lyY2xlKGxvY2F0aW9uPVstMTIuMDQ0MTQyNTgzOTM1ODc2LCAtNzcuMDMyMDI4ODI5Nzk0NzddLGNvbG9yPSJyZWQiLGZpbGxfY29sb3I9InJlZCIsd2VpZ2h0PTQsZmlsbF9vcGFjaXR5PTAuNCxyYWRpdXM9NDAsdG9vbHRpcD0iU2FudG8gRG9taW5nbyIpLmFkZF90byhwYWxhY2lvX2dvYmllcm5vKQ0KDQpmbC5DaXJjbGUobG9jYXRpb249Wy0xMi4wNDUxMjg4OTI0ODA3NjcsIC03Ny4wMjY5NzU1NDgzNDA4M10sY29sb3I9ImJsdWUiLGZpbGxfY29sb3I9InJlZCIsd2VpZ2h0PTQsZmlsbF9vcGFjaXR5PTAuNCxyYWRpdXM9NDAsdG9vbHRpcD0iU2FuIEZyYW5jaXNjbyIpLmFkZF90byhwYWxhY2lvX2dvYmllcm5vKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQpGbG9hdEltYWdlKGltZ18wMDEsbGVmdD05MCxib3R0b209OTApLmFkZF90byhwYWxhY2lvX2dvYmllcm5vKQ0KDQoNCm1pbmltYXAgPSBNaW5pTWFwKHRpbGVfbGF5ZXI9InN0YW1lbnRlcnJhaW4iLHBvc2l0aW9uPSJib3R0b21sZWZ0IikNCg0KIyBQYXJhIHF1ZSBjb2luY2lkYW4gdGFudG8gZWwgTWFwYSBCYXNlIGNvbW8gZWwgbWluaW1hcCBzZSBkZWJlIHV0aWxpemFyIGVsIHBhcmFtZXRybyB0aWxlX2xheWVyDQoNCnBhbGFjaW9fZ29iaWVybm8uYWRkX2NoaWxkKG1pbmltYXApDQoNCmBgYA0KDQojIyMgTWFyY2Fkb3JlcyAtIFBhbmRhcyAtIERhdGEgRnJhbWUgLSBDYXNvIElJDQoNCmBgYHtweXRob24scmVzdWx0cz0naGlkZSd9DQoNCmRhdGFmcmFtZV9jZW50cm8gPSBwZC5EYXRhRnJhbWUoeydsdWdhcic6WydQYWxhY2lvIGRlIEdvYmllcm5vJywnQ29udmVudG8gZGUgU2FudG8gRG9taW5nbycsJ0NvbnZlbnRvIGRlIFNhbiBGcmFuY2lzY28nXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhdGl0dWQnOlstMTIuMDQ0MTIxNiwtMTIuMDQ0MTQyNTgsLTEyLjA0NTE0OTg4XSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvbmdpdHVkJzpbLTc3LjAyOTUzOTc0LC03Ny4wMzIwMTgxLC03Ny4wMjcwMTg0Nl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaW1ib2xvJzpbJ29rLXNpZ24nLCdjbG91ZCcsJ2ZpcmUnXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJzpbJ29yYW5nZScsJ2JsdWUnLCdwdXJwbGUnXX0pDQoNCmRhdGFmcmFtZV9jZW50cm8NCg0KY2VudHJvX2xpbWEgPSBmbC5NYXAobG9jYXRpb249Wy0xMi4wNDU4NDIzOTAwMjA4NDQsIC03Ny4wMzA1NTg5NzkzNTA2M10sem9vbV9zdGFydD0xNikNCg0KZm9yIGkgaW4gZGF0YWZyYW1lX2NlbnRyby5pdGVydHVwbGVzKCk6DQogICAgZmwuTWFya2VyKGxvY2F0aW9uPVtpLmxhdGl0dWQsaS5sb25naXR1ZF0saWNvbj1mbC5JY29uKGljb249aS5zaW1ib2xvLGNvbG9yPWkuY29sb3IpLHBvcHVwPWZsLlBvcHVwKGkubHVnYXIsbWF4X3dpZHRoPTIwMCkpLmFkZF90byhjZW50cm9fbGltYSkNCg0KY2VudHJvX2xpbWENCmBgYA0KDQojIyMgTWFyY2Fkb3JlcyAtIFBhbmRhcyAtIENhc28gSUlJDQoNCmBgYHtweXRob24scmVzdWx0cz0naGlkZSd9DQpwdW50b3MgPSBwZC5yZWFkX2NzdigicHVudG9zLnR4dCIpDQoNCnB1bnRvcw0KDQpkYXRhX3B1bnRvcyA9IHBkLkRhdGFGcmFtZShwdW50b3MpDQoNCg0KY2VudHJvX2xpbWEgPSBmbC5NYXAobG9jYXRpb249Wy0xMi4wNDU4MjE0MDQ4MjYxNTcsIC03Ny4wMzA1Mzc1MjE2Nzk5Ml0sem9vbV9zdGFydD0xNikNCg0KZm9yIGkgaW4gZGF0YV9wdW50b3MuaXRlcnR1cGxlcygpOg0KICAgIGZsLk1hcmtlcihsb2NhdGlvbj1baS5sYXRpdHVkLGkubG9uZ2l0dWRdKS5hZGRfdG8oY2VudHJvX2xpbWEpDQoNCmNlbnRyb19saW1hDQpgYGANCg0KDQo=