Content-Type: multipart/related; start=; boundary=----------GBbmI8EIepIUIg6SyJONsr Content-Location: http://www.ine.es/jaxi/menu.do?type=pcaxis&path=/t25/p458&file=inebase Subject: =?utf-8?Q?Instituto=20Nacional=20de=20Estad=C3=ADstica.=20(National=20Statistics=20Institute)?= MIME-Version: 1.0 ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=menu.htm Content-Type: text/html; charset=ISO-8859-15; name=menu.htm Content-ID: Content-Location: http://www.ine.es/jaxi/menu.do?type=pcaxis&path=/t25/p458&file=inebase Content-Transfer-Encoding: Quoted-Printable = = = = = = = = = = Instituto Nacional de Estad=EDstica. (National Statistics Insti= tute) = = = = = = = = = = = =
= 3D"Logotipo
=
= =
= = =
=
= = =
=
    =
  • =
  • 3D"Restaurar
  • 3D"Aumentar=
  • = = = = =
  • = = = = = = 3D"(none)" = =
  • =
  • 3D"Contac=
  • 3D"Añadir
  • =
  • 3D"=
  • =
=
= =
= =
=
=
= = = = = = =
= = = = = = = = = = = = = = =
3D"Imprimir 3D= 3D"=
3D"Inici=
= =
=

3D"Foto" 3D"Lector 
La Encuesta de Presupuestos Familiar= es (EPF) iniciada en enero de 2006, sustituye a la Encuesta Con= tinua de Presupuestos Familiares (ECPF) base 1997, que con periodicidad = trimestral se realiz=F3 desde 1997 hasta 2005. La nueva encuesta suminis= tra informaci=F3n anual sobre la naturaleza y destino de los gastos de c= onsumo, as=ED como sobre diversas caracter=EDsticas relativas a las cond= iciones de vida de los hogares.

Los gastos de consumo se refieren = tanto al flujo monetario que destina el hogar al pago de determinados bi= enes y servicios de consumo final, como al valor de los bienes percibido= s en concepto de autoconsumo, autosuministro, salario en especie, comida= s gratuitas o bonificadas y alquiler imputado a la vivienda en la que re= side el hogar (cuando es propietario de la misma o la tiene cedida por o= tros hogares o instituciones). Los gastos se registran en el momento de = adquisici=F3n, independientemente de que el pago sea al contado o a plaz= os.

El tama=F1o de muestra es de aproximadamente 24.000 hogares al= a=F1o. Cada hogar permanece en la muestra dos a=F1os consecutivos, reno= v=E1ndose cada a=F1o la mitad de la muestra.

La encuesta proporcio= na estimaciones del gasto de consumo anual para el conjunto nacional y l= as comunidades aut=F3nomas y del consumo en cantidades f=EDsicas de dete= rminados bienes alimenticios para el conjunto nacional.

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= = = = = = Nivel, Calidad y Condiciones de Vida = = = =
= = = = = = Encuesta de Presupuestos Familiares. Ba= se 2006 = = = =
= = = = = = = = = = =
= = = = = = Resultados = = = =
= = = = = = =DAltimo dato publicado: a=F1o 2009 (27 octubre 2010)    Plan de difusi=F3n. Nota  Con fecha 27 de octubre de 2010 se han publicado los = resultados detallados de la EPF para el a=F1o 2009 y se han puesto a dis= posici=F3n de los usuarios los ficheros microdato debidamente anonimizad= os relativos al a=F1o en cuesti=F3n. Con esta misma fecha se han revisad= o algunos datos de las tablas relativas a precios constantes de los a=F1= os 2007 y 2008. = = = =
= = = = = Nota de prensa = = = = =
= = = = = =
 
= = = =
= = = = = = = = = = =
= = = = = = Metodolog=EDa = = = =
= = = = = = Resumen metodol=F3gico = = = =
= = = = = Clasificaci=F3n de bienes y servicio= s. COICOP = = = = =
= = = = = Cuestionarios = = = = =
= = = = = =
= = = =
= = = = = = Otra informaci=F3n disponible = = = =
= = = = = = Serie enlazada   Notas so= bre el enlace = = = =
= = = = = = Microdatos de la encuesta = = = =
= = = = = =
= = = =
= = = = = = M=F3= dulo Piloto de la EPF 2007. Gasto de los hogares en educaci=F3n = = = =
= = = = = = : Dic/2008. El ocio en cifras = = = =
= = = = = =
= = = =
= = = = = = Otros enlaces de interes en INEbase = = = =
= = = = = = En= cuesta continua de presupuestos familiares. Base 1997 = = = =


= =
= =
= =
------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=inebase_rel.css Content-Type: text/css; charset=ISO-8859-15; name=inebase_rel.css Content-Location: http://www.ine.es/inebase/css/inebase_rel.css Content-Transfer-Encoding: 8bit A:visited { color: purple; } A{ color: blue; } HR.SPR { color : #9E1B34; } TD.dattab { background : #ffffff; font : 0.75em Arial, sans-serif; color : #000000; text-align : right; white-space : nowrap; } TH.dattab { background : #fffcf0; text-align : left; } TH.seltab { background : #fffcf0; font : normal 0.8em Arial, sans-serif; text-align : left; } TH.cabtab { background : #ffd475; font : bold 0.8em Arial, sans-serif; color : #9E1B34; text-align : left; vertical-align : top; } TH.tittab { color : #9E1B34; text-align : left; font : bold 16 arial,sans-serif; } TH.subtittab { color : #9E1B34; text-align : left; font : normal 14 arial,sans-serif; } TABLE.DESCRIPCION { background : #fffcf0; font : 0.8em Arial, sans-serif; } TD.DSC { background : #ffd475; font : 0.9em Arial, sans-serif; width : 33%; border : 0px; margin : 0px 0px 0px 0px; padding : 5px; } TD.SPR { background : #fffcf0; font : 0.8em Arial, sans-serif; width : 0px; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 0px 0px 0px; } TD.MENU { background : #fffcf0; font : 0.8em Arial, sans-serif; width : 67%; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 0px 0px 0px; } TABLE.MENU { background : #fffcf0; font : 0.8em Arial, sans-serif; width : 100%; border : 0px; margin : 0px 0px; padding : 0px; } TD.N0 { background : #ffcc99; color : #9E1B34; font : bold 1em Arial, sans-serif; border : 0px; margin : 0px 0px 2px 0px; padding : 0px 8px 0px 10px; } TD.N1 { background : #ffd475; color : #9E1B34; font : bold 1em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 8px 0px 10px; } TD.T1 { background : #ffd475; color : #9E1B34; font : bold 1em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 5px 0px 10px; } TD.P1 { background : #ffd475; color : #9E1B34; font : bold 1.1em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 5px 0px 10px; } TD.P1R { background : #9E1B34; color : white; font : bold 1.1em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 5px 0px 10px; } TD.P2 { background : #ffcc99; font : bold 0.9em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 10px 0px 10px; } TD.P2A { background : #ffcc99; font : normal 0.8em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 10px 0px 10px; } TD.p5 { background : #ffcc99; font : bold 0.8em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 10px 0px 20px; } TD.T2 { background : #fffcf0; font : 0.8em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 20px 0px 30px; } TD.N2 { background : #fffcf0; font : 0.8em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 16px 0px 20px; } TD.M0 { font : 0.8em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 16px 0px 20px; text-align : center; top : auto; } TD.N3 { background : #fffcf0; font : bold 0.8em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 32px 0px 48px; } TD.T3 { background : #fffcf0; font : 0.8em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 20px 0px 30px; } TD.P3 { background : #fffcf0; font : 0.9em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 10px; padding : 2px 20px 2px 20px; } TD.RN { background : #fffcf0; font : 0.7em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 48px 0px 64px; } TD.RNn { background : #fffcf0; font : 0.8em Arial, sans-serif; border : 0px; padding : 0px 48px 0px 104px; } td.c1 { background : #ffcc99; color : #9E1B34; margin : 2px 0px 2px 0px; font : bold 0.8em Arial, Helvetica, sans-serif; } td.c2 { color : #9E1B34; margin : 2px 0px 2px 0px; font : normal 0.7em Arial, Helvetica, sans-serif; } td.c3 { background : #ffd475; } FONT.Cabecera { color : #a22538; font : 1.5em Arial, sans-serif; } .cambio { background : #ffcc99; color : #9E1B34; font : bold 0.9em Arial, sans-serif; border : 0px; padding : 2px 2px 2px 2px; } .ficha { color : #9E1B34; font : bold 0.8em Arial, sans-serif; margin-left: 20px; } .ap { color : #9E1B34; font : bold 0.90em Arial, sans-serif; margin-left: 30px; padding : 3px 10px 0px 20px; } .apnonm { color : #9E1B34; font : normal 0.8em Arial, sans-serif; margin-left: 20px; padding : 0px 20px 0px 35px; } .diez { background-color: #ffd475; font-family: Arial, helvetica, sans-serif; font-weight : bold; color: #9E1B34; } .diezn { background-color: #ffd475; font-family: Arial, helvetica, sans-serif; font-weight : normal; color: #9E1B34; } .ochorc { color: #9E1B34; font-family: Arial, helvetica, sans-serif; font-weight : normal; font-size : 0.85em; font-style : italic; } .apnon { color : #9E1B34; font : normal 0.90em Arial, sans-serif; margin-left: 30px; padding : 3px 10px 0px 20px; } .apnon2 { color : #9E1B34; font : normal 0.90em Arial, sans-serif; margin-left: 10px; } .apnonnom { color : #9E1B34; font : normal, Arial, sans-serif; } .app { color : #9E1B34; font : normal 0.8em Arial, sans-serif; margin-left: 20px; padding : 0px 20px 0px 50px; } .right { font : normal 0.8em Arial, sans-serif; padding-left : 250; } .p5a { background : #ffcc99; font : bold 0.90em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 8px 0px 10px; } .sinesp { margin-bottom : 0px; margin-top : -2px; padding : 2px 0px 0px 0px; } .SPR { background : #fffcf0; font : 0.8em Arial, sans-serif; margin : 2px 0px 2px 0px; } SELECT{ border : 1px; border-style : solid; border-color : #800000; color:#0000FF; font : 1em Arial, sans-serif; } .azuldiezu { color: Blue; } option.sinenlace_negro { color:black; } ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=inebase.js Content-Type: application/javascript; charset=ISO-8859-15; name=inebase.js Content-Location: http://www.ine.es/inebase/js/inebase.js Content-Transfer-Encoding: Base64 ZnVuY3Rpb24gYm90b24obixzcmMpIHsKICBkb2N1bWVudC5pbWFnZXNbbl0uc3Jj PXNyYzsKICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gYm90b24yKG4sc3JjKSB7 CiAgICAgICAgbi5zcmM9c3JjOwogICAgICAgIHJldHVybiB0cnVlOwp9CgoKZnVu Y3Rpb24gQ19JKCkgewogIGRvY3VtZW50LmZvcm1zWydDSSddLnN1Ym1pdCgpOwog IHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBTX1AobikgewogIGRvY3VtZW50LmZv cm1zW25dLnN1Ym1pdCgpOwogIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBVX00o bWVudSxvcGNpb24sbml2ZWwpIHsKICBkb2N1bWVudC5mb3Jtc1snQ0knXS5lbGVt ZW50c1snTSddLnZhbHVlPW1lbnU7CiAgZG9jdW1lbnQuZm9ybXNbJ0NJJ10uZWxl bWVudHNbJ08nXS52YWx1ZT1vcGNpb247CiAgZG9jdW1lbnQuZm9ybXNbJ0NJJ10u ZWxlbWVudHNbJ04nXS52YWx1ZT1uaXZlbDsKICBkb2N1bWVudC5mb3Jtc1snQ0kn XS5zdWJtaXQoKTsKICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gVV9NMihwYXRo LGZpbGUsbml2ZWwpIHsKICBkb2N1bWVudC5mb3Jtc1snbWVudWZvcm0nXS5lbGVt ZW50c1snZmlsZSddLnZhbHVlPWZpbGU7CiAgZG9jdW1lbnQuZm9ybXNbJ21lbnVm b3JtJ10uZWxlbWVudHNbJ3BhdGgnXS52YWx1ZT1wYXRoOwogIGRvY3VtZW50LmZv cm1zWydtZW51Zm9ybSddLnN1Ym1pdCgpOwp9CgoKLypmdW5jdGlvbiBVX00yKHBh dGgsZmlsZSxuaXZlbCkgewogIHZhciBVUkw9Ii9qYXhpL21lbnUuZG8/dHlwZT1w Y2F4aXMiOwogIHZhciBwYXRoVXJsPSIiOwogIHZhciBmaWxlVXJsPSIiOwoKICBp ZiAocGF0aCE9bnVsbCAmJiBwYXRoIT0iIikgcGF0aFVybD0iJnBhdGg9IitwYXRo OwogCiAgaWYgKGZpbGUhPW51bGwgJiYgZmlsZSE9IiIpIGZpbGVVcmw9IiZmaWxl PSIrZmlsZTsKCiAgZG9jdW1lbnQubG9jYXRpb24uaHJlZj1VUkwrcGF0aFVybCtm aWxlVXJsOwp9Ki8KCmZ1bmN0aW9uIEdUSUUoKSB7CiAgZG9jdW1lbnQuZm9ybXNb J0NJJ10uZWxlbWVudHNbJ08nXS52YWx1ZT0nZ3RpZSc7CiAgZG9jdW1lbnQuZm9y bXNbJ0NJJ10uc3VibWl0KCk7CiAgcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIE1l bnNhamUgKGZpY2hlcm8sc2Nyb2xsLGFuY2hvLGFsdG8pIHsKICB2YXIgdz1hbmNo bzsKICB2YXIgaD1hbHRvOwogIGlmIChzY3JvbGw9PTApewogICAgcHJvcD0ndG9v bGJhcj1ubyxsb2NhdGlvbj1ubyxkaXJlY3Rvcmllcz1ubyxzdGF0dXM9bm8sbWVu dWJhcj1ubyxzY3JvbGxiYXJzPW5vLHJlc2l6YWJsZT15ZXMsd2lkdGg9Jyt3Kycs aGVpZ2h0PScraAogICAgbXNnV2luZG93PXdpbmRvdy5vcGVuKGZpY2hlcm8sJ2xl Z2FsJyxwcm9wKQogIH0gZWxzZSB7CiAgICBwcm9wPSd0b29sYmFyPW5vLGxvY2F0 aW9uPW5vLGRpcmVjdG9yaWVzPW5vLHN0YXR1cz1ubyxtZW51YmFyPW5vLHNjcm9s bGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9Jyt3KycsaGVpZ2h0PScraAog ICAgbXNnV2luZG93PXdpbmRvdy5vcGVuKGZpY2hlcm8sJ2xlZ2FsJyxwcm9wKQog IH0KfQoKZnVuY3Rpb24gTWVuc2FqZTEgKGZpY2hlcm8xLHNjcm9sbCxhbmNobyxh bHRvKSB7CiAgdmFyIHc9YW5jaG87CiAgdmFyIGg9YWx0bzsKICBpZiAoc2Nyb2xs PT0wKXsKICAgIHByb3A9J3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sZGlyZWN0b3Jp ZXM9bm8sc3RhdHVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyxyZXNpemFi bGU9eWVzLHdpZHRoPScrdysnLGhlaWdodD0nK2gKICAgIG1zZ1dpbmRvdz13aW5k b3cub3BlbihmaWNoZXJvMSwnZmljaGEnLHByb3ApCiAgfSBlbHNlIHsKICAgIHBy b3A9J3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sZGlyZWN0b3JpZXM9bm8sc3RhdHVz PW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0 aD0nK3crJyxoZWlnaHQ9JytoCiAgICBtc2dXaW5kb3c9d2luZG93Lm9wZW4oZmlj aGVybzEsJ2ZpY2hhJyxwcm9wKQogIH0KfQoKZnVuY3Rpb24gTWVuc2FqZTIgKGZp Y2hlcm8yLHNjcm9sbCxhbmNobyxhbHRvKSB7CiAgdmFyIHc9YW5jaG87CiAgdmFy IGg9YWx0bzsKICBpZiAoc2Nyb2xsPT0wKXsKICAgIHByb3A9J3Rvb2xiYXI9bm8s bG9jYXRpb249bm8sZGlyZWN0b3JpZXM9bm8sc3RhdHVzPW5vLG1lbnViYXI9bm8s c2Nyb2xsYmFycz1ubyxyZXNpemFibGU9eWVzLHdpZHRoPScrdysnLGhlaWdodD0n K2gKICAgIG1zZ1dpbmRvdz13aW5kb3cub3BlbihmaWNoZXJvMiwnZmljaGExJyxw cm9wKQogIH0gZWxzZSB7CiAgICBwcm9wPSd0b29sYmFyPW5vLGxvY2F0aW9uPW5v LGRpcmVjdG9yaWVzPW5vLHN0YXR1cz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9 eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9Jyt3KycsaGVpZ2h0PScraAogICAgbXNn V2luZG93PXdpbmRvdy5vcGVuKGZpY2hlcm8yLCdmaWNoYTEnLHByb3ApCiAgfQp9 ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=jaxi_p.css Content-Type: text/css; charset=ISO-8859-15; name=jaxi_p.css Content-Location: http://www.ine.es/jaxi/css/jaxi_p.css Content-Transfer-Encoding: 8bit #capa_miga{ background : #ffcc98; margin : 0px -10px 0px -10px; padding : 5px 0px 5px 0px; .padding : 5px 0px 2px 0px; } table.general{ border : 0px; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; width:100%; } H1.jaxi{ color : #993333; font : bold 1em Arial, sans-serif; border : 0px; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; } H2.jaxi{ font : bold 1em Arial, sans-serif; border : 0px; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; } IMG{ border:0px; } TABLE.error{ background-color:#FFFCF0; color : #0000CC; font : bold 1em Arial,sans-serif; } TD.title_desc { background : #ffd475; color : #993333; font : bold 1.2em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 5px 0px 10px; } TD.barra_vertical { margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; background : #971b32; width:2pt; } TD.tabla_desc { color : #971b32; font : bold 1.1em Arial, sans-serif; margin : 2px 0px 2px 0px; padding : 0px 10px 0px 10px; } TD.capitulo_desc { background : #ffcc99; font : bold 0.9em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 10px 0px 10px; } TD.tabla_inebase { font : 0.9em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 10px; padding : 2px 20px 2px 20px; } TD.unidades { color : #971b32; font : 0.8em Arial,sans-serif; margin : 2px 0px 2px 0px; padding : 0px 5px 0px 10px; } TD.inf { margin : 2px 0px 2px 0px; padding : 0px 5px 0px 10px; color : #971b32; font : 0.8em Arial,sans-serif; } .tablaBotones{ padding : 0px 100px 0px 100px; } .caja{ border : 1px; border-style : solid; border-color : #800000; color : #0000CC; font : 0.8em Arial,sans-serif; } .cajaBusq{ border : 1px; border-style : solid; border-color : #800000; color : #0000CC; font : 0.8em Arial,sans-serif; } .cajaBuscador{ border-color: #971b32; border-width: 1px 1px 1px 1px; border-style: solid; height: 20px; color : #0000CC; font-family: Arial, Helvetica, sans-serif; font-size: 0.8em; } .tablaVar { border : 1px; border-style : solid; border-color : #ffd475; color : #0000CC; font : bold 1em Arial,sans-serif; } SELECT.cajaVar{ border : 1px solid #800000; color : #0000FF; font : 0.8em Arial, sans-serif; width:350px; } .cabVar { background : #ffd475; color : #971b32; font : bold 0.9em Arial, sans-serif; } .textoBoldNegro{ color : #000000; font : bold 0.9em Arial,sans-serif; } .textoNegro{ color : #000000; font : 0.8em Arial,sans-serif; } .textoGr { color : #971b32; font : bold 1.2em Arial,sans-serif; } .texto { color : #971b32; font : 0.8em Arial,sans-serif; } .textoPeq { color : #971b32; font : 0.8em Arial,sans-serif; } .input_total { BORDER-RIGHT: 1px; BORDER-TOP: 1px; MARGIN: 1px; FONT: 0.7em Arial, Helvetica, sans-serif; BORDER-LEFT: 1px; COLOR: #971b32; border-color : #971b32; BORDER-BOTTOM: 1px; BORDER-BOTTOM-style: solid; BACKGROUND-COLOR: transparent } .tableData { margin : 2px 0px 2px 0px; padding : 0px 5px 0px 10px; } TD.dataCellInfo { background : #ffffff; font : 0.8em Arial, sans-serif; color : #000000; text-align : right; padding : 2px 5px 2px 10px; background-image : url(../imagenes/marcador.gif); background-position : top right; background-repeat : no-repeat; } TD.dataCell { background : #ffffff; font : 0.8em Arial, sans-serif; color : #000000; text-align : right; padding : 2px 5px 2px 10px; } TH.tableCellGr { font :bold 0.9em Arial, sans-serif; background: #ffd475; color: #971b32; text-align: left; padding : 2px 5px 2px 10px; } TH.tableCellMed { font :bold 0.8em Arial, sans-serif; background: #ffd475; color: #971b32; text-align: left; padding : 2px 5px 2px 10px; } TH.tableCellPeq { font : 0.7em Arial, sans-serif; background: #ffd475; color: #971b32; text-align: left; padding : 2px 5px 2px 10px; } .cajaDesc{ border : 0.8px; border-style : solid; border-color : #800000; color : #0000CC; font : 0.9em Arial,sans-serif; } .pietexto { color : #971b32; font : 0.5em Arial, sans-serif; } .tableVar{ color : #971b32; margin : 2px 0px 2px 0px; font : normal 0.8em Arial, Helvetica, sans-serif; width:350px; } /* Estilos para links */ .inebase:link { color : #0000FF; font : 1em Arial, sans-serif; } .inebase:visited { color : #0000FF; font : 1em Arial, sans-serif; text-decoration : underline; } .L1:link { color : #971b32; font : bold 1em Arial, sans-serif; text-decoration : underline; } .L1:visited { color : #971b32; font : bold 1em Arial, sans-serif; text-decoration : underline; } .L2:link{ color : #000000; font : bold 1em Arial, sans-serif; text-decoration : underline; } .L2:visited{ color : #000000; font : bold 1em Arial, sans-serif; text-decoration : underline; } .link:link { color : #971b32; font : bold 1em Arial, sans-serif; text-decoration : none; } .link:visited { color : #971b32; font : bold 1em Arial, sans-serif; text-decoration : none; } .pielink:link { color : #971b32; font : 0.5em Arial, sans-serif; } .pielink:visited { color : #971b32; font : 0.5em Arial, sans-serif; } .idiomalink { color : #971b32; font : 0.4em Arial, sans-serif; } .idiomalink:link { color : #971b32; font : 0.4em Arial, sans-serif; text-decoration : none; } .idiomalink:visited { color : #971b32; font : 0.4em Arial, sans-serif; text-decoration : none; } .idiomalinkactive:link { color : #971b32; font :bold 0.7em Arial, sans-serif; text-decoration : none; } .idiomalinkactive:visited { color : #971b32; font : bold 0.7em Arial, sans-serif; text-decoration : none; } .procesando{ background-color: #FFFCF0; } .textoprocesando{ font: bold 0.8em Arial, Helvetica, sans-serif; color : #971b32; } .dataLink:link { font : 0.8em Arial, sans-serif; color : #000000; text-decoration : none; } .sinsubrayar:link{ text-decoration: none; } .negrita{ font-weight: bold; } SELECT.sizecombo{ height: 10em; width: 20em; } .tablaVarWidth{ width: 1000px; } TD.tabla_desc_titulo_var { height: 40px; vertical-align: bottom; } .textoPeqAdicional { height:30px; } .anchojusto { white-space: nowrap; } .sinsubrayar{ text-decoration: none; } .ilumina{ background: #ffd475; font : 0.8em Arial, sans-serif; color : #000000; text-align : right; padding : 2px 5px 2px 10px; background-image : url(../imagenes/marcador.gif); background-position : top right; background-repeat : no-repeat; } .desilumina{ background: blue; background: #ffffff; font : 0.8em Arial, sans-serif; color : #000000; text-align : right; padding : 2px 5px 2px 10px; background-image : url(../imagenes/marcador.gif); background-position : top right; background-repeat : no-repeat; } TD.a ilumina{ background: #ffd475; } TD.a desilumina{ background: #ffffff; } .capacelda{ width:0px; position: relative; visibility: hidden; } SELECT.download{ font-family: Arial, Helvetica, sans-serif; font-size: 1em; color: #971B32; background-color:#ffffff; padding : 2px 5px 2px 10px; } TABLE.MENUJAXI { background : #fffcf0; font : 1em Arial, sans-serif; width : 100%; border : 0px; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; } TD.MENUJAXI { background : #fffcf0; font : 1em Arial, sans-serif; width : 67%; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 0px 0px 0px; } A:visited { color: purple; } A{ color: blue; } SELECT.menuSelect{ border : 1px; border-style : solid; border-color : #800000; color : #0000FF; font : 1em Arial, sans-serif; } DIV.resize{ width: 15px; height: 28px; background-image: url(../imagenes/barraExpandir.gif); } .puntero{ cursor : pointer; } IMG.tamanio{ height:12px; } .tamanioTextoBoton{ font:0.80em Arial, sans-serif; } .textoFecha{ color : #971b32; font : 0.8em Arial,sans-serif; margin : 2px 0px 2px 0px; padding : 0px 5px 0px 10px; } .textoFechaValor{ color : #000000; font : 0.8em Arial,sans-serif; margin : 2px 0px 2px 0px; padding : 0px 5px 0px 112px; } DIV.capagraficaVisible{ display:visble; } DIV.capagraficaOculta{ display:none; } TD.fondoFechasMapa{ background : #971b32; cursor:pointer; color:white; font:Arial, sans-serif; border: 1px solid #9E1B34; } TD.fondoFechasMapaOn{ background : #ffd475; color:black; } #capaFechas{ overflow: auto; width: 40em; height: 2.5em; } .cabAyuda { background : #ffd475; font : bold 1em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 10px 0px 20px; color : #993333; text-align : left; } TABLE.AYUDA { font : 1em Arial, sans-serif; width : 100%; border : 0px; margin : 2px 0px; padding : 0px; } .textAyudaTit{ font : bold 0.9em Arial, sans-serif; color : #993333; } .textAyuda{ font : 0.8em Arial, sans-serif; color : #000000; } .textAyudaBold{ font: bold 0.8em Arial, sans-serif; color : #000000; } table.borde { border-style: solid; border-color: #993333; border-width: 1px; } /*PRUEBAS*/ h1.titulo{ color : #993333; background : #ffd475; font : bold 1.2em Arial, sans-serif; border : 0px; margin : 5px 5px 2px 5px; padding : 0px 5px 0px 10px; } h2.capitulo{ background : #ffcc99; font : bold 0.9em Arial, sans-serif; border : 0px; margin : 0px 5px 2px 5px; padding : 0px 5px 0px 10px; } h3.tabla{ color : #971b32; font : bold 1.1em Arial, sans-serif; margin : 22px 5px 2px 5px; padding : 0px 5px 0px 10px; } ul.unidades{ color : #971b32; font : 0.8em Arial,sans-serif; list-style-type:none; margin : 0px 5px 2px 5px; padding : 0px 5px 0px 10px; } ul.titulo_variables{ list-style-type:none; color : #000000; font : bold 0.9em Arial,sans-serif; margin : 10px 0px 0px 5px; padding : 0px 0px 0px 0px; } ul.variables{ list-style-type: none; display: inline; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; } ul.variables li { background : #ffd475; color : #971b32; font : bold 0.9em Arial, sans-serif; margin : 5px 5px 5px 5px; padding : 3px 5px 3px 10px; } ul.variables_selec{ list-style-type: none; display: inline; } ul.variables_selec li{ float:left; color:#971b32; font : 0.8em Arial,sans-serif; margin : 0px 0px 0px 10px; padding : 0px 0px 0px 0px; } div.capa_variables{ width: 250px; float: left; border: 1px solid #ffd475; margin : 0px 0px 0px 5px; padding : 0px 0px 0px 0px; } .input_seleccionados { font: bold 1em Arial, Helvetica, sans-serif; color: #971b32; background-color: transparent; vertical-align: baseline; border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; } .totalvarDer{ margin : 0px 0px 0px 35px; padding : 0px 0px 0px 0px; } .cajaBusqueda{ border : 1px; border-style : solid; border-color : #800000; color : #0000CC; } ul.cajaBusquedas{ list-style-type: none; display: inline; } ul.cajaBusquedas li{ list-style-type: none; display: inline; float: left; margin : 20px 0px 20px 10px; padding : 0px 0px 0px 0px; } .opcionesvarDer{ margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; } div.redimensionar{ float: left; width: 15px; height: 28px; background-image: url(../imagenes/barraExpandir.gif); margin : 110px 0px 0px 5px; padding : 0px 0px 0px 0px; } select.selecVar{ width: 100%; } ul.selecOps{ list-style-type: none; display: inline; } ul.selecOps li{ list-style-type: none; margin : 0px 5px 0px 5px; padding : 0px 0px 0px 0px; } /* estilos de listas */ ul.capa_variables{ list-style-type: none; } ul.capa_variables li { border:1px solid #FFD475; color:#971B32; float:left; margin:2px 2px 2px 0; min-width:100px; .width:250px; _width:250px; padding:5px; } .titulo_var { background:none repeat scroll 0 0 #FFD475; float:left; font:bold 0.9em Arial,sans-serif; margin-bottom:3px; padding:3px 1%; white-space:nowrap; width:98%; } .titulo_var2{ padding-bottom:3px; font : 0.9em Arial, sans-serif; } .titulo_var3{ padding-bottom:3px; font : 0.8em Arial, sans-serif; } .cajaBusquedaVar{ border : 1px; border-style : solid; border-color : #800000; color : #0000CC; margin-top:20px; margin-bottom: 10px; } ul.capa_opciones{ list-style-type: none; display: inline; float:left; } ul.capa_opciones li { border: 1px solid #ffd475; color : #971b32; margin : 2px 2px 2px 0px; padding : 5px 5px 5px 5px; } #flechasOpsIzq{ width: 20px; height: 1px; } .titulo_filas{ width: 345px; font : bold 0.9em Arial, sans-serif; background : #ffd475; padding-top:3px; padding-right:0px; padding-left:5px; padding-bottom:3px; margin-bottom: 3px; } .titulo_columnas{ width: 345px; font : bold 0.9em Arial, sans-serif; background : #ffd475; padding-top:3px; padding-right:0px; padding-left:5px; padding-bottom:3px; margin-bottom: 3px; } #capa_filas{ width:350px; height: 70px; margin-left: 30px; } .flechasOpsCentro{ margin-top: 20px; margin-right: 10px; margin-left: 10px; margin-bottom: 10px; text-align: center; } .flechasOpsIzq{ margin-top: 20px; margin-right: 10px; .margin-left: -40px; } .flechasOpsDer{ margin-top: 20px; margin-right: 10px; margin-left: 10px; } #capa_columnas{ width:350px; height: 70px; margin-left: 500px; } #capa_opciones{ .margin-top:40px; } #capa_opciones ul{ clear:both; padding-top: 10px; padding-left: 10px; } #capa_opciones li{ float:left; display:inline; } .selectFilas{ margin-top: 24px; margin-left: -350px; } .selectColumnas{ margin-top: 24px; margin-left: -350px; } .titulo_opciones{ color : #000000; font : bold 0.9em Arial,sans-serif; .margin-top: -30px; .margin-left: 0px; } .bordeCapaOpciones{ border:1px solid #ffd475; margin-left: 30px; .margin-left: -10px; .padding-bottom: 10px; } .celdasSeleccionadas{ color : #971b32; font : 0.9em Arial, sans-serif; .margin-top: -30px; .margin-left: 5px; } .botonesSelect{ margin-left:250px; .margin-top: -30px; .margin-left: 175px; } .botonesSelectTodo{ margin-left:150px; .margin-top: -30px; .margin-left: 100px; } .menu_texto{ list-style-type:none; background : #ffd475; font : 0.9em Arial, sans-serif; width : 32%; border : 0px; margin : 0px 0px 0px 0px; padding : 5px; float:left; } .menu_principal{ background: aqua; } ul.menu_principal{ background: aqua; float:left; } #capa_contenedora ul{ } li.P1R { list-style-type:none; background : #9E1B34; color : white; font : bold 1.1em Arial, sans-serif; border : 0px; margin : -12px 0px 2px 0px; padding : 0px 5px 0px 10px; } li.P1 { list-style-type:none; background : #ffd475; color : #9E1B34; font : bold 1.1em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 5px 0px 10px; width:50%; } li.c2 { list-style-type:none; color : #9E1B34; margin : 2px 0px 2px 0px; font : normal 0.7em Arial, Helvetica, sans-serif; } li.p5a { list-style-type:none; background : #ffcc99; font : bold 0.90em Arial, sans-serif; border : 0px; margin : 2px 0px 2px 0px; padding : 0px 8px 0px 10px; width:50%; } li.AP { list-style-type:none; color : #9E1B34; font : bold 0.90em Arial, sans-serif; margin-left: 30px; padding : 3px 10px 0px 20px; background: aqua; } } .APnon { list-style-type:none; color : #9E1B34; font : normal 0.90em Arial, sans-serif; margin-left: 30px; padding : 3px 10px 0px 20px; } TH.resaltado{ background: #ffd400; background-image : url(../imagenes/marcador.gif); background-position : top right; background-repeat : no-repeat; font : bold 0.90em Arial, sans-serif; } TD.resaltado{ background: #ffd455; background-image : url(../imagenes/marcador.gif); background-position : top right; background-repeat : no-repeat; font : bold 0.90em Arial, sans-serif; } th.estiloCabeceraOrdena { cursor: pointer; } ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=formato.css Content-Type: text/css; charset=ISO-8859-15; name=formato.css Content-Location: http://www.ine.es/menus/css/formato.css Content-Transfer-Encoding: 8bit form{ page-break-after: avoid; padding-bottom: 0px; margin-bottom: 0px; page-break-before: avoid; display:inline; } .minWidth{ width:1%; } .maxWidth{ width: 100%; } div.espacio { font-size:0%; height: 5px; padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; } .espacio { width: 10px; height: 10px; clear: both; padding-left: 10px; } img.sinborde{ border: none; padding-left: 0px; padding-right: 0px; margin-left: 0px; margin-right: 0px; } img.alineaizquierda{ float: left; vertical-align: top; margin: 0 1em 0 1em; } img.alineaderecha{ float: right; vertical-align: top; margin: 0 1em 0 1em; } img.alineaderechatotal{ float: right; vertical-align: top; margin: 0 0em 0 0em; } TD.FondoPagina{ background-color: #FFFCF0; } TD.FondoMenuBotones{ background-color: #FFFFFF; } br.lineanueva { clear: both; } .fuente_rojoine { color: #9E1B34; } .baseline{ vertical-align: bottom; } .arriba { vertical-align: top; } .alineaderecha { text-align : right; } .oculto { position:absolute; left:-9999px; } .centrar { text-align:center; } .textizquierda { text-align:left; } .no_margen_izq { padding-left: 10px; } /*Formato de los botones INE*/ a.boton { text-decoration: none; color: #9E1B34; background: White; padding: 2px 7px 2px 7px; border: 1px solid #9E1B34; cursor: pointer; margin-top:0px; margin-bottom:0px; } a.boton:hover { background: #9E1B34; color: white; } a.boton-hover { background: #9E1B34; color: white; } a.botonRojo { text-decoration: none; color:#ffffff; background: #9E1B34; padding: 2px 7px 2px 7px; border: 1px solid #9E1B34; cursor: pointer; margin-left: 0px; margin-right: 0px; margin-top:0px; margin-bottom:0px; } a.botonRojo:hover { background: #FFD475; color: #000000; } a.botonRojo-hover { text-decoration: none; background: #FFD475; color: #000000; cursor: pointer; border: 1px solid #9E1B34; margin-left: 0px; margin-right: 0px; margin-top:0px; margin-bottom:0px; padding: 2px 7px 2px 7px; } input { text-decoration: none; } input.rojo { border: 1px solid #9E1B34; vertical-align: middle; } select{ text-decoration: none; font-size: 1em; } select.rojo{ text-decoration: none; background: White; border: 1px solid #9E1B34; } SELECT.download{ font-family: Arial, Helvetica, sans-serif; background-color: #ffffff; padding: 0px 0px 0px 3px; } input.boton { text-decoration: none; color: #9E1B34; background: White; padding: 1px 3px 1px 3px; margin: 0px; border: 1px solid #9E1B34; cursor: pointer; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px; overflow: visible; } input.boton:hover { text-decoration: none; background: #9E1B34; color: white; overflow: visible; } input.boton-hover { text-decoration: none; color: white; background: #9E1B34; padding: 1px 3px 1px 3px; border: 1px solid #9E1B34; cursor: pointer; margin-left: 0px; margin-right: auto; overflow: visible; } input.botonRojo { color: #ffffff; background: #9E1B34; border: 1px solid #9E1B34; cursor: pointer; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px; padding: 0px 3px 0px 3px; overflow: visible; } input.botonRojo:hover { border: 1px solid #9E1B34; background: #FFD475; color: #000000; overflow: visible; } input.botonRojo-hover { color: #000000; background: #FFD475; border: 1px solid #9E1B34; cursor: pointer; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px; padding: 0px 3px 0px 3px; overflow: visible; } .cursorMano{ cursor:pointer; } .noresize{ font-size: 0%; } .tam95{font-size:0.95em;} .tam90{font-size:0.90em;} .tam85{font-size:0.85em;} .tam80{font-size:0.80em;} .tam75{font-size:0.75em;} .tam70{font-size:0.70em;} .tam65{font-size:0.65em;} .tam60{font-size:0.60em;} /* Comienzo Ntooltip normal */ a.Ntooltip { position: relative; /* es la posición normal */ text-decoration: none !important; /* forzar sin subrayado */ color:#9e1b34 !important; /* forzar color del texto */ font-weight:bold !important; /* forzar negritas */ background-color: #ffd475; } a.Ntooltip:hover { z-index:999; /* va a estar por encima de todo */ background-color:#9e1b34; /* DEBE haber un color de fondo */ color: #ffffff !important; /* forzar color del texto */ } a.Ntooltip span { display: none; /* el elemento va a estar oculto */ } a.Ntooltip:hover span { display: block; /* se fuerza a mostrar el bloque */ position: absolute; /* se fuerza a que se ubique en un lugar de la pantalla */ top:2em; left:4em; /* donde va a estar */ width:250px; /* el ancho por defecto que va a tener */ padding:10px; /* la separación entre el contenido y los bordes */ background-color: white; /* el color de fondo por defecto */ color: #9e1b34; /* el color de los textos por defecto */ border: 1px solid #9E1B34; font-weight: normal; } /* Fin Ntooltip */ /*Comienzo Ntooltip FICHA TECNICA */ a.NtooltipFicha { position: relative; /* es la posición normal */ text-decoration: none !important; /* forzar sin subrayado */ color:blue !important; /* forzar color del texto */ font-weight:normal !important; /* forzar negritas */ background-color: transparent; } a.NtooltipFicha:hover { z-index:999; /* va a estar por encima de todo */ background-color:#fffcf0; /* DEBE haber un color de fondo */ color: blue !important; /* forzar color del texto */ } a.NtooltipFicha span { display: none; /* el elemento va a estar oculto */ } a.NtooltipFicha:hover span { display: block; /* se fuerza a mostrar el bloque */ position: absolute; /* se fuerza a que se ubique en un lugar de la pantalla */ top:1em; left:2em; /* donde va a estar */ width:350px; /* el ancho por defecto que va a tener */ padding:10px; /* la separación entre el contenido y los bordes */ background-color: white; /* el color de fondo por defecto */ color: #9e1b34; /* el color de los textos por defecto */ border: 1px solid #9E1B34; font-weight: normal; } /* Fin Ntooltip FICHA TECNICA */ /* TOOLTIP ACCESIBLE para notas cortas mensu INEbase BASE DE DATOS */ a.NtooltipVacio { position: relative; /* es la posición normal */ text-decoration: none !important; /* forzar sin subrayado */ color:#ffffff !important; /* forzar color del texto */ font-weight:bold !important; /* forzar negritas */ background-color: #9e1b34; } a.NtooltipVacio:hover { z-index:999; /* va a estar por encima de todo */ background-color:#ffd475; /* DEBE haber un color de fondo */ } a.NtooltipVacio span { display: none; /* el elemento va a estar oculto */ text-decoration: none !important; /* forzar sin subrayado */ } a.NtooltipVacio:hover span { display: block; /* se fuerza a mostrar el bloque */ position: absolute; /* se fuerza a que se ubique en un lugar de la pantalla */ top:2em; left:4em; /* donde va a estar */ width:250px; /* el ancho por defecto que va a tener */ padding:10px; /* la separación entre el contenido y los bordes */ background-color: white; /* el color de fondo por defecto */ color: #9e1b34; /* el color de los textos por defecto */ border: 1px solid #9E1B34; font-weight: normal; font-size:0.75em; } /* Fin Ntooltip Vacio con CAJA mas Ancha*/ /* TOOLTIP ACCESIBLE para notas cortas mensu INEbase BASE DE DATOS */ a.NtooltipVacioAncho { position: relative; /* es la posición normal */ text-decoration: none !important; /* forzar sin subrayado */ color:#ffffff !important; /* forzar color del texto */ font-weight:bold !important; /* forzar negritas */ background-color: #9e1b34; } a.NtooltipVacioAncho:hover { z-index:999; /* va a estar por encima de todo */ background-color:#ffd475; /* DEBE haber un color de fondo */ } a.NtooltipVacioAncho span { display: none; /* el elemento va a estar oculto */ text-decoration: none !important; /* forzar sin subrayado */ } a.NtooltipVacioAncho:hover span { display: block; /* se fuerza a mostrar el bloque */ position: absolute; /* se fuerza a que se ubique en un lugar de la pantalla */ top:2em; left:4em; /* donde va a estar */ width:450px; /* el ancho por defecto que va a tener */ padding:10px; /* la separación entre el contenido y los bordes */ background-color: white; /* el color de fondo por defecto */ color: #9e1b34; /* el color de los textos por defecto */ border: 1px solid #9E1B34; font-weight: normal; font-size:0.75em; } /* Fin Ntooltip Vacio Ancho */ ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=style.css Content-Type: text/css; charset=ISO-8859-15; name=style.css Content-Location: http://www.ine.es/jaxi/css/xml/style.css Content-Transfer-Encoding: 8bit /* tables */ table.tablesorter { font-family:arial; background-color: #CDCDCD; margin:10px 0pt 15px; font-size: 8pt; width: 100%; text-align: left; } table.tablesorter thead tr th, table.tablesorter tfoot tr th { background-color: #e6EEEE; border: 1px solid #FFF; font-size: 8pt; padding: 4px; } table.tablesorter thead tr .header { background-image: url(bg.gif); background-repeat: no-repeat; background-position: center right; cursor: pointer; } table.tablesorter tbody td { color: #3D3D3D; padding: 4px; background-color: #FFF; vertical-align: top; } table.tablesorter tbody tr.odd td { background-color:#F0F0F6; } table.tablesorter thead tr .headerSortUp { background-image: url(asc.gif); } table.tablesorter thead tr .headerSortDown { background-image: url(desc.gif); } table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { background-color: #8dbdd8; } ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=jaxi.js Content-Type: text/javascript; charset=ISO-8859-15; name=jaxi.js Content-Location: http://www.ine.es/jaxi/js/jaxi.js Content-Transfer-Encoding: 8bit document.write(''); function setStatusData(headers){ var texto=""; var criterios=""; var headersArray=headers.split(" "); for (i=0;imaxSelection) alert(reducir); else if(document.tabla.NumCeldas.value<=0) alert(seleccionar); else { if (opc=="consulGrafico"){ document.tabla.muestraGrafico.value='muestraGrafico'; } mostrarLoading(2); submitTable(); } //else createTarget(document.forms['tabla'],true); } function submitTable(){ if (getOpenWindow()!=null && getOpenWindow()=="n"){ document.forms['tabla'].target='_blank'; } document.forms['tabla'].submit(); } function showPopUpWindow(windowNameToOpen,windowW,windowH,windowName) { var windowX=(screen.width/2)-(windowW/2); var windowY=(screen.height/2)-(windowH/2); prop='toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width='+windowW+',height='+windowH; msgWindow=window.open(windowNameToOpen, windowName, prop); msgWindow.focus(); msgWindow.moveTo(windowX, windowY); } function todos(selTodas,variable,totsel){ var size=eval ("document.tabla."+variable+".length"); if (selTodas) eval ("document.tabla."+totsel+".value="+size); else eval ("document.tabla."+totsel+".value=0"); for (var i = 0; i < size ; i++) eval("document.tabla."+variable+".options[i].selected="+ selTodas); total(variable); } function selTodos(){ var num=document.tabla.numCri.value; for(var j=1;j<=num;j++){ var tipo=eval("document.tabla.cri"+j+".type"); if (tipo=="select-multiple" || tipo=="select-one"){ var variable="cri"+j; var sel="sel_"+j; todos(true,variable,sel); } } } function total(){ var num=document.tabla.numCri.value; var tot=1; for(var j=1;j<=num;j++){ var tipo=eval("document.tabla.cri"+j+".type"); if (tipo=="select-multiple" || tipo=="select-one"){ var val=eval ("document.tabla.sel_"+j+".value"); tot=tot*val; } } document.tabla.NumCeldas.value=tot; } function cuantos(totsel,variable){ var num=1; for (var i = 0; i < eval ("document.tabla."+variable+".length") ; i++) { if (eval("document.tabla."+variable+".options[i].selected") == true) { eval ("document.tabla."+totsel+".value="+num); num++; } } total(); } function ordenarSelect(opcion,object){ if (opcion=='up'){ for(var i = 0;i < eval('document.tabla.'+object+'.options.length');i++){ if (eval('document.tabla.'+object+'.options[i].selected==true')){ if (i>0){ textoSup=eval('document.tabla.'+object+'.options[i].text'); valorSup=eval('document.tabla.'+object+'.options[i].value'); textoInf=eval('document.tabla.'+object+'.options[i-1].text'); valorInf=eval('document.tabla.'+object+'.options[i-1].value'); eval('document.tabla.'+object+'.options[i-1].text=textoSup'); eval('document.tabla.'+object+'.options[i-1].value=valorSup'); eval('document.tabla.'+object+'.options[i].text=textoInf'); eval('document.tabla.'+object+'.options[i].value=valorInf'); eval('document.tabla.'+object+'.options[i-1].selected=true'); eval('document.tabla.'+object+'.options[i].selected=false'); }else{ alert(primero); } } } }else{ for(var i = eval('document.tabla.'+object+'.options.length-1');i >= 0;i--){ if (eval('document.tabla.'+object+'.options[i].selected==true')){ if (eval('i-1){ eval("document.getElementById('"+variable+"').options["+i+"].selected=true"); } else if(opc=='start' && auxValor.indexOf(valor)==0){ eval("document.getElementById('"+variable+"').options["+i+"].selected=true"); } } cuantos(sel,variable); } } function ltrim(s) { return s.replace(/^\s+/, ""); } function rtrim(s) { return s.replace(/\s+$/, ""); } function trim(s) { return rtrim(ltrim(s)); } function imprimir(){ window.print(); } function favoritos(titulo){ window.external.AddFavorite(document.location.href,titulo); } function setTypeOpenWindow(){ var value=readCookie("openWindow"); if (value==null){ createCookie("openWindow","n",CookieNumDays); }else{ if (value=="1") createCookie("openWindow","n",CookieNumDays); else createCookie("openWindow","1",CookieNumDays); } window.location.reload(); } function getOpenWindow(){ var value=readCookie("openWindow"); return value; } function aleatorio(){ return parseInt(Math.random()*999999); } function replaceAll(cadena,cadenaBusq,cadenaFinal) { var pos = 0; var aux = ""; while (cadena.indexOf(cadenaBusq,pos) != -1){ aux += cadena.substring(pos,cadena.indexOf(cadenaBusq,pos)); aux += cadenaFinal; pos = (cadena.indexOf(cadenaBusq,pos) + cadenaBusq.length); } aux += cadena.substring(pos,cadena.length); return aux; } //function createTarget(form,doSubmit) { //Esta funcion es usada para poder abrir los furmulario en una ventana y //poder establecer las propiedades de la misma /*toolbar=" + toolbar + ",location=" + location + ", directories="+ directories +",status=" + status + ", menubar=" + menubar +",scrollbars="+ scrollbars + ",resizable=" + resizable + ", width=" + width + ",height=" + height;*/ //Esta funcion será llamada desde el on submit() //estableciendo en el target--> nombreVentana:PropiedadesVentana //nombreventana=> NombreMarcoParaForm~ArchivoBase~NombreVentanaParaArchivoBase //Los dos ultimos parametros son opcionales //en el caso de hacer submit por Javascript se recomienda usar la funcion //justo antes del submit /* var nameAleatorio="dataPage"+aleatorio(); var _target = form.target; _colon = _target.indexOf(":"); _winfile=''; _wintarget=''; if(_colon != -1) { form.target =_target.substring(0,_colon).split("~")[0]; if (_target.substring(0,_colon).split("~").length>0){ _winfile=_target.substring(0,_colon).split("~")[1]; } if (_target.substring(0,_colon).split("~").length>1){ _wintarget=_target.substring(0,_colon).split("~")[2]; if (getOpenWindow()!=null && getOpenWindow()=="n") _target=replaceAll (_target, _wintarget, nameAleatorio); }else{ _wintarget=_target.substring(0,_colon).split("~")[0]; } form.args = _target.substring(_colon+1); } else if(typeof(form.args)=="undefined") { form.args = ""; } if(form.args.indexOf("{")!=-1) { _args = form.args.split("{"); form.args = _args[0]; for(var i = 1; i < _args.length;i++) { _args[i] = _args[i].split("}"); form.args += eval(_args[i][0]) + _args[i][1]; } } form.args = form.args.replace(/ /g,""); _win = window.open(_winfile,_wintarget,form.args); _win.focus(); if (doSubmit){ form.submit(); form.target=_target, _wintarget, nameAleatorio; }else{ return true; } }*/ ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=sort.js Content-Type: text/javascript; charset=ISO-8859-15; name=sort.js Content-Location: http://www.ine.es/jaxi/js/sort.js Content-Transfer-Encoding: 8bit var SentidoASC= new Image(); SentidoASC.src="imagenes/cambiosentidoASC.gif" var SentidoDESC= new Image(); SentidoDESC.src="imagenes/cambiosentidoDESC.gif" function CambiaImagenSentido(img){ if (img.src.indexOf('ASC')>0) img.src=SentidoDESC.src else img.src=SentidoASC.src } function ReverseFormSelect(VarSelect){ //Coloca en orden inverso los elementos de la select var auxText;//variable auxiliar para almacenar temporalmente el dato Text var auxValue;//variable auxiliar para almacenar temporalmente el dato Value var auxSelected;//variable auxiliar para almacenar temporalmente el dato selected var longitud=VarSelect.options.length; for (var i=0;i0){ auxSelected=VarSelect.options[0].selected; VarSelect.options[0].selected=false; VarSelect.options[0].selected=auxSelected; } } ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=resize.js Content-Type: text/javascript; charset=ISO-8859-15; name=resize.js Content-Location: http://www.ine.es/jaxi/js/resize.js Content-Transfer-Encoding: 8bit var move = false; var position; var object; var selectObj; document.onmouseup = onMouseUp; document.onmousemove = onMouseMove; function onMouseDown(obj,select,evnt){ var e = evnt || window.event move = true; if (e.clientX) position = e.clientX; else if (e.x) position = e.x; object=obj; selectObj=select; } function onMouseMove(evnt){ var e = evnt || window.event if (move) { if (e.clientX){ ResizeListbox(e.clientX - position, object, selectObj); position = e.clientX; }else if (e.x){ ResizeListbox(e.x - position, object, selectObj); position = e.x; } return false; } } function onMouseUp(){ move = false; window.status=''; } function ResizeListbox(whereto, ob,sel){ window.status="entro"; var begin = document.getElementById(ob).width; var intbegin = parseInt(begin); var newwidth = intbegin + whereto; window.status=document.getElementById(ob).width; //Limitamos el resize a 250 como mínimo if (newwidth >= 250){ window.status=newwidth; document.getElementById(ob).width = newwidth; document.forms['tabla'].elements[sel].width=newwidth; } document.getElementById(ob).innerHtml=newwidth; } ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline Content-Type: image/jpeg Content-Location: http://www.ine.es/menus/img/fondoOrig.jpg Content-Transfer-Encoding: Base64 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 q8jCntmpihbVvNYJj1LWHTy1c031MDRVYvgwNIyyA8lBkA1AGoA4kKejslaavdBl lUWmrUj5SZ2WUYTMpaHRpvoaXZErOm+G4xS7spWclyyFLuzdCsumSatbIakuMSar ZZJqtvW1M8jrQ1YIUv7TWXLNo3GUszg1htCvwnpkuxr7JY+sVJWVZffW0ZeqwWOR NJKFrYSa8CdWjJ7lpk/+zUZWzrMDTfUpNULtVMPDhVW/Jq11tar7ZgszoU6q/JLf +5WZiCe1tH9RaVafm8ZX7CzUfbdjV3vmlJ+e5ljKU1WrK0qLNGp+jNRyJOIls2p8 E0+5fsSmMrK5j8OexraEqWUqdWPNBo0qMoDC7ScF3MTA4a8fvYGKlcXTFFpp37M/ qYl/A7z/AFGp/ai4dMINoAAiGAFAAABAiqZEIACgIAp5fmCT1sIeoKMhCCgForRT pSyugLb4zs6k/RHPJtz6SKWkBOJB520t2kg5GAZYBrYQal1QaJqDAnRHoEVReJYA 6EFduz/6hL0LCOe6ji8q9yIz0hSwAYAMBC8OIUvCQQvDkFLE0ELU/IKakEPKAADA UnCL6BCdCIC8OceWTAqNa6j1yBSvaq5ogaRv4dU0FawuoS4SA1VWL8mAfdPpjsBS bXJUcQNI3V1DqpL1CNHtFSWmpRWHx0hXGnCNTMM6OkZeQJdkYUKiTU1l9AG7NpZz uCMowqSzpXANE41FxiBOoB6gDUAagHqAeoAUwL8QyKVU0KU0zI2ppPh+xpHRFVFw l+pkaeJNcUgJdffhr5gRKqn1AjOQAASTNDWOpcraMo1jUrLrnuaFOevdUpqS/wDf MDKVrYz409L81u+gGctlUpe7qyXfeEplLZlyuWUZfsE1cNezu4zbdGWMcVv+h6eD OMUywcz9ndJOL8meyM4lx+uRxKxrLsv/AGrezq9ZQcf0webg98ods/SHEepwoAGC gIAoAGQIoDMkO3ai9uhNfFSX7Hn+PPt/9duXqHEj1OKMce58vn9nv44/k1KUeDwc 1ptC9uY/Hn0YNW0NqVVzxUiWzo6IbUoPmi4l2YnBo7i2q8tTD9TUZJqu3pzV3Cos OGGm0xMrMPQ0dULSS0sts0AlDAAFAEsDhaxXqL1z+pppWAKANof01GX4ZEw7lqOn CzaEZDNAMgAAAAAQSjNKQDRkUAwgksxYC2h7WyKM+Ol4Lh3LfHLw3ofFHOYUtEfh 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 JGsCDRBmW+0v9k1h1LUdOM0yZlAABQAgAD//2Q== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=estilos_INE.css Content-Type: text/css; charset=ISO-8859-15; name=estilos_INE.css Content-Location: http://www.ine.es/menus/css/estilos_INE.css Content-Transfer-Encoding: 8bit /* INICIO Lista estilos CABECERA */ BODY{ font-family: arial; font-size: 0.90em; padding: 0px 10px 0px 10px; margin: 0px 0px 0px 0px; } #Menu_micabecera{ padding: 0px 10px 0px 10px; margin: 0px -10px 0px -10px; display: block; background-image:url(../img/fondoOrig.jpg); width: 100%; } #Menu_cabeceraFondoLogo{ padding: 10px 10px 0px 10px; margin: 0px -10px 0px -10px; float: left; } #Menu_cabeceraFondoMenu{ padding: 0px 10px 0px 10px; margin: 10px -10px 0px -10px; display: block; border-bottom: 1px solid #9E1B34; float:left; width:100%; } #Menu_cabeceraLogoINE{ height: 62px; width: 150px; border : none; vertical-align: middle; } #Menu_cabeceraBuscador{ display:inline; float: right; text-align: right; margin: 10px 0px 0px -210px; padding: 10px 0px 0px -210px; _margin: 10px 0px 0px -210px; _padding: 10px 0px 0px -210px; } .Menu_searchString{ text-decoration: none; background: White; padding: 1px 1px 1px 1px; border: 1px solid #9E1B34; margin: 0px; _margin-left: 10px; vertical-align: bottom; } #Menu_botonBuscador{ background: #9E1B34; border-left: 1px solid #9E1B34; border-right: 1px solid #9E1B34; border-top: 1px solid #9E1B34; border-bottom: 1px solid #9E1B34; color: #ffffff; vertical-align: middle; cursor: pointer; _margin-right: 20px; } #Menu_cabeceraAccesos { width:150px; float:left; text-align: center; } #Menu_cabeceraAccesos ul { margin: 0px 0px 0px 0px; padding: 4px 0px 2px 0px; _margin: 4px 0px 0px 0px; _padding: 4px 0px 0px 0px; .margin: 0px 0px 0px 0px; list-style: none; cursor: pointer; border-top:1px solid #9E1B34; border-left:1px solid #9E1B34; border-right:1px solid #9E1B34; background: #FFFFFF; } #Menu_cabeceraAccesos li { display:inline; margin: 5px 0px 5px 0px; padding: 0px 0px 0px 0px; } #Menu_cabeceraAccesos li:hover { } #Menu_cabeceraAccesos li a{ color: #9E1B34; text-decoration: none; } #Menu_cabeceraMenu { margin-left: 160px; } #Menu_cabeceraIdioma{ float: right; padding: 0px 20px 0px 0px; margin: 0px 0px 0px 0px; } /* FIN Lista estilos CABECERA */ /* INICIO Lista estilos PIE */ #Pie_Direccion{ text-decoration: none; font-size: 0.8em; color: #9E1B34; margin-top: 10px; outline: none; position: relative; clear: both; text-align: center; border-top: 1px solid #9e1b34; } #Pie_Direccion a:active , #Pie_Direccion a:focus, #Pie_Direccion a:hover, #Pie_Direccion a:link, #Pie_Direccion a:visited{ text-decoration: none; color: #9E1B34; font-size: 1.1em; margin: 0px; outline: none; padding: 0px; position: relative; } #Pie_Direccion ul { margin: 2px 4px 2px 4px; } #Pie_Direccion li { display: inline; padding: 2px 4px 2px 4px; } /* FIN Lista estilos PIE */ .clear{ clear:both; } #Menu_capa_corte_servicio{ padding-top:30px; text-align:right; } #Menu_imgCorteServicio{ margin-top:9px; } ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.ine.es/menus/img/tri.gif Content-Transfer-Encoding: Base64 R0lGODlhBQAJAIAAAAAAAP///yH5BAUUAAEALAAAAAAFAAkAAAIMRB5gp9v2YlJs JRQKADs= ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=cabecera.css Content-Type: text/css; charset=ISO-8859-15; name=cabecera.css Content-Location: http://www.ine.es/menus/css/cabecera.css Content-Transfer-Encoding: 8bit /* ================================================================ This copyright notice must be kept untouched in the stylesheet at all times. The original version of this stylesheet and the associated (x)html is available at http://www.cssplay.co.uk/menus/pro_variable4.html Copyright (c) 2005-2007 Stu Nicholls. All rights reserved. This stylesheet and the associated (x)html may be modified in any way to fit your requirements. =================================================================== */ .nav {padding:0px 0px 0px 0px;margin:0px 0px 0px 0px;.margin:5px 0px 0px 160px;.padding:0px 0px 0px 0px;list-style:none; font : 0.75em arial; position:relative; z-index:200; height:0em;} .nav ul {padding:0px; margin:0px; list-style:none; float:left; background:#fff; border-top:1px solid #9E1B34;} .nav li {border-top: 1px solid #9E1B34;border-right: 1px solid #9E1B34;float:left;border-top:1px solid #9E1B34;} .nav li li {float:none; border-top:1px solid #9E1B34; border-right:2px solid #9E1B34;border-left:2px solid #9E1B34;} .nav li.last {border-bottom:2px solid #9E1B34;} .nav li.last2 {border-bottom:1px solid #9E1B34;} .nav li.left {border-left:1px solid #9E1B34;} /* a hack for IE6 */ * html #nav li li {float:left;} .nav li a {display:block; float:left; color:#9E1B34; height:1em; background:#fff; padding:8px 10px 5px 10px; line-height:1em; text-decoration:none; white-space:nowrap;} .#nav li a.down {} .nav li li a {display:block; height:auto; line-height:1em; float:none; padding:5px 25px 5px 5px; font-weight:normal;line-height: 1.5em;} .nav li li a.fly {background:url(../img/tri.gif) no-repeat top right} .nav li:hover {position:relative; z-index:300;} .nav li.cssplay_hover {position:relative; z-index:300;} .nav li.cssplay_hover a {color:#9E1B34;} .nav li li a {color:#9E1B34;} .nav li li.cssplay_hover a {color:#9E1B34; background-color:#fff;} .nav li:hover ul {left:0; top:23px; z-index:500;} .nav li.cssplay_hover ul {left:0; top:33px;.top:23px;z-index:500;} .nav ul {position:absolute; left:-9999px; top:-9999px;} * html #nav ul {width:2px;} /* it could have been this simple if all browsers understood */ /* show next level */ .nav li:hover li:hover > ul {left:-75px; margin-left:100%; top:10px; z-index:500;} /* keep further levels hidden */ .nav li:hover > ul ul {position:absolute; left:-9999px; top:-9999px; width:auto; } /* show path followed */ .nav li:hover > a {color:#9E1B34;background:#ffd475;} .nav li li:hover > a {color:#9E1B34; background-color:#FFD475;} .nav li li:hover > a.fly {background:url(../img/tri_azul.gif) no-repeat top right;background-color:#ffd475;} /* but IE5.x and IE6 need this lot to style the flyouts*/ .nav li.cssplay_hover li.cssplay_hover a, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover a, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover a, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover a, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover a {color:#9E1B34; background-color:#ffd475;} .nav li.cssplay_hover li.cssplay_hover li a, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover li a, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover li a, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover li a, {color:#9E1B34; background-color:#fff;} /* show next level */ .nav li.cssplay_hover li.cssplay_hover ul, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover ul, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover ul, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover ul {left:100%; margin-left:-75px; top:10px;} /* keep further levels hidden */ .nav li.cssplay_hover ul ul, .nav li.cssplay_hover li.cssplay_hover ul ul, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover ul ul, .nav li.cssplay_hover li.cssplay_hover li.cssplay_hover li.cssplay_hover ul ul {position:absolute; left:-9999px; top:-9999px;} ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=BaseINE.css Content-Type: text/css; charset=ISO-8859-15; name=BaseINE.css Content-Location: http://www.ine.es/menus/css/BaseINE.css Content-Transfer-Encoding: 8bit /* Elementos comunes de Html */ BODY { font-family: Arial, Helvetica, sans-serif; background-color: #FFFCF0; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px; color: Black; font-size: 0.9em; } HR { color: #9E1B34; } HR.fina { color: #9E1B34; border-style: solid none none none; height:1px; } SPAN { color : #9E1B34; } IMG { border : none; } /* Elementos de web INE */ .fondoINE{ background-color: #9E1B34; } .colorINE{ color: #9E1B34; } .raya { height: 1px; } .rayacorta { height: 1px; width: 5%; text-align: left; margin-right: 95%; } .border { border : none; } .sinesp { margin-bottom : -2px; margin-top : -2px; } .nowrap { white-space: nowrap; } .left { text-align: left; } br.left { clear: left; } .right { text-align: right; } .miga { font-family: Arial,Helvetica,sans-serif; color: #971B32; font-weight: bolder; font-size: 1.1em; } .miga a , .miga a:hover , .miga a:visited , .miga a:link , .miga a:active, .miga a:focus{ font-weight: normal; color: #9E1B34; text-decoration: none; } ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=Menu.css Content-Type: text/css; charset=ISO-8859-15; name=Menu.css Content-Location: http://www.ine.es/menus/css/Menu.css Content-Transfer-Encoding: 8bit .Menu_Fondo_tabla{ background: url("../img/fondo.jpg") repeat-x top right; width: 100%; } .Menu_TablaMaq{ width:100%; border:0; } a.Menu_TituloMenu:active , a.Menu_TituloMenu:focus, a.Menu_TituloMenu:hover, a.Menu_TituloMenu:link, a.Menu_TituloMenu:visited{ text-decoration: none; font-family: Arial, Helvetica, sans-serif; font-size: 0.8em; color: #9e1b34; } a.Menu_TituloMenu:hover{ text-decoration: none; font-family: Arial, Helvetica, sans-serif; font-size: 0.85em; color: aqua; } a.Menu_TituloIdioma:active , a.Menu_TituloIdioma:focus, a.Menu_TituloIdioma:link, a.Menu_TituloIdioma:visited{ text-decoration: none; font-family: Arial, Helvetica, sans-serif; font-size: 0.85em; color: #9e1b34; } a.Menu_TituloIdioma:hover{ text-decoration: none; font-family: Arial, Helvetica, sans-serif; font-size: 0.85em; color: #000000; } .Menu_TextSearch{ font-family: Arial, Helvetica, sans-serif; font-size: 0.85em; border-left: 1px solid #9E1B34; border-right: 1px solid #9E1B34; border-top: 1px solid #9E1B34; border-bottom: 1px solid #9E1B34; padding: 3px 3px 3px 3px; vertical-align: middle; } input.Menu_BtnBuscar{ background: #9E1B34; border-left: 1px solid #9E1B34; border-right: 1px solid #9E1B34; border-top: 1px solid #9E1B34; border-bottom: 1px solid #9E1B34; color: #ffffff; vertical-align: middle; font-size: 0.9em; cursor: pointer; } input.Menu_BtnBuscar:hover{ background: #FFD475; color: #000000; } input.Menu_BtnBuscar-hover{ background: #FFD475; border-left: 1px solid #9E1B34; border-right: 1px solid #9E1B34; border-top: 1px solid #9E1B34; border-bottom: 1px solid #9E1B34; color: #000000; vertical-align: middle; font-size: 0.9em; cursor: pointer; } .Menu_CoomboText{ color: #9e1b34; font-family: Arial, Helvetica, sans-serif; font-size: 0.75em; } .Menu_Titulo_Secc{ font-family: Arial, Helvetica, sans-serif; font-size: 0.95em; font-weight: bold; } TD.Menu_TDLinea{ background-color: #9e1b34; height: 0.1em; } TD.Menu_TDFondo{ background-color: #ffffff; } #DIVloading { position: absolute; z-index: 10000; width: 100%; height: 100%; top: 0px; left: 0px; background-color: #FFFCF0; /*filter: alpha(opacity=90); -moz-opacity: 0.9; opacity: 0.9;*/ display: none; } #iframeloading{ position: absolute; display: none; left: 0px; top: 0px; width: 0px; height: 0px; overflow: hidden; border: 0px none; } .espacio { width: 10px; height: 10px; clear: both; } #Menu_ContenidoPpal{ padding-left: 10px; padding-right: 10px; clear: both; } #MenuContenidoHTML{ padding-top: 0px; padding-bottom: 0px; padding-left: 10px; padding-right: 10px; } H1.MenuCabecera{ font-family: Arial, Helvetica, sans-serif; font-size: 0.75em; color: #9E1B34; } .Menu_botonera{ text-align: center; border-left: 1px solid #9E1B34; border-right: 1px solid #9E1B34; border-top: 1px solid #9E1B34; background-color: white; } .Menu_lineaHorizontal{ background: url("../img/linea.gif") repeat-x top; height: 1px; overflow: inherit; } .Menu_MarcoCombo{ border-left: 0.1em solid #9E1B34; border-right: 0.1em solid #9E1B34; border-top: 0.1em solid #9E1B34; border-bottom: 0.1em solid #9E1B34; background: #9E1B34; font-size: 0.1em; } .MenuSecc{ height:20px; vertical-align: middle; padding-top:4px; padding-bottom:4px; } .Menu_FlechaCombo{ background: url("../img/linea.gif") no-repeat center; } /* INICIO ToolTip*/ #dhtmlgoodies_tooltip{ background-color:#FFFFE1; border:0.1em solid #000; position:absolute; display:none; z-index:20000; padding:0.2em; font-size:0.75em; font-family: Arial, helvetica, sans-serif;; } #dhtmlgoodies_tooltipClose{ background-color: #FFD475; } #dhtmlgoodies_tooltipShadow{ position:absolute; background-color:#555; display:none; z-index:10000; } /* FIN ToolTip*/ /*INICIO Capa de posicionamiento*/ #PosTab{ position: absolute; } /* FIN Capa de posicionamiento*/ /*INICIO barra de menu*/ #MenuToolBar { margin: 0px 0px 0px 5px; float:left; } #MenuToolBar ul { padding: 0px 0px 0px 0px; margin: 0px 0px 0px 0px; margin: 0px; list-style: none; } #MenuToolBar ul li { display: inline; font-size: 0.75em; } #MenuToolBar ul li a.izq:link, #MenuToolBar ul li a.izq:visited { color: #9E1B34; float: left; padding: 5px 10px 4px 10px; text-decoration: none; background-image: url(../img/fichaizq.gif); background-position: top right; background-repeat: no-repeat; border-left: 1px solid #9E1B34; } #MenuToolBar ul li a.cent:link, #MenuToolBar ul li a.cent:visited { color: #9E1B34; padding: 5px 5px 4px 5px; float: left; text-decoration: none; background-image: url(../img/fichaizq.gif); background-position: top right; background-repeat: no-repeat; } #MenuToolBar ul li a.dch:link, #MenuToolBar ul li a.dch:visited { color: #9E1B34; padding: 5px 5px 4px 5px; float: left; text-decoration: none; background-image: url(../img/fichadch.gif); background-position: top right; background-repeat: no-repeat; } #MenuToolBar ul li a.izq:hover, #MenuToolBar ul li a.izq:active, #MenuToolBar ul li a.izq:focus{ color: #9E1B34; background-image: url(../img/ficha_overizq.gif); background-position: top right; background-repeat: no-repeat; } #MenuToolBar ul li a.cent:hover, #MenuToolBar ul li a.cent:active{ color: #9E1B34; background-image: url(../img/ficha_overizq.gif); background-position: top right; background-repeat: no-repeat; } #MenuToolBar ul li a.dch:hover, #MenuToolBar ul li a.dch:active{ color: #9E1B34; background-image: url(../img/ficha_overdch.gif); background-position: top right; background-repeat: no-repeat; } /*FIN barra de menu*/ #MenuLangBar { color: #9E1B34; display:inline; float: right; vertical-align: bottom; } #MenuLangBar ul { padding: 0px 0px 0px 0px; margin: 0px 0px 0px 0px; margin: 0px; list-style: none; float: left; } #MenuLangBar ul li { display: inline; font-size: 0.75em; } #MenuLangBar ul li a:link,#MenuLangBar ul li a:visited { color: #9E1B34; padding: 4px 10px 4px 10px; float: left; text-decoration: none; border-left: 1px solid #9E1B34; border-right: 1px solid #9E1B34; border-top: 1px solid #9E1B34; background-color: white; } #MenuLangBar ul li a:hover, MenuLangBar ul li a:active{ color: #9E1B34; background-color: #ffd475; } #MenuLangBar select{ font-size: 0.75em; color: #9E1B34; text-decoration: none; background: White; border: 2px solid #ffffff; vertical-align: middle; padding: 0px 0px 0px 0px; margin: 3px 1px 0px 1px; } #MenuLangBar input{ vertical-align: middle; padding: 3px 0px 3px 0px; } /* INICIO Lista estandar horizontal */ ul.horizontal { padding: 0px 0px 0px 0px; margin: 0px; list-style: none; clear:both; } ul.horizontal li { display: inline; text-align: center; } ul.horizontal li .separador{ padding: 0px 4px 0px 4px; } ul.horizontal li a{ color: #9E1B34; padding: 0px 2px 0px 2px; text-decoration: none; } /* FIN Lista estandar horizontal */ ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=thickbox.css Content-Type: text/css; charset=ISO-8859-15; name=thickbox.css Content-Location: http://www.ine.es/menus/css/thickbox.css Content-Transfer-Encoding: 8bit /* ----------------------------------------------------------------------------------------------------------------*/ /* ---------->>> global settings needed for thickbox <<<-----------------------------------------------------------*/ /* ----------------------------------------------------------------------------------------------------------------*/ /* *{padding: 0; margin: 0;} */ /* ----------------------------------------------------------------------------------------------------------------*/ /* ---------->>> thickbox specific link and font settings <<<------------------------------------------------------*/ /* ----------------------------------------------------------------------------------------------------------------*/ #TB_window { font: 12px Arial, Helvetica, sans-serif; color: #333333; } #TB_secondLine { font: 10px Arial, Helvetica, sans-serif; color:#666666; } #TB_window a:link {color: #666666;} #TB_window a:visited {color: #666666;} #TB_window a:hover {color: #000;} #TB_window a:active {color: #666666;} #TB_window a:focus{color: #666666;} /* ----------------------------------------------------------------------------------------------------------------*/ /* ---------->>> thickbox settings <<<-----------------------------------------------------------------------------*/ /* ----------------------------------------------------------------------------------------------------------------*/ #TB_overlay { position: fixed; z-index: 100; top: 0px; left: 0px; background-color: #ffd886; filter: alpha(opacity=75); -moz-opacity: 0.75; opacity: 0.75; height: 100%; width: 100%; } * html #TB_overlay { /* ie6 hack */ position: absolute; height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); } #TB_window { position: fixed; background: #ffffff; z-index: 102; color: #000000; display: none; border: 4px solid #525252; text-align: left; top: 50%; left: 50%; } * html #TB_window { /* ie6 hack */ position: absolute; margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); } #TB_window img#TB_Image { display:block; margin: 15px 0 0 15px; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; border-top: 1px solid #666; border-left: 1px solid #666; } #TB_caption{ height:25px; padding:7px 30px 10px 25px; float:left; } #TB_closeWindow{ height:25px; padding:11px 25px 10px 0; float:right; } #TB_closeAjaxWindow{ padding:7px 10px 5px 0; margin-bottom:1px; text-align:right; float:right; } #TB_ajaxWindowTitle{ float:left; padding:7px 0 5px 10px; margin-bottom:1px; } #TB_title{ background-color:#e8e8e8; height:27px; } #TB_ajaxContent{ clear:both; padding:2px 15px 15px 15px; overflow:auto; text-align:left; line-height:1.4em; } #TB_ajaxContent.TB_modal{ padding:15px; } #TB_ajaxContent p{ padding:5px 0px 5px 0px; } #TB_load{ position: fixed; display:none; height:13px; width:208px; z-index:103; top: 50%; left: 50%; margin: -6px 0 0 -104px; /* -height/2 0 0 -width/2 */ } * html #TB_load { /* ie6 hack */ position: absolute; margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); } #TB_HideSelect{ z-index:99; position:fixed; top: 0; left: 0; background-color:#fff; border:none; filter:alpha(opacity=0); -moz-opacity: 0; opacity: 0; height:100%; width:100%; } * html #TB_HideSelect { /* ie6 hack */ position: absolute; height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); } #TB_iframeContent{ clear:both; border:none; margin-bottom:-1px; margin-top:1px; margin-bottom:1px; } ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=jquery.js Content-Type: application/javascript; charset=ISO-8859-15; name=jquery.js Content-Location: http://www.ine.es/menus/js/jquery.js Content-Transfer-Encoding: Base64 KGZ1bmN0aW9uKCl7CgkKLyoKICogalF1ZXJ5IDEuMi42IC0gTmV3IFdhdmUgSmF2 YXNjcmlwdAogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDggSm9obiBSZXNpZyAoanF1 ZXJ5LmNvbSkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIChNSVQtTElD RU5TRS50eHQpCiAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMu CiAqCiAqICREYXRlOiAyMDA4LTA1LTI0IDE0OjIyOjE3IC0wNDAwIChTYXQsIDI0 IE1heSAyMDA4KSAkCiAqICRSZXY6IDU2ODUgJAogKi8KCi8vIE1hcCBvdmVyIGpR dWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQp2YXIgX2pRdWVyeSA9IHdpbmRvdy5q UXVlcnksCi8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglf JCA9IHdpbmRvdy4kOwoKdmFyIGpRdWVyeSA9IHdpbmRvdy5qUXVlcnkgPSB3aW5k b3cuJCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCS8vIFRoZSBq UXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0 b3IgJ2VuaGFuY2VkJwoJcmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0 b3IsIGNvbnRleHQgKTsKfTsKCi8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3Ig SFRNTCBzdHJpbmdzIG9yIElEIHN0cmluZ3MKLy8gKGJvdGggb2Ygd2hpY2ggd2Ug b3B0aW1pemUgZm9yKQp2YXIgcXVpY2tFeHByID0gL15bXjxdKig8KC58XHMpKz4p W14+XSokfF4jKFx3KykkLywKCi8vIElzIGl0IGEgc2ltcGxlIHNlbGVjdG9yCglp c1NpbXBsZSA9IC9eLlteOiNcW1wuXSokLywKCi8vIFdpbGwgc3BlZWQgdXAgcmVm ZXJlbmNlcyB0byB1bmRlZmluZWQsIGFuZCBhbGxvd3MgbXVuZ2luZyBpdHMgbmFt ZS4KCXVuZGVmaW5lZDsKCmpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7 Cglpbml0OiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJLy8gTWFr ZSBzdXJlIHRoYXQgYSBzZWxlY3Rpb24gd2FzIHByb3ZpZGVkCgkJc2VsZWN0b3Ig PSBzZWxlY3RvciB8fCBkb2N1bWVudDsKCgkJLy8gSGFuZGxlICQoRE9NRWxlbWVu dCkKCQlpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkgewoJCQl0aGlzWzBdID0gc2Vs ZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJcmV0dXJuIHRoaXM7CgkJfQoJ CS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9 PSAic3RyaW5nIiApIHsKCQkJLy8gQXJlIHdlIGRlYWxpbmcgd2l0aCBIVE1MIHN0 cmluZyBvciBhbiBJRD8KCQkJdmFyIG1hdGNoID0gcXVpY2tFeHByLmV4ZWMoIHNl bGVjdG9yICk7CgoJCQkvLyBWZXJpZnkgYSBtYXRjaCwgYW5kIHRoYXQgbm8gY29u dGV4dCB3YXMgc3BlY2lmaWVkIGZvciAjaWQKCQkJaWYgKCBtYXRjaCAmJiAobWF0 Y2hbMV0gfHwgIWNvbnRleHQpICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAt PiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsxXSApCgkJCQkJc2VsZWN0b3IgPSBq UXVlcnkuY2xlYW4oIFsgbWF0Y2hbMV0gXSwgY29udGV4dCApOwoKCQkJCS8vIEhB TkRMRTogJCgiI2lkIikKCQkJCWVsc2UgewoJCQkJCXZhciBlbGVtID0gZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzNdICk7CgoJCQkJCS8vIE1ha2Ugc3Vy ZSBhbiBlbGVtZW50IHdhcyBsb2NhdGVkCgkJCQkJaWYgKCBlbGVtICl7CgkJCQkJ CS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSBhbmQgT3BlcmEgcmV0dXJuIGl0 ZW1zCgkJCQkJCS8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCQlpZiAoIGVs ZW0uaWQgIT0gbWF0Y2hbM10gKQoJCQkJCQkJcmV0dXJuIGpRdWVyeSgpLmZpbmQo IHNlbGVjdG9yICk7CgoJCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUg ZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CgkJCQkJCXJl dHVybiBqUXVlcnkoIGVsZW0gKTsKCQkJCQl9CgkJCQkJc2VsZWN0b3IgPSBbXTsK CQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCBbY29udGV4dF0pCgkJCS8vICh3 aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGVudCkuZmluZChleHBy KQoJCQl9IGVsc2UKCQkJCXJldHVybiBqUXVlcnkoIGNvbnRleHQgKS5maW5kKCBz ZWxlY3RvciApOwoKCQkvLyBIQU5ETEU6ICQoZnVuY3Rpb24pCgkJLy8gU2hvcnRj dXQgZm9yIGRvY3VtZW50IHJlYWR5CgkJfSBlbHNlIGlmICggalF1ZXJ5LmlzRnVu Y3Rpb24oIHNlbGVjdG9yICkgKQoJCQlyZXR1cm4galF1ZXJ5KCBkb2N1bWVudCAp WyBqUXVlcnkuZm4ucmVhZHkgPyAicmVhZHkiIDogImxvYWQiIF0oIHNlbGVjdG9y ICk7CgoJCXJldHVybiB0aGlzLnNldEFycmF5KGpRdWVyeS5tYWtlQXJyYXkoc2Vs ZWN0b3IpKTsKCX0sCgoJLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkg YmVpbmcgdXNlZAoJanF1ZXJ5OiAiMS4yLjYiLAoKCS8vIFRoZSBudW1iZXIgb2Yg ZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0Cglz aXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5sZW5ndGg7Cgl9LAoKCS8v IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRjaGVk IGVsZW1lbnQgc2V0CglsZW5ndGg6IDAsCgoJLy8gR2V0IHRoZSBOdGggZWxlbWVu dCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgoJLy8gR2V0IHRoZSB3aG9s ZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXkKCWdldDogZnVu Y3Rpb24oIG51bSApIHsKCQlyZXR1cm4gbnVtID09IHVuZGVmaW5lZCA/CgoJCQkv LyBSZXR1cm4gYSAnY2xlYW4nIGFycmF5CgkJCWpRdWVyeS5tYWtlQXJyYXkoIHRo aXMgKSA6CgoJCQkvLyBSZXR1cm4ganVzdCB0aGUgb2JqZWN0CgkJCXRoaXNbIG51 bSBdOwoJfSwKCgkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNo IGl0IG9udG8gdGhlIHN0YWNrCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hl ZCBlbGVtZW50IHNldCkKCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewoJ CS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFy IHJldCA9IGpRdWVyeSggZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0 IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVj dCA9IHRoaXM7CgoJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQg c2V0CgkJcmV0dXJuIHJldDsKCX0sCgoJLy8gRm9yY2UgdGhlIGN1cnJlbnQgbWF0 Y2hlZCBzZXQgb2YgZWxlbWVudHMgdG8gYmVjb21lCgkvLyB0aGUgc3BlY2lmaWVk IGFycmF5IG9mIGVsZW1lbnRzIChkZXN0cm95aW5nIHRoZSBzdGFjayBpbiB0aGUg cHJvY2VzcykKCS8vIFlvdSBzaG91bGQgdXNlIHB1c2hTdGFjaygpIGluIG9yZGVy IHRvIGRvIHRoaXMsIGJ1dCBtYWludGFpbiB0aGUgc3RhY2sKCXNldEFycmF5OiBm dW5jdGlvbiggZWxlbXMgKSB7CgkJLy8gUmVzZXR0aW5nIHRoZSBsZW5ndGggdG8g MCwgdGhlbiB1c2luZyB0aGUgbmF0aXZlIEFycmF5IHB1c2gKCQkvLyBpcyBhIHN1 cGVyLWZhc3Qgd2F5IHRvIHBvcHVsYXRlIGFuIG9iamVjdCB3aXRoIGFycmF5LWxp a2UgcHJvcGVydGllcwoJCXRoaXMubGVuZ3RoID0gMDsKCQlBcnJheS5wcm90b3R5 cGUucHVzaC5hcHBseSggdGhpcywgZWxlbXMgKTsKCgkJcmV0dXJuIHRoaXM7Cgl9 LAoKCS8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0 aGUgbWF0Y2hlZCBzZXQuCgkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMg d2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcwoJLy8gb25seSB1c2Vk IGludGVybmFsbHkuKQoJZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkg ewoJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTsK CX0sCgoJLy8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdp dGhpbgoJLy8gdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzCglpbmRleDogZnVu Y3Rpb24oIGVsZW0gKSB7CgkJdmFyIHJldCA9IC0xOwoKCQkvLyBMb2NhdGUgdGhl IHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5 LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwg dGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtICYmIGVsZW0uanF1ZXJ5 ID8gZWxlbVswXSA6IGVsZW0KCQksIHRoaXMgKTsKCX0sCgoJYXR0cjogZnVuY3Rp b24oIG5hbWUsIHZhbHVlLCB0eXBlICkgewoJCXZhciBvcHRpb25zID0gbmFtZTsK CgkJLy8gTG9vayBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UncmUgYWNjZXNzaW5nIGEg c3R5bGUgdmFsdWUKCQlpZiAoIG5hbWUuY29uc3RydWN0b3IgPT0gU3RyaW5nICkK CQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkKCQkJCXJldHVybiB0aGlzWzBd ICYmIGpRdWVyeVsgdHlwZSB8fCAiYXR0ciIgXSggdGhpc1swXSwgbmFtZSApOwoK CQkJZWxzZSB7CgkJCQlvcHRpb25zID0ge307CgkJCQlvcHRpb25zWyBuYW1lIF0g PSB2YWx1ZTsKCQkJfQoKCQkvLyBDaGVjayB0byBzZWUgaWYgd2UncmUgc2V0dGlu ZyBzdHlsZSB2YWx1ZXMKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpewoJ CQkvLyBTZXQgYWxsIHRoZSBzdHlsZXMKCQkJZm9yICggbmFtZSBpbiBvcHRpb25z ICkKCQkJCWpRdWVyeS5hdHRyKAoJCQkJCXR5cGUgPwoJCQkJCQl0aGlzLnN0eWxl IDoKCQkJCQkJdGhpcywKCQkJCQluYW1lLCBqUXVlcnkucHJvcCggdGhpcywgb3B0 aW9uc1sgbmFtZSBdLCB0eXBlLCBpLCBuYW1lICkKCQkJCSk7CgkJfSk7Cgl9LAoK CWNzczogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJLy8gaWdub3JlIG5lZ2F0 aXZlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzCgkJaWYgKCAoa2V5ID09ICd3aWR0 aCcgfHwga2V5ID09ICdoZWlnaHQnKSAmJiBwYXJzZUZsb2F0KHZhbHVlKSA8IDAg KQoJCQl2YWx1ZSA9IHVuZGVmaW5lZDsKCQlyZXR1cm4gdGhpcy5hdHRyKCBrZXks IHZhbHVlLCAiY3VyQ1NTIiApOwoJfSwKCgl0ZXh0OiBmdW5jdGlvbiggdGV4dCAp IHsKCQlpZiAoIHR5cGVvZiB0ZXh0ICE9ICJvYmplY3QiICYmIHRleHQgIT0gbnVs bCApCgkJCXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCAodGhpc1swXSAmJiB0 aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpLmNyZWF0ZVRleHROb2Rl KCB0ZXh0ICkgKTsKCgkJdmFyIHJldCA9ICIiOwoKCQlqUXVlcnkuZWFjaCggdGV4 dCB8fCB0aGlzLCBmdW5jdGlvbigpewoJCQlqUXVlcnkuZWFjaCggdGhpcy5jaGls ZE5vZGVzLCBmdW5jdGlvbigpewoJCQkJaWYgKCB0aGlzLm5vZGVUeXBlICE9IDgg KQoJCQkJCXJldCArPSB0aGlzLm5vZGVUeXBlICE9IDEgPwoJCQkJCQl0aGlzLm5v ZGVWYWx1ZSA6CgkJCQkJCWpRdWVyeS5mbi50ZXh0KCBbIHRoaXMgXSApOwoJCQl9 KTsKCQl9KTsKCgkJcmV0dXJuIHJldDsKCX0sCgoJd3JhcEFsbDogZnVuY3Rpb24o IGh0bWwgKSB7CgkJaWYgKCB0aGlzWzBdICkKCQkJLy8gVGhlIGVsZW1lbnRzIHRv IHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJalF1ZXJ5KCBodG1sLCB0aGlzWzBd Lm93bmVyRG9jdW1lbnQgKQoJCQkJLmNsb25lKCkKCQkJCS5pbnNlcnRCZWZvcmUo IHRoaXNbMF0gKQoJCQkJLm1hcChmdW5jdGlvbigpewoJCQkJCXZhciBlbGVtID0g dGhpczsKCgkJCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKQoJCQkJCQllbGVt ID0gZWxlbS5maXJzdENoaWxkOwoKCQkJCQlyZXR1cm4gZWxlbTsKCQkJCX0pCgkJ CQkuYXBwZW5kKHRoaXMpOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVy OiBmdW5jdGlvbiggaHRtbCApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9u KCl7CgkJCWpRdWVyeSggdGhpcyApLmNvbnRlbnRzKCkud3JhcEFsbCggaHRtbCAp OwoJCX0pOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQlyZXR1cm4g dGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwo IGh0bWwgKTsKCQl9KTsKCX0sCgoJYXBwZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1 cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZhbHNlLCBmdW5jdGlv bihlbGVtKXsKCQkJaWYgKHRoaXMubm9kZVR5cGUgPT0gMSkKCQkJCXRoaXMuYXBw ZW5kQ2hpbGQoIGVsZW0gKTsKCQl9KTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24o KSB7CgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCB0cnVl LCBmdW5jdGlvbihlbGVtKXsKCQkJaWYgKHRoaXMubm9kZVR5cGUgPT0gMSkKCQkJ CXRoaXMuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKCQl9 KTsKCX0sCgoJYmVmb3JlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21N YW5pcChhcmd1bWVudHMsIGZhbHNlLCBmYWxzZSwgZnVuY3Rpb24oZWxlbSl7CgkJ CXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQl9 KTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1h bmlwKGFyZ3VtZW50cywgZmFsc2UsIHRydWUsIGZ1bmN0aW9uKGVsZW0pewoJCQl0 aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJs aW5nICk7CgkJfSk7Cgl9LAoKCWVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRo aXMucHJldk9iamVjdCB8fCBqUXVlcnkoIFtdICk7Cgl9LAoKCWZpbmQ6IGZ1bmN0 aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgZWxlbXMgPSBqUXVlcnkubWFwKHRoaXMs IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4galF1ZXJ5LmZpbmQoIHNlbGVjdG9y LCBlbGVtICk7CgkJfSk7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggL1teKz5d IFteKz5dLy50ZXN0KCBzZWxlY3RvciApIHx8IHNlbGVjdG9yLmluZGV4T2YoIi4u IikgPiAtMSA/CgkJCWpRdWVyeS51bmlxdWUoIGVsZW1zICkgOgoJCQllbGVtcyAp OwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGV2ZW50cyApIHsKCQkvLyBEbyB0aGUg Y2xvbmUKCQl2YXIgcmV0ID0gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJaWYgKCBq UXVlcnkuYnJvd3Nlci5tc2llICYmICFqUXVlcnkuaXNYTUxEb2ModGhpcykgKSB7 CgkJCQkvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3 aGVuCgkJCQkvLyB1c2luZyBjbG9uZU5vZGUuIENhbGxpbmcgZGV0YWNoRXZlbnQg b24gdGhlCgkJCQkvLyBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBldmVudHMg ZnJvbSB0aGUgb3JpZ25hbAoJCQkJLy8gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0 aGlzLCB3ZSB1c2UgaW5uZXJIVE1MLgoJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhp cyBtZWFucyBzb21lIG1vZGlmaWNhdGlvbnMgdG8KCQkJCS8vIGF0dHJpYnV0ZXMg aW4gSUUgdGhhdCBhcmUgYWN0dWFsbHkgb25seSBzdG9yZWQKCQkJCS8vIGFzIHBy b3BlcnRpZXMgd2lsbCBub3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQoJCQkJLy8g dGhlIG5hbWUgYXR0cmlidXRlIG9uIGFuIGlucHV0KS4KCQkJCXZhciBjbG9uZSA9 IHRoaXMuY2xvbmVOb2RlKHRydWUpLAoJCQkJCWNvbnRhaW5lciA9IGRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCQkJY29udGFpbmVyLmFwcGVuZENoaWxk KGNsb25lKTsKCQkJCXJldHVybiBqUXVlcnkuY2xlYW4oW2NvbnRhaW5lci5pbm5l ckhUTUxdKVswXTsKCQkJfSBlbHNlCgkJCQlyZXR1cm4gdGhpcy5jbG9uZU5vZGUo dHJ1ZSk7CgkJfSk7CgoJCS8vIE5lZWQgdG8gc2V0IHRoZSBleHBhbmRvIHRvIG51 bGwgb24gdGhlIGNsb25lZCBzZXQgaWYgaXQgZXhpc3RzCgkJLy8gcmVtb3ZlRGF0 YSBkb2Vzbid0IHdvcmsgaGVyZSwgSUUgcmVtb3ZlcyBpdCBmcm9tIHRoZSBvcmln aW5hbCBhcyB3ZWxsCgkJLy8gdGhpcyBpcyBwcmltYXJpbHkgZm9yIElFIGJ1dCB0 aGUgZGF0YSBleHBhbmRvIHNob3VsZG4ndCBiZSBjb3BpZWQgb3ZlciBpbiBhbnkg YnJvd3NlcgoJCXZhciBjbG9uZSA9IHJldC5maW5kKCIqIikuYW5kU2VsZigpLmVh Y2goZnVuY3Rpb24oKXsKCQkJaWYgKCB0aGlzWyBleHBhbmRvIF0gIT0gdW5kZWZp bmVkICkKCQkJCXRoaXNbIGV4cGFuZG8gXSA9IG51bGw7CgkJfSk7CgoJCS8vIENv cHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmUKCQlp ZiAoIGV2ZW50cyA9PT0gdHJ1ZSApCgkJCXRoaXMuZmluZCgiKiIpLmFuZFNlbGYo KS5lYWNoKGZ1bmN0aW9uKGkpewoJCQkJaWYgKHRoaXMubm9kZVR5cGUgPT0gMykK CQkJCQlyZXR1cm47CgkJCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoIHRoaXMs ICJldmVudHMiICk7CgoJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkKCQkJ CQlmb3IgKCB2YXIgaGFuZGxlciBpbiBldmVudHNbIHR5cGUgXSApCgkJCQkJCWpR dWVyeS5ldmVudC5hZGQoIGNsb25lWyBpIF0sIHR5cGUsIGV2ZW50c1sgdHlwZSBd WyBoYW5kbGVyIF0sIGV2ZW50c1sgdHlwZSBdWyBoYW5kbGVyIF0uZGF0YSApOwoJ CQl9KTsKCgkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CgkJcmV0dXJuIHJldDsK CX0sCgoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRo aXMucHVzaFN0YWNrKAoJCQlqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSAm JgoJCQlqUXVlcnkuZ3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJCXJl dHVybiBzZWxlY3Rvci5jYWxsKCBlbGVtLCBpICk7CgkJCX0pIHx8CgoJCQlqUXVl cnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkgKTsKCX0sCgoJbm90OiBm dW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJaWYgKCBzZWxlY3Rvci5jb25zdHJ1Y3Rv ciA9PSBTdHJpbmcgKQoJCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSB3aGVyZSBqdXN0 IG9uZSBzZWxlY3RvciBpcyBwYXNzZWQgaW4KCQkJaWYgKCBpc1NpbXBsZS50ZXN0 KCBzZWxlY3RvciApICkKCQkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5 Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcywgdHJ1ZSApICk7CgkJCWVsc2UK CQkJCXNlbGVjdG9yID0galF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhp cyApOwoKCQl2YXIgaXNBcnJheUxpa2UgPSBzZWxlY3Rvci5sZW5ndGggJiYgc2Vs ZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV0gIT09IHVuZGVmaW5lZCAmJiAhc2Vs ZWN0b3Iubm9kZVR5cGU7CgkJcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkg ewoJCQlyZXR1cm4gaXNBcnJheUxpa2UgPyBqUXVlcnkuaW5BcnJheSggdGhpcywg c2VsZWN0b3IgKSA8IDAgOiB0aGlzICE9IHNlbGVjdG9yOwoJCX0pOwoJfSwKCglh ZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3Rh Y2soIGpRdWVyeS51bmlxdWUoIGpRdWVyeS5tZXJnZSgKCQkJdGhpcy5nZXQoKSwK CQkJdHlwZW9mIHNlbGVjdG9yID09ICdzdHJpbmcnID8KCQkJCWpRdWVyeSggc2Vs ZWN0b3IgKSA6CgkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciApCgkJKSkp OwoJfSwKCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXNl bGVjdG9yICYmIGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5s ZW5ndGggPiAwOwoJfSwKCgloYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkg ewoJCXJldHVybiB0aGlzLmlzKCAiLiIgKyBzZWxlY3RvciApOwoJfSwKCgl2YWw6 IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlpZiAoIHZhbHVlID09IHVuZGVmaW5lZCAp IHsKCgkJCWlmICggdGhpcy5sZW5ndGggKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXNb MF07CgoJCQkJLy8gV2UgbmVlZCB0byBoYW5kbGUgc2VsZWN0IGJveGVzIHNwZWNp YWwKCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkg ewoJCQkJCXZhciBpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwKCQkJCQkJdmFs dWVzID0gW10sCgkJCQkJCW9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsCgkJCQkJCW9u ZSA9IGVsZW0udHlwZSA9PSAic2VsZWN0LW9uZSI7CgoJCQkJCS8vIE5vdGhpbmcg d2FzIHNlbGVjdGVkCgkJCQkJaWYgKCBpbmRleCA8IDAgKQoJCQkJCQlyZXR1cm4g bnVsbDsKCgkJCQkJLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0 aW9ucwoJCQkJCWZvciAoIHZhciBpID0gb25lID8gaW5kZXggOiAwLCBtYXggPSBv bmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrICkg ewoJCQkJCQl2YXIgb3B0aW9uID0gb3B0aW9uc1sgaSBdOwoKCQkJCQkJaWYgKCBv cHRpb24uc2VsZWN0ZWQgKSB7CgkJCQkJCQkvLyBHZXQgdGhlIHNwZWNpZmMgdmFs dWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJCXZhbHVlID0galF1ZXJ5LmJyb3dzZXIu bXNpZSAmJiAhb3B0aW9uLmF0dHJpYnV0ZXMudmFsdWUuc3BlY2lmaWVkID8gb3B0 aW9uLnRleHQgOiBvcHRpb24udmFsdWU7CgoJCQkJCQkJLy8gV2UgZG9uJ3QgbmVl ZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJCWlmICggb25lICkKCQkJ CQkJCQlyZXR1cm4gdmFsdWU7CgoJCQkJCQkJLy8gTXVsdGktU2VsZWN0cyByZXR1 cm4gYW4gYXJyYXkKCQkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoJCQkJCQl9 CgkJCQkJfQoKCQkJCQlyZXR1cm4gdmFsdWVzOwoKCQkJCS8vIEV2ZXJ5dGhpbmcg ZWxzZSwgd2UganVzdCBncmFiIHRoZSB2YWx1ZQoJCQkJfSBlbHNlCgkJCQkJcmV0 dXJuICh0aGlzWzBdLnZhbHVlIHx8ICIiKS5yZXBsYWNlKC9cci9nLCAiIik7CgoJ CQl9CgoJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCX0KCgkJaWYoIHZhbHVlLmNvbnN0 cnVjdG9yID09IE51bWJlciApCgkJCXZhbHVlICs9ICcnOwoKCQlyZXR1cm4gdGhp cy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPSAxICkK CQkJCXJldHVybjsKCgkJCWlmICggdmFsdWUuY29uc3RydWN0b3IgPT0gQXJyYXkg JiYgL3JhZGlvfGNoZWNrYm94Ly50ZXN0KCB0aGlzLnR5cGUgKSApCgkJCQl0aGlz LmNoZWNrZWQgPSAoalF1ZXJ5LmluQXJyYXkodGhpcy52YWx1ZSwgdmFsdWUpID49 IDAgfHwKCQkJCQlqUXVlcnkuaW5BcnJheSh0aGlzLm5hbWUsIHZhbHVlKSA+PSAw KTsKCgkJCWVsc2UgaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJzZWxlY3Qi ICkgKSB7CgkJCQl2YXIgdmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSh2YWx1ZSk7 CgoJCQkJalF1ZXJ5KCAib3B0aW9uIiwgdGhpcyApLmVhY2goZnVuY3Rpb24oKXsK CQkJCQl0aGlzLnNlbGVjdGVkID0gKGpRdWVyeS5pbkFycmF5KCB0aGlzLnZhbHVl LCB2YWx1ZXMgKSA+PSAwIHx8CgkJCQkJCWpRdWVyeS5pbkFycmF5KCB0aGlzLnRl eHQsIHZhbHVlcyApID49IDApOwoJCQkJfSk7CgoJCQkJaWYgKCAhdmFsdWVzLmxl bmd0aCApCgkJCQkJdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7CgoJCQl9IGVsc2UK CQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKCQl9KTsKCX0sCgoJaHRtbDogZnVuY3Rp b24oIHZhbHVlICkgewoJCXJldHVybiB2YWx1ZSA9PSB1bmRlZmluZWQgPwoJCQko dGhpc1swXSA/CgkJCQl0aGlzWzBdLmlubmVySFRNTCA6CgkJCQludWxsKSA6CgkJ CXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7Cgl9LAoKCXJlcGxhY2VXaXRo OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHRoaXMuYWZ0ZXIoIHZhbHVl ICkucmVtb3ZlKCk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQlyZXR1cm4g dGhpcy5zbGljZSggaSwgaSArIDEgKTsKCX0sCgoJc2xpY2U6IGZ1bmN0aW9uKCkg ewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggQXJyYXkucHJvdG90eXBlLnNsaWNl LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCgltYXA6IGZ1bmN0aW9u KCBjYWxsYmFjayApIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5t YXAodGhpcywgZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBjYWxsYmFjay5j YWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSkpOwoJfSwKCglhbmRTZWxmOiBmdW5j dGlvbigpIHsKCQlyZXR1cm4gdGhpcy5hZGQoIHRoaXMucHJldk9iamVjdCApOwoJ fSwKCglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApewoJCXZhciBwYXJ0cyA9 IGtleS5zcGxpdCgiLiIpOwoJCXBhcnRzWzFdID0gcGFydHNbMV0gPyAiLiIgKyBw YXJ0c1sxXSA6ICIiOwoKCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJ CXZhciBkYXRhID0gdGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIgKyBwYXJ0 c1sxXSArICIhIiwgW3BhcnRzWzBdXSk7CgoJCQlpZiAoIGRhdGEgPT09IHVuZGVm aW5lZCAmJiB0aGlzLmxlbmd0aCApCgkJCQlkYXRhID0galF1ZXJ5LmRhdGEoIHRo aXNbMF0sIGtleSApOwoKCQkJcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBw YXJ0c1sxXSA/CgkJCQl0aGlzLmRhdGEoIHBhcnRzWzBdICkgOgoJCQkJZGF0YTsK CQl9IGVsc2UKCQkJcmV0dXJuIHRoaXMudHJpZ2dlcigic2V0RGF0YSIgKyBwYXJ0 c1sxXSArICIhIiwgW3BhcnRzWzBdLCB2YWx1ZV0pLmVhY2goZnVuY3Rpb24oKXsK CQkJCWpRdWVyeS5kYXRhKCB0aGlzLCBrZXksIHZhbHVlICk7CgkJCX0pOwoJfSwK CglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICl7CgkJcmV0dXJuIHRoaXMuZWFj aChmdW5jdGlvbigpewoJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7 CgkJfSk7Cgl9LAoKCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIHJl dmVyc2UsIGNhbGxiYWNrICkgewoJCXZhciBjbG9uZSA9IHRoaXMubGVuZ3RoID4g MSwgZWxlbXM7CgoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJaWYg KCAhZWxlbXMgKSB7CgkJCQllbGVtcyA9IGpRdWVyeS5jbGVhbiggYXJncywgdGhp cy5vd25lckRvY3VtZW50ICk7CgoJCQkJaWYgKCByZXZlcnNlICkKCQkJCQllbGVt cy5yZXZlcnNlKCk7CgkJCX0KCgkJCXZhciBvYmogPSB0aGlzOwoKCQkJaWYgKCB0 YWJsZSAmJiBqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJ0YWJsZSIgKSAmJiBqUXVl cnkubm9kZU5hbWUoIGVsZW1zWzBdLCAidHIiICkgKQoJCQkJb2JqID0gdGhpcy5n ZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXSB8fCB0aGlzLmFwcGVuZENo aWxkKCB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSAp OwoKCQkJdmFyIHNjcmlwdHMgPSBqUXVlcnkoIFtdICk7CgoJCQlqUXVlcnkuZWFj aChlbGVtcywgZnVuY3Rpb24oKXsKCQkJCXZhciBlbGVtID0gY2xvbmUgPwoJCQkJ CWpRdWVyeSggdGhpcyApLmNsb25lKCB0cnVlIClbMF0gOgoJCQkJCXRoaXM7CgoJ CQkJLy8gZXhlY3V0ZSBhbGwgc2NyaXB0cyBhZnRlciB0aGUgZWxlbWVudHMgaGF2 ZSBiZWVuIGluamVjdGVkCgkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwg InNjcmlwdCIgKSApCgkJCQkJc2NyaXB0cyA9IHNjcmlwdHMuYWRkKCBlbGVtICk7 CgkJCQllbHNlIHsKCQkJCQkvLyBSZW1vdmUgYW55IGlubmVyIHNjcmlwdHMgZm9y IGxhdGVyIGV2YWx1YXRpb24KCQkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT0gMSAp CgkJCQkJCXNjcmlwdHMgPSBzY3JpcHRzLmFkZCggalF1ZXJ5KCAic2NyaXB0Iiwg ZWxlbSApLnJlbW92ZSgpICk7CgoJCQkJCS8vIEluamVjdCB0aGUgZWxlbWVudHMg aW50byB0aGUgZG9jdW1lbnQKCQkJCQljYWxsYmFjay5jYWxsKCBvYmosIGVsZW0g KTsKCQkJCX0KCQkJfSk7CgoJCQlzY3JpcHRzLmVhY2goIGV2YWxTY3JpcHQgKTsK CQl9KTsKCX0KfTsKCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVy eSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KalF1ZXJ5LmZuLmlu aXQucHJvdG90eXBlID0galF1ZXJ5LmZuOwoKZnVuY3Rpb24gZXZhbFNjcmlwdCgg aSwgZWxlbSApIHsKCWlmICggZWxlbS5zcmMgKQoJCWpRdWVyeS5hamF4KHsKCQkJ dXJsOiBlbGVtLnNyYywKCQkJYXN5bmM6IGZhbHNlLAoJCQlkYXRhVHlwZTogInNj cmlwdCIKCQl9KTsKCgllbHNlCgkJalF1ZXJ5Lmdsb2JhbEV2YWwoIGVsZW0udGV4 dCB8fCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJIVE1MIHx8ICIiICk7 CgoJaWYgKCBlbGVtLnBhcmVudE5vZGUgKQoJCWVsZW0ucGFyZW50Tm9kZS5yZW1v dmVDaGlsZCggZWxlbSApOwp9CgpmdW5jdGlvbiBub3coKXsKCXJldHVybiArbmV3 IERhdGU7Cn0KCmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVu Y3Rpb24oKSB7CgkvLyBjb3B5IHJlZmVyZW5jZSB0byB0YXJnZXQgb2JqZWN0Cgl2 YXIgdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LCBpID0gMSwgbGVuZ3RoID0g YXJndW1lbnRzLmxlbmd0aCwgZGVlcCA9IGZhbHNlLCBvcHRpb25zOwoKCS8vIEhh bmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KCWlmICggdGFyZ2V0LmNvbnN0cnVj dG9yID09IEJvb2xlYW4gKSB7CgkJZGVlcCA9IHRhcmdldDsKCQl0YXJnZXQgPSBh cmd1bWVudHNbMV0gfHwge307CgkJLy8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhl IHRhcmdldAoJCWkgPSAyOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0 IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5 KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9ICJvYmplY3QiICYmIHR5cGVvZiB0YXJn ZXQgIT0gImZ1bmN0aW9uIiApCgkJdGFyZ2V0ID0ge307CgoJLy8gZXh0ZW5kIGpR dWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAo IGxlbmd0aCA9PSBpICkgewoJCXRhcmdldCA9IHRoaXM7CgkJLS1pOwoJfQoKCWZv ciAoIDsgaSA8IGxlbmd0aDsgaSsrICkKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24t bnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50 c1sgaSBdKSAhPSBudWxsICkKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJ CQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQkJdmFyIHNyYyA9IHRh cmdldFsgbmFtZSBdLCBjb3B5ID0gb3B0aW9uc1sgbmFtZSBdOwoKCQkJCS8vIFBy ZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKCQkJCWlmICggdGFyZ2V0ID09PSBjb3B5 ICkKCQkJCQljb250aW51ZTsKCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdp bmcgb2JqZWN0IHZhbHVlcwoJCQkJaWYgKCBkZWVwICYmIGNvcHkgJiYgdHlwZW9m IGNvcHkgPT0gIm9iamVjdCIgJiYgIWNvcHkubm9kZVR5cGUgKQoJCQkJCXRhcmdl dFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgCgkJCQkJCS8vIE5ldmVy IG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbQoJCQkJCQlzcmMgfHwg KCBjb3B5Lmxlbmd0aCAhPSBudWxsID8gWyBdIDogeyB9ICkKCQkJCQksIGNvcHkg KTsKCgkJCQkvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzCgkJCQll bHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkKCQkJCQl0YXJnZXRbIG5hbWUg XSA9IGNvcHk7CgoJCQl9CgoJLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3QK CXJldHVybiB0YXJnZXQ7Cn07Cgp2YXIgZXhwYW5kbyA9ICJqUXVlcnkiICsgbm93 KCksIHV1aWQgPSAwLCB3aW5kb3dEYXRhID0ge30sCgkvLyBleGNsdWRlIHRoZSBm b2xsb3dpbmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4CglleGNsdWRlID0gL3ot P2luZGV4fGZvbnQtP3dlaWdodHxvcGFjaXR5fHpvb218bGluZS0/aGVpZ2h0L2ks CgkvLyBjYWNoZSBkZWZhdWx0VmlldwoJZGVmYXVsdFZpZXcgPSBkb2N1bWVudC5k ZWZhdWx0VmlldyB8fCB7fTsKCmpRdWVyeS5leHRlbmQoewoJbm9Db25mbGljdDog ZnVuY3Rpb24oIGRlZXAgKSB7CgkJd2luZG93LiQgPSBfJDsKCgkJaWYgKCBkZWVw ICkKCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CgoJCXJldHVybiBqUXVlcnk7 Cgl9LAoKCS8vIFNlZSB0ZXN0L3VuaXQvY29yZS5qcyBmb3IgZGV0YWlscyBjb25j ZXJuaW5nIHRoaXMgZnVuY3Rpb24uCglpc0Z1bmN0aW9uOiBmdW5jdGlvbiggZm4g KSB7CgkJcmV0dXJuICEhZm4gJiYgdHlwZW9mIGZuICE9ICJzdHJpbmciICYmICFm bi5ub2RlTmFtZSAmJgoJCQlmbi5jb25zdHJ1Y3RvciAhPSBBcnJheSAmJiAvXltc c1tdP2Z1bmN0aW9uLy50ZXN0KCBmbiArICIiICk7Cgl9LAoKCS8vIGNoZWNrIGlm IGFuIGVsZW1lbnQgaXMgaW4gYSAob3IgaXMgYW4pIFhNTCBkb2N1bWVudAoJaXNY TUxEb2M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBlbGVtLmRvY3VtZW50 RWxlbWVudCAmJiAhZWxlbS5ib2R5IHx8CgkJCWVsZW0udGFnTmFtZSAmJiBlbGVt Lm93bmVyRG9jdW1lbnQgJiYgIWVsZW0ub3duZXJEb2N1bWVudC5ib2R5OwoJfSwK CgkvLyBFdmFsdWxhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHQKCWds b2JhbEV2YWw6IGZ1bmN0aW9uKCBkYXRhICkgewoJCWRhdGEgPSBqUXVlcnkudHJp bSggZGF0YSApOwoKCQlpZiAoIGRhdGEgKSB7CgkJCS8vIEluc3BpcmVkIGJ5IGNv ZGUgYnkgQW5kcmVhIEdpYW1tYXJjaGkKCQkJLy8gaHR0cDovL3dlYnJlZmxlY3Rp b24uYmxvZ3Nwb3QuY29tLzIwMDcvMDgvZ2xvYmFsLXNjb3BlLWV2YWx1YXRpb24t YW5kLWRvbS5odG1sCgkJCXZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNC eVRhZ05hbWUoImhlYWQiKVswXSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQs CgkJCQlzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsK CgkJCXNjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CgkJCWlmICggalF1 ZXJ5LmJyb3dzZXIubXNpZSApCgkJCQlzY3JpcHQudGV4dCA9IGRhdGE7CgkJCWVs c2UKCQkJCXNjcmlwdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4dE5v ZGUoIGRhdGEgKSApOwoKCQkJLy8gVXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9m IGFwcGVuZENoaWxkICB0byBjaXJjdW12ZW50IGFuIElFNiBidWcuCgkJCS8vIFRo aXMgYXJpc2VzIHdoZW4gYSBiYXNlIG5vZGUgaXMgdXNlZCAoIzI3MDkpLgoJCQlo ZWFkLmluc2VydEJlZm9yZSggc2NyaXB0LCBoZWFkLmZpcnN0Q2hpbGQgKTsKCQkJ aGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CgkJfQoJfSwKCglub2RlTmFtZTog ZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJcmV0dXJuIGVsZW0ubm9kZU5hbWUg JiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09IG5hbWUudG9VcHBlckNh c2UoKTsKCX0sCgoJY2FjaGU6IHt9LAoKCWRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBu YW1lLCBkYXRhICkgewoJCWVsZW0gPSBlbGVtID09IHdpbmRvdyA/CgkJCXdpbmRv d0RhdGEgOgoJCQllbGVtOwoKCQl2YXIgaWQgPSBlbGVtWyBleHBhbmRvIF07CgoJ CS8vIENvbXB1dGUgYSB1bmlxdWUgSUQgZm9yIHRoZSBlbGVtZW50CgkJaWYgKCAh aWQgKQoJCQlpZCA9IGVsZW1bIGV4cGFuZG8gXSA9ICsrdXVpZDsKCgkJLy8gT25s eSBnZW5lcmF0ZSB0aGUgZGF0YSBjYWNoZSBpZiB3ZSdyZQoJCS8vIHRyeWluZyB0 byBhY2Nlc3Mgb3IgbWFuaXB1bGF0ZSBpdAoJCWlmICggbmFtZSAmJiAhalF1ZXJ5 LmNhY2hlWyBpZCBdICkKCQkJalF1ZXJ5LmNhY2hlWyBpZCBdID0ge307CgoJCS8v IFByZXZlbnQgb3ZlcnJpZGluZyB0aGUgbmFtZWQgY2FjaGUgd2l0aCB1bmRlZmlu ZWQgdmFsdWVzCgkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKQoJCQlqUXVlcnku Y2FjaGVbIGlkIF1bIG5hbWUgXSA9IGRhdGE7CgoJCS8vIFJldHVybiB0aGUgbmFt ZWQgY2FjaGUgZGF0YSwgb3IgdGhlIElEIGZvciB0aGUgZWxlbWVudAoJCXJldHVy biBuYW1lID8KCQkJalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF0gOgoJCQlpZDsK CX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJZWxl bSA9IGVsZW0gPT0gd2luZG93ID8KCQkJd2luZG93RGF0YSA6CgkJCWVsZW07CgoJ CXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsKCgkJLy8gSWYgd2Ugd2FudCB0byBy ZW1vdmUgYSBzcGVjaWZpYyBzZWN0aW9uIG9mIHRoZSBlbGVtZW50J3MgZGF0YQoJ CWlmICggbmFtZSApIHsKCQkJaWYgKCBqUXVlcnkuY2FjaGVbIGlkIF0gKSB7CgkJ CQkvLyBSZW1vdmUgdGhlIHNlY3Rpb24gb2YgY2FjaGUgZGF0YQoJCQkJZGVsZXRl IGpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdOwoKCQkJCS8vIElmIHdlJ3ZlIHJl bW92ZWQgYWxsIHRoZSBkYXRhLCByZW1vdmUgdGhlIGVsZW1lbnQncyBjYWNoZQoJ CQkJbmFtZSA9ICIiOwoKCQkJCWZvciAoIG5hbWUgaW4galF1ZXJ5LmNhY2hlWyBp ZCBdICkKCQkJCQlicmVhazsKCgkJCQlpZiAoICFuYW1lICkKCQkJCQlqUXVlcnku cmVtb3ZlRGF0YSggZWxlbSApOwoJCQl9CgoJCS8vIE90aGVyd2lzZSwgd2Ugd2Fu dCB0byByZW1vdmUgYWxsIG9mIHRoZSBlbGVtZW50J3MgZGF0YQoJCX0gZWxzZSB7 CgkJCS8vIENsZWFuIHVwIHRoZSBlbGVtZW50IGV4cGFuZG8KCQkJdHJ5IHsKCQkJ CWRlbGV0ZSBlbGVtWyBleHBhbmRvIF07CgkJCX0gY2F0Y2goZSl7CgkJCQkvLyBJ RSBoYXMgdHJvdWJsZSBkaXJlY3RseSByZW1vdmluZyB0aGUgZXhwYW5kbwoJCQkJ Ly8gYnV0IGl0J3Mgb2sgd2l0aCB1c2luZyByZW1vdmVBdHRyaWJ1dGUKCQkJCWlm ICggZWxlbS5yZW1vdmVBdHRyaWJ1dGUgKQoJCQkJCWVsZW0ucmVtb3ZlQXR0cmli dXRlKCBleHBhbmRvICk7CgkJCX0KCgkJCS8vIENvbXBsZXRlbHkgcmVtb3ZlIHRo ZSBkYXRhIGNhY2hlCgkJCWRlbGV0ZSBqUXVlcnkuY2FjaGVbIGlkIF07CgkJfQoJ fSwKCgkvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgllYWNoOiBm dW5jdGlvbiggb2JqZWN0LCBjYWxsYmFjaywgYXJncyApIHsKCQl2YXIgbmFtZSwg aSA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7CgoJCWlmICggYXJncyApIHsK CQkJaWYgKCBsZW5ndGggPT0gdW5kZWZpbmVkICkgewoJCQkJZm9yICggbmFtZSBp biBvYmplY3QgKQoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgbmFt ZSBdLCBhcmdzICkgPT09IGZhbHNlICkKCQkJCQkJYnJlYWs7CgkJCX0gZWxzZQoJ CQkJZm9yICggOyBpIDwgbGVuZ3RoOyApCgkJCQkJaWYgKCBjYWxsYmFjay5hcHBs eSggb2JqZWN0WyBpKysgXSwgYXJncyApID09PSBmYWxzZSApCgkJCQkJCWJyZWFr OwoKCQkvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1v biB1c2Ugb2YgZWFjaAoJCX0gZWxzZSB7CgkJCWlmICggbGVuZ3RoID09IHVuZGVm aW5lZCApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkKCQkJCQlpZiAoIGNh bGxiYWNrLmNhbGwoIG9iamVjdFsgbmFtZSBdLCBuYW1lLCBvYmplY3RbIG5hbWUg XSApID09PSBmYWxzZSApCgkJCQkJCWJyZWFrOwoJCQl9IGVsc2UKCQkJCWZvciAo IHZhciB2YWx1ZSA9IG9iamVjdFswXTsKCQkJCQlpIDwgbGVuZ3RoICYmIGNhbGxi YWNrLmNhbGwoIHZhbHVlLCBpLCB2YWx1ZSApICE9PSBmYWxzZTsgdmFsdWUgPSBv YmplY3RbKytpXSApe30KCQl9CgoJCXJldHVybiBvYmplY3Q7Cgl9LAoKCXByb3A6 IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgdHlwZSwgaSwgbmFtZSApIHsKCQkvLyBI YW5kbGUgZXhlY3V0YWJsZSBmdW5jdGlvbnMKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0 aW9uKCB2YWx1ZSApICkKCQkJdmFsdWUgPSB2YWx1ZS5jYWxsKCBlbGVtLCBpICk7 CgoJCS8vIEhhbmRsZSBwYXNzaW5nIGluIGEgbnVtYmVyIHRvIGEgQ1NTIHByb3Bl cnR5CgkJcmV0dXJuIHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yID09IE51bWJl ciAmJiB0eXBlID09ICJjdXJDU1MiICYmICFleGNsdWRlLnRlc3QoIG5hbWUgKSA/ CgkJCXZhbHVlICsgInB4IiA6CgkJCXZhbHVlOwoJfSwKCgljbGFzc05hbWU6IHsK CQkvLyBpbnRlcm5hbCBvbmx5LCB1c2UgYWRkQ2xhc3MoImNsYXNzIikKCQlhZGQ6 IGZ1bmN0aW9uKCBlbGVtLCBjbGFzc05hbWVzICkgewoJCQlqUXVlcnkuZWFjaCgo Y2xhc3NOYW1lcyB8fCAiIikuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpLCBjbGFz c05hbWUpewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDEgJiYgIWpRdWVyeS5j bGFzc05hbWUuaGFzKCBlbGVtLmNsYXNzTmFtZSwgY2xhc3NOYW1lICkgKQoJCQkJ CWVsZW0uY2xhc3NOYW1lICs9IChlbGVtLmNsYXNzTmFtZSA/ICIgIiA6ICIiKSAr IGNsYXNzTmFtZTsKCQkJfSk7CgkJfSwKCgkJLy8gaW50ZXJuYWwgb25seSwgdXNl IHJlbW92ZUNsYXNzKCJjbGFzcyIpCgkJcmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwg Y2xhc3NOYW1lcyApIHsKCQkJaWYgKGVsZW0ubm9kZVR5cGUgPT0gMSkKCQkJCWVs ZW0uY2xhc3NOYW1lID0gY2xhc3NOYW1lcyAhPSB1bmRlZmluZWQgPwoJCQkJCWpR dWVyeS5ncmVwKGVsZW0uY2xhc3NOYW1lLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24o Y2xhc3NOYW1lKXsKCQkJCQkJcmV0dXJuICFqUXVlcnkuY2xhc3NOYW1lLmhhcygg Y2xhc3NOYW1lcywgY2xhc3NOYW1lICk7CgkJCQkJfSkuam9pbigiICIpIDoKCQkJ CQkiIjsKCQl9LAoKCQkvLyBpbnRlcm5hbCBvbmx5LCB1c2UgaGFzQ2xhc3MoImNs YXNzIikKCQloYXM6IGZ1bmN0aW9uKCBlbGVtLCBjbGFzc05hbWUgKSB7CgkJCXJl dHVybiBqUXVlcnkuaW5BcnJheSggY2xhc3NOYW1lLCAoZWxlbS5jbGFzc05hbWUg fHwgZWxlbSkudG9TdHJpbmcoKS5zcGxpdCgvXHMrLykgKSA+IC0xOwoJCX0KCX0s CgoJLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBw cm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucwoJc3dhcDogZnVu Y3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkgewoJCXZhciBvbGQgPSB7 fTsKCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUg bmV3IG9uZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQlvbGRb IG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKCQkJZWxlbS5zdHlsZVsgbmFt ZSBdID0gb3B0aW9uc1sgbmFtZSBdOwoJCX0KCgkJY2FsbGJhY2suY2FsbCggZWxl bSApOwoKCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKCQlmb3IgKCB2YXIgbmFt ZSBpbiBvcHRpb25zICkKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1l IF07Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlICkgewoJ CWlmICggbmFtZSA9PSAid2lkdGgiIHx8IG5hbWUgPT0gImhlaWdodCIgKSB7CgkJ CXZhciB2YWwsIHByb3BzID0geyBwb3NpdGlvbjogImFic29sdXRlIiwgdmlzaWJp bGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ImJsb2NrIiB9LCB3aGljaCA9IG5hbWUg PT0gIndpZHRoIiA/IFsgIkxlZnQiLCAiUmlnaHQiIF0gOiBbICJUb3AiLCAiQm90 dG9tIiBdOwoKCQkJZnVuY3Rpb24gZ2V0V0goKSB7CgkJCQl2YWwgPSBuYW1lID09 ICJ3aWR0aCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQ7 CgkJCQl2YXIgcGFkZGluZyA9IDAsIGJvcmRlciA9IDA7CgkJCQlqUXVlcnkuZWFj aCggd2hpY2gsIGZ1bmN0aW9uKCkgewoJCQkJCXBhZGRpbmcgKz0gcGFyc2VGbG9h dChqUXVlcnkuY3VyQ1NTKCBlbGVtLCAicGFkZGluZyIgKyB0aGlzLCB0cnVlKSkg fHwgMDsKCQkJCQlib3JkZXIgKz0gcGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKCBl bGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiLCB0cnVlKSkgfHwgMDsKCQkJ CX0pOwoJCQkJdmFsIC09IE1hdGgucm91bmQocGFkZGluZyArIGJvcmRlcik7CgkJ CX0KCgkJCWlmICggalF1ZXJ5KGVsZW0pLmlzKCI6dmlzaWJsZSIpICkKCQkJCWdl dFdIKCk7CgkJCWVsc2UKCQkJCWpRdWVyeS5zd2FwKCBlbGVtLCBwcm9wcywgZ2V0 V0ggKTsKCgkJCXJldHVybiBNYXRoLm1heCgwLCB2YWwpOwoJCX0KCgkJcmV0dXJu IGpRdWVyeS5jdXJDU1MoIGVsZW0sIG5hbWUsIGZvcmNlICk7Cgl9LAoKCWN1ckNT UzogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlICkgewoJCXZhciByZXQsIHN0 eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gQSBoZWxwZXIgbWV0aG9kIGZvciBkZXRl cm1pbmluZyBpZiBhbiBlbGVtZW50J3MgdmFsdWVzIGFyZSBicm9rZW4KCQlmdW5j dGlvbiBjb2xvciggZWxlbSApIHsKCQkJaWYgKCAhalF1ZXJ5LmJyb3dzZXIuc2Fm YXJpICkKCQkJCXJldHVybiBmYWxzZTsKCgkJCS8vIGRlZmF1bHRWaWV3IGlzIGNh Y2hlZAoJCQl2YXIgcmV0ID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSgg ZWxlbSwgbnVsbCApOwoJCQlyZXR1cm4gIXJldCB8fCByZXQuZ2V0UHJvcGVydHlW YWx1ZSgiY29sb3IiKSA9PSAiIjsKCQl9CgoJCS8vIFdlIG5lZWQgdG8gaGFuZGxl IG9wYWNpdHkgc3BlY2lhbCBpbiBJRQoJCWlmICggbmFtZSA9PSAib3BhY2l0eSIg JiYgalF1ZXJ5LmJyb3dzZXIubXNpZSApIHsKCQkJcmV0ID0galF1ZXJ5LmF0dHIo IHN0eWxlLCAib3BhY2l0eSIgKTsKCgkJCXJldHVybiByZXQgPT0gIiIgPwoJCQkJ IjEiIDoKCQkJCXJldDsKCQl9CgkJLy8gT3BlcmEgc29tZXRpbWVzIHdpbGwgZ2l2 ZSB0aGUgd3JvbmcgZGlzcGxheSBhbnN3ZXIsIHRoaXMgZml4ZXMgaXQsIHNlZSAj MjAzNwoJCWlmICggalF1ZXJ5LmJyb3dzZXIub3BlcmEgJiYgbmFtZSA9PSAiZGlz cGxheSIgKSB7CgkJCXZhciBzYXZlID0gc3R5bGUub3V0bGluZTsKCQkJc3R5bGUu b3V0bGluZSA9ICIwIHNvbGlkIGJsYWNrIjsKCQkJc3R5bGUub3V0bGluZSA9IHNh dmU7CgkJfQoKCQkvLyBNYWtlIHN1cmUgd2UncmUgdXNpbmcgdGhlIHJpZ2h0IG5h bWUgZm9yIGdldHRpbmcgdGhlIGZsb2F0IHZhbHVlCgkJaWYgKCBuYW1lLm1hdGNo KCAvZmxvYXQvaSApICkKCQkJbmFtZSA9IHN0eWxlRmxvYXQ7CgoJCWlmICggIWZv cmNlICYmIHN0eWxlICYmIHN0eWxlWyBuYW1lIF0gKQoJCQlyZXQgPSBzdHlsZVsg bmFtZSBdOwoKCQllbHNlIGlmICggZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHls ZSApIHsKCgkJCS8vIE9ubHkgImZsb2F0IiBpcyBuZWVkZWQgaGVyZQoJCQlpZiAo IG5hbWUubWF0Y2goIC9mbG9hdC9pICkgKQoJCQkJbmFtZSA9ICJmbG9hdCI7CgoJ CQluYW1lID0gbmFtZS5yZXBsYWNlKCAvKFtBLVpdKS9nLCAiLSQxIiApLnRvTG93 ZXJDYXNlKCk7CgoJCQl2YXIgY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3Lmdl dENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTsKCgkJCWlmICggY29tcHV0ZWRT dHlsZSAmJiAhY29sb3IoIGVsZW0gKSApCgkJCQlyZXQgPSBjb21wdXRlZFN0eWxl LmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKTsKCgkJCS8vIElmIHRoZSBlbGVtZW50 IGlzbid0IHJlcG9ydGluZyBpdHMgdmFsdWVzIHByb3Blcmx5IGluIFNhZmFyaQoJ CQkvLyB0aGVuIHNvbWUgZGlzcGxheTogbm9uZSBlbGVtZW50cyBhcmUgaW52b2x2 ZWQKCQkJZWxzZSB7CgkJCQl2YXIgc3dhcCA9IFtdLCBzdGFjayA9IFtdLCBhID0g ZWxlbSwgaSA9IDA7CgoJCQkJLy8gTG9jYXRlIGFsbCBvZiB0aGUgcGFyZW50IGRp c3BsYXk6IG5vbmUgZWxlbWVudHMKCQkJCWZvciAoIDsgYSAmJiBjb2xvcihhKTsg YSA9IGEucGFyZW50Tm9kZSApCgkJCQkJc3RhY2sudW5zaGlmdChhKTsKCgkJCQkv LyBHbyB0aHJvdWdoIGFuZCBtYWtlIHRoZW0gdmlzaWJsZSwgYnV0IGluIHJldmVy c2UKCQkJCS8vIChJdCB3b3VsZCBiZSBiZXR0ZXIgaWYgd2Uga25ldyB0aGUgZXhh Y3QgZGlzcGxheSB0eXBlIHRoYXQgdGhleSBoYWQpCgkJCQlmb3IgKCA7IGkgPCBz dGFjay5sZW5ndGg7IGkrKyApCgkJCQkJaWYgKCBjb2xvciggc3RhY2tbIGkgXSAp ICkgewoJCQkJCQlzd2FwWyBpIF0gPSBzdGFja1sgaSBdLnN0eWxlLmRpc3BsYXk7 CgkJCQkJCXN0YWNrWyBpIF0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CgkJCQkJ fQoKCQkJCS8vIFNpbmNlIHdlIGZsaXAgdGhlIGRpc3BsYXkgc3R5bGUsIHdlIGhh dmUgdG8gaGFuZGxlIHRoYXQKCQkJCS8vIG9uZSBzcGVjaWFsLCBvdGhlcndpc2Ug Z2V0IHRoZSB2YWx1ZQoJCQkJcmV0ID0gbmFtZSA9PSAiZGlzcGxheSIgJiYgc3dh cFsgc3RhY2subGVuZ3RoIC0gMSBdICE9IG51bGwgPwoJCQkJCSJub25lIiA6CgkJ CQkJKCBjb21wdXRlZFN0eWxlICYmIGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlW YWx1ZSggbmFtZSApICkgfHwgIiI7CgoJCQkJLy8gRmluYWxseSwgcmV2ZXJ0IHRo ZSBkaXNwbGF5IHN0eWxlcyBiYWNrCgkJCQlmb3IgKCBpID0gMDsgaSA8IHN3YXAu bGVuZ3RoOyBpKysgKQoJCQkJCWlmICggc3dhcFsgaSBdICE9IG51bGwgKQoJCQkJ CQlzdGFja1sgaSBdLnN0eWxlLmRpc3BsYXkgPSBzd2FwWyBpIF07CgkJCX0KCgkJ CS8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFj aXR5CgkJCWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgcmV0ID09ICIiICkKCQkJ CXJldCA9ICIxIjsKCgkJfSBlbHNlIGlmICggZWxlbS5jdXJyZW50U3R5bGUgKSB7 CgkJCXZhciBjYW1lbENhc2UgPSBuYW1lLnJlcGxhY2UoL1wtKFx3KS9nLCBmdW5j dGlvbihhbGwsIGxldHRlcil7CgkJCQlyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNl KCk7CgkJCX0pOwoKCQkJcmV0ID0gZWxlbS5jdXJyZW50U3R5bGVbIG5hbWUgXSB8 fCBlbGVtLmN1cnJlbnRTdHlsZVsgY2FtZWxDYXNlIF07CgoJCQkvLyBGcm9tIHRo ZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCgkJCS8vIGh0dHA6Ly9lcmlr LmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8jY29tbWVudC0x MDIyOTEKCgkJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFy IHBpeGVsIG51bWJlcgoJCQkvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWly ZCBlbmRpbmcsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHMKCQkJaWYg KCAhL15cZCsocHgpPyQvaS50ZXN0KCByZXQgKSAmJiAvXlxkLy50ZXN0KCByZXQg KSApIHsKCQkJCS8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKCQkJCXZh ciBsZWZ0ID0gc3R5bGUubGVmdCwgcnNMZWZ0ID0gZWxlbS5ydW50aW1lU3R5bGUu bGVmdDsKCgkJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29t cHV0ZWQgdmFsdWUgb3V0CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gZWxl bS5jdXJyZW50U3R5bGUubGVmdDsKCQkJCXN0eWxlLmxlZnQgPSByZXQgfHwgMDsK CQkJCXJldCA9IHN0eWxlLnBpeGVsTGVmdCArICJweCI7CgoJCQkJLy8gUmV2ZXJ0 IHRoZSBjaGFuZ2VkIHZhbHVlcwoJCQkJc3R5bGUubGVmdCA9IGxlZnQ7CgkJCQll bGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0OwoJCQl9CgkJfQoKCQlyZXR1 cm4gcmV0OwoJfSwKCgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0ICkg ewoJCXZhciByZXQgPSBbXTsKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVu dDsKCQkvLyAhY29udGV4dC5jcmVhdGVFbGVtZW50IGZhaWxzIGluIElFIHdpdGgg YW4gZXJyb3IgYnV0IHJldHVybnMgdHlwZW9mICdvYmplY3QnCgkJaWYgKHR5cGVv ZiBjb250ZXh0LmNyZWF0ZUVsZW1lbnQgPT0gJ3VuZGVmaW5lZCcpCgkJCWNvbnRl eHQgPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dFswXSAmJiBjb250 ZXh0WzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7CgoJCWpRdWVyeS5lYWNo KGVsZW1zLCBmdW5jdGlvbihpLCBlbGVtKXsKCQkJaWYgKCAhZWxlbSApCgkJCQly ZXR1cm47CgoJCQlpZiAoIGVsZW0uY29uc3RydWN0b3IgPT0gTnVtYmVyICkKCQkJ CWVsZW0gKz0gJyc7CgoJCQkvLyBDb252ZXJ0IGh0bWwgc3RyaW5nIGludG8gRE9N IG5vZGVzCgkJCWlmICggdHlwZW9mIGVsZW0gPT0gInN0cmluZyIgKSB7CgkJCQkv LyBGaXggIlhIVE1MIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2VycwoJCQkJZWxl bSA9IGVsZW0ucmVwbGFjZSgvKDwoXHcrKVtePl0qPylcLz4vZywgZnVuY3Rpb24o YWxsLCBmcm9udCwgdGFnKXsKCQkJCQlyZXR1cm4gdGFnLm1hdGNoKC9eKGFiYnJ8 YnJ8Y29sfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW18aHJ8YXJlYXxlbWJlZCkk L2kpID8KCQkJCQkJYWxsIDoKCQkJCQkJZnJvbnQgKyAiPjwvIiArIHRhZyArICI+ IjsKCQkJCX0pOwoKCQkJCS8vIFRyaW0gd2hpdGVzcGFjZSwgb3RoZXJ3aXNlIGlu ZGV4T2Ygd29uJ3Qgd29yayBhcyBleHBlY3RlZAoJCQkJdmFyIHRhZ3MgPSBqUXVl cnkudHJpbSggZWxlbSApLnRvTG93ZXJDYXNlKCksIGRpdiA9IGNvbnRleHQuY3Jl YXRlRWxlbWVudCgiZGl2Iik7CgoJCQkJdmFyIHdyYXAgPQoJCQkJCS8vIG9wdGlv biBvciBvcHRncm91cAoJCQkJCSF0YWdzLmluZGV4T2YoIjxvcHQiKSAmJgoJCQkJ CVsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+ IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjxsZWciKSAmJgoJCQkJCVsgMSwg IjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0gfHwKCgkJCQkJdGFncy5tYXRj aCgvXjwodGhlYWR8dGJvZHl8dGZvb3R8Y29sZ3xjYXApLykgJiYKCQkJCQlbIDEs ICI8dGFibGU+IiwgIjwvdGFibGU+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2Yo Ijx0ciIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48 L3RhYmxlPiIgXSB8fAoKCQkJCSAJLy8gPHRoZWFkPiBtYXRjaGVkIGFib3ZlCgkJ CQkJKCF0YWdzLmluZGV4T2YoIjx0ZCIpIHx8ICF0YWdzLmluZGV4T2YoIjx0aCIp KSAmJgoJCQkJCVsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJv ZHk+PC90YWJsZT4iIF0gfHwKCgkJCQkJIXRhZ3MuaW5kZXhPZigiPGNvbCIpICYm CgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAi PC9jb2xncm91cD48L3RhYmxlPiIgXSB8fAoKCQkJCQkvLyBJRSBjYW4ndCBzZXJp YWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5CgkJCQkJalF1 ZXJ5LmJyb3dzZXIubXNpZSAmJgoJCQkJCVsgMSwgImRpdjxkaXY+IiwgIjwvZGl2 PiIgXSB8fAoKCQkJCQlbIDAsICIiLCAiIiBdOwoKCQkJCS8vIEdvIHRvIGh0bWwg YW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnMKCQkJCWRpdi5p bm5lckhUTUwgPSB3cmFwWzFdICsgZWxlbSArIHdyYXBbMl07CgoJCQkJLy8gTW92 ZSB0byB0aGUgcmlnaHQgZGVwdGgKCQkJCXdoaWxlICggd3JhcFswXS0tICkKCQkJ CQlkaXYgPSBkaXYubGFzdENoaWxkOwoKCQkJCS8vIFJlbW92ZSBJRSdzIGF1dG9p bnNlcnRlZCA8dGJvZHk+IGZyb20gdGFibGUgZnJhZ21lbnRzCgkJCQlpZiAoIGpR dWVyeS5icm93c2VyLm1zaWUgKSB7CgoJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFi bGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KCQkJCQl2YXIgdGJvZHkg PSAhdGFncy5pbmRleE9mKCI8dGFibGUiKSAmJiB0YWdzLmluZGV4T2YoIjx0Ym9k eSIpIDwgMCA/CgkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxk LmNoaWxkTm9kZXMgOgoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIGJhcmUgPHRoZWFk PiBvciA8dGZvb3Q+CgkJCQkJCXdyYXBbMV0gPT0gIjx0YWJsZT4iICYmIHRhZ3Mu aW5kZXhPZigiPHRib2R5IikgPCAwID8KCQkJCQkJCWRpdi5jaGlsZE5vZGVzIDoK CQkJCQkJCVtdOwoKCQkJCQlmb3IgKCB2YXIgaiA9IHRib2R5Lmxlbmd0aCAtIDE7 IGogPj0gMCA7IC0taiApCgkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9k eVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5n dGggKQoJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0 Ym9keVsgaiBdICk7CgoJCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMgbGVhZGlu ZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQKCQkJCQlpZiAoIC9e XHMvLnRlc3QoIGVsZW0gKSApCgkJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRl eHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0ubWF0Y2goL15ccyovKVswXSApLCBkaXYu Zmlyc3RDaGlsZCApOwoKCQkJCX0KCgkJCQllbGVtID0galF1ZXJ5Lm1ha2VBcnJh eSggZGl2LmNoaWxkTm9kZXMgKTsKCQkJfQoKCQkJaWYgKCBlbGVtLmxlbmd0aCA9 PT0gMCAmJiAoIWpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImZvcm0iICkgJiYgIWpR dWVyeS5ub2RlTmFtZSggZWxlbSwgInNlbGVjdCIgKSkgKQoJCQkJcmV0dXJuOwoK CQkJaWYgKCBlbGVtWzBdID09IHVuZGVmaW5lZCB8fCBqUXVlcnkubm9kZU5hbWUo IGVsZW0sICJmb3JtIiApIHx8IGVsZW0ub3B0aW9ucyApCgkJCQlyZXQucHVzaCgg ZWxlbSApOwoKCQkJZWxzZQoJCQkJcmV0ID0galF1ZXJ5Lm1lcmdlKCByZXQsIGVs ZW0gKTsKCgkJfSk7CgoJCXJldHVybiByZXQ7Cgl9LAoKCWF0dHI6IGZ1bmN0aW9u KCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKCQkvLyBkb24ndCBzZXQgYXR0cmlidXRl cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCFlbGVtIHx8IGVsZW0u bm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDgpCgkJCXJldHVybiB1 bmRlZmluZWQ7CgoJCXZhciBub3R4bWwgPSAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVt ICksCgkJCS8vIFdoZXRoZXIgd2UgYXJlIHNldHRpbmcgKG9yIGdldHRpbmcpCgkJ CXNldCA9IHZhbHVlICE9PSB1bmRlZmluZWQsCgkJCW1zaWUgPSBqUXVlcnkuYnJv d3Nlci5tc2llOwoKCQkvLyBUcnkgdG8gbm9ybWFsaXplL2ZpeCB0aGUgbmFtZQoJ CW5hbWUgPSBub3R4bWwgJiYgalF1ZXJ5LnByb3BzWyBuYW1lIF0gfHwgbmFtZTsK CgkJLy8gT25seSBkbyBhbGwgdGhlIGZvbGxvd2luZyBpZiB0aGlzIGlzIGEgbm9k ZSAoZmFzdGVyIGZvciBzdHlsZSkKCQkvLyBJRSBlbGVtLmdldEF0dHJpYnV0ZSBw YXNzZXMgZXZlbiBmb3Igc3R5bGUKCQlpZiAoIGVsZW0udGFnTmFtZSApIHsKCgkJ CS8vIFRoZXNlIGF0dHJpYnV0ZXMgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudAoJ CQl2YXIgc3BlY2lhbCA9IC9ocmVmfHNyY3xzdHlsZS8udGVzdCggbmFtZSApOwoK CQkJLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHBy b3BlcnR5IG9mIGEgaGlkZGVuIG9wdGlvbgoJCQkvLyBBY2Nlc3NpbmcgdGhlIHBh cmVudCdzIHNlbGVjdGVkSW5kZXggcHJvcGVydHkgZml4ZXMgaXQKCQkJaWYgKCBu YW1lID09ICJzZWxlY3RlZCIgJiYgalF1ZXJ5LmJyb3dzZXIuc2FmYXJpICkKCQkJ CWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoKCQkJLy8gSWYgYXBwbGlj YWJsZSwgYWNjZXNzIHRoZSBhdHRyaWJ1dGUgdmlhIHRoZSBET00gMCB3YXkKCQkJ aWYgKCBuYW1lIGluIGVsZW0gJiYgbm90eG1sICYmICFzcGVjaWFsICkgewoJCQkJ aWYgKCBzZXQgKXsKCQkJCQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9w ZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4g SUUpCgkJCQkJaWYgKCBuYW1lID09ICJ0eXBlIiAmJiBqUXVlcnkubm9kZU5hbWUo IGVsZW0sICJpbnB1dCIgKSAmJiBlbGVtLnBhcmVudE5vZGUgKQoJCQkJCQl0aHJv dyAidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIjsKCgkJCQkJZWxlbVsg bmFtZSBdID0gdmFsdWU7CgkJCQl9CgoJCQkJLy8gYnJvd3NlcnMgaW5kZXggZWxl bWVudHMgYnkgaWQvbmFtZSBvbiBmb3JtcywgZ2l2ZSBwcmlvcml0eSB0byBhdHRy aWJ1dGVzLgoJCQkJaWYoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImZvcm0iICkg JiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpICkKCQkJCQlyZXR1cm4gZWxl bS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkubm9kZVZhbHVlOwoKCQkJCXJldHVy biBlbGVtWyBuYW1lIF07CgkJCX0KCgkJCWlmICggbXNpZSAmJiBub3R4bWwgJiYg IG5hbWUgPT0gInN0eWxlIiApCgkJCQlyZXR1cm4galF1ZXJ5LmF0dHIoIGVsZW0u c3R5bGUsICJjc3NUZXh0IiwgdmFsdWUgKTsKCgkJCWlmICggc2V0ICkKCQkJCS8v IGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgc3RyaW5nIChhbGwgYnJvd3NlcnMgZG8g dGhpcyBidXQgSUUpIHNlZSAjMTA3MAoJCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5h bWUsICIiICsgdmFsdWUgKTsKCgkJCXZhciBhdHRyID0gbXNpZSAmJiBub3R4bWwg JiYgc3BlY2lhbAoJCQkJCS8vIFNvbWUgYXR0cmlidXRlcyByZXF1aXJlIGEgc3Bl Y2lhbCBjYWxsIG9uIElFCgkJCQkJPyBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwg MiApCgkJCQkJOiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwoKCQkJLy8gTm9u LWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0 byB1bmRlZmluZWQKCQkJcmV0dXJuIGF0dHIgPT09IG51bGwgPyB1bmRlZmluZWQg OiBhdHRyOwoJCX0KCgkJLy8gZWxlbSBpcyBhY3R1YWxseSBlbGVtLnN0eWxlIC4u LiBzZXQgdGhlIHN0eWxlCgoJCS8vIElFIHVzZXMgZmlsdGVycyBmb3Igb3BhY2l0 eQoJCWlmICggbXNpZSAmJiBuYW1lID09ICJvcGFjaXR5IiApIHsKCQkJaWYgKCBz ZXQgKSB7CgkJCQkvLyBJRSBoYXMgdHJvdWJsZSB3aXRoIG9wYWNpdHkgaWYgaXQg ZG9lcyBub3QgaGF2ZSBsYXlvdXQKCQkJCS8vIEZvcmNlIGl0IGJ5IHNldHRpbmcg dGhlIHpvb20gbGV2ZWwKCQkJCWVsZW0uem9vbSA9IDE7CgoJCQkJLy8gU2V0IHRo ZSBhbHBoYSBmaWx0ZXIgdG8gc2V0IHRoZSBvcGFjaXR5CgkJCQllbGVtLmZpbHRl ciA9IChlbGVtLmZpbHRlciB8fCAiIikucmVwbGFjZSggL2FscGhhXChbXildKlwp LywgIiIgKSArCgkJCQkJKHBhcnNlSW50KCB2YWx1ZSApICsgJycgPT0gIk5hTiIg PyAiIiA6ICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSAqIDEwMCArICIpIik7CgkJ CX0KCgkJCXJldHVybiBlbGVtLmZpbHRlciAmJiBlbGVtLmZpbHRlci5pbmRleE9m KCJvcGFjaXR5PSIpID49IDAgPwoJCQkJKHBhcnNlRmxvYXQoIGVsZW0uZmlsdGVy Lm1hdGNoKC9vcGFjaXR5PShbXildKikvKVsxXSApIC8gMTAwKSArICcnOgoJCQkJ IiI7CgkJfQoKCQluYW1lID0gbmFtZS5yZXBsYWNlKC8tKFthLXpdKS9pZywgZnVu Y3Rpb24oYWxsLCBsZXR0ZXIpewoJCQlyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNl KCk7CgkJfSk7CgoJCWlmICggc2V0ICkKCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7 CgoJCXJldHVybiBlbGVtWyBuYW1lIF07Cgl9LAoKCXRyaW06IGZ1bmN0aW9uKCB0 ZXh0ICkgewoJCXJldHVybiAodGV4dCB8fCAiIikucmVwbGFjZSggL15ccyt8XHMr JC9nLCAiIiApOwoJfSwKCgltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSApIHsK CQl2YXIgcmV0ID0gW107CgoJCWlmKCBhcnJheSAhPSBudWxsICl7CgkJCXZhciBp ID0gYXJyYXkubGVuZ3RoOwoJCQkvL3RoZSB3aW5kb3csIHN0cmluZ3MgYW5kIGZ1 bmN0aW9ucyBhbHNvIGhhdmUgJ2xlbmd0aCcKCQkJaWYoIGkgPT0gbnVsbCB8fCBh cnJheS5zcGxpdCB8fCBhcnJheS5zZXRJbnRlcnZhbCB8fCBhcnJheS5jYWxsICkK CQkJCXJldFswXSA9IGFycmF5OwoJCQllbHNlCgkJCQl3aGlsZSggaSApCgkJCQkJ cmV0Wy0taV0gPSBhcnJheVtpXTsKCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCWlu QXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnJheSApIHsKCQlmb3IgKCB2YXIgaSA9 IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkKCQkv LyBVc2UgPT09IGJlY2F1c2Ugb24gSUUsIHdpbmRvdyA9PSBkb2N1bWVudAoJCQlp ZiAoIGFycmF5WyBpIF0gPT09IGVsZW0gKQoJCQkJcmV0dXJuIGk7CgoJCXJldHVy biAtMTsKCX0sCgoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJ CS8vIFdlIGhhdmUgdG8gbG9vcCB0aGlzIHdheSBiZWNhdXNlIElFICYgT3BlcmEg b3ZlcndyaXRlIHRoZSBsZW5ndGgKCQkvLyBleHBhbmRvIG9mIGdldEVsZW1lbnRz QnlUYWdOYW1lCgkJdmFyIGkgPSAwLCBlbGVtLCBwb3MgPSBmaXJzdC5sZW5ndGg7 CgkJLy8gQWxzbywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29ycmVj dCBlbGVtZW50cyBhcmUgYmVpbmcgcmV0dXJuZWQKCQkvLyAoSUUgcmV0dXJucyBj b21tZW50IG5vZGVzIGluIGEgJyonIHF1ZXJ5KQoJCWlmICggalF1ZXJ5LmJyb3dz ZXIubXNpZSApIHsKCQkJd2hpbGUgKCBlbGVtID0gc2Vjb25kWyBpKysgXSApCgkJ CQlpZiAoIGVsZW0ubm9kZVR5cGUgIT0gOCApCgkJCQkJZmlyc3RbIHBvcysrIF0g PSBlbGVtOwoKCQl9IGVsc2UKCQkJd2hpbGUgKCBlbGVtID0gc2Vjb25kWyBpKysg XSApCgkJCQlmaXJzdFsgcG9zKysgXSA9IGVsZW07CgoJCXJldHVybiBmaXJzdDsK CX0sCgoJdW5pcXVlOiBmdW5jdGlvbiggYXJyYXkgKSB7CgkJdmFyIHJldCA9IFtd LCBkb25lID0ge307CgoJCXRyeSB7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0 aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJdmFyIGlk ID0galF1ZXJ5LmRhdGEoIGFycmF5WyBpIF0gKTsKCgkJCQlpZiAoICFkb25lWyBp ZCBdICkgewoJCQkJCWRvbmVbIGlkIF0gPSB0cnVlOwoJCQkJCXJldC5wdXNoKCBh cnJheVsgaSBdICk7CgkJCQl9CgkJCX0KCgkJfSBjYXRjaCggZSApIHsKCQkJcmV0 ID0gYXJyYXk7CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglncmVwOiBmdW5jdGlv biggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CgkJdmFyIHJldCA9IFtdOwoKCQkv LyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJ Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCB2YXIg aSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkK CQkJaWYgKCAhaW52ICE9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApICkKCQkJ CXJldC5wdXNoKCBlbGVtc1sgaSBdICk7CgoJCXJldHVybiByZXQ7Cgl9LAoKCW1h cDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjayApIHsKCQl2YXIgcmV0ID0gW107 CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9m IHRoZSBpdGVtcyB0byB0aGVpcgoJCS8vIG5ldyB2YWx1ZSAob3IgdmFsdWVzKS4K CQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxl bmd0aDsgaSsrICkgewoJCQl2YXIgdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkg XSwgaSApOwoKCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkKCQkJCXJldFsgcmV0Lmxl bmd0aCBdID0gdmFsdWU7CgkJfQoKCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSgg W10sIHJldCApOwoJfQp9KTsKCnZhciB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNl ckFnZW50LnRvTG93ZXJDYXNlKCk7CgovLyBGaWd1cmUgb3V0IHdoYXQgYnJvd3Nl ciBpcyBiZWluZyB1c2VkCmpRdWVyeS5icm93c2VyID0gewoJdmVyc2lvbjogKHVz ZXJBZ2VudC5tYXRjaCggLy4rKD86cnZ8aXR8cmF8aWUpW1wvOiBdKFtcZC5dKykv ICkgfHwgW10pWzFdLAoJc2FmYXJpOiAvd2Via2l0Ly50ZXN0KCB1c2VyQWdlbnQg KSwKCW9wZXJhOiAvb3BlcmEvLnRlc3QoIHVzZXJBZ2VudCApLAoJbXNpZTogL21z aWUvLnRlc3QoIHVzZXJBZ2VudCApICYmICEvb3BlcmEvLnRlc3QoIHVzZXJBZ2Vu dCApLAoJbW96aWxsYTogL21vemlsbGEvLnRlc3QoIHVzZXJBZ2VudCApICYmICEv KGNvbXBhdGlibGV8d2Via2l0KS8udGVzdCggdXNlckFnZW50ICkKfTsKCnZhciBz dHlsZUZsb2F0ID0galF1ZXJ5LmJyb3dzZXIubXNpZSA/Cgkic3R5bGVGbG9hdCIg OgoJImNzc0Zsb2F0IjsKCmpRdWVyeS5leHRlbmQoewoJLy8gQ2hlY2sgdG8gc2Vl IGlmIHRoZSBXM0MgYm94IG1vZGVsIGlzIGJlaW5nIHVzZWQKCWJveE1vZGVsOiAh alF1ZXJ5LmJyb3dzZXIubXNpZSB8fCBkb2N1bWVudC5jb21wYXRNb2RlID09ICJD U1MxQ29tcGF0IiwKCglwcm9wczogewoJCSJmb3IiOiAiaHRtbEZvciIsCgkJImNs YXNzIjogImNsYXNzTmFtZSIsCgkJImZsb2F0Ijogc3R5bGVGbG9hdCwKCQljc3NG bG9hdDogc3R5bGVGbG9hdCwKCQlzdHlsZUZsb2F0OiBzdHlsZUZsb2F0LAoJCXJl YWRvbmx5OiAicmVhZE9ubHkiLAoJCW1heGxlbmd0aDogIm1heExlbmd0aCIsCgkJ Y2VsbHNwYWNpbmc6ICJjZWxsU3BhY2luZyIKCX0KfSk7CgpqUXVlcnkuZWFjaCh7 CglwYXJlbnQ6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBlbGVtLnBhcmVudE5vZGU7 fSwKCXBhcmVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZGlyKGVs ZW0sInBhcmVudE5vZGUiKTt9LAoJbmV4dDogZnVuY3Rpb24oZWxlbSl7cmV0dXJu IGpRdWVyeS5udGgoZWxlbSwyLCJuZXh0U2libGluZyIpO30sCglwcmV2OiBmdW5j dGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5Lm50aChlbGVtLDIsInByZXZpb3VzU2li bGluZyIpO30sCgluZXh0QWxsOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5 LmRpcihlbGVtLCJuZXh0U2libGluZyIpO30sCglwcmV2QWxsOiBmdW5jdGlvbihl bGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwcmV2aW91c1NpYmxpbmciKTt9 LAoJc2libGluZ3M6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuc2libGlu ZyhlbGVtLnBhcmVudE5vZGUuZmlyc3RDaGlsZCxlbGVtKTt9LAoJY2hpbGRyZW46 IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuc2libGluZyhlbGVtLmZpcnN0 Q2hpbGQpO30sCgljb250ZW50czogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVy eS5ub2RlTmFtZShlbGVtLCJpZnJhbWUiKT9lbGVtLmNvbnRlbnREb2N1bWVudHx8 ZWxlbS5jb250ZW50V2luZG93LmRvY3VtZW50OmpRdWVyeS5tYWtlQXJyYXkoZWxl bS5jaGlsZE5vZGVzKTt9Cn0sIGZ1bmN0aW9uKG5hbWUsIGZuKXsKCWpRdWVyeS5m blsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBq UXVlcnkubWFwKCB0aGlzLCBmbiApOwoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVv ZiBzZWxlY3RvciA9PSAic3RyaW5nIiApCgkJCXJldCA9IGpRdWVyeS5tdWx0aUZp bHRlciggc2VsZWN0b3IsIHJldCApOwoKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2so IGpRdWVyeS51bmlxdWUoIHJldCApICk7Cgl9Owp9KTsKCmpRdWVyeS5lYWNoKHsK CWFwcGVuZFRvOiAiYXBwZW5kIiwKCXByZXBlbmRUbzogInByZXBlbmQiLAoJaW5z ZXJ0QmVmb3JlOiAiYmVmb3JlIiwKCWluc2VydEFmdGVyOiAiYWZ0ZXIiLAoJcmVw bGFjZUFsbDogInJlcGxhY2VXaXRoIgp9LCBmdW5jdGlvbihuYW1lLCBvcmlnaW5h bCl7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCkgewoJCXZhciBhcmdz ID0gYXJndW1lbnRzOwoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJ CWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJncy5sZW5ndGg7IGkgPCBsZW5n dGg7IGkrKyApCgkJCQlqUXVlcnkoIGFyZ3NbIGkgXSApWyBvcmlnaW5hbCBdKCB0 aGlzICk7CgkJfSk7Cgl9Owp9KTsKCmpRdWVyeS5lYWNoKHsKCXJlbW92ZUF0dHI6 IGZ1bmN0aW9uKCBuYW1lICkgewoJCWpRdWVyeS5hdHRyKCB0aGlzLCBuYW1lLCAi IiApOwoJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCgkJCXRoaXMucmVtb3ZlQXR0 cmlidXRlKCBuYW1lICk7Cgl9LAoKCWFkZENsYXNzOiBmdW5jdGlvbiggY2xhc3NO YW1lcyApIHsKCQlqUXVlcnkuY2xhc3NOYW1lLmFkZCggdGhpcywgY2xhc3NOYW1l cyApOwoJfSwKCglyZW1vdmVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMgKSB7 CgkJalF1ZXJ5LmNsYXNzTmFtZS5yZW1vdmUoIHRoaXMsIGNsYXNzTmFtZXMgKTsK CX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzICkgewoJCWpR dWVyeS5jbGFzc05hbWVbIGpRdWVyeS5jbGFzc05hbWUuaGFzKCB0aGlzLCBjbGFz c05hbWVzICkgPyAicmVtb3ZlIiA6ICJhZGQiIF0oIHRoaXMsIGNsYXNzTmFtZXMg KTsKCX0sCgoJcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJaWYgKCAh c2VsZWN0b3IgfHwgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIFsgdGhpcyBdICku ci5sZW5ndGggKSB7CgkJCS8vIFByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCWpRdWVy eSggIioiLCB0aGlzICkuYWRkKHRoaXMpLmVhY2goZnVuY3Rpb24oKXsKCQkJCWpR dWVyeS5ldmVudC5yZW1vdmUodGhpcyk7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSh0 aGlzKTsKCQkJfSk7CgkJCWlmICh0aGlzLnBhcmVudE5vZGUpCgkJCQl0aGlzLnBh cmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMgKTsKCQl9Cgl9LAoKCWVtcHR5OiBm dW5jdGlvbigpIHsKCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVu dCBtZW1vcnkgbGVha3MKCQlqUXVlcnkoICI+KiIsIHRoaXMgKS5yZW1vdmUoKTsK CgkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXMKCQl3aGlsZSAoIHRoaXMu Zmlyc3RDaGlsZCApCgkJCXRoaXMucmVtb3ZlQ2hpbGQoIHRoaXMuZmlyc3RDaGls ZCApOwoJfQp9LCBmdW5jdGlvbihuYW1lLCBmbil7CglqUXVlcnkuZm5bIG5hbWUg XSA9IGZ1bmN0aW9uKCl7CgkJcmV0dXJuIHRoaXMuZWFjaCggZm4sIGFyZ3VtZW50 cyApOwoJfTsKfSk7CgpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0s IGZ1bmN0aW9uKGksIG5hbWUpewoJdmFyIHR5cGUgPSBuYW1lLnRvTG93ZXJDYXNl KCk7CgoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKCQkv LyBHZXQgd2luZG93IHdpZHRoIG9yIGhlaWdodAoJCXJldHVybiB0aGlzWzBdID09 IHdpbmRvdyA/CgkJCS8vIE9wZXJhIHJlcG9ydHMgZG9jdW1lbnQuYm9keS5jbGll bnRbV2lkdGgvSGVpZ2h0XSBwcm9wZXJseSBpbiBib3RoIHF1aXJrcyBhbmQgc3Rh bmRhcmRzCgkJCWpRdWVyeS5icm93c2VyLm9wZXJhICYmIGRvY3VtZW50LmJvZHlb ICJjbGllbnQiICsgbmFtZSBdIHx8CgoJCQkvLyBTYWZhcmkgcmVwb3J0cyBpbm5l cltXaWR0aC9IZWlnaHRdIGp1c3QgZmluZSAoTW96aWxsYSBhbmQgT3BlcmEgaW5j bHVkZSBzY3JvbGwgYmFyIHdpZHRocykKCQkJalF1ZXJ5LmJyb3dzZXIuc2FmYXJp ICYmIHdpbmRvd1sgImlubmVyIiArIG5hbWUgXSB8fAoKCQkJLy8gRXZlcnlvbmUg ZWxzZSB1c2UgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IG9yIGRvY3VtZW50LmJv ZHkgZGVwZW5kaW5nIG9uIFF1aXJrcyB2cyBTdGFuZGFyZHMgbW9kZQoJCQlkb2N1 bWVudC5jb21wYXRNb2RlID09ICJDU1MxQ29tcGF0IiAmJiBkb2N1bWVudC5kb2N1 bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdIHx8IGRvY3VtZW50LmJvZHlb ICJjbGllbnQiICsgbmFtZSBdIDoKCgkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBv ciBoZWlnaHQKCQkJdGhpc1swXSA9PSBkb2N1bWVudCA/CgkJCQkvLyBFaXRoZXIg c2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0sIHdo aWNoZXZlciBpcyBncmVhdGVyCgkJCQlNYXRoLm1heCgKCQkJCQlNYXRoLm1heChk b2N1bWVudC5ib2R5WyJzY3JvbGwiICsgbmFtZV0sIGRvY3VtZW50LmRvY3VtZW50 RWxlbWVudFsic2Nyb2xsIiArIG5hbWVdKSwKCQkJCQlNYXRoLm1heChkb2N1bWVu dC5ib2R5WyJvZmZzZXQiICsgbmFtZV0sIGRvY3VtZW50LmRvY3VtZW50RWxlbWVu dFsib2Zmc2V0IiArIG5hbWVdKQoJCQkJKSA6CgoJCQkJLy8gR2V0IG9yIHNldCB3 aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCXNpemUgPT0gdW5kZWZp bmVkID8KCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50 CgkJCQkJKHRoaXMubGVuZ3RoID8galF1ZXJ5LmNzcyggdGhpc1swXSwgdHlwZSAp IDogbnVsbCkgOgoKCQkJCQkvLyBTZXQgdGhlIHdpZHRoIG9yIGhlaWdodCBvbiB0 aGUgZWxlbWVudCAoZGVmYXVsdCB0byBwaXhlbHMgaWYgdmFsdWUgaXMgdW5pdGxl c3MpCgkJCQkJdGhpcy5jc3MoIHR5cGUsIHNpemUuY29uc3RydWN0b3IgPT0gU3Ry aW5nID8gc2l6ZSA6IHNpemUgKyAicHgiICk7Cgl9Owp9KTsKCi8vIEhlbHBlciBm dW5jdGlvbiB1c2VkIGJ5IHRoZSBkaW1lbnNpb25zIGFuZCBvZmZzZXQgbW9kdWxl cwpmdW5jdGlvbiBudW0oZWxlbSwgcHJvcCkgewoJcmV0dXJuIGVsZW1bMF0gJiYg cGFyc2VJbnQoIGpRdWVyeS5jdXJDU1MoZWxlbVswXSwgcHJvcCwgdHJ1ZSksIDEw ICkgfHwgMDsKfXZhciBjaGFycyA9IGpRdWVyeS5icm93c2VyLnNhZmFyaSAmJiBw YXJzZUludChqUXVlcnkuYnJvd3Nlci52ZXJzaW9uKSA8IDQxNyA/CgkJIig/Oltc XHcqXy1dfFxcXFwuKSIgOgoJCSIoPzpbXFx3XHUwMTI4LVx1RkZGRipfLV18XFxc XC4pIiwKCXF1aWNrQ2hpbGQgPSBuZXcgUmVnRXhwKCJePlxccyooIiArIGNoYXJz ICsgIispIiksCglxdWlja0lEID0gbmV3IFJlZ0V4cCgiXigiICsgY2hhcnMgKyAi KykoIykoIiArIGNoYXJzICsgIispIiksCglxdWlja0NsYXNzID0gbmV3IFJlZ0V4 cCgiXihbIy5dPykoIiArIGNoYXJzICsgIiopIik7CgpqUXVlcnkuZXh0ZW5kKHsK CWV4cHI6IHsKCQkiIjogZnVuY3Rpb24oYSxpLG0pe3JldHVybiBtWzJdPT0iKiJ8 fGpRdWVyeS5ub2RlTmFtZShhLG1bMl0pO30sCgkJIiMiOiBmdW5jdGlvbihhLGks bSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT1tWzJdO30sCgkJIjoiOiB7 CgkJCS8vIFBvc2l0aW9uIENoZWNrcwoJCQlsdDogZnVuY3Rpb24oYSxpLG0pe3Jl dHVybiBpPG1bM10tMDt9LAoJCQlndDogZnVuY3Rpb24oYSxpLG0pe3JldHVybiBp Pm1bM10tMDt9LAoJCQludGg6IGZ1bmN0aW9uKGEsaSxtKXtyZXR1cm4gbVszXS0w PT1pO30sCgkJCWVxOiBmdW5jdGlvbihhLGksbSl7cmV0dXJuIG1bM10tMD09aTt9 LAoJCQlmaXJzdDogZnVuY3Rpb24oYSxpKXtyZXR1cm4gaT09MDt9LAoJCQlsYXN0 OiBmdW5jdGlvbihhLGksbSxyKXtyZXR1cm4gaT09ci5sZW5ndGgtMTt9LAoJCQll dmVuOiBmdW5jdGlvbihhLGkpe3JldHVybiBpJTI9PTA7fSwKCQkJb2RkOiBmdW5j dGlvbihhLGkpe3JldHVybiBpJTI7fSwKCgkJCS8vIENoaWxkIENoZWNrcwoJCQki Zmlyc3QtY2hpbGQiOiBmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlLmdl dEVsZW1lbnRzQnlUYWdOYW1lKCIqIilbMF09PWE7fSwKCQkJImxhc3QtY2hpbGQi OiBmdW5jdGlvbihhKXtyZXR1cm4galF1ZXJ5Lm50aChhLnBhcmVudE5vZGUubGFz dENoaWxkLDEsInByZXZpb3VzU2libGluZyIpPT1hO30sCgkJCSJvbmx5LWNoaWxk IjogZnVuY3Rpb24oYSl7cmV0dXJuICFqUXVlcnkubnRoKGEucGFyZW50Tm9kZS5s YXN0Q2hpbGQsMiwicHJldmlvdXNTaWJsaW5nIik7fSwKCgkJCS8vIFBhcmVudCBD aGVja3MKCQkJcGFyZW50OiBmdW5jdGlvbihhKXtyZXR1cm4gYS5maXJzdENoaWxk O30sCgkJCWVtcHR5OiBmdW5jdGlvbihhKXtyZXR1cm4gIWEuZmlyc3RDaGlsZDt9 LAoKCQkJLy8gVGV4dCBDaGVjawoJCQljb250YWluczogZnVuY3Rpb24oYSxpLG0p e3JldHVybiAoYS50ZXh0Q29udGVudHx8YS5pbm5lclRleHR8fGpRdWVyeShhKS50 ZXh0KCl8fCIiKS5pbmRleE9mKG1bM10pPj0wO30sCgoJCQkvLyBWaXNpYmlsaXR5 CgkJCXZpc2libGU6IGZ1bmN0aW9uKGEpe3JldHVybiAiaGlkZGVuIiE9YS50eXBl JiZqUXVlcnkuY3NzKGEsImRpc3BsYXkiKSE9Im5vbmUiJiZqUXVlcnkuY3NzKGEs InZpc2liaWxpdHkiKSE9ImhpZGRlbiI7fSwKCQkJaGlkZGVuOiBmdW5jdGlvbihh KXtyZXR1cm4gImhpZGRlbiI9PWEudHlwZXx8alF1ZXJ5LmNzcyhhLCJkaXNwbGF5 Iik9PSJub25lInx8alF1ZXJ5LmNzcyhhLCJ2aXNpYmlsaXR5Iik9PSJoaWRkZW4i O30sCgoJCQkvLyBGb3JtIGF0dHJpYnV0ZXMKCQkJZW5hYmxlZDogZnVuY3Rpb24o YSl7cmV0dXJuICFhLmRpc2FibGVkO30sCgkJCWRpc2FibGVkOiBmdW5jdGlvbihh KXtyZXR1cm4gYS5kaXNhYmxlZDt9LAoJCQljaGVja2VkOiBmdW5jdGlvbihhKXty ZXR1cm4gYS5jaGVja2VkO30sCgkJCXNlbGVjdGVkOiBmdW5jdGlvbihhKXtyZXR1 cm4gYS5zZWxlY3RlZHx8alF1ZXJ5LmF0dHIoYSwic2VsZWN0ZWQiKTt9LAoKCQkJ Ly8gRm9ybSBlbGVtZW50cwoJCQl0ZXh0OiBmdW5jdGlvbihhKXtyZXR1cm4gInRl eHQiPT1hLnR5cGU7fSwKCQkJcmFkaW86IGZ1bmN0aW9uKGEpe3JldHVybiAicmFk aW8iPT1hLnR5cGU7fSwKCQkJY2hlY2tib3g6IGZ1bmN0aW9uKGEpe3JldHVybiAi Y2hlY2tib3giPT1hLnR5cGU7fSwKCQkJZmlsZTogZnVuY3Rpb24oYSl7cmV0dXJu ICJmaWxlIj09YS50eXBlO30sCgkJCXBhc3N3b3JkOiBmdW5jdGlvbihhKXtyZXR1 cm4gInBhc3N3b3JkIj09YS50eXBlO30sCgkJCXN1Ym1pdDogZnVuY3Rpb24oYSl7 cmV0dXJuICJzdWJtaXQiPT1hLnR5cGU7fSwKCQkJaW1hZ2U6IGZ1bmN0aW9uKGEp e3JldHVybiAiaW1hZ2UiPT1hLnR5cGU7fSwKCQkJcmVzZXQ6IGZ1bmN0aW9uKGEp e3JldHVybiAicmVzZXQiPT1hLnR5cGU7fSwKCQkJYnV0dG9uOiBmdW5jdGlvbihh KXtyZXR1cm4gImJ1dHRvbiI9PWEudHlwZXx8alF1ZXJ5Lm5vZGVOYW1lKGEsImJ1 dHRvbiIpO30sCgkJCWlucHV0OiBmdW5jdGlvbihhKXtyZXR1cm4gL2lucHV0fHNl bGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGEubm9kZU5hbWUpO30sCgoJCQkv LyA6aGFzKCkKCQkJaGFzOiBmdW5jdGlvbihhLGksbSl7cmV0dXJuIGpRdWVyeS5m aW5kKG1bM10sYSkubGVuZ3RoO30sCgoJCQkvLyA6aGVhZGVyCgkJCWhlYWRlcjog ZnVuY3Rpb24oYSl7cmV0dXJuIC9oXGQvaS50ZXN0KGEubm9kZU5hbWUpO30sCgoJ CQkvLyA6YW5pbWF0ZWQKCQkJYW5pbWF0ZWQ6IGZ1bmN0aW9uKGEpe3JldHVybiBq UXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLGZ1bmN0aW9uKGZuKXtyZXR1cm4gYT09 Zm4uZWxlbTt9KS5sZW5ndGg7fQoJCX0KCX0sCgoJLy8gVGhlIHJlZ3VsYXIgZXhw cmVzc2lvbnMgdGhhdCBwb3dlciB0aGUgcGFyc2luZyBlbmdpbmUKCXBhcnNlOiBb CgkJLy8gTWF0Y2g6IFtAdmFsdWU9J3Rlc3QnXSwgW0Bmb29dCgkJL14oXFspICpA PyhbXHctXSspICooWyEqJF5+PV0qKSAqKCc/Ij8pKC4qPylcNCAqXF0vLAoKCQkv LyBNYXRjaDogOmNvbnRhaW5zKCdmb28nKQoJCS9eKDopKFtcdy1dKylcKCI/Jz8o Lio/KFwoLio/XCkpP1teKF0qPykiPyc/XCkvLAoKCQkvLyBNYXRjaDogOmV2ZW4s IDpsYXN0LWNoaWxkLCAjaWQsIC5jbGFzcwoJCW5ldyBSZWdFeHAoIl4oWzouI10q KSgiICsgY2hhcnMgKyAiKykiKQoJXSwKCgltdWx0aUZpbHRlcjogZnVuY3Rpb24o IGV4cHIsIGVsZW1zLCBub3QgKSB7CgkJdmFyIG9sZCwgY3VyID0gW107CgoJCXdo aWxlICggZXhwciAmJiBleHByICE9IG9sZCApIHsKCQkJb2xkID0gZXhwcjsKCQkJ dmFyIGYgPSBqUXVlcnkuZmlsdGVyKCBleHByLCBlbGVtcywgbm90ICk7CgkJCWV4 cHIgPSBmLnQucmVwbGFjZSgvXlxzKixccyovLCAiIiApOwoJCQljdXIgPSBub3Qg PyBlbGVtcyA9IGYuciA6IGpRdWVyeS5tZXJnZSggY3VyLCBmLnIgKTsKCQl9CgoJ CXJldHVybiBjdXI7Cgl9LAoKCWZpbmQ6IGZ1bmN0aW9uKCB0LCBjb250ZXh0ICkg ewoJCS8vIFF1aWNrbHkgaGFuZGxlIG5vbi1zdHJpbmcgZXhwcmVzc2lvbnMKCQlp ZiAoIHR5cGVvZiB0ICE9ICJzdHJpbmciICkKCQkJcmV0dXJuIFsgdCBdOwoKCQkv LyBjaGVjayB0byBtYWtlIHN1cmUgY29udGV4dCBpcyBhIERPTSBlbGVtZW50IG9y IGEgZG9jdW1lbnQKCQlpZiAoIGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSAh PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT0gOSkKCQkJcmV0dXJuIFsgXTsKCgkJ Ly8gU2V0IHRoZSBjb3JyZWN0IGNvbnRleHQgKGlmIG5vbmUgaXMgcHJvdmlkZWQp CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCS8vIEluaXRpYWxp emUgdGhlIHNlYXJjaAoJCXZhciByZXQgPSBbY29udGV4dF0sIGRvbmUgPSBbXSwg bGFzdCwgbm9kZU5hbWU7CgoJCS8vIENvbnRpbnVlIHdoaWxlIGEgc2VsZWN0b3Ig ZXhwcmVzc2lvbiBleGlzdHMsIGFuZCB3aGlsZQoJCS8vIHdlJ3JlIG5vIGxvbmdl ciBsb29waW5nIHVwb24gb3Vyc2VsdmVzCgkJd2hpbGUgKCB0ICYmIGxhc3QgIT0g dCApIHsKCQkJdmFyIHIgPSBbXTsKCQkJbGFzdCA9IHQ7CgoJCQl0ID0galF1ZXJ5 LnRyaW0odCk7CgoJCQl2YXIgZm91bmRUb2tlbiA9IGZhbHNlLAoKCQkJLy8gQW4g YXR0ZW1wdCBhdCBzcGVlZGluZyB1cCBjaGlsZCBzZWxlY3RvcnMgdGhhdAoJCQkv LyBwb2ludCB0byBhIHNwZWNpZmljIGVsZW1lbnQgdGFnCgkJCQlyZSA9IHF1aWNr Q2hpbGQsCgoJCQkJbSA9IHJlLmV4ZWModCk7CgoJCQlpZiAoIG0gKSB7CgkJCQlu b2RlTmFtZSA9IG1bMV0udG9VcHBlckNhc2UoKTsKCgkJCQkvLyBQZXJmb3JtIG91 ciBvd24gaXRlcmF0aW9uIGFuZCBmaWx0ZXIKCQkJCWZvciAoIHZhciBpID0gMDsg cmV0W2ldOyBpKysgKQoJCQkJCWZvciAoIHZhciBjID0gcmV0W2ldLmZpcnN0Q2hp bGQ7IGM7IGMgPSBjLm5leHRTaWJsaW5nICkKCQkJCQkJaWYgKCBjLm5vZGVUeXBl ID09IDEgJiYgKG5vZGVOYW1lID09ICIqIiB8fCBjLm5vZGVOYW1lLnRvVXBwZXJD YXNlKCkgPT0gbm9kZU5hbWUpICkKCQkJCQkJCXIucHVzaCggYyApOwoKCQkJCXJl dCA9IHI7CgkJCQl0ID0gdC5yZXBsYWNlKCByZSwgIiIgKTsKCQkJCWlmICggdC5p bmRleE9mKCIgIikgPT0gMCApIGNvbnRpbnVlOwoJCQkJZm91bmRUb2tlbiA9IHRy dWU7CgkJCX0gZWxzZSB7CgkJCQlyZSA9IC9eKFs+K35dKVxzKihcdyopL2k7CgoJ CQkJaWYgKCAobSA9IHJlLmV4ZWModCkpICE9IG51bGwgKSB7CgkJCQkJciA9IFtd OwoKCQkJCQl2YXIgbWVyZ2UgPSB7fTsKCQkJCQlub2RlTmFtZSA9IG1bMl0udG9V cHBlckNhc2UoKTsKCQkJCQltID0gbVsxXTsKCgkJCQkJZm9yICggdmFyIGogPSAw LCBybCA9IHJldC5sZW5ndGg7IGogPCBybDsgaisrICkgewoJCQkJCQl2YXIgbiA9 IG0gPT0gIn4iIHx8IG0gPT0gIisiID8gcmV0W2pdLm5leHRTaWJsaW5nIDogcmV0 W2pdLmZpcnN0Q2hpbGQ7CgkJCQkJCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxp bmcgKQoJCQkJCQkJaWYgKCBuLm5vZGVUeXBlID09IDEgKSB7CgkJCQkJCQkJdmFy IGlkID0galF1ZXJ5LmRhdGEobik7CgoJCQkJCQkJCWlmICggbSA9PSAifiIgJiYg bWVyZ2VbaWRdICkgYnJlYWs7CgoJCQkJCQkJCWlmICghbm9kZU5hbWUgfHwgbi5u b2RlTmFtZS50b1VwcGVyQ2FzZSgpID09IG5vZGVOYW1lICkgewoJCQkJCQkJCQlp ZiAoIG0gPT0gIn4iICkgbWVyZ2VbaWRdID0gdHJ1ZTsKCQkJCQkJCQkJci5wdXNo KCBuICk7CgkJCQkJCQkJfQoKCQkJCQkJCQlpZiAoIG0gPT0gIisiICkgYnJlYWs7 CgkJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXQgPSByOwoKCQkJCQkvLyBBbmQgcmVt b3ZlIHRoZSB0b2tlbgoJCQkJCXQgPSBqUXVlcnkudHJpbSggdC5yZXBsYWNlKCBy ZSwgIiIgKSApOwoJCQkJCWZvdW5kVG9rZW4gPSB0cnVlOwoJCQkJfQoJCQl9CgoJ CQkvLyBTZWUgaWYgdGhlcmUncyBzdGlsbCBhbiBleHByZXNzaW9uLCBhbmQgdGhh dCB3ZSBoYXZlbid0IGFscmVhZHkKCQkJLy8gbWF0Y2hlZCBhIHRva2VuCgkJCWlm ICggdCAmJiAhZm91bmRUb2tlbiApIHsKCQkJCS8vIEhhbmRsZSBtdWx0aXBsZSBl eHByZXNzaW9ucwoJCQkJaWYgKCAhdC5pbmRleE9mKCIsIikgKSB7CgkJCQkJLy8g Q2xlYW4gdGhlIHJlc3VsdCBzZXQKCQkJCQlpZiAoIGNvbnRleHQgPT0gcmV0WzBd ICkgcmV0LnNoaWZ0KCk7CgoJCQkJCS8vIE1lcmdlIHRoZSByZXN1bHQgc2V0cwoJ CQkJCWRvbmUgPSBqUXVlcnkubWVyZ2UoIGRvbmUsIHJldCApOwoKCQkJCQkvLyBS ZXNldCB0aGUgY29udGV4dAoJCQkJCXIgPSByZXQgPSBbY29udGV4dF07CgoJCQkJ CS8vIFRvdWNoIHVwIHRoZSBzZWxlY3RvciBzdHJpbmcKCQkJCQl0ID0gIiAiICsg dC5zdWJzdHIoMSx0Lmxlbmd0aCk7CgoJCQkJfSBlbHNlIHsKCQkJCQkvLyBPcHRp bWl6ZSBmb3IgdGhlIGNhc2Ugbm9kZU5hbWUjaWROYW1lCgkJCQkJdmFyIHJlMiA9 IHF1aWNrSUQ7CgkJCQkJdmFyIG0gPSByZTIuZXhlYyh0KTsKCgkJCQkJLy8gUmUt b3JnYW5pemUgdGhlIHJlc3VsdHMsIHNvIHRoYXQgdGhleSdyZSBjb25zaXN0ZW50 CgkJCQkJaWYgKCBtICkgewoJCQkJCQltID0gWyAwLCBtWzJdLCBtWzNdLCBtWzFd IF07CgoJCQkJCX0gZWxzZSB7CgkJCQkJCS8vIE90aGVyd2lzZSwgZG8gYSB0cmFk aXRpb25hbCBmaWx0ZXIgY2hlY2sgZm9yCgkJCQkJCS8vIElELCBjbGFzcywgYW5k IGVsZW1lbnQgc2VsZWN0b3JzCgkJCQkJCXJlMiA9IHF1aWNrQ2xhc3M7CgkJCQkJ CW0gPSByZTIuZXhlYyh0KTsKCQkJCQl9CgoJCQkJCW1bMl0gPSBtWzJdLnJlcGxh Y2UoL1xcL2csICIiKTsKCgkJCQkJdmFyIGVsZW0gPSByZXRbcmV0Lmxlbmd0aC0x XTsKCgkJCQkJLy8gVHJ5IHRvIGRvIGEgZ2xvYmFsIHNlYXJjaCBieSBJRCwgd2hl cmUgd2UgY2FuCgkJCQkJaWYgKCBtWzFdID09ICIjIiAmJiBlbGVtICYmIGVsZW0u Z2V0RWxlbWVudEJ5SWQgJiYgIWpRdWVyeS5pc1hNTERvYyhlbGVtKSApIHsKCQkJ CQkJLy8gT3B0aW1pemF0aW9uIGZvciBIVE1MIGRvY3VtZW50IGNhc2UKCQkJCQkJ dmFyIG9pZCA9IGVsZW0uZ2V0RWxlbWVudEJ5SWQobVsyXSk7CgoJCQkJCQkvLyBE byBhIHF1aWNrIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBhY3R1YWwg SUQgYXR0cmlidXRlCgkJCQkJCS8vIHRvIGF2b2lkIHNlbGVjdGluZyBieSB0aGUg bmFtZSBhdHRyaWJ1dGUgaW4gSUUKCQkJCQkJLy8gYWxzbyBjaGVjayB0byBpbnN1 cmUgaWQgaXMgYSBzdHJpbmcgdG8gYXZvaWQgc2VsZWN0aW5nIGFuIGVsZW1lbnQg d2l0aCB0aGUgbmFtZSBvZiAnaWQnIGluc2lkZSBhIGZvcm0KCQkJCQkJaWYgKCAo alF1ZXJ5LmJyb3dzZXIubXNpZXx8alF1ZXJ5LmJyb3dzZXIub3BlcmEpICYmIG9p ZCAmJiB0eXBlb2Ygb2lkLmlkID09ICJzdHJpbmciICYmIG9pZC5pZCAhPSBtWzJd ICkKCQkJCQkJCW9pZCA9IGpRdWVyeSgnW0BpZD0iJyttWzJdKyciXScsIGVsZW0p WzBdOwoKCQkJCQkJLy8gRG8gYSBxdWljayBjaGVjayBmb3Igbm9kZSBuYW1lICh3 aGVyZSBhcHBsaWNhYmxlKSBzbwoJCQkJCQkvLyB0aGF0IGRpdiNmb28gc2VhcmNo ZXMgd2lsbCBiZSByZWFsbHkgZmFzdAoJCQkJCQlyZXQgPSByID0gb2lkICYmICgh bVszXSB8fCBqUXVlcnkubm9kZU5hbWUob2lkLCBtWzNdKSkgPyBbb2lkXSA6IFtd OwoJCQkJCX0gZWxzZSB7CgkJCQkJCS8vIFdlIG5lZWQgdG8gZmluZCBhbGwgZGVz Y2VuZGFudCBlbGVtZW50cwoJCQkJCQlmb3IgKCB2YXIgaSA9IDA7IHJldFtpXTsg aSsrICkgewoJCQkJCQkJLy8gR3JhYiB0aGUgdGFnIG5hbWUgYmVpbmcgc2VhcmNo ZWQgZm9yCgkJCQkJCQl2YXIgdGFnID0gbVsxXSA9PSAiIyIgJiYgbVszXSA/IG1b M10gOiBtWzFdICE9ICIiIHx8IG1bMF0gPT0gIiIgPyAiKiIgOiBtWzJdOwoKCQkJ CQkJCS8vIEhhbmRsZSBJRTcgYmVpbmcgcmVhbGx5IGR1bWIgYWJvdXQgPG9iamVj dD5zCgkJCQkJCQlpZiAoIHRhZyA9PSAiKiIgJiYgcmV0W2ldLm5vZGVOYW1lLnRv TG93ZXJDYXNlKCkgPT0gIm9iamVjdCIgKQoJCQkJCQkJCXRhZyA9ICJwYXJhbSI7 CgoJCQkJCQkJciA9IGpRdWVyeS5tZXJnZSggciwgcmV0W2ldLmdldEVsZW1lbnRz QnlUYWdOYW1lKCB0YWcgKSk7CgkJCQkJCX0KCgkJCQkJCS8vIEl0J3MgZmFzdGVy IHRvIGZpbHRlciBieSBjbGFzcyBhbmQgYmUgZG9uZSB3aXRoIGl0CgkJCQkJCWlm ICggbVsxXSA9PSAiLiIgKQoJCQkJCQkJciA9IGpRdWVyeS5jbGFzc0ZpbHRlcigg ciwgbVsyXSApOwoKCQkJCQkJLy8gU2FtZSB3aXRoIElEIGZpbHRlcmluZwoJCQkJ CQlpZiAoIG1bMV0gPT0gIiMiICkgewoJCQkJCQkJdmFyIHRtcCA9IFtdOwoKCQkJ CQkJCS8vIFRyeSB0byBmaW5kIHRoZSBlbGVtZW50IHdpdGggdGhlIElECgkJCQkJ CQlmb3IgKCB2YXIgaSA9IDA7IHJbaV07IGkrKyApCgkJCQkJCQkJaWYgKCByW2ld LmdldEF0dHJpYnV0ZSgiaWQiKSA9PSBtWzJdICkgewoJCQkJCQkJCQl0bXAgPSBb IHJbaV0gXTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoKCQkJCQkJCXIgPSB0 bXA7CgkJCQkJCX0KCgkJCQkJCXJldCA9IHI7CgkJCQkJfQoKCQkJCQl0ID0gdC5y ZXBsYWNlKCByZTIsICIiICk7CgkJCQl9CgoJCQl9CgoJCQkvLyBJZiBhIHNlbGVj dG9yIHN0cmluZyBzdGlsbCBleGlzdHMKCQkJaWYgKCB0ICkgewoJCQkJLy8gQXR0 ZW1wdCB0byBmaWx0ZXIgaXQKCQkJCXZhciB2YWwgPSBqUXVlcnkuZmlsdGVyKHQs cik7CgkJCQlyZXQgPSByID0gdmFsLnI7CgkJCQl0ID0galF1ZXJ5LnRyaW0odmFs LnQpOwoJCQl9CgkJfQoKCQkvLyBBbiBlcnJvciBvY2N1cnJlZCB3aXRoIHRoZSBz ZWxlY3RvcjsKCQkvLyBqdXN0IHJldHVybiBhbiBlbXB0eSBzZXQgaW5zdGVhZAoJ CWlmICggdCApCgkJCXJldCA9IFtdOwoKCQkvLyBSZW1vdmUgdGhlIHJvb3QgY29u dGV4dAoJCWlmICggcmV0ICYmIGNvbnRleHQgPT0gcmV0WzBdICkKCQkJcmV0LnNo aWZ0KCk7CgoJCS8vIEFuZCBjb21iaW5lIHRoZSByZXN1bHRzCgkJZG9uZSA9IGpR dWVyeS5tZXJnZSggZG9uZSwgcmV0ICk7CgoJCXJldHVybiBkb25lOwoJfSwKCglj bGFzc0ZpbHRlcjogZnVuY3Rpb24ocixtLG5vdCl7CgkJbSA9ICIgIiArIG0gKyAi ICI7CgkJdmFyIHRtcCA9IFtdOwoJCWZvciAoIHZhciBpID0gMDsgcltpXTsgaSsr ICkgewoJCQl2YXIgcGFzcyA9ICgiICIgKyByW2ldLmNsYXNzTmFtZSArICIgIiku aW5kZXhPZiggbSApID49IDA7CgkJCWlmICggIW5vdCAmJiBwYXNzIHx8IG5vdCAm JiAhcGFzcyApCgkJCQl0bXAucHVzaCggcltpXSApOwoJCX0KCQlyZXR1cm4gdG1w OwoJfSwKCglmaWx0ZXI6IGZ1bmN0aW9uKHQscixub3QpIHsKCQl2YXIgbGFzdDsK CgkJLy8gTG9vayBmb3IgY29tbW9uIGZpbHRlciBleHByZXNzaW9ucwoJCXdoaWxl ICggdCAmJiB0ICE9IGxhc3QgKSB7CgkJCWxhc3QgPSB0OwoKCQkJdmFyIHAgPSBq UXVlcnkucGFyc2UsIG07CgoJCQlmb3IgKCB2YXIgaSA9IDA7IHBbaV07IGkrKyAp IHsKCQkJCW0gPSBwW2ldLmV4ZWMoIHQgKTsKCgkJCQlpZiAoIG0gKSB7CgkJCQkJ Ly8gUmVtb3ZlIHdoYXQgd2UganVzdCBtYXRjaGVkCgkJCQkJdCA9IHQuc3Vic3Ry aW5nKCBtWzBdLmxlbmd0aCApOwoKCQkJCQltWzJdID0gbVsyXS5yZXBsYWNlKC9c XC9nLCAiIik7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCWlmICggIW0gKQoJ CQkJYnJlYWs7CgoJCQkvLyA6bm90KCkgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBj YW4gYmUgb3B0aW1pemVkIGJ5CgkJCS8vIGtlZXBpbmcgaXQgb3V0IG9mIHRoZSBl eHByZXNzaW9uIGxpc3QKCQkJaWYgKCBtWzFdID09ICI6IiAmJiBtWzJdID09ICJu b3QiICkKCQkJCS8vIG9wdGltaXplIGlmIG9ubHkgb25lIHNlbGVjdG9yIGZvdW5k IChtb3N0IGNvbW1vbiBjYXNlKQoJCQkJciA9IGlzU2ltcGxlLnRlc3QoIG1bM10g KSA/CgkJCQkJalF1ZXJ5LmZpbHRlcihtWzNdLCByLCB0cnVlKS5yIDoKCQkJCQlq UXVlcnkoIHIgKS5ub3QoIG1bM10gKTsKCgkJCS8vIFdlIGNhbiBnZXQgYSBiaWcg c3BlZWQgYm9vc3QgYnkgZmlsdGVyaW5nIGJ5IGNsYXNzIGhlcmUKCQkJZWxzZSBp ZiAoIG1bMV0gPT0gIi4iICkKCQkJCXIgPSBqUXVlcnkuY2xhc3NGaWx0ZXIociwg bVsyXSwgbm90KTsKCgkJCWVsc2UgaWYgKCBtWzFdID09ICJbIiApIHsKCQkJCXZh ciB0bXAgPSBbXSwgdHlwZSA9IG1bM107CgoJCQkJZm9yICggdmFyIGkgPSAwLCBy bCA9IHIubGVuZ3RoOyBpIDwgcmw7IGkrKyApIHsKCQkJCQl2YXIgYSA9IHJbaV0s IHogPSBhWyBqUXVlcnkucHJvcHNbbVsyXV0gfHwgbVsyXSBdOwoKCQkJCQlpZiAo IHogPT0gbnVsbCB8fCAvaHJlZnxzcmN8c2VsZWN0ZWQvLnRlc3QobVsyXSkgKQoJ CQkJCQl6ID0galF1ZXJ5LmF0dHIoYSxtWzJdKSB8fCAnJzsKCgkJCQkJaWYgKCAo dHlwZSA9PSAiIiAmJiAhIXogfHwKCQkJCQkJIHR5cGUgPT0gIj0iICYmIHogPT0g bVs1XSB8fAoJCQkJCQkgdHlwZSA9PSAiIT0iICYmIHogIT0gbVs1XSB8fAoJCQkJ CQkgdHlwZSA9PSAiXj0iICYmIHogJiYgIXouaW5kZXhPZihtWzVdKSB8fAoJCQkJ CQkgdHlwZSA9PSAiJD0iICYmIHouc3Vic3RyKHoubGVuZ3RoIC0gbVs1XS5sZW5n dGgpID09IG1bNV0gfHwKCQkJCQkJICh0eXBlID09ICIqPSIgfHwgdHlwZSA9PSAi fj0iKSAmJiB6LmluZGV4T2YobVs1XSkgPj0gMCkgXiBub3QgKQoJCQkJCQkJdG1w LnB1c2goIGEgKTsKCQkJCX0KCgkJCQlyID0gdG1wOwoKCQkJLy8gV2UgY2FuIGdl dCBhIHNwZWVkIGJvb3N0IGJ5IGhhbmRsaW5nIG50aC1jaGlsZCBoZXJlCgkJCX0g ZWxzZSBpZiAoIG1bMV0gPT0gIjoiICYmIG1bMl0gPT0gIm50aC1jaGlsZCIgKSB7 CgkJCQl2YXIgbWVyZ2UgPSB7fSwgdG1wID0gW10sCgkJCQkJLy8gcGFyc2UgZXF1 YXRpb25zIGxpa2UgJ2V2ZW4nLCAnb2RkJywgJzUnLCAnMm4nLCAnM24rMicsICc0 bi0xJywgJy1uKzYnCgkJCQkJdGVzdCA9IC8oLT8pKFxkKiluKCg/OlwrfC0pP1xk KikvLmV4ZWMoCgkJCQkJCW1bM10gPT0gImV2ZW4iICYmICIybiIgfHwgbVszXSA9 PSAib2RkIiAmJiAiMm4rMSIgfHwKCQkJCQkJIS9cRC8udGVzdChtWzNdKSAmJiAi MG4rIiArIG1bM10gfHwgbVszXSksCgkJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1i ZXJzIChmaXJzdCluKyhsYXN0KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRp dmUKCQkJCQlmaXJzdCA9ICh0ZXN0WzFdICsgKHRlc3RbMl0gfHwgMSkpIC0gMCwg bGFzdCA9IHRlc3RbM10gLSAwOwoKCQkJCS8vIGxvb3AgdGhyb3VnaCBhbGwgdGhl IGVsZW1lbnRzIGxlZnQgaW4gdGhlIGpRdWVyeSBvYmplY3QKCQkJCWZvciAoIHZh ciBpID0gMCwgcmwgPSByLmxlbmd0aDsgaSA8IHJsOyBpKysgKSB7CgkJCQkJdmFy IG5vZGUgPSByW2ldLCBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlLCBpZCA9 IGpRdWVyeS5kYXRhKHBhcmVudE5vZGUpOwoKCQkJCQlpZiAoICFtZXJnZVtpZF0g KSB7CgkJCQkJCXZhciBjID0gMTsKCgkJCQkJCWZvciAoIHZhciBuID0gcGFyZW50 Tm9kZS5maXJzdENoaWxkOyBuOyBuID0gbi5uZXh0U2libGluZyApCgkJCQkJCQlp ZiAoIG4ubm9kZVR5cGUgPT0gMSApCgkJCQkJCQkJbi5ub2RlSW5kZXggPSBjKys7 CgoJCQkJCQltZXJnZVtpZF0gPSB0cnVlOwoJCQkJCX0KCgkJCQkJdmFyIGFkZCA9 IGZhbHNlOwoKCQkJCQlpZiAoIGZpcnN0ID09IDAgKSB7CgkJCQkJCWlmICggbm9k ZS5ub2RlSW5kZXggPT0gbGFzdCApCgkJCQkJCQlhZGQgPSB0cnVlOwoJCQkJCX0g ZWxzZSBpZiAoIChub2RlLm5vZGVJbmRleCAtIGxhc3QpICUgZmlyc3QgPT0gMCAm JiAobm9kZS5ub2RlSW5kZXggLSBsYXN0KSAvIGZpcnN0ID49IDAgKQoJCQkJCQlh ZGQgPSB0cnVlOwoKCQkJCQlpZiAoIGFkZCBeIG5vdCApCgkJCQkJCXRtcC5wdXNo KCBub2RlICk7CgkJCQl9CgoJCQkJciA9IHRtcDsKCgkJCS8vIE90aGVyd2lzZSwg ZmluZCB0aGUgZXhwcmVzc2lvbiB0byBleGVjdXRlCgkJCX0gZWxzZSB7CgkJCQl2 YXIgZm4gPSBqUXVlcnkuZXhwclsgbVsxXSBdOwoJCQkJaWYgKCB0eXBlb2YgZm4g PT0gIm9iamVjdCIgKQoJCQkJCWZuID0gZm5bIG1bMl0gXTsKCgkJCQlpZiAoIHR5 cGVvZiBmbiA9PSAic3RyaW5nIiApCgkJCQkJZm4gPSBldmFsKCJmYWxzZXx8ZnVu Y3Rpb24oYSxpKXtyZXR1cm4gIiArIGZuICsgIjt9Iik7CgoJCQkJLy8gRXhlY3V0 ZSBpdCBhZ2FpbnN0IHRoZSBjdXJyZW50IGZpbHRlcgoJCQkJciA9IGpRdWVyeS5n cmVwKCByLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJCQlyZXR1cm4gZm4oZWxlbSwg aSwgbSwgcik7CgkJCQl9LCBub3QgKTsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuIGFu IGFycmF5IG9mIGZpbHRlcmVkIGVsZW1lbnRzIChyKQoJCS8vIGFuZCB0aGUgbW9k aWZpZWQgZXhwcmVzc2lvbiBzdHJpbmcgKHQpCgkJcmV0dXJuIHsgcjogciwgdDog dCB9OwoJfSwKCglkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIgKXsKCQl2YXIgbWF0 Y2hlZCA9IFtdLAoJCQljdXIgPSBlbGVtW2Rpcl07CgkJd2hpbGUgKCBjdXIgJiYg Y3VyICE9IGRvY3VtZW50ICkgewoJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PSAxICkK CQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCWN1ciA9IGN1cltkaXJdOwoJCX0K CQlyZXR1cm4gbWF0Y2hlZDsKCX0sCgoJbnRoOiBmdW5jdGlvbihjdXIscmVzdWx0 LGRpcixlbGVtKXsKCQlyZXN1bHQgPSByZXN1bHQgfHwgMTsKCQl2YXIgbnVtID0g MDsKCgkJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkKCQkJaWYgKCBjdXIu bm9kZVR5cGUgPT0gMSAmJiArK251bSA9PSByZXN1bHQgKQoJCQkJYnJlYWs7CgoJ CXJldHVybiBjdXI7Cgl9LAoKCXNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkg ewoJCXZhciByID0gW107CgoJCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcg KSB7CgkJCWlmICggbi5ub2RlVHlwZSA9PSAxICYmIG4gIT0gZWxlbSApCgkJCQly LnB1c2goIG4gKTsKCQl9CgoJCXJldHVybiByOwoJfQp9KTsKLyoKICogQSBudW1i ZXIgb2YgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIGZvciBtYW5hZ2luZyBldmVudHMu CiAqIE1hbnkgb2YgdGhlIGlkZWFzIGJlaGluZCB0aGlzIGNvZGUgb3JpZ25hdGVk IGZyb20KICogRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5LgogKi8KalF1 ZXJ5LmV2ZW50ID0gewoKCS8vIEJpbmQgYW4gZXZlbnQgdG8gYW4gZWxlbWVudAoJ Ly8gT3JpZ2luYWwgYnkgRGVhbiBFZHdhcmRzCglhZGQ6IGZ1bmN0aW9uKGVsZW0s IHR5cGVzLCBoYW5kbGVyLCBkYXRhKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09 IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKCQkJcmV0dXJuOwoKCQkvLyBGb3Ig d2hhdGV2ZXIgcmVhc29uLCBJRSBoYXMgdHJvdWJsZSBwYXNzaW5nIHRoZSB3aW5k b3cgb2JqZWN0CgkJLy8gYXJvdW5kLCBjYXVzaW5nIGl0IHRvIGJlIGNsb25lZCBp biB0aGUgcHJvY2VzcwoJCWlmICggalF1ZXJ5LmJyb3dzZXIubXNpZSAmJiBlbGVt LnNldEludGVydmFsICkKCQkJZWxlbSA9IHdpbmRvdzsKCgkJLy8gTWFrZSBzdXJl IHRoYXQgdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJ RAoJCWlmICggIWhhbmRsZXIuZ3VpZCApCgkJCWhhbmRsZXIuZ3VpZCA9IHRoaXMu Z3VpZCsrOwoKCQkvLyBpZiBkYXRhIGlzIHBhc3NlZCwgYmluZCB0byBoYW5kbGVy CgkJaWYoIGRhdGEgIT0gdW5kZWZpbmVkICkgewoJCQkvLyBDcmVhdGUgdGVtcG9y YXJ5IGZ1bmN0aW9uIHBvaW50ZXIgdG8gb3JpZ2luYWwgaGFuZGxlcgoJCQl2YXIg Zm4gPSBoYW5kbGVyOwoKCQkJLy8gQ3JlYXRlIHVuaXF1ZSBoYW5kbGVyIGZ1bmN0 aW9uLCB3cmFwcGVkIGFyb3VuZCBvcmlnaW5hbCBoYW5kbGVyCgkJCWhhbmRsZXIg PSB0aGlzLnByb3h5KCBmbiwgZnVuY3Rpb24oKSB7CgkJCQkvLyBQYXNzIGFyZ3Vt ZW50cyBhbmQgY29udGV4dCB0byBvcmlnaW5hbCBoYW5kbGVyCgkJCQlyZXR1cm4g Zm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCQkJfSk7CgoJCQkvLyBTdG9yZSBk YXRhIGluIHVuaXF1ZSBoYW5kbGVyCgkJCWhhbmRsZXIuZGF0YSA9IGRhdGE7CgkJ fQoKCQkvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlCgkJdmFy IGV2ZW50cyA9IGpRdWVyeS5kYXRhKGVsZW0sICJldmVudHMiKSB8fCBqUXVlcnku ZGF0YShlbGVtLCAiZXZlbnRzIiwge30pLAoJCQloYW5kbGUgPSBqUXVlcnkuZGF0 YShlbGVtLCAiaGFuZGxlIikgfHwgalF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIs IGZ1bmN0aW9uKCl7CgkJCQkvLyBIYW5kbGUgdGhlIHNlY29uZCBldmVudCBvZiBh IHRyaWdnZXIgYW5kIHdoZW4KCQkJCS8vIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRl ciBhIHBhZ2UgaGFzIHVubG9hZGVkCgkJCQlpZiAoIHR5cGVvZiBqUXVlcnkgIT0g InVuZGVmaW5lZCIgJiYgIWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKQoJCQkJCXJl dHVybiBqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KGFyZ3VtZW50cy5jYWxsZWUu ZWxlbSwgYXJndW1lbnRzKTsKCQkJfSk7CgkJLy8gQWRkIGVsZW0gYXMgYSBwcm9w ZXJ0eSBvZiB0aGUgaGFuZGxlIGZ1bmN0aW9uCgkJLy8gVGhpcyBpcyB0byBwcmV2 ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBub24tbmF0aXZlCgkJLy8gZXZlbnQgaW4g SUUuCgkJaGFuZGxlLmVsZW0gPSBlbGVtOwoKCQkvLyBIYW5kbGUgbXVsdGlwbGUg ZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJLy8galF1ZXJ5KC4uLikuYmlu ZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOwoJCWpRdWVyeS5lYWNoKHR5cGVz LnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5kZXgsIHR5cGUpIHsKCQkJLy8gTmFt ZXNwYWNlZCBldmVudCBoYW5kbGVycwoJCQl2YXIgcGFydHMgPSB0eXBlLnNwbGl0 KCIuIik7CgkJCXR5cGUgPSBwYXJ0c1swXTsKCQkJaGFuZGxlci50eXBlID0gcGFy dHNbMV07CgoJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBmdW5jdGlvbnMg Ym91bmQgdG8gdGhpcyBldmVudAoJCQl2YXIgaGFuZGxlcnMgPSBldmVudHNbdHlw ZV07CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlCgkJCWlmICgh aGFuZGxlcnMpIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzW3R5cGVdID0ge307CgoJ CQkJLy8gQ2hlY2sgZm9yIGEgc3BlY2lhbCBldmVudCBoYW5kbGVyCgkJCQkvLyBP bmx5IHVzZSBhZGRFdmVudExpc3RlbmVyL2F0dGFjaEV2ZW50IGlmIHRoZSBzcGVj aWFsCgkJCQkvLyBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlCgkJCQlpZiAo ICFqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXSB8fCBqUXVlcnkuZXZlbnQuc3Bl Y2lhbFt0eXBlXS5zZXR1cC5jYWxsKGVsZW0pID09PSBmYWxzZSApIHsKCQkJCQkv LyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudAoJ CQkJCWlmIChlbGVtLmFkZEV2ZW50TGlzdGVuZXIpCgkJCQkJCWVsZW0uYWRkRXZl bnRMaXN0ZW5lcih0eXBlLCBoYW5kbGUsIGZhbHNlKTsKCQkJCQllbHNlIGlmIChl bGVtLmF0dGFjaEV2ZW50KQoJCQkJCQllbGVtLmF0dGFjaEV2ZW50KCJvbiIgKyB0 eXBlLCBoYW5kbGUpOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgdGhlIGZ1bmN0aW9u IHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0CgkJCWhhbmRsZXJzW2hhbmRs ZXIuZ3VpZF0gPSBoYW5kbGVyOwoKCQkJLy8gS2VlcCB0cmFjayBvZiB3aGljaCBl dmVudHMgaGF2ZSBiZWVuIHVzZWQsIGZvciBnbG9iYWwgdHJpZ2dlcmluZwoJCQlq UXVlcnkuZXZlbnQuZ2xvYmFsW3R5cGVdID0gdHJ1ZTsKCQl9KTsKCgkJLy8gTnVs bGlmeSBlbGVtIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFCgkJZWxlbSA9 IG51bGw7Cgl9LAoKCWd1aWQ6IDEsCglnbG9iYWw6IHt9LAoKCS8vIERldGFjaCBh biBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudAoJcmVtb3Zl OiBmdW5jdGlvbihlbGVtLCB0eXBlcywgaGFuZGxlcikgewoJCS8vIGRvbid0IGRv IGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCBlbGVtLm5v ZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKCQkJcmV0dXJuOwoK CQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIpLCByZXQs IGluZGV4OwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJLy8gVW5iaW5kIGFsbCBldmVu dHMgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggdHlwZXMgPT0gdW5kZWZpbmVkIHx8 ICh0eXBlb2YgdHlwZXMgPT0gInN0cmluZyIgJiYgdHlwZXMuY2hhckF0KDApID09 ICIuIikgKQoJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkKCQkJCQl0aGlz LnJlbW92ZSggZWxlbSwgdHlwZSArICh0eXBlcyB8fCAiIikgKTsKCQkJZWxzZSB7 CgkJCQkvLyB0eXBlcyBpcyBhY3R1YWxseSBhbiBldmVudCBvYmplY3QgaGVyZQoJ CQkJaWYgKCB0eXBlcy50eXBlICkgewoJCQkJCWhhbmRsZXIgPSB0eXBlcy5oYW5k bGVyOwoJCQkJCXR5cGVzID0gdHlwZXMudHlwZTsKCQkJCX0KCgkJCQkvLyBIYW5k bGUgbXVsdGlwbGUgZXZlbnRzIHNlcGVyYXRlZCBieSBhIHNwYWNlCgkJCQkvLyBq UXVlcnkoLi4uKS51bmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQkJ CWpRdWVyeS5lYWNoKHR5cGVzLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5kZXgs IHR5cGUpewoJCQkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJCQl2 YXIgcGFydHMgPSB0eXBlLnNwbGl0KCIuIik7CgkJCQkJdHlwZSA9IHBhcnRzWzBd OwoKCQkJCQlpZiAoIGV2ZW50c1t0eXBlXSApIHsKCQkJCQkJLy8gcmVtb3ZlIHRo ZSBnaXZlbiBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gdHlwZQoJCQkJCQlpZiAoIGhh bmRsZXIgKQoJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVyLmd1aWRd OwoKCQkJCQkJLy8gcmVtb3ZlIGFsbCBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIHR5 cGUKCQkJCQkJZWxzZQoJCQkJCQkJZm9yICggaGFuZGxlciBpbiBldmVudHNbdHlw ZV0gKQoJCQkJCQkJCS8vIEhhbmRsZSB0aGUgcmVtb3ZhbCBvZiBuYW1lc3BhY2Vk IGV2ZW50cwoJCQkJCQkJCWlmICggIXBhcnRzWzFdIHx8IGV2ZW50c1t0eXBlXVto YW5kbGVyXS50eXBlID09IHBhcnRzWzFdICkKCQkJCQkJCQkJZGVsZXRlIGV2ZW50 c1t0eXBlXVtoYW5kbGVyXTsKCgkJCQkJCS8vIHJlbW92ZSBnZW5lcmljIGV2ZW50 IGhhbmRsZXIgaWYgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQkJCQlmb3IgKCBy ZXQgaW4gZXZlbnRzW3R5cGVdICkgYnJlYWs7CgkJCQkJCWlmICggIXJldCApIHsK CQkJCQkJCWlmICggIWpRdWVyeS5ldmVudC5zcGVjaWFsW3R5cGVdIHx8IGpRdWVy eS5ldmVudC5zcGVjaWFsW3R5cGVdLnRlYXJkb3duLmNhbGwoZWxlbSkgPT09IGZh bHNlICkgewoJCQkJCQkJCWlmIChlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIpCgkJ CQkJCQkJCWVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBqUXVlcnkuZGF0 YShlbGVtLCAiaGFuZGxlIiksIGZhbHNlKTsKCQkJCQkJCQllbHNlIGlmIChlbGVt LmRldGFjaEV2ZW50KQoJCQkJCQkJCQllbGVtLmRldGFjaEV2ZW50KCJvbiIgKyB0 eXBlLCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIikpOwoJCQkJCQkJfQoJCQkJ CQkJcmV0ID0gbnVsbDsKCQkJCQkJCWRlbGV0ZSBldmVudHNbdHlwZV07CgkJCQkJ CX0KCQkJCQl9CgkJCQl9KTsKCQkJfQoKCQkJLy8gUmVtb3ZlIHRoZSBleHBhbmRv IGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKCQkJZm9yICggcmV0IGluIGV2ZW50cyAp IGJyZWFrOwoJCQlpZiAoICFyZXQgKSB7CgkJCQl2YXIgaGFuZGxlID0galF1ZXJ5 LmRhdGEoIGVsZW0sICJoYW5kbGUiICk7CgkJCQlpZiAoIGhhbmRsZSApIGhhbmRs ZS5lbGVtID0gbnVsbDsKCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAiZXZl bnRzIiApOwoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJoYW5kbGUiICk7 CgkJCX0KCQl9Cgl9LAoKCXRyaWdnZXI6IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIGVs ZW0sIGRvbmF0aXZlLCBleHRyYSkgewoJCS8vIENsb25lIHRoZSBpbmNvbWluZyBk YXRhLCBpZiBhbnkKCQlkYXRhID0galF1ZXJ5Lm1ha2VBcnJheShkYXRhKTsKCgkJ aWYgKCB0eXBlLmluZGV4T2YoIiEiKSA+PSAwICkgewoJCQl0eXBlID0gdHlwZS5z bGljZSgwLCAtMSk7CgkJCXZhciBleGNsdXNpdmUgPSB0cnVlOwoJCX0KCgkJLy8g SGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKCQlpZiAoICFlbGVtICkgewoJCQkvLyBP bmx5IHRyaWdnZXIgaWYgd2UndmUgZXZlciBib3VuZCBhbiBldmVudCBmb3IgaXQK CQkJaWYgKCB0aGlzLmdsb2JhbFt0eXBlXSApCgkJCQlqUXVlcnkoIioiKS5hZGQo W3dpbmRvdywgZG9jdW1lbnRdKS50cmlnZ2VyKHR5cGUsIGRhdGEpOwoKCQkvLyBI YW5kbGUgdHJpZ2dlcmluZyBhIHNpbmdsZSBlbGVtZW50CgkJfSBlbHNlIHsKCQkJ Ly8gZG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQkJ aWYgKCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkK CQkJCXJldHVybiB1bmRlZmluZWQ7CgoJCQl2YXIgdmFsLCByZXQsIGZuID0galF1 ZXJ5LmlzRnVuY3Rpb24oIGVsZW1bIHR5cGUgXSB8fCBudWxsICksCgkJCQkvLyBD aGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBwcm92aWRlIGEgZmFrZSBldmVudCwg b3Igbm90CgkJCQlldmVudCA9ICFkYXRhWzBdIHx8ICFkYXRhWzBdLnByZXZlbnRE ZWZhdWx0OwoKCQkJLy8gUGFzcyBhbG9uZyBhIGZha2UgZXZlbnQKCQkJaWYgKCBl dmVudCApIHsKCQkJCWRhdGEudW5zaGlmdCh7CgkJCQkJdHlwZTogdHlwZSwKCQkJ CQl0YXJnZXQ6IGVsZW0sCgkJCQkJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCl7 fSwKCQkJCQlzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCl7fSwKCQkJCQl0aW1l U3RhbXA6IG5vdygpCgkJCQl9KTsKCQkJCWRhdGFbMF1bZXhwYW5kb10gPSB0cnVl OyAvLyBubyBuZWVkIHRvIGZpeCBmYWtlIGV2ZW50CgkJCX0KCgkJCS8vIEVuZm9y Y2UgdGhlIHJpZ2h0IHRyaWdnZXIgdHlwZQoJCQlkYXRhWzBdLnR5cGUgPSB0eXBl OwoJCQlpZiAoIGV4Y2x1c2l2ZSApCgkJCQlkYXRhWzBdLmV4Y2x1c2l2ZSA9IHRy dWU7CgoJCQkvLyBUcmlnZ2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1lZCB0aGF0 ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24KCQkJdmFyIGhhbmRsZSA9IGpRdWVyeS5k YXRhKGVsZW0sICJoYW5kbGUiKTsKCQkJaWYgKCBoYW5kbGUgKQoJCQkJdmFsID0g aGFuZGxlLmFwcGx5KCBlbGVtLCBkYXRhICk7CgoJCQkvLyBIYW5kbGUgdHJpZ2dl cmluZyBuYXRpdmUgLm9uZm9vIGhhbmRsZXJzIChhbmQgb24gbGlua3Mgc2luY2Ug d2UgZG9uJ3QgY2FsbCAuY2xpY2soKSBmb3IgbGlua3MpCgkJCWlmICggKCFmbiB8 fCAoalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICdhJykgJiYgdHlwZSA9PSAiY2xpY2si KSkgJiYgZWxlbVsib24iK3R5cGVdICYmIGVsZW1bIm9uIit0eXBlXS5hcHBseSgg ZWxlbSwgZGF0YSApID09PSBmYWxzZSApCgkJCQl2YWwgPSBmYWxzZTsKCgkJCS8v IEV4dHJhIGZ1bmN0aW9ucyBkb24ndCBnZXQgdGhlIGN1c3RvbSBldmVudCBvYmpl Y3QKCQkJaWYgKCBldmVudCApCgkJCQlkYXRhLnNoaWZ0KCk7CgoJCQkvLyBIYW5k bGUgdHJpZ2dlcmluZyBvZiBleHRyYSBmdW5jdGlvbgoJCQlpZiAoIGV4dHJhICYm IGpRdWVyeS5pc0Z1bmN0aW9uKCBleHRyYSApICkgewoJCQkJLy8gY2FsbCB0aGUg ZXh0cmEgZnVuY3Rpb24gYW5kIHRhY2sgdGhlIGN1cnJlbnQgcmV0dXJuIHZhbHVl IG9uIHRoZSBlbmQgZm9yIHBvc3NpYmxlIGluc3BlY3Rpb24KCQkJCXJldCA9IGV4 dHJhLmFwcGx5KCBlbGVtLCB2YWwgPT0gbnVsbCA/IGRhdGEgOiBkYXRhLmNvbmNh dCggdmFsICkgKTsKCQkJCS8vIGlmIGFueXRoaW5nIGlzIHJldHVybmVkLCBnaXZl IGl0IHByZWNlZGVuY2UgYW5kIGhhdmUgaXQgb3ZlcndyaXRlIHRoZSBwcmV2aW91 cyB2YWx1ZQoJCQkJaWYgKHJldCAhPT0gdW5kZWZpbmVkKQoJCQkJCXZhbCA9IHJl dDsKCQkJfQoKCQkJLy8gVHJpZ2dlciB0aGUgbmF0aXZlIGV2ZW50cyAoZXhjZXB0 IGZvciBjbGlja3Mgb24gbGlua3MpCgkJCWlmICggZm4gJiYgZG9uYXRpdmUgIT09 IGZhbHNlICYmIHZhbCAhPT0gZmFsc2UgJiYgIShqUXVlcnkubm9kZU5hbWUoZWxl bSwgJ2EnKSAmJiB0eXBlID09ICJjbGljayIpICkgewoJCQkJdGhpcy50cmlnZ2Vy ZWQgPSB0cnVlOwoJCQkJdHJ5IHsKCQkJCQllbGVtWyB0eXBlIF0oKTsKCQkJCS8v IHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBhbiBlcnJvciBmb3Igc29tZSBoaWRk ZW4gZWxlbWVudHMKCQkJCX0gY2F0Y2ggKGUpIHt9CgkJCX0KCgkJCXRoaXMudHJp Z2dlcmVkID0gZmFsc2U7CgkJfQoKCQlyZXR1cm4gdmFsOwoJfSwKCgloYW5kbGU6 IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy8gcmV0dXJuZWQgdW5kZWZpbmVkIG9yIGZh bHNlCgkJdmFyIHZhbCwgcmV0LCBuYW1lc3BhY2UsIGFsbCwgaGFuZGxlcnM7CgoJ CWV2ZW50ID0gYXJndW1lbnRzWzBdID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQg fHwgd2luZG93LmV2ZW50ICk7CgoJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxl cnMKCQluYW1lc3BhY2UgPSBldmVudC50eXBlLnNwbGl0KCIuIik7CgkJZXZlbnQu dHlwZSA9IG5hbWVzcGFjZVswXTsKCQluYW1lc3BhY2UgPSBuYW1lc3BhY2VbMV07 CgkJLy8gQ2FjaGUgdGhpcyBub3csIGFsbCA9IHRydWUgbWVhbnMsIGFueSBoYW5k bGVyCgkJYWxsID0gIW5hbWVzcGFjZSAmJiAhZXZlbnQuZXhjbHVzaXZlOwoKCQlo YW5kbGVycyA9ICggalF1ZXJ5LmRhdGEodGhpcywgImV2ZW50cyIpIHx8IHt9IClb ZXZlbnQudHlwZV07CgoJCWZvciAoIHZhciBqIGluIGhhbmRsZXJzICkgewoJCQl2 YXIgaGFuZGxlciA9IGhhbmRsZXJzW2pdOwoKCQkJLy8gRmlsdGVyIHRoZSBmdW5j dGlvbnMgYnkgY2xhc3MKCQkJaWYgKCBhbGwgfHwgaGFuZGxlci50eXBlID09IG5h bWVzcGFjZSApIHsKCQkJCS8vIFBhc3MgaW4gYSByZWZlcmVuY2UgdG8gdGhlIGhh bmRsZXIgZnVuY3Rpb24gaXRzZWxmCgkJCQkvLyBTbyB0aGF0IHdlIGNhbiBsYXRl ciByZW1vdmUgaXQKCQkJCWV2ZW50LmhhbmRsZXIgPSBoYW5kbGVyOwoJCQkJZXZl bnQuZGF0YSA9IGhhbmRsZXIuZGF0YTsKCgkJCQlyZXQgPSBoYW5kbGVyLmFwcGx5 KCB0aGlzLCBhcmd1bWVudHMgKTsKCgkJCQlpZiAoIHZhbCAhPT0gZmFsc2UgKQoJ CQkJCXZhbCA9IHJldDsKCgkJCQlpZiAoIHJldCA9PT0gZmFsc2UgKSB7CgkJCQkJ ZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQlldmVudC5zdG9wUHJvcGFnYXRp b24oKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHZhbDsKCX0sCgoJZml4OiBm dW5jdGlvbihldmVudCkgewoJCWlmICggZXZlbnRbZXhwYW5kb10gPT0gdHJ1ZSAp CgkJCXJldHVybiBldmVudDsKCgkJLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBvcmln aW5hbCBldmVudCBvYmplY3QKCQkvLyBhbmQgImNsb25lIiB0byBzZXQgcmVhZC1v bmx5IHByb3BlcnRpZXMKCQl2YXIgb3JpZ2luYWxFdmVudCA9IGV2ZW50OwoJCWV2 ZW50ID0geyBvcmlnaW5hbEV2ZW50OiBvcmlnaW5hbEV2ZW50IH07CgkJdmFyIHBy b3BzID0gImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9u IGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3Vy cmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhh bmRsZXIga2V5Q29kZSBtZXRhS2V5IG5ld1ZhbHVlIG9yaWdpbmFsVGFyZ2V0IHBh Z2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNj cmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0aW1lU3Rh bXAgdG9FbGVtZW50IHR5cGUgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgi ICIpOwoJCWZvciAoIHZhciBpPXByb3BzLmxlbmd0aDsgaTsgaS0tICkKCQkJZXZl bnRbIHByb3BzW2ldIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wc1tpXSBdOwoKCQkv LyBNYXJrIGl0IGFzIGZpeGVkCgkJZXZlbnRbZXhwYW5kb10gPSB0cnVlOwoKCQkv LyBhZGQgcHJldmVudERlZmF1bHQgYW5kIHN0b3BQcm9wYWdhdGlvbiBzaW5jZQoJ CS8vIHRoZXkgd2lsbCBub3Qgd29yayBvbiB0aGUgY2xvbmUKCQlldmVudC5wcmV2 ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKCkgewoJCQkvLyBpZiBwcmV2ZW50RGVmYXVs dCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAoJCQlpZiAob3Jp Z2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCkKCQkJCW9yaWdpbmFsRXZlbnQucHJl dmVudERlZmF1bHQoKTsKCQkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgcmV0dXJuVmFs dWUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGZhbHNlIChJRSkK CQkJb3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwoJCX07CgkJZXZl bnQuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24oKSB7CgkJCS8vIGlmIHN0b3BQ cm9wYWdhdGlvbiBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAoJ CQlpZiAob3JpZ2luYWxFdmVudC5zdG9wUHJvcGFnYXRpb24pCgkJCQlvcmlnaW5h bEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoJCQkvLyBvdGhlcndpc2Ugc2V0IHRo ZSBjYW5jZWxCdWJibGUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRv IHRydWUgKElFKQoJCQlvcmlnaW5hbEV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7 CgkJfTsKCgkJLy8gRml4IHRpbWVTdGFtcAoJCWV2ZW50LnRpbWVTdGFtcCA9IGV2 ZW50LnRpbWVTdGFtcCB8fCBub3coKTsKCgkJLy8gRml4IHRhcmdldCBwcm9wZXJ0 eSwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQudGFyZ2V0ICkKCQkJZXZlbnQu dGFyZ2V0ID0gZXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDsgLy8gRml4ZXMg IzE5MjUgd2hlcmUgc3JjRWxlbWVudCBtaWdodCBub3QgYmUgZGVmaW5lZCBlaXRo ZXIKCgkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5vZGUgKHNhZmFyaSkK CQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PSAzICkKCQkJZXZlbnQudGFy Z2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CgoJCS8vIEFkZCByZWxhdGVk VGFyZ2V0LCBpZiBuZWNlc3NhcnkKCQlpZiAoICFldmVudC5yZWxhdGVkVGFyZ2V0 ICYmIGV2ZW50LmZyb21FbGVtZW50ICkKCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9 IGV2ZW50LmZyb21FbGVtZW50ID09IGV2ZW50LnRhcmdldCA/IGV2ZW50LnRvRWxl bWVudCA6IGV2ZW50LmZyb21FbGVtZW50OwoKCQkvLyBDYWxjdWxhdGUgcGFnZVgv WSBpZiBtaXNzaW5nIGFuZCBjbGllbnRYL1kgYXZhaWxhYmxlCgkJaWYgKCBldmVu dC5wYWdlWCA9PSBudWxsICYmIGV2ZW50LmNsaWVudFggIT0gbnVsbCApIHsKCQkJ dmFyIGRvYyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgYm9keSA9IGRvY3Vt ZW50LmJvZHk7CgkJCWV2ZW50LnBhZ2VYID0gZXZlbnQuY2xpZW50WCArIChkb2Mg JiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwg MCkgLSAoZG9jLmNsaWVudExlZnQgfHwgMCk7CgkJCWV2ZW50LnBhZ2VZID0gZXZl bnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCB8fCBib2R5ICYmIGJv ZHkuc2Nyb2xsVG9wIHx8IDApIC0gKGRvYy5jbGllbnRUb3AgfHwgMCk7CgkJfQoK CQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoICFldmVudC53aGlj aCAmJiAoKGV2ZW50LmNoYXJDb2RlIHx8IGV2ZW50LmNoYXJDb2RlID09PSAwKSA/ IGV2ZW50LmNoYXJDb2RlIDogZXZlbnQua2V5Q29kZSkgKQoJCQlldmVudC53aGlj aCA9IGV2ZW50LmNoYXJDb2RlIHx8IGV2ZW50LmtleUNvZGU7CgoJCS8vIEFkZCBt ZXRhS2V5IHRvIG5vbi1NYWMgYnJvd3NlcnMgKHVzZSBjdHJsIGZvciBQQydzIGFu ZCBNZXRhIGZvciBNYWNzKQoJCWlmICggIWV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQu Y3RybEtleSApCgkJCWV2ZW50Lm1ldGFLZXkgPSBldmVudC5jdHJsS2V5OwoKCQkv LyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09IGxlZnQ7IDIgPT0gbWlkZGxlOyAz ID09IHJpZ2h0CgkJLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBz byBkb24ndCB1c2UgaXQKCQlpZiAoICFldmVudC53aGljaCAmJiBldmVudC5idXR0 b24gKQoJCQlldmVudC53aGljaCA9IChldmVudC5idXR0b24gJiAxID8gMSA6ICgg ZXZlbnQuYnV0dG9uICYgMiA/IDMgOiAoIGV2ZW50LmJ1dHRvbiAmIDQgPyAyIDog MCApICkpOwoKCQlyZXR1cm4gZXZlbnQ7Cgl9LAoKCXByb3h5OiBmdW5jdGlvbigg Zm4sIHByb3h5ICl7CgkJLy8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVy IHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSBy ZW1vdmVkCgkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IHByb3h5 Lmd1aWQgfHwgdGhpcy5ndWlkKys7CgkJLy8gU28gcHJveHkgY2FuIGJlIGRlY2xh cmVkIGFzIGFuIGFyZ3VtZW50CgkJcmV0dXJuIHByb3h5OwoJfSwKCglzcGVjaWFs OiB7CgkJcmVhZHk6IHsKCQkJc2V0dXA6IGZ1bmN0aW9uKCkgewoJCQkJLy8gTWFr ZSBzdXJlIHRoZSByZWFkeSBldmVudCBpcyBzZXR1cAoJCQkJYmluZFJlYWR5KCk7 CgkJCQlyZXR1cm47CgkJCX0sCgoJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7IHJl dHVybjsgfQoJCX0sCgoJCW1vdXNlZW50ZXI6IHsKCQkJc2V0dXA6IGZ1bmN0aW9u KCkgewoJCQkJaWYgKCBqUXVlcnkuYnJvd3Nlci5tc2llICkgcmV0dXJuIGZhbHNl OwoJCQkJalF1ZXJ5KHRoaXMpLmJpbmQoIm1vdXNlb3ZlciIsIGpRdWVyeS5ldmVu dC5zcGVjaWFsLm1vdXNlZW50ZXIuaGFuZGxlcik7CgkJCQlyZXR1cm4gdHJ1ZTsK CQkJfSwKCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCWlmICggalF1ZXJ5 LmJyb3dzZXIubXNpZSApIHJldHVybiBmYWxzZTsKCQkJCWpRdWVyeSh0aGlzKS51 bmJpbmQoIm1vdXNlb3ZlciIsIGpRdWVyeS5ldmVudC5zcGVjaWFsLm1vdXNlZW50 ZXIuaGFuZGxlcik7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSwKCgkJCWhhbmRsZXI6 IGZ1bmN0aW9uKGV2ZW50KSB7CgkJCQkvLyBJZiB3ZSBhY3R1YWxseSBqdXN0IG1v dXNlZCBvbiB0byBhIHN1Yi1lbGVtZW50LCBpZ25vcmUgaXQKCQkJCWlmICggd2l0 aGluRWxlbWVudChldmVudCwgdGhpcykgKSByZXR1cm4gdHJ1ZTsKCQkJCS8vIEV4 ZWN1dGUgdGhlIHJpZ2h0IGhhbmRsZXJzIGJ5IHNldHRpbmcgdGhlIGV2ZW50IHR5 cGUgdG8gbW91c2VlbnRlcgoJCQkJZXZlbnQudHlwZSA9ICJtb3VzZWVudGVyIjsK CQkJCXJldHVybiBqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsIGFyZ3Vt ZW50cyk7CgkJCX0KCQl9LAoKCQltb3VzZWxlYXZlOiB7CgkJCXNldHVwOiBmdW5j dGlvbigpIHsKCQkJCWlmICggalF1ZXJ5LmJyb3dzZXIubXNpZSApIHJldHVybiBm YWxzZTsKCQkJCWpRdWVyeSh0aGlzKS5iaW5kKCJtb3VzZW91dCIsIGpRdWVyeS5l dmVudC5zcGVjaWFsLm1vdXNlbGVhdmUuaGFuZGxlcik7CgkJCQlyZXR1cm4gdHJ1 ZTsKCQkJfSwKCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCWlmICggalF1 ZXJ5LmJyb3dzZXIubXNpZSApIHJldHVybiBmYWxzZTsKCQkJCWpRdWVyeSh0aGlz KS51bmJpbmQoIm1vdXNlb3V0IiwgalF1ZXJ5LmV2ZW50LnNwZWNpYWwubW91c2Vs ZWF2ZS5oYW5kbGVyKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9LAoKCQkJaGFuZGxl cjogZnVuY3Rpb24oZXZlbnQpIHsKCQkJCS8vIElmIHdlIGFjdHVhbGx5IGp1c3Qg bW91c2VkIG9uIHRvIGEgc3ViLWVsZW1lbnQsIGlnbm9yZSBpdAoJCQkJaWYgKCB3 aXRoaW5FbGVtZW50KGV2ZW50LCB0aGlzKSApIHJldHVybiB0cnVlOwoJCQkJLy8g RXhlY3V0ZSB0aGUgcmlnaHQgaGFuZGxlcnMgYnkgc2V0dGluZyB0aGUgZXZlbnQg dHlwZSB0byBtb3VzZWxlYXZlCgkJCQlldmVudC50eXBlID0gIm1vdXNlbGVhdmUi OwoJCQkJcmV0dXJuIGpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkodGhpcywgYXJn dW1lbnRzKTsKCQkJfQoJCX0KCX0KfTsKCmpRdWVyeS5mbi5leHRlbmQoewoJYmlu ZDogZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgewoJCXJldHVybiB0eXBlID09 ICJ1bmxvYWQiID8gdGhpcy5vbmUodHlwZSwgZGF0YSwgZm4pIDogdGhpcy5lYWNo KGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIGZu IHx8IGRhdGEsIGZuICYmIGRhdGEgKTsKCQl9KTsKCX0sCgoJb25lOiBmdW5jdGlv biggdHlwZSwgZGF0YSwgZm4gKSB7CgkJdmFyIG9uZSA9IGpRdWVyeS5ldmVudC5w cm94eSggZm4gfHwgZGF0YSwgZnVuY3Rpb24oZXZlbnQpIHsKCQkJalF1ZXJ5KHRo aXMpLnVuYmluZChldmVudCwgb25lKTsKCQkJcmV0dXJuIChmbiB8fCBkYXRhKS5h cHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfSk7CgkJcmV0dXJuIHRoaXMuZWFj aChmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBv bmUsIGZuICYmIGRhdGEpOwoJCX0pOwoJfSwKCgl1bmJpbmQ6IGZ1bmN0aW9uKCB0 eXBlLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpR dWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGUsIGZuICk7CgkJfSk7Cgl9LAoK CXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4g dGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0 eXBlLCBkYXRhLCB0aGlzLCB0cnVlLCBmbiApOwoJCX0pOwoJfSwKCgl0cmlnZ2Vy SGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgewoJCXJldHVybiB0 aGlzWzBdICYmIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlz WzBdLCBmYWxzZSwgZm4gKTsKCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7 CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4g Y2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLCBpID0gMTsKCgkJLy8gbGlu ayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0 aGlzIGNsaWNrIGhhbmRsZXIKCQl3aGlsZSggaSA8IGFyZ3MubGVuZ3RoICkKCQkJ alF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgYXJnc1tpKytdICk7CgoJCXJldHVybiB0 aGlzLmNsaWNrKCBqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBmdW5jdGlvbihldmVu dCkgewoJCQkvLyBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRvIGV4ZWN1dGUK CQkJdGhpcy5sYXN0VG9nZ2xlID0gKCB0aGlzLmxhc3RUb2dnbGUgfHwgMCApICUg aTsKCgkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCgkJCWV2ZW50LnBy ZXZlbnREZWZhdWx0KCk7CgoJCQkvLyBhbmQgZXhlY3V0ZSB0aGUgZnVuY3Rpb24K CQkJcmV0dXJuIGFyZ3NbIHRoaXMubGFzdFRvZ2dsZSsrIF0uYXBwbHkoIHRoaXMs IGFyZ3VtZW50cyApIHx8IGZhbHNlOwoJCX0pKTsKCX0sCgoJaG92ZXI6IGZ1bmN0 aW9uKGZuT3ZlciwgZm5PdXQpIHsKCQlyZXR1cm4gdGhpcy5iaW5kKCdtb3VzZWVu dGVyJywgZm5PdmVyKS5iaW5kKCdtb3VzZWxlYXZlJywgZm5PdXQpOwoJfSwKCgly ZWFkeTogZnVuY3Rpb24oZm4pIHsKCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycwoJ CWJpbmRSZWFkeSgpOwoKCQkvLyBJZiB0aGUgRE9NIGlzIGFscmVhZHkgcmVhZHkK CQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkKCQkJLy8gRXhlY3V0ZSB0aGUgZnVuY3Rp b24gaW1tZWRpYXRlbHkKCQkJZm4uY2FsbCggZG9jdW1lbnQsIGpRdWVyeSApOwoK CQkvLyBPdGhlcndpc2UsIHJlbWVtYmVyIHRoZSBmdW5jdGlvbiBmb3IgbGF0ZXIK CQllbHNlCgkJCS8vIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIHdhaXQgbGlzdAoJ CQlqUXVlcnkucmVhZHlMaXN0LnB1c2goIGZ1bmN0aW9uKCkgeyByZXR1cm4gZm4u Y2FsbCh0aGlzLCBqUXVlcnkpOyB9ICk7CgoJCXJldHVybiB0aGlzOwoJfQp9KTsK CmpRdWVyeS5leHRlbmQoewoJaXNSZWFkeTogZmFsc2UsCglyZWFkeUxpc3Q6IFtd LAoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0 aW9uKCkgewoJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgbm90IGFscmVh ZHkgbG9hZGVkCgkJaWYgKCAhalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCS8vIFJlbWVt YmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCQlqUXVlcnkuaXNSZWFkeSA9IHRy dWU7CgoJCQkvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVj dXRlCgkJCWlmICggalF1ZXJ5LnJlYWR5TGlzdCApIHsKCQkJCS8vIEV4ZWN1dGUg YWxsIG9mIHRoZW0KCQkJCWpRdWVyeS5lYWNoKCBqUXVlcnkucmVhZHlMaXN0LCBm dW5jdGlvbigpewoJCQkJCXRoaXMuY2FsbCggZG9jdW1lbnQgKTsKCQkJCX0pOwoK CQkJCS8vIFJlc2V0IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucwoJCQkJalF1ZXJ5LnJl YWR5TGlzdCA9IG51bGw7CgkJCX0KCgkJCS8vIFRyaWdnZXIgYW55IGJvdW5kIHJl YWR5IGV2ZW50cwoJCQlqUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJy ZWFkeSIpOwoJCX0KCX0KfSk7Cgp2YXIgcmVhZHlCb3VuZCA9IGZhbHNlOwoKZnVu Y3Rpb24gYmluZFJlYWR5KCl7CglpZiAoIHJlYWR5Qm91bmQgKSByZXR1cm47Cgly ZWFkeUJvdW5kID0gdHJ1ZTsKCgkvLyBNb3ppbGxhLCBPcGVyYSAoc2VlIGZ1cnRo ZXIgYmVsb3cgZm9yIGl0KSBhbmQgd2Via2l0IG5pZ2h0bGllcyBjdXJyZW50bHkg c3VwcG9ydCB0aGlzIGV2ZW50CglpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVu ZXIgJiYgIWpRdWVyeS5icm93c2VyLm9wZXJhKQoJCS8vIFVzZSB0aGUgaGFuZHkg ZXZlbnQgY2FsbGJhY2sKCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9N Q29udGVudExvYWRlZCIsIGpRdWVyeS5yZWFkeSwgZmFsc2UgKTsKCgkvLyBJZiBJ RSBpcyB1c2VkIGFuZCBpcyBub3QgaW4gYSBmcmFtZQoJLy8gQ29udGludWFsbHkg Y2hlY2sgdG8gc2VlIGlmIHRoZSBkb2N1bWVudCBpcyByZWFkeQoJaWYgKCBqUXVl cnkuYnJvd3Nlci5tc2llICYmIHdpbmRvdyA9PSB0b3AgKSAoZnVuY3Rpb24oKXsK CQlpZiAoalF1ZXJ5LmlzUmVhZHkpIHJldHVybjsKCQl0cnkgewoJCQkvLyBJZiBJ RSBpcyB1c2VkLCB1c2UgdGhlIHRyaWNrIGJ5IERpZWdvIFBlcmluaQoJCQkvLyBo dHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwoJCQlk b2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKTsKCQl9IGNh dGNoKCBlcnJvciApIHsKCQkJc2V0VGltZW91dCggYXJndW1lbnRzLmNhbGxlZSwg MCApOwoJCQlyZXR1cm47CgkJfQoJCS8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5n IGZ1bmN0aW9ucwoJCWpRdWVyeS5yZWFkeSgpOwoJfSkoKTsKCglpZiAoIGpRdWVy eS5icm93c2VyLm9wZXJhICkKCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAi RE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsKCQkJaWYgKGpRdWVyeS5p c1JlYWR5KSByZXR1cm47CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgZG9jdW1lbnQu c3R5bGVTaGVldHMubGVuZ3RoOyBpKyspCgkJCQlpZiAoZG9jdW1lbnQuc3R5bGVT aGVldHNbaV0uZGlzYWJsZWQpIHsKCQkJCQlzZXRUaW1lb3V0KCBhcmd1bWVudHMu Y2FsbGVlLCAwICk7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkvLyBhbmQgZXhlY3V0 ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMKCQkJalF1ZXJ5LnJlYWR5KCk7CgkJfSwg ZmFsc2UpOwoKCWlmICggalF1ZXJ5LmJyb3dzZXIuc2FmYXJpICkgewoJCXZhciBu dW1TdHlsZXM7CgkJKGZ1bmN0aW9uKCl7CgkJCWlmIChqUXVlcnkuaXNSZWFkeSkg cmV0dXJuOwoJCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT0gImxvYWRlZCIg JiYgZG9jdW1lbnQucmVhZHlTdGF0ZSAhPSAiY29tcGxldGUiICkgewoJCQkJc2V0 VGltZW91dCggYXJndW1lbnRzLmNhbGxlZSwgMCApOwoJCQkJcmV0dXJuOwoJCQl9 CgkJCWlmICggbnVtU3R5bGVzID09PSB1bmRlZmluZWQgKQoJCQkJbnVtU3R5bGVz ID0galF1ZXJ5KCJzdHlsZSwgbGlua1tyZWw9c3R5bGVzaGVldF0iKS5sZW5ndGg7 CgkJCWlmICggZG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoICE9IG51bVN0eWxl cyApIHsKCQkJCXNldFRpbWVvdXQoIGFyZ3VtZW50cy5jYWxsZWUsIDAgKTsKCQkJ CXJldHVybjsKCQkJfQoJCQkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5j dGlvbnMKCQkJalF1ZXJ5LnJlYWR5KCk7CgkJfSkoKTsKCX0KCgkvLyBBIGZhbGxi YWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yawoJalF1 ZXJ5LmV2ZW50LmFkZCggd2luZG93LCAibG9hZCIsIGpRdWVyeS5yZWFkeSApOwp9 CgpqUXVlcnkuZWFjaCggKCJibHVyLGZvY3VzLGxvYWQscmVzaXplLHNjcm9sbCx1 bmxvYWQsY2xpY2ssZGJsY2xpY2ssIiArCgkibW91c2Vkb3duLG1vdXNldXAsbW91 c2Vtb3ZlLG1vdXNlb3Zlcixtb3VzZW91dCxjaGFuZ2Usc2VsZWN0LCIgKwoJInN1 Ym1pdCxrZXlkb3duLGtleXByZXNzLGtleXVwLGVycm9yIikuc3BsaXQoIiwiKSwg ZnVuY3Rpb24oaSwgbmFtZSl7CgoJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKCWpR dWVyeS5mbltuYW1lXSA9IGZ1bmN0aW9uKGZuKXsKCQlyZXR1cm4gZm4gPyB0aGlz LmJpbmQobmFtZSwgZm4pIDogdGhpcy50cmlnZ2VyKG5hbWUpOwoJfTsKfSk7Cgov LyBDaGVja3MgaWYgYW4gZXZlbnQgaGFwcGVuZWQgb24gYW4gZWxlbWVudCB3aXRo aW4gYW5vdGhlciBlbGVtZW50Ci8vIFVzZWQgaW4galF1ZXJ5LmV2ZW50LnNwZWNp YWwubW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZSBoYW5kbGVycwp2YXIgd2l0aGlu RWxlbWVudCA9IGZ1bmN0aW9uKGV2ZW50LCBlbGVtKSB7CgkvLyBDaGVjayBpZiBt b3VzZShvdmVyfG91dCkgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQg ZWxlbWVudAoJdmFyIHBhcmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CgkvLyBU cmF2ZXJzZSB1cCB0aGUgdHJlZQoJd2hpbGUgKCBwYXJlbnQgJiYgcGFyZW50ICE9 IGVsZW0gKSB0cnkgeyBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTsgfSBjYXRj aChlcnJvcikgeyBwYXJlbnQgPSBlbGVtOyB9CgkvLyBSZXR1cm4gdHJ1ZSBpZiB3 ZSBhY3R1YWxseSBqdXN0IG1vdXNlZCBvbiB0byBhIHN1Yi1lbGVtZW50CglyZXR1 cm4gcGFyZW50ID09IGVsZW07Cn07CgovLyBQcmV2ZW50IG1lbW9yeSBsZWFrcyBp biBJRQovLyBBbmQgcHJldmVudCBlcnJvcnMgb24gcmVmcmVzaCB3aXRoIGV2ZW50 cyBsaWtlIG1vdXNlb3ZlciBpbiBvdGhlciBicm93c2VycwovLyBXaW5kb3cgaXNu J3QgaW5jbHVkZWQgc28gYXMgbm90IHRvIHVuYmluZCBleGlzdGluZyB1bmxvYWQg ZXZlbnRzCmpRdWVyeSh3aW5kb3cpLmJpbmQoInVubG9hZCIsIGZ1bmN0aW9uKCkg ewoJalF1ZXJ5KCIqIikuYWRkKGRvY3VtZW50KS51bmJpbmQoKTsKfSk7CmpRdWVy eS5mbi5leHRlbmQoewoJLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkCglf bG9hZDogalF1ZXJ5LmZuLmxvYWQsCgoJbG9hZDogZnVuY3Rpb24oIHVybCwgcGFy YW1zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiB1cmwgIT0gJ3N0cmluZycg KQoJCQlyZXR1cm4gdGhpcy5fbG9hZCggdXJsICk7CgoJCXZhciBvZmYgPSB1cmwu aW5kZXhPZigiICIpOwoJCWlmICggb2ZmID49IDAgKSB7CgkJCXZhciBzZWxlY3Rv ciA9IHVybC5zbGljZShvZmYsIHVybC5sZW5ndGgpOwoJCQl1cmwgPSB1cmwuc2xp Y2UoMCwgb2ZmKTsKCQl9CgoJCWNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rp b24oKXt9OwoKCQkvLyBEZWZhdWx0IHRvIGEgR0VUIHJlcXVlc3QKCQl2YXIgdHlw ZSA9ICJHRVQiOwoKCQkvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciB3YXMgcHJv dmlkZWQKCQlpZiAoIHBhcmFtcyApCgkJCS8vIElmIGl0J3MgYSBmdW5jdGlvbgoJ CQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKCQkJCS8vIFdl IGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCgkJCQljYWxsYmFjayA9IHBh cmFtczsKCQkJCXBhcmFtcyA9IG51bGw7CgoJCQkvLyBPdGhlcndpc2UsIGJ1aWxk IGEgcGFyYW0gc3RyaW5nCgkJCX0gZWxzZSB7CgkJCQlwYXJhbXMgPSBqUXVlcnku cGFyYW0oIHBhcmFtcyApOwoJCQkJdHlwZSA9ICJQT1NUIjsKCQkJfQoKCQl2YXIg c2VsZiA9IHRoaXM7CgoJCS8vIFJlcXVlc3QgdGhlIHJlbW90ZSBkb2N1bWVudAoJ CWpRdWVyeS5hamF4KHsKCQkJdXJsOiB1cmwsCgkJCXR5cGU6IHR5cGUsCgkJCWRh dGFUeXBlOiAiaHRtbCIsCgkJCWRhdGE6IHBhcmFtcywKCQkJY29tcGxldGU6IGZ1 bmN0aW9uKHJlcywgc3RhdHVzKXsKCQkJCS8vIElmIHN1Y2Nlc3NmdWwsIGluamVj dCB0aGUgSFRNTCBpbnRvIGFsbCB0aGUgbWF0Y2hlZCBlbGVtZW50cwoJCQkJaWYg KCBzdGF0dXMgPT0gInN1Y2Nlc3MiIHx8IHN0YXR1cyA9PSAibm90bW9kaWZpZWQi ICkKCQkJCQkvLyBTZWUgaWYgYSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkCgkJCQkJ c2VsZi5odG1sKCBzZWxlY3RvciA/CgkJCQkJCS8vIENyZWF0ZSBhIGR1bW15IGRp diB0byBob2xkIHRoZSByZXN1bHRzCgkJCQkJCWpRdWVyeSgiPGRpdi8+IikKCQkJ CQkJCS8vIGluamVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGluLCBy ZW1vdmluZyB0aGUgc2NyaXB0cwoJCQkJCQkJLy8gdG8gYXZvaWQgYW55ICdQZXJt aXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFCgkJCQkJCQkuYXBwZW5kKHJlcy5y ZXNwb25zZVRleHQucmVwbGFjZSgvPHNjcmlwdCgufFxzKSo/XC9zY3JpcHQ+L2cs ICIiKSkKCgkJCQkJCQkvLyBMb2NhdGUgdGhlIHNwZWNpZmllZCBlbGVtZW50cwoJ CQkJCQkJLmZpbmQoc2VsZWN0b3IpIDoKCgkJCQkJCS8vIElmIG5vdCwganVzdCBp bmplY3QgdGhlIGZ1bGwgcmVzdWx0CgkJCQkJCXJlcy5yZXNwb25zZVRleHQgKTsK CgkJCQlzZWxmLmVhY2goIGNhbGxiYWNrLCBbcmVzLnJlc3BvbnNlVGV4dCwgc3Rh dHVzLCByZXNdICk7CgkJCX0KCQl9KTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJc2Vy aWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKHRoaXMu c2VyaWFsaXplQXJyYXkoKSk7Cgl9LAoJc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9u KCkgewoJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpewoJCQlyZXR1cm4galF1 ZXJ5Lm5vZGVOYW1lKHRoaXMsICJmb3JtIikgPwoJCQkJalF1ZXJ5Lm1ha2VBcnJh eSh0aGlzLmVsZW1lbnRzKSA6IHRoaXM7CgkJfSkKCQkuZmlsdGVyKGZ1bmN0aW9u KCl7CgkJCXJldHVybiB0aGlzLm5hbWUgJiYgIXRoaXMuZGlzYWJsZWQgJiYKCQkJ CSh0aGlzLmNoZWNrZWQgfHwgL3NlbGVjdHx0ZXh0YXJlYS9pLnRlc3QodGhpcy5u b2RlTmFtZSkgfHwKCQkJCQkvdGV4dHxoaWRkZW58cGFzc3dvcmQvaS50ZXN0KHRo aXMudHlwZSkpOwoJCX0pCgkJLm1hcChmdW5jdGlvbihpLCBlbGVtKXsKCQkJdmFy IHZhbCA9IGpRdWVyeSh0aGlzKS52YWwoKTsKCQkJcmV0dXJuIHZhbCA9PSBudWxs ID8gbnVsbCA6CgkJCQl2YWwuY29uc3RydWN0b3IgPT0gQXJyYXkgPwoJCQkJCWpR dWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24odmFsLCBpKXsKCQkJCQkJcmV0dXJuIHtu YW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWx9OwoJCQkJCX0pIDoKCQkJCQl7bmFt ZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKCQl9KS5nZXQoKTsKCX0KfSk7Cgov LyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1v biBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggImFqYXhTdGFydCxhamF4U3RvcCxh amF4Q29tcGxldGUsYWpheEVycm9yLGFqYXhTdWNjZXNzLGFqYXhTZW5kIi5zcGxp dCgiLCIpLCBmdW5jdGlvbihpLG8pewoJalF1ZXJ5LmZuW29dID0gZnVuY3Rpb24o Zil7CgkJcmV0dXJuIHRoaXMuYmluZChvLCBmKTsKCX07Cn0pOwoKdmFyIGpzYyA9 IG5vdygpOwoKalF1ZXJ5LmV4dGVuZCh7CglnZXQ6IGZ1bmN0aW9uKCB1cmwsIGRh dGEsIGNhbGxiYWNrLCB0eXBlICkgewoJCS8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBk YXRhIGFyZ3VtZW50IHdhcyBvbW1pdGVkCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlv biggZGF0YSApICkgewoJCQljYWxsYmFjayA9IGRhdGE7CgkJCWRhdGEgPSBudWxs OwoJCX0KCgkJcmV0dXJuIGpRdWVyeS5hamF4KHsKCQkJdHlwZTogIkdFVCIsCgkJ CXVybDogdXJsLAoJCQlkYXRhOiBkYXRhLAoJCQlzdWNjZXNzOiBjYWxsYmFjaywK CQkJZGF0YVR5cGU6IHR5cGUKCQl9KTsKCX0sCgoJZ2V0U2NyaXB0OiBmdW5jdGlv biggdXJsLCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIG51 bGwsIGNhbGxiYWNrLCAic2NyaXB0Iik7Cgl9LAoKCWdldEpTT046IGZ1bmN0aW9u KCB1cmwsIGRhdGEsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KHVy bCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIik7Cgl9LAoKCXBvc3Q6IGZ1bmN0aW9u KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgewoJCWlmICggalF1ZXJ5Lmlz RnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJY2FsbGJhY2sgPSBkYXRhOwoJCQlkYXRh ID0ge307CgkJfQoKCQlyZXR1cm4galF1ZXJ5LmFqYXgoewoJCQl0eXBlOiAiUE9T VCIsCgkJCXVybDogdXJsLAoJCQlkYXRhOiBkYXRhLAoJCQlzdWNjZXNzOiBjYWxs YmFjaywKCQkJZGF0YVR5cGU6IHR5cGUKCQl9KTsKCX0sCgoJYWpheFNldHVwOiBm dW5jdGlvbiggc2V0dGluZ3MgKSB7CgkJalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmFq YXhTZXR0aW5ncywgc2V0dGluZ3MgKTsKCX0sCgoJYWpheFNldHRpbmdzOiB7CgkJ dXJsOiBsb2NhdGlvbi5ocmVmLAoJCWdsb2JhbDogdHJ1ZSwKCQl0eXBlOiAiR0VU IiwKCQl0aW1lb3V0OiAwLAoJCWNvbnRlbnRUeXBlOiAiYXBwbGljYXRpb24veC13 d3ctZm9ybS11cmxlbmNvZGVkIiwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3lu YzogdHJ1ZSwKCQlkYXRhOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3 b3JkOiBudWxsLAoJCWFjY2VwdHM6IHsKCQkJeG1sOiAiYXBwbGljYXRpb24veG1s LCB0ZXh0L3htbCIsCgkJCWh0bWw6ICJ0ZXh0L2h0bWwiLAoJCQlzY3JpcHQ6ICJ0 ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQiLAoJCQlqc29u OiAiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwKCQkJdGV4dDog InRleHQvcGxhaW4iLAoJCQlfZGVmYXVsdDogIiovKiIKCQl9Cgl9LAoKCS8vIExh c3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3QKCWxhc3RN b2RpZmllZDoge30sCgoJYWpheDogZnVuY3Rpb24oIHMgKSB7CgkJLy8gRXh0ZW5k IHRoZSBzZXR0aW5ncywgYnV0IHJlLWV4dGVuZCAncycgc28gdGhhdCBpdCBjYW4g YmUKCQkvLyBjaGVja2VkIGFnYWluIGxhdGVyIChpbiB0aGUgdGVzdCBzdWl0ZSwg c3BlY2lmaWNhbGx5KQoJCXMgPSBqUXVlcnkuZXh0ZW5kKHRydWUsIHMsIGpRdWVy eS5leHRlbmQodHJ1ZSwge30sIGpRdWVyeS5hamF4U2V0dGluZ3MsIHMpKTsKCgkJ dmFyIGpzb25wLCBqc3JlID0gLz1cPygmfCQpL2csIHN0YXR1cywgZGF0YSwKCQkJ dHlwZSA9IHMudHlwZS50b1VwcGVyQ2FzZSgpOwoKCQkvLyBjb252ZXJ0IGRhdGEg aWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nl c3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT0gInN0cmluZyIgKQoJCQlzLmRhdGEg PSBqUXVlcnkucGFyYW0ocy5kYXRhKTsKCgkJLy8gSGFuZGxlIEpTT05QIFBhcmFt ZXRlciBDYWxsYmFja3MKCQlpZiAoIHMuZGF0YVR5cGUgPT0gImpzb25wIiApIHsK CQkJaWYgKCB0eXBlID09ICJHRVQiICkgewoJCQkJaWYgKCAhcy51cmwubWF0Y2go anNyZSkgKQoJCQkJCXMudXJsICs9IChzLnVybC5tYXRjaCgvXD8vKSA/ICImIiA6 ICI/IikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CgkJCX0gZWxz ZSBpZiAoICFzLmRhdGEgfHwgIXMuZGF0YS5tYXRjaChqc3JlKSApCgkJCQlzLmRh dGEgPSAocy5kYXRhID8gcy5kYXRhICsgIiYiIDogIiIpICsgKHMuanNvbnAgfHwg ImNhbGxiYWNrIikgKyAiPT8iOwoJCQlzLmRhdGFUeXBlID0gImpzb24iOwoJCX0K CgkJLy8gQnVpbGQgdGVtcG9yYXJ5IEpTT05QIGZ1bmN0aW9uCgkJaWYgKCBzLmRh dGFUeXBlID09ICJqc29uIiAmJiAocy5kYXRhICYmIHMuZGF0YS5tYXRjaChqc3Jl KSB8fCBzLnVybC5tYXRjaChqc3JlKSkgKSB7CgkJCWpzb25wID0gImpzb25wIiAr IGpzYysrOwoKCQkJLy8gUmVwbGFjZSB0aGUgPT8gc2VxdWVuY2UgYm90aCBpbiB0 aGUgcXVlcnkgc3RyaW5nIGFuZCB0aGUgZGF0YQoJCQlpZiAoIHMuZGF0YSApCgkJ CQlzLmRhdGEgPSAocy5kYXRhICsgIiIpLnJlcGxhY2UoanNyZSwgIj0iICsganNv bnAgKyAiJDEiKTsKCQkJcy51cmwgPSBzLnVybC5yZXBsYWNlKGpzcmUsICI9IiAr IGpzb25wICsgIiQxIik7CgoJCQkvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZQoJCQkv LyB0aGF0IGEgSlNPTlAgc3R5bGUgcmVzcG9uc2UgaXMgZXhlY3V0ZWQgcHJvcGVy bHkKCQkJcy5kYXRhVHlwZSA9ICJzY3JpcHQiOwoKCQkJLy8gSGFuZGxlIEpTT05Q LXN0eWxlIGxvYWRpbmcKCQkJd2luZG93WyBqc29ucCBdID0gZnVuY3Rpb24odG1w KXsKCQkJCWRhdGEgPSB0bXA7CgkJCQlzdWNjZXNzKCk7CgkJCQljb21wbGV0ZSgp OwoJCQkJLy8gR2FyYmFnZSBjb2xsZWN0CgkJCQl3aW5kb3dbIGpzb25wIF0gPSB1 bmRlZmluZWQ7CgkJCQl0cnl7IGRlbGV0ZSB3aW5kb3dbIGpzb25wIF07IH0gY2F0 Y2goZSl7fQoJCQkJaWYgKCBoZWFkICkKCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBz Y3JpcHQgKTsKCQkJfTsKCQl9CgoJCWlmICggcy5kYXRhVHlwZSA9PSAic2NyaXB0 IiAmJiBzLmNhY2hlID09IG51bGwgKQoJCQlzLmNhY2hlID0gZmFsc2U7CgoJCWlm ICggcy5jYWNoZSA9PT0gZmFsc2UgJiYgdHlwZSA9PSAiR0VUIiApIHsKCQkJdmFy IHRzID0gbm93KCk7CgkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYgaXQgaXMgdGhl cmUKCQkJdmFyIHJldCA9IHMudXJsLnJlcGxhY2UoLyhcP3wmKV89Lio/KCZ8JCkv LCAiJDFfPSIgKyB0cyArICIkMiIpOwoJCQkvLyBpZiBub3RoaW5nIHdhcyByZXBs YWNlZCwgYWRkIHRpbWVzdGFtcCB0byB0aGUgZW5kCgkJCXMudXJsID0gcmV0ICsg KChyZXQgPT0gcy51cmwpID8gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8i KSArICJfPSIgKyB0cyA6ICIiKTsKCQl9CgoJCS8vIElmIGRhdGEgaXMgYXZhaWxh YmxlLCBhcHBlbmQgZGF0YSB0byB1cmwgZm9yIGdldCByZXF1ZXN0cwoJCWlmICgg cy5kYXRhICYmIHR5cGUgPT0gIkdFVCIgKSB7CgkJCXMudXJsICs9IChzLnVybC5t YXRjaCgvXD8vKSA/ICImIiA6ICI/IikgKyBzLmRhdGE7CgoJCQkvLyBJRSBsaWtl cyB0byBzZW5kIGJvdGggZ2V0IGFuZCBwb3N0IGRhdGEsIHByZXZlbnQgdGhpcwoJ CQlzLmRhdGEgPSBudWxsOwoJCX0KCgkJLy8gV2F0Y2ggZm9yIGEgbmV3IHNldCBv ZiByZXF1ZXN0cwoJCWlmICggcy5nbG9iYWwgJiYgISBqUXVlcnkuYWN0aXZlKysg KQoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdGFydCIgKTsKCgkJLy8g TWF0Y2hlcyBhbiBhYnNvbHV0ZSBVUkwsIGFuZCBzYXZlcyB0aGUgZG9tYWluCgkJ dmFyIHJlbW90ZSA9IC9eKD86XHcrOik/XC9cLyhbXlwvPyNdKykvOwoKCQkvLyBJ ZiB3ZSdyZSByZXF1ZXN0aW5nIGEgcmVtb3RlIGRvY3VtZW50CgkJLy8gYW5kIHRy eWluZyB0byBsb2FkIEpTT04gb3IgU2NyaXB0IHdpdGggYSBHRVQKCQlpZiAoIHMu ZGF0YVR5cGUgPT0gInNjcmlwdCIgJiYgdHlwZSA9PSAiR0VUIgoJCQkJJiYgcmVt b3RlLnRlc3Qocy51cmwpICYmIHJlbW90ZS5leGVjKHMudXJsKVsxXSAhPSBsb2Nh dGlvbi5ob3N0ICl7CgkJCXZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNC eVRhZ05hbWUoImhlYWQiKVswXTsKCQkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNy ZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoJCQlzY3JpcHQuc3JjID0gcy51cmw7CgkJ CWlmIChzLnNjcmlwdENoYXJzZXQpCgkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2Ny aXB0Q2hhcnNldDsKCgkJCS8vIEhhbmRsZSBTY3JpcHQgbG9hZGluZwoJCQlpZiAo ICFqc29ucCApIHsKCQkJCXZhciBkb25lID0gZmFsc2U7CgoJCQkJLy8gQXR0YWNo IGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKCQkJCXNjcmlwdC5vbmxvYWQgPSBz Y3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXsKCQkJCQlpZiAo ICFkb25lICYmICghdGhpcy5yZWFkeVN0YXRlIHx8CgkJCQkJCQl0aGlzLnJlYWR5 U3RhdGUgPT0gImxvYWRlZCIgfHwgdGhpcy5yZWFkeVN0YXRlID09ICJjb21wbGV0 ZSIpICkgewoJCQkJCQlkb25lID0gdHJ1ZTsKCQkJCQkJc3VjY2VzcygpOwoJCQkJ CQljb21wbGV0ZSgpOwoJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsK CQkJCQl9CgkJCQl9OwoJCQl9CgoJCQloZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7 CgoJCQkvLyBXZSBoYW5kbGUgZXZlcnl0aGluZyB1c2luZyB0aGUgc2NyaXB0IGVs ZW1lbnQgaW5qZWN0aW9uCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQl2YXIg cmVxdWVzdERvbmUgPSBmYWxzZTsKCgkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9i amVjdDsgTWljcm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQoJCS8vIGltcGxlbWVu dCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3LCBzbyB3ZSB1c2UgdGhlIEFjdGl2 ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCQl2YXIgeGhyID0gd2luZG93 LkFjdGl2ZVhPYmplY3QgPyBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhN TEhUVFAiKSA6IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwoKCQkvLyBPcGVuIHRoZSBz b2NrZXQKCQkvLyBQYXNzaW5nIG51bGwgdXNlcm5hbWUsIGdlbmVyYXRlcyBhIGxv Z2luIHBvcHVwIG9uIE9wZXJhICgjMjg2NSkKCQlpZiggcy51c2VybmFtZSApCgkJ CXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBh c3N3b3JkKTsKCQllbHNlCgkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5j KTsKCgkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFp biByZXF1ZXN0cyBpbiBGaXJlZm94IDMKCQl0cnkgewoJCQkvLyBTZXQgdGhlIGNv cnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQkJaWYgKCBzLmRh dGEgKQoJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHMu Y29udGVudFR5cGUpOwoKCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBo ZWFkZXIsIGlmIGlmTW9kaWZpZWQgbW9kZS4KCQkJaWYgKCBzLmlmTW9kaWZpZWQg KQoJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIiwK CQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkW3MudXJsXSB8fCAiVGh1LCAwMSBKYW4g MTk3MCAwMDowMDowMCBHTVQiICk7CgoJCQkvLyBTZXQgaGVhZGVyIHNvIHRoZSBj YWxsZWQgc2NyaXB0IGtub3dzIHRoYXQgaXQncyBhbiBYTUxIdHRwUmVxdWVzdAoJ CQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsICJYTUxI dHRwUmVxdWVzdCIpOwoKCQkJLy8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3Ig dGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZQoJCQl4aHIuc2V0 UmVxdWVzdEhlYWRlcigiQWNjZXB0Iiwgcy5kYXRhVHlwZSAmJiBzLmFjY2VwdHNb IHMuZGF0YVR5cGUgXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSArICIs ICovKiIgOgoJCQkJcy5hY2NlcHRzLl9kZWZhdWx0ICk7CgkJfSBjYXRjaChlKXt9 CgoJCS8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcwoJCWlmICggcy5i ZWZvcmVTZW5kICYmIHMuYmVmb3JlU2VuZCh4aHIsIHMpID09PSBmYWxzZSApIHsK CQkJLy8gY2xlYW51cCBhY3RpdmUgcmVxdWVzdCBjb3VudGVyCgkJCXMuZ2xvYmFs ICYmIGpRdWVyeS5hY3RpdmUtLTsKCQkJLy8gY2xvc2Ugb3BlbmRlZCBzb2NrZXQK CQkJeGhyLmFib3J0KCk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmICggcy5n bG9iYWwgKQoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFNlbmQiLCBbeGhy LCBzXSk7CgoJCS8vIFdhaXQgZm9yIGEgcmVzcG9uc2UgdG8gY29tZSBiYWNrCgkJ dmFyIG9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKGlzVGltZW91dCl7CgkJ CS8vIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBhbmQgdGhlIGRhdGEgaXMgYXZh aWxhYmxlLCBvciB0aGUgcmVxdWVzdCB0aW1lZCBvdXQKCQkJaWYgKCAhcmVxdWVz dERvbmUgJiYgeGhyICYmICh4aHIucmVhZHlTdGF0ZSA9PSA0IHx8IGlzVGltZW91 dCA9PSAidGltZW91dCIpICkgewoJCQkJcmVxdWVzdERvbmUgPSB0cnVlOwoKCQkJ CS8vIGNsZWFyIHBvbGwgaW50ZXJ2YWwKCQkJCWlmIChpdmFsKSB7CgkJCQkJY2xl YXJJbnRlcnZhbChpdmFsKTsKCQkJCQlpdmFsID0gbnVsbDsKCQkJCX0KCgkJCQlz dGF0dXMgPSBpc1RpbWVvdXQgPT0gInRpbWVvdXQiICYmICJ0aW1lb3V0IiB8fAoJ CQkJCSFqUXVlcnkuaHR0cFN1Y2Nlc3MoIHhociApICYmICJlcnJvciIgfHwKCQkJ CQlzLmlmTW9kaWZpZWQgJiYgalF1ZXJ5Lmh0dHBOb3RNb2RpZmllZCggeGhyLCBz LnVybCApICYmICJub3Rtb2RpZmllZCIgfHwKCQkJCQkic3VjY2VzcyI7CgoJCQkJ aWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiICkgewoJCQkJCS8vIFdhdGNoIGZvciwg YW5kIGNhdGNoLCBYTUwgZG9jdW1lbnQgcGFyc2UgZXJyb3JzCgkJCQkJdHJ5IHsK CQkJCQkJLy8gcHJvY2VzcyB0aGUgZGF0YSAocnVucyB0aGUgeG1sIHRocm91Z2gg aHR0cERhdGEgcmVnYXJkbGVzcyBvZiBjYWxsYmFjaykKCQkJCQkJZGF0YSA9IGpR dWVyeS5odHRwRGF0YSggeGhyLCBzLmRhdGFUeXBlLCBzLmRhdGFGaWx0ZXIgKTsK CQkJCQl9IGNhdGNoKGUpIHsKCQkJCQkJc3RhdHVzID0gInBhcnNlcmVycm9yIjsK CQkJCQl9CgkJCQl9CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3Qg d2FzIHN1Y2Nlc3NmdWwgb3Igbm90bW9kaWZpZWQKCQkJCWlmICggc3RhdHVzID09 ICJzdWNjZXNzIiApIHsKCQkJCQkvLyBDYWNoZSBMYXN0LU1vZGlmaWVkIGhlYWRl ciwgaWYgaWZNb2RpZmllZCBtb2RlLgoJCQkJCXZhciBtb2RSZXM7CgkJCQkJdHJ5 IHsKCQkJCQkJbW9kUmVzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1v ZGlmaWVkIik7CgkJCQkJfSBjYXRjaChlKSB7fSAvLyBzd2FsbG93IGV4Y2VwdGlv biB0aHJvd24gYnkgRkYgaWYgaGVhZGVyIGlzIG5vdCBhdmFpbGFibGUKCgkJCQkJ aWYgKCBzLmlmTW9kaWZpZWQgJiYgbW9kUmVzICkKCQkJCQkJalF1ZXJ5Lmxhc3RN b2RpZmllZFtzLnVybF0gPSBtb2RSZXM7CgoJCQkJCS8vIEpTT05QIGhhbmRsZXMg aXRzIG93biBzdWNjZXNzIGNhbGxiYWNrCgkJCQkJaWYgKCAhanNvbnAgKQoJCQkJ CQlzdWNjZXNzKCk7CgkJCQl9IGVsc2UKCQkJCQlqUXVlcnkuaGFuZGxlRXJyb3Io cywgeGhyLCBzdGF0dXMpOwoKCQkJCS8vIEZpcmUgdGhlIGNvbXBsZXRlIGhhbmRs ZXJzCgkJCQljb21wbGV0ZSgpOwoKCQkJCS8vIFN0b3AgbWVtb3J5IGxlYWtzCgkJ CQlpZiAoIHMuYXN5bmMgKQoJCQkJCXhociA9IG51bGw7CgkJCX0KCQl9OwoKCQlp ZiAoIHMuYXN5bmMgKSB7CgkJCS8vIGRvbid0IGF0dGFjaCB0aGUgaGFuZGxlciB0 byB0aGUgcmVxdWVzdCwganVzdCBwb2xsIGl0IGluc3RlYWQKCQkJdmFyIGl2YWwg PSBzZXRJbnRlcnZhbChvbnJlYWR5c3RhdGVjaGFuZ2UsIDEzKTsKCgkJCS8vIFRp bWVvdXQgY2hlY2tlcgoJCQlpZiAoIHMudGltZW91dCA+IDAgKQoJCQkJc2V0VGlt ZW91dChmdW5jdGlvbigpewoJCQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcmVx dWVzdCBpcyBzdGlsbCBoYXBwZW5pbmcKCQkJCQlpZiAoIHhociApIHsKCQkJCQkJ Ly8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQkJCXhoci5hYm9ydCgpOwoKCQkJCQkJ aWYoICFyZXF1ZXN0RG9uZSApCgkJCQkJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoICJ0 aW1lb3V0IiApOwoJCQkJCX0KCQkJCX0sIHMudGltZW91dCk7CgkJfQoKCQkvLyBT ZW5kIHRoZSBkYXRhCgkJdHJ5IHsKCQkJeGhyLnNlbmQocy5kYXRhKTsKCQl9IGNh dGNoKGUpIHsKCQkJalF1ZXJ5LmhhbmRsZUVycm9yKHMsIHhociwgbnVsbCwgZSk7 CgkJfQoKCQkvLyBmaXJlZm94IDEuNSBkb2Vzbid0IGZpcmUgc3RhdGVjaGFuZ2Ug Zm9yIHN5bmMgcmVxdWVzdHMKCQlpZiAoICFzLmFzeW5jICkKCQkJb25yZWFkeXN0 YXRlY2hhbmdlKCk7CgoJCWZ1bmN0aW9uIHN1Y2Nlc3MoKXsKCQkJLy8gSWYgYSBs b2NhbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJlIGl0IGFuZCBwYXNzIGl0 IHRoZSBkYXRhCgkJCWlmICggcy5zdWNjZXNzICkKCQkJCXMuc3VjY2VzcyggZGF0 YSwgc3RhdHVzICk7CgoJCQkvLyBGaXJlIHRoZSBnbG9iYWwgY2FsbGJhY2sKCQkJ aWYgKCBzLmdsb2JhbCApCgkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhT dWNjZXNzIiwgW3hociwgc10gKTsKCQl9CgoJCWZ1bmN0aW9uIGNvbXBsZXRlKCl7 CgkJCS8vIFByb2Nlc3MgcmVzdWx0CgkJCWlmICggcy5jb21wbGV0ZSApCgkJCQlz LmNvbXBsZXRlKHhociwgc3RhdHVzKTsKCgkJCS8vIFRoZSByZXF1ZXN0IHdhcyBj b21wbGV0ZWQKCQkJaWYgKCBzLmdsb2JhbCApCgkJCQlqUXVlcnkuZXZlbnQudHJp Z2dlciggImFqYXhDb21wbGV0ZSIsIFt4aHIsIHNdICk7CgoJCQkvLyBIYW5kbGUg dGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0t alF1ZXJ5LmFjdGl2ZSApCgkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhT dG9wIiApOwoJCX0KCgkJLy8gcmV0dXJuIFhNTEh0dHBSZXF1ZXN0IHRvIGFsbG93 IGFib3J0aW5nIHRoZSByZXF1ZXN0IGV0Yy4KCQlyZXR1cm4geGhyOwoJfSwKCglo YW5kbGVFcnJvcjogZnVuY3Rpb24oIHMsIHhociwgc3RhdHVzLCBlICkgewoJCS8v IElmIGEgbG9jYWwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgZmlyZSBpdAoJCWlm ICggcy5lcnJvciApIHMuZXJyb3IoIHhociwgc3RhdHVzLCBlICk7CgoJCS8vIEZp cmUgdGhlIGdsb2JhbCBjYWxsYmFjawoJCWlmICggcy5nbG9iYWwgKQoJCQlqUXVl cnkuZXZlbnQudHJpZ2dlciggImFqYXhFcnJvciIsIFt4aHIsIHMsIGVdICk7Cgl9 LAoKCS8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUg cXVlcmllcwoJYWN0aXZlOiAwLAoKCS8vIERldGVybWluZXMgaWYgYW4gWE1MSHR0 cFJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90CglodHRwU3VjY2VzczogZnVu Y3Rpb24oIHhociApIHsKCQl0cnkgewoJCQkvLyBJRSBlcnJvciBzb21ldGltZXMg cmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNCBzbyB0cmVhdCBpdCBh cyBzdWNjZXNzLCBzZWUgIzE0NTAKCQkJcmV0dXJuICF4aHIuc3RhdHVzICYmIGxv Y2F0aW9uLnByb3RvY29sID09ICJmaWxlOiIgfHwKCQkJCSggeGhyLnN0YXR1cyA+ PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCApIHx8IHhoci5zdGF0dXMgPT0gMzA0 IHx8IHhoci5zdGF0dXMgPT0gMTIyMyB8fAoJCQkJalF1ZXJ5LmJyb3dzZXIuc2Fm YXJpICYmIHhoci5zdGF0dXMgPT0gdW5kZWZpbmVkOwoJCX0gY2F0Y2goZSl7fQoJ CXJldHVybiBmYWxzZTsKCX0sCgoJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxIdHRw UmVxdWVzdCByZXR1cm5zIE5vdE1vZGlmaWVkCglodHRwTm90TW9kaWZpZWQ6IGZ1 bmN0aW9uKCB4aHIsIHVybCApIHsKCQl0cnkgewoJCQl2YXIgeGhyUmVzID0geGhy LmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7CgoJCQkvLyBGaXJl Zm94IGFsd2F5cyByZXR1cm5zIDIwMC4gY2hlY2sgTGFzdC1Nb2RpZmllZCBkYXRl CgkJCXJldHVybiB4aHIuc3RhdHVzID09IDMwNCB8fCB4aHJSZXMgPT0galF1ZXJ5 Lmxhc3RNb2RpZmllZFt1cmxdIHx8CgkJCQlqUXVlcnkuYnJvd3Nlci5zYWZhcmkg JiYgeGhyLnN0YXR1cyA9PSB1bmRlZmluZWQ7CgkJfSBjYXRjaChlKXt9CgkJcmV0 dXJuIGZhbHNlOwoJfSwKCglodHRwRGF0YTogZnVuY3Rpb24oIHhociwgdHlwZSwg ZmlsdGVyICkgewoJCXZhciBjdCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcigiY29u dGVudC10eXBlIiksCgkJCXhtbCA9IHR5cGUgPT0gInhtbCIgfHwgIXR5cGUgJiYg Y3QgJiYgY3QuaW5kZXhPZigieG1sIikgPj0gMCwKCQkJZGF0YSA9IHhtbCA/IHho ci5yZXNwb25zZVhNTCA6IHhoci5yZXNwb25zZVRleHQ7CgoJCWlmICggeG1sICYm IGRhdGEuZG9jdW1lbnRFbGVtZW50LnRhZ05hbWUgPT0gInBhcnNlcmVycm9yIiAp CgkJCXRocm93ICJwYXJzZXJlcnJvciI7CgkJCQoJCS8vIEFsbG93IGEgcHJlLWZp bHRlcmluZyBmdW5jdGlvbiB0byBzYW5pdGl6ZSB0aGUgcmVzcG9uc2UKCQlpZigg ZmlsdGVyICkKCQkJZGF0YSA9IGZpbHRlciggZGF0YSwgdHlwZSApOwoKCQkvLyBJ ZiB0aGUgdHlwZSBpcyAic2NyaXB0IiwgZXZhbCBpdCBpbiBnbG9iYWwgY29udGV4 dAoJCWlmICggdHlwZSA9PSAic2NyaXB0IiApCgkJCWpRdWVyeS5nbG9iYWxFdmFs KCBkYXRhICk7CgoJCS8vIEdldCB0aGUgSmF2YVNjcmlwdCBvYmplY3QsIGlmIEpT T04gaXMgdXNlZC4KCQlpZiAoIHR5cGUgPT0gImpzb24iICkKCQkJZGF0YSA9IGV2 YWwoIigiICsgZGF0YSArICIpIik7CgoJCXJldHVybiBkYXRhOwoJfSwKCgkvLyBT ZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZgoJ Ly8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nCglwYXJhbTogZnVuY3Rp b24oIGEgKSB7CgkJdmFyIHMgPSBbXTsKCgkJLy8gSWYgYW4gYXJyYXkgd2FzIHBh c3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkKCQkvLyBvZiBmb3Jt IGVsZW1lbnRzCgkJaWYgKCBhLmNvbnN0cnVjdG9yID09IEFycmF5IHx8IGEuanF1 ZXJ5ICkKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVy eS5lYWNoKCBhLCBmdW5jdGlvbigpewoJCQkJcy5wdXNoKCBlbmNvZGVVUklDb21w b25lbnQodGhpcy5uYW1lKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdGhp cy52YWx1ZSApICk7CgkJCX0pOwoKCQkvLyBPdGhlcndpc2UsIGFzc3VtZSB0aGF0 IGl0J3MgYW4gb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycwoJCWVsc2UKCQkJLy8g U2VyaWFsaXplIHRoZSBrZXkvdmFsdWVzCgkJCWZvciAoIHZhciBqIGluIGEgKQoJ CQkJLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5IHRoZW4gdGhlIGtleSBuYW1l cyBuZWVkIHRvIGJlIHJlcGVhdGVkCgkJCQlpZiAoIGFbal0gJiYgYVtqXS5jb25z dHJ1Y3RvciA9PSBBcnJheSApCgkJCQkJalF1ZXJ5LmVhY2goIGFbal0sIGZ1bmN0 aW9uKCl7CgkJCQkJCXMucHVzaCggZW5jb2RlVVJJQ29tcG9uZW50KGopICsgIj0i ICsgZW5jb2RlVVJJQ29tcG9uZW50KCB0aGlzICkgKTsKCQkJCQl9KTsKCQkJCWVs c2UKCQkJCQlzLnB1c2goIGVuY29kZVVSSUNvbXBvbmVudChqKSArICI9IiArIGVu Y29kZVVSSUNvbXBvbmVudCggalF1ZXJ5LmlzRnVuY3Rpb24oYVtqXSkgPyBhW2pd KCkgOiBhW2pdICkgKTsKCgkJLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFs aXphdGlvbgoJCXJldHVybiBzLmpvaW4oIiYiKS5yZXBsYWNlKC8lMjAvZywgIisi KTsKCX0KCn0pOwpqUXVlcnkuZm4uZXh0ZW5kKHsKCXNob3c6IGZ1bmN0aW9uKHNw ZWVkLGNhbGxiYWNrKXsKCQlyZXR1cm4gc3BlZWQgPwoJCQl0aGlzLmFuaW1hdGUo ewoJCQkJaGVpZ2h0OiAic2hvdyIsIHdpZHRoOiAic2hvdyIsIG9wYWNpdHk6ICJz aG93IgoJCQl9LCBzcGVlZCwgY2FsbGJhY2spIDoKCgkJCXRoaXMuZmlsdGVyKCI6 aGlkZGVuIikuZWFjaChmdW5jdGlvbigpewoJCQkJdGhpcy5zdHlsZS5kaXNwbGF5 ID0gdGhpcy5vbGRibG9jayB8fCAiIjsKCQkJCWlmICggalF1ZXJ5LmNzcyh0aGlz LCJkaXNwbGF5IikgPT0gIm5vbmUiICkgewoJCQkJCXZhciBlbGVtID0galF1ZXJ5 KCI8IiArIHRoaXMudGFnTmFtZSArICIgLz4iKS5hcHBlbmRUbygiYm9keSIpOwoJ CQkJCXRoaXMuc3R5bGUuZGlzcGxheSA9IGVsZW0uY3NzKCJkaXNwbGF5Iik7CgkJ CQkJLy8gaGFuZGxlIGFuIGVkZ2UgY29uZGl0aW9uIHdoZXJlIGNzcyBpcyAtIGRp diB7IGRpc3BsYXk6bm9uZTsgfSBvciBzaW1pbGFyCgkJCQkJaWYgKHRoaXMuc3R5 bGUuZGlzcGxheSA9PSAibm9uZSIpCgkJCQkJCXRoaXMuc3R5bGUuZGlzcGxheSA9 ICJibG9jayI7CgkJCQkJZWxlbS5yZW1vdmUoKTsKCQkJCX0KCQkJfSkuZW5kKCk7 Cgl9LAoKCWhpZGU6IGZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXsKCQlyZXR1cm4g c3BlZWQgPwoJCQl0aGlzLmFuaW1hdGUoewoJCQkJaGVpZ2h0OiAiaGlkZSIsIHdp ZHRoOiAiaGlkZSIsIG9wYWNpdHk6ICJoaWRlIgoJCQl9LCBzcGVlZCwgY2FsbGJh Y2spIDoKCgkJCXRoaXMuZmlsdGVyKCI6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24o KXsKCQkJCXRoaXMub2xkYmxvY2sgPSB0aGlzLm9sZGJsb2NrIHx8IGpRdWVyeS5j c3ModGhpcywiZGlzcGxheSIpOwoJCQkJdGhpcy5zdHlsZS5kaXNwbGF5ID0gIm5v bmUiOwoJCQl9KS5lbmQoKTsKCX0sCgoJLy8gU2F2ZSB0aGUgb2xkIHRvZ2dsZSBm dW5jdGlvbgoJX3RvZ2dsZTogalF1ZXJ5LmZuLnRvZ2dsZSwKCgl0b2dnbGU6IGZ1 bmN0aW9uKCBmbiwgZm4yICl7CgkJcmV0dXJuIGpRdWVyeS5pc0Z1bmN0aW9uKGZu KSAmJiBqUXVlcnkuaXNGdW5jdGlvbihmbjIpID8KCQkJdGhpcy5fdG9nZ2xlLmFw cGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6CgkJCWZuID8KCQkJCXRoaXMuYW5pbWF0 ZSh7CgkJCQkJaGVpZ2h0OiAidG9nZ2xlIiwgd2lkdGg6ICJ0b2dnbGUiLCBvcGFj aXR5OiAidG9nZ2xlIgoJCQkJfSwgZm4sIGZuMikgOgoJCQkJdGhpcy5lYWNoKGZ1 bmN0aW9uKCl7CgkJCQkJalF1ZXJ5KHRoaXMpWyBqUXVlcnkodGhpcykuaXMoIjpo aWRkZW4iKSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCQl9KTsKCX0sCgoJc2xp ZGVEb3duOiBmdW5jdGlvbihzcGVlZCxjYWxsYmFjayl7CgkJcmV0dXJuIHRoaXMu YW5pbWF0ZSh7aGVpZ2h0OiAic2hvdyJ9LCBzcGVlZCwgY2FsbGJhY2spOwoJfSwK CglzbGlkZVVwOiBmdW5jdGlvbihzcGVlZCxjYWxsYmFjayl7CgkJcmV0dXJuIHRo aXMuYW5pbWF0ZSh7aGVpZ2h0OiAiaGlkZSJ9LCBzcGVlZCwgY2FsbGJhY2spOwoJ fSwKCglzbGlkZVRvZ2dsZTogZnVuY3Rpb24oc3BlZWQsIGNhbGxiYWNrKXsKCQly ZXR1cm4gdGhpcy5hbmltYXRlKHtoZWlnaHQ6ICJ0b2dnbGUifSwgc3BlZWQsIGNh bGxiYWNrKTsKCX0sCgoJZmFkZUluOiBmdW5jdGlvbihzcGVlZCwgY2FsbGJhY2sp ewoJCXJldHVybiB0aGlzLmFuaW1hdGUoe29wYWNpdHk6ICJzaG93In0sIHNwZWVk LCBjYWxsYmFjayk7Cgl9LAoKCWZhZGVPdXQ6IGZ1bmN0aW9uKHNwZWVkLCBjYWxs YmFjayl7CgkJcmV0dXJuIHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTogImhpZGUifSwg c3BlZWQsIGNhbGxiYWNrKTsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbihzcGVlZCx0 byxjYWxsYmFjayl7CgkJcmV0dXJuIHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTogdG99 LCBzcGVlZCwgY2FsbGJhY2spOwoJfSwKCglhbmltYXRlOiBmdW5jdGlvbiggcHJv cCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIG9wdGFsbCA9IGpR dWVyeS5zcGVlZChzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CgoJCXJldHVybiB0 aGlzWyBvcHRhbGwucXVldWUgPT09IGZhbHNlID8gImVhY2giIDogInF1ZXVlIiBd KGZ1bmN0aW9uKCl7CgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPSAxKQoJCQkJcmV0 dXJuIGZhbHNlOwoKCQkJdmFyIG9wdCA9IGpRdWVyeS5leHRlbmQoe30sIG9wdGFs bCksIHAsCgkJCQloaWRkZW4gPSBqUXVlcnkodGhpcykuaXMoIjpoaWRkZW4iKSwg c2VsZiA9IHRoaXM7CgoJCQlmb3IgKCBwIGluIHByb3AgKSB7CgkJCQlpZiAoIHBy b3BbcF0gPT0gImhpZGUiICYmIGhpZGRlbiB8fCBwcm9wW3BdID09ICJzaG93IiAm JiAhaGlkZGVuICkKCQkJCQlyZXR1cm4gb3B0LmNvbXBsZXRlLmNhbGwodGhpcyk7 CgoJCQkJaWYgKCBwID09ICJoZWlnaHQiIHx8IHAgPT0gIndpZHRoIiApIHsKCQkJ CQkvLyBTdG9yZSBkaXNwbGF5IHByb3BlcnR5CgkJCQkJb3B0LmRpc3BsYXkgPSBq UXVlcnkuY3NzKHRoaXMsICJkaXNwbGF5Iik7CgoJCQkJCS8vIE1ha2Ugc3VyZSB0 aGF0IG5vdGhpbmcgc25lYWtzIG91dAoJCQkJCW9wdC5vdmVyZmxvdyA9IHRoaXMu c3R5bGUub3ZlcmZsb3c7CgkJCQl9CgkJCX0KCgkJCWlmICggb3B0Lm92ZXJmbG93 ICE9IG51bGwgKQoJCQkJdGhpcy5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwoK CQkJb3B0LmN1ckFuaW0gPSBqUXVlcnkuZXh0ZW5kKHt9LCBwcm9wKTsKCgkJCWpR dWVyeS5lYWNoKCBwcm9wLCBmdW5jdGlvbihuYW1lLCB2YWwpewoJCQkJdmFyIGUg PSBuZXcgalF1ZXJ5LmZ4KCBzZWxmLCBvcHQsIG5hbWUgKTsKCgkJCQlpZiAoIC90 b2dnbGV8c2hvd3xoaWRlLy50ZXN0KHZhbCkgKQoJCQkJCWVbIHZhbCA9PSAidG9n Z2xlIiA/IGhpZGRlbiA/ICJzaG93IiA6ICJoaWRlIiA6IHZhbCBdKCBwcm9wICk7 CgkJCQllbHNlIHsKCQkJCQl2YXIgcGFydHMgPSB2YWwudG9TdHJpbmcoKS5tYXRj aCgvXihbKy1dPSk/KFtcZCstLl0rKSguKikkLyksCgkJCQkJCXN0YXJ0ID0gZS5j dXIodHJ1ZSkgfHwgMDsKCgkJCQkJaWYgKCBwYXJ0cyApIHsKCQkJCQkJdmFyIGVu ZCA9IHBhcnNlRmxvYXQocGFydHNbMl0pLAoJCQkJCQkJdW5pdCA9IHBhcnRzWzNd IHx8ICJweCI7CgoJCQkJCQkvLyBXZSBuZWVkIHRvIGNvbXB1dGUgc3RhcnRpbmcg dmFsdWUKCQkJCQkJaWYgKCB1bml0ICE9ICJweCIgKSB7CgkJCQkJCQlzZWxmLnN0 eWxlWyBuYW1lIF0gPSAoZW5kIHx8IDEpICsgdW5pdDsKCQkJCQkJCXN0YXJ0ID0g KChlbmQgfHwgMSkgLyBlLmN1cih0cnVlKSkgKiBzdGFydDsKCQkJCQkJCXNlbGYu c3R5bGVbIG5hbWUgXSA9IHN0YXJ0ICsgdW5pdDsKCQkJCQkJfQoKCQkJCQkJLy8g SWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVs YXRpdmUgYW5pbWF0aW9uCgkJCQkJCWlmICggcGFydHNbMV0gKQoJCQkJCQkJZW5k ID0gKChwYXJ0c1sxXSA9PSAiLT0iID8gLTEgOiAxKSAqIGVuZCkgKyBzdGFydDsK CgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgZW5kLCB1bml0ICk7CgkJCQkJfSBlbHNl CgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgdmFsLCAiIiApOwoJCQkJfQoJCQl9KTsK CgkJCS8vIEZvciBKUyBzdHJpY3QgY29tcGxpYW5jZQoJCQlyZXR1cm4gdHJ1ZTsK CQl9KTsKCX0sCgoJcXVldWU6IGZ1bmN0aW9uKHR5cGUsIGZuKXsKCQlpZiAoIGpR dWVyeS5pc0Z1bmN0aW9uKHR5cGUpIHx8ICggdHlwZSAmJiB0eXBlLmNvbnN0cnVj dG9yID09IEFycmF5ICkpIHsKCQkJZm4gPSB0eXBlOwoJCQl0eXBlID0gImZ4IjsK CQl9CgoJCWlmICggIXR5cGUgfHwgKHR5cGVvZiB0eXBlID09ICJzdHJpbmciICYm ICFmbikgKQoJCQlyZXR1cm4gcXVldWUoIHRoaXNbMF0sIHR5cGUgKTsKCgkJcmV0 dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlpZiAoIGZuLmNvbnN0cnVjdG9y ID09IEFycmF5ICkKCQkJCXF1ZXVlKHRoaXMsIHR5cGUsIGZuKTsKCQkJZWxzZSB7 CgkJCQlxdWV1ZSh0aGlzLCB0eXBlKS5wdXNoKCBmbiApOwoKCQkJCWlmICggcXVl dWUodGhpcywgdHlwZSkubGVuZ3RoID09IDEgKQoJCQkJCWZuLmNhbGwodGhpcyk7 CgkJCX0KCQl9KTsKCX0sCgoJc3RvcDogZnVuY3Rpb24oY2xlYXJRdWV1ZSwgZ290 b0VuZCl7CgkJdmFyIHRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJCWlmIChjbGVh clF1ZXVlKQoJCQl0aGlzLnF1ZXVlKFtdKTsKCgkJdGhpcy5lYWNoKGZ1bmN0aW9u KCl7CgkJCS8vIGdvIGluIHJldmVyc2Ugb3JkZXIgc28gYW55dGhpbmcgYWRkZWQg dG8gdGhlIHF1ZXVlIGR1cmluZyB0aGUgbG9vcCBpcyBpZ25vcmVkCgkJCWZvciAo IHZhciBpID0gdGltZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tICkKCQkJCWlm ICggdGltZXJzW2ldLmVsZW0gPT0gdGhpcyApIHsKCQkJCQlpZiAoZ290b0VuZCkK CQkJCQkJLy8gZm9yY2UgdGhlIG5leHQgc3RlcCB0byBiZSB0aGUgbGFzdAoJCQkJ CQl0aW1lcnNbaV0odHJ1ZSk7CgkJCQkJdGltZXJzLnNwbGljZShpLCAxKTsKCQkJ CX0KCQl9KTsKCgkJLy8gc3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRo ZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZAoJCWlmICghZ290b0VuZCkKCQkJdGhp cy5kZXF1ZXVlKCk7CgoJCXJldHVybiB0aGlzOwoJfQoKfSk7Cgp2YXIgcXVldWUg PSBmdW5jdGlvbiggZWxlbSwgdHlwZSwgYXJyYXkgKSB7CglpZiAoIGVsZW0gKXsK CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJdmFyIHEgPSBqUXVlcnkuZGF0YSgg ZWxlbSwgdHlwZSArICJxdWV1ZSIgKTsKCgkJaWYgKCAhcSB8fCBhcnJheSApCgkJ CXEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSArICJxdWV1ZSIsIGpRdWVyeS5t YWtlQXJyYXkoYXJyYXkpICk7CgoJfQoJcmV0dXJuIHE7Cn07CgpqUXVlcnkuZm4u ZGVxdWV1ZSA9IGZ1bmN0aW9uKHR5cGUpewoJdHlwZSA9IHR5cGUgfHwgImZ4IjsK CglyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJdmFyIHEgPSBxdWV1ZSh0 aGlzLCB0eXBlKTsKCgkJcS5zaGlmdCgpOwoKCQlpZiAoIHEubGVuZ3RoICkKCQkJ cVswXS5jYWxsKCB0aGlzICk7Cgl9KTsKfTsKCmpRdWVyeS5leHRlbmQoewoKCXNw ZWVkOiBmdW5jdGlvbihzcGVlZCwgZWFzaW5nLCBmbikgewoJCXZhciBvcHQgPSBz cGVlZCAmJiBzcGVlZC5jb25zdHJ1Y3RvciA9PSBPYmplY3QgPyBzcGVlZCA6IHsK CQkJY29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHwKCQkJCWpRdWVyeS5p c0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLAoJCQlkdXJhdGlvbjogc3BlZWQs CgkJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiBlYXNpbmcuY29u c3RydWN0b3IgIT0gRnVuY3Rpb24gJiYgZWFzaW5nCgkJfTsKCgkJb3B0LmR1cmF0 aW9uID0gKG9wdC5kdXJhdGlvbiAmJiBvcHQuZHVyYXRpb24uY29uc3RydWN0b3Ig PT0gTnVtYmVyID8KCQkJb3B0LmR1cmF0aW9uIDoKCQkJalF1ZXJ5LmZ4LnNwZWVk c1tvcHQuZHVyYXRpb25dKSB8fCBqUXVlcnkuZnguc3BlZWRzLmRlZjsKCgkJLy8g UXVldWVpbmcKCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoJCW9wdC5jb21wbGV0 ZSA9IGZ1bmN0aW9uKCl7CgkJCWlmICggb3B0LnF1ZXVlICE9PSBmYWxzZSApCgkJ CQlqUXVlcnkodGhpcykuZGVxdWV1ZSgpOwoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0 aW9uKCBvcHQub2xkICkgKQoJCQkJb3B0Lm9sZC5jYWxsKCB0aGlzICk7CgkJfTsK CgkJcmV0dXJuIG9wdDsKCX0sCgoJZWFzaW5nOiB7CgkJbGluZWFyOiBmdW5jdGlv biggcCwgbiwgZmlyc3ROdW0sIGRpZmYgKSB7CgkJCXJldHVybiBmaXJzdE51bSAr IGRpZmYgKiBwOwoJCX0sCgkJc3dpbmc6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51 bSwgZGlmZiApIHsKCQkJcmV0dXJuICgoLU1hdGguY29zKHAqTWF0aC5QSSkvMikg KyAwLjUpICogZGlmZiArIGZpcnN0TnVtOwoJCX0KCX0sCgoJdGltZXJzOiBbXSwK CXRpbWVySWQ6IG51bGwsCgoJZng6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBw cm9wICl7CgkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCQl0aGlzLmVsZW0gPSBl bGVtOwoJCXRoaXMucHJvcCA9IHByb3A7CgoJCWlmICggIW9wdGlvbnMub3JpZyAp CgkJCW9wdGlvbnMub3JpZyA9IHt9OwoJfQoKfSk7CgpqUXVlcnkuZngucHJvdG90 eXBlID0gewoKCS8vIFNpbXBsZSBmdW5jdGlvbiBmb3Igc2V0dGluZyBhIHN0eWxl IHZhbHVlCgl1cGRhdGU6IGZ1bmN0aW9uKCl7CgkJaWYgKCB0aGlzLm9wdGlvbnMu c3RlcCApCgkJCXRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhp cy5ub3csIHRoaXMgKTsKCgkJKGpRdWVyeS5meC5zdGVwW3RoaXMucHJvcF0gfHwg alF1ZXJ5LmZ4LnN0ZXAuX2RlZmF1bHQpKCB0aGlzICk7CgoJCS8vIFNldCBkaXNw bGF5IHByb3BlcnR5IHRvIGJsb2NrIGZvciBoZWlnaHQvd2lkdGggYW5pbWF0aW9u cwoJCWlmICggdGhpcy5wcm9wID09ICJoZWlnaHQiIHx8IHRoaXMucHJvcCA9PSAi d2lkdGgiICkKCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoJ fSwKCgkvLyBHZXQgdGhlIGN1cnJlbnQgc2l6ZQoJY3VyOiBmdW5jdGlvbihmb3Jj ZSl7CgkJaWYgKCB0aGlzLmVsZW1bdGhpcy5wcm9wXSAhPSBudWxsICYmIHRoaXMu ZWxlbS5zdHlsZVt0aGlzLnByb3BdID09IG51bGwgKQoJCQlyZXR1cm4gdGhpcy5l bGVtWyB0aGlzLnByb3AgXTsKCgkJdmFyIHIgPSBwYXJzZUZsb2F0KGpRdWVyeS5j c3ModGhpcy5lbGVtLCB0aGlzLnByb3AsIGZvcmNlKSk7CgkJcmV0dXJuIHIgJiYg ciA+IC0xMDAwMCA/IHIgOiBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1ModGhpcy5l bGVtLCB0aGlzLnByb3ApKSB8fCAwOwoJfSwKCgkvLyBTdGFydCBhbiBhbmltYXRp b24gZnJvbSBvbmUgbnVtYmVyIHRvIGFub3RoZXIKCWN1c3RvbTogZnVuY3Rpb24o ZnJvbSwgdG8sIHVuaXQpewoJCXRoaXMuc3RhcnRUaW1lID0gbm93KCk7CgkJdGhp cy5zdGFydCA9IGZyb207CgkJdGhpcy5lbmQgPSB0bzsKCQl0aGlzLnVuaXQgPSB1 bml0IHx8IHRoaXMudW5pdCB8fCAicHgiOwoJCXRoaXMubm93ID0gdGhpcy5zdGFy dDsKCQl0aGlzLnBvcyA9IHRoaXMuc3RhdGUgPSAwOwoJCXRoaXMudXBkYXRlKCk7 CgoJCXZhciBzZWxmID0gdGhpczsKCQlmdW5jdGlvbiB0KGdvdG9FbmQpewoJCQly ZXR1cm4gc2VsZi5zdGVwKGdvdG9FbmQpOwoJCX0KCgkJdC5lbGVtID0gdGhpcy5l bGVtOwoKCQlqUXVlcnkudGltZXJzLnB1c2godCk7CgoJCWlmICggalF1ZXJ5LnRp bWVySWQgPT0gbnVsbCApIHsKCQkJalF1ZXJ5LnRpbWVySWQgPSBzZXRJbnRlcnZh bChmdW5jdGlvbigpewoJCQkJdmFyIHRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJ CQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkKCQkJ CQlpZiAoICF0aW1lcnNbaV0oKSApCgkJCQkJCXRpbWVycy5zcGxpY2UoaS0tLCAx KTsKCgkJCQlpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCQkJCWNsZWFySW50ZXJ2 YWwoIGpRdWVyeS50aW1lcklkICk7CgkJCQkJalF1ZXJ5LnRpbWVySWQgPSBudWxs OwoJCQkJfQoJCQl9LCAxMyk7CgkJfQoJfSwKCgkvLyBTaW1wbGUgJ3Nob3cnIGZ1 bmN0aW9uCglzaG93OiBmdW5jdGlvbigpewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdl IHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0 aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LmF0dHIoIHRoaXMu ZWxlbS5zdHlsZSwgdGhpcy5wcm9wICk7CgkJdGhpcy5vcHRpb25zLnNob3cgPSB0 cnVlOwoKCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCgkJdGhpcy5jdXN0b20oMCwg dGhpcy5jdXIoKSk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlIHN0YXJ0IGF0IGEg c21hbGwgd2lkdGgvaGVpZ2h0IHRvIGF2b2lkIGFueQoJCS8vIGZsYXNoIG9mIGNv bnRlbnQKCQlpZiAoIHRoaXMucHJvcCA9PSAid2lkdGgiIHx8IHRoaXMucHJvcCA9 PSAiaGVpZ2h0IiApCgkJCXRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdID0gIjFw eCI7CgoJCS8vIFN0YXJ0IGJ5IHNob3dpbmcgdGhlIGVsZW1lbnQKCQlqUXVlcnko dGhpcy5lbGVtKS5zaG93KCk7Cgl9LAoKCS8vIFNpbXBsZSAnaGlkZScgZnVuY3Rp b24KCWhpZGU6IGZ1bmN0aW9uKCl7CgkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3Rh cnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgoJCXRoaXMu b3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuYXR0ciggdGhpcy5lbGVt LnN0eWxlLCB0aGlzLnByb3AgKTsKCQl0aGlzLm9wdGlvbnMuaGlkZSA9IHRydWU7 CgoJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KCQl0aGlzLmN1c3RvbSh0aGlzLmN1 cigpLCAwKTsKCX0sCgoJLy8gRWFjaCBzdGVwIG9mIGFuIGFuaW1hdGlvbgoJc3Rl cDogZnVuY3Rpb24oZ290b0VuZCl7CgkJdmFyIHQgPSBub3coKTsKCgkJaWYgKCBn b3RvRW5kIHx8IHQgPiB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyB0aGlzLnN0YXJ0 VGltZSApIHsKCQkJdGhpcy5ub3cgPSB0aGlzLmVuZDsKCQkJdGhpcy5wb3MgPSB0 aGlzLnN0YXRlID0gMTsKCQkJdGhpcy51cGRhdGUoKTsKCgkJCXRoaXMub3B0aW9u cy5jdXJBbmltWyB0aGlzLnByb3AgXSA9IHRydWU7CgoJCQl2YXIgZG9uZSA9IHRy dWU7CgkJCWZvciAoIHZhciBpIGluIHRoaXMub3B0aW9ucy5jdXJBbmltICkKCQkJ CWlmICggdGhpcy5vcHRpb25zLmN1ckFuaW1baV0gIT09IHRydWUgKQoJCQkJCWRv bmUgPSBmYWxzZTsKCgkJCWlmICggZG9uZSApIHsKCQkJCWlmICggdGhpcy5vcHRp b25zLmRpc3BsYXkgIT0gbnVsbCApIHsKCQkJCQkvLyBSZXNldCB0aGUgb3ZlcmZs b3cKCQkJCQl0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3cgPSB0aGlzLm9wdGlvbnMu b3ZlcmZsb3c7CgoJCQkJCS8vIFJlc2V0IHRoZSBkaXNwbGF5CgkJCQkJdGhpcy5l bGVtLnN0eWxlLmRpc3BsYXkgPSB0aGlzLm9wdGlvbnMuZGlzcGxheTsKCQkJCQlp ZiAoIGpRdWVyeS5jc3ModGhpcy5lbGVtLCAiZGlzcGxheSIpID09ICJub25lIiAp CgkJCQkJCXRoaXMuZWxlbS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCQkJCX0K CgkJCQkvLyBIaWRlIHRoZSBlbGVtZW50IGlmIHRoZSAiaGlkZSIgb3BlcmF0aW9u IHdhcyBkb25lCgkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlICkKCQkJCQl0aGlz LmVsZW0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCgkJCQkvLyBSZXNldCB0aGUg cHJvcGVydGllcywgaWYgdGhlIGl0ZW0gaGFzIGJlZW4gaGlkZGVuIG9yIHNob3du CgkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlIHx8IHRoaXMub3B0aW9ucy5zaG93 ICkKCQkJCQlmb3IgKCB2YXIgcCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSApCgkJ CQkJCWpRdWVyeS5hdHRyKHRoaXMuZWxlbS5zdHlsZSwgcCwgdGhpcy5vcHRpb25z Lm9yaWdbcF0pOwoJCQl9CgoJCQlpZiAoIGRvbmUgKQoJCQkJLy8gRXhlY3V0ZSB0 aGUgY29tcGxldGUgZnVuY3Rpb24KCQkJCXRoaXMub3B0aW9ucy5jb21wbGV0ZS5j YWxsKCB0aGlzLmVsZW0gKTsKCgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2UgewoJ CQl2YXIgbiA9IHQgLSB0aGlzLnN0YXJ0VGltZTsKCQkJdGhpcy5zdGF0ZSA9IG4g LyB0aGlzLm9wdGlvbnMuZHVyYXRpb247CgoJCQkvLyBQZXJmb3JtIHRoZSBlYXNp bmcgZnVuY3Rpb24sIGRlZmF1bHRzIHRvIHN3aW5nCgkJCXRoaXMucG9zID0galF1 ZXJ5LmVhc2luZ1t0aGlzLm9wdGlvbnMuZWFzaW5nIHx8IChqUXVlcnkuZWFzaW5n LnN3aW5nID8gInN3aW5nIiA6ICJsaW5lYXIiKV0odGhpcy5zdGF0ZSwgbiwgMCwg MSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uKTsKCQkJdGhpcy5ub3cgPSB0aGlzLnN0 YXJ0ICsgKCh0aGlzLmVuZCAtIHRoaXMuc3RhcnQpICogdGhpcy5wb3MpOwoKCQkJ Ly8gUGVyZm9ybSB0aGUgbmV4dCBzdGVwIG9mIHRoZSBhbmltYXRpb24KCQkJdGhp cy51cGRhdGUoKTsKCQl9CgoJCXJldHVybiB0cnVlOwoJfQoKfTsKCmpRdWVyeS5l eHRlbmQoIGpRdWVyeS5meCwgewoJc3BlZWRzOnsKCQlzbG93OiA2MDAsCiAJCWZh c3Q6IDIwMCwKIAkJLy8gRGVmYXVsdCBzcGVlZAogCQlkZWY6IDQwMAoJfSwKCXN0 ZXA6IHsKCQlzY3JvbGxMZWZ0OiBmdW5jdGlvbihmeCl7CgkJCWZ4LmVsZW0uc2Ny b2xsTGVmdCA9IGZ4Lm5vdzsKCQl9LAoKCQlzY3JvbGxUb3A6IGZ1bmN0aW9uKGZ4 KXsKCQkJZnguZWxlbS5zY3JvbGxUb3AgPSBmeC5ub3c7CgkJfSwKCgkJb3BhY2l0 eTogZnVuY3Rpb24oZngpewoJCQlqUXVlcnkuYXR0cihmeC5lbGVtLnN0eWxlLCAi b3BhY2l0eSIsIGZ4Lm5vdyk7CgkJfSwKCgkJX2RlZmF1bHQ6IGZ1bmN0aW9uKGZ4 KXsKCQkJZnguZWxlbS5zdHlsZVsgZngucHJvcCBdID0gZngubm93ICsgZngudW5p dDsKCQl9Cgl9Cn0pOwovLyBUaGUgT2Zmc2V0IE1ldGhvZAovLyBPcmlnaW5hbGx5 IEJ5IEJyYW5kb24gQWFyb24sIHBhcnQgb2YgdGhlIERpbWVuc2lvbiBQbHVnaW4K Ly8gaHR0cDovL2pxdWVyeS5jb20vcGx1Z2lucy9wcm9qZWN0L2RpbWVuc2lvbnMK alF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCkgewoJdmFyIGxlZnQgPSAwLCB0 b3AgPSAwLCBlbGVtID0gdGhpc1swXSwgcmVzdWx0czsKCglpZiAoIGVsZW0gKSB3 aXRoICggalF1ZXJ5LmJyb3dzZXIgKSB7CgkJdmFyIHBhcmVudCAgICAgICA9IGVs ZW0ucGFyZW50Tm9kZSwKCQkgICAgb2Zmc2V0Q2hpbGQgID0gZWxlbSwKCQkgICAg b2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQsCgkJICAgIGRvYyAgICAg ICAgICA9IGVsZW0ub3duZXJEb2N1bWVudCwKCQkgICAgc2FmYXJpMiAgICAgID0g c2FmYXJpICYmIHBhcnNlSW50KHZlcnNpb24pIDwgNTIyICYmICEvYWRvYmVhaXIv aS50ZXN0KHVzZXJBZ2VudCksCgkJICAgIGNzcyAgICAgICAgICA9IGpRdWVyeS5j dXJDU1MsCgkJICAgIGZpeGVkICAgICAgICA9IGNzcyhlbGVtLCAicG9zaXRpb24i KSA9PSAiZml4ZWQiOwoKCQkvLyBVc2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlm IGF2YWlsYWJsZQoJCWlmICggZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgKSB7 CgkJCXZhciBib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoKCQkJ Ly8gQWRkIHRoZSBkb2N1bWVudCBzY3JvbGwgb2Zmc2V0cwoJCQlhZGQoYm94Lmxl ZnQgKyBNYXRoLm1heChkb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsIGRv Yy5ib2R5LnNjcm9sbExlZnQpLAoJCQkJYm94LnRvcCAgKyBNYXRoLm1heChkb2Mu ZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwgIGRvYy5ib2R5LnNjcm9sbFRvcCkp OwoKCQkJLy8gSUUgYWRkcyB0aGUgSFRNTCBlbGVtZW50J3MgYm9yZGVyLCBieSBk ZWZhdWx0IGl0IGlzIG1lZGl1bSB3aGljaCBpcyAycHgKCQkJLy8gSUUgNiBhbmQg NyBxdWlya3MgbW9kZSB0aGUgYm9yZGVyIHdpZHRoIGlzIG92ZXJ3cml0YWJsZSBi eSB0aGUgZm9sbG93aW5nIGNzcyBodG1sIHsgYm9yZGVyOiAwOyB9CgkJCS8vIElF IDcgc3RhbmRhcmRzIG1vZGUsIHRoZSBib3JkZXIgaXMgYWx3YXlzIDJweAoJCQkv LyBUaGlzIGJvcmRlci9vZmZzZXQgaXMgdHlwaWNhbGx5IHJlcHJlc2VudGVkIGJ5 IHRoZSBjbGllbnRMZWZ0IGFuZCBjbGllbnRUb3AgcHJvcGVydGllcwoJCQkvLyBI b3dldmVyLCBpbiBJRTYgYW5kIDcgcXVpcmtzIG1vZGUgdGhlIGNsaWVudExlZnQg YW5kIGNsaWVudFRvcCBwcm9wZXJ0aWVzIGFyZSBub3QgdXBkYXRlZCB3aGVuIG92 ZXJ3cml0aW5nIGl0IHZpYSBDU1MKCQkJLy8gVGhlcmVmb3JlIHRoaXMgbWV0aG9k IHdpbGwgYmUgb2ZmIGJ5IDJweCBpbiBJRSB3aGlsZSBpbiBxdWlya3Ntb2RlCgkJ CWFkZCggLWRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50TGVmdCwgLWRvYy5kb2N1 bWVudEVsZW1lbnQuY2xpZW50VG9wICk7CgoJCS8vIE90aGVyd2lzZSBsb29wIHRo cm91Z2ggdGhlIG9mZnNldFBhcmVudHMgYW5kIHBhcmVudE5vZGVzCgkJfSBlbHNl IHsKCgkJCS8vIEluaXRpYWwgZWxlbWVudCBvZmZzZXRzCgkJCWFkZCggZWxlbS5v ZmZzZXRMZWZ0LCBlbGVtLm9mZnNldFRvcCApOwoKCQkJLy8gR2V0IHBhcmVudCBv ZmZzZXRzCgkJCXdoaWxlICggb2Zmc2V0UGFyZW50ICkgewoJCQkJLy8gQWRkIG9m ZnNldFBhcmVudCBvZmZzZXRzCgkJCQlhZGQoIG9mZnNldFBhcmVudC5vZmZzZXRM ZWZ0LCBvZmZzZXRQYXJlbnQub2Zmc2V0VG9wICk7CgoJCQkJLy8gTW96aWxsYSBh bmQgU2FmYXJpID4gMiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBib3JkZXIgb24gb2Zm c2V0IHBhcmVudHMKCQkJCS8vIEhvd2V2ZXIgTW96aWxsYSBhZGRzIHRoZSBib3Jk ZXIgZm9yIHRhYmxlIG9yIHRhYmxlIGNlbGxzCgkJCQlpZiAoIG1vemlsbGEgJiYg IS9edChhYmxlfGR8aCkkL2kudGVzdChvZmZzZXRQYXJlbnQudGFnTmFtZSkgfHwg c2FmYXJpICYmICFzYWZhcmkyICkKCQkJCQlib3JkZXIoIG9mZnNldFBhcmVudCAp OwoKCQkJCS8vIEFkZCB0aGUgZG9jdW1lbnQgc2Nyb2xsIG9mZnNldHMgaWYgcG9z aXRpb24gaXMgZml4ZWQgb24gYW55IG9mZnNldFBhcmVudAoJCQkJaWYgKCAhZml4 ZWQgJiYgY3NzKG9mZnNldFBhcmVudCwgInBvc2l0aW9uIikgPT0gImZpeGVkIiAp CgkJCQkJZml4ZWQgPSB0cnVlOwoKCQkJCS8vIFNldCBvZmZzZXRDaGlsZCB0byBw cmV2aW91cyBvZmZzZXRQYXJlbnQgdW5sZXNzIGl0IGlzIHRoZSBib2R5IGVsZW1l bnQKCQkJCW9mZnNldENoaWxkICA9IC9eYm9keSQvaS50ZXN0KG9mZnNldFBhcmVu dC50YWdOYW1lKSA/IG9mZnNldENoaWxkIDogb2Zmc2V0UGFyZW50OwoJCQkJLy8g R2V0IG5leHQgb2Zmc2V0UGFyZW50CgkJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQ YXJlbnQub2Zmc2V0UGFyZW50OwoJCQl9CgoJCQkvLyBHZXQgcGFyZW50IHNjcm9s bCBvZmZzZXRzCgkJCXdoaWxlICggcGFyZW50ICYmIHBhcmVudC50YWdOYW1lICYm ICEvXmJvZHl8aHRtbCQvaS50ZXN0KHBhcmVudC50YWdOYW1lKSApIHsKCQkJCS8v IFJlbW92ZSBwYXJlbnQgc2Nyb2xsIFVOTEVTUyB0aGF0IHBhcmVudCBpcyBpbmxp bmUgb3IgYSB0YWJsZSB0byB3b3JrIGFyb3VuZCBPcGVyYSBpbmxpbmUvdGFibGUg c2Nyb2xsTGVmdC9Ub3AgYnVnCgkJCQlpZiAoICEvXmlubGluZXx0YWJsZS4qJC9p LnRlc3QoY3NzKHBhcmVudCwgImRpc3BsYXkiKSkgKQoJCQkJCS8vIFN1YnRyYWN0 IHBhcmVudCBzY3JvbGwgb2Zmc2V0cwoJCQkJCWFkZCggLXBhcmVudC5zY3JvbGxM ZWZ0LCAtcGFyZW50LnNjcm9sbFRvcCApOwoKCQkJCS8vIE1vemlsbGEgZG9lcyBu b3QgYWRkIHRoZSBib3JkZXIgZm9yIGEgcGFyZW50IHRoYXQgaGFzIG92ZXJmbG93 ICE9IHZpc2libGUKCQkJCWlmICggbW96aWxsYSAmJiBjc3MocGFyZW50LCAib3Zl cmZsb3ciKSAhPSAidmlzaWJsZSIgKQoJCQkJCWJvcmRlciggcGFyZW50ICk7CgoJ CQkJLy8gR2V0IG5leHQgcGFyZW50CgkJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50 Tm9kZTsKCQkJfQoKCQkJLy8gU2FmYXJpIDw9IDIgZG91YmxlcyBib2R5IG9mZnNl dHMgd2l0aCBhIGZpeGVkIHBvc2l0aW9uIGVsZW1lbnQvb2Zmc2V0UGFyZW50IG9y IGFic29sdXRlbHkgcG9zaXRpb25lZCBvZmZzZXRDaGlsZAoJCQkvLyBNb3ppbGxh IGRvdWJsZXMgYm9keSBvZmZzZXRzIHdpdGggYSBub24tYWJzb2x1dGVseSBwb3Np dGlvbmVkIG9mZnNldENoaWxkCgkJCWlmICggKHNhZmFyaTIgJiYgKGZpeGVkIHx8 IGNzcyhvZmZzZXRDaGlsZCwgInBvc2l0aW9uIikgPT0gImFic29sdXRlIikpIHx8 CgkJCQkobW96aWxsYSAmJiBjc3Mob2Zmc2V0Q2hpbGQsICJwb3NpdGlvbiIpICE9 ICJhYnNvbHV0ZSIpICkKCQkJCQlhZGQoIC1kb2MuYm9keS5vZmZzZXRMZWZ0LCAt ZG9jLmJvZHkub2Zmc2V0VG9wICk7CgoJCQkvLyBBZGQgdGhlIGRvY3VtZW50IHNj cm9sbCBvZmZzZXRzIGlmIHBvc2l0aW9uIGlzIGZpeGVkCgkJCWlmICggZml4ZWQg KQoJCQkJYWRkKE1hdGgubWF4KGRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVm dCwgZG9jLmJvZHkuc2Nyb2xsTGVmdCksCgkJCQkJTWF0aC5tYXgoZG9jLmRvY3Vt ZW50RWxlbWVudC5zY3JvbGxUb3AsICBkb2MuYm9keS5zY3JvbGxUb3ApKTsKCQl9 CgoJCS8vIFJldHVybiBhbiBvYmplY3Qgd2l0aCB0b3AgYW5kIGxlZnQgcHJvcGVy dGllcwoJCXJlc3VsdHMgPSB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9CgoJ ZnVuY3Rpb24gYm9yZGVyKGVsZW0pIHsKCQlhZGQoIGpRdWVyeS5jdXJDU1MoZWxl bSwgImJvcmRlckxlZnRXaWR0aCIsIHRydWUpLCBqUXVlcnkuY3VyQ1NTKGVsZW0s ICJib3JkZXJUb3BXaWR0aCIsIHRydWUpICk7Cgl9CgoJZnVuY3Rpb24gYWRkKGws IHQpIHsKCQlsZWZ0ICs9IHBhcnNlSW50KGwsIDEwKSB8fCAwOwoJCXRvcCArPSBw YXJzZUludCh0LCAxMCkgfHwgMDsKCX0KCglyZXR1cm4gcmVzdWx0czsKfTsKCgpq UXVlcnkuZm4uZXh0ZW5kKHsKCXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKCQl2YXIg bGVmdCA9IDAsIHRvcCA9IDAsIHJlc3VsdHM7CgoJCWlmICggdGhpc1swXSApIHsK CQkJLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKCQkJdmFyIG9mZnNldFBhcmVu dCA9IHRoaXMub2Zmc2V0UGFyZW50KCksCgoJCQkvLyBHZXQgY29ycmVjdCBvZmZz ZXRzCgkJCW9mZnNldCAgICAgICA9IHRoaXMub2Zmc2V0KCksCgkJCXBhcmVudE9m ZnNldCA9IC9eYm9keXxodG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50WzBdLnRhZ05h bWUpID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQo KTsKCgkJCS8vIFN1YnRyYWN0IGVsZW1lbnQgbWFyZ2lucwoJCQkvLyBub3RlOiB3 aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBh bmQgbWFyZ2luTGVmdCAKCQkJLy8gYXJlIHRoZSBzYW1lIGluIFNhZmFyaSBjYXVz aW5nIG9mZnNldC5sZWZ0IHRvIGluY29ycmVjdGx5IGJlIDAKCQkJb2Zmc2V0LnRv cCAgLT0gbnVtKCB0aGlzLCAnbWFyZ2luVG9wJyApOwoJCQlvZmZzZXQubGVmdCAt PSBudW0oIHRoaXMsICdtYXJnaW5MZWZ0JyApOwoKCQkJLy8gQWRkIG9mZnNldFBh cmVudCBib3JkZXJzCgkJCXBhcmVudE9mZnNldC50b3AgICs9IG51bSggb2Zmc2V0 UGFyZW50LCAnYm9yZGVyVG9wV2lkdGgnICk7CgkJCXBhcmVudE9mZnNldC5sZWZ0 ICs9IG51bSggb2Zmc2V0UGFyZW50LCAnYm9yZGVyTGVmdFdpZHRoJyApOwoKCQkJ Ly8gU3VidHJhY3QgdGhlIHR3byBvZmZzZXRzCgkJCXJlc3VsdHMgPSB7CgkJCQl0 b3A6ICBvZmZzZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AsCgkJCQlsZWZ0OiBv ZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0CgkJCX07CgkJfQoKCQlyZXR1 cm4gcmVzdWx0czsKCX0sCgoJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKCQl2 YXIgb2Zmc2V0UGFyZW50ID0gdGhpc1swXS5vZmZzZXRQYXJlbnQ7CgkJd2hpbGUg KCBvZmZzZXRQYXJlbnQgJiYgKCEvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNldFBh cmVudC50YWdOYW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVudCwgJ3Bvc2l0 aW9uJykgPT0gJ3N0YXRpYycpICkKCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFy ZW50Lm9mZnNldFBhcmVudDsKCQlyZXR1cm4galF1ZXJ5KG9mZnNldFBhcmVudCk7 Cgl9Cn0pOwoKCi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0 aG9kcwpqUXVlcnkuZWFjaCggWydMZWZ0JywgJ1RvcCddLCBmdW5jdGlvbihpLCBu YW1lKSB7Cgl2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyBuYW1lOwoJCglqUXVlcnku Zm5bIG1ldGhvZCBdID0gZnVuY3Rpb24odmFsKSB7CgkJaWYgKCF0aGlzWzBdKSBy ZXR1cm47CgoJCXJldHVybiB2YWwgIT0gdW5kZWZpbmVkID8KCgkJCS8vIFNldCB0 aGUgc2Nyb2xsIG9mZnNldAoJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl0 aGlzID09IHdpbmRvdyB8fCB0aGlzID09IGRvY3VtZW50ID8KCQkJCQl3aW5kb3cu c2Nyb2xsVG8oCgkJCQkJCSFpID8gdmFsIDogalF1ZXJ5KHdpbmRvdykuc2Nyb2xs TGVmdCgpLAoJCQkJCQkgaSA/IHZhbCA6IGpRdWVyeSh3aW5kb3cpLnNjcm9sbFRv cCgpCgkJCQkJKSA6CgkJCQkJdGhpc1sgbWV0aG9kIF0gPSB2YWw7CgkJCX0pIDoK CgkJCS8vIFJldHVybiB0aGUgc2Nyb2xsIG9mZnNldAoJCQl0aGlzWzBdID09IHdp bmRvdyB8fCB0aGlzWzBdID09IGRvY3VtZW50ID8KCQkJCXNlbGZbIGkgPyAncGFn ZVlPZmZzZXQnIDogJ3BhZ2VYT2Zmc2V0JyBdIHx8CgkJCQkJalF1ZXJ5LmJveE1v ZGVsICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgbWV0aG9kIF0gfHwKCQkJ CQlkb2N1bWVudC5ib2R5WyBtZXRob2QgXSA6CgkJCQl0aGlzWzBdWyBtZXRob2Qg XTsKCX07Cn0pOwovLyBDcmVhdGUgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGgsIG91 dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoIG1ldGhvZHMKalF1ZXJ5LmVhY2goWyAi SGVpZ2h0IiwgIldpZHRoIiBdLCBmdW5jdGlvbihpLCBuYW1lKXsKCgl2YXIgdGwg PSBpID8gIkxlZnQiICA6ICJUb3AiLCAgLy8gdG9wIG9yIGxlZnQKCQliciA9IGkg PyAiUmlnaHQiIDogIkJvdHRvbSI7IC8vIGJvdHRvbSBvciByaWdodAoKCS8vIGlu bmVySGVpZ2h0IGFuZCBpbm5lcldpZHRoCglqUXVlcnkuZm5bImlubmVyIiArIG5h bWVdID0gZnVuY3Rpb24oKXsKCQlyZXR1cm4gdGhpc1sgbmFtZS50b0xvd2VyQ2Fz ZSgpIF0oKSArCgkJCW51bSh0aGlzLCAicGFkZGluZyIgKyB0bCkgKwoJCQludW0o dGhpcywgInBhZGRpbmciICsgYnIpOwoJfTsKCgkvLyBvdXRlckhlaWdodCBhbmQg b3V0ZXJXaWR0aAoJalF1ZXJ5LmZuWyJvdXRlciIgKyBuYW1lXSA9IGZ1bmN0aW9u KG1hcmdpbikgewoJCXJldHVybiB0aGlzWyJpbm5lciIgKyBuYW1lXSgpICsKCQkJ bnVtKHRoaXMsICJib3JkZXIiICsgdGwgKyAiV2lkdGgiKSArCgkJCW51bSh0aGlz LCAiYm9yZGVyIiArIGJyICsgIldpZHRoIikgKwoJCQkobWFyZ2luID8KCQkJCW51 bSh0aGlzLCAibWFyZ2luIiArIHRsKSArIG51bSh0aGlzLCAibWFyZ2luIiArIGJy KSA6IDApOwoJfTsKCn0pO30pKCk7Cg== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=tooltip.js Content-Type: application/javascript; charset=ISO-8859-15; name=tooltip.js Content-Location: http://www.ine.es/menus/js/tooltip.js Content-Transfer-Encoding: Base64 LyoKb25tb3VzZW91dD0iaGlkZVRvb2x0aXAoKSIgCm9ubW91c2VvdmVyPSdzaG93 VG9vbHRpcChldmVudCwidGV4dG8gbW9zdHJhciIpO3JldHVybiBmYWxzZScKKi8K CnZhciBkaHRtbGdvb2RpZXNfdG9vbHRpcCA9IGZhbHNlOwp2YXIgZGh0bWxnb29k aWVzX3Rvb2x0aXBTaGFkb3cgPSBmYWxzZTsKdmFyIGRodG1sZ29vZGllc19zaGFk b3dTaXplID0gNDsKdmFyIGRodG1sZ29vZGllc190b29sdGlwTWF4V2lkdGggPSAz MDA7CnZhciBkaHRtbGdvb2RpZXNfdG9vbHRpcE1pbldpZHRoID0gMTAwOwp2YXIg ZGh0bWxnb29kaWVzX2lmcmFtZSA9IGZhbHNlOwp2YXIgZGh0bWxnb29kaWVzX21h cmdlbl9jdXJzb3I9MTA7CnZhciBjbG9zZT10cnVlOwoKdmFyIHRvb2x0aXBfaXNf bXNpZSA9IChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUnKT49MCAm JiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ29wZXJhJyk9PS0xICYmIGRv Y3VtZW50LmFsbCk/dHJ1ZTpmYWxzZTsKCnZhciBlbmNpbWE9ZmFsc2U7Cgp2YXIg Y2VsZGEgPSIiOwoKZnVuY3Rpb24gc2hvd1Rvb2x0aXBEYXRhKGUsdG9vbHRpcFR4 dCxoZWFkZXJzKXsKCXZhciBoZWFkZXJzQXJyYXk9aGVhZGVycy5zcGxpdCgiICIp OwoKCXZhciB0ZXh0bz0iIjsKCWZvciAoaT0wO2k8aGVhZGVyc0FycmF5Lmxlbmd0 aDtpKyspewoJCWlmIChpPT0wKSB0ZXh0bys9ZXZhbCgiZG9jdW1lbnQuZ2V0RWxl bWVudEJ5SWQoJyIraGVhZGVyc0FycmF5W2ldKyInKS5heGlzIik7CgkJZWxzZSB0 ZXh0bys9IiA+ICIrZXZhbCgiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJyIraGVh ZGVyc0FycmF5W2ldKyInKS5heGlzIik7Cgl9Cgl0ZXh0bz0iPGI+Iit0ZXh0bysi PGI+PGJyPjxicj4iOwoJY2xvc2U9ZmFsc2U7Cgl3aW5kb3cuc3RhdHVzPXRleHRv OwoJc2hvd1Rvb2x0aXAoZSx0ZXh0byt0b29sdGlwVHh0KTsKCWRvY3VtZW50Lmdl dEVsZW1lbnRCeUlkKCJpbWdDbG9zZSIpLmZvY3VzKCk7Cn0KCgpmdW5jdGlvbiBz aG93VG9vbHRpcENlcnJhcihlLHRvb2x0aXBUeHQpewoJY2xvc2U9ZmFsc2U7Cglz aG93VG9vbHRpcChlLHRvb2x0aXBUeHQpOwoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQoImltZ0Nsb3NlIikuZm9jdXMoKTsKfQoKZnVuY3Rpb24gc2hvd1Rvb2x0aXAo ZSx0b29sdGlwVHh0KQp7CiAgICAgICAgdmFyIGJvZHlXaWR0aCA9IE1hdGgubWF4 KGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsZG9jdW1lbnQuZG9jdW1lbnRFbGVt ZW50LmNsaWVudFdpZHRoKSAtIDIwOwogICAgICAgIGlmKCFkaHRtbGdvb2RpZXNf dG9vbHRpcCl7CiAgICAgICAgICAgICAgICBkaHRtbGdvb2RpZXNfdG9vbHRpcCA9 IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpOwoKICAgICAgICAgICAgICAg IGRodG1sZ29vZGllc190b29sdGlwLmlkID0gJ2RodG1sZ29vZGllc190b29sdGlw JzsKICAgICAgICAgICAgICAgIGRodG1sZ29vZGllc190b29sdGlwU2hhZG93ID0g ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7CiAgICAgICAgICAgICAgICBk aHRtbGdvb2RpZXNfdG9vbHRpcFNoYWRvdy5pZCA9ICdkaHRtbGdvb2RpZXNfdG9v bHRpcFNoYWRvdyc7CgogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBl bmRDaGlsZChkaHRtbGdvb2RpZXNfdG9vbHRpcCk7CiAgICAgICAgICAgICAgICBk b2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRodG1sZ29vZGllc190b29sdGlwU2hh ZG93KTsKICAgICAgICAgICAgICAgIGlmKHRvb2x0aXBfaXNfbXNpZSl7CiAgICAg ICAgICAgICAgICAgICAgICAgIGRodG1sZ29vZGllc19pZnJhbWUgPSBkb2N1bWVu dC5jcmVhdGVFbGVtZW50KCdJRlJBTUUnKTsKICAgICAgICAgICAgICAgICAgICAg ICAgZGh0bWxnb29kaWVzX2lmcmFtZS5mcmFtZWJvcmRlcj0nNSc7CiAgICAgICAg ICAgICAgICAgICAgICAgIGRodG1sZ29vZGllc19pZnJhbWUuc3R5bGUuYmFja2dy b3VuZENvbG9yPScjRkZGRkZGJzsKICAgICAgICAgICAgICAgICAgICAgICAgZGh0 bWxnb29kaWVzX2lmcmFtZS5zcmMgPSAnIyc7CiAgICAgICAgICAgICAgICAgICAg ICAgIGRodG1sZ29vZGllc19pZnJhbWUuc3R5bGUuekluZGV4ID0gMTAwOwogICAg ICAgICAgICAgICAgICAgICAgICBkaHRtbGdvb2RpZXNfaWZyYW1lLnN0eWxlLnBv c2l0aW9uID0gJ2Fic29sdXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgZG9j dW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaHRtbGdvb2RpZXNfaWZyYW1lKTsKICAg ICAgICAgICAgICAgIH0KCQkJCWRodG1sZ29vZGllc190b29sdGlwLm9ubW91c2Vv dmVyICA9IGZ1bmN0aW9uKCl7cGFzb0VuY2ltYSgpfTsKCQkJaWYgKGNsb3NlKXsK CQkJCWRodG1sZ29vZGllc190b29sdGlwLm9ubW91c2VvdXQgID0gZnVuY3Rpb24o KXtvY3VsdGFyVG9vbHRpcCgpfTsJCgkJCX0KICAgICAgICB9CgogICAgICAgIGRo dG1sZ29vZGllc190b29sdGlwLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKICAgICAg ICBkaHRtbGdvb2RpZXNfdG9vbHRpcFNoYWRvdy5zdHlsZS5kaXNwbGF5PSdibG9j ayc7CiAgICAgICAgaWYodG9vbHRpcF9pc19tc2llKWRodG1sZ29vZGllc19pZnJh bWUuc3R5bGUuZGlzcGxheT0nYmxvY2snOwoKICAgICAgICB2YXIgc3QgPSBNYXRo Lm1heChkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCxkb2N1bWVudC5kb2N1bWVudEVs ZW1lbnQuc2Nyb2xsVG9wKTsKICAgICAgICBpZihuYXZpZ2F0b3IudXNlckFnZW50 LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignc2FmYXJpJyk+PTApc3Q9MDsKCiAgICAg ICAgdmFyIGxlZnRQb3MgPSBlLmNsaWVudFggKyBkaHRtbGdvb2RpZXNfbWFyZ2Vu X2N1cnNvcjsKCgkJaWYgKGJvZHlXaWR0aC1sZWZ0UG9zPGRodG1sZ29vZGllc190 b29sdGlwTWF4V2lkdGgpCgkJCWxlZnRQb3M9Ym9keVdpZHRoLWRodG1sZ29vZGll c190b29sdGlwTWF4V2lkdGg7CgogICAgICAgIGRodG1sZ29vZGllc190b29sdGlw LnN0eWxlLndpZHRoID0gbnVsbDsJLy8gUmVzZXQgc3R5bGUgd2lkdGggaWYgaXQn cyBzZXQKICAgICAgICBpZiAoIWNsb3NlKXsKICAgICAgICAJaW1nY2VycmFyPSI8 ZGl2IGlkPSdkaHRtbGdvb2RpZXNfdG9vbHRpcENsb3NlJz48YSB0aXRsZT0nQ2Vy cmFyJyBpZD0naW1nQ2xvc2UnIGhyZWY9J2phdmFzY3JpcHQ6aGlkZVRvb2x0aXAo KTsnPjxpbWcgYWx0PSdDZXJyYXInIHNyYz0nIitITV9NZW51X0RpcisiL2ltZy9j ZXJyYXIuZ2lmJz48L2E+PC9kaXY+IgogICAgICAgIAl0b29sdGlwVHh0PWltZ2Nl cnJhcit0b29sdGlwVHh0OwogICAgICAgIH0gICAgICAgIAogICAgICAgIGRodG1s Z29vZGllc190b29sdGlwLmlubmVySFRNTCA9IHRvb2x0aXBUeHQ7CgogICAgICAg IGRodG1sZ29vZGllc190b29sdGlwLnN0eWxlLmxlZnQgPSAobGVmdFBvcyArIGRv Y3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0KSArJ3B4JzsKICAgICAg ICBkaHRtbGdvb2RpZXNfdG9vbHRpcC5zdHlsZS50b3AgPSBlLmNsaWVudFkgKyBk aHRtbGdvb2RpZXNfbWFyZ2VuX2N1cnNvciArIHN0ICsgJ3B4JzsKCgogICAgICAg IGRodG1sZ29vZGllc190b29sdGlwU2hhZG93LnN0eWxlLmxlZnQgPSAgKGxlZnRQ b3MgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkgKyAncHgn OwogICAgICAgIGRodG1sZ29vZGllc190b29sdGlwU2hhZG93LnN0eWxlLnRvcCA9 IGUuY2xpZW50WSArIGRodG1sZ29vZGllc19tYXJnZW5fY3Vyc29yICsgc3QgKyBk aHRtbGdvb2RpZXNfc2hhZG93U2l6ZSArICdweCc7CgogICAgICAvKiBpZihkaHRt bGdvb2RpZXNfdG9vbHRpcC5vZmZzZXRXaWR0aD5kaHRtbGdvb2RpZXNfdG9vbHRp cE1heFdpZHRoKXsJLyogRXhjZWVkaW5nIG1heCB3aWR0aCBvZiB0b29sdGlwID8g Ki8KICAgICAgIC8qICAgICAgICBkaHRtbGdvb2RpZXNfdG9vbHRpcC5zdHlsZS53 aWR0aCA9IGRodG1sZ29vZGllc190b29sdGlwTWF4V2lkdGggKyAncHgnOwogICAg ICAgIH0qLwogCgkJIHZhciB0b29sdGlwV2lkdGggPSBkaHRtbGdvb2RpZXNfdG9v bHRpcE1heFdpZHRoOwogLy8gICAgICAgdmFyIHRvb2x0aXBXaWR0aCA9IGRodG1s Z29vZGllc190b29sdGlwLm9mZnNldFdpZHRoOwogIC8vICAgICAgaWYodG9vbHRp cFdpZHRoPGRodG1sZ29vZGllc190b29sdGlwTWluV2lkdGgpdG9vbHRpcFdpZHRo ID0gZGh0bWxnb29kaWVzX3Rvb2x0aXBNaW5XaWR0aDsKCgogICAgICAgIGRodG1s Z29vZGllc190b29sdGlwLnN0eWxlLndpZHRoID0gdG9vbHRpcFdpZHRoICsgJ3B4 JzsKICAgICAgICBkaHRtbGdvb2RpZXNfdG9vbHRpcFNoYWRvdy5zdHlsZS53aWR0 aCA9IGRodG1sZ29vZGllc190b29sdGlwLm9mZnNldFdpZHRoICsgJ3B4JzsKICAg ICAgICBkaHRtbGdvb2RpZXNfdG9vbHRpcFNoYWRvdy5zdHlsZS5oZWlnaHQgPSBk aHRtbGdvb2RpZXNfdG9vbHRpcC5vZmZzZXRIZWlnaHQgKyAncHgnOwoKICAgICAg IGlmKChsZWZ0UG9zICsgdG9vbHRpcFdpZHRoKT5ib2R5V2lkdGgpewogICAgICAg ICAgICAgICAgZGh0bWxnb29kaWVzX3Rvb2x0aXAuc3R5bGUubGVmdCA9IChkaHRt bGdvb2RpZXNfdG9vbHRpcFNoYWRvdy5zdHlsZS5sZWZ0LnJlcGxhY2UoJ3B4Jywn JykgLSAoKGxlZnRQb3MgKyB0b29sdGlwV2lkdGgpLWJvZHlXaWR0aCkpICsgJ3B4 JzsKICAgICAgICAgICAgICAgIGRodG1sZ29vZGllc190b29sdGlwU2hhZG93LnN0 eWxlLmxlZnQgPSAoZGh0bWxnb29kaWVzX3Rvb2x0aXBTaGFkb3cuc3R5bGUubGVm dC5yZXBsYWNlKCdweCcsJycpIC0gKChsZWZ0UG9zICsgdG9vbHRpcFdpZHRoKS1i b2R5V2lkdGgpICsgZGh0bWxnb29kaWVzX3NoYWRvd1NpemUpICsgJ3B4JzsKICAg ICAgICB9CgogICAgICAgIGlmKHRvb2x0aXBfaXNfbXNpZSl7CiAgICAgICAgICAg ICAgICBkaHRtbGdvb2RpZXNfaWZyYW1lLnN0eWxlLmxlZnQgPSBkaHRtbGdvb2Rp ZXNfdG9vbHRpcC5zdHlsZS5sZWZ0OwogICAgICAgICAgICAgICAgZGh0bWxnb29k aWVzX2lmcmFtZS5zdHlsZS50b3AgPSBkaHRtbGdvb2RpZXNfdG9vbHRpcC5zdHls ZS50b3A7CiAgICAgICAgICAgICAgICBkaHRtbGdvb2RpZXNfaWZyYW1lLnN0eWxl LndpZHRoID0gZGh0bWxnb29kaWVzX3Rvb2x0aXAub2Zmc2V0V2lkdGggKyAncHgn OwogICAgICAgICAgICAgICAgZGh0bWxnb29kaWVzX2lmcmFtZS5zdHlsZS5oZWln aHQgPSBkaHRtbGdvb2RpZXNfdG9vbHRpcC5vZmZzZXRIZWlnaHQgKyAncHgnOwoK ICAgICAgICB9Cgp9CgpmdW5jdGlvbiBzaG93VG9vbHRpcENlcnJhcihlLHRvb2x0 aXBUeHQpewoJY2xvc2U9ZmFsc2U7CglzaG93VG9vbHRpcChlLHRvb2x0aXBUeHQp OwoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImltZ0Nsb3NlIikuZm9jdXMoKTsK fQoKCmZ1bmN0aW9uIG9jdWx0YXJUb29sdGlwKGUpIHsKICAgZW5jaW1hPWZhbHNl OwogICBzZXRUaW1lb3V0KCdoaWRlVG9vbHRpcCgpJywxMDAwKTsKfQoKZnVuY3Rp b24gcGFzb0VuY2ltYShlKSB7CmVuY2ltYT10cnVlOwp9CgpmdW5jdGlvbiBoaWRl VG9vbHRpcCgpCnsKCWlmKCghZW5jaW1hKSB8fCAoIWNsb3NlKSl7CQkKICAgICAg ICBkaHRtbGdvb2RpZXNfdG9vbHRpcC5zdHlsZS5kaXNwbGF5PSdub25lJzsKICAg ICAgICBkaHRtbGdvb2RpZXNfdG9vbHRpcFNoYWRvdy5zdHlsZS5kaXNwbGF5PSdu b25lJzsKICAgICAgICBpZih0b29sdGlwX2lzX21zaWUpZGh0bWxnb29kaWVzX2lm cmFtZS5zdHlsZS5kaXNwbGF5PSdub25lJzsKCX0KfQoKLy9FcyB1c2FkYSBwYXJh IGFxdWVsbG9zIHRvb2x0aXAgcXVlIGRlYmVyaWFuIGVzcGVyYXIgCi8vdW4gdGll bXBvIHBvciBzaSBlbCB1c3VhcmlvIGRlc2VhIHBvbmVyc2UgZW5jaW1hIGRlIAov L2VsIHBvciBlbCBoZWNobyBkZSBxdWUgc2UgaGF5YSBpbmNsdWlkb2FsIGd1bmEg ZW5sYWNlIAovL3Ugb3BlcmF0aXZhIGRlbnRybyBkZWwgdG9vbHRpcApmdW5jdGlv biBoaWRlV2FpdFRvb2x0aXAoKXsKICAgc2V0VGltZW91dCgnaGlkZVRvb2x0aXAo KScsMTAwMCk7Cn0KCgo= ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=thickbox.js Content-Type: application/javascript; charset=ISO-8859-15; name=thickbox.js Content-Location: http://www.ine.es/menus/js/thickbox.js Content-Transfer-Encoding: Base64 CnZhciB0Yl9wYXRoVG9JbWFnZSA9ICIvbWVudS9pbWcvbG9hZGluZ0FuaW1hdGlv bi5naWYiOwp2YXIgdHBfcGF0aFRvSW1hZ2VjbG9zZT0iL21lbnUvaW1nL2NlcnJh ci5naWYiOwoKCi8vb24gcGFnZSBsb2FkIGNhbGwgdGJfaW5pdAokKGRvY3VtZW50 KS5yZWFkeShmdW5jdGlvbigpeyAgCglpZiAoU3RyaW5nKG90aGV0aGlja2JveCku bGVuZ3RoPT0wKSAKCQl0Yl9pbml0KCdhLnRoaWNrYm94LCBhcmVhLnRoaWNrYm94 LCBpbnB1dC50aGlja2JveCcpOy8vcGFzcyB3aGVyZSB0byBhcHBseSB0aGlja2Jv eAoJZWxzZSB0Yl9pbml0KCdhLnRoaWNrYm94LCBhcmVhLnRoaWNrYm94LCBpbnB1 dC50aGlja2JveCwnICsgb3RoZXRoaWNrYm94KTsvL3Bhc3Mgd2hlcmUgdG8gYXBw bHkgdGhpY2tib3gKCWltZ0xvYWRlciA9IG5ldyBJbWFnZSgpOy8vIHByZWxvYWQg aW1hZ2UKCWltZ0xvYWRlci5zcmMgPSB0Yl9wYXRoVG9JbWFnZTsKfSk7CgovL2Fk ZCB0aGlja2JveCB0byBocmVmICYgYXJlYSBlbGVtZW50cyB0aGF0IGhhdmUgYSBj bGFzcyBvZiAudGhpY2tib3gKZnVuY3Rpb24gdGJfaW5pdChkb21DaHVuayl7Cgkk KGRvbUNodW5rKS5jbGljayhmdW5jdGlvbigpewoJdmFyIHQgPSB0aGlzLnRpdGxl IHx8IHRoaXMubmFtZSB8fCBudWxsOwoJdmFyIGEgPSB0aGlzLmhyZWYgfHwgdGhp cy5hbHQ7Cgl2YXIgZyA9IHRoaXMucmVsIHx8IGZhbHNlOwoJdGJfc2hvdyh0LGEs Zyk7Cgl0aGlzLmJsdXIoKTsKCXJldHVybiBmYWxzZTsKCX0pOwp9CgpmdW5jdGlv biB0Yl9zaG93KGNhcHRpb24sIHVybCwgaW1hZ2VHcm91cCkgey8vZnVuY3Rpb24g Y2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGEgdGhpY2tib3ggbGluawoJ dHJ5IHsJCQoJCWlmICh0eXBlb2YgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXhIZWln aHQgPT09ICJ1bmRlZmluZWQiKSB7Ly9pZiBJRSA2CgkJCSQoImJvZHkiLCJodG1s IikuY3NzKHtoZWlnaHQ6ICIxMDAlIiwgd2lkdGg6ICIxMDAlIn0pOwoJCQkkKCJo dG1sIikuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpOwoJCQlpZiAoZG9jdW1lbnQu Z2V0RWxlbWVudEJ5SWQoIlRCX0hpZGVTZWxlY3QiKSA9PT0gbnVsbCkgey8vaWZy YW1lIHRvIGhpZGUgc2VsZWN0IGVsZW1lbnRzIGluIGllNgoJCQkJJCgiYm9keSIp LmFwcGVuZCgiPGlmcmFtZSBpZD0nVEJfSGlkZVNlbGVjdCc+PC9pZnJhbWU+PGRp diBpZD0nVEJfb3ZlcmxheSc+PC9kaXY+PGRpdiBpZD0nVEJfd2luZG93Jz48L2Rp dj4iKTsKCQkJCSQoIiNUQl9vdmVybGF5IikuY2xpY2sodGJfcmVtb3ZlKTsKCQkJ fQoJCX1lbHNley8vYWxsIG90aGVycwoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50 QnlJZCgiVEJfb3ZlcmxheSIpID09PSBudWxsKXsKCQkJCSQoImJvZHkiKS5hcHBl bmQoIjxkaXYgaWQ9J1RCX292ZXJsYXknPjwvZGl2PjxkaXYgaWQ9J1RCX3dpbmRv dyc+PC9kaXY+Iik7CgkJCQkkKCIjVEJfb3ZlcmxheSIpLmNsaWNrKHRiX3JlbW92 ZSk7CgkJCX0KCQl9CgkJCgkJaWYodGJfZGV0ZWN0TWFjWEZGKCkpewoJCQkkKCIj VEJfb3ZlcmxheSIpLmFkZENsYXNzKCJUQl9vdmVybGF5TWFjRkZCR0hhY2siKTsv L3VzZSBwbmcgb3ZlcmxheSBzbyBoaWRlIGZsYXNoCgkJfWVsc2V7CgkJCSQoIiNU Ql9vdmVybGF5IikuYWRkQ2xhc3MoIlRCX292ZXJsYXlCRyIpOy8vdXNlIGJhY2tn cm91bmQgYW5kIG9wYWNpdHkKCQl9CgkJCgkJaWYoY2FwdGlvbj09PW51bGwpe2Nh cHRpb249IiI7fQoJCSQoImJvZHkiKS5hcHBlbmQoIjxkaXYgaWQ9J1RCX2xvYWQn PjxpbWcgc3JjPSciK2ltZ0xvYWRlci5zcmMrIicgLz48L2Rpdj4iKTsvL2FkZCBs b2FkZXIgdG8gdGhlIHBhZ2UKCQkkKCcjVEJfbG9hZCcpLnNob3coKTsvL3Nob3cg bG9hZGVyCgkJCgkJdmFyIGJhc2VVUkw7CgkgICBpZih1cmwuaW5kZXhPZigiPyIp IT09LTEpeyAvL2ZmIHRoZXJlIGlzIGEgcXVlcnkgc3RyaW5nIGludm9sdmVkCgkJ CWJhc2VVUkwgPSB1cmwuc3Vic3RyKDAsIHVybC5pbmRleE9mKCI/IikpOwoJICAg fWVsc2V7IAoJICAgCQliYXNlVVJMID0gdXJsOwoJICAgfQoJICAgCgkgICB2YXIg dXJsU3RyaW5nID0gL1wuanBnJHxcLmpwZWckfFwucG5nJHxcLmdpZiR8XC5ibXAk LzsKCSAgIHZhciB1cmxUeXBlID0gYmFzZVVSTC50b0xvd2VyQ2FzZSgpLm1hdGNo KHVybFN0cmluZyk7CgoJCWlmKHVybFR5cGUgPT0gJy5qcGcnIHx8IHVybFR5cGUg PT0gJy5qcGVnJyB8fCB1cmxUeXBlID09ICcucG5nJyB8fCB1cmxUeXBlID09ICcu Z2lmJyB8fCB1cmxUeXBlID09ICcuYm1wJyl7Ly9jb2RlIHRvIHNob3cgaW1hZ2Vz CgkJCQkKCQkJVEJfUHJldkNhcHRpb24gPSAiIjsKCQkJVEJfUHJldlVSTCA9ICIi OwoJCQlUQl9QcmV2SFRNTCA9ICIiOwoJCQlUQl9OZXh0Q2FwdGlvbiA9ICIiOwoJ CQlUQl9OZXh0VVJMID0gIiI7CgkJCVRCX05leHRIVE1MID0gIiI7CgkJCVRCX2lt YWdlQ291bnQgPSAiIjsKCQkJVEJfRm91bmRVUkwgPSBmYWxzZTsKCQkJaWYoaW1h Z2VHcm91cCl7CgkJCQlUQl9UZW1wQXJyYXkgPSAkKCJhW0ByZWw9IitpbWFnZUdy b3VwKyJdIikuZ2V0KCk7CgkJCQlmb3IgKFRCX0NvdW50ZXIgPSAwOyAoKFRCX0Nv dW50ZXIgPCBUQl9UZW1wQXJyYXkubGVuZ3RoKSAmJiAoVEJfTmV4dEhUTUwgPT09 ICIiKSk7IFRCX0NvdW50ZXIrKykgewoJCQkJCXZhciB1cmxUeXBlVGVtcCA9IFRC X1RlbXBBcnJheVtUQl9Db3VudGVyXS5ocmVmLnRvTG93ZXJDYXNlKCkubWF0Y2go dXJsU3RyaW5nKTsKCQkJCQkJaWYgKCEoVEJfVGVtcEFycmF5W1RCX0NvdW50ZXJd LmhyZWYgPT0gdXJsKSkgewkJCQkJCQoJCQkJCQkJaWYgKFRCX0ZvdW5kVVJMKSB7 CgkJCQkJCQkJVEJfTmV4dENhcHRpb24gPSBUQl9UZW1wQXJyYXlbVEJfQ291bnRl cl0udGl0bGU7CgkJCQkJCQkJVEJfTmV4dFVSTCA9IFRCX1RlbXBBcnJheVtUQl9D b3VudGVyXS5ocmVmOwoJCQkJCQkJCVRCX05leHRIVE1MID0gIjxzcGFuIGlkPSdU Ql9uZXh0Jz4mbmJzcDsmbmJzcDs8YSBocmVmPScjJz5OZXh0ICZndDs8L2E+PC9z cGFuPiI7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCVRCX1ByZXZDYXB0aW9uID0g VEJfVGVtcEFycmF5W1RCX0NvdW50ZXJdLnRpdGxlOwoJCQkJCQkJCVRCX1ByZXZV UkwgPSBUQl9UZW1wQXJyYXlbVEJfQ291bnRlcl0uaHJlZjsKCQkJCQkJCQlUQl9Q cmV2SFRNTCA9ICI8c3BhbiBpZD0nVEJfcHJldic+Jm5ic3A7Jm5ic3A7PGEgaHJl Zj0nIyc+Jmx0OyBQcmV2PC9hPjwvc3Bhbj4iOwoJCQkJCQkJfQoJCQkJCQl9IGVs c2UgewoJCQkJCQkJVEJfRm91bmRVUkwgPSB0cnVlOwoJCQkJCQkJVEJfaW1hZ2VD b3VudCA9ICJJbWFnZSAiICsgKFRCX0NvdW50ZXIgKyAxKSArIiBvZiAiKyAoVEJf VGVtcEFycmF5Lmxlbmd0aCk7CQkJCQkJCQkJCQkKCQkJCQkJfQoJCQkJfQoJCQl9 CgoJCQlpbWdQcmVsb2FkZXIgPSBuZXcgSW1hZ2UoKTsKCQkJaW1nUHJlbG9hZGVy Lm9ubG9hZCA9IGZ1bmN0aW9uKCl7CQkKCQkJaW1nUHJlbG9hZGVyLm9ubG9hZCA9 IG51bGw7CgkJCQkKCQkJLy8gUmVzaXppbmcgbGFyZ2UgaW1hZ2VzIC0gb3JnaW5h bCBieSBDaHJpc3RpYW4gTW9udG95YSBlZGl0ZWQgYnkgbWUuCgkJCXZhciBwYWdl c2l6ZSA9IHRiX2dldFBhZ2VTaXplKCk7CgkJCXZhciB4ID0gcGFnZXNpemVbMF0g LSAxNTA7CgkJCXZhciB5ID0gcGFnZXNpemVbMV0gLSAxNTA7CgkJCXZhciBpbWFn ZVdpZHRoID0gaW1nUHJlbG9hZGVyLndpZHRoOwoJCQl2YXIgaW1hZ2VIZWlnaHQg PSBpbWdQcmVsb2FkZXIuaGVpZ2h0OwoJCQlpZiAoaW1hZ2VXaWR0aCA+IHgpIHsK CQkJCWltYWdlSGVpZ2h0ID0gaW1hZ2VIZWlnaHQgKiAoeCAvIGltYWdlV2lkdGgp OyAKCQkJCWltYWdlV2lkdGggPSB4OyAKCQkJCWlmIChpbWFnZUhlaWdodCA+IHkp IHsgCgkJCQkJaW1hZ2VXaWR0aCA9IGltYWdlV2lkdGggKiAoeSAvIGltYWdlSGVp Z2h0KTsgCgkJCQkJaW1hZ2VIZWlnaHQgPSB5OyAKCQkJCX0KCQkJfSBlbHNlIGlm IChpbWFnZUhlaWdodCA+IHkpIHsgCgkJCQlpbWFnZVdpZHRoID0gaW1hZ2VXaWR0 aCAqICh5IC8gaW1hZ2VIZWlnaHQpOyAKCQkJCWltYWdlSGVpZ2h0ID0geTsgCgkJ CQlpZiAoaW1hZ2VXaWR0aCA+IHgpIHsgCgkJCQkJaW1hZ2VIZWlnaHQgPSBpbWFn ZUhlaWdodCAqICh4IC8gaW1hZ2VXaWR0aCk7IAoJCQkJCWltYWdlV2lkdGggPSB4 OwoJCQkJfQoJCQl9CgkJCS8vIEVuZCBSZXNpemluZwoJCQkKCQkJVEJfV0lEVEgg PSBpbWFnZVdpZHRoICsgMzA7CgkJCVRCX0hFSUdIVCA9IGltYWdlSGVpZ2h0ICsg NjA7CgkJCSQoIiNUQl93aW5kb3ciKS5hcHBlbmQoIjxhIGhyZWY9JycgaWQ9J1RC X0ltYWdlT2ZmJyB0aXRsZT0nQ2xvc2UnPjxpbWcgaWQ9J1RCX0ltYWdlJyBzcmM9 JyIrdXJsKyInIHdpZHRoPSciK2ltYWdlV2lkdGgrIicgaGVpZ2h0PSciK2ltYWdl SGVpZ2h0KyInIGFsdD0nIitjYXB0aW9uKyInLz48L2E+IiArICI8ZGl2IGlkPSdU Ql9jYXB0aW9uJz4iK2NhcHRpb24rIjxkaXYgaWQ9J1RCX3NlY29uZExpbmUnPiIg KyBUQl9pbWFnZUNvdW50ICsgVEJfUHJldkhUTUwgKyBUQl9OZXh0SFRNTCArICI8 L2Rpdj48L2Rpdj48ZGl2IGlkPSdUQl9jbG9zZVdpbmRvdyc+PGEgaHJlZj0nIycg aWQ9J1RCX2Nsb3NlV2luZG93QnV0dG9uJyB0aXRsZT0nQ2xvc2UnPjxpbWcgc3Jj PSciICsgIHRwX3BhdGhUb0ltYWdlY2xvc2UgKyAiJyBjbGFzcz0nc2luYm9yZGUn PjwvYT48L2Rpdj4iKTsgCQkKCQkJCgkJCSQoIiNUQl9jbG9zZVdpbmRvd0J1dHRv biIpLmNsaWNrKHRiX3JlbW92ZSk7CgkJCQoJCQlpZiAoIShUQl9QcmV2SFRNTCA9 PT0gIiIpKSB7CgkJCQlmdW5jdGlvbiBnb1ByZXYoKXsKCQkJCQlpZigkKGRvY3Vt ZW50KS51bmJpbmQoImNsaWNrIixnb1ByZXYpKXskKGRvY3VtZW50KS51bmJpbmQo ImNsaWNrIixnb1ByZXYpO30KCQkJCQkkKCIjVEJfd2luZG93IikucmVtb3ZlKCk7 CgkJCQkJJCgiYm9keSIpLmFwcGVuZCgiPGRpdiBpZD0nVEJfd2luZG93Jz48L2Rp dj4iKTsKCQkJCQl0Yl9zaG93KFRCX1ByZXZDYXB0aW9uLCBUQl9QcmV2VVJMLCBp bWFnZUdyb3VwKTsKCQkJCQlyZXR1cm4gZmFsc2U7CQoJCQkJfQoJCQkJJCgiI1RC X3ByZXYiKS5jbGljayhnb1ByZXYpOwoJCQl9CgkJCQoJCQlpZiAoIShUQl9OZXh0 SFRNTCA9PT0gIiIpKSB7CQkKCQkJCWZ1bmN0aW9uIGdvTmV4dCgpewoJCQkJCSQo IiNUQl93aW5kb3ciKS5yZW1vdmUoKTsKCQkJCQkkKCJib2R5IikuYXBwZW5kKCI8 ZGl2IGlkPSdUQl93aW5kb3cnPjwvZGl2PiIpOwoJCQkJCXRiX3Nob3coVEJfTmV4 dENhcHRpb24sIFRCX05leHRVUkwsIGltYWdlR3JvdXApOwkJCQkKCQkJCQlyZXR1 cm4gZmFsc2U7CQoJCQkJfQoJCQkJJCgiI1RCX25leHQiKS5jbGljayhnb05leHQp OwoJCQkJCgkJCX0KCgkJCWRvY3VtZW50Lm9ua2V5ZG93biA9IGZ1bmN0aW9uKGUp eyAJCgkJCQlpZiAoZSA9PSBudWxsKSB7IC8vIGllCgkJCQkJa2V5Y29kZSA9IGV2 ZW50LmtleUNvZGU7CgkJCQl9IGVsc2UgeyAvLyBtb3ppbGxhCgkJCQkJa2V5Y29k ZSA9IGUud2hpY2g7CgkJCQl9CgkJCQlpZihrZXljb2RlID09IDI3KXsgLy8gY2xv c2UKCQkJCQl0Yl9yZW1vdmUoKTsKCQkJCX0gZWxzZSBpZihrZXljb2RlID09IDE5 MCl7IC8vIGRpc3BsYXkgcHJldmlvdXMgaW1hZ2UKCQkJCQlpZighKFRCX05leHRI VE1MID09ICIiKSl7CgkJCQkJCWRvY3VtZW50Lm9ua2V5ZG93biA9ICIiOwoJCQkJ CQlnb05leHQoKTsKCQkJCQl9CgkJCQl9IGVsc2UgaWYoa2V5Y29kZSA9PSAxODgp eyAvLyBkaXNwbGF5IG5leHQgaW1hZ2UKCQkJCQlpZighKFRCX1ByZXZIVE1MID09 ICIiKSl7CgkJCQkJCWRvY3VtZW50Lm9ua2V5ZG93biA9ICIiOwoJCQkJCQlnb1By ZXYoKTsKCQkJCQl9CgkJCQl9CQoJCQl9OwoJCQkKCQkJdGJfcG9zaXRpb24oKTsK CQkJJCgiI1RCX2xvYWQiKS5yZW1vdmUoKTsKCQkJJCgiI1RCX0ltYWdlT2ZmIiku Y2xpY2sodGJfcmVtb3ZlKTsKCQkJJCgiI1RCX3dpbmRvdyIpLmNzcyh7ZGlzcGxh eToiYmxvY2sifSk7IC8vZm9yIHNhZmFyaSB1c2luZyBjc3MgaW5zdGVhZCBvZiBz aG93CgkJCX07CgkJCQoJCQlpbWdQcmVsb2FkZXIuc3JjID0gdXJsOwoJCX1lbHNl ey8vY29kZSB0byBzaG93IGh0bWwKCQkJCgkJCXZhciBxdWVyeVN0cmluZyA9IHVy bC5yZXBsYWNlKC9eW15cP10rXD8/LywnJyk7CgkJCXZhciBwYXJhbXMgPSB0Yl9w YXJzZVF1ZXJ5KCBxdWVyeVN0cmluZyApOwoKCQkJVEJfV0lEVEggPSAocGFyYW1z Wyd3aWR0aCddKjEpICsgMzAgfHwgNjMwOyAvL2RlZmF1bHRzIHRvIDYzMCBpZiBu byBwYXJhbWF0ZXJzIHdlcmUgYWRkZWQgdG8gVVJMCgkJCVRCX0hFSUdIVCA9IChw YXJhbXNbJ2hlaWdodCddKjEpICsgNDAgfHwgNDQwOyAvL2RlZmF1bHRzIHRvIDQ0 MCBpZiBubyBwYXJhbWF0ZXJzIHdlcmUgYWRkZWQgdG8gVVJMCgkJCWFqYXhDb250 ZW50VyA9IFRCX1dJRFRIIC0gMzA7CgkJCWFqYXhDb250ZW50SCA9IFRCX0hFSUdI VCAtIDQ1OwoJCQkKCQkJaWYodXJsLmluZGV4T2YoJ1RCX2lmcmFtZScpICE9IC0x KXsvLyBlaXRoZXIgaWZyYW1lIG9yIGFqYXggd2luZG93CQkKCQkJCQl1cmxOb1F1 ZXJ5ID0gdXJsLnNwbGl0KCdUQl8nKTsKCQkJCQkkKCIjVEJfaWZyYW1lQ29udGVu dCIpLnJlbW92ZSgpOwoJCQkJCWlmKHBhcmFtc1snbW9kYWwnXSAhPSAidHJ1ZSIp ey8vaWZyYW1lIG5vIG1vZGFsCgkJCQkJCSQoIiNUQl93aW5kb3ciKS5hcHBlbmQo IjxkaXYgaWQ9J1RCX3RpdGxlJz48ZGl2IGlkPSdUQl9hamF4V2luZG93VGl0bGUn PiIrY2FwdGlvbisiPC9kaXY+PGRpdiBpZD0nVEJfY2xvc2VBamF4V2luZG93Jz48 YSBocmVmPScjJyBpZD0nVEJfY2xvc2VXaW5kb3dCdXR0b24nIHRpdGxlPSdDbG9z ZSc+PGltZyBzcmM9JyIgKyAgdHBfcGF0aFRvSW1hZ2VjbG9zZSArICInIGNsYXNz PSdzaW5ib3JkZSc+PC9hPjwvZGl2PjwvZGl2PjxpZnJhbWUgZnJhbWVib3JkZXI9 JzAnIGhzcGFjZT0nMCcgc3JjPSciK3VybE5vUXVlcnlbMF0rIicgaWQ9J1RCX2lm cmFtZUNvbnRlbnQnIG5hbWU9J1RCX2lmcmFtZUNvbnRlbnQiK01hdGgucm91bmQo TWF0aC5yYW5kb20oKSoxMDAwKSsiJyBvbmxvYWQ9J3RiX3Nob3dJZnJhbWUoKScg c3R5bGU9J3dpZHRoOiIrKGFqYXhDb250ZW50VyArIDI5KSsicHg7aGVpZ2h0OiIr KGFqYXhDb250ZW50SCArIDE3KSsicHg7JyA+IDwvaWZyYW1lPiIpOwoJCQkJCX1l bHNley8vaWZyYW1lIG1vZGFsCgkJCQkJJCgiI1RCX292ZXJsYXkiKS51bmJpbmQo KTsKCQkJCQkJJCgiI1RCX3dpbmRvdyIpLmFwcGVuZCgiPGlmcmFtZSBmcmFtZWJv cmRlcj0nMCcgaHNwYWNlPScwJyBzcmM9JyIrdXJsTm9RdWVyeVswXSsiJyBpZD0n VEJfaWZyYW1lQ29udGVudCcgbmFtZT0nVEJfaWZyYW1lQ29udGVudCIrTWF0aC5y b3VuZChNYXRoLnJhbmRvbSgpKjEwMDApKyInIG9ubG9hZD0ndGJfc2hvd0lmcmFt ZSgpJyBzdHlsZT0nd2lkdGg6IisoYWpheENvbnRlbnRXICsgMjkpKyJweDtoZWln aHQ6IisoYWpheENvbnRlbnRIICsgMTcpKyJweDsnPiA8L2lmcmFtZT4iKTsKCQkJ CQl9CgkJCX1lbHNley8vIG5vdCBhbiBpZnJhbWUsIGFqYXgKCQkJCQlpZigkKCIj VEJfd2luZG93IikuY3NzKCJkaXNwbGF5IikgIT0gImJsb2NrIil7CgkJCQkJCWlm KHBhcmFtc1snbW9kYWwnXSAhPSAidHJ1ZSIpey8vYWpheCBubyBtb2RhbAoJCQkJ CQkkKCIjVEJfd2luZG93IikuYXBwZW5kKCI8ZGl2IGlkPSdUQl90aXRsZSc+PGRp diBpZD0nVEJfYWpheFdpbmRvd1RpdGxlJz4iK2NhcHRpb24rIjwvZGl2PjxkaXYg aWQ9J1RCX2Nsb3NlQWpheFdpbmRvdyc+PGEgaHJlZj0nIycgaWQ9J1RCX2Nsb3Nl V2luZG93QnV0dG9uJz48aW1nIHNyYz0nIiArICB0cF9wYXRoVG9JbWFnZWNsb3Nl ICsgIicgY2xhc3M9J3NpbmJvcmRlJz48L2E+PC9kaXY+PC9kaXY+PGRpdiBpZD0n VEJfYWpheENvbnRlbnQnIHN0eWxlPSd3aWR0aDoiK2FqYXhDb250ZW50VysicHg7 aGVpZ2h0OiIrYWpheENvbnRlbnRIKyJweCc+PC9kaXY+Iik7CgkJCQkJCX1lbHNl ey8vYWpheCBtb2RhbAoJCQkJCQkkKCIjVEJfb3ZlcmxheSIpLnVuYmluZCgpOwoJ CQkJCQkkKCIjVEJfd2luZG93IikuYXBwZW5kKCI8ZGl2IGlkPSdUQl9hamF4Q29u dGVudCcgY2xhc3M9J1RCX21vZGFsJyBzdHlsZT0nd2lkdGg6IithamF4Q29udGVu dFcrInB4O2hlaWdodDoiK2FqYXhDb250ZW50SCsicHg7Jz48L2Rpdj4iKTsJCgkJ CQkJCX0KCQkJCQl9ZWxzZXsvL3RoaXMgbWVhbnMgdGhlIHdpbmRvdyBpcyBhbHJl YWR5IHVwLCB3ZSBhcmUganVzdCBsb2FkaW5nIG5ldyBjb250ZW50IHZpYSBhamF4 CgkJCQkJCSQoIiNUQl9hamF4Q29udGVudCIpWzBdLnN0eWxlLndpZHRoID0gYWph eENvbnRlbnRXICsicHgiOwoJCQkJCQkkKCIjVEJfYWpheENvbnRlbnQiKVswXS5z dHlsZS5oZWlnaHQgPSBhamF4Q29udGVudEggKyJweCI7CgkJCQkJCSQoIiNUQl9h amF4Q29udGVudCIpWzBdLnNjcm9sbFRvcCA9IDA7CgkJCQkJCSQoIiNUQl9hamF4 V2luZG93VGl0bGUiKS5odG1sKGNhcHRpb24pOwoJCQkJCX0KCQkJfQoJCQkJCQoJ CQkkKCIjVEJfY2xvc2VXaW5kb3dCdXR0b24iKS5jbGljayh0Yl9yZW1vdmUpOwoJ CQkKCQkJCWlmKHVybC5pbmRleE9mKCdUQl9pbmxpbmUnKSAhPSAtMSl7CQoJCQkJ CSQoIiNUQl9hamF4Q29udGVudCIpLmFwcGVuZCgkKCcjJyArIHBhcmFtc1snaW5s aW5lSWQnXSkuY2hpbGRyZW4oKSk7CgkJCQkJJCgiI1RCX3dpbmRvdyIpLnVubG9h ZChmdW5jdGlvbiAoKSB7CgkJCQkJCSQoJyMnICsgcGFyYW1zWydpbmxpbmVJZCdd KS5hcHBlbmQoICQoIiNUQl9hamF4Q29udGVudCIpLmNoaWxkcmVuKCkgKTsgLy8g bW92ZSBlbGVtZW50cyBiYWNrIHdoZW4geW91J3JlIGZpbmlzaGVkCgkJCQkJfSk7 CgkJCQkJdGJfcG9zaXRpb24oKTsKCQkJCQkkKCIjVEJfbG9hZCIpLnJlbW92ZSgp OwoJCQkJCSQoIiNUQl93aW5kb3ciKS5jc3Moe2Rpc3BsYXk6ImJsb2NrIn0pOyAK CQkJCX1lbHNlIGlmKHVybC5pbmRleE9mKCdUQl9pZnJhbWUnKSAhPSAtMSl7CgkJ CQkJdGJfcG9zaXRpb24oKTsKCQkJCQlpZigkLmJyb3dzZXIuc2FmYXJpKXsvL3Nh ZmFyaSBuZWVkcyBoZWxwIGJlY2F1c2UgaXQgd2lsbCBub3QgZmlyZSBpZnJhbWUg b25sb2FkCgkJCQkJCSQoIiNUQl9sb2FkIikucmVtb3ZlKCk7CgkJCQkJCSQoIiNU Ql93aW5kb3ciKS5jc3Moe2Rpc3BsYXk6ImJsb2NrIn0pOwoJCQkJCX0KCQkJCX1l bHNlewoJCQkJCSQoIiNUQl9hamF4Q29udGVudCIpLmxvYWQodXJsICs9ICImcmFu ZG9tPSIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkpLGZ1bmN0aW9uKCl7Ly90byBk byBhIHBvc3QgY2hhbmdlIHRoaXMgbG9hZCBtZXRob2QKCQkJCQkJdGJfcG9zaXRp b24oKTsKCQkJCQkJJCgiI1RCX2xvYWQiKS5yZW1vdmUoKTsKCQkJCQkJdGJfaW5p dCgiI1RCX2FqYXhDb250ZW50IGEudGhpY2tib3giKTsKCQkJCQkJJCgiI1RCX3dp bmRvdyIpLmNzcyh7ZGlzcGxheToiYmxvY2sifSk7CgkJCQkJfSk7CgkJCQl9CgkJ CQoJCX0KCgkJaWYoIXBhcmFtc1snbW9kYWwnXSl7CgkJCWRvY3VtZW50Lm9ua2V5 dXAgPSBmdW5jdGlvbihlKXsgCQoJCQkJaWYgKGUgPT0gbnVsbCkgeyAvLyBpZQoJ CQkJCWtleWNvZGUgPSBldmVudC5rZXlDb2RlOwoJCQkJfSBlbHNlIHsgLy8gbW96 aWxsYQoJCQkJCWtleWNvZGUgPSBlLndoaWNoOwoJCQkJfQoJCQkJaWYoa2V5Y29k ZSA9PSAyNyl7IC8vIGNsb3NlCgkJCQkJdGJfcmVtb3ZlKCk7CgkJCQl9CQoJCQl9 OwoJCX0KCQkKCX0gY2F0Y2goZSkgewoJCS8vbm90aGluZyBoZXJlCgl9Cn0KCi8v aGVscGVyIGZ1bmN0aW9ucyBiZWxvdwpmdW5jdGlvbiB0Yl9zaG93SWZyYW1lKCl7 CgkkKCIjVEJfbG9hZCIpLnJlbW92ZSgpOwoJJCgiI1RCX3dpbmRvdyIpLmNzcyh7 ZGlzcGxheToiYmxvY2sifSk7Cn0KCmZ1bmN0aW9uIHRiX3JlbW92ZSgpIHsKIAkk KCIjVEJfaW1hZ2VPZmYiKS51bmJpbmQoImNsaWNrIik7CgkkKCIjVEJfY2xvc2VX aW5kb3dCdXR0b24iKS51bmJpbmQoImNsaWNrIik7CgkkKCIjVEJfd2luZG93Iiku ZmFkZU91dCgiZmFzdCIsZnVuY3Rpb24oKXskKCcjVEJfd2luZG93LCNUQl9vdmVy bGF5LCNUQl9IaWRlU2VsZWN0JykudHJpZ2dlcigidW5sb2FkIikudW5iaW5kKCku cmVtb3ZlKCk7fSk7CgkkKCIjVEJfbG9hZCIpLnJlbW92ZSgpOwoJaWYgKHR5cGVv ZiBkb2N1bWVudC5ib2R5LnN0eWxlLm1heEhlaWdodCA9PSAidW5kZWZpbmVkIikg ey8vaWYgSUUgNgoJCSQoImJvZHkiLCJodG1sIikuY3NzKHtoZWlnaHQ6ICJhdXRv Iiwgd2lkdGg6ICJhdXRvIn0pOwoJCSQoImh0bWwiKS5jc3MoIm92ZXJmbG93Iiwi Iik7Cgl9Cglkb2N1bWVudC5vbmtleWRvd24gPSAiIjsKCWRvY3VtZW50Lm9ua2V5 dXAgPSAiIjsKCXJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gdGJfcG9zaXRpb24o KSB7CiQoIiNUQl93aW5kb3ciKS5jc3Moe21hcmdpbkxlZnQ6ICctJyArIHBhcnNl SW50KChUQl9XSURUSCAvIDIpLDEwKSArICdweCcsIHdpZHRoOiBUQl9XSURUSCAr ICdweCd9KTsKCWlmICggIShqUXVlcnkuYnJvd3Nlci5tc2llICYmIGpRdWVyeS5i cm93c2VyLnZlcnNpb24gPCA3KSkgeyAvLyB0YWtlIGF3YXkgSUU2CgkJJCgiI1RC X3dpbmRvdyIpLmNzcyh7bWFyZ2luVG9wOiAnLScgKyBwYXJzZUludCgoVEJfSEVJ R0hUIC8gMiksMTApICsgJ3B4J30pOwoJfQp9CgpmdW5jdGlvbiB0Yl9wYXJzZVF1 ZXJ5ICggcXVlcnkgKSB7CiAgIHZhciBQYXJhbXMgPSB7fTsKICAgaWYgKCAhIHF1 ZXJ5ICkge3JldHVybiBQYXJhbXM7fS8vIHJldHVybiBlbXB0eSBvYmplY3QKICAg dmFyIFBhaXJzID0gcXVlcnkuc3BsaXQoL1s7Jl0vKTsKICAgZm9yICggdmFyIGkg PSAwOyBpIDwgUGFpcnMubGVuZ3RoOyBpKysgKSB7CiAgICAgIHZhciBLZXlWYWwg PSBQYWlyc1tpXS5zcGxpdCgnPScpOwogICAgICBpZiAoICEgS2V5VmFsIHx8IEtl eVZhbC5sZW5ndGggIT0gMiApIHtjb250aW51ZTt9CiAgICAgIHZhciBrZXkgPSB1 bmVzY2FwZSggS2V5VmFsWzBdICk7CiAgICAgIHZhciB2YWwgPSB1bmVzY2FwZSgg S2V5VmFsWzFdICk7CiAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKC9cKy9nLCAnICcp OwogICAgICBQYXJhbXNba2V5XSA9IHZhbDsKICAgfQogICByZXR1cm4gUGFyYW1z Owp9CgpmdW5jdGlvbiB0Yl9nZXRQYWdlU2l6ZSgpewoJdmFyIGRlID0gZG9jdW1l bnQuZG9jdW1lbnRFbGVtZW50OwoJdmFyIHcgPSB3aW5kb3cuaW5uZXJXaWR0aCB8 fCBzZWxmLmlubmVyV2lkdGggfHwgKGRlJiZkZS5jbGllbnRXaWR0aCkgfHwgZG9j dW1lbnQuYm9keS5jbGllbnRXaWR0aDsKCXZhciBoID0gd2luZG93LmlubmVySGVp Z2h0IHx8IHNlbGYuaW5uZXJIZWlnaHQgfHwgKGRlJiZkZS5jbGllbnRIZWlnaHQp IHx8IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OwoJYXJyYXlQYWdlU2l6ZSA9 IFt3LGhdOwoJcmV0dXJuIGFycmF5UGFnZVNpemU7Cn0KCmZ1bmN0aW9uIHRiX2Rl dGVjdE1hY1hGRigpIHsKICB2YXIgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJB Z2VudC50b0xvd2VyQ2FzZSgpOwogIGlmICh1c2VyQWdlbnQuaW5kZXhPZignbWFj JykgIT0gLTEgJiYgdXNlckFnZW50LmluZGV4T2YoJ2ZpcmVmb3gnKSE9LTEpIHsK ICAgIHJldHVybiB0cnVlOwogIH0KfQoKCg== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=general.js Content-Type: application/javascript; charset=ISO-8859-15; name=general.js Content-Location: http://www.ine.es/menus/js/general.js Content-Transfer-Encoding: Base64 ZnVuY3Rpb24gSXMgKCkKeyAgIC8vIGNvbnZlcnQgYWxsIGNoYXJhY3RlcnMgdG8g bG93ZXJjYXNlIHRvIHNpbXBsaWZ5IHRlc3RpbmcKICAgIHZhciBhZ3Q9bmF2aWdh dG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOwoKICAgIC8vIC0tLSBCUk9XU0VS IFZFUlNJT04gLS0tCiAgICB0aGlzLm1ham9yID0gcGFyc2VJbnQobmF2aWdhdG9y LmFwcFZlcnNpb24pOwogICAgdGhpcy5taW5vciA9IHBhcnNlRmxvYXQobmF2aWdh dG9yLmFwcFZlcnNpb24pOwoKICAgIHRoaXMubmF2ICA9ICgoYWd0LmluZGV4T2Yo J21vemlsbGEnKSE9LTEpICYmICgoYWd0LmluZGV4T2YoJ3Nwb29mZXInKT09LTEp ICYmIChhZ3QuaW5kZXhPZignY29tcGF0aWJsZScpID09IC0xKSkpOwogICAgdGhp cy5uYXYyID0gKHRoaXMubmF2ICYmICh0aGlzLm1ham9yID09IDIpKTsKICAgIHRo aXMubmF2MyA9ICh0aGlzLm5hdiAmJiAodGhpcy5tYWpvciA9PSAzKSk7CiAgICB0 aGlzLm5hdjQgPSAodGhpcy5uYXYgJiYgKHRoaXMubWFqb3IgPT0gNCkpOwoJdGhp cy5uYXY1ID0gKHRoaXMuYj09Im5zIiAmJiB0aGlzLnY9PTUpCiAKCiAgICB0aGlz LmllICAgPSAoYWd0LmluZGV4T2YoIm1zaWUiKSAhPSAtMSk7CiAgICB0aGlzLmll MyAgPSAodGhpcy5pZSAmJiAodGhpcy5tYWpvciA9PSAyKSk7CiAgICB0aGlzLmll NCAgPSAodGhpcy5pZSAmJiAodGhpcy5tYWpvciA9PSA0KSk7CiAgICB0aGlzLmll NSA9IChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUgNScpPjApOwoK ICAgIHRoaXMub3BlcmEgPSAoYWd0LmluZGV4T2YoIm9wZXJhIikgIT0gLTEpOwog ICAgIAogICAgdGhpcy5OTiA9CXRoaXMubmF2ICYmICh0aGlzLm1ham9yID49IDQp OwogICAgdGhpcy5JRSAgPSB0aGlzLmllICAmJiAodGhpcy5tYWpvciA+PSA0KTsK CWlmICh0aGlzLmllNSkgdGhpcy52ID0gNQogICAgdGhpcy5taW4gPSAodGhpcy5O Tnx8dGhpcy5JRSkKCn0KZG9jdW1lbnQud3JpdGUoIjxTQ1IiICsgIklQVCB0eXBl PSd0ZXh0IiArICIvamF2YSIgKyAic2NyIiArICJpcHQnIFNSQz0nIiArIEhNX0Rp ckpzKyAiZ2luaHNpaHAuanMnPjxcL1NDUiIgKyAiSVBUPiIpOwp2YXIgaXMgPSBu ZXcgSXMoKTsKCgpmdW5jdGlvbiBmaW5kT2JqKG4sIGQpIHsgCiAgdmFyIHAsaSx4 OyAgCiAgaWYoIWQpIGQ9ZG9jdW1lbnQ7IAogIGlmKChwPW4uaW5kZXhPZigiPyIp KT4wJiZwYXJlbnQuZnJhbWVzLmxlbmd0aCkgCiAgewogICAgZD1wYXJlbnQuZnJh bWVzW24uc3Vic3RyaW5nKHArMSldLmRvY3VtZW50OyBuPW4uc3Vic3RyaW5nKDAs cCk7fQogIGlmKCEoeD1kW25dKSYmZC5hbGwpIHg9ZC5hbGxbbl07IAogIGZvciAo aT0wOyF4JiZpPGQuZm9ybXMubGVuZ3RoO2krKykgeD1kLmZvcm1zW2ldW25dOwog IGZvcihpPTA7IXgmJmQubGF5ZXJzJiZpPGQubGF5ZXJzLmxlbmd0aDtpKyspIHg9 ZmluZE9iaihuLGQubGF5ZXJzW2ldLmRvY3VtZW50KTsgcmV0dXJuIHg7Cn0KaWYg KE1lbnVfVGl0dWxvRmF2b3JpdG9zPT1udWxsKQoJdmFyIE1lbnVfVGl0dWxvRmF2 b3JpdG9zPSJJTkUiOwoJIAppZiAoTWVudV9VcmxGYXZvcml0b3M9PW51bGwpCgl2 YXIgTWVudV9VcmxGYXZvcml0b3M9Imh0dHA6Ly93d3cuaW5lLmVzIjsKZnVuY3Rp b24gQWdyZWdhckZhdm9yaXRvcyh0aXR1bG8sdXJsKXsKIHRpdGxlID10aXR1bG87 IAogdXJsID0gdXJsOwogIHRyeXsKCWlmICh3aW5kb3cuc2lkZWJhcikgeyAvLyBN b3ppbGxhIEZpcmVmb3ggQm9va21hcmsKCQl3aW5kb3cuc2lkZWJhci5hZGRQYW5l bCh0aXRsZSwgdXJsLCIiKTsKCX0gZWxzZSBpZiggd2luZG93LmV4dGVybmFsICkg eyAvLyBJRSBGYXZvcml0ZQoJCXdpbmRvdy5leHRlcm5hbC5BZGRGYXZvcml0ZSgg dXJsLCB0aXRsZSk7IAoJfSBlbHNlIGlmKHdpbmRvdy5vcGVyYSAmJiB3aW5kb3cu cHJpbnQpIHsgLy8gT3BlcmEgSG90bGlzdAoJCXJldHVybiB0cnVlOyB9CiAgfWNh dGNoKGUpIHsKCiAgfQkKfQoKZnVuY3Rpb24gTWVuc2FqZSAoZmljaGVybyxzY3Jv bGwsYW5jaG8sYWx0bykgewoKICB2YXIgdz1hbmNobzsKICB2YXIgaD1hbHRvOwog IHZhciB0PShzY3JlZW4uaGVpZ2h0LWgpLzIKICB2YXIgbD0oc2NyZWVuLndpZHRo LXcpLzIKICBpZiAoc2Nyb2xsPT0wKXsKICAgIHByb3A9J3Rvb2xiYXI9bm8sbG9j YXRpb249bm8sZGlyZWN0b3JpZXM9bm8sc3RhdHVzPW5vLG1lbnViYXI9bm8sc2Ny b2xsYmFycz1ubyxyZXNpemFibGU9eWVzLHRvcD0nK3QrJyxsZWZ0PScrbCsnLHdp ZHRoPScrdysnLGhlaWdodD0nK2gKICAgIG1zZ1dpbmRvdz13aW5kb3cub3Blbihm aWNoZXJvLCdsZWdhbCcscHJvcCkKICB9IGVsc2UgewogICAgcHJvcD0ndG9vbGJh cj1ubyxsb2NhdGlvbj1ubyxkaXJlY3Rvcmllcz1ubyxzdGF0dXM9bm8sbWVudWJh cj1ubyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHRvcD0nK3QrJyxsZWZ0 PScrbCsnLHdpZHRoPScrdysnLGhlaWdodD0nK2gKICAgIG1zZ1dpbmRvdz13aW5k b3cub3BlbihmaWNoZXJvLCdsZWdhbCcscHJvcCkKICB9Cgp9CgpmdW5jdGlvbiBj aGFuZ2VCYWNrZ3JvdW5kQ29sb3Iob2JqLGNvbG9yKXsKCWRvY3VtZW50LmdldEVs ZW1lbnRCeUlkKG9iaikuc3R5bGUuYmFja2dyb3VuZD1jb2xvcjsKfQoKZnVuY3Rp b24gY2hhbmdlQmFja2dyb3VuZENvbG9yT2JqKG9iaixjb2xvcil7CglvYmouc3R5 bGUuYmFja2dyb3VuZD1jb2xvcjsKfQoKZnVuY3Rpb24gY2hhbmdlQ29sb3Iob2Jq LGNvbG9yKXsKCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9iaikuc3R5bGUuY29s b3I9Y29sb3I7Cn0KCmZ1bmN0aW9uIGNoYW5nZUNvbG9yT2JqKG9iaixjb2xvcil7 CglvYmouc3R5bGUuY29sb3I9Y29sb3I7Cn0KCi8vTm9zIGRldnVlbHZlIGxhIHBv c2ljaW9uIFhZIGRlbCBzY3JvbGwKZnVuY3Rpb24gZ2V0U2Nyb2xsWFkoKSB7CiAg dmFyIHNjck9mWCA9IDAsIHNjck9mWSA9IDA7CiAgaWYoIHR5cGVvZiggd2luZG93 LnBhZ2VZT2Zmc2V0ICkgPT0gJ251bWJlcicgKSB7CiAgICAvL05ldHNjYXBlIGNv bXBsaWFudAogICAgc2NyT2ZZID0gd2luZG93LnBhZ2VZT2Zmc2V0OwogICAgc2Ny T2ZYID0gd2luZG93LnBhZ2VYT2Zmc2V0OwogIH0gZWxzZSBpZiggZG9jdW1lbnQu Ym9keSAmJiAoIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5i b2R5LnNjcm9sbFRvcCApICkgewogICAgLy9ET00gY29tcGxpYW50CiAgICBzY3JP ZlkgPSBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDsKICAgIHNjck9mWCA9IGRvY3Vt ZW50LmJvZHkuc2Nyb2xsTGVmdDsKICB9IGVsc2UgaWYoIGRvY3VtZW50LmRvY3Vt ZW50RWxlbWVudCAmJiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxM ZWZ0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgKSApIHsK ICAgIC8vSUU2IHN0YW5kYXJkcyBjb21wbGlhbnQgbW9kZQogICAgc2NyT2ZZID0g ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsKICAgIHNjck9mWCA9 IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwogIH0KICByZXR1 cm4gWyBzY3JPZlgsIHNjck9mWSBdOwp9Cg== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=cookie.js Content-Type: application/javascript; charset=ISO-8859-15; name=cookie.js Content-Location: http://www.ine.es/menus/js/cookie.js Content-Transfer-Encoding: Base64 dmFyIENvb2tpZU5hbWU9IklORV9BQ0NFU0lCSUxJREFEIjsKdmFyIENvb2tpZU51 bURheXM9MzY1OwoKZnVuY3Rpb24gY3JlYXRlQ29va2llKG5hbWUsdmFsdWUsZGF5 cykgewogIGlmIChkYXlzKSB7CiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7CiAg ICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkrKGRheXMqMjQqNjAqNjAqMTAw MCkpOwogICAgdmFyIGV4cGlyZXMgPSAiOyBleHBpcmVzPSIrZGF0ZS50b0dNVFN0 cmluZygpOwogIH0KICBlbHNlIGV4cGlyZXMgPSAiIjsKCQogIGRvY3VtZW50LmNv b2tpZSA9IG5hbWUrIj0iK3ZhbHVlK2V4cGlyZXMrIjsgcGF0aD0vIjsKCn0KCgoK ZnVuY3Rpb24gcmVhZENvb2tpZShuYW1lKSB7CiAgdmFyIG5hbWVFUSA9IG5hbWUg KyAiPSI7CiAgdmFyIGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7Cgog IGZvcih2YXIgaT0wO2kgPCBjYS5sZW5ndGg7aSsrKSB7CiAgICB2YXIgYyA9IGNh W2ldOwogICAgd2hpbGUgKGMuY2hhckF0KDApPT0nICcpIGMgPSBjLnN1YnN0cmlu ZygxLGMubGVuZ3RoKTsKICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PSAwKSBy ZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgfQog IHJldHVybiBudWxsOwp9 ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=images.js Content-Type: application/javascript; charset=ISO-8859-15; name=images.js Content-Location: http://www.ine.es/menus/js/images.js Content-Transfer-Encoding: Base64 ZnVuY3Rpb24gcHJlbG9hZChpbWdPYmosaW1nU3JjKSB7CglpZiAoZG9jdW1lbnQu aW1hZ2VzKSB7CgkJZXZhbChpbWdPYmorJyA9IG5ldyBJbWFnZSgpJykKCQlldmFs KGltZ09iaisnLnNyYyA9ICInK2ltZ1NyYysnIicpCgl9Cn0KCmZ1bmN0aW9uIGNo YW5nZUltYWdlKGxheWVyLGltZ05hbWUsaW1nT2JqKSB7CglpZiAoZG9jdW1lbnQu aW1hZ2VzKSB7CgkJaWYgKGRvY3VtZW50LmxheWVycyAmJiBsYXllciE9bnVsbCkg ewoJCQlldmFsKCd2YXIgdz1kb2N1bWVudC4nK2xheWVyKycuZG9jdW1lbnQuaW1h Z2VzWyInK2ltZ05hbWUrJyJdLndpZHRoJykKCQkJZXZhbCgndmFyIGg9ZG9jdW1l bnQuJytsYXllcisnLmRvY3VtZW50LmltYWdlc1siJytpbWdOYW1lKyciXS5oZWln aHQnKQoJCQlldmFsKCdkb2N1bWVudC4nK2xheWVyKycuZG9jdW1lbnQuaW1hZ2Vz WyInK2ltZ05hbWUrJyJdLnNyYyA9ICcraW1nT2JqKycuc3JjJykKCQkJZXZhbCgn ZG9jdW1lbnQuJytsYXllcisnLmRvY3VtZW50LmltYWdlc1siJytpbWdOYW1lKyci XS53aWR0aCA9IHcnKQoJCQlldmFsKCdkb2N1bWVudC4nK2xheWVyKycuZG9jdW1l bnQuaW1hZ2VzWyInK2ltZ05hbWUrJyJdLmhlaWdodCA9IGgnKQoJCQl9CgkJZWxz ZSB7CgkJCXZhciB3PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGltZ05hbWUpLndp ZHRoOwoJCQl2YXIgaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbWdOYW1lKS5o ZWlnaHQ7CQoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbWdOYW1lKS5zcmMg PSBldmFsKGltZ09iaisiLnNyYyIpOwoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZChpbWdOYW1lKS53aWR0aCA9IHc7CgkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlk KGltZ05hbWUpLmhlaWdodCA9IGg7CgkJCX0KCX0KfQoKZnVuY3Rpb24gcmVtb3Zl SW1hZ2UobGF5ZXIsaW1nTmFtZSl7CglpZiAoZG9jdW1lbnQuaW1hZ2VzKSB7CgkJ aWYgKGRvY3VtZW50LmxheWVycyAmJiBsYXllciE9bnVsbCkgCgkJCWV2YWwoJ2Rv Y3VtZW50LicrbGF5ZXIrJy5kb2N1bWVudC5pbWFnZXNbIicraW1nTmFtZSsnIl0u d2lkdGggPSAwJyk7CgkJZWxzZSBkb2N1bWVudC5pbWFnZXNbaW1nTmFtZV0ud2lk dGggPSAwOwoJfQp9CgpmdW5jdGlvbiBjYW1iaWFJbWFnZW4oaW1nTmFtZSxpbWdP YmopewoJY2hhbmdlSW1hZ2UobnVsbCxpbWdOYW1lLGltZ09iaik7Cn0KCmZ1bmN0 aW9uIGNhbWJpYUltYWdlblRhYmxlKGltZ05hbWUsaW1nT2JqLGhhbmQpewoJaWYg KGhhbmQ9PTEpCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW1nTmFtZSkuc3R5 bGUuY3Vyc29yPSdoYW5kJwoJZWxzZSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChp bWdOYW1lKS5zdHlsZS5jdXJzb3I9J2F1dG8nCgkJZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoaW1nTmFtZSkuc3R5bGUuYmFja2dyb3VuZCA9ICJ1cmwoIiArIGV2YWwo aW1nT2JqICsgIi5zcmMiKSArIikiOwkKfSAKCmZ1bmN0aW9uIGVsaW1pbmFJbWFn ZW4oaW1nTmFtZSl7CglyZW1vdmVJbWFnZShudWxsLGltZ05hbWUpOwp9CgpmdW5j dGlvbiBtb3N0cmFyTGF5ZXIobGF5ZXJOYW1lKSB7CglpZiAoZG9jdW1lbnQubGF5 ZXJzKSAKICAgICAgICAgICAgbGF5ZXJOYW1lLnZpc2liaWxpdHk9InZpc2libGUi OyAgICAgCgllbHNlIAogICAgICAgICAgICBsYXllck5hbWUudmlzaWJpbGl0eT0i dmlzaWJsZSI7ICAKICB9CgpmdW5jdGlvbiBvY3VsdGFyTGF5ZXIobGF5ZXJOYW1l KXsKCWlmIChkb2N1bWVudC5sYXllcnMpIAogICAgICAgICAgICBsYXllck5hbWUu dmlzaWJpbGl0eSA9ImhpZGUiOyAKCWVsc2UgCiAgICAgICAgICAgIGxheWVyTmFt ZS52aXNpYmlsaXR5ID0gImhpZGRlbiIKICAgIAp9Cg== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=loading.js Content-Type: application/javascript; charset=ISO-8859-15; name=loading.js Content-Location: http://www.ine.es/menus/js/loading.js Content-Transfer-Encoding: Base64 Ly9wcm9jZWRlbW9zIGEgcXVlIHNlIG11ZXZhIGxhIGNhcGEgY3VhbmRvIHNlIG11 ZXZlIGVsIHNjcm9sbAoKZnVuY3Rpb24gTW92ZUxvYWRpbmcoKSB7CglpZiAoZG9j dW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkRJVmxvYWRpbmciKSE9bnVsbCl7CgkJdmFy IHZhbG9yVG9wPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3Jv bGxUb3AsZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApICsicHgiOwoJCXZhciB2YWxv ckxlZnQ9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExl ZnQsZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSArInB4IjsKCQlkb2N1bWVudC5n ZXRFbGVtZW50QnlJZCgiRElWbG9hZGluZyIpLnN0eWxlLnRvcD12YWxvclRvcDsg CQkKCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiRElWbG9hZGluZyIpLnN0eWxl LmxlZnQ9dmFsb3JMZWZ0OyAJCgkJaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlk KCJpZnJhbWVsb2FkaW5nIikhPW51bGwpewkKCQkJZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoImlmcmFtZWxvYWRpbmciKS5zdHlsZS5sZWZ0PXZhbG9yTGVmdDsJCQoJ CQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaWZyYW1lbG9hZGluZyIpLnN0eWxl LnRvcD12YWxvclRvcDsJCgkJCX0KICAgfQp9CgpNZW51TG9hZF9QcmV2U2Nyb2xs ID0gKHdpbmRvdy5vbnNjcm9sbCkgPyB3aW5kb3cub25zY3JvbGwgOiAgbmV3IEZ1 bmN0aW9uOwoKd2luZG93Lm9uc2Nyb2xsICA9IGZ1bmN0aW9uKCl7CglzZXRUaW1l b3V0KCJNb3ZlTG9hZGluZygpIiwxMCk7CglNZW51TG9hZF9QcmV2U2Nyb2xsKCk7 Cn07CgpmdW5jdGlvbiBvY3VsdGFyTG9hZGluZygpewoJc2V0VGltZW91dCgib2N1 bHRhckxvYWRpbmdJbnN0YW50KCkiLDEpOwp9CnZhciBNZW51X1RpcG9Mb2FkaW5n PTA7CmZ1bmN0aW9uIG9jdWx0YXJMb2FkaW5nSW5zdGFudCgpewoKaWYgKE1lbnVf VGlwb0xvYWRpbmc9PTAgfHwgTWVudV9UaXBvTG9hZGluZz09Mil7CglpZiAoZG9j dW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkRJVmxvYWRpbmciKSE9bnVsbCkKCQlkb2N1 bWVudC5nZXRFbGVtZW50QnlJZCgiRElWbG9hZGluZyIpLnN0eWxlLmRpc3BsYXk9 J25vbmUnOwoJaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpZnJhbWVsb2Fk aW5nIikhPW51bGwpCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImlmcmFtZWxv YWRpbmciKS5zdHlsZS5kaXNwbGF5PSdub25lJzsJCQoJaWYgKGRvY3VtZW50Lmdl dEVsZW1lbnRCeUlkKCJsb2FkaW5nIikhPW51bGwpCgkJZG9jdW1lbnQuZ2V0RWxl bWVudEJ5SWQoImxvYWRpbmciKS5zdHlsZS52aXNpYmlsaXR5PSdoaWRkZW4nOwkJ Cn0KaWYgKE1lbnVfVGlwb0xvYWRpbmc9PTAgfHwgTWVudV9UaXBvTG9hZGluZz09 MSkKCWlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZGluZyIpIT1udWxs KQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkaW5nIikuc3R5bGUudmlz aWJpbGl0eT0naGlkZGVuJzsKfQoKZnVuY3Rpb24gbW9zdHJhckxvYWRpbmcodGlw byl7CgoJTWVudV9UaXBvTG9hZGluZz10aXBvOwogICAgdmFyIGRlID0gZG9jdW1l bnQuZG9jdW1lbnRFbGVtZW50OwogICAgdmFyIGggPSB3aW5kb3cuaW5uZXJIZWln aHQgfHwgc2VsZi5pbm5lckhlaWdodCB8fCAoZGUmJmRlLmNsaWVudEhlaWdodCkg fHwgZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7CgkJCgl2YXIgdmFsb3JUb3A9 TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCxkb2N1 bWVudC5ib2R5LnNjcm9sbFRvcCkgKyJweCI7Cgl2YXIgdmFsb3JXaWR0aCA9IE1h dGgubWF4KGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsZG9jdW1lbnQuZG9jdW1l bnRFbGVtZW50LmNsaWVudFdpZHRoKSA7Cgl2YXIgdmFsb3JIZWlnaHQgPSBNYXRo Lm1heChkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxkb2N1bWVudC5kb2N1bWVu dEVsZW1lbnQuY2xpZW50SGVpZ2h0KTsKCWlmKE1lbnVfVGlwb0xvYWRpbmchPTEp CQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJUYWJsZWxvYWRpbmciKS5zdHls ZS5oZWlnaHQ9aCArJ3B4JzsJCglpZihNZW51X1RpcG9Mb2FkaW5nPT0wKXsJCgkK CWlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiRElWbG9hZGluZyIpIT1udWxs KXsKCQkgaWYodGlwbyE9MSl7CgkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJE SVZsb2FkaW5nIikuc3R5bGUudG9wPXZhbG9yVG9wOyAJCQoJCQlkb2N1bWVudC5n ZXRFbGVtZW50QnlJZCgiRElWbG9hZGluZyIpLnN0eWxlLmhlaWdodD1oICsncHgn OwoJCSAJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkRJVmxvYWRpbmciKS5zdHls ZS5kaXNwbGF5PSdibG9jayc7CQoJCQoJCSAJaWYgKGRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCJpZnJhbWVsb2FkaW5nIikhPW51bGwpewoJCQkJZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQoImlmcmFtZWxvYWRpbmciKS5zdHlsZS50b3A9dmFsb3JUb3A7 CQoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImlmcmFtZWxvYWRpbmciKS5z dHlsZS5kaXNwbGF5PSdibG9jayc7CQkJCQkKCQkJCWRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCJpZnJhbWVsb2FkaW5nIikuc3R5bGUud2lkdGg9dmFsb3JXaWR0aCAg KyAncHgnOwkJCQkJCQoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImlmcmFt ZWxvYWRpbmciKS5zdHlsZS5oZWlnaHQ9dmFsb3JIZWlnaHQrICdweCc7CQkJCQkK CQkJfQoJCX0KCWlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZGluZyIp IT1udWxsKQoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZGluZyIpLnN0 eWxlLnZpc2liaWxpdHk9J3Zpc2libGUnOwoJCQkKCX0KCQoJfWVsc2V7CQoJCWlm ICgodGlwbyE9MSkgJiYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJESVZsb2Fk aW5nIikhPW51bGwpKXsKCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkRJVmxv YWRpbmciKS5zdHlsZS50b3A9dmFsb3JUb3A7IAkJCgkJCWRvY3VtZW50LmdldEVs ZW1lbnRCeUlkKCJESVZsb2FkaW5nIikuc3R5bGUuaGVpZ2h0PWgrJ3B4JzsJCQkJ CQkJCgkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJESVZsb2FkaW5nIikuc3R5 bGUuZGlzcGxheT0nYmxvY2snOwkJCQkKCQkJaWYgKGRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCJpZnJhbWVsb2FkaW5nIikhPW51bGwpewkJCgkJCQlkb2N1bWVudC5n ZXRFbGVtZW50QnlJZCgiaWZyYW1lbG9hZGluZyIpLnN0eWxlLnRvcD12YWxvclRv cDsJCgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaWZyYW1lbG9hZGluZyIp LnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsJCgkJCQlkb2N1bWVudC5nZXRFbGVtZW50 QnlJZCgiaWZyYW1lbG9hZGluZyIpLnN0eWxlLndpZHRoPXZhbG9yV2lkdGggICsg J3B4JzsJCQkJCQkKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpZnJhbWVs b2FkaW5nIikuc3R5bGUuaGVpZ2h0PXZhbG9ySGVpZ2h0KyAncHgnOwkJCQkJCQkJ CgkJCQl9CgkJCX0KCQlpZiAoKHRpcG8hPTIpICYmKGRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCJsb2FkaW5nIikhPW51bGwpKQoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoImxvYWRpbmciKS5zdHlsZS52aXNpYmlsaXR5PSd2aXNpYmxlJzsKCX0K fQoKZnVuY3Rpb24gbW9zdHJhckxvYWRpbmdUaW1lKHRpbWUsdGlwbyl7Cgltb3N0 cmFyTG9hZGluZyh0aXBvKTsKCXNldFRpbWVvdXQoIm9jdWx0YXJMb2FkaW5nSW5z dGFudCgpIiwgdGltZSoxMDAwKTsKfQoKZnVuY3Rpb24gTW9zdGFyTG9hZGluZygp ewoJbW9zdHJhckxvYWRpbmcoKTsKfQoKLy9EZWJpZG8gYSBwb3NpYmxlcyBsbGFt YWRhcyBhbCBqcyBxdWUgcHJvdm9jYXJpYSB1biBidWNsZSBpbmZpbml0byBzaSBz ZSBsbGFtYSBhIGpzIG1hcyBkZSB1bmEgdmV6IGhhYmlsaXRhbW9zIHVuIGNvbnRy b2wKCmlmKCBpc05hTihsb2FkaW5nX2NvbnRyb2wpKXsKCXZhciBsb2FkaW5nX2Nv bnRyb2w9MTsKCU1lbnVfTG9hZGluZ19PdGhlckxvYWQgPSAod2luZG93Lm9ubG9h ZCkgPyB3aW5kb3cub25sb2FkIDogIG5ldyBGdW5jdGlvbjsKCQoJd2luZG93Lm9u bG9hZCAgPSBmdW5jdGlvbigpewoKCQlzZXRUaW1lb3V0KCJvY3VsdGFyTG9hZGlu Z0luc3RhbnQoKSIsMTAwKTsKCQlNZW51X0xvYWRpbmdfT3RoZXJMb2FkKCk7Cgl9 Owp9Cgo= ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=swfobject.js Content-Type: application/javascript; charset=ISO-8859-15; name=swfobject.js Content-Location: http://www.ine.es/menus/js/swfobject.js Content-Transfer-Encoding: Base64 LyoqCiAqIFNXRk9iamVjdCB2MS41OiBGbGFzaCBQbGF5ZXIgZGV0ZWN0aW9uIGFu ZCBlbWJlZCAtIGh0dHA6Ly9ibG9nLmRlY29uY2VwdC5jb20vc3dmb2JqZWN0Lwog KgogKiBTV0ZPYmplY3QgaXMgKGMpIDIwMDcgR2VvZmYgU3RlYXJucyBhbmQgaXMg cmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9w ZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKgogKi8KaWYo dHlwZW9mIGRlY29uY2VwdCA9PSAidW5kZWZpbmVkIikgdmFyIGRlY29uY2VwdCA9 IG5ldyBPYmplY3QoKTsKaWYodHlwZW9mIGRlY29uY2VwdC51dGlsID09ICJ1bmRl ZmluZWQiKSBkZWNvbmNlcHQudXRpbCA9IG5ldyBPYmplY3QoKTsKaWYodHlwZW9m IGRlY29uY2VwdC5TV0ZPYmplY3RVdGlsID09ICJ1bmRlZmluZWQiKSBkZWNvbmNl cHQuU1dGT2JqZWN0VXRpbCA9IG5ldyBPYmplY3QoKTsKZGVjb25jZXB0LlNXRk9i amVjdCA9IGZ1bmN0aW9uKHN3ZiwgaWQsIHcsIGgsIHZlciwgYywgcXVhbGl0eSwg eGlSZWRpcmVjdFVybCwgcmVkaXJlY3RVcmwsIGRldGVjdEtleSkgewoJaWYgKCFk b2N1bWVudC5nZXRFbGVtZW50QnlJZCkgeyByZXR1cm47IH0KCXRoaXMuREVURUNU X0tFWSA9IGRldGVjdEtleSA/IGRldGVjdEtleSA6ICdkZXRlY3RmbGFzaCc7Cgl0 aGlzLnNraXBEZXRlY3QgPSBkZWNvbmNlcHQudXRpbC5nZXRSZXF1ZXN0UGFyYW1l dGVyKHRoaXMuREVURUNUX0tFWSk7Cgl0aGlzLnBhcmFtcyA9IG5ldyBPYmplY3Qo KTsKCXRoaXMudmFyaWFibGVzID0gbmV3IE9iamVjdCgpOwoJdGhpcy5hdHRyaWJ1 dGVzID0gbmV3IEFycmF5KCk7CglpZihzd2YpIHsgdGhpcy5zZXRBdHRyaWJ1dGUo J3N3ZicsIHN3Zik7IH0KCWlmKGlkKSB7IHRoaXMuc2V0QXR0cmlidXRlKCdpZCcs IGlkKTsgfQoJaWYodykgeyB0aGlzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB3KTsg fQoJaWYoaCkgeyB0aGlzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgaCk7IH0KCWlm KHZlcikgeyB0aGlzLnNldEF0dHJpYnV0ZSgndmVyc2lvbicsIG5ldyBkZWNvbmNl cHQuUGxheWVyVmVyc2lvbih2ZXIudG9TdHJpbmcoKS5zcGxpdCgiLiIpKSk7IH0K CXRoaXMuaW5zdGFsbGVkVmVyID0gZGVjb25jZXB0LlNXRk9iamVjdFV0aWwuZ2V0 UGxheWVyVmVyc2lvbigpOwoJaWYgKCF3aW5kb3cub3BlcmEgJiYgZG9jdW1lbnQu YWxsICYmIHRoaXMuaW5zdGFsbGVkVmVyLm1ham9yID4gNykgewoJCS8vIG9ubHkg YWRkIHRoZSBvbnVubG9hZCBjbGVhbnVwIGlmIHRoZSBGbGFzaCBQbGF5ZXIgdmVy c2lvbiBzdXBwb3J0cyBFeHRlcm5hbCBJbnRlcmZhY2UgYW5kIHdlIGFyZSBpbiBJ RQoJCWRlY29uY2VwdC5TV0ZPYmplY3QuZG9QcmVwVW5sb2FkID0gdHJ1ZTsKCX0K CWlmKGMpIHsgdGhpcy5hZGRQYXJhbSgnYmdjb2xvcicsIGMpOyB9Cgl2YXIgcSA9 IHF1YWxpdHkgPyBxdWFsaXR5IDogJ2hpZ2gnOwoJdGhpcy5hZGRQYXJhbSgncXVh bGl0eScsIHEpOwoJdGhpcy5zZXRBdHRyaWJ1dGUoJ3VzZUV4cHJlc3NJbnN0YWxs JywgZmFsc2UpOwoJdGhpcy5zZXRBdHRyaWJ1dGUoJ2RvRXhwcmVzc0luc3RhbGwn LCBmYWxzZSk7Cgl2YXIgeGlyID0gKHhpUmVkaXJlY3RVcmwpID8geGlSZWRpcmVj dFVybCA6IHdpbmRvdy5sb2NhdGlvbjsKCXRoaXMuc2V0QXR0cmlidXRlKCd4aVJl ZGlyZWN0VXJsJywgeGlyKTsKCXRoaXMuc2V0QXR0cmlidXRlKCdyZWRpcmVjdFVy bCcsICcnKTsKCWlmKHJlZGlyZWN0VXJsKSB7IHRoaXMuc2V0QXR0cmlidXRlKCdy ZWRpcmVjdFVybCcsIHJlZGlyZWN0VXJsKTsgfQp9CmRlY29uY2VwdC5TV0ZPYmpl Y3QucHJvdG90eXBlID0gewoJdXNlRXhwcmVzc0luc3RhbGw6IGZ1bmN0aW9uKHBh dGgpIHsKCQl0aGlzLnhpU1dGUGF0aCA9ICFwYXRoID8gImV4cHJlc3NpbnN0YWxs LnN3ZiIgOiBwYXRoOwoJCXRoaXMuc2V0QXR0cmlidXRlKCd1c2VFeHByZXNzSW5z dGFsbCcsIHRydWUpOwoJfSwKCXNldEF0dHJpYnV0ZTogZnVuY3Rpb24obmFtZSwg dmFsdWUpewoJCXRoaXMuYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlOwoJfSwKCWdl dEF0dHJpYnV0ZTogZnVuY3Rpb24obmFtZSl7CgkJcmV0dXJuIHRoaXMuYXR0cmli dXRlc1tuYW1lXTsKCX0sCglhZGRQYXJhbTogZnVuY3Rpb24obmFtZSwgdmFsdWUp ewoJCXRoaXMucGFyYW1zW25hbWVdID0gdmFsdWU7Cgl9LAoJZ2V0UGFyYW1zOiBm dW5jdGlvbigpewoJCXJldHVybiB0aGlzLnBhcmFtczsKCX0sCglhZGRWYXJpYWJs ZTogZnVuY3Rpb24obmFtZSwgdmFsdWUpewoJCXRoaXMudmFyaWFibGVzW25hbWVd ID0gdmFsdWU7Cgl9LAoJZ2V0VmFyaWFibGU6IGZ1bmN0aW9uKG5hbWUpewoJCXJl dHVybiB0aGlzLnZhcmlhYmxlc1tuYW1lXTsKCX0sCglnZXRWYXJpYWJsZXM6IGZ1 bmN0aW9uKCl7CgkJcmV0dXJuIHRoaXMudmFyaWFibGVzOwoJfSwKCWdldFZhcmlh YmxlUGFpcnM6IGZ1bmN0aW9uKCl7CgkJdmFyIHZhcmlhYmxlUGFpcnMgPSBuZXcg QXJyYXkoKTsKCQl2YXIga2V5OwoJCXZhciB2YXJpYWJsZXMgPSB0aGlzLmdldFZh cmlhYmxlcygpOwoJCWZvcihrZXkgaW4gdmFyaWFibGVzKXsKCQkJdmFyaWFibGVQ YWlyc1t2YXJpYWJsZVBhaXJzLmxlbmd0aF0gPSBrZXkgKyI9IisgdmFyaWFibGVz W2tleV07CgkJfQoJCXJldHVybiB2YXJpYWJsZVBhaXJzOwoJfSwKCWdldFNXRkhU TUw6IGZ1bmN0aW9uKCkgewoJCXZhciBzd2ZOb2RlID0gIiI7CgkJaWYgKG5hdmln YXRvci5wbHVnaW5zICYmIG5hdmlnYXRvci5taW1lVHlwZXMgJiYgbmF2aWdhdG9y Lm1pbWVUeXBlcy5sZW5ndGgpIHsgLy8gbmV0c2NhcGUgcGx1Z2luIGFyY2hpdGVj dHVyZQoJCQlpZiAodGhpcy5nZXRBdHRyaWJ1dGUoImRvRXhwcmVzc0luc3RhbGwi KSkgewoJCQkJdGhpcy5hZGRWYXJpYWJsZSgiTU1wbGF5ZXJUeXBlIiwgIlBsdWdJ biIpOwoJCQkJdGhpcy5zZXRBdHRyaWJ1dGUoJ3N3ZicsIHRoaXMueGlTV0ZQYXRo KTsKCQkJfQoJCQlzd2ZOb2RlID0gJzxlbWJlZCB0eXBlPSJhcHBsaWNhdGlvbi94 LXNob2Nrd2F2ZS1mbGFzaCIgc3JjPSInKyB0aGlzLmdldEF0dHJpYnV0ZSgnc3dm JykgKyciIHdpZHRoPSInKyB0aGlzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSArJyIg aGVpZ2h0PSInKyB0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykgKyciIHN0eWxl PSInKyB0aGlzLmdldEF0dHJpYnV0ZSgnc3R5bGUnKSArJyInOwoJCQlzd2ZOb2Rl ICs9ICcgaWQ9IicrIHRoaXMuZ2V0QXR0cmlidXRlKCdpZCcpICsnIiBuYW1lPSIn KyB0aGlzLmdldEF0dHJpYnV0ZSgnaWQnKSArJyIgJzsKCQkJdmFyIHBhcmFtcyA9 IHRoaXMuZ2V0UGFyYW1zKCk7CgkJCSBmb3IodmFyIGtleSBpbiBwYXJhbXMpeyBz d2ZOb2RlICs9IFtrZXldICsnPSInKyBwYXJhbXNba2V5XSArJyIgJzsgfQoJCQl2 YXIgcGFpcnMgPSB0aGlzLmdldFZhcmlhYmxlUGFpcnMoKS5qb2luKCImIik7CgkJ CSBpZiAocGFpcnMubGVuZ3RoID4gMCl7IHN3Zk5vZGUgKz0gJ2ZsYXNodmFycz0i JysgcGFpcnMgKyciJzsgfQoJCQlzd2ZOb2RlICs9ICcvPic7CgkJfSBlbHNlIHsg Ly8gUEMgSUUKCQkJaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCJkb0V4cHJlc3NJbnN0 YWxsIikpIHsKCQkJCXRoaXMuYWRkVmFyaWFibGUoIk1NcGxheWVyVHlwZSIsICJB Y3RpdmVYIik7CgkJCQl0aGlzLnNldEF0dHJpYnV0ZSgnc3dmJywgdGhpcy54aVNX RlBhdGgpOwoJCQl9CgkJCXN3Zk5vZGUgPSAnPG9iamVjdCBpZD0iJysgdGhpcy5n ZXRBdHRyaWJ1dGUoJ2lkJykgKyciIGNsYXNzaWQ9ImNsc2lkOkQyN0NEQjZFLUFF NkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIgd2lkdGg9IicrIHRoaXMuZ2V0QXR0 cmlidXRlKCd3aWR0aCcpICsnIiBoZWlnaHQ9IicrIHRoaXMuZ2V0QXR0cmlidXRl KCdoZWlnaHQnKSArJyIgc3R5bGU9IicrIHRoaXMuZ2V0QXR0cmlidXRlKCdzdHls ZScpICsnIj4nOwoJCQlzd2ZOb2RlICs9ICc8cGFyYW0gbmFtZT0ibW92aWUiIHZh bHVlPSInKyB0aGlzLmdldEF0dHJpYnV0ZSgnc3dmJykgKyciIC8+JzsKCQkJdmFy IHBhcmFtcyA9IHRoaXMuZ2V0UGFyYW1zKCk7CgkJCWZvcih2YXIga2V5IGluIHBh cmFtcykgewoJCQkgc3dmTm9kZSArPSAnPHBhcmFtIG5hbWU9IicrIGtleSArJyIg dmFsdWU9IicrIHBhcmFtc1trZXldICsnIiAvPic7CgkJCX0KCQkJdmFyIHBhaXJz ID0gdGhpcy5nZXRWYXJpYWJsZVBhaXJzKCkuam9pbigiJiIpOwoJCQlpZihwYWly cy5sZW5ndGggPiAwKSB7c3dmTm9kZSArPSAnPHBhcmFtIG5hbWU9ImZsYXNodmFy cyIgdmFsdWU9IicrIHBhaXJzICsnIiAvPic7fQoJCQlzd2ZOb2RlICs9ICI8L29i amVjdD4iOwoJCX0KCQlyZXR1cm4gc3dmTm9kZTsKCX0sCgl3cml0ZTogZnVuY3Rp b24oZWxlbWVudElkKXsKCQlpZih0aGlzLmdldEF0dHJpYnV0ZSgndXNlRXhwcmVz c0luc3RhbGwnKSkgewoJCQkvLyBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBk byBhbiBleHByZXNzIGluc3RhbGwKCQkJdmFyIGV4cHJlc3NJbnN0YWxsUmVxVmVy ID0gbmV3IGRlY29uY2VwdC5QbGF5ZXJWZXJzaW9uKFs2LDAsNjVdKTsKCQkJaWYg KHRoaXMuaW5zdGFsbGVkVmVyLnZlcnNpb25Jc1ZhbGlkKGV4cHJlc3NJbnN0YWxs UmVxVmVyKSAmJiAhdGhpcy5pbnN0YWxsZWRWZXIudmVyc2lvbklzVmFsaWQodGhp cy5nZXRBdHRyaWJ1dGUoJ3ZlcnNpb24nKSkpIHsKCQkJCXRoaXMuc2V0QXR0cmli dXRlKCdkb0V4cHJlc3NJbnN0YWxsJywgdHJ1ZSk7CgkJCQl0aGlzLmFkZFZhcmlh YmxlKCJNTXJlZGlyZWN0VVJMIiwgZXNjYXBlKHRoaXMuZ2V0QXR0cmlidXRlKCd4 aVJlZGlyZWN0VXJsJykpKTsKCQkJCWRvY3VtZW50LnRpdGxlID0gZG9jdW1lbnQu dGl0bGUuc2xpY2UoMCwgNDcpICsgIiAtIEZsYXNoIFBsYXllciBJbnN0YWxsYXRp b24iOwoJCQkJdGhpcy5hZGRWYXJpYWJsZSgiTU1kb2N0aXRsZSIsIGRvY3VtZW50 LnRpdGxlKTsKCQkJfQoJCX0KCQlpZih0aGlzLnNraXBEZXRlY3QgfHwgdGhpcy5n ZXRBdHRyaWJ1dGUoJ2RvRXhwcmVzc0luc3RhbGwnKSB8fCB0aGlzLmluc3RhbGxl ZFZlci52ZXJzaW9uSXNWYWxpZCh0aGlzLmdldEF0dHJpYnV0ZSgndmVyc2lvbicp KSl7CgkJCXZhciBuID0gKHR5cGVvZiBlbGVtZW50SWQgPT0gJ3N0cmluZycpID8g ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKSA6IGVsZW1lbnRJZDsK CQkJbi5pbm5lckhUTUwgPSB0aGlzLmdldFNXRkhUTUwoKTsKCQkJcmV0dXJuIHRy dWU7CgkJfWVsc2V7CgkJCWlmKHRoaXMuZ2V0QXR0cmlidXRlKCdyZWRpcmVjdFVy bCcpICE9ICIiKSB7CgkJCQlkb2N1bWVudC5sb2NhdGlvbi5yZXBsYWNlKHRoaXMu Z2V0QXR0cmlidXRlKCdyZWRpcmVjdFVybCcpKTsKCQkJfQoJCX0KCQlyZXR1cm4g ZmFsc2U7Cgl9Cn0KCi8qIC0tLS0gZGV0ZWN0aW9uIGZ1bmN0aW9ucyAtLS0tICov CmRlY29uY2VwdC5TV0ZPYmplY3RVdGlsLmdldFBsYXllclZlcnNpb24gPSBmdW5j dGlvbigpewoJdmFyIFBsYXllclZlcnNpb24gPSBuZXcgZGVjb25jZXB0LlBsYXll clZlcnNpb24oWzAsMCwwXSk7CglpZihuYXZpZ2F0b3IucGx1Z2lucyAmJiBuYXZp Z2F0b3IubWltZVR5cGVzLmxlbmd0aCl7CgkJdmFyIHggPSBuYXZpZ2F0b3IucGx1 Z2luc1siU2hvY2t3YXZlIEZsYXNoIl07CgkJaWYoeCAmJiB4LmRlc2NyaXB0aW9u KSB7CgkJCVBsYXllclZlcnNpb24gPSBuZXcgZGVjb25jZXB0LlBsYXllclZlcnNp b24oeC5kZXNjcmlwdGlvbi5yZXBsYWNlKC8oW2EtekEtWl18XHMpKy8sICIiKS5y ZXBsYWNlKC8oXHMrcnxccytiWzAtOV0rKS8sICIuIikuc3BsaXQoIi4iKSk7CgkJ fQoJfWVsc2UgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVz ZXJBZ2VudC5pbmRleE9mKCJXaW5kb3dzIENFIikgPj0gMCl7IC8vIGlmIFdpbmRv d3MgQ0UKCQl2YXIgYXhvID0gMTsKCQl2YXIgY291bnRlciA9IDM7CgkJd2hpbGUo YXhvKSB7CgkJCXRyeSB7CgkJCQljb3VudGVyKys7CgkJCQlheG8gPSBuZXcgQWN0 aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guIisgY291 bnRlcik7Ci8vCQkJCWRvY3VtZW50LndyaXRlKCJwbGF5ZXIgdjogIisgY291bnRl cik7CgkJCQlQbGF5ZXJWZXJzaW9uID0gbmV3IGRlY29uY2VwdC5QbGF5ZXJWZXJz aW9uKFtjb3VudGVyLDAsMF0pOwoJCQl9IGNhdGNoIChlKSB7CgkJCQlheG8gPSBu dWxsOwoJCQl9CgkJfQoJfSBlbHNlIHsgLy8gV2luIElFIChub24gbW9iaWxlKQoJ CS8vIGRvIG1pbm9yIHZlcnNpb24gbG9va3VwIGluIElFLCBidXQgYXZvaWQgZnA2 IGNyYXNoaW5nIGlzc3VlcwoJCS8vIHNlZSBodHRwOi8vYmxvZy5kZWNvbmNlcHQu Y29tLzIwMDYvMDEvMTEvZ2V0dmFyaWFibGUtc2V0dmFyaWFibGUtY3Jhc2gtaW50 ZXJuZXQtZXhwbG9yZXItZmxhc2gtNi8KCQl0cnl7CgkJCXZhciBheG8gPSBuZXcg QWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIp OwoJCX1jYXRjaChlKXsKCQkJdHJ5IHsKCQkJCXZhciBheG8gPSBuZXcgQWN0aXZl WE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNiIpOwoJCQkJ UGxheWVyVmVyc2lvbiA9IG5ldyBkZWNvbmNlcHQuUGxheWVyVmVyc2lvbihbNiww LDIxXSk7CgkJCQlheG8uQWxsb3dTY3JpcHRBY2Nlc3MgPSAiYWx3YXlzIjsgLy8g ZXJyb3IgaWYgcGxheWVyIHZlcnNpb24gPCA2LjAuNDcgKHRoYW5rcyB0byBNaWNo YWVsIFdpbGxpYW1zIEAgQWRvYmUgZm9yIHRoaXMgY29kZSkKCQkJfSBjYXRjaChl KSB7CgkJCQlpZiAoUGxheWVyVmVyc2lvbi5tYWpvciA9PSA2KSB7CgkJCQkJcmV0 dXJuIFBsYXllclZlcnNpb247CgkJCQl9CgkJCX0KCQkJdHJ5IHsKCQkJCWF4byA9 IG5ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFz aCIpOwoJCQl9IGNhdGNoKGUpIHt9CgkJfQoJCWlmIChheG8gIT0gbnVsbCkgewoJ CQlQbGF5ZXJWZXJzaW9uID0gbmV3IGRlY29uY2VwdC5QbGF5ZXJWZXJzaW9uKGF4 by5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKS5zcGxpdCgiICIpWzFdLnNwbGl0KCIs IikpOwoJCX0KCX0KCXJldHVybiBQbGF5ZXJWZXJzaW9uOwp9CmRlY29uY2VwdC5Q bGF5ZXJWZXJzaW9uID0gZnVuY3Rpb24oYXJyVmVyc2lvbil7Cgl0aGlzLm1ham9y ID0gYXJyVmVyc2lvblswXSAhPSBudWxsID8gcGFyc2VJbnQoYXJyVmVyc2lvblsw XSkgOiAwOwoJdGhpcy5taW5vciA9IGFyclZlcnNpb25bMV0gIT0gbnVsbCA/IHBh cnNlSW50KGFyclZlcnNpb25bMV0pIDogMDsKCXRoaXMucmV2ID0gYXJyVmVyc2lv blsyXSAhPSBudWxsID8gcGFyc2VJbnQoYXJyVmVyc2lvblsyXSkgOiAwOwp9CmRl Y29uY2VwdC5QbGF5ZXJWZXJzaW9uLnByb3RvdHlwZS52ZXJzaW9uSXNWYWxpZCA9 IGZ1bmN0aW9uKGZ2KXsKCWlmKHRoaXMubWFqb3IgPCBmdi5tYWpvcikgcmV0dXJu IGZhbHNlOwoJaWYodGhpcy5tYWpvciA+IGZ2Lm1ham9yKSByZXR1cm4gdHJ1ZTsK CWlmKHRoaXMubWlub3IgPCBmdi5taW5vcikgcmV0dXJuIGZhbHNlOwoJaWYodGhp cy5taW5vciA+IGZ2Lm1pbm9yKSByZXR1cm4gdHJ1ZTsKCWlmKHRoaXMucmV2IDwg ZnYucmV2KSByZXR1cm4gZmFsc2U7CglyZXR1cm4gdHJ1ZTsKfQovKiAtLS0tIGdl dCB2YWx1ZSBvZiBxdWVyeSBzdHJpbmcgcGFyYW0gLS0tLSAqLwpkZWNvbmNlcHQu dXRpbCA9IHsKCWdldFJlcXVlc3RQYXJhbWV0ZXI6IGZ1bmN0aW9uKHBhcmFtKSB7 CgkJdmFyIHEgPSBkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2ggfHwgZG9jdW1lbnQu bG9jYXRpb24uaGFzaDsKCQlpZiAocGFyYW0gPT0gbnVsbCkgeyByZXR1cm4gcTsg fQoJCWlmKHEpIHsKCQkJdmFyIHBhaXJzID0gcS5zdWJzdHJpbmcoMSkuc3BsaXQo IiYiKTsKCQkJZm9yICh2YXIgaT0wOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHsK CQkJCWlmIChwYWlyc1tpXS5zdWJzdHJpbmcoMCwgcGFpcnNbaV0uaW5kZXhPZigi PSIpKSA9PSBwYXJhbSkgewoJCQkJCXJldHVybiBwYWlyc1tpXS5zdWJzdHJpbmco KHBhaXJzW2ldLmluZGV4T2YoIj0iKSsxKSk7CgkJCQl9CgkJCX0KCQl9CgkJcmV0 dXJuICIiOwoJfQp9Ci8qIGZpeCBmb3IgdmlkZW8gc3RyZWFtaW5nIGJ1ZyAqLwpk ZWNvbmNlcHQuU1dGT2JqZWN0VXRpbC5jbGVhbnVwU1dGcyA9IGZ1bmN0aW9uKCkg ewoJdmFyIG9iamVjdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgi T0JKRUNUIik7Cglmb3IgKHZhciBpID0gb2JqZWN0cy5sZW5ndGggLSAxOyBpID49 IDA7IGktLSkgewoJCW9iamVjdHNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsK CQlmb3IgKHZhciB4IGluIG9iamVjdHNbaV0pIHsKCQkJaWYgKHR5cGVvZiBvYmpl Y3RzW2ldW3hdID09ICdmdW5jdGlvbicpIHsKCQkJCW9iamVjdHNbaV1beF0gPSBm dW5jdGlvbigpe307CgkJCX0KCQl9Cgl9Cn0KLy8gZml4ZXMgYnVnIGluIHNvbWUg ZnA5IHZlcnNpb25zIHNlZSBodHRwOi8vYmxvZy5kZWNvbmNlcHQuY29tLzIwMDYv MDcvMjgvc3dmb2JqZWN0LTE0My1yZWxlYXNlZC8KaWYgKGRlY29uY2VwdC5TV0ZP YmplY3QuZG9QcmVwVW5sb2FkKSB7CglpZiAoIWRlY29uY2VwdC51bmxvYWRTZXQp IHsKCQlkZWNvbmNlcHQuU1dGT2JqZWN0VXRpbC5wcmVwVW5sb2FkID0gZnVuY3Rp b24oKSB7CgkJCV9fZmxhc2hfdW5sb2FkSGFuZGxlciA9IGZ1bmN0aW9uKCl7fTsK CQkJX19mbGFzaF9zYXZlZFVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpe307CgkJ CXdpbmRvdy5hdHRhY2hFdmVudCgib251bmxvYWQiLCBkZWNvbmNlcHQuU1dGT2Jq ZWN0VXRpbC5jbGVhbnVwU1dGcyk7CgkJfQoJCXdpbmRvdy5hdHRhY2hFdmVudCgi b25iZWZvcmV1bmxvYWQiLCBkZWNvbmNlcHQuU1dGT2JqZWN0VXRpbC5wcmVwVW5s b2FkKTsKCQlkZWNvbmNlcHQudW5sb2FkU2V0ID0gdHJ1ZTsKCX0KfQovKiBhZGQg ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgaWYgbmVlZGVkIChtb2JpbGUgSUUgPCA1 KSAqLwppZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkICYmIGRvY3VtZW50LmFs bCkgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCA9IGZ1bmN0aW9uKGlkKSB7IHJl dHVybiBkb2N1bWVudC5hbGxbaWRdOyB9fQoKLyogYWRkIHNvbWUgYWxpYXNlcyBm b3IgZWFzZSBvZiB1c2UvYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KdmFyIGdl dFF1ZXJ5UGFyYW1WYWx1ZSA9IGRlY29uY2VwdC51dGlsLmdldFJlcXVlc3RQYXJh bWV0ZXI7CnZhciBGbGFzaE9iamVjdCA9IGRlY29uY2VwdC5TV0ZPYmplY3Q7IC8v IGZvciBsZWdhY3kgc3VwcG9ydAp2YXIgU1dGT2JqZWN0ID0gZGVjb25jZXB0LlNX Rk9iamVjdDsKCgoKCgpmdW5jdGlvbiBnZXRGbGFzaE1vdmllT2JqZWN0KG1vdmll TmFtZSkKewogIGlmICh3aW5kb3cuZG9jdW1lbnRbbW92aWVOYW1lXSkgCiAgewog ICAgICByZXR1cm4gd2luZG93LmRvY3VtZW50W21vdmllTmFtZV07CiAgfQogIGlm IChuYXZpZ2F0b3IuYXBwTmFtZS5pbmRleE9mKCJNaWNyb3NvZnQgSW50ZXJuZXQi KT09LTEpCiAgewogICAgaWYgKGRvY3VtZW50LmVtYmVkcyAmJiBkb2N1bWVudC5l bWJlZHNbbW92aWVOYW1lXSkKICAgICAgcmV0dXJuIGRvY3VtZW50LmVtYmVkc1tt b3ZpZU5hbWVdOyAKICB9CiAgZWxzZSAvLyBpZiAobmF2aWdhdG9yLmFwcE5hbWUu aW5kZXhPZigiTWljcm9zb2Z0IEludGVybmV0IikhPS0xKQogIHsKICAgIHJldHVy biBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb3ZpZU5hbWUpOwogIH0KfQ== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=cambiotamano.js Content-Type: application/javascript; charset=ISO-8859-15; name=cambiotamano.js Content-Location: http://www.ine.es/menus/js/cambiotamano.js Content-Transfer-Encoding: Base64 dmFyIGluYz0wLjE7CnZhciB0YW1pbmljaWFsPScwLjkwZW0nOwoKCmZ1bmN0aW9u IHRhbWFubyh2YWxvcikgeyAKCQoJaWYgKHZhbG9yPT0wKQoJIGRvY3VtZW50LmJv ZHkuc3R5bGUuZm9udFNpemU9dGFtaW5pY2lhbDsKCSBlbHNlewoJdGFtID1kb2N1 bWVudC5ib2R5LnN0eWxlLmZvbnRTaXplOwoJdGFtPXRhbS5zdWJzdHIoMCx0YW0u aW5kZXhPZigiZW0iKSk7CglpZiAodGFtPT0iIikKCSAgIHRhbT0xOwoJIHRhbT0g TWF0aC5yb3VuZCgocGFyc2VGbG9hdCh0YW0pKyhpbmMqdmFsb3IpKSoxMDApLzEw MDsKICBpZiAodGFtIDwgMC41KQogIAkJdGFtPTAuNTsKICBkb2N1bWVudC5ib2R5 LnN0eWxlLmZvbnRTaXplPXRhbSArJ2VtJzsKICAJfQp9CgoKCmZ1bmN0aW9uIEJ1 c2NhZG9yX0J1c2NhcihvcGNpb24pewoJaWYoQnVzY2Fkb3JfVmFsaWRhKG9wY2lv bikpCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhYmVjZXJhQnVzY2Fkb3Ii KS5zdWJtaXQoKTsJCn0JCQoJCQpmdW5jdGlvbiBCdXNjYWRvcl9WYWxpZGEob3Bj aW9uKXsKICAgLyoKICAgYfFhZGUgcGFyYW1ldHJvcyBwYXJhIGxhcyBlc3RhZGlz dGljYXMKICAgKi8KICAgQnVzY2Fkb3I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo ImNhYmVjZXJhQnVzY2Fkb3IiKTsKICAgdnVlbHRhPXRydWU7CiAgICBzd2l0Y2gg KG9wY2lvbil7CiAgICAgIGNhc2UgMTogCiAgICAgICAgICAgICBCdXNjYWRvci5h Y3Rpb249SE1fcmFpel93ZWIrJy9idXNjYXIvYWR2YW5jZWRTZWFyY2guZG8/TD0w JzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgICAg ICAgLyoKCQkJIGHxYWRpbW9zIGxhIHVybCBjb21wbGV0YSBwYXJhIHF1ZSBubyBw aWVyZGEgbG9zIHN0cnV0cyBsYSB1cmwgZGVsIHNlcnZpZG9yIGRlIGJ1c3F1ZWRh CgkJCSAqLwogICAgICAgICAgICAgQnVzY2Fkb3IuYWN0aW9uPUhNX3JhaXpfd2Vi KycvYnVzY2FyL3NlYXJjaFJlc3VsdHMuZG8/TD0wJzsKICAJICAJICBpZiAoQnVz Y2Fkb3Iuc2VhcmNoU3RyaW5nLnZhbHVlPT0nJykKICAgICAgICAgICAgICB2dWVs dGE9ZmFsc2U7CgkJICBlbHNlICBpZiAoQnVzY2Fkb3Iuc2VhcmNoU3RyaW5nLnZh bHVlLnJlcGxhY2UoIC9eXHMrL2csICIiKT09IiIpewogICAgICAgICAgICAgICAg ICB2dWVsdGE9ZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgYnJl YWs7CiAgICB9CglpZiAoIXZ1ZWx0YSkKCQlhbGVydCgnRXMgbmVjZXNhcmlvIGlu dHJvZHVjaXIgYWxn+m4gdGVybWlubyBwYXJhIGJ1c2NhcicpOwogICByZXR1cm4g dnVlbHRhCn0= ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=logoINE.gif Content-Type: image/gif; name=logoINE.gif Content-Location: http://www.ine.es/menus/img/logoINE.gif Content-Transfer-Encoding: Base64 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 LNuyLvuyMBuznkEUNFuzNgh7szhbszMQEAA7 ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=a1.gif Content-Type: image/gif; name=a1.gif Content-Location: http://www.ine.es/menus/img/a1.gif Content-Transfer-Encoding: Base64 R0lGODlhDwAPAPcKAPTb2+m6v8FDYLwzUsdUbd2YpO7KzdJ2idiHlqsAKQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAPAA8AAAg+ABUIHEiwoMGDCBMqXMiw oUODABIgYIggwQCGBAQkAKDQAIKKExMeSEDyIkIABARqDHAwYoICAUgmYPlQYEAA Ow== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=a2.gif Content-Type: image/gif; name=a2.gif Content-Location: http://www.ine.es/menus/img/a2.gif Content-Transfer-Encoding: Base64 R0lGODlhDwAOAPcAALYiRNiHlvTb292YpMdUbeOpstJ2ic1le+7KzcFDYLwzUum6 v7ERN/ns6KsAKf/99gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACwAAAAADwAOAAAIUQAfCBxIsKDBgwgTGjwAQOFABg4WOBwA 0YDDAwEcNEwoIIAABw4KJPT4IIEDAgkBgATJoMHBAgMENoAYwGADBS4FEtCY8yFI BA8MrHTQ0+HAgAA7 ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=a3.gif Content-Type: image/gif; name=a3.gif Content-Location: http://www.ine.es/menus/img/a3.gif Content-Transfer-Encoding: Base64 R0lGODlhDwAPALMPANiHlrERN+m6v81le8FDYO7KzbwzUvTb27YiRNJ2ieOpssdU bd2YpPns6KsAKf/99iH5BAEAAA8ALAAAAAAPAA8AAARF8MlJqwWhWYsc25TgOAQ4 LaNTmIdBjIkJAMyYgYYWjJ+lDJLEyLAhCCSF1IpySDkdQMqgJ6k5bhKAo9LokDTO qOh5NFUiADs= ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=altavoz.gif Content-Type: image/gif; name=altavoz.gif Content-Location: http://www.ine.es/menus/img/altavoz.gif Content-Transfer-Encoding: Base64 R0lGODlhDwAPAIABAJ4bNP///yH5BAEAAAEALAAAAAAPAA8AAAIjjI+pywbQ3IHs BUrTw9JtK2UfeJXeN5nI1mUrxFVpdLn0zRQAOw== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=btnsobre.gif Content-Type: image/gif; name=btnsobre.gif Content-Location: http://www.ine.es/menus/img/btnsobre.gif Content-Transfer-Encoding: Base64 R0lGODlhEQAPAJEBAJkzM//99v/iowAAACH5BAEAAAEALAAAAAARAA8AAAIpjI+p y70Ao5wGiIuziFV7Hlje110ThAHlmKlhOrUra64nus20e/cOUwAAOw== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=btnFavoritos.gif Content-Type: image/gif; name=btnFavoritos.gif Content-Location: http://www.ine.es/menus/img/btnFavoritos.gif Content-Transfer-Encoding: Base64 R0lGODlhEQAPAJECAKsAKf/io//99gAAACH5BAEAAAIALAAAAAARAA8AAAIwlG+A yxDKooNxzWqDpgj4rz2fJzjhiW6ll4ZfZ6KkJGPxyXUb+9DiqsrMgLmVhFIAADs= ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=btnMap.gif Content-Type: image/gif; name=btnMap.gif Content-Location: http://www.ine.es/menus/img/btnMap.gif Content-Transfer-Encoding: Base64 R0lGODlhEQAPAJECAP/io6sAKf/99gAAACH5BAEAAAIALAAAAAARAA8AAAIrlI+p Ft2bApgBIkntwaBq4TwfM15fiIrmtragC4oOo4Idc9se7c3xXjoUAAA7 ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=printer.gif Content-Type: image/gif; name=printer.gif Content-Location: http://www.ine.es/jaxi/imagenes/printer.gif Content-Transfer-Encoding: Base64 R0lGODlhEwATAOZTAAABAAEABAAABAADAP//+n6HggYIBQAABYOChwcIAwQABAQA BwIBB/v/+gUACQADBQgEBQMBDAkABgYIA3x9gQoAAHyCgnp+gQQAAP//+IaFipKA gP/9+/n482dALxIHAHSGhggDCQEBAYaLh32CfPv7+fz/+4yHhHp6ev309ff4+gAB BH2AhQMAAAYABomIhAYABXqFhwYPFHx+eQAFAn1+efb58oGJfv/8+nt9ifP4+3p8 e4SEhAMCCPX/94tybnSAgP/99v//+3mweWKpb3k5OYCEhQYIB/b//IWFg////4aH i3t8dn9+eoSGhfv5/P+wAf/io//Udf/43AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH5BAEAAFMALAAAAAATABMAAAengFOCg4SFhoeIiYQIFEaK hDpLKkolPCiPUyM+DVFRBEIAAIhNLzadGUEdCYg1JFJMBDgcUSYDhzsnUrpSPxsp SDRQRxiEUFC6REO7TiDGuh+DOcbHUh5FUs67FYMxnVHZ1LtSMINA3p3Z4lIRgywW 59/qEKKEFwU33uE9ClIThQedksyIx8CBLgEiDLkI0UlDAAG6AqxI9OSBjHgGbGGa skBCi40gAwEAOw== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=calen.gif Content-Type: image/gif; name=calen.gif Content-Location: http://www.ine.es/inebase/img/calen.gif Content-Transfer-Encoding: Base64 R0lGODlhZAARAJEAAJkzM////////wAAACH5BAUUAAIALAAAAABkABEAAAKRhI+p y+0Powu02ouz3rz7nxngSJamKZ7qyo6penAADM4t9aKVHdI3mQNqYrjdC2ER8YiB mW0ZdPFK0521Wcwutc/rMYtFVV1D4hMZDm9x5iR4/InWelrwVe3N69NA+Lze1JUm iBfIZUfo1yEnNaX09gU56IRopLh4+aO5KZPJ+QnKCDr6KUp6eiOhusra6mpQAAA7 ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=pub.gif Content-Type: image/gif; name=pub.gif Content-Location: http://www.ine.es/inebase/img/pub.gif Content-Transfer-Encoding: Base64 R0lGODlhZAARAJEAAJkzM////////wAAACH5BAUUAAIALAAAAABkABEAAAKihI+p y+0Powu02ouz3rz7nxngSJamKZ7qyo7phnAANgf1erfeq9359bPphiReqFLzUWav JJJ3sESXT990CTXSgkAk9ZtyCsdjJVlsTnvPMq70qgbLt2Hat7xOPHfutTQPiNc1 98dm2NeH1RGU1DgnJlj3GChYmag1CMRE1XR3ZbOJZQY6apXzGZJItMqa2voK26Ma S8uCWYtrK7HL2+v7C1AAADs= ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=logoinebase.gif Content-Type: image/gif; name=logoinebase.gif Content-Location: http://www.ine.es/jaxi/imagenes/logoinebase.gif Content-Transfer-Encoding: Base64 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 ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=jquery.tablesorter.js Content-Type: text/javascript; charset=ISO-8859-15; name=jquery.tablesorter.js Content-Location: http://www.ine.es/jaxi/js/jquery.tablesorter.js Content-Transfer-Encoding: 8bit /* * * TableSorter 2.0 - Client-side table sorting with ease! * Version 2.0.3 * @requires jQuery v1.2.3 * * Copyright (c) 2007 Christian Bach * Examples and docs at: http://tablesorter.com * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * */ /** * * @description Create a sortable table with multi-column sorting capabilitys * * @example $('table').tablesorter(); * @desc Create a simple tablesorter interface. * * @example $('table').tablesorter({ sortList:[[0,0],[1,0]] }); * @desc Create a tablesorter interface and sort on the first and secound column in ascending order. * * @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } }); * @desc Create a tablesorter interface and disableing the first and secound column headers. * * @example $('table').tablesorter({ 0: {sorter:"integer"}, 1: {sorter:"currency"} }); * @desc Create a tablesorter interface and set a column parser for the first and secound column. * * * @param Object settings An object literal containing key/value pairs to provide optional settings. * * @option String cssHeader (optional) A string of the class name to be appended to sortable tr elements in the thead of the table. * Default value: "header" * * @option String cssAsc (optional) A string of the class name to be appended to sortable tr elements in the thead on a ascending sort. * Default value: "headerSortUp" * * @option String cssDesc (optional) A string of the class name to be appended to sortable tr elements in the thead on a descending sort. * Default value: "headerSortDown" * * @option String sortInitialOrder (optional) A string of the inital sorting order can be asc or desc. * Default value: "asc" * * @option String sortMultisortKey (optional) A string of the multi-column sort key. * Default value: "shiftKey" * * @option String textExtraction (optional) A string of the text-extraction method to use. * For complex html structures inside td cell set this option to "complex", * on large tables the complex option can be slow. * Default value: "simple" * * @option Object headers (optional) An array containing the forces sorting rules. * This option let's you specify a default sorting rule. * Default value: null * * @option Array sortList (optional) An array containing the forces sorting rules. * This option let's you specify a default sorting rule. * Default value: null * * @option Array sortForce (optional) An array containing forced sorting rules. * This option let's you specify a default sorting rule, which is prepended to user-selected rules. * Default value: null * * @option Array sortAppend (optional) An array containing forced sorting rules. * This option let's you specify a default sorting rule, which is appended to user-selected rules. * Default value: null * * @option Boolean widthFixed (optional) Boolean flag indicating if tablesorter should apply fixed widths to the table columns. * This is usefull when using the pager companion plugin. * This options requires the dimension jquery plugin. * Default value: false * * @option Boolean cancelSelection (optional) Boolean flag indicating if tablesorter should cancel selection of the table headers text. * Default value: true * * @option Boolean debug (optional) Boolean flag indicating if tablesorter should display debuging information usefull for development. * * @type jQuery * * @name tablesorter * * @cat Plugins/Tablesorter * * @author Christian Bach/christian.bach@polyester.se */ (function($) { $.extend({ tablesorter: new function() { var parsers = [], widgets = []; this.defaults = { cssHeader: "header", cssAsc: "headerSortUp", cssDesc: "headerSortDown", sortInitialOrder: "asc", sortMultiSortKey: "shiftKey", sortForce: null, sortAppend: null, textExtraction: "simple", parsers: {}, widgets: [], widgetZebra: {css: ["even","odd"]}, headers: {}, widthFixed: false, cancelSelection: true, sortList: [], headerList: [], dateFormat: "en", mil:',', decimal: '.', debug: false }; /* debuging utils */ function benchmark(s,d) { log(s + "," + (new Date().getTime() - d.getTime()) + "ms"); } this.benchmark = benchmark; function log(s) { if (typeof console != "undefined" && typeof console.debug != "undefined") { console.log(s); } else { alert(s); } } /* parsers utils */ function buildParserCache(table,$headers) { if(table.config.debug) { var parsersDebug = ""; } var rows = table.tBodies[0].rows; if(table.tBodies[0].rows[0]) { var list = [], cells = rows[0].cells, l = cells.length; for (var i=0;i < l; i++) { var p = false; if($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter) ) { p = getParserById($($headers[i]).metadata().sorter); } else if((table.config.headers[i] && table.config.headers[i].sorter)) { p = getParserById(table.config.headers[i].sorter); } if(!p) { p = detectParserForColumn(table,cells[i]); } if(table.config.debug) { parsersDebug += "column:" + i + " parser:" +p.id + "\n"; } list.push(p); } } if(table.config.debug) { log(parsersDebug); } return list; }; function detectParserForColumn(table,node) { var l = parsers.length; for(var i=1; i < l; i++) { if(parsers[i].is($.trim(getElementText(table.config,node)),table,node)) { return parsers[i]; } } // 0 is always the generic parser (text) return parsers[0]; } function getParserById(name) { var l = parsers.length; for(var i=0; i < l; i++) { if(parsers[i].id.toLowerCase() == name.toLowerCase()) { return parsers[i]; } } return false; } /* utils */ function buildCache(table) { if(table.config.debug) { var cacheTime = new Date(); } var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0, totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0, parsers = table.config.parsers, cache = {row: [], normalized: []}; for (var i=0;i < totalRows; ++i) { /** Add the table data to main data array */ var c = table.tBodies[0].rows[i], cols = []; cache.row.push($(c)); for(var j=0; j < totalCells; ++j) { cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j])); } cols.push(i); // add position for rowCache cache.normalized.push(cols); cols = null; }; if(table.config.debug) { benchmark("Building cache for " + totalRows + " rows:", cacheTime); } return cache; }; function getElementText(config,node) { if(!node) return ""; var t = ""; if(config.textExtraction == "simple") { if(node.childNodes[0] && node.childNodes[0].hasChildNodes()) { t = node.childNodes[0].innerHTML; } else { t = node.innerHTML; } } else { if(typeof(config.textExtraction) == "function") { t = config.textExtraction(node); } else { t = $(node).text(); } } return t; } function appendToTable(table,cache) { if(table.config.debug) {var appendTime = new Date()} var c = cache, r = c.row, n= c.normalized, totalRows = n.length, checkCell = (n[0].length-1), tableBody = $(table.tBodies[0]), rows = []; for (var i=0;i < totalRows; i++) { rows.push(r[n[i][checkCell]]); if(!table.config.appender) { var o = r[n[i][checkCell]]; var l = o.length; for(var j=0; j < l; j++) { tableBody[0].appendChild(o[j]); } //tableBody.append(r[n[i][checkCell]]); } } if(table.config.appender) { table.config.appender(table,rows); } rows = null; if(table.config.debug) { benchmark("Rebuilt table:", appendTime); } //apply table widgets applyWidget(table); // trigger sortend setTimeout(function() { $(table).trigger("sortEnd"); },0); }; function buildHeaders(table) { if(table.config.debug) { var time = new Date(); } var meta = ($.metadata) ? true : false, tableHeadersRows = []; for(var i = 0; i < table.tHead.rows.length; i++) { tableHeadersRows[i]=0; }; $tableHeaders = $("thead th",table); $tableHeaders.each(function(index) { this.count = 0; this.column = index; this.order = formatSortingOrder(table.config.sortInitialOrder); if(checkHeaderMetadata(this) || checkHeaderOptions(table,index)) this.sortDisabled = true; if(!this.sortDisabled) { $(this).addClass(table.config.cssHeader); } // add cell to headerList table.config.headerList[index]= this; }); if(table.config.debug) { benchmark("Built headers:", time); log($tableHeaders); } return $tableHeaders; }; function checkCellColSpan(table, rows, row) { var arr = [], r = table.tHead.rows, c = r[row].cells; for(var i=0; i < c.length; i++) { var cell = c[i]; if ( cell.colSpan > 1) { arr = arr.concat(checkCellColSpan(table, headerArr,row++)); } else { if(table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row+1])) { arr.push(cell); } //headerArr[row] = (i+row); } } return arr; }; function checkHeaderMetadata(cell) { if(($.metadata) && ($(cell).metadata().sorter === false)) { return true; }; return false; } function checkHeaderOptions(table,i) { if((table.config.headers[i]) && (table.config.headers[i].sorter === false)) { return true; }; return false; } function applyWidget(table) { var c = table.config.widgets; var l = c.length; for(var i=0; i < l; i++) { getWidgetById(c[i]).format(table); } } function getWidgetById(name) { var l = widgets.length; for(var i=0; i < l; i++) { if(widgets[i].id.toLowerCase() == name.toLowerCase() ) { return widgets[i]; } } }; function formatSortingOrder(v) { if(typeof(v) != "Number") { i = (v.toLowerCase() == "desc") ? 1 : 0; } else { i = (v == (0 || 1)) ? v : 0; } return i; } function isValueInArray(v, a) { var l = a.length; for(var i=0; i < l; i++) { if(a[i][0] == v) { return true; } } return false; } function setHeadersCss(table,$headers, list, css) { // remove all header information $headers.removeClass(css[0]).removeClass(css[1]); var h = []; $headers.each(function(offset) { if(!this.sortDisabled) { h[this.column] = $(this); } }); var l = list.length; for(var i=0; i < l; i++) { h[list[i][0]].addClass(css[list[i][1]]); } } function fixColumnWidth(table,$headers) { var c = table.config; if(c.widthFixed) { var colgroup = $(''); $("tr:first td",table.tBodies[0]).each(function() { colgroup.append($('').css('width',$(this).width())); }); $(table).prepend(colgroup); }; } function updateHeaderSortCount(table,sortList) { var c = table.config, l = sortList.length; for(var i=0; i < l; i++) { var s = sortList[i], o = c.headerList[s[0]]; o.count = s[1]; o.count++; } } /* sorting methods */ function multisort(table,sortList,cache) { if(table.config.debug) { var sortTime = new Date(); } var dynamicExp = "var sortWrapper = function(a,b) {", l = sortList.length; for(var i=0; i < l; i++) { var c = sortList[i][0]; var order = sortList[i][1]; var s = (getCachedSortType(table.config.parsers,c) == "text") ? ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? "sortNumeric" : "sortNumericDesc"); var e = "e" + i; dynamicExp += "var " + e + " = " + s + "(a[" + c + "],b[" + c + "]); "; dynamicExp += "if(" + e + ") { return " + e + "; } "; dynamicExp += "else { "; } // if value is the same keep orignal order var orgOrderCol = cache.normalized[0].length - 1; dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];"; for(var i=0; i < l; i++) { dynamicExp += "}; "; } dynamicExp += "return 0; "; dynamicExp += "}; "; eval(dynamicExp); cache.normalized.sort(sortWrapper); if(table.config.debug) { benchmark("Sorting on " + sortList.toString() + " and dir " + order+ " time:", sortTime); } return cache; }; function sortText(a,b) { return ((a < b) ? -1 : ((a > b) ? 1 : 0)); }; function sortTextDesc(a,b) { return ((b < a) ? -1 : ((b > a) ? 1 : 0)); }; function sortNumeric(a,b) { return a-b; }; function sortNumericDesc(a,b) { return b-a; }; function getCachedSortType(parsers,i) { return parsers[i].type; }; /* public methods */ this.construct = function(settings) { return this.each(function() { if(!this.tHead || !this.tBodies) return; var $this, $document,$headers, cache, config, shiftDown = 0, sortOrder; this.config = {}; config = $.extend(this.config, $.tablesorter.defaults, settings); // store common expression for speed $this = $(this); // build headers $headers = buildHeaders(this); // try to auto detect column type, and store in tables config this.config.parsers = buildParserCache(this,$headers); // build the cache for the tbody cells cache = buildCache(this); // get the css class names, could be done else where. var sortCSS = [config.cssDesc,config.cssAsc]; // fixate columns if the users supplies the fixedWidth option fixColumnWidth(this); // apply event handling to headers // this is to big, perhaps break it out? $headers.click(function(e) { $this.trigger("sortStart"); var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0; if(!this.sortDisabled && totalRows > 0) { // store exp, for speed var $cell = $(this); // get current column index var i = this.column; // get current column sort order this.order = this.count++ % 2; //Para cambiar la ordenación //this.order = ++this.count % 2; // user only whants to sort on one column if(!e[config.sortMultiSortKey]) { // flush the sort list config.sortList = []; if(config.sortForce != null) { var a = config.sortForce; for(var j=0; j < a.length; j++) { if(a[j][0] != i) { config.sortList.push(a[j]); } } } // add column to sort list config.sortList.push([i,this.order]); // multi column sorting } else { // the user has clicked on an all ready sortet column. if(isValueInArray(i,config.sortList)) { // revers the sorting direction for all tables. for(var j=0; j < config.sortList.length; j++) { var s = config.sortList[j], o = config.headerList[s[0]]; if(s[0] == i) { o.count = s[1]; o.count++; s[1] = o.count % 2; } } } else { // add column to sort list array config.sortList.push([i,this.order]); } }; setTimeout(function() { //set css for headers setHeadersCss($this[0],$headers,config.sortList,sortCSS); appendToTable($this[0],multisort($this[0],config.sortList,cache)); },1); // stop normal event by returning false return false; } // cancel selection }).mousedown(function() { if(config.cancelSelection) { this.onselectstart = function() {return false}; return false; } }); // apply easy methods that trigger binded events $this.bind("update",function() { // rebuild parsers. this.config.parsers = buildParserCache(this,$headers); // rebuild the cache map cache = buildCache(this); }).bind("sorton",function(e,list) { $(this).trigger("sortStart"); config.sortList = list; // update and store the sortlist var sortList = config.sortList; // update header count index updateHeaderSortCount(this,sortList); //set css for headers setHeadersCss(this,$headers,sortList,sortCSS); // sort the table and append it to the dom appendToTable(this,multisort(this,sortList,cache)); }).bind("appendCache",function() { appendToTable(this,cache); }).bind("applyWidgetId",function(e,id) { getWidgetById(id).format(this); }).bind("applyWidgets",function() { // apply widgets applyWidget(this); }); if($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) { config.sortList = $(this).metadata().sortlist; } // if user has supplied a sort list to constructor. if(config.sortList.length > 0) { $this.trigger("sorton",[config.sortList]); } // apply widgets applyWidget(this); }); }; this.addParser = function(parser) { var l = parsers.length, a = true; for(var i=0; i < l; i++) { if(parsers[i].id.toLowerCase() == parser.id.toLowerCase()) { a = false; } } if(a) { parsers.push(parser); }; }; this.addWidget = function(widget) { widgets.push(widget); }; this.formatFloat = function(s) { //s=s.replace(this.defaults.mil,''); var i = parseFloat(s); return (isNaN(i)) ? 0 : i; }; this.formatInt = function(s) { //s=s.replace(this.defaults.mil,''); var i = parseInt(s); return (isNaN(i)) ? 0 : i; }; this.isDigit = function(s,config) { var DECIMAL = '\\' + config.decimal; var exp = '/(^[+]?0(' + DECIMAL +'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)' + DECIMAL +'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*' + DECIMAL +'0+$)/'; return RegExp(exp).test($.trim(s)); }; this.clearTableBody = function(table) { if($.browser.msie) { function empty() { while ( this.firstChild ) this.removeChild( this.firstChild ); } empty.apply(table.tBodies[0]); } else { table.tBodies[0].innerHTML = ""; } }; } }); // extend plugin scope $.fn.extend({ tablesorter: $.tablesorter.construct }); var ts = $.tablesorter; // add default parsers ts.addParser({ id: "digit", is: function(s,table) { var c = table.config; return $.tablesorter.isDigit(s,c); }, format: function(s) { return $.tablesorter.formatFloat(s); }, type: "numeric" }); ts.addParser({ id: "commaDigit", is: function(s, table) { var c = table.config; return $.tablesorter.isDigit(s.replace(/[,.]/g, ""), c); }, format: function(s) { return $.tablesorter.formatFloat(s.replace(/[,.]/g, "")); }, type: "numeric" }); ts.addParser({ id: "text", is: function(s) { return true; }, format: function(s){ //return $.trim(s.toLowerCase()); return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9]/g),"")); }, type: "text" }); ts.addParser({ id: "currency", is: function(s) { return /^[£$€?.]/.test(s); }, format: function(s) { return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),"")); }, type: "numeric" }); ts.addParser({ id: "ipAddress", is: function(s) { return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s); }, format: function(s) { var a = s.split("."), r = "", l = a.length; for(var i = 0; i < l; i++) { var item = a[i]; if(item.length == 2) { r += "0" + item; } else { r += item; } } return $.tablesorter.formatFloat(r); }, type: "numeric" }); ts.addParser({ id: "url", is: function(s) { return /^(https?|ftp|file):\/\/$/.test(s); }, format: function(s) { return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),'')); }, type: "text" }); ts.addParser({ id: "isoDate", is: function(s) { return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s); }, format: function(s) { return $.tablesorter.formatFloat((s != "") ? new Date(s.replace(new RegExp(/-/g),"/")).getTime() : "0"); }, type: "numeric" }); ts.addParser({ id: "percent", is: function(s) { return /\%$/.test($.trim(s)); }, format: function(s) { return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),"")); }, type: "numeric" }); ts.addParser({ id: "usLongDate", is: function(s) { return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)); }, format: function(s) { return $.tablesorter.formatFloat(new Date(s).getTime()); }, type: "numeric" }); ts.addParser({ id: "shortDate", is: function(s) { return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s); }, format: function(s,table) { var c = table.config; s = s.replace(/\-/g,"/"); if(c.dateFormat == "us") { // reformat the string in ISO format s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2"); } else if(c.dateFormat == "uk") { //reformat the string in ISO format s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1"); } else if(c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") { s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3"); } return $.tablesorter.formatFloat(new Date(s).getTime()); }, type: "numeric" }); ts.addParser({ id: "time", is: function(s) { return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s); }, format: function(s) { return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime()); }, type: "numeric" }); ts.addParser({ id: "metadata", is: function(s) { return false; }, format: function(s,table,cell) { var c = table.config, p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName; return $(cell).metadata()[p]; }, type: "numeric" }); // add default widgets ts.addWidget({ id: "zebra", format: function(table) { if(table.config.debug) { var time = new Date(); } $("tr:visible",table.tBodies[0]) .filter(':even') .removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]) .end().filter(':odd') .removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]); if(table.config.debug) { $.tablesorter.benchmark("Applying Zebra widget", time); } } }); })(jQuery); ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=mnu_epf.jpg Content-Type: image/jpeg; name=mnu_epf.jpg Content-Location: http://www.ine.es/images/mnu_epf.jpg Content-Transfer-Encoding: Base64 /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAICAgICAgICAgICAgICAwQDAgIDBAUE BAQEBAUGBQUFBQUFBgYHBwgHBwYJCQoKCQkMDAwMDAwMDAwMDAwMDAz/2wBDAQMD AwUEBQkGBgkNCwkLDQ8ODg4ODw8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAz/wAARCACYAGQDAREAAhEBAxEB/8QAHgAAAwADAQEAAwAA AAAAAAAABgcIBAUJAwIAAQr/xABFEAABAwMCBAMFBQQHBgcAAAABAgMEBQYRABIH EyExFCJBCBUyUWEjQnGBkRYkUqElQ2JygqKxCTRzwdHhFzNTY4Wy8P/EABwBAAID AQEBAQAAAAAAAAAAAAMFAgQGAQAHCP/EADgRAAEDAgMGAQoHAQADAAAAAAEAAgME ERIhMQUTIkFRYXEGFCMygZGhsdHwFTNCUmLB4XIHgqL/2gAMAwEAAhEDEQA/AGHe UpRl2qAPgqoKnM/xR3R/PWCAyX1e/EumXDVwucOrMWVEn3W0P0yNbym/Kb4D5L5t V5Tv8T81z/8Ab2eMJy0JZB2iY2F/rqpUN9MPBNqN9qb/ANlF0Nx2pUeuxUh1TT69 xSgeYJPfQwyyOZHEGyNRLkW7RaNEaU834dscvPYhXz1nXvxSFYmSndUSnLNKa7VG BdVOlxEKXIqmXHGvmojTmifiZnyT/Zs5MeE8l43FS66TDnGmym2WWF73AnIG78NX WzsOV0d7HNsSr84C8IW6BbtPrtzxjJuSpoYfaprxw3AjfG3uKe7rgOSPughPfOlN XUhzsI5JlFRNewF6M+J/F6g0qqt0aoSq2y675H1x2cstox2V0PxAY+IaqulLtEwh iDVKdcptxcYKJXqixVoibboTvKhMLKkc8xkfabEqAyltRxgZOPNrgdhUpG3ySfub hbULf4c0y74NSp1yLksrqk1VPKtsJjHKUFtkla1IVkO7PgPdOOuptlBdZVXRkNuF icNuKtZgU8s1aDCr9ubuXPZiqUtcdA/rBnzDHfU3gIThvWFrtCnLWIFRqEpMylNJ m06Q0hUOSSBuR6a7G4WWWkoZoHFjbkckx7kUgN208oZKauwlY+imnRpQ05L6lbMK 6OHnFS0aXZlu0OY5VPG02IGpHKiPuI+IkYWlBB6HW5pCNyzwC+e1dO51Q+37ipU9 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 pVzjBReSwWmKPCRNkVRSNzcdCHPMtSzhKcfMn8AToDg/kcl9M8lDakPin9xEismj U5LAUxDQ24YRX05mUk71Z6+cnp8tU5HZrY041XFzjNSnjdlUqDTy232V+KiST3Dj bu4KHp5Tp7s6XgslG04SXYgqMo9ft/iVwfqlyRYZiXVRYaHq4mJ5ERpbbiGnNzY6 APBW9Jx1/LUJIyyW3JP6aRtVT425OtmOjv8AVLC6Smry30PV6pbe7zQXk/kVavY8 HJJDRGY2Lyguv03mLi0qntKcy4W2mvkhI+JR0WN+pKrV0AY0MathRacQioqTs/en IjCFgdDyzuH/AH0CZ+ntVOGK1/YndCiNcrl+DOGcJRhWPLtSRnoevXSlxTABO6pv L91PqQTtcdRu/wALqFardU0YNCng7PREsFibu2OsTFlCvT/zNFhdkzwPzWZrMtsO /wCf6TDi1B6WxGfWtsuKbQcpAGeny1UcsDNK4yO8UIXVWn2ZVDCy0ha5qUJ8o6n5 DRWaFPdiyF1NUj+KJ3KvPClYDeAOoA664CsqZHpfQLsrbnGWiWzlCqTXojKKmXCQ lltp5K1KwD5s4249c6tMF2FfRPJOR3m3tVVcWanGlQ3mG2UMpjtbWkq+8nG1IQPr jSqeW5W0ooS1q5J8XYBkOcwJ843mSP7+TnPz750yoJLINbHdIexLiqFsVGpR2JUp ujV9vwdxwGzjxEYL5if8SD1B/EeunkwxBLtnzGnf2Ovh9UU3HFfpdQU/HRGTCeQH Ybrbpd3NqHQ7hoTXBwTWpbhdiZotBDIqP7sIy0rlrKnpnxOKbHQNp/hSem4687hS qb0iPoUBqO41HZUha6VIbeqW3GAVrQ2hPl6bU+uqb3H3oQb8E5KLR4/u+OqTyC+4 lKnCvbnO0D1P01Re43Rg1FDzLT9vVhfkcXF5qm39wIwEg9D66C82ene6ti7EozuK Zs4YrxnIfUe/T4xo0fqs9vzWM2hltod2I1o02V4WluoyUclvp+WhOyXzacnfO8UM 8Qqh4erWcD8UuppAz93Uo9Foth5Q1P8AymKtSA6XEuuKeP6agTms4HISti5aVbvH SAupSqWx4yloCZUxClcpLayoqG0HHXHYZ+o1djHoyV9K8h6Z9UzdMF3EnIa5C5VU cS7ekveEq4zLQ2pL3ISclbLiCCry9uvXH4aSTtu6629HIL4dFyk4w1P3ZVqvTpkZ +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 ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=altavoz.gif Content-Type: image/gif; name=altavoz.gif Content-Location: http://www.ine.es/menu/img/altavoz.gif Content-Transfer-Encoding: Base64 R0lGODlhDwAPAIABAJ4bNP///yH5BAEAAAEALAAAAAAPAA8AAAIjjI+pywbQ3IHs BUrTw9JtK2UfeJXeN5nI1mUrxFVpdLn0zRQAOw== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=cifrasine.gif Content-Type: image/gif; name=cifrasine.gif Content-Location: http://www.ine.es/images/cifrasine.gif Content-Transfer-Encoding: Base64 R0lGODlhXwAjALMAABsZFv///8aLlYOBf15bWY8XLOTj46lMXIQAFrCvrczMzJRB UTw4NsmxtpmZmal0fCH5BAUUAAEALAAAAABfACMAAAT/MMhJq73j6s27/+CWEGFp nqjGOGnrvpbCwHR9Epmt7yrv/6OfUEdIDFOLpHKpfNBIR9RhSq1WYYlcdPsxTgZe n0JAlpAFistY0KgIDslDu+UIB6CcAQslQCAKAQp/fxd9CAcUCwgCgQeHdBQKeBcO AAxzJw0FBQuBm5udbpuIEoqME46hLw57FwkAdgGVsRuanJ6fBU4UAqMSqRUKBQi7 GmkeBJgWsBUDAATHwbG2ncKcn6dmvrbFEwu3agwzyBIK0RIE4xPpAa/nDQwAAFoB 1Lhyn5i9ugEHm9moNimT4ICAQUrRFFgSx/AYgFZ3Ziic5AxaAnX1QOHq1GfThH1O /75xsuJvU7cAA0jQm/AqjIMVxxQ4U1ApWqVA8sKkmyODgj1roUqGAhlA5IEzSMko e9nOlTxMBytUkkcBgIIGONQNoLfVp0ag3kwGIFoS4AaF5yIxuBiNnYV4eAxebPdw a1qMGW+BnZCPW4AHYj08NHYJ3gRJYCw400Lg2boiiiHmraZxgq0CJRHt5eD2wto7 eBwMaLBSltVIKX5W/pgL8y+BF0gppBXocwAGWsBIUoy3hWpwFEr6KvXnnLBdjcOF sbQuzaRyNgwBEoRAVaJBpH79edCggb9i8yzAs1NnwrjnOxosmNLowElUU8x6/yRn 3WkKL9OqDYSeSw3mFKTUQXtBgZTmHw0AykKAZBiQQJor0BkXw4QxxSTBQMGk0YY5 EQZoiUEGXoBDOwzSlEACdZwYyIkJNHAVTQ64aEQDKLaDIisnltcdKwqw6EAaNeaY IopE7pEFbRssiBKSBzZ5mxHQOCllBZ/1N+WBDMjE4JVY4sYllwP09mUKEQAAOw== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=barraSeparacionSombra.gif Content-Type: image/gif; name=barraSeparacionSombra.gif Content-Location: http://www.ine.es/menus/img/barraSeparacionSombra.gif Content-Transfer-Encoding: Base64 R0lGODlhAQAPAPcAAAAAAOvAvOGgpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAABAA8AAAgIAAUIHEiwYEAAOw== ------------GBbmI8EIepIUIg6SyJONsr Content-Disposition: inline; filename=cookie.htm Content-Type: text/html; name=cookie.htm Content-Location: http://www.ine.es/jaxi/js/cookie.js Content-Transfer-Encoding: 8bit Instituto Nacional de Estadística. (National Statistics Institute)

No se puede encontrar la página web solicitada

Es posible que la dirección de la página a mostrar no se haya escrito correctamente o que su ubicación haya cambiado.

Puede intentar las siguientes opciones:

 

The requested URL could not be retrieved

You may have entered the URL incorrectly, or the page may have moved.

Please try the following options:

© INE 2011     Paseo de la Castellana, 183 - 28071 - Madrid - España Tlf: (+34) 91 583 91 00 - email : www.ine.es/infoine
------------GBbmI8EIepIUIg6SyJONsr--