Content-Type: multipart/related; start=; boundary=----------nnk7Z3j8OtXni0o2soXNAZ Content-Location: http://es.wikipedia.org/wiki/Consumidor Subject: =?utf-8?Q?Consumidor=20-=20Wikipedia,=20la=20enciclopedia=20libre?= MIME-Version: 1.0 ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=Consumidor.htm Content-Type: text/html; charset=utf-8; name=Consumidor.htm Content-ID: Content-Location: http://es.wikipedia.org/wiki/Consumidor Content-Transfer-Encoding: 8bit Consumidor - Wikipedia, la enciclopedia libre

Consumidor

De Wikipedia, la enciclopedia libre

En economía, un consumidor es una persona u organización que demanda bienes o servicios proporcionados por el productor o el proveedor de bienes o servicios. Es decir es un agente económico con una serie de necesidades y deseos, que cuenta con una renta disponible con la que puede satisfacer esas necesidades y deseos a través de los mecanismos de mercado.

En España, el Real Decreto Legislativo 1/2007 define claramente al consumidor en su artículo 3:

A efectos de esta norma y sin perjuicio de lo dispuesto expresamente en sus libros tercero y cuarto, son consumidores o usuarios las personas físicas o jurídicas que actúan en un ámbito ajeno a una actividad empresarial o profesional.
Comercio tradicional con dependiente y comprador, que es consumidor de los artículos en venta.

Así, no se consideran consumidores aquellos que adquieren bienes y servicios para incorporarlos a un proceso productivo o a una actividad comercial. En este sentido, el consumidor es de una u otra forma el usuario final del bien.

En el ámbito de los negocios o la economía, cuando se habla de consumidor, en realidad, se hace referencia a la persona-como-consumidor. El consumidor es la persona a la que el Marketing dirige sus acciones para orientar e incitar a la compra.

Contenido

[editar] El consumidor en la teoría neoclásica

En la teoría (neo)clásica de microeconomía, se entiende que un consumidor posee un presupuesto que puede ser gastado en un amplio abanico de productos (bienes y servicios) disponibles en el mercado. Bajo la asunción de racionalidad, esta elección de gasto presupuestario se realiza de acuerdo con las preferencias del consumidor; por ejemplo, para maximizar su función de utilidad, o para priorizar las necesidades por sobre los deseos. nto del consumidor a lo largo del tiempo, se considera que el consumidor puede invertir una proporción de su presupuesto para obtener un mayor presupuesto en periodos futuros. Esta elección de inversión puede incluir tasas de interés fijo o activos financieros sin riesgo.

En los últimos tiempos, la preocupación sobre la preservación de los intereses del consumidor ha calado en la sociedad, llegándose a incorporar asignaturas sobre educación del consumidor dentro de los programas educativos.

[editar] El consumidor en otros modelos

Recientemente, a la palabra Consumidor se le ha adicionado la de Prosumidor, para hacer referencia a la doble labor que pueden asumir los Clientes, la de consumir y la vez producir. Con la proliferación de la microempresa y la empresa familiar, las personas llegan a ser consumidoras de sus propios productos. Paralelamente, las áreas de mercadeo de las empresas tienden a apoyarse cada vez más en sus Clientes o Consumidores, para que les apoyen en la generación de ideas y desarrollo de nuevos productos, y aún más, les ayuden en la consecución y cierre de nuevas ventas, convirtiéndose en verdaderos defensores y promotores de la empresa y sus servicios.

El Consumidor no es un simple agente pasivo que espera a que le ofrezcan los productos y servicios, es un agente activo con el poder suficiente para lograr cambios en las ofertas y hasta en las mismas empresas, para que se ajusten a sus requerimientos y necesidades. Cada vez se es más consciente que lo importante no es la venta sino la repetición de la misma, lo importante no es el primer consumo sino su repetición sucesiva. Por ello, surgen programas de fidelización dirigidos a los clientes actuales en búsqueda de mantener su preferencia y lograr las compras.

[editar] Comportamiento del consumidor

Se refiere a la conducta que los consumidores tienen cuando compran, usan, evalúan y desechan productos y servicios que esperan que satisfagan sus necesidades. El estudio del comportamiento del consumidor es el estudio de cómo los individuos toman decisiones para gastar sus recursos disponibles (tiempo, dinero y esfuerzo) en asuntos relacionados con el consumo. podemos medir o predecir el comportamiento del consumidor a través de los sistemas CRM

[editar] Véase también

[editar] Enlaces externos

------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=combined.min.css Content-Type: text/css; name=combined.min.css Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/css/combined.min.css?16 Content-Transfer-Encoding: 8bit .suggestions{ overflow:hidden; position:absolute; top:0px; left:0px; width:0px; border:none; z-index:99; padding:0; margin-top:-1px; } .suggestions-special{ position:relative; background-color:Window; font-size:0.8em; cursor:pointer; border:solid 1px #aaaaaa; border-top-width:0; padding:0; margin:0; display:none; padding:0.25em 0.25em; line-height:1.25em; } .suggestions-results{ background-color:white; background-color:Window; font-size:0.8em; cursor:pointer; border:solid 1px #aaaaaa; padding:0; margin:0; } .suggestions-result{ color:black; color:WindowText; margin:0; width:100%; } .suggestions-result span{ line-height:1.5em; padding:0.25em 0.25em; } .suggestions-result-current{ background-color:#4C59A6; background-color:Highlight; color:white; color:HighlightText; } form#editform{ margin:0; padding:0; } #wpSummary,#wpSummaryLabel{ margin-bottom:1em; } .wikiEditor-ui textarea#wpTextbox1{ border:none; padding:0; width:100%; margin:-1px; } .wikiEditor-ui .wikiEditor-ui-text > textarea#wpTextbox1{ margin:0; } .wikiEditor-ui{ float:left; position:relative; clear:both; width:100%; line-height:1em; background-color:#f3f3f3; border:solid silver 1px; } body.rtl .wikiEditor-ui{ float:right; } .wikiEditor-ui .wikiEditor-ui-bottom{ width:100%; } .wikiEditor-ui .wikiEditor-ui-top{ position:relative; width:100%; border-bottom:solid silver 1px; } .ui-widget table{ margin-top:0.75em; } .ui-widget table td{ padding:0.5em; height:3em; overflow:visible; } div.suggestions{ z-index:1099; } .wikiEditor-ui-text{ border-right:solid silver 1px; } body.rtl .wikiEditor-ui-text{ border-right:none; border-left:solid silver 1px; } .wikiEditor-ui-toc{ float:right; padding:0; overflow:auto; overflow-x:hidden; } body.rtl .wikiEditor-ui-toc{ right:auto; left:-1px; border-left:none; } .wikiEditor-ui-toc ul{ padding:0; margin:0; list-style:none; list-style-image:none; list-style-position:outside; list-style-type:none; width:100%; } .wikiEditor-ui-toc li{ padding:0; margin:0; } .wikiEditor-ui-toc ul ul{ padding:0; margin:0; margin-bottom:0 !important; margin-top:0 !important; list-style:none; } .wikiEditor-ui-toc ul li div{ display:block; font-size:0.9em; padding:0.125em; padding-left:1em; cursor:pointer; color:#0645ad; } .wikiEditor-ui-toc ul ul li div{ padding-left:2em; } .wikiEditor-ui-toc ul ul ul li div{ padding-left:3em; } .wikiEditor-ui-toc ul ul ul ul li div{ padding-left:4em; } .wikiEditor-ui-toc ul ul ul ul ul li div{ padding-left:5em; } .wikiEditor-ui-toc ul ul ul ul ul ul li div{ padding-left:6em; } .wikiEditor-ui-toc ul li div.current{ background-color:#FAFAFA; color:#333333; } .wikiEditor-ui-toc ul li div.section-0{ font-size:1em; padding-top:0.5em; padding-bottom:0.5em; border-bottom:solid 1px #DDDDDD; } .wikiEditor-ui-toolbar{ position:relative; width:100%; } .wikiEditor-ui-toolbar .sections{ float:left; width:100%; clear:both; height:0; } body.rtl .wikiEditor-ui-toolbar .sections{ float:right; } .wikiEditor-ui-toolbar .sections .section{ display:none; float:left; width:100%; border-top:solid 1px #DDDDDD; background-color:#F3F3F3; } body.rtl .wikiEditor-ui-toolbar .sections .section{ float:right; } .wikiEditor-ui-toolbar .sections .loading{ padding-top:0.5em; padding-bottom:0.5em; } .wikiEditor-ui-toolbar .sections div .spinner{ display:none; } .wikiEditor-ui-toolbar .sections .loading .spinner{ display:block; background-image:url(../images/wikiEditor/toolbar/loading.gif); background-position:left center; background-repeat:no-repeat; padding-left:32px; margin-left:1em; float:left; color:#666666; } body.rtl .wikiEditor-ui-toolbar .sections .loading .spinner{ background-position:right center; padding-left:0; padding-right:32px; margin-left:0; margin-right:1em; float:right; } .wikiEditor-ui-toolbar .tabs, .wikiEditor-ui-toolbar .section-main{ position:relative; float:left; height:26px; } body.rtl .wikiEditor-ui-toolbar .tabs, body.rtl .wikiEditor-ui-toolbar .section-main{ float:right; } .wikiEditor-ui-toolbar .group{ float:left; height:26px; padding-right:6px; border-right:solid 1px #DDDDDD; margin:3px; } body.rtl .wikiEditor-ui-toolbar .group{ float:right; padding-right:0; padding-left:6px; border-right:none; border-left:solid 1px #DDDDDD; } .wikiEditor-ui-toolbar .tabs{ list-style:none; margin:3px; } .wikiEditor-ui-toolbar .tabs span.tab{ display:inline-block; float:left; line-height:26px; } .wikiEditor-ui-toolbar .tabs > span.tab{ display:block; } body.rtl .wikiEditor-ui-toolbar .tabs > span.tab{ float:right; } .wikiEditor-ui-toolbar .tabs span.tab a, .wikiEditor-ui-toolbar .tabs span.tab a:visited{ display:inline-block; float:left; padding-left:18px; padding-right:12px; height:26px; cursor:pointer; color:#0645ad; background-image:url(../images/wikiEditor/toolbar/arrow-right.png); background-position:left center; background-repeat:no-repeat; } body.rtl .wikiEditor-ui-toolbar .tabs span.tab a, body.rtl .wikiEditor-ui-toolbar .tabs span.tab a:visited{ padding-left:12px; padding-right:18px; background-image:url(../images/wikiEditor/toolbar/arrow-left.png); background-position:right center; } body.rtl .wikiEditor-ui-toolbar .tabs > span.tab > a, body.rtl .wikiEditor-ui-toolbar .tabs > pan.tab > a:visited{ float:right; } .wikiEditor-ui-toolbar .tabs span.tab a.current, .wikiEditor-ui-toolbar .tabs span.tab a.current:visited{ color:#333333; background-image:url(../images/wikiEditor/toolbar/arrow-down.png); } body.rtl .wikiEditor-ui-toolbar .tabs span.tab a.current, body.rtl .wikiEditor-ui-toolbar .tabs span.tab a.current:visited{ background-image:url(../images/wikiEditor/toolbar/arrow-down.png); } .wikiEditor-ui-toolbar .tabs span.tab a.current:hover{ text-decoration:none; } .wikiEditor-ui-toolbar .group .label{ float:left; border:0px; height:22px; line-height:22px; margin:2px; margin-left:5px; margin-right:8px; color:#777777; cursor:default; } body.rtl .wikiEditor-ui-toolbar .group > .label{ float:right; margin-left:8px; margin-right:5px; } .wikiEditor-ui-toolbar .group img.tool{ float:left; border:0px; height:22px; width:22px; padding:2px; cursor:pointer; } body.rtl .wikiEditor-ui-toolbar .group > img.tool{ float:right; } .wikiEditor-ui-toolbar .group .tool-select{ float:left; margin:2px; height:22px; cursor:pointer; border:solid 1px silver; padding:0; margin-right:0; cursor:pointer; background-color:#ffffff; } body.rtl .wikiEditor-ui-toolbar .group > .tool-select{ float:right; } .wikiEditor-ui-toolbar .group .tool-select .label{ background-image:url(../images/wikiEditor/toolbar/arrow-down.png); background-position:center right; background-repeat:no-repeat; padding:0; margin:0; padding-left:4px; padding-right:22px; margin-right:4px; cursor:pointer; } body.rtl .wikiEditor-ui-toolbar .group .tool-select .label{ background-position:center left; padding-right:4px; padding-left:22px; margin-left:4px; margin-right:0; } body.rtl .wikiEditor-ui-toolbar .group .tool-select .menu{ clear:both; } .wikiEditor-ui-toolbar .group .tool-select .menu .options{ position:absolute; display:none; margin-left:-1px; border:solid 1px silver; background-color:#ffffff; } body.rtl .wikiEditor-ui-toolbar .group .tool-select .menu{ margin-left:-1px; margin-right:-1px; } .wikiEditor-ui-toolbar .group .tool-select .options { margin-top:22px; } .wikiEditor-ui-toolbar .group .tool-select .options .option{ display:block; padding:0.5em; text-decoration:none; color:black; white-space:nowrap; } .wikiEditor-ui-toolbar .group .tool-select .options .option:hover{ background-color:#f3f3f3; } .wikiEditor-ui-toolbar .group .tool-select .options .option[rel=heading-2]{ font-size:150%; font-weight:normal; } .wikiEditor-ui-toolbar .group .tool-select .options .option[rel=heading-3]{ font-size:132%; font-weight:normal; } .wikiEditor-ui-toolbar .group .tool-select .options .option[rel=heading-4]{ font-size:116%; font-weight:normal; } .wikiEditor-ui-toolbar .group .tool-select .options .option[rel=heading-5]{ font-size:100%; font-weight:bold; } .wikiEditor-ui-toolbar .booklet .index{ float:left; width:20%; height:125px; overflow:auto; } body.rtl .wikiEditor-ui-toolbar .booklet .index{ float:right; } .wikiEditor-ui-toolbar .booklet .index div{ padding:4px; padding-left:6px; cursor:pointer; color:#0645ad; } body.rtl .wikiEditor-ui-toolbar .booklet .index div{ padding-left:4px; padding-right:6px; } .wikiEditor-ui-toolbar .booklet .index .current{ background-color:#FAFAFA; color:#333333; cursor:default; } .wikiEditor-ui-toolbar .booklet .pages{ float:right; width:80%; height:125px; overflow:auto; background-color:#FAFAFA; } body.rtl .wikiEditor-ui-toolbar .booklet .pages{ float:left; } .wikiEditor-ui-toolbar .page-table table{ padding-left:5px; padding-right:5px; background:none; } .wikiEditor-ui-toolbar .page-table th{ color:#999999; } .wikiEditor-ui-toolbar .page-table td{ color:black; border-top:solid 1px #EEEEEE; } .wikiEditor-ui-toolbar .page-table th, .wikiEditor-ui-toolbar .page-table td{ text-align:left; padding:5px; margin:0px; } body.rtl .wikiEditor-ui-toolbar .page-table th, body.rtl .wikiEditor-ui-toolbar .page-table td{ text-align:right; } .wikiEditor-ui-toolbar .section-help .page-table td.syntax{ font-family:monospace; } .wikiEditor-ui-toolbar .section-help .page-table td.syntax, .wikiEditor-ui-toolbar .section-help .page-table td.result{ width:40%; } .wikiEditor-ui-toolbar .section-help .page-table td.description{ width:20%; } .wikiEditor-ui-toolbar .page-characters div a{ border:solid 1px #DDDDDD; padding:5px; padding-left:8px; padding-right:8px; margin-left:5px; margin-top:5px; height:1em; float:left; display:block; color:black; text-decoration:none; } body.rtl .wikiEditor-ui-toolbar .page-characters > div > a, .wikiEditor-ui-toolbar .page-characters div[dir=rtl] a{ direction:rtl; float:right; margin-left:0; margin-right:5px; } .wikiEditor-ui-toolbar .page-characters div a:hover{ background-color:white; text-decoration:none; border-color:#a8d7f9; } ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=jquery-ui-1.7.2.css Content-Type: text/css; name=jquery-ui-1.7.2.css Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/css/vector/jquery-ui-1.7.2.css?1.7.2 Content-Transfer-Encoding: Quoted-Printable /* * jQuery UI CSS Framework * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt= ) licenses. */ /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { position: absolute; left: -99999999px; } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-he= ight: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:after { content: "."; display: block; height: 0; cle= ar: both; visibility: hidden; } .ui-helper-clearfix { display: inline-block; } /* required comment for clearfix to work in Opera \*/ * html .ui-helper-clearfix { height:1%; } .ui-helper-clearfix { display:block; } /* end clearfix */ .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: = absolute; opacity: 0; filter:Alpha(Opacity=3D0); } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { display: block; text-indent: -99999px; overflow: hidden; back= ground-repeat: no-repeat; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; h= eight: 100%; } /* * jQuery UI CSS Framework * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt= ) licenses. * To view and modify this theme, visit http://jqueryui.com/themeroller/?= ffDefault=3Dsans-serif&fwDefault=3Dnormal&fsDefault=3D1em&cornerRadius=3D= 0&bgColorHeader=3Da7d7f9&bgTextureHeader=3D04_highlight_hard.png&bgImgOp= acityHeader=3D100&borderColorHeader=3Dc0c0c0&fcHeader=3D000000&iconColor= Header=3D333333&bgColorContent=3Dffffff&bgTextureContent=3D01_flat.png&b= gImgOpacityContent=3D75&borderColorContent=3Dc0c0c0&fcContent=3D000000&i= conColorContent=3D333333&bgColorDefault=3De6e6e6&bgTextureDefault=3D02_g= lass.png&bgImgOpacityDefault=3D75&borderColorDefault=3Dc0c0c0&fcDefault=3D= 000000&iconColorDefault=3D888888&bgColorHover=3Ddadada&bgTextureHover=3D= 02_glass.png&bgImgOpacityHover=3D75&borderColorHover=3D999999&fcHover=3D= 212121&iconColorHover=3D454545&bgColorActive=3Dffffff&bgTextureActive=3D= 02_glass.png&bgImgOpacityActive=3D65&borderColorActive=3Daaaaaa&fcActive= =3D212121&iconColorActive=3D454545&bgColorHighlight=3Dfbf9ee&bgTextureHi= ghlight=3D02_glass.png&bgImgOpacityHighlight=3D55&borderColorHighlight=3D= fcefa1&fcHighlight=3D363636&iconColorHighlight=3D2e83ff&bgColorError=3Df= ef1ec&bgTextureError=3D05_inset_soft.png&bgImgOpacityError=3D95&borderCo= lorError=3Dcd0a0a&fcError=3Dcd0a0a&iconColorError=3Dcd0a0a&bgColorOverla= y=3Daaaaaa&bgTextureOverlay=3D01_flat.png&bgImgOpacityOverlay=3D0&opacit= yOverlay=3D30&bgColorShadow=3Daaaaaa&bgTextureShadow=3D01_flat.png&bgImg= OpacityShadow=3D0&opacityShadow=3D30&thicknessShadow=3D8px&offsetTopShad= ow=3D-8px&offsetLeftShadow=3D-8px&cornerRadiusShadow=3D8px */ /* Component containers ----------------------------------*/ .ui-widget { font-family: sans-serif; font-size: 1.1em; } body.skin-vector .ui-widget { font-size: 0.9em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget but= ton { font-family: sans-serif; font-size: 1em; } .ui-widget-content { border: 1px solid #c0c0c0; background: #ffffff url(= images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #000000= ; } .ui-widget-content a { color: #000000; } .ui-widget-header { border: 1px solid #c0c0c0; background: #a7d7f9 url(i= mages/ui-bg_highlight-hard_100_a7d7f9_1x100.png) 50% 50% repeat-x; color= : #000000; font-weight: bold; } .ui-widget-header a { color: #000000; } /* Interaction states ----------------------------------*/ .ui-state-default, .ui-widget-content .ui-state-default { border: 1px so= lid #c0c0c0; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.= png) 50% 50% repeat-x; font-weight: normal; color: #000000; outline: non= e; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visit= ed { color: #000000; text-decoration: none; outline: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .u= i-widget-content .ui-state-focus { border: 1px solid #999999; background= : #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; = font-weight: normal; color: #212121; outline: none; } .ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decora= tion: none; outline: none; } .ui-state-active, .ui-widget-content .ui-state-active { border: 1px soli= d #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.pn= g) 50% 50% repeat-x; font-weight: normal; color: #212121; outline: none;= } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited = { color: #212121; outline: none; text-decoration: none; } /* Interaction Cues ----------------------------------*/ .ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px= solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x4= 00.png) 50% 50% repeat-x; color: #363636; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color:= #363636; } .ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #= cd0a0a; background: #fef1ec url(images/ui-bg_inset-soft_95_fef1ec_1x100.= png) 50% bottom repeat-x; color: #cd0a0a; } .ui-state-error a, .ui-widget-content .ui-state-error a { color: #cd0a0a= ; } .ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #= cd0a0a; } .ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35= ; filter:Alpha(Opacity=3D35); background-image: none; } .ui-priority-primary, .ui-widget-content .ui-priority-primary { font-wei= ght: bold; } .ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opac= ity: .7; filter:Alpha(Opacity=3D70); font-weight: normal; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-ic= ons_333333_256x240.png); } .ui-widget-content .ui-icon {background-image: url(images/ui-icons_33333= 3_256x240.png); } .ui-widget-header .ui-icon {background-image: url(images/ui-icons_333333= _256x240.png); } .ui-state-default .ui-icon { background-image: url(images/ui-icons_88888= 8_256x240.png); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: ur= l(images/ui-icons_454545_256x240.png); } .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_= 256x240.png); } .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83= ff_256x240.png); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-imag= e: url(images/ui-icons_cd0a0a_256x240.png); } /* positioning */ .ui-icon-carat-1-n { background-position: 0 0; } .ui-icon-carat-1-ne { background-position: -16px 0; } .ui-icon-carat-1-e { background-position: -32px 0; } .ui-icon-carat-1-se { background-position: -48px 0; } .ui-icon-carat-1-s { background-position: -64px 0; } .ui-icon-carat-1-sw { background-position: -80px 0; } .ui-icon-carat-1-w { background-position: -96px 0; } .ui-icon-carat-1-nw { background-position: -112px 0; } .ui-icon-carat-2-n-s { background-position: -128px 0; } .ui-icon-carat-2-e-w { background-position: -144px 0; } .ui-icon-triangle-1-n { background-position: 0 -16px; } .ui-icon-triangle-1-ne { background-position: -16px -16px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .ui-icon-triangle-1-s { background-position: -64px -16px; } .ui-icon-triangle-1-sw { background-position: -80px -16px; } .ui-icon-triangle-1-w { background-position: -96px -16px; } .ui-icon-triangle-1-nw { background-position: -112px -16px; } .ui-icon-triangle-2-n-s { background-position: -128px -16px; } .ui-icon-triangle-2-e-w { background-position: -144px -16px; } .ui-icon-arrow-1-n { background-position: 0 -32px; } .ui-icon-arrow-1-ne { background-position: -16px -32px; } .ui-icon-arrow-1-e { background-position: -32px -32px; } .ui-icon-arrow-1-se { background-position: -48px -32px; } .ui-icon-arrow-1-s { background-position: -64px -32px; } .ui-icon-arrow-1-sw { background-position: -80px -32px; } .ui-icon-arrow-1-w { background-position: -96px -32px; } .ui-icon-arrow-1-nw { background-position: -112px -32px; } .ui-icon-arrow-2-n-s { background-position: -128px -32px; } .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } .ui-icon-arrow-2-e-w { background-position: -160px -32px; } .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } .ui-icon-arrowstop-1-n { background-position: -192px -32px; } .ui-icon-arrowstop-1-e { background-position: -208px -32px; } .ui-icon-arrowstop-1-s { background-position: -224px -32px; } .ui-icon-arrowstop-1-w { background-position: -240px -32px; } .ui-icon-arrowthick-1-n { background-position: 0 -48px; } .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } .ui-icon-arrowthick-1-e { background-position: -32px -48px; } .ui-icon-arrowthick-1-se { background-position: -48px -48px; } .ui-icon-arrowthick-1-s { background-position: -64px -48px; } .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } .ui-icon-arrowthick-1-w { background-position: -96px -48px; } .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } .ui-icon-arrow-4 { background-position: 0 -80px; } .ui-icon-arrow-4-diag { background-position: -16px -80px; } .ui-icon-extlink { background-position: -32px -80px; } .ui-icon-newwin { background-position: -48px -80px; } .ui-icon-refresh { background-position: -64px -80px; } .ui-icon-shuffle { background-position: -80px -80px; } .ui-icon-transfer-e-w { background-position: -96px -80px; } .ui-icon-transferthick-e-w { background-position: -112px -80px; } .ui-icon-folder-collapsed { background-position: 0 -96px; } .ui-icon-folder-open { background-position: -16px -96px; } .ui-icon-document { background-position: -32px -96px; } .ui-icon-document-b { background-position: -48px -96px; } .ui-icon-note { background-position: -64px -96px; } .ui-icon-mail-closed { background-position: -80px -96px; } .ui-icon-mail-open { background-position: -96px -96px; } .ui-icon-suitcase { background-position: -112px -96px; } .ui-icon-comment { background-position: -128px -96px; } .ui-icon-person { background-position: -144px -96px; } .ui-icon-print { background-position: -160px -96px; } .ui-icon-trash { background-position: -176px -96px; } .ui-icon-locked { background-position: -192px -96px; } .ui-icon-unlocked { background-position: -208px -96px; } .ui-icon-bookmark { background-position: -224px -96px; } .ui-icon-tag { background-position: -240px -96px; } .ui-icon-home { background-position: 0 -112px; } .ui-icon-flag { background-position: -16px -112px; } .ui-icon-calendar { background-position: -32px -112px; } .ui-icon-cart { background-position: -48px -112px; } .ui-icon-pencil { background-position: -64px -112px; } .ui-icon-clock { background-position: -80px -112px; } .ui-icon-disk { background-position: -96px -112px; } .ui-icon-calculator { background-position: -112px -112px; } .ui-icon-zoomin { background-position: -128px -112px; } .ui-icon-zoomout { background-position: -144px -112px; } .ui-icon-search { background-position: -160px -112px; } .ui-icon-wrench { background-position: -176px -112px; } .ui-icon-gear { background-position: -192px -112px; } .ui-icon-heart { background-position: -208px -112px; } .ui-icon-star { background-position: -224px -112px; } .ui-icon-link { background-position: -240px -112px; } .ui-icon-cancel { background-position: 0 -128px; } .ui-icon-plus { background-position: -16px -128px; } .ui-icon-plusthick { background-position: -32px -128px; } .ui-icon-minus { background-position: -48px -128px; } .ui-icon-minusthick { background-position: -64px -128px; } .ui-icon-close { background-position: -80px -128px; } .ui-icon-closethick { background-position: -96px -128px; } .ui-icon-key { background-position: -112px -128px; } .ui-icon-lightbulb { background-position: -128px -128px; } .ui-icon-scissors { background-position: -144px -128px; } .ui-icon-clipboard { background-position: -160px -128px; } .ui-icon-copy { background-position: -176px -128px; } .ui-icon-contact { background-position: -192px -128px; } .ui-icon-image { background-position: -208px -128px; } .ui-icon-video { background-position: -224px -128px; } .ui-icon-script { background-position: -240px -128px; } .ui-icon-alert { background-position: 0 -144px; } .ui-icon-info { background-position: -16px -144px; } .ui-icon-notice { background-position: -32px -144px; } .ui-icon-help { background-position: -48px -144px; } .ui-icon-check { background-position: -64px -144px; } .ui-icon-bullet { background-position: -80px -144px; } .ui-icon-radio-off { background-position: -96px -144px; } .ui-icon-radio-on { background-position: -112px -144px; } .ui-icon-pin-w { background-position: -128px -144px; } .ui-icon-pin-s { background-position: -144px -144px; } .ui-icon-play { background-position: 0 -160px; } .ui-icon-pause { background-position: -16px -160px; } .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } .ui-icon-volume-off { background-position: -128px -160px; } .ui-icon-volume-on { background-position: -144px -160px; } .ui-icon-power { background-position: 0 -176px; } .ui-icon-signal-diag { background-position: -16px -176px; } .ui-icon-signal { background-position: -32px -176px; } .ui-icon-battery-0 { background-position: -48px -176px; } .ui-icon-battery-1 { background-position: -64px -176px; } .ui-icon-battery-2 { background-position: -80px -176px; } .ui-icon-battery-3 { background-position: -96px -176px; } .ui-icon-circle-plus { background-position: 0 -192px; } .ui-icon-circle-minus { background-position: -16px -192px; } .ui-icon-circle-close { background-position: -32px -192px; } .ui-icon-circle-triangle-e { background-position: -48px -192px; } .ui-icon-circle-triangle-s { background-position: -64px -192px; } .ui-icon-circle-triangle-w { background-position: -80px -192px; } .ui-icon-circle-triangle-n { background-position: -96px -192px; } .ui-icon-circle-arrow-e { background-position: -112px -192px; } .ui-icon-circle-arrow-s { background-position: -128px -192px; } .ui-icon-circle-arrow-w { background-position: -144px -192px; } .ui-icon-circle-arrow-n { background-position: -160px -192px; } .ui-icon-circle-zoomin { background-position: -176px -192px; } .ui-icon-circle-zoomout { background-position: -192px -192px; } .ui-icon-circle-check { background-position: -208px -192px; } .ui-icon-circlesmall-plus { background-position: 0 -208px; } .ui-icon-circlesmall-minus { background-position: -16px -208px; } .ui-icon-circlesmall-close { background-position: -32px -208px; } .ui-icon-squaresmall-plus { background-position: -48px -208px; } .ui-icon-squaresmall-minus { background-position: -64px -208px; } .ui-icon-squaresmall-close { background-position: -80px -208px; } .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } .ui-icon-grip-solid-vertical { background-position: -32px -224px; } .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } .ui-icon-grip-diagonal-se { background-position: -80px -224px; } /* Misc visuals ----------------------------------*/ /* Corner radius */ .ui-corner-tl { -moz-border-radius-topleft: 0; -webkit-border-top-left-r= adius: 0; } .ui-corner-tr { -moz-border-radius-topright: 0; -webkit-border-top-right= -radius: 0; } .ui-corner-bl { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-= left-radius: 0; } .ui-corner-br { -moz-border-radius-bottomright: 0; -webkit-border-bottom= -right-radius: 0; } .ui-corner-top { -moz-border-radius-topleft: 0; -webkit-border-top-left-= radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radi= us: 0; } .ui-corner-bottom { -moz-border-radius-bottomleft: 0; -webkit-border-bot= tom-left-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bo= ttom-right-radius: 0; } .ui-corner-right { -moz-border-radius-topright: 0; -webkit-border-top-r= ight-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom= -right-radius: 0; } .ui-corner-left { -moz-border-radius-topleft: 0; -webkit-border-top-left= -radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left= -radius: 0; } .ui-corner-all { -moz-border-radius: 0; -webkit-border-radius: 0; } /* Overlays */ .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_= 40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=3D30); }= .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aa= aaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacit= y: .30;filter:Alpha(Opacity=3D30); -moz-border-radius: 8px; -webkit-bord= er-radius: 8px; }/* Accordion ----------------------------------*/ .ui-accordion .ui-accordion-header { cursor: pointer; position: relative= ; margin-top: 1px; zoom: 1; } .ui-accordion .ui-accordion-li-fix { display: inline; } .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important;= } .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; p= adding: .5em .5em .5em 2.2em; } .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: = .5em; top: 50%; margin-top: -8px; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0;= margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; ove= rflow: auto; display: none; } .ui-accordion .ui-accordion-content-active { display: block; }/* Datepic= ker ----------------------------------*/ .ui-datepicker { width: 17em; padding: .2em .2em 0; } .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0= ; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next {= position:absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-= next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left:2px; } .ui-datepicker .ui-datepicker-next { right:2px; } .ui-datepicker .ui-datepicker-prev-hover { left:1px; } .ui-datepicker .ui-datepicker-next-hover { right:1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-n= ext span { display: block; position: absolute; left: 50%; margin-left: -= 8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8e= m; text-align: center; } .ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; = margin:1px 0; } .ui-datepicker select.ui-datepicker-month-year {width: 100%;} .ui-datepicker select.ui-datepicker-month, = .ui-datepicker select.ui-datepicker-year { width: 49%;} .ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: r= ight; } .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: col= lapse; margin:0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight:= bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .= 2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margi= n: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-b= ottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: = .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:aut= o; overflow:visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { = float:left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width:auto; } .ui-datepicker-multi .ui-datepicker-group { float:left; } .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 au= to .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { b= order-left-width:0; } .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {= border-left-width:0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } .ui-datepicker-row-break { clear:both; width:100%; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }= .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }= .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-curren= t { float:right; } .ui-datepicker-rtl .ui-datepicker-group { float:right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { bor= der-right-width:0; border-left-width:1px; } .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { b= order-right-width:0; border-left-width:1px; } /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ .ui-datepicker-cover { display: none; /*sorry for IE5*/ display/**/: block; /*sorry for IE5*/ position: absolute; /*must have*/ z-index: -1; /*must have*/ filter: mask(); /*must have*/ top: -4px; /*must have*/ left: -4px; /*must have*/ width: 200px; /*must have*/ height: 200px; /*must have*/ }/* Dialog ----------------------------------*/ .ui-dialog { position: relative; padding: .2em; width: 300px; } .ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: = relative; } .ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; } = .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; = top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; = } .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px;= } .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titleb= ar-close:focus { padding: 0; } .ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background= : none; overflow: auto; zoom: 1; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0= 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em= .4em; } .ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4e= m .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.= 4em; width:auto; overflow:visible; } .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bot= tom: 3px; } .ui-draggable .ui-dialog-titlebar { cursor: move; } /* Progressbar ----------------------------------*/ .ui-progressbar { height:2em; text-align: left; } .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Re= sizable ----------------------------------*/ .ui-resizable { position: relative;} .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 9999= 9; display: block;} .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-= resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px;= left: 0px; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5= px; left: 0px; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; h= eight: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; he= ight: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: = 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5p= x; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5p= x; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5= px; top: -5px;}/* Slider ----------------------------------*/ .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.= 2em; height: 1.2em; cursor: default; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size:= .7em; display: block; border: 0; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em= ; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; mar= gin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs ----------------------------------*/ .ui-tabs { padding: .2em; zoom: 1; } .ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .= 2em .2em 0; } .ui-tabs .ui-tabs-nav li { position: relative; float: left; border-botto= m-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; } .ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding= : .5em 1em; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-= bottom-width: 0; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui= -state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { curs= or: text; } .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li= .ui-tabs-selected a { cursor: pointer; } /* first selector in group seem= s obsolete, but required to overcome bug in Opera applying cursor: text = overall if defined elsewhere... */ .ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-wid= th: 0; background: none; } .ui-tabs .ui-tabs-hide { display: none !important; } ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=favicon.ico Content-Type: image/x-icon; name=favicon.ico Content-Location: http://es.wikipedia.org/favicon.ico Content-Transfer-Encoding: Base64 AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAA AAAAAAAAEAAAAAAAAAAEAgQAhIOEAMjHyABIR0gA6ejpAGlqaQCpqKkAKCgoAPz9 /AAZGBkAmJiYANjZ2ABXWFcAent6ALm6uQA8OjwAiIiIiIiIiIiIiI4oiL6IiIiI gzuIV4iIiIhndo53KIiIiB/WvXoYiIiIfEZfWBSIiIEGi/foqoiIgzuL84i9iIjp GIoMiEHoiMkos3FojmiLlUipYliEWIF+iDe0GoRa7D6GPbjcu1yIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=shared.css Content-Type: text/css; name=shared.css Content-Location: http://bits.wikimedia.org/skins-1.5/common/shared.css?257z2 Content-Transfer-Encoding: 8bit /** * CSS in this file is used by *all* skins (that have any CSS at all). Be * careful what you put in here, since what looks good in one skin may not in * another, but don't ignore the poor non-Monobook users either. */ /* Colored watchlist and recent changes numbers */ .mw-plusminus-pos { color: #006400; } /* dark green */ .mw-plusminus-neg { color: #8b0000; } /* dark red */ .mw-plusminus-null { color: #aaa; } /* gray */ /* Comment and username portions of RC entries */ span.comment { font-style: italic; } span.changedby { font-size: 95%; } /* Math */ .texvc { direction: ltr; unicode-bidi: embed; } img.tex { vertical-align: middle; } span.texhtml { font-family: serif; } /* add a bit of margin space between the preview and the toolbar */ /* this replaces the ugly


we used to insert into the page source */ #wikiPreview.ontop { margin-bottom: 1em; } /* Stop floats from intruding into edit area in previews */ #editform, #toolbar, #wpTextbox1 { clear: both; } div#mw-js-message { margin: 1em 5%; padding: 0.5em 2.5%; border: solid 1px #ddd; background-color: #fcfcfc; } /* Edit section links */ .editsection { float: right; margin-left: 5px; } /** * File histories */ table.filehistory th, table.filehistory td { vertical-align:top; } table.filehistory th { text-align: left; } table.filehistory td.mw-imagepage-filesize, table.filehistory th.mw-imagepage-filesize { white-space:nowrap; } table.filehistory td.filehistory-selected { font-weight: bold; } /* * rev_deleted stuff */ li span.deleted, span.history-deleted { text-decoration: line-through; color: #888; font-style: italic; } /** * Patrol stuff */ .not-patrolled { background-color: #ffa; } .unpatrolled { font-weight: bold; color: red; } div.patrollink { font-size: 75%; text-align: right; } /** * Forms */ body.ltr td.mw-label { text-align: right; } body.ltr td.mw-input { text-align: left; } body.ltr td.mw-submit { text-align: left; } body.rtl td.mw-label { text-align: left; } body.rtl td.mw-input { text-align: right; } body.rtl td.mw-submit { text-align: right; } td.mw-label { vertical-align: top; } .prefsection td.mw-label { width: 20%; } .prefsection table { width: 100%; } td.mw-submit { white-space: nowrap; } table.mw-htmlform-nolabel td.mw-label { width: 0 !important; } /** * Image captions */ body.rtl .thumbcaption { text-align:right; } body.rtl .magnify { float:left; } body.ltr .thumbcaption { text-align:left; } body.ltr .magnify { float:right; } /** * Hidden categories */ .mw-hidden-cats-hidden { display: none; } .catlinks-allhidden { display: none; } /* Convenience links to edit block, delete and protect reasons */ p.mw-ipb-conveniencelinks, p.mw-protect-editreasons, p.mw-filedelete-editreasons, p.mw-delete-editreasons, p.mw-revdel-editreasons { font-size: 90%; float: right; } /* Search results */ .searchresults { } .searchresults p { margin-left: 0.4em; margin-top: 1em; margin-bottom: 1.2em; } div.searchresult { font-size: 95%; width:38em; } .mw-search-results { margin-left: 0.4em; } .mw-search-results li { padding-bottom: 1em; list-style:none; list-style-image:none; } .mw-search-results li a { font-size: 108%; } .mw-search-result-data { color: green; font-size: 97%; } .mw-search-formheader { background-color: #f3f3f3; margin-top: 1em; border: 1px solid silver; } .mw-search-formheader div.search-types { float:left; padding-left: 0.25em; } .rtl .mw-search-formheader div.search-types { float: right; } .mw-search-formheader div.search-types ul { margin: 0 !important; padding: 0 !important; list-style: none !important; } .mw-search-formheader div.search-types ul li { float: left; margin: 0; padding: 0; } .mw-search-formheader div.search-types ul li a { display: block; padding: 0.5em; } .mw-search-formheader div.search-types ul li.current a { color: #333333; cursor: default; } .mw-search-formheader div.search-types ul li.current a:hover { text-decoration: none; } .mw-search-formheader div.results-info { float: right; padding: 0.5em; padding-right: 0.75em; } .mw-search-formheader div.results-info ul { margin: 0 !important; padding: 0 !important; list-style: none !important; } .mw-search-formheader div.results-info ul li { float: right; margin: 0; padding: 0; } fieldset#mw-searchoptions { margin: 0; padding-left: 0.75em !important; padding-right: 0.75em !important; padding-bottom: 0.5em !important; padding-top: 0.5em !important; border: none; background-color: #f9f9f9; border: 1px solid silver !important; border-top-width: 0 !important; } fieldset#mw-searchoptions legend { display: none; } fieldset#mw-searchoptions h4 { padding: 0; margin: 0; float: left; } .rtl fieldset#mw-searchoptions h4 { float: right; } fieldset#mw-searchoptions div#mw-search-togglebox { float: right; } .rtl fieldset#mw-searchoptions div#mw-search-togglebox { float: left; } fieldset#mw-searchoptions div#mw-search-togglebox label { margin-right: 0.25em; } fieldset#mw-searchoptions div#mw-search-togglebox input { margin-left: 0.25em; } fieldset#mw-searchoptions table { float: left; margin-right: 3em; } fieldset#mw-searchoptions table td { padding-right: 1em; } .rtl fieldset#mw-searchoptions table td { padding-left: 1em; padding-right: 0; } body.rtl fieldset#mw-searchoptions table { margin-right: 0; margin-left: 3em; float: right; } fieldset#mw-searchoptions div.divider { clear: both; border-bottom: 1px solid #DDDDDD; padding-top: 0.5em; margin-bottom: 0.5em; } td#mw-search-menu { padding-left:6em; font-size:85%; } div#mw-search-interwiki { float: right; width: 18em; border-style: solid; border-color: #AAAAAA; border-width: 1px; margin-top: 2ex; } .rtl div#mw-search-interwiki { float: left; } div#mw-search-interwiki li { font-size: 95%; } .mw-search-interwiki-more { float: right; font-size: 90%; } .rtl .mw-search-interwiki-more { float: left; } div#mw-search-interwiki-caption { text-align: center; font-weight: bold; font-size: 95%; } .mw-search-interwiki-project { font-size: 97%; text-align: left; padding-left: 0.2em; padding-right: 0.15em; padding-bottom: 0.2em; padding-top: 0.15em; background-color:#ececec; border-top:1px solid #BBBBBB; } .rtl .mw-search-interwiki-project { text-align: right; } span.searchalttitle { font-size: 95%; } div.searchdidyoumean { font-size: 127%; margin-top: 0.8em; /* Note that this color won't affect the link, as desired. */ color: #c00; } div.searchdidyoumean em { font-weight: bold; } .searchmatch { font-weight: bold; } table#mw-search-top-table { background-color: transparent; } /* * Advanced PowerSearch box */ td#mw-search-togglebox { text-align: right; } table#mw-search-powertable { width:100%; } form#powersearch { clear: both; } /* * UserRights stuff */ .mw-userrights-disabled { color: #888; } table.mw-userrights-groups * td,table.mw-userrights-groups * th { padding-right: 1.5em; } /* * OpenSearch ajax suggestions */ .os-suggest { overflow: auto; overflow-x: hidden; position: absolute; top: 0px; left: 0px; width: 0px; background-color: white; background-color: Window; border-style: solid; border-color: #AAAAAA; border-width: 1px; z-index:99; font-size:95%; } table.os-suggest-results { font-size: 95%; cursor: pointer; border: 0; border-collapse: collapse; width: 100%; } .os-suggest-result, .os-suggest-result-hl { white-space: nowrap; background-color: white; background-color: Window; color: black; color: WindowText; padding: 2px; } .os-suggest-result-hl, .os-suggest-result-hl-webkit { background-color: #4C59A6; color: white; } .os-suggest-result-hl { /* System colors are misimplemented in Safari 3.0 and earlier, making highlighted text illegible... */ background-color: Highlight; color: HighlightText; } .os-suggest-toggle { position: relative; left: 1ex; font-size: 65%; } .os-suggest-toggle-def { position: absolute; top: 0px; left: 0px; font-size: 65%; visibility: hidden; } /* Page history styling */ /* the auto-generated edit comments */ .autocomment { color: gray; } #pagehistory .history-user { margin-left: 0.4em; margin-right: 0.2em; } #pagehistory span.minor { font-weight: bold; } #pagehistory li { border: 1px solid white; } #pagehistory li.selected { background-color: #f9f9f9; border: 1px dashed #aaa; } /** Generic minor/bot/newpage styling */ .newpage, .minor, .bot { font-weight: bold; } /* Special:Contributions styling */ .mw-uctop { font-weight: bold; } /* Special:ListGroupRights styling */ table.mw-listgrouprights-table tr { vertical-align: top; } .listgrouprights-revoked { text-decoration: line-through; } /* Special:Statistics styling */ td.mw-statistics-numbers { text-align: right; } /* Special:SpecialPages styling */ h4.mw-specialpagesgroup { background-color: #dcdcdc; padding: 2px; margin: .3em 0em 0em 0em; } .mw-specialpagerestricted { font-weight: bold; } #shared-image-dup, #shared-image-conflict { font-style: italic; } /* Special:EmailUser styling */ table.mw-emailuser-table { width: 98%; } td#mw-emailuser-sender, td#mw-emailuser-recipient { font-weight: bold; } /* Special:Allpages styling */ table.allpageslist { background-color: transparent; } table.mw-allpages-table-form, table.mw-allpages-table-chunk { background-color: transparent; width: 100%; } td.mw-allpages-alphaindexline { text-align: right; } td.mw-allpages-nav, p.mw-allpages-nav { text-align: right; font-size: smaller; margin-bottom: 1em; } table.mw-allpages-table-form tr { vertical-align: top; } /* Special:Prefixindex styling */ table#mw-prefixindex-list-table, table#mw-prefixindex-nav-table { width: 98%; background-color: transparent; } td#mw-prefixindex-nav-form { font-size: smaller; margin-bottom: 1em; text-align: right; vertical-align: top; } /* * Recreating deleted page warning * Reupload file warning * Page protection warning * incl. log entries for these warnings */ div.mw-warning-with-logexcerpt { padding: 3px; margin-bottom: 3px; border: 2px solid #2F6FAB; } div.mw-warning-with-logexcerpt ul li { font-size: 90%; } /* (show/hide) revision deletion links */ span.mw-revdelundel-link, strong.mw-revdelundel-link { font-size: 90%; } span.mw-revdelundel-hidden, input.mw-revdelundel-hidden { visibility: hidden; } /* feed links */ a.feedlink { background: url("images/feed-icon.png") center left no-repeat; padding-left: 16px; } /* Plainlinks - this can be used to switch * off special external link styling */ .plainlinks a { background: none !important; padding: 0 !important; } /* wikitable class for skinning normal tables */ table.wikitable { margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; } .wikitable th, .wikitable td { border: 1px #aaa solid; padding: 0.2em; } .wikitable th { background: #f2f2f2; text-align: center; } .wikitable caption { font-weight: bold; } /* hide initially collapsed collapsable tables */ table.collapsed tr.collapsable { display: none; } /* success and error messages */ .success { color: green; font-size: larger; } .error { color: red; font-size: larger; } .errorbox, .successbox { font-size: larger; border: 2px solid; padding: .5em 1em; float: left; margin-bottom: 2em; color: #000; } .errorbox { border-color: red; background-color: #fff2f2; } .successbox { border-color: green; background-color: #dfd; } .errorbox h2, .successbox h2 { font-size: 1em; font-weight: bold; display: inline; margin: 0 .5em 0 0; border: none; } .visualClear { clear: both; } #mw_trackbacks { border: solid 1px #bbbbff; background-color: #eeeeff; padding: 0.2em; } /* Table pager (e.g. Special:Imagelist) - remove underlines from the navigation link - collapse borders - set the borders to outsets (similar to Special:Allmessages) - remove line wrapping for all td and th, set background color - restore line wrapping for the last two table cells (description and size) */ .TablePager { min-width: 80%; } .TablePager_nav a { text-decoration: none; } .TablePager { border-collapse: collapse; } .TablePager, .TablePager td, .TablePager th { border: 1px solid #aaaaaa; padding: 0 0.15em 0 0.15em; } .TablePager th { background-color: #eeeeff } .TablePager td { background-color: #ffffff } .TablePager tr:hover td { background-color: #eeeeff } .imagelist td, .imagelist th { white-space: nowrap } .imagelist .TablePager_col_links { background-color: #eeeeff } .imagelist .TablePager_col_img_description { white-space: normal } .imagelist th.TablePager_sort { background-color: #ccccff } /* Allmessages table */ #mw-allmessagestable .allmessages-customised td.am_default { background-color: #fcffc4; } #mw-allmessagestable tr.allmessages-customised:hover td.am_default { background-color: #faff90; } #mw-allmessagestable td.am_actual { background-color: #e2ffe2; } #mw-allmessagestable tr.allmessages-customised:hover + tr.allmessages-customised td.am_actual { background-color: #b1ffb1; } /* filetoc */ ul#filetoc { text-align: center; border: 1px solid #aaaaaa; background-color: #f9f9f9; padding: 5px; font-size: 95%; margin-bottom: 0.5em; margin-left: 0; margin-right: 0; } #filetoc li { display: inline; list-style-type: none; padding-right: 2em; } /* Classes for EXIF data display */ table.mw_metadata { font-size: 0.8em; margin-left: 0.5em; margin-bottom: 0.5em; width: 300px; } table.mw_metadata caption { font-weight: bold; } table.mw_metadata th { font-weight: normal; } table.mw_metadata td { padding: 0.1em; } table.mw_metadata { border: none; border-collapse: collapse; } table.mw_metadata td, table.mw_metadata th { text-align: center; border: 1px solid #aaaaaa; padding-left: 0.1em; padding-right: 0.1em; } table.mw_metadata th { background-color: #f9f9f9; } table.mw_metadata td { background-color: #fcfcfc; } /* Galleries */ table.gallery { border: 1px solid #ccc; margin: 2px; padding: 2px; background-color: white; } table.gallery tr { vertical-align: top; } table.gallery td { vertical-align: top; background-color: #f9f9f9; border: solid 2px white; } table.gallery caption { font-weight: bold; } div.gallerybox { margin: 2px; } div.gallerybox div.thumb { text-align: center; border: 1px solid #ccc; margin: 2px; } div.gallerytext { overflow: hidden; font-size: 94%; padding: 2px 4px; } table.mw-enhanced-rc { background: none; border:0; border-spacing:0; } td.mw-enhanced-rc { white-space:nowrap; padding:0; vertical-align:top; font-family:monospace } #mw-addcategory-prompt { display: inline; margin-left: 1em; } #mw-addcategory-prompt input { margin-left: 0.5em; margin-right: 0.5em; } .mw-remove-category { padding: 8px; background-image: url(images/remove.png); background-position: center center; background-repeat: no-repeat; } .mw-ajax-addcategory { padding-left: 20px; background-image: url(images/add.png); background-position: left center; background-repeat: no-repeat; } .mw-ajax-loader { background-image: url(images/ajax-loader.gif); background-position: center center; background-repeat: no-repeat; padding: 16px; position: relative; top: -16px; } ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=commonPrint.css Content-Type: text/css; name=commonPrint.css Content-Location: http://bits.wikimedia.org/skins-1.5/common/commonPrint.css?257z2 Content-Transfer-Encoding: 8bit /* ** MediaWiki Print style sheet for CSS2-capable browsers. ** Copyright Gabriel Wicke, http://www.aulinx.de/ ** ** Derived from the plone (http://plone.org/) styles ** Copyright Alexander Limi */ /* Thanks to A List Apart (http://alistapart.com/) for useful extras */ a.stub, a.new{ color:#ba0000; text-decoration:none; } #toc { /*border:1px solid #2f6fab;*/ border:1px solid #aaaaaa; background-color:#f9f9f9; padding:5px; } .tocindent { margin-left: 2em; } .tocline { margin-bottom: 0px; } /* images */ div.floatright { float: right; clear: right; margin: 0; position:relative; border: 0.5em solid White; border-width: 0.5em 0 0.8em 1.4em; } div.floatright p { font-style: italic;} div.floatleft { float: left; margin: 0.3em 0.5em 0.5em 0; position:relative; border: 0.5em solid White; border-width: 0.5em 1.4em 0.8em 0; } div.floatleft p { font-style: italic; } /* thumbnails */ div.thumb { margin-bottom: 0.5em; border-style: solid; border-color: White; width: auto; overflow: hidden; } div.thumb div { border:1px solid #cccccc; padding: 3px !important; background-color:#f9f9f9; font-size: 94%; text-align: center; } div.thumb div a img { border:1px solid #cccccc; } div.thumb div div.thumbcaption { border: none; padding: 0.3em 0 0.1em 0; } div.magnify { display: none; } div.tright { float: right; clear: right; border-width: 0.5em 0 0.8em 1.4em; } div.tleft { float: left; margin-right:0.5em; border-width: 0.5em 1.4em 0.8em 0; } img.thumbborder { border: 1px solid #dddddd; } /* table standards */ table.rimage { float:right; width:1pt; position:relative; margin-left:1em; margin-bottom:1em; text-align:center; } body { background: White; /*font-size: 11pt !important;*/ color: Black; margin: 0; padding: 0; } .noprint, div#jump-to-nav, div.top, div#column-one, #colophon, .editsection, .toctoggle, .tochidden, div#f-poweredbyico, div#f-copyrightico, li#viewcount, li#about, li#disclaimer, li#privacy, #mw-hidden-catlinks { /* Hides all the elements irrelevant for printing */ display: none; } ul { list-style-type: square; } #content { background: none; border: none ! important; padding: 0 ! important; margin: 0 ! important; } #footer { background : white; color : black; border-top: 1px solid black; } h1, h2, h3, h4, h5, h6 { font-weight: bold; } p, .documentDescription { margin: 1em 0 ! important; line-height: 1.2em; } .tocindent p { margin: 0 0 0 0 ! important; } pre { border: 1pt dashed black; white-space: pre; font-size: 8pt; overflow: auto; padding: 1em 0; background : white; color : black; } table.listing, table.listing td { border: 1pt solid black; border-collapse: collapse; } a { color: Black !important; background: none !important; padding: 0 !important; } a:link, a:visited { color: #520; background: transparent; text-decoration: underline; } #content a.external.text:after, #content a.external.autonumber:after { /* Expand URLs for printing */ content: " (" attr(href) ") "; } #globalWrapper { width: 100% !important; min-width: 0 !important; } #content { background : white; color : black; } #column-content { margin: 0 !important; } #column-content #content { padding: 1em; margin: 0 !important; } /* MSIE/Win doesn't understand 'inherit' */ a, a.external, a.new, a.stub { color: black ! important; text-decoration: none ! important; } /* Continue ... */ a, a.external, a.new, a.stub { color: inherit ! important; text-decoration: inherit ! important; } img { border: none; } img.tex { vertical-align: middle; } span.texhtml { font-family: serif; } #siteNotice { display: none; } div.gallerybox { border: 1px solid #cccccc; background-color:#f9f9f9; width: 150px; } div.gallerytext { overflow: visible; } /* ** Diff rendering */ table.diff { background:white; } td.diff-otitle { background:#ffffff; } td.diff-ntitle { background:#ffffff; } td.diff-addedline { background:#ccffcc; font-size: smaller; border: solid 2px black; } td.diff-deletedline { background:#ffffaa; font-size: smaller; border: dotted 2px black; } td.diff-context { background:#eeeeee; font-size: smaller; } .diffchange { color: silver; font-weight: bold; text-decoration: underline; } ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline Content-Type: image/jpeg Content-Location: http://bits.wikimedia.org/skins-1.5/monobook/headbg.jpg Content-Transfer-Encoding: Base64 /9j/4AAQSkZJRgABAQEAtAC0AAD/2wBDAAkGBwgHBgkICAgKCgkLDhcPDg0NDhwU FREXIh4jIyEeICAlKjUtJScyKCAgLj8vMjc5PDw8JC1CRkE6RjU7PDn/wAALCADc B5UBASIA/8QAGgABAQEBAQEBAAAAAAAAAAAAAAECAwQFB//EAC4QAQACAgEEAgMA AgEEAgMAAAABEQISIQMxQVEEYRMigTJxIxRCkbEFUmKh4f/aAAgBAQAAPwD9cpNY NSIk/aPKxnnHlY62cNR8iY7w1HyI9NR1sZbjPGfK3E9pCikOFSiiknG05xWM2o5A EFSSeUte7M4+YWOVZyhmYSOJdO8GMtTyy3HZJJXtCMzLMyhGN8OuOOsJnnXZxmb7 ueWXgw6WXUn1D1YdOMI4a7FpPP8AoooiFuIScvSVMrGK8QbHLOWWEf5ZWxPWxj/G LZnrZz2imf3y7ysdNrRYwlqMFjBdIg1gqF/gBUrynJycnJclll/R/Dg4KiTWEnE1 TUqUr6KCoKKSiYSikpeTaY8rvksdSfML+SF2xlbgSirKo5NpNjZbiTiVqEoqSiik qA5W5LLW0tUooosD/SggUUUUkwlLyXJsbLZZCocFrYHBRSUI3BkkdxY7CSxJEL4I eH5OW3WlnGKXy9XRxrCG0UAlY7JLzZ85TKWS10o/Z6IBYEWzwiwgskEBSCopRA40 UapqkwlFWk4pqTimvqSNonu1HUzx8t4/Iy84umPXxnvw3GeOXaVKQ4IVKScU5xWM /bSKIUqeRI7qkxyWtszDMrhPhqeJajkMSTueEmWJlJlO7thjUWmecOOWTnOXP26d PoXzl/4eiIiI4JSZCliC4hL9JrPmWogv0kzXeaYy6uGP/wCTE9bKf8caZvPLvMkd Lnl0jptRg1GMLUCwUHHtLx9pvjHlPyYez8uKflxPyx6Py/R+X6I6v0flj0fkhfyQ R1I9rvErtBcLwnBQULZZZwlQUapqapUlFJQUUUlJqUUlzHlYzyhr8n0sdTGV2ifI tJRSUclzC7SbG0LcHBRRQFIpyWX9lrwUlBZfsFAECikoopFuYLksuF/oHMFrZZwc LCT3IFO0MyzIslvJ8jH97iHLHiFiLl7cYrGIEahJF8JVr4Zy7S8/kq0mHTpQ7ApK CoC8Agp5QVFs8lpOKaprSaykwapRRSUmvJMJqlEx9JXrhrHPPHy6Y9f3DpGeOXlr iYSIFCmZxhOYajK1RUJICk/0vdJgpe7EwzE1Lp3hcVkgk8mTOUsWkunTw8yuedcP PnlyxF5zUPT0ulGPM8y6pM0zcyvY7rxDM5TPYjG/tqqL/jnl1sMfNy5z1s8v8Ypn TLKeZmXTHoxDcdOIajGliFQnKI7yk9TGPLM9XFmet6hJ6ucptnPlKynzJrK6mqxj 9Gq6mpqampqarqmpqUc+y8o8rtku8+iM49LGcLtHtbs7nBX2chZakwlQVCak4ykw UioUUlEwkwlHKxllDUZysZwsZRPleCkoSiijmC5XY3XaC4KKKOQAtQCko5Cy1sA4 ECikoooIsstThQsCFSWb5TvK0IkVPeHP5GGMYTlEcuHRi84h7EkgJFlPKufUmsXD lY7kunSh1FQWkVFlFQUC0UJKBDlbLLhKg1gnFNEnFNUmEoomGZhNbScSqajPKPLp j1o8ukZRPaVooPCTSTj6SJmO7UTZJ3KKWESeJUibKpL5J5Yyipawm4WOJa8EdzIi EyljKbZtrDG5tvPKop5upmzhhl1Z47e3r6fTjp48NTKTNJ35la9HEd2dr/xIxnzy 3Ee0yyjGOZqHHP5Ef9kW5/8AJ1O8umPQ9uuPTiGoxiF4JlmepjHeWJ62PjlmerlP aGds58k4zJGDUYLqui6rqRiusEYwVBUFQVHpagqPRUFQVCVBUGpqapOMmqV9Ewk4 pGK0XMLtKxl9G0Lf2tnHo7lT7P4F/YHBUJqapRQUhRRSVBSVQXMNbzBGceljKJ8r xPkCikooo59lzBtKxmsZQtxKVC0gWWoCBRRyWWXCooJS0lFACKg1CkEJlLM9kiFS UnusJnjGWMxLh8bGssnolJIALognhy6s8Q5eVHbpxw2AvlFhFBFAAAsBz3n0sdT6 N4XfFdsS4XggLVJiE1iU0ScJZ1pKKKZmEnFIvHs3j1cse/Lrj1Iyb7icBPLMxXZc Zme6qhITFlcFET7JghM8bhjGalufbUEdzIhnKXOZMYt1j9Yebq9Tvyz0unPVyuf8 XsxiMIqILtJnxBEV3aYy6kRNY8ykYzPOU/x0jGoTPqY4RzNPPn18sprpx/Ujo5ZT eUu2HRiHSMYjwvZJzxjvLll8iI4iLYnq55dopP3nvKx02owpqMFjGl1hag7KhcFw WkzPoufReR+x+x+x+xUpWXs/Y/Y/b2XkbSbzHg/JPpd4N8ZXaPa3BwVCTjBqk4lJ SUc+1vJdq8LGULf2WcHBRyAqFQlGqVJSAUUJMFJRzErtKxnKxnHldonyvCBQlFFJ S3MEZSuxtC3ErSUUchZYKCVBRRzAWWWsFgUlKILCngmaZnskkE9kRRnHHWZ+1soB fCT3WOyTLh1Z/ZgWO7vh2aFRYJQVFKIJEBQAGNE0NU1NUqTmPK3kbZLt9G0LGV+V 2+12XYuJNYlJwZnBJxlmYSikpccph1x6kT3b4lKoKSYnwkZTHdq7AAJLuEau4c8s a5ajnFcZ4FnsXw55yxfLrh+scuXW6tOXS6c9TK57PZERhERB/tnnLiOzUY0meePT xvKXHbqdaeP1wdsOnGMcR/Vyzxwi5mnDP5GWfHTj+ph0MspvObl3x6eOMdm6hMs8 ce8uOfyYj/GLc56nUz+iOnM97bx6UNxhENRjEeFoALAr6K+hQ5A/oABwcFQkxBrB OMJpCaGhUwXku0wRn9LvC7QcFQUmpraUlHK3MFrcLf2X7OCjkuSwAqJScTWkKKKQ oJhKSijmFuYWM5XeFuJWCkoEoopKOVuYXY2hbheDhKWkLLUAQopOS1sstbOApKWF JSYuUlme6wTykgTxCRMTFkHkWEDyrMvPnzKFrhF5PTjAACiCgAIoADyRll7lfyZx 5WOtk1+efML+aP8A6kdXGe8NRnhPldsJ/wC5axnzBr9wmk+k0JxlKleYLn0bLGU+ 2oyXaJSYiU1ScGdZhJhmlxznF0jqRPduKkVJiJYmKaiVtUAlOy907S1MXDMR4O0t FcJPEOWXMmGPNr1ctYcen056uVz2euIjGKgSraiKcur14xnXHnP0x0+hlnlv1Zuf T0cYxzxEPPn8m516cbSmPQy6k7dSZ/09GHTjGOIa4jy5dTr44+eXHLrZ5/4xUJHT yym5mXTHoxDpGMQ1QFlnJQtAAWWWWCWWKAAiioWqUTEJqapqVJyXK7LtBcLwlJRS alUclrcLf2FlQVJclgKn8KSiYSgoQKSrJhKKk59rtML+T3C7RK3AUAlFFJRytzBG Ursu0FwvBSFFlllqhRRQUJa2WsSsBDMyz5ahJSSFY6s1hMuPx8/31l6JhChTtCQr Gc8S888kQTDXS7vQpAAABYAAAA8tJS1SFEwlFHMeSJmPLUZ5R5WOrnHlY68+Yajr RPeFjqYSu2E+VqJ8wa+k1mDktdvtYzauJScYljLpszhMMdm8Mpxnvw645xk0klWz ONLEqACdlnsRJSTysdljszlLFW1Mxji4c9bP6enHGMIqFO69nn6nWy6mX4+l/cm+ j0MenF958zK9Xr4dKOZ59PPEdX5XOV4Yevb09Lo4dOKiIdJmMYuXDqfKxjjHmXCc up1J9N4dGe8u2PTjFuvooqAVBUFCiiikmClqEqFpKWivooqCiioRSijkABRC1Sgp KKK+y5LWy4CoSjVKmC5Wy1LCijksFEKhKNZQooSrCikoopF2n2u8wsZxK3B/oAJS iikoW5Nphdl2guPalCUHJZCglANR2DtDE9iFSUWBx+TNYxHtw6c65xL1zlEzSiEL PZI7rLl1eMXGAdOlHLvCLYAAigAACoDhSVS0lfRSVBRSUtJSTBSUtCc+2ozyjtLU dbLy1HWjzDUdTCfo/We0rrPiUqYIyluMrXiWMsInsxONMTEw3h1Jju7Y5Rkdjuk4 kT4U7gvdmVgniSBTtDnPMp/3fUMZxPUyr/th2wxjGOy95WiZjGLlwynPr5Vjxh79 u2GGPTxqIcOv8m5/H0o2z/8AS9H4vO/VnbL/ANPTNYxzxEPL1fm4xOuEbS5R+XrT eVxHp2w+PEcy6xER2hqgVAVClAsstNiyy5LkssssssLOS5LL+iyy4W4AAALLP6CX JZwtJQi/0stbVKNYTVKk5WwsuVuJAuiziQVApNSpQoolBKKKKSYLmGoymFjP6W4n yd/IAAhRSCxMrtJstxKiAclrYlETTXkyljIiFlPKeVIeb5M3nXpydehlM9Tl6JEW iSCZcetPZy7LR2delHFusEBYEyBYBB3AAAFeWOr7hqOpj6WM8JX9Z7SUmpqTDNFF JSTBQVZMJRRSUcwsZZR2lvHrZR3bjq4z3hqJxntJz7WziUywticKSJmOzeGe3DpE HJSWoCTFrBPZMVmanlzyzm6xdMZuGM+OzOOMzHPl0xwr/S91jgmYxi5cqnqzzxj/ AO3WZx6ePqIebLPqdedcOMfMu3R6OPSjiOfMr1uvh0sbmeXhy6nW+VNRFYPR0fi4 YRc93oiIjtFAAFwohcJZsXPouTkqfZX2V9lfZX2UtJRRRr9lLUnJycpyocKhSalS cwXK7fRtC3HsFQooE4ko5LWziSoKSpJkstbFThKKOwBZalBclgqUBwUlFJMFFCQS hRSUvMG0+139wsZRK3AAAUipQcrcllrcLacBQQ1CZd2Z5WIJZIhZXw8Wc7ZzLLr8 Wt5eiRFhPKpLh1JvJkSXfpR+rahAAAFgAABYrx6pOKVJzBtl7ajPL2v5cvKx1fcN R1cfKxnjK1E9pNU1KKSkKSikoopKZmFiZhYzmJ7ukdb3DcTjPMS3GU+V4ljPFymJ xnh1xz4i24lJlm+WolS+SYEnhYZjKpTLHLL6ajCIik154SbaiYW7WCZrlit5ue3p rLKMIcdMurN5cY+nfGIxxrtDzdf5fM4dKNsnPpfFyzy36039PZjhjhFRFKTIACWW clFFFLX2RBQUUAcioH9P6cnJcll/Rf0cHB/SjlUCokpNUqYW5g2ldvo2hYmJFQoO RFqSywqEr7KmC6LUOT/ZRMJUgHNlrYFJdLYWcH9OS0WkmCkooopApKKKC5hYzlYz iViYAAAAEKXmCyyJbjLhmZtGklmVgTqTWEy8f2jr8XH95l6APCKzMvPPMygU9OHE KvkRQAA8gAFAAryAVBUFQmqUk4pUtRMx5XfKPKx1coX8v01HVifCxnjK3jPkqPZS ak4pRSUkwk4mqTCctRnMOmPVie/DrExKThEs5YTXHdOlllHGUOtXyVCUvZmcqT8k dkjqctXOSxaxEd2vCEwyzlHNrEtXcpKzOsfbMYXO2XdrPPHp43lLzTPV+RNY/rh/ 7duj0MOlHEc+3VAsC0AsLLTaI8m8Qm/0bz6TeTbI2yNsi8vZtkbZey8jbL2bZezf I3ld59Lv9G0Lce1s/oHBwCdjlbL+i4kC5W/pO5UEwmqUXKxkuy3EnCoUHKfwVFAr 7EtUULCjshQWRJaiCkAf0LBKKSYCikVCkopKXlbkjL6XaJW/sACAAkCClnsRCz2Z lO6xA5/ImsK9vMj0/GxrC/boQCeVYzmsZcChYi5h6MewtAAAAAACoqK8cTHtbtRF SYEWioKhKNWdSipJ49rGWXtqOplB+WWo6seljqY+l2xnytRPlNfRqk4s6pRraReM 8O2Gd/7dIy9wt4y5x1McctZay6keGom4c879pETMe1jpRdy6RjHpahEnLHH/ACmm Z63TiajKzp9fDKat0uJ7STCUmUccMY5TE1LdkcymWdRWMXLGPR2nbqTcu0VEVBdg CWkyX9FgCV9mv2upqampqampqUV9GpRMJRRSUUUtJXJytz7XaTb6XaJLj2v9AOBK OV5LLiT+hycHBSapUnK7TCxktlqJMAAgpYCBa2WQFJQWWLygB3U/icKAnBRQlFAh S0kwUVZRZaxksTEqlCoCoQsQSQT2RGiHn+TN504Hp7OnFYRCgSQTLl1J/VyBrDmX fEUAAWEpUAABQEfHicq/yWM+pHOzWPyMvPMtx8iI7w1/1GHeeGo6+E9pa3xmf8oW 4nysTBIFEHkkJQopNSpSpOYWMp9kZ5RPdqOrMH5JnwsZwtx7OJJwyn/FrHLLHjKG riexOETN0ulEYzbWkS1HHaAlGer1Y6eMzMvldbrZ9TKZvhehEzMzPiGMs5xuYl6P gdf/AJJjKeJfTjt7SYRJxtmte694XGPUNWFlF0kymycyUv8ADkq/JRSlhZZ/S/sC yz+nK3IJwUUUUlFFFCUtFFILtJt9LtBcKAUlHYuVsuD+nIFJOJScwsZTCxktxJwH gooApD+lqUUUgLYCUUnK2XYqC8pQpYAIqUUkwAUUUhRQLcmy2ogENJPdpmUI7qdo t4+pN5zLNLhF5xD2CBJCTLl1eac+wOnSh2glFACygVAC1EBQHytfTM4/SRjfdJwi /aaxM0k4eu6azjSxOceZbx6uccNx8mYnmG4+Tj5ajrYT5ajqYz5hqMo9tXEwnAsp SSRCknFFFJUJMcrS0mrGUTjzEuWfyurE1HDeHzJ7Zxb0dOcc4vGeHaLpuCuVTKYj ylxPljqdTHGLmXjy+V1MpnXsxOPU6s/sn4scf8soYz6uOEThhzfl5pi/K4zrPHd6 ul87qY1Hh9Po9SOr04yapKpMsbhm6aiVO69kmU5kr2cFgcgFLRRQUHBRRUFJr9rU nJylytl/RZalgioUTBRSUFFJFrcm0my7RK3HsP4UlHJzC2XAWWVBSUlcnMLtMLGS xIqFHJZwIqcwtnElJVKgLYUlFJUl0t2CooknIthRSKhQUgBQBQUBa2Wtr4RpmUlY gnumc1hMvF3O7p8eLzvw9MgJPKxHDMuGc/syqOvSjh1AAtRFpFQXyigQQAD5+rOt JOJqzOH0a1H2mWNpMT5Ii+6axfEMzHJrHhMsaX9o7W1HVyiLtqPkZL/1Ux4bj5OP lrHr4Sv5cZnvDcZx7XaJWJgRaShYXszMyxM255YRLjOON1w+l8XoxhhE+3eYiGZz wjvlDh1flYY8Y5PPl8vm5zcsvl4zPeSflcVM0xPysfV/7TH5MeIiFy6+0cZU5ZZT kz4I7JXJX279H5OXRnieH0PjfMx6uUYzxL1SlJlHDES1E2szCdziCzmSpWMTVago o4ODg4ODgOCiigoKKSpOVSzgqAoqTkLFA/pQhQhRRMJSUtz7Nphd/ojOJauPZxJS UVMFytwcHJYUkwUi3MGy3C2WXAUiglFFytnBSAChMWlIXK2BElioBE+1tU7lIBUB QACAFFCw1EcKwd5WjvJlFxUvL1sNMo9Ob0fGj9bdp7oCKxMvPM8yCdnfpdnQABQh FQFAAAB4tUnGU0k1TWUiJsnG01NTVmcDRJwScZgnG47MzjNcpGJ+O+f/ANMxhM8L pMf7P2jy1tlEXc2uPVzj/wDrcfIn0v8A1ER3hrHr4y1+XCfJPWxxhw6ny8rrFzy+ RnFc29Xxut+WJiY5bnh5+tnTyzlO9vVj/wDIdTDGMYjsxn87q5+aefPqZ5T/AJSx Nz3lKldZSYXVNVi2tljJZyifBV9ljHlJipXDLTK8ZfU+L8uM4jHLu9d3Fwykwzc9 moiFKOCcojyz+SE/L9J+SfSTnkm2fsvOfJ+3srL2VPuSp9n7ez9vaft7lq8vZtn7 N8yM8l/Jl6WOp9L+SF/JC7xKxMFwtiUUUUUihSAchaiKIUUlFFJSTCUvMLtKxn9L GULxJSTByWcSv9AKSiYSpW5LX+rcwWcSUAcHdDn2X7U/0gBdLZ3KhKSi6F7oRa2C oFlr3CSkoqhUoAAEUhqCWSF8BDj8rw8/09nRx1wiFPIeCIJc85rGXBeUHfpxxDfY FhFpClAhBUWARQIIBx0TRJwTVNTRNScWdDVNTU1TX6TVdIZ05XSWdITXumhr9Lp7 Z0i5qGdfpZ6UT2TSYmmZwnsn46i5/wDDMYbZRHt9HpdPTGIiKc+tnUTEd3kyuZ5l ik05JxTU1XUqbTVZx5IxtJxo1KNSImOy1MET7W49LjlUvq/D6sZ9Op7w9FJMMZY+ U5juu0z2grKfKaTPlfxwukEYQusJquv0alFJX0V9FR6SioKKNTVNfo1TQ1NSl5jy RlK7yRn9NRnBGULZa2FFFFFFIAUFnBwtIfwKKSkmEopKKmFuYXf3CxlErwtJQWcA BwUlHK2cLyWFFFFAFHKL/TlFopFCikoBaQui4XgKKABUooAooQFpYhWZCAoZ6uO0 OGWP/JUQ9McRAUEkJk59Ts5UtFJEXLvjFQ0AKiiCgAipwKADFFFJqawmqamqaM6k 4pqamqapqTga8JqTimqarqmpOCTjwmqTjUWxOMy38bp/8kzPh26+VYvJzMTzbNLO DMYLozrNLqa/+TWfJGKa8duV14TWZNTU1hNDU1NTVvp5ZYTcS+j8TrT1IqZ5eiUo pjLjskZe12NljKScvo3g2g2j2u0e1uPZZYcHBRRRRSVJyfw/hwVBSalJqUUUXJcr t9LGRf2trZYLSfwooQUAKSlQKKSkpKNUpYymGt/axlErxJRQBSUqBQXS8H+pLlbA pKKouiwCoKkv6CjkstatKSlCikpSy1SYAFOSwKQCgpqIEnuiwT3FRymL6t+nUBDw kuXU7sxCyUYxy7R2KFRQAAAAAABAKKKKSikonFNTVNU1TU1NU1TU1TU1KKScZTVJ xTTy30YqZY6kTM1Kfi/W2PxrpfhJw8JpSacJOBoa8mvKTHJqsYpOJOPBqUmpqamp q30s56eVw+h0uvjnEXPLr3SnDrZasxcxytJMFTHaT8meMeyPkY+cWo63TlYywntK 1j7Nfs1nxJWUG2ULGc+j8n0u8LGUe1uPagHAUUlFFSH8Cik1KKTUpYuC5L+lstbL LUApKOQAVKKEopJgopJhKOYWMphqM/cLcFWUclgUUAUcligolFJyoBUJRyWqdlAp KAWkoFCigAAKAWy0FQBnHH9plqgCRJcsuZSihcY5dYUAEpQAAAAAAQAooooopKKK KSiknE1TU1Sik1NUo1TUnFIiuWqjKF14picGdZJxtmcaScTWKTU1TWTVNaNTU1Wc fpNCcTUnFNTVdCInGYl7el1YnGLnknq4zNQzrtNy1UFJOKTCTDnl04liOhMz9O+O ERFQswURceVjKV2+i4kqPZqaprJzC7SsZyu/0u0Fx7X+gKBSUUUVIHBSUUUlCliw XK2ABRQABQlFFJRSUUlHMNRlK7LExJRQAlFAAoCglHIKh/CjkAF4SigApKXksUpB QEURRIUAlmMoumu4CKzLnXIUSuEcugAAAAAAAAKlBRQAAAJRRRRRSUUapqmpOKal JMJVLysGtpODM4GspqmpqmhqapOKximpqak4JqarrCak4mpTp0cPMusxw4zjMSRO WPlrHqeJdeJ7MziarRRRSUUUUUUcrcrf0cFQamqalHK7Su30bR6W4Xj2HIBQUUUV ICUUUUcgLyWWoCUUcgKIUUUlFJRRSUvKxlK7BRQKlFFAUFigBSCgJS0CKBSUKgUU CgAABISog5T3bjKoaiYlUkJSezFFFJMNYQ2AAAAAAAAAUFAAAACKhRRRRRRRSUUa pqmqalFqtJUGrOhqk4mqUtJqampqa/RqapquqRhbcdOIbqoSWMoZnG01aiZjs3Gf tdoO6lFFFFFFFFJRRRRRytyX9LwVBqmpqUclytrcHACgBSUqKJRRQALZYAFFABQB SUUUlFFHK2XClAAAFABCoUAAAABQAFACoFAqKAhl2c6KXHu6AiZdkpKWkprGFopR FSlAEUAARQAAABFEVAAAKKKKKKAKKTU1TU1KkAoqDWDWE1NTU0NTQ1NV1gqFSWZT WzU1NTU1KWpOVv6WxSiiiiiikoooooooXkDgoopKWjkF4ABRAoACgABQBAUAEKKK KSiilLAoAFBBQAAAAAARQAQUAAAEyZoopfLVgkpRQUsKAAAAAAAAAAAAAFAUUUUU UUUUUUUAAAUUUmpRRRQFFFFFAJRRqUUUUUUUUUUampRSgBRRRRRRRRRRRRRQKBRS UUUoAABRQAUAFAAAFFABRRRRQFFFAFFFAUUAUACoUUFAABQAUAAUAoIqSlFFFLEK gUUUUAAoAioqCoKICiCgAAAAAAAAAAAAAAAIogKAAAAIoAigAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAD//Z ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline Content-Type: image/gif Content-Location: http://bits.wikimedia.org/skins-1.5/monobook/bullet.gif Content-Transfer-Encoding: Base64 R0lGODlhBQANAIAAAGOMnP///yH5BAEAAAEALAAAAAAFAA0AAAIJjI+pu+APo4Sp ADs= ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/monobook/external.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAFVBMVEVmmcwzmcyZ zP8AZswAZv////////9E6giVAAAAB3RSTlP///////8AGksDRgAAADhJREFUGFcl y0ESAEAEA0Ei6/9P3sEcVB8kmrwFyni0bOeyyDpy9JTLEaOhQq7Ongf5FeMhHS/4 AVnsAZubxDVmAAAAAElFTkSuQmCC ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline Content-Type: image/gif Content-Location: http://bits.wikimedia.org/skins-1.5/monobook/user.gif Content-Transfer-Encoding: Base64 R0lGODlhEAAQAKU5AFtJMlpJNFxIMU5OTm2XH3aIVJNkK5FmMJZnPbt6NIZzXId0 XpVwQZRzR5p7VI1+baZ3Tdl+Kt1/LIO2JYe5K4q8M4idYZKBbJK/QLqddZfDR5rF TZ/HVqfMZanNacKVWuKVQ+ejVuelVu21bPC/e5+XjKOjo7rXhr3aiM+1kNi4icff m8rio83jqNHmrtXotOPEl/HDg/LKjvfaq/ngut3Z1Nvrwd/tx/vqz/////////// /////////////////yH5BAEAAD8ALAAAAAAQABAAAAZiwJ9wSCwafxfF5VhUNBgH AVO4cKRgHwNg+sjQZrFEYFpSyUihyGD6M4lAEgRbCKnPTaYRjjRYH00vLAUkFhoV fkQmNy4rJxYcGBQTiEImNi0TKB0bHgSTRX2hon1zpaanP0EAOw== ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=main.css Content-Type: text/css; name=main.css Content-Location: http://bits.wikimedia.org/skins-1.5/monobook/main.css?257z2 Content-Transfer-Encoding: 8bit /* ** MediaWiki 'monobook' style sheet for CSS2-capable browsers. ** Copyright Gabriel Wicke - http://wikidev.net/ ** License: GPL (http://www.gnu.org/copyleft/gpl.html) ** ** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John ** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher, ** Michael Zeltner and Geir Bækholt) ** All you guys rock :) */ #column-content { width: 100%; float: right; margin: 0 0 .6em -12.2em; padding: 0; } #content { margin: 2.8em 0 0 12.2em; padding: 0 1em 1em 1em; position: relative; z-index: 2; } #column-one { padding-top: 160px; } #content { background: white; color: black; border: 1px solid #aaa; border-right: none; line-height: 1.5em; } /* the left column width is specified in class .portlet */ /* Font size: ** We take advantage of keyword scaling- browsers won't go below 9px ** More at http://www.w3.org/2003/07/30-font-size ** http://style.cleverchimp.com/font_size_intervals/altintervals.html */ body { font: x-small sans-serif; background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat; color: black; margin: 0; padding: 0; } /* scale back up to a sane default */ #globalWrapper { font-size: 127%; width: 100%; margin: 0; padding: 0; } /* general styles */ table { font-size: 100%; color: black; /* we don't want the bottom borders of

s to be visible through floated tables */ background-color: white; } fieldset table { /* but keep table layouts in forms clean... */ background: none; } a { text-decoration: none; color: #002bb8; background: none; } a:visited { color: #5a3696; } a:active { color: #faa700; } a:hover { text-decoration: underline; } a.stub { color: #772233; } a.new, #p-personal a.new { color: #ba0000; } a.new:visited, #p-personal a.new:visited { color: #a55858; } img { border: none; vertical-align: middle; } p { margin: .4em 0 .5em 0; line-height: 1.5em; } p img { margin: 0; } hr { height: 1px; color: #aaa; background-color: #aaa; border: 0; margin: .2em 0 .2em 0; } h1, h2, h3, h4, h5, h6 { color: black; background: none; font-weight: normal; margin: 0; padding-top: .5em; padding-bottom: .17em; border-bottom: 1px solid #aaa; } h1 { font-size: 188%; } h1 .editsection { font-size: 53%; } h2 { font-size: 150%; } h2 .editsection { font-size: 67%; } h3, h4, h5, h6 { border-bottom: none; font-weight: bold; } h3 { font-size: 132%; } h3 .editsection { font-size: 76%; font-weight: normal; } h4 { font-size: 116%; } h4 .editsection { font-size: 86%; font-weight: normal; } h5 { font-size: 100%; } h5 .editsection { font-weight: normal; } h6 { font-size: 80%; } h6 .editsection { font-size: 125%; font-weight: normal; } ul { line-height: 1.5em; list-style-type: square; margin: .3em 0 0 1.5em; padding: 0; list-style-image: url(bullet.gif); } ol { line-height: 1.5em; margin: .3em 0 0 3.2em; padding: 0; list-style-image: none; } li { margin-bottom: .1em; } dt { font-weight: bold; margin-bottom: .1em; } dl { margin-top: .2em; margin-bottom: .5em; } dd { line-height: 1.5em; margin-left: 2em; margin-bottom: .1em; } fieldset { border: 1px solid #2f6fab; margin: 1em 0 1em 0; padding: 0 1em 1em; line-height: 1.5em; } fieldset.nested { margin: 0 0 0.5em 0; padding: 0 0.5em 0.5em; } legend { padding: .5em; font-size: 95%; } form { border: none; margin: 0; } textarea { width: 100%; padding: .1em; } input.historysubmit { padding: 0 .3em .3em .3em !important; font-size: 94%; cursor: pointer; height: 1.7em !important; margin-left: 1.6em; } select { vertical-align: top; } abbr, acronym, .explain { border-bottom: 1px dotted black; color: black; background: none; cursor: help; } q { font-family: Times, "Times New Roman", serif; font-style: italic; } /* disabled for now blockquote { font-family: Times, "Times New Roman", serif; font-style: italic; }*/ code { background-color: #f9f9f9; } pre { padding: 1em; border: 1px dashed #2f6fab; color: black; background-color: #f9f9f9; line-height: 1.1em; } /* ** the main content area */ #siteSub { display: none; } #jump-to-nav { display: none; } #contentSub, #contentSub2 { font-size: 84%; line-height: 1.2em; margin: 0 0 1.4em 1em; color: #7d7d7d; width: auto; } span.subpages { display: block; } /* Some space under the headers in the content area */ #bodyContent h1, #bodyContent h2 { margin-bottom: .6em; } #bodyContent h3, #bodyContent h4, #bodyContent h5 { margin-bottom: .3em; } #firstHeading { margin-bottom: .1em; /* These two rules hack around bug 2013 (fix for more limited bug 11325). When bug 2013 is fixed properly, they should be removed. */ line-height: 1.2em; padding-bottom: 0; } /* user notification thing */ .usermessage { background-color: #ffce7b; border: 1px solid #ffa500; color: black; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; } #siteNotice { text-align: center; font-size: 95%; padding: 0 0.9em; } #siteNotice p { margin: 0; padding: 0; } .catlinks { border: 1px solid #aaa; background-color: #f9f9f9; padding: 5px; margin-top: 1em; clear: both; } /* currently unused, intended to be used by a metadata box in the bottom-right corner of the content area */ .documentDescription { /* The summary text describing the document */ font-weight: bold; display: block; margin: 1em 0; line-height: 1.5em; } .documentByLine { text-align: right; font-size: 90%; clear: both; font-weight: normal; color: #76797c; } /* emulate center */ .center { width: 100%; text-align: center; } *.center * { margin-left: auto; margin-right: auto; } /* small for tables and similar */ .small, .small * { font-size: 94%; } table.small { font-size: 100%; } /* ** content styles */ #toc, .toc, .mw-warning { border: 1px solid #aaa; background-color: #f9f9f9; padding: 5px; font-size: 95%; } #toc h2, .toc h2 { display: inline; border: none; padding: 0; font-size: 100%; font-weight: bold; } #toc #toctitle, .toc #toctitle, #toc .toctitle, .toc .toctitle { text-align: center; } #toc ul, .toc ul { list-style-type: none; list-style-image: none; margin-left: 0; padding-left: 0; text-align: left; } #toc ul ul, .toc ul ul { margin: 0 0 0 2em; } #toc .toctoggle, .toc .toctoggle { font-size: 94%; } .mw-warning { margin-left: 50px; margin-right: 50px; text-align: center; } /* images */ div.floatright, table.floatright { clear: right; float: right; position: relative; margin: 0 0 .5em .5em; border: 0; /* border: .5em solid white; border-width: .5em 0 .8em 1.4em; */ } div.floatright p { font-style: italic; } div.floatleft, table.floatleft { float: left; clear: left; position: relative; margin: 0 .5em .5em 0; border: 0; /* margin: .3em .5em .5em 0; border: .5em solid white; border-width: .5em 1.4em .8em 0; */ } div.floatleft p { font-style: italic; } /* thumbnails */ div.thumb { margin-bottom: .5em; border-style: solid; border-color: white; width: auto; } div.thumbinner { border: 1px solid #ccc; padding: 3px !important; background-color: #f9f9f9; font-size: 94%; text-align: center; overflow: hidden; } html .thumbimage { border: 1px solid #ccc; } html .thumbcaption { border: none; text-align: left; line-height: 1.4em; padding: 3px !important; font-size: 94%; } div.magnify { float: right; border: none !important; background: none !important; } div.magnify a, div.magnify img { display: block; border: none !important; background: none !important; } div.tright { clear: right; float: right; border-width: .5em 0 .8em 1.4em; } div.tleft { float: left; clear: left; margin-right: .5em; border-width: .5em 1.4em .8em 0; } img.thumbborder { border: 1px solid #dddddd; } .hiddenStructure { display: none; } /* ** classes for special content elements like town boxes ** intended to be referenced directly from the wiki src */ /* ** User styles */ /* table standards */ table.rimage { float: right; position: relative; margin-left: 1em; margin-bottom: 1em; text-align: center; } .toccolours { border: 1px solid #aaa; background-color: #f9f9f9; padding: 5px; font-size: 95%; } /* ** edit views etc */ .special li { line-height: 1.4em; margin: 0; padding: 0; } /* ** keep the whitespace in front of the ^=, hides rule from konqueror ** this is css3, the validator doesn't like it when validating as css2 */ #bodyContent a.external, #bodyContent a.external[href ^="gopher://"] { background: url(external.png) center right no-repeat; padding: 0 13px; } .rtl #bodyContent a.external, .rtl #bodyContent a.external[href ^="gopher://"] { background-image: url(external-rtl.png); } #bodyContent a.external[href ^="https://"], .link-https { background: url(lock_icon.gif) center right no-repeat; padding: 0 16px; } #bodyContent a.external[href ^="mailto:"], .link-mailto { background: url(mail_icon.gif) center right no-repeat; padding: 0 18px; } #bodyContent a.external[href ^="news://"] { background: url(news_icon.png) center right no-repeat; padding: 0 18px; } #bodyContent a.external[href ^="ftp://"], .link-ftp { background: url(file_icon.gif) center right no-repeat; padding: 0 18px; } #bodyContent a.external[href ^="irc://"], .link-irc { background: url(discussionitem_icon.gif) center right no-repeat; padding: 0 18px; } #bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"], #bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"], #bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"], #bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"], #bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"], #bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"], .link-audio { background: url("audio.png") center right no-repeat; padding: 0 13px; } #bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"], #bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"], #bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"], #bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"], .link-video { background: url("video.png") center right no-repeat; padding: 0 13px; } #bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"], #bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"], #bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"], .link-document { background: url("document.png") center right no-repeat; padding: 0 12px; } /* for rtl wikis */ .rtl #bodyContent a.external { background-position: left; padding-right: 0; } .rtl a.feedlink { background-position: right; padding-right: 16px; padding-left: 0; } /* correction for ltr wikis */ .ltr #bodyContent a.external { padding-left: 0; } /* disable interwiki styling */ #bodyContent a.extiw, #bodyContent a.extiw:active { color: #36b; } #bodyContent a.external { color: #36b; } /* ** Structural Elements */ /* ** general portlet styles (elements in the quickbar) */ .portlet { border: none; margin: 0 0 .5em; padding: 0; float: none; width: 11.6em; overflow: hidden; } .portlet h4 { font-size: 95%; font-weight: normal; white-space: nowrap; } .portlet h5 { background: transparent; padding: 0 1em 0 .5em; display: inline; height: 1em; text-transform: lowercase; font-size: 91%; font-weight: normal; white-space: nowrap; } .portlet h6 { background: #ffae2e; border: 1px solid #2f6fab; border-style: solid solid none solid; padding: 0 1em 0 1em; text-transform: lowercase; display: block; font-size: 1em; height: 1.2em; font-weight: normal; white-space: nowrap; } .pBody { font-size: 95%; background-color: white; color: black; border-collapse: collapse; border: 1px solid #aaa; padding: 0 .8em .3em .5em; } .portlet h1, .portlet h2, .portlet h3, .portlet h4 { margin: 0; padding: 0; } .portlet ul { line-height: 1.5em; list-style-type: square; list-style-image: url(bullet.gif); font-size: 95%; } .portlet li { padding: 0; margin: 0; } /* ** Logo properties */ #p-logo { top: 0; left: 0; position: absolute; /*needed to use z-index */ z-index: 3; height: 155px; width: 12em; overflow: visible; } #p-logo h5 { display: none; } #p-logo a, #p-logo a:hover { display: block; height: 155px; width: 12.2em; background-repeat: no-repeat; background-position: 35% 50% !important; text-decoration: none; } /* ** Search portlet */ #p-search { position: relative; z-index: 3; } input.searchButton { margin-top: 1px; font-size: 95%; } #searchGoButton { padding-left: .5em; padding-right: .5em; font-weight: bold; } #searchInput { width: 10.9em; margin: 0; font-size: 95%; } #p-search .pBody { padding: .5em .4em .4em .4em; text-align: center; } #p-search #searchform div div { margin-top: .4em; font-size: 95%; } /* ** the personal toolbar */ #p-personal { position: absolute; left: 0; top: 0; z-index: 0; } #p-personal { width: 100%; white-space: nowrap; padding: 0; margin: 0; border: none; background: none; overflow: visible; line-height: 1.2em; } #p-personal h5 { display: none; } #p-personal .portlet, #p-personal .pBody { z-index: 0; padding: 0; margin: 0; border: none; overflow: visible; background: none; } /* this is the ul contained in the portlet */ #p-personal ul { border: none; line-height: 1.4em; color: #2f6fab; padding: 0 2em 0 3em; margin: 0; text-align: right; list-style: none; z-index: 0; background: none; cursor: default; } #p-personal li { z-index: 0; border: none; padding: 0; display: inline; color: #2f6fab; margin-left: 1em; line-height: 1.2em; background: none; } #p-personal li a { text-decoration: none; color: #005896; padding-bottom: .2em; background: none; } #p-personal li a:hover { background-color: white; padding-bottom: .2em; text-decoration: none; } #p-personal li.active a:hover { background-color: transparent; } /* the icon in front of the user name, single quotes in bg url to hide it from iemac */ li#pt-userpage, li#pt-anonuserpage, li#pt-login { background: url(user.gif) top left no-repeat; padding-left: 20px; text-transform: none; } #p-personal ul { text-transform: lowercase; } #p-personal li.active { font-weight: bold; } /* ** the page-related actions- page/talk, edit etc */ #p-cactions { position: absolute; top: 1.3em; left: 11.5em; margin: 0; white-space: nowrap; width: 76%; line-height: 1.1em; overflow: visible; background: none; border-collapse: collapse; padding-left: 1em; list-style: none; font-size: 95%; } #p-cactions ul { list-style: none; } #p-cactions li { display: inline; border: 1px solid #aaa; border-bottom: none; padding: 0 0 .1em 0; margin: 0 .3em 0 0; overflow: visible; background: white; } #p-cactions li.selected { border-color: #fabd23; padding: 0 0 .2em 0; font-weight: bold; } #p-cactions li a { background-color: #fbfbfb; color: #002bb8; border: none; padding: 0 .8em .3em; position: relative; z-index: 0; margin: 0; text-decoration: none; } #p-cactions li.selected a { z-index: 3; padding: 0 1em .2em!important; background-color: white; } #p-cactions .new a { color: #ba0000; } #p-cactions li a:hover { z-index: 3; text-decoration: none; background-color: white; } #p-cactions h5 { display: none; } #p-cactions li.istalk { margin-right: 0; } #p-cactions li.istalk a { padding-right: .5em; } #p-cactions #ca-addsection a { padding-left: .4em; padding-right: .4em; } /* offsets to distinguish the tab groups */ li#ca-talk { margin-right: 1.6em; } li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print { margin-left: 1.6em; } #p-cactions .pBody { font-size: 1em; background-color: transparent; color: inherit; border-collapse: inherit; border: 0; padding: 0; } #p-cactions .hiddenStructure { display: none; } #p-cactions li a { text-transform: lowercase; } #p-lang { position: relative; z-index: 3; } /* Override text-transform on languages where capitalization is significant */ .capitalize-all-nouns .portlet h5, .capitalize-all-nouns .portlet h6, .capitalize-all-nouns #p-personal ul, .capitalize-all-nouns #p-cactions ul li a { text-transform: none; } /* TODO: #t-iscite is only used by the Cite extension, come up with some * system which allows extensions to add to this file on the fly */ #t-ispermalink, #t-iscite { color: #999; } /* ** footer */ #footer { background-color: white; border-top: 1px solid #fabd23; border-bottom: 1px solid #fabd23; margin: .6em 0 1em 0; padding: .4em 0 1.2em 0; text-align: center; font-size: 90%; } #footer li { display: inline; margin: 0 1.3em; } #f-poweredbyico, #f-copyrightico { margin: 0 8px; position: relative; top: -2px; /* Bump it up just a tad */ } #f-poweredbyico { float: right; height: 1%; } #f-copyrightico { float: left; height: 1%; } .mw-htmlform-submit { font-weight: bold; padding-left: .3em; padding-right: .3em; margin-right: 2em; } /* js pref toc */ #preftoc { margin: 0; padding: 0; width: 100%; clear: both; } #preftoc li { background-color: #f0f0f0; color: #000; } #preftoc li { margin: 1px -2px 1px 2px; float: left; padding: 2px 0 3px 0; border: 1px solid #fff; border-right-color: #716f64; border-bottom: 0; position: relative; white-space: nowrap; list-style-type: none; list-style-image: none; z-index: 3; } #preftoc li.selected { font-weight: bold; background-color: #f9f9f9; border: 1px solid #aaa; border-bottom: none; cursor: default; top: 1px; padding-top: 2px; margin-right: -3px; } #preftoc > li.selected { top: 2px; } #preftoc a, #preftoc a:active { display: block; color: #000; padding: 0 .7em; position: relative; text-decoration: none; } #preftoc li.selected a { cursor: default; text-decoration: none; } #preferences { margin: 0; border: 1px solid #aaa; clear: both; padding: 1.5em; background-color: #F9F9F9; } .prefsection { border: none; padding: 0; margin: 0; } .prefsection legend { font-weight: bold; } .prefsection table, .prefsection legend { background-color: #F9F9F9; } .mainLegend { display: none; } td.htmlform-tip { font-size: x-small; padding: .2em 2em; color: #666; } .preferences-login { clear: both; margin-bottom: 1.5em; } .prefcache { font-size: 90%; margin-top: 2em; } div#userloginForm form, div#userlogin form#userlogin2 { margin: 0 3em 1em 0; border: 1px solid #aaa; clear: both; padding: 1.5em 2em; background-color: #f9f9f9; float: left; } .rtl div#userloginForm form, .rtl div#userlogin form#userlogin2 { float: right; } div#userloginForm table, div#userlogin form#userlogin2 table { background-color: #f9f9f9; } div#userloginForm h2, div#userlogin form#userlogin2 h2 { padding-top: 0; } div#userlogin .captcha, div#userloginForm .captcha { border: 1px solid #bbb; padding: 1.5em 2em; background-color: white; } #loginend, #signupend { clear: both; } #userloginprompt, #languagelinks { font-size: 85%; } #login-sectiontip { font-size: 85%; line-height: 1.2; padding-top: 2em; } #userlogin .loginText, #userlogin .loginPassword { width: 12em; } #userloginlink a, #wpLoginattempt, #wpCreateaccount { font-weight: bold; } /* ** IE/Mac fixes, hope to find a validating way to move this ** to a separate stylesheet. This would work but doesn't validate: ** @import("IEMacFixes.css"); */ /* tabs: border on the a, not the div */ * > html #p-cactions li { border: none; } * > html #p-cactions li a { border: 1px solid #aaa; border-bottom: none; } * > html #p-cactions li.selected a { border-color: #fabd23; } /* footer icons need a fixed width */ * > html #f-poweredbyico, * > html #f-copyrightico { width: 88px; } * > html #bodyContent, * > html #bodyContent pre { overflow-x: auto; width: 100%; padding-bottom: 25px; } /* more IE fixes */ /* float/negative margin brokenness */ * html #footer {margin-top: 0;} * html #column-content { display: inline; margin-bottom: 0; } * html div.editsection { font-size: smaller; } #pagehistory li.selected { position: relative; } /* Mac IE 5.0 fix; floated content turns invisible */ * > html #column-content { float: none; } * > html #column-one { position: absolute; left: 0; top: 0; } * > html #footer { margin-left: 13.2em; } .redirectText { font-size: 150%; margin: 5px; } .printfooter { display: none; } div.patrollink { clear: both; } .sharedUploadNotice { font-style: italic; } span.updatedmarker { color: black; background-color: #0f0; } .previewnote { color: #c00; margin-bottom: 1em; } .previewnote p { text-indent: 3em; margin: 0.8em 0; } .editExternally { border: 1px solid gray; background-color: #ffffff; padding: 3px; margin-top: 0.5em; float: left; font-size: small; text-align: center; } .editExternallyHelp { font-style: italic; color: gray; } .toggle { margin-left: 2em; text-indent: -2em; } input#wpSummary { width: 80%; } /* @bug 1714 */ input#wpSave, input#wpDiff { margin-right: 0.33em; } #wpSave { font-weight: bold; } /* Classes for article validation */ table.revisionform_default { border: 1px solid #000000; } table.revisionform_focus { border: 1px solid #000000; background-color:#00BBFF; } tr.revision_tr_default { background-color:#EEEEEE; } tr.revision_tr_first { background-color:#DDDDDD; } p.revision_saved { color: green; font-weight:bold; } /* noarticletext */ div.noarticletext { border: 1px solid #ccc; background: #fff; padding: .2em 1em; color: #000; } div#searchTargetContainer { left: 10px; top: 10px; width: 90%; background: white; } div#searchTarget { padding: 3px; margin: 5px; background: #F0F0F0; border: solid 1px blue; } div#searchTarget ul li { list-style: none; } div#searchTarget ul li:before { color: orange; content: "\00BB \0020"; } div#searchTargetHide { float:right; border:solid 1px black; background:#DCDCDC; padding:2px; } #powersearch p { margin-top:0px; } div.multipageimagenavbox { border: solid 1px silver; padding: 4px; margin: 1em; background: #f0f0f0; } div.multipageimagenavbox div.thumb { border: none; margin-left: 2em; margin-right: 2em; } div.multipageimagenavbox hr { margin: 6px; } table.multipageimage td { text-align: center; } .templatesUsed { margin-top: 1.5em; } .mw-summary-preview { margin: 0.1em 0; } /* Friendlier slave lag warnings */ div.mw-lag-warn-normal, div.mw-lag-warn-high { padding: 3px; text-align: center; margin: 3px auto; } div.mw-lag-warn-normal { border: 1px solid #FFCC66; background-color: #FFFFCC; } div.mw-lag-warn-high { font-weight: bold; border: 2px solid #FF0033; background-color: #FFCCCC; } .MediaTransformError { background-color: #ccc; padding: 0.1em; } .MediaTransformError td { text-align: center; vertical-align: middle; font-size: 90%; } /* God-damned hack for the crappy layout */ .os-suggest { font-size: 127%; } /* Sometimes people don't want personal tools to be lowercase! */ .no-text-transform { text-transform: none; } ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=main.css Content-Type: text/css; name=main.css Content-Location: http://bits.wikimedia.org/skins-1.5/chick/main.css?257z2 Content-Transfer-Encoding: 8bit /* ** MediaWiki 'chick' style sheet for PDAs or other small-screen devices. ** Copyright Timwi ** License: GPL (http://www.gnu.org/copyleft/gpl.html) ** ** Loosely based on Monobook by Gabriel Wicke */ body { font-family: sans-serif; color: Black; margin: 0; padding: 0.3em; } a { color: #002bb8; } a:visited { color: #5a3696; } a:active { color: #ffa500; } a.stub { color: #772233; } a.new, #p-personal a.new { color:#ba0000; } a.new:visited, #p-personal a.new:visited { color:#a55858; } img { border: none; vertical-align: middle; } p { margin: 0.4em 0em 0.5em 0em; line-height: 1.5em; } p img { margin: 0; } hr { height: 1px; color: #aaaaaa; background-color: #aaaaaa; border: 0; margin: 0.2em 0 0.2em 0; } h1, h2, h3, h4, h5, h6 { color: Black; background: none; font-weight: normal; margin: 0; padding-top: 0.5em; padding-bottom: 0.17em; border-bottom: 1px solid #aaaaaa; } .editsection { font-weight: normal; } h1 { font-size: 188%; } h1 .editsection { font-size: 53.2%; } h2 { font-size: 150%; } h2 .editsection { font-size: 66.7%; } h3, h4, h5, h6 { border-bottom: none; font-weight: bold; } h3 { font-size: 132%; } h3 .editsection { font-size: 75.8%; } h4 { font-size: 116%; } h4 .editsection { font-size: 86.2%; } h5 { font-size: 100%; } h6 { font-size: 80%; } h6 .editsection { font-size: 125%; } ul { line-height: 1.5em; margin: 0.3em 0 0 1.5em; padding:0; } ol { line-height: 1.5em; margin: 0.3em 0 0 3.2em; padding:0; list-style-image: none; } li { margin-bottom: 0.1em; } dt { font-weight: bold; margin-bottom: 0.1em; } dl{ margin-top: 0.2em; margin-bottom: 0.5em; } dd { line-height: 1.5em; margin-left: 2em; margin-bottom: 0.1em; } fieldset { border: 1px solid #2f6fab; margin: 1em 0em 1em 0em; padding: 0em 1em 1em 1em; line-height: 1.5em; } legend { background: White; padding: 0.5em; font-size: 95%; } form { border: none; margin: 0; } textarea { border: 1px solid #2f6fab; color: Black; background-color: white; width: 100%; padding: 0.1em; overflow: auto; } /* hide this from ie/mac and konq2.2 */ @media All { head:first-child+body input { visibility: visible; border: 1px solid #2f6fab; color: Black; background-color: white; vertical-align: middle; padding: 0.2em; } } input.historysubmit { padding: 0 0.3em 0.3em 0.3em !important; font-size: 94%; cursor: pointer; height: 1.7em !important; margin-left: 1.6em; } input[type="radio"], input[type="checkbox"] { border:none; } select { border: 1px solid #2f6fab; color: Black; vertical-align: top; } abbr, acronym, .explain { border-bottom: 1px dotted Black; color: Black; background: none; cursor: help; } q { font-family: Times, "Times New Roman", serif; font-style: italic; } code { background-color: #f9f9f9; } pre { padding: 1em; border: 1px dashed #2f6fab; color: Black; background-color: #f9f9f9; line-height: 1.1em; } /* ** the main content area */ span.subpages { display: block; } /* Some space under the headers in the content area */ #bodyContent h1, #bodyContent h2 { margin-bottom:0.6em; } #bodyContent h3, #bodyContent h4, #bodyContent h5 { margin-bottom: 0.3em; } #firstHeading { margin-bottom:0.1em; } /* user notification thing */ .usermessage { background-color: #ffce7b; border: 1px solid #ffa500; color: Black; font-weight: bold; margin: 0.1em 0 0 0; padding: 2px 5px; vertical-align: middle; } #siteNotice { text-align: center; font-size: 95%; padding: 0 0.9em 0 0.9em; } #siteNotice p { margin: 0; padding: 0; } .error { color: red; font-size: larger; } .catlinks { border:1px solid #aaaaaa; background-color:#f9f9f9; padding: 2px 5px; margin: 0.1em 0 0 0; clear: both; } .catlinks { margin: 0; padding: 0; } /* currently unused, intended to be used by a metadata box in the bottom-right corner of the content area */ .documentDescription { /* The summary text describing the document */ font-weight: bold; display: block; margin: 1em 0em; line-height: 1.5em; } .documentByLine { text-align: right; font-size: 90%; clear: both; font-weight: normal; color: #76797c; } /* emulate center */ .center { width: 100%; text-align: center; } *.center * { margin-left: auto; margin-right: auto; } /* small for tables and similar */ .small, .small * { font-size: 94%; } table.small { font-size: 100% } /* ** content styles */ #toc { /*border:1px solid #2f6fab;*/ border:1px solid #aaaaaa; background-color:#f9f9f9; padding:5px; font-size: 95%; } #toc ul { margin-left: 2em; } #toc .toctoggle { font-size: 94%; } #toc .editsection { margin-top: 0.7em; font-size: 94%; } /* images */ div.floatright, table.floatright { clear: right; float: right; margin: 0; position: relative; border: 0.5em solid White; border-width: 0.5em 0 0.8em 1.4em; } div.floatright p { font-style: italic; } div.floatleft, table.floatleft { float: left; clear: left; margin: 0.3em 0.5em 0.5em 0; position: relative; border: 0.5em solid White; border-width: 0.5em 1.4em 0.8em 0; } div.floatleft p { font-style: italic; } /* thumbnails */ div.thumb { margin-bottom: 0.5em; border-style: solid; border-color: White; width: auto; } div.thumb div { border:1px solid #cccccc; padding: 3px !important; background-color:#f9f9f9; font-size: 94%; text-align: center; overflow: hidden; } div.thumb div a img { border:1px solid #cccccc; } div.thumb div div.thumbcaption { border: none; text-align: left; line-height: 1.4em; padding: 0.3em 0 0.1em 0; } div.magnify { float: right; border: none !important; background: none !important; } div.magnify a, div.magnify img { display: block; border: none !important; background: none !important; } div.tright { clear: right; float: right; border-width: 0.5em 0 0.8em 1.4em; } div.tleft { float: left; clear: left; margin-right:0.5em; border-width: 0.5em 1.4em 0.8em 0; } img.thumbborder { border: 1px solid #dddddd; } .hiddenStructure { display: none; } /* ** classes for special content elements like town boxes ** intended to be referenced directly from the wiki src */ /* ** User styles */ /* table standards */ table.rimage { float:right; position:relative; margin-left:1em; margin-bottom:1em; text-align:center; } .toccolours { border:1px solid #aaaaaa; background-color:#f9f9f9; padding:5px; font-size: 95%; } /* ** edit views etc */ .special li { line-height: 1.4em; margin: 0; padding: 0; } a.external { color: #3366bb; } div#footer { text-align: center; } ul#f-list li { list-style: none; text-align: center; } div.portlet { margin: 0.5em 0; } .redirectText { font-size:150%; margin:5px; } ul.special li.not-patrolled, ol.special li.not-patrolled { background-color: #ffa; } div.patrollink { font-size: 75%; text-align: right; } span.updatedmarker { color:black; background-color:#00FF00; } div.gallerybox { width: 150px; } #xjump-to-nav { display: none; } .templatesUsed { margin-top: 1.5em; } .printfooter { display: none; } #footer { background-color: white; border-top: 1px solid #fabd23; border-bottom: 1px solid #fabd23; margin: .6em 0 1em 0; padding: .4em 0 1.2em 0; text-align: center; font-size: 90%; } #f-poweredbyico, #f-copyrightico { display: inline; } ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline Content-Type: image/gif Content-Location: http://upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif Content-Transfer-Encoding: Base64 R0lGODlhEAAQAMQfAOmNjMfHx9UqJ3Fvb9hoZqmpqbe3t96pqPn4+IeHh9ra2qRS UOXl5dtFQ9i2turq6uDg4NTT0+7u7uzMy/DX15OTk9/Ew99+fa89PN+Yl/Hp6eLi 4vPz8/v7+////////yH5BAEAAB8ALAAAAAAQABAAAAWgoCeO5PidHhOtQWC8Reyh EdLdOB5Usxd1HARnSOy0eD4gkUO5UHAJUaAjqVYBl8zjgYh6pg/J9mFpZBiMrsjQ GaMZDQsEovYYEI/3hiEQWBQcA2scaBtzBxkZcRoDCB4FhBuGEBcOCg19GBePHJJz CgQEDQQZBxgAjwiTChcNlSuBIhVpHBMNDRRiDxwKgo8JFQkCGAsJA8fHXiQAuCUj IQA7 ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline Content-Type: image/png Content-Location: http://upload.wikimedia.org/wikipedia/en/d/d4/Monobook-bullet-star.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAMAAABM3rQ0AAAAPFBMVEX6vSP6vST6 wTD6wTH6wzb7xT/7xkH7y1L8023813n82YL935X94Jn+8tT+89j+9+X++On/+u7/ /Pb///+vc6SvAAAAQklEQVQI14XLNxIAIAwDQZFz9P//ij0DNVdtIYFe+Ks+NbSr iCgqwQAwoWB6SH6ChmXYITvHcvLYSietNqvnRSt3OtJtBjsXtm3VAAAAAElFTkSu QmCC ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline Content-Type: image/png Content-Location: http://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Art%C3%ADculo_bueno.svg/10px-Art%C3%ADculo_bueno.svg.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABmJLR0QA/wD/AP+g vaeTAAAAB3RJTUUH2AsFFzMsrW1J5wAAAY5JREFUGJU10MFL02EcwOHP+31/m5ua CokiZEjg2ikTp52cEXUQCzpY6NmIqINC6KFDXryJOIQoB0VBVtJYxAqCMJCIKBZN XG0R5lZNDVNj6PS3Od8u9fwJj+KfcDjsefb99Uh8faFlM5+zq11VibzJ+5Ib6Xt/ JuaGFcCDx48uBOYfTqpSJedbO6lwlTP+8i6flxZQKGNEnbAikUjTncTTYF1djRo9 N4gWTTQVJ7H8DS2Cpa2cvbUTk+2iPTCbiarrZ66gRQMw+uI2xhjGe65xqaOnDKe+ KOns8rFDtQepKt0HQOp3hmgqztnmk3Qd6eC4tw2H6FPiEEu27BxfVhYBeLc4hxZh qLMPAINBlHJbB8pqXv1YWzncfbOfo/Ve3A4Xfk8rtRXVAMTSSQrF4ntxO12B0w3+ 3fbGFkosJzOJt7Q3+gDIbPwiODu9t8duUAFMPwn1BmJT9wvOouwvr8TvaQNluDEz ZVaz65cLk19vqf/hoVDI+/znm7GPq0lf1t4UEf1paWftam5i/gPAXwbBl4evuw81 AAAAAElFTkSuQmCC ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=index.css Content-Type: text/css; charset=utf-8; name=index.css Content-Location: http://es.wikipedia.org/w/index.php?title=MediaWiki:Common.css&usemsgcache=yes&ctype=text%2Fcss&smaxage=2678400&action=raw&maxage=2678400 Content-Transfer-Encoding: 8bit /* Common CSS para todas las pieles */ /* Arregla problemas interlineado para y */ sup, sub { line-height: 1em; } /* Códigos sobre referencias */ ol.references {font-size: 100%} .references-small {font-size: 90%} .references-2column {font-size: 90%; -moz-column-count: 2; column-count:2} /* Las referencias ahora no pueden ser texto en negrita o italico */ sup.reference { font-weight: normal; font-style: normal; } /* Colorea de azul al clickear referencias */ ol.references > li:target, sup.reference:target, span.citation:target, cite:target { background-color: #DEF; } /* Estilo para citacion */ span.citation, cite { font-style: normal; word-wrap: break-word; } /* Esto permite arreglar las duplicaciones de urls en plantillas de referencias como Plantilla:Citación. */ @media screen, handheld, projection { span.citation *.printonly, cite *.printonly { display: none; } } /* Llamadas al pie: Quitar corchetes */ .corchete-llamada {display: none} /* [[Plantilla:Listaref]] */ @media print { .listaref { -moz-column-count: 1 !important } } /* CSS para infoboxes */ .infobox { border: 1px solid #aaa; background-color: #f9f9f9; color: #000; margin-bottom: 0.5em; margin-left: 1em; padding: 0.2em; float: right; clear: right; } .infobox td, .infobox th, .infobox_v2 td, .infobox_v2 th { vertical-align: top; } .infobox caption { font-size: larger; margin-left: inherit; } /* infoboxes V2 ("nuevas") */ .infobox_v2 { border: 1px solid #B4BBC8; background-color: #f9f9f9; color: #000; margin: .5em 0 .5em 1em; padding: .4em; clear: right; float: right; font-size: 90%; line-height: 1.5em; width: 22.5em } .infobox_v2 .cabecera { font-size: 140%; font-weight: bolder; height: 45px; line-height: 1.2em; text-align: center; vertical-align: middle } .infobox_v2 .media { font-weight: bolder; height: 35px; text-align: center; vertical-align: middle } /* Gráficos transparentes de cabecera */ .cabecera.default {} .media.audio {background:url(http://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Gnome-speakernotes.png/35px-Gnome-speakernotes.png) no-repeat top left} .media.video {background:url(http://upload.wikimedia.org/wikipedia/en/thumb/2/20/Tango-video-x-generic.png/35px-Tango-video-x-generic.png) no-repeat top left} /* Códigos para tipos especificos de infoboxes */ .infobox.bordered { border-collapse: collapse; } .infobox.bordered td, .infobox.bordered th { border: 1px solid #B4BBC8; } .infobox.bordered .borderless td, .infobox.bordered .borderless th { border: 0; } .infobox.sisterproject { width: 20em; font-size: 90%; } @media print { .infobox.sisterproject { display: none; } } .infobox.geography, .infobox_v2.geography { text-align: left; border-collapse: collapse; line-height: 1.2em; font-size: 90%; border: solid 1px #B4BBC8; } .infobox.geography td, .infobox.geography th, .infobox_v2.geography td, .infobox_v2.geography th { border-top: solid 1px #B4BBC8; padding: .4em .6em; } .infobox.geography .mergedtoprow td, .infobox.geography .mergedtoprow th, .infobox_v2.geography .mergedtoprow td, .infobox_v2.geography .mergedtoprow th { border-top: solid 1px #B4BBC8; padding: .4em .6em .2em .6em; } .infobox.geography .mergedrow td, .infobox.geography .mergedrow th, .infobox_v2.geography .mergedrow td, .infobox_v2.geography .mergedrow td { border: 0; padding: 0 .6em .2em .6em; } .infobox.geography .mergedbottomrow td, .infobox.geography .mergedbottomrow th, .infobox_v2.geography .mergedbottomrow td, .infobox_v2.geography .mergedbottomrow th { border-top: 0; border-bottom: solid 1px #B4BBC8; padding: 0 .6em .4em .6em; } .infobox.geography .maptable td, .infobox.geography .maptable th, .infobox_v2.geography .maptable td, .infobox_v2.geography .maptable th { border: 0; padding: 0; } /* Infobox sin uso conocido, deberia ser borrado al comprobarse que ya no se usa */ .InfoDerecha { clear: right; float: right; margin: 0 0 1em 1em; } /* CSS relacionado con el uso de coordenadas To display coordinates using the notation in the source code, write this in your User:Username/monobook.css: .geo-default {display: inline} .geo-nondefault {display: none} .geo-dec {display: inline} .geo-dms {display: inline} To display coordinates using decimal notation, write this in your User:Username/monobook.css: .geo-default {display: inline} .geo-nondefault {display: inline} .geo-dec {display: inline} .geo-dms {display: none} To display coordinates using DMS notation, write this in your User:Username/monobook.css: .geo-default {display: inline} .geo-nondefault {display: inline} .geo-dec {display: none} .geo-dms {display: inline} To display coordinates in both decimal and DMS notation, write this in your User:Username/monobook.css: .geo-default {display: inline} .geo-nondefault {display: inline} .geo-dec {display: inline} .geo-dms {display: inline} .geo-multi-punct {display: inline} See [[Plantilla:Coor link]] for how these are used. Note that the classes "geo", "longitude", and "latitude" are not just styles but also used by the [[Geo microformat]], so the names should not be changed. */ /* CSS predeterminado, puede modificarse usando las reglas de arriba */ .geo-default, .geo-dms, .geo-dec { display: inline; } .geo-nondefault, .geo-multi-punct { display: none; } .longitude, .latitude { white-space: nowrap; } /* This is used for the Geo microformat, but no style is needed for now other than .geo-dec. */ .geo {} /*******************************************************************/ /********* Estilos para diferentes funcionalidades menores *********/ /*******************************************************************/ /* Desambiguaciones */ #disambig { border-top: 3px double #ccc; border-bottom: 3px double #ccc; } /* Plantilla de cita */ .citado { font-size: 90%; background-color: #F9F9F9; padding: 5px 10px; } /* Estilos para sitenotice y similares */ .notice { text-align: justify; margin: 1em; padding: 0.2em; } /* Support for Template:IPA, Template:Unicode and Template:Polytonic. * The second declarations reset the styles for all browsers except * IE6, which chokes on the empty comment tags. */ .IPA { font-family: "Charis SIL", "Doulos SIL", Gentium, GentiumAlt, "DejaVu Sans", Code2000, "TITUS Cyberbit Basic", "Arial Unicode MS", "Lucida Sans Unicode", "Chrysanthi Unicode"; font-family /**/: inherit; } .Unicode { font-family: Code2000, Code2001, "Free Serif", "TITUS Cyberbit Basic", "Doulos SIL", "Chrysanthi Unicode", "Bitstream Cyberbit", "Bitstream CyberBase", Thryomanes, Gentium, GentiumAlt, "Lucida Grande", "Free Sans", "Arial Unicode MS", "Microsoft Sans Serif", "Lucida Sans Unicode"; font-family /**/: inherit; } .polytonic { font-family: "Athena Unicode", Gentium, "Palatino Linotype", "Arial Unicode MS", "Lucida Sans Unicode", "Lucida Grande", Code2000; font-family /**/: inherit; } /* Ayudita para [[Especial:Allpages]] y categorías: los redirects aparecen en cursiva */ .allpagesredirect, .redirect-in-category {font-style: italic} /* Cambiar el icono de los archivos PDF */ #bodyContent a[href$=".pdf"].external, #bodyContent a[href*=".pdf?"].external, #bodyContent a[href*=".pdf#"].external, #bodyContent a[href$=".PDF"].external, #bodyContent a[href*=".PDF?"].external, #bodyContent a[href*=".PDF#"].external { background: url(http://upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif) center right no-repeat; padding-right: 16px; } /* Change the external link icon to an Adobe icon anywhere the PDFlink class */ span.PDFlink a { background: url("http://upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") center right no-repeat; padding-right: 17px; } /* Ocultar texto para los no bibliotecarios */ .para_biblios {display: none} .rotate_0 {display: block} .rotate_1, .rotate_2, .rotate_3, .rotate_4, .rotate_5, .rotate_6, .rotate_7, .rotate_8, .rotate_9 {display: none} .mw-specialpages-table, /* [[Especial:SpecialPages]]: alinear a la izquierda, en vez de estar justificado */ body.ns-14 div#mw-pages /* Categorías con alineación a la izquierda, no justificada */ {text-align:left} /* otros */ body.page-Especial_Registro fieldset p small {font-size:100%} /* [[Plantilla:No firmado]], más pequeño */ span.nofirmado {font-size:smaller} /* Simbolos para destacados y buenos en interwikis, traidos desde monobook.css */ li.destacado { list-style-image: url("http://upload.wikimedia.org/wikipedia/en/d/d4/Monobook-bullet-star.png"); list-style-type: square; margin-left: 2px; } li.bueno { list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Art%C3%ADculo_bueno.svg/10px-Art%C3%ADculo_bueno.svg.png"); list-style-type: square; margin-left: 2px; } /*InterProject */ .interProject { display:none; clear: both; border-top: 2px dotted #aaa; margin-top: 2em; } /* CSS para plegables, documentación en [[:en:Wikipedia:NavFrame]] */ div.NavFrame { margin: 0; padding: 4px; border: 1px solid #aaa; text-align: center; border-collapse: collapse; font-size: 95%; } div.NavFrame + div.NavFrame { border-top-style: none; border-top-style: hidden; } div.NavPic { background-color: #fff; margin: 0; padding: 2px; float: left; } div.NavFrame div.NavHead { height: 1.6em; font-weight: bold; background-color: #ccf; position: relative; } div.NavFrame p, div.NavFrame div.NavContent, div.NavFrame div.NavContent p { font-size: 100%; } div.NavEnd { margin: 0; padding: 0; line-height: 1px; clear: both; } a.NavToggle { position: absolute; top: 0; right: 3px; font-weight: normal; font-size: 90%; } /* TABLAS */ /* La clase wikitable ya existe en shared.css; y prettytable esta obsoleta, cuando se reemplaze todas las llamadas a prettytable eliminar estas reglas */ table.wikitable, table.prettytable { margin: 1em 1em 1em 1em; padding: 0.5em; font-size: 95%; background-color: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; } table.wikitable th, table.wikitable td, table.prettytable th, table.prettytable td { border: 1px #aaa solid; padding: 0.2em; } table.wikitable th, table.prettytable th { background-color: #f2f2f2; text-align: center; } table.wikitable caption, table.prettytable caption { margin-left: inherit; margin-right: inherit; } /*** Cajas de aviso en discusión nuevas (ambox) que son blancas y con * una cinta de color a la izquierda */ table.ambox { margin: 0 10%; /* Will not overlap with other elements */ border-collapse: collapse; background-color: #fbfbfb; border: 1px solid #aaa; border-left: 10px solid #1e90ff; /* Default "notice" blue */ } table.ambox th.ambox-text, table.ambox td.ambox-text { /* The message body cell(s) */ padding: 0.25em 0.5em; /* 0.5em left/right */ width: 100%; /* Make all templates the same width regardless of text size */ } table.ambox td.ambox-image { /* The left image cell */ padding: 2px 0px 2px 0.5em; /* 0.5em left, 0px right */ text-align: center; } table.ambox td.ambox-imageright { /* The right image cell */ padding: 2px 4px 2px 0px; /* 0px left, 4px right */ text-align: center; } table.ambox-notice {border-left: 10px solid #1e90ff} /* Blue */ table.ambox-delete, table.ambox-serious {border-left: 10px solid #b22222} /* Red */ table.ambox-content {border-left: 10px solid #f28500} /* Orange */ table.ambox-style {border-left: 10px solid #f4c430} /* Yellow */ table.ambox-merge {border-left: 10px solid #9932cc} /* Purple */ table.ambox-growth {border-left: 10px solid #228b22} /* Green */ table.ambox-protection {border-left: 10px solid #bba} /* Gray */ table.ambox.ambox-mini { /* Small floating box variant */ float: right; clear: right; margin: 0 0 0 1em; width: 25%; } @media print { /* Do not print article message box */ .ambox {display: none} } /* Ciertas cajas para discusión que NO son ambox (no tienen cinta de color) por ejemplo, la caja grande de artículo destacado */ .messagebox { border: 1px solid #aaa; background-color: #f9f9f9; width: 80%; margin: 0 auto 1em auto; padding: .2em; } .messagebox.merge { border: 1px solid #c0b8cc; background-color: #f0e5ff; text-align: center; } .messagebox.cleanup { border: 1px solid #9f9fff; background-color: #efefff; text-align: center; } .messagebox.standard-talk { border: 1px solid #c0c090; background-color: #f8eaba; margin: 4px auto; } /** Estilos para tablas. ** EXPERIMENTAL ** la idea es, si se quiere que la primera columna de la tabla esté alineada a la derecha, la segunda centrada y la tercera a la izquierda, usar {| class="col1der col2cen col3izq" en vez de repetir "style='text-align:right'", etc, en '''cada''' celda **/ table.col1der TD:first-child {text-align:right} table.col1izq TD:first-child {text-align:left} table.col1cen TD:first-child {text-align:center} table.col2der TD:first-child + TD {text-align:right} table.col2izq TD:first-child + TD {text-align:left} table.col2cen TD:first-child + TD {text-align:center} table.col3der TD:first-child + TD + TD {text-align:right} table.col3izq TD:first-child + TD + TD {text-align:left} table.col3cen TD:first-child + TD + TD {text-align:center} table.col4der TD:first-child + TD + TD + TD {text-align:right} table.col4izq TD:first-child + TD + TD + TD {text-align:left} table.col4cen TD:first-child + TD + TD + TD {text-align:center} table.col5der TD:first-child + TD + TD + TD + TD {text-align:right} table.col5izq TD:first-child + TD + TD + TD + TD {text-align:left} table.col5cen TD:first-child + TD + TD + TD + TD {text-align:center} /* Put a checker background at the image description page only visible if the image has transparent background */ #file img {background: url(http://upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png) repeat} /* Disponibilidad para tareas de mantenimiento/Tablas por día/semana */ table.user-availability { text-align:center; border:1px solid #333366; } table.user-availability th { font-size:110% } table.user-availability .toprow td+td { width:30px; height:10px; background-color:#eee; border:1px solid #aaa } table.user-availability .off { font-size:80%; border:1px solid #aaa; background-color:#fff; } table.user-availability .onn { font-size:80%; border:1px solid #aaa; background-color:#cfc; } table.user-availability .wrk { font-size:80%; border:1px solid #aaa; background-color:#ccf; } table.user-availability .cll { font-size:80%; border:1px solid #aaa; background-color:#ffd; } table.user-availability .key { font-size:90%; border-top:1px dashed #000; text-align:right } table.user-availability .key span { padding:2px } /* Clases obsoletas, reemplazar por "plainlinks nourlexpansion" Quita padding para enlaces externos mostrados sin icono [[Plantilla:Ref]] ya no se usa asi que no tiene muchos usos */ #bodyContent .plainlinks a, .plainlinksneverexpand { background: none !important; padding: 0 !important; } .plainlinksneverexpand .urlexpansion { display : none !important; } .plainlinksneverexpand a { background: none !important; padding: 0 !important } /* With MediaWiki 1.5, the mechanism has changed: instead of a SPAN of class "urlexpansion" following the anchor A, the anchor itself now has class "external autonumber" and the expansion is inserted when printing (see the common printing style sheet at http://en.wikipedia.org/skins-1.5/common/commonPrint.css) using the ":after" pseudo- element of CSS. We have to switch this off for links due to Template:Ref! */ .plainlinksneverexpand a.external.text:after { display: none !important; } .plainlinksneverexpand a.external.autonumber:after { display: none !important; } .border-radius4 { border-radius: 4px; /* CSS 3 */ -moz-border-radius: 4px; /* Firefox */ -webkit-border-radius: 4px; /* Safari 3.0+ */ } .border-radius6 { border-radius: 6px; /* CSS 3 */ -moz-border-radius: 6px; /* Firefox */ -webkit-border-radius: 6px; /* Safari 3.0+ */ } /* Esconder la caja de "Tema/título" en algunas páginas */ body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Protección_de_artículos_Actual span.mw-summary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Protección_de_artículos_Actual input#wpSummary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Fusión_de_historiales_Actual span.mw-summary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Fusión_de_historiales_Actual input#wpSummary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Violaciones_de_etiqueta_Actual span.mw-summary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Violaciones_de_etiqueta_Actual input#wpSummary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_3RR_Actual span.mw-summary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_3RR_Actual input#wpSummary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Solicitudes_de_restauración_Actual span.mw-summary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Solicitudes_de_restauración_Actual input#wpSummary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Reversor_Actual span.mw-summary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Reversor_Actual input#wpSummary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Solicitudes_de_nueva_consulta_Actual span.mw-summary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Solicitudes_de_nueva_consulta_Actual input#wpSummary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Miscelánea_Actual span.mw-summary, body.page-Wikipedia_Tablón_de_anuncios_de_los_bibliotecarios_Portal_Archivo_Miscelánea_Actual input#wpSummary, body.page-Wikipedia_Vandalismo_en_curso span.mw-summary, {display: none} .abbr {/* al estilo de la etiquieta */ cursor: help; border-bottom: 1px dotted #000; } ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=index.css Content-Type: text/css; charset=utf-8; name=index.css Content-Location: http://es.wikipedia.org/w/index.php?title=MediaWiki:Print.css&usemsgcache=yes&ctype=text%2Fcss&smaxage=2678400&action=raw&maxage=2678400 Content-Transfer-Encoding: 8bit /* CSS placed here will affect the print output */ .ns-0 .ambox, .ns-104 .ambox, .ns-0 .navbox, .ns-104 .navbox, .ns-0 .infobox.sisterproject, .ns-104 .infobox.sisterproject, .ns-0 .dablink, .ns-104 .dablink, .ns-0 .metadata, .ns-104 .metadata, #privacy, #about, #disclaimer, #contentSub, .editlink, span.collapseButton, a.NavToggle, .noprint { display: none; } /* Add formatting to make sure that "external references" from templates like [[Template:Ref]] do not get URL expansion, not even when printed. The anchor itself has class "external autonumber" and the url expansion is inserted when printing (see the common printing style sheet at http://en.wikipedia.org/skins-1.5/common/commonPrint.css) using the ":after" pseudo-element of CSS. Also hide in elements. */ #content cite a.external.text:after, .nourlexpansion a.external.text:after, .nourlexpansion a.external.autonumber:after { display: none !important; } ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=index.css Content-Type: text/css; charset=utf-8; name=index.css Content-Location: http://es.wikipedia.org/w/index.php?title=MediaWiki:Handheld.css&usemsgcache=yes&ctype=text%2Fcss&smaxage=2678400&action=raw&maxage=2678400 Content-Transfer-Encoding: 8bit /* CSS placed here will affect handheld devices based on the skin configured in $wgHandheldStyle */ ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=index.css Content-Type: text/css; charset=utf-8; name=index.css Content-Location: http://es.wikipedia.org/w/index.php?title=MediaWiki:Monobook.css&usemsgcache=yes&ctype=text%2Fcss&smaxage=2678400&action=raw&maxage=2678400 Content-Transfer-Encoding: 8bit @media print {#content { background: white } } /* Fondo blanco al imprimir */ a { text-decoration: none} /* Los enlaces no van subrayados */ a:hover { text-decoration: underline} /* "editar" en minúscula en algunas páginas especiales */ body.page-Especial_RedireccionesDobles a.new, body.page-Especial_Artilugios h2 a, body.page-Especial_Desambiguaciones ol.special li a[href *="/w/index.php"] { text-transform: lowercase } /* Ocultar título y categorías en la Portada*/ body.page-Wikipedia_Portada h1.firstHeading, body.page-Wikipedia_Portada #catlinks { display:none; } div.alreadyloggedin {color: red; font-weight: bold} /* Aviso rojo en ([[MediaWiki:Alreadyloggedin]]) */ form#userlogin { float: left; padding: 1em 1em .7em 1em; background-color: #ffffe6; border: 2px solid #fc6; color: #000; margin-right: 2em; } form#userlogin table { float: left; background-color: #ffffe6; color: #000; } .error {font-weight: bold} /* redondeo de esquinas en ciertos navegadores */ .pBody { padding: 0.3em 0.1em; -moz-border-radius-topright: 0.5em; } .portlet h5 { background-color: #e0e3e6; border: thin solid silver; -moz-border-radius-topright: 0.5em; } /* CSS de tablas */ table.metadata { border: 1px solid #aaaaaa; display: none; /* A definir por cada usuario */ } .metadata-label {color: #aaaaaa} .searchbox .searchboxInput {background-color: transparent} #content {-moz-border-radius-topleft: 0.5em} #coordinates { position: absolute; z-index: 1; border: none; background: none; right: 20px; top: 3.7em; float: right; margin: 0.0em; padding: 0.0em; line-height: 1.5em; text-align: right; text-indent: 0; font-size: 85%; text-transform: none; white-space: nowrap; } #siteNotice {margin-top: 5px; margin-bottom: -.5em} /* Donations link to be uncommented during fundraising drives */ #ca-edit a {font-weight: bold !important} /* Bold 'edit this page' link to encourage newcomers */ #mw-dismissable-notice {background: transparent} #pt-login {font-weight: bold; font-size: 110%} ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=index.css Content-Type: text/css; charset=utf-8; name=index.css Content-Location: http://es.wikipedia.org/w/index.php?title=-&action=raw&maxage=2678400&gen=css Content-Transfer-Encoding: 8bit /* generated user stylesheet */ a.new, #quickbar a.new { color: #CC2200; } ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=wikibits.js Content-Type: application/x-javascript; name=wikibits.js Content-Location: http://bits.wikimedia.org/skins-1.5/common/wikibits.js?urid=257z2_1254880607 Content-Transfer-Encoding: Base64 Ly8gTWVkaWFXaWtpIEphdmFTY3JpcHQgc3VwcG9ydCBmdW5jdGlvbnMKCnZhciBj bGllbnRQQyA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsgLy8g R2V0IGNsaWVudCBpbmZvCnZhciBpc19nZWNrbyA9IC9nZWNrby8udGVzdCggY2xp ZW50UEMgKSAmJgoJIS9raHRtbHxzcG9vZmVyfG5ldHNjYXBlXC83XC4wLy50ZXN0 KGNsaWVudFBDKTsKdmFyIHdlYmtpdF9tYXRjaCA9IGNsaWVudFBDLm1hdGNoKC9h cHBsZXdlYmtpdFwvKFxkKykvKTsKaWYgKHdlYmtpdF9tYXRjaCkgewoJdmFyIGlz X3NhZmFyaSA9IGNsaWVudFBDLmluZGV4T2YoJ2FwcGxld2Via2l0JykgIT0gLTEg JiYKCQljbGllbnRQQy5pbmRleE9mKCdzcG9vZmVyJykgPT0gLTE7Cgl2YXIgaXNf c2FmYXJpX3dpbiA9IGlzX3NhZmFyaSAmJiBjbGllbnRQQy5pbmRleE9mKCd3aW5k b3dzJykgIT0gLTE7Cgl2YXIgd2Via2l0X3ZlcnNpb24gPSBwYXJzZUludCh3ZWJr aXRfbWF0Y2hbMV0pOwp9Ci8vIEZvciBhY2Nlc3NrZXlzOyBub3RlIHRoYXQgRkYz KyBpcyBpbmNsdWRlZCBoZXJlIQp2YXIgaXNfZmYyID0gL2ZpcmVmb3hcL1syLTld fG1pbmVmaWVsZFwvMy8udGVzdCggY2xpZW50UEMgKTsKdmFyIGZmMl9idWdzID0g L2ZpcmVmb3hcLzIvLnRlc3QoIGNsaWVudFBDICk7Ci8vIFRoZXNlIGFyZW4ndCB1 c2VkIGhlcmUsIGJ1dCBzb21lIGN1c3RvbSBzY3JpcHRzIHJlbHkgb24gdGhlbQp2 YXIgaXNfZmYyX3dpbiA9IGlzX2ZmMiAmJiBjbGllbnRQQy5pbmRleE9mKCd3aW5k b3dzJykgIT0gLTE7CnZhciBpc19mZjJfeDExID0gaXNfZmYyICYmIGNsaWVudFBD LmluZGV4T2YoJ3gxMScpICE9IC0xOwppZiAoY2xpZW50UEMuaW5kZXhPZignb3Bl cmEnKSAhPSAtMSkgewoJdmFyIGlzX29wZXJhID0gdHJ1ZTsKCXZhciBpc19vcGVy YV9wcmVzZXZlbiA9IHdpbmRvdy5vcGVyYSAmJiAhZG9jdW1lbnQuY2hpbGROb2Rl czsKCXZhciBpc19vcGVyYV9zZXZlbiA9IHdpbmRvdy5vcGVyYSAmJiBkb2N1bWVu dC5jaGlsZE5vZGVzOwoJdmFyIGlzX29wZXJhXzk1ID0gL29wZXJhXC8oOVwuWzUt OV18WzEtOV1bMC05XSkvLnRlc3QoIGNsaWVudFBDICk7Cgl2YXIgb3BlcmE2X2J1 Z3MgPSBpc19vcGVyYV9wcmVzZXZlbjsKCXZhciBvcGVyYTdfYnVncyA9IGlzX29w ZXJhX3NldmVuICYmICFpc19vcGVyYV85NTsKCXZhciBvcGVyYTk1X2J1Z3MgPSAv b3BlcmFcLyg5XC41KS8udGVzdCggY2xpZW50UEMgKTsKfQoKLy8gR2xvYmFsIGV4 dGVybmFsIG9iamVjdHMgdXNlZCBieSB0aGlzIHNjcmlwdC4KLypleHRlcm4gdGEs IHN0eWxlcGF0aCwgc2tpbiAqLwoKLy8gYWRkIGFueSBvbmxvYWQgZnVuY3Rpb25z IGluIHRoaXMgaG9vayAocGxlYXNlIGRvbid0IGhhcmQtY29kZSBhbnkgZXZlbnRz IGluIHRoZSB4aHRtbCBzb3VyY2UpCnZhciBkb25lT25sb2FkSG9vazsKCmlmICgh d2luZG93Lm9ubG9hZEZ1bmN0cykgewoJdmFyIG9ubG9hZEZ1bmN0cyA9IFtdOwp9 CgovLyBjb2RlIHRoYXQgaXMgZGVwZW5kZW50IG9uIGpzMiBmdW5jdGlvbnMgc2hv dWxkIHVzZSBqczJBZGRPbmxvYWRIb29rCmZ1bmN0aW9uIGFkZE9ubG9hZEhvb2so aG9va0Z1bmN0KSB7CgkvLyBBbGxvd3MgYWRkLW9uIHNjcmlwdHMgdG8gYWRkIG9u bG9hZCBmdW5jdGlvbnMKCWlmKCFkb25lT25sb2FkSG9vaykgewoJCW9ubG9hZEZ1 bmN0c1tvbmxvYWRGdW5jdHMubGVuZ3RoXSA9IGhvb2tGdW5jdDsKCX0gZWxzZSB7 CgkJaG9va0Z1bmN0KCk7ICAvLyBidWcgaW4gTVNJRSBzY3JpcHQgbG9hZGluZwoJ fQp9CgoKZnVuY3Rpb24gaG9va0V2ZW50KGhvb2tOYW1lLCBob29rRnVuY3QpIHsK CWFkZEhhbmRsZXIod2luZG93LCBob29rTmFtZSwgaG9va0Z1bmN0KTsKfQoKZnVu Y3Rpb24gaW1wb3J0U2NyaXB0KHBhZ2UpIHsKCS8vIFRPRE86IG1pZ2h0IHdhbnQg dG8gaW50cm9kdWNlIGEgdXRpbGl0eSBmdW5jdGlvbiB0byBtYXRjaCB3ZlVybGVu Y29kZSgpIGluIFBIUAoJdmFyIHVyaSA9IHdnU2NyaXB0ICsgJz90aXRsZT0nICsK CQllbmNvZGVVUklDb21wb25lbnQocGFnZS5yZXBsYWNlKC8gL2csJ18nKSkucmVw bGFjZSgvJTJGL2lnLCcvJykucmVwbGFjZSgvJTNBL2lnLCc6JykgKwoJCScmYWN0 aW9uPXJhdyZjdHlwZT10ZXh0L2phdmFzY3JpcHQnOwoJcmV0dXJuIGltcG9ydFNj cmlwdFVSSSh1cmkpOwp9Cgp2YXIgbG9hZGVkU2NyaXB0cyA9IHt9OyAvLyBpbmNs dWRlZC1zY3JpcHRzIHRyYWNrZXIKZnVuY3Rpb24gaW1wb3J0U2NyaXB0VVJJKHVy bCkgewoJaWYgKGxvYWRlZFNjcmlwdHNbdXJsXSkgewoJCXJldHVybiBudWxsOwoJ fQoJbG9hZGVkU2NyaXB0c1t1cmxdID0gdHJ1ZTsKCXZhciBzID0gZG9jdW1lbnQu Y3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CglzLnNldEF0dHJpYnV0ZSgnc3JjJyx1 cmwpOwoJcy5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCd0ZXh0L2phdmFzY3JpcHQnKTsK CWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5k Q2hpbGQocyk7CglyZXR1cm4gczsKfQoKZnVuY3Rpb24gaW1wb3J0U3R5bGVzaGVl dChwYWdlKSB7CglyZXR1cm4gaW1wb3J0U3R5bGVzaGVldFVSSSh3Z1NjcmlwdCAr ICc/YWN0aW9uPXJhdyZjdHlwZT10ZXh0L2NzcyZ0aXRsZT0nICsgZW5jb2RlVVJJ Q29tcG9uZW50KHBhZ2UucmVwbGFjZSgvIC9nLCdfJykpKTsKfQoKZnVuY3Rpb24g aW1wb3J0U3R5bGVzaGVldFVSSSh1cmwsbWVkaWEpIHsKCXZhciBsID0gZG9jdW1l bnQuY3JlYXRlRWxlbWVudCgnbGluaycpOwoJbC50eXBlID0gJ3RleHQvY3NzJzsK CWwucmVsID0gJ3N0eWxlc2hlZXQnOwoJbC5ocmVmID0gdXJsOwoJaWYobWVkaWEp IGwubWVkaWEgPSBtZWRpYQoJZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUo J2hlYWQnKVswXS5hcHBlbmRDaGlsZChsKTsKCXJldHVybiBsOwp9CgpmdW5jdGlv biBhcHBlbmRDU1ModGV4dCkgewoJdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVt ZW50KCdzdHlsZScpOwoJcy50eXBlID0gJ3RleHQvY3NzJzsKCXMucmVsID0gJ3N0 eWxlc2hlZXQnOwoJaWYgKHMuc3R5bGVTaGVldCkgcy5zdHlsZVNoZWV0LmNzc1Rl eHQgPSB0ZXh0IC8vSUUKCWVsc2Ugcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVh dGVUZXh0Tm9kZSh0ZXh0ICsgJycpKSAvL1NhZmFyaSBzb21ldGltZXMgYm9ya3Mg b24gbnVsbAoJZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVsw XS5hcHBlbmRDaGlsZChzKTsKCXJldHVybiBzOwp9CgovLyBzcGVjaWFsIHN0eWxl c2hlZXQgbGlua3MKaWYgKHR5cGVvZiBzdHlsZXBhdGggIT0gJ3VuZGVmaW5lZCcg JiYgdHlwZW9mIHNraW4gIT0gJ3VuZGVmaW5lZCcpIHsKCS8vIEZJWE1FOiBUaGlz IHRyaWVzIHRvIGxvYWQgdGhlIHN0eWxlc2hlZXRzIGV2ZW4gZm9yIHNraW5zIHdo ZXJlIHRoZXkKCS8vIGRvbid0IGV4aXN0LCBpLmUuLCBldmVyeXRoaW5nIGJ1dCBN b25vYm9vay4KCWlmIChvcGVyYTZfYnVncykgewoJCWltcG9ydFN0eWxlc2hlZXRV Ukkoc3R5bGVwYXRoKycvJytza2luKycvT3BlcmE2Rml4ZXMuY3NzJyk7Cgl9IGVs c2UgaWYgKG9wZXJhN19idWdzKSB7CgkJaW1wb3J0U3R5bGVzaGVldFVSSShzdHls ZXBhdGgrJy8nK3NraW4rJy9PcGVyYTdGaXhlcy5jc3MnKTsKCX0gZWxzZSBpZiAo b3BlcmE5NV9idWdzKSB7CgkJaW1wb3J0U3R5bGVzaGVldFVSSShzdHlsZXBhdGgr Jy8nK3NraW4rJy9PcGVyYTlGaXhlcy5jc3MnKTsKCX0gZWxzZSBpZiAoZmYyX2J1 Z3MpIHsKCQlpbXBvcnRTdHlsZXNoZWV0VVJJKHN0eWxlcGF0aCsnLycrc2tpbisn L0ZGMkZpeGVzLmNzcycpOwoJfQp9CgoKaWYgKHdnQnJlYWtGcmFtZXMpIHsKCS8v IFVuLXRyYXAgdXMgZnJvbSBmcmFtZXNldHMKCWlmICh3aW5kb3cudG9wICE9IHdp bmRvdykgewoJCXdpbmRvdy50b3AubG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247 Cgl9Cn0KCmZ1bmN0aW9uIHNob3dUb2NUb2dnbGUoKSB7CglpZiAoZG9jdW1lbnQu Y3JlYXRlVGV4dE5vZGUpIHsKCQkvLyBVc2VzIERPTSBjYWxscyB0byBhdm9pZCBk b2N1bWVudC53cml0ZSArIFhIVE1MIGlzc3VlcwoKCQl2YXIgbGlua0hvbGRlciA9 IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2N0aXRsZScpOwoJCXZhciBleGlz dGluZ0xpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlbGluaycp OwoJCWlmICghbGlua0hvbGRlciB8fCBleGlzdGluZ0xpbmspIHsKCQkJLy8gRG9u J3QgYWRkIHRoZSB0b2dnbGUgbGluayB0d2ljZQoJCQlyZXR1cm47CgkJfQoKCQl2 YXIgb3V0ZXJTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwoJ CW91dGVyU3Bhbi5jbGFzc05hbWUgPSAndG9jdG9nZ2xlJzsKCgkJdmFyIHRvZ2ds ZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CgkJdG9nZ2xlTGlu ay5pZCA9ICd0b2dnbGVsaW5rJzsKCQl0b2dnbGVMaW5rLmNsYXNzTmFtZSA9ICdp bnRlcm5hbCc7CgkJdG9nZ2xlTGluay5ocmVmID0gJ2phdmFzY3JpcHQ6dG9nZ2xl VG9jKCknOwoJCXRvZ2dsZUxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRl VGV4dE5vZGUodG9jSGlkZVRleHQpKTsKCgkJb3V0ZXJTcGFuLmFwcGVuZENoaWxk KGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdbJykpOwoJCW91dGVyU3Bhbi5hcHBl bmRDaGlsZCh0b2dnbGVMaW5rKTsKCQlvdXRlclNwYW4uYXBwZW5kQ2hpbGQoZG9j dW1lbnQuY3JlYXRlVGV4dE5vZGUoJ10nKSk7CgoJCWxpbmtIb2xkZXIuYXBwZW5k Q2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJyAnKSk7CgkJbGlua0hvbGRl ci5hcHBlbmRDaGlsZChvdXRlclNwYW4pOwoKCQl2YXIgY29va2llUG9zID0gZG9j dW1lbnQuY29va2llLmluZGV4T2YoImhpZGV0b2M9Iik7CgkJaWYgKGNvb2tpZVBv cyA+IC0xICYmIGRvY3VtZW50LmNvb2tpZS5jaGFyQXQoY29va2llUG9zICsgOCkg PT0gMSkgewoJCQl0b2dnbGVUb2MoKTsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGNoYW5n ZVRleHQoZWwsIG5ld1RleHQpIHsKCS8vIFNhZmFyaSB3b3JrIGFyb3VuZAoJaWYg KGVsLmlubmVyVGV4dCkgewoJCWVsLmlubmVyVGV4dCA9IG5ld1RleHQ7Cgl9IGVs c2UgaWYgKGVsLmZpcnN0Q2hpbGQgJiYgZWwuZmlyc3RDaGlsZC5ub2RlVmFsdWUp IHsKCQllbC5maXJzdENoaWxkLm5vZGVWYWx1ZSA9IG5ld1RleHQ7Cgl9Cn0KCmZ1 bmN0aW9uIHRvZ2dsZVRvYygpIHsKCXZhciB0b2NtYWluID0gZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQoJ3RvYycpOwoJdmFyIHRvYyA9IGRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCd0b2MnKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndWwnKVswXTsKCXZh ciB0b2dnbGVMaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZWxp bmsnKTsKCglpZiAodG9jICYmIHRvZ2dsZUxpbmsgJiYgdG9jLnN0eWxlLmRpc3Bs YXkgPT0gJ25vbmUnKSB7CgkJY2hhbmdlVGV4dCh0b2dnbGVMaW5rLCB0b2NIaWRl VGV4dCk7CgkJdG9jLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwoJCWRvY3VtZW50 LmNvb2tpZSA9ICJoaWRldG9jPTAiOwoJCXRvY21haW4uY2xhc3NOYW1lID0gJ3Rv Yyc7Cgl9IGVsc2UgewoJCWNoYW5nZVRleHQodG9nZ2xlTGluaywgdG9jU2hvd1Rl eHQpOwoJCXRvYy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoJCWRvY3VtZW50LmNv b2tpZSA9ICJoaWRldG9jPTEiOwoJCXRvY21haW4uY2xhc3NOYW1lID0gJ3RvYyB0 b2NoaWRkZW4nOwoJfQp9Cgp2YXIgbXdFZGl0QnV0dG9ucyA9IFtdOwp2YXIgbXdD dXN0b21FZGl0QnV0dG9ucyA9IFtdOyAvLyBlZyB0byBhZGQgaW4gTWVkaWFXaWtp OkNvbW1vbi5qcwoKZnVuY3Rpb24gZXNjYXBlUXVvdGVzKHRleHQpIHsKCXZhciBy ZSA9IG5ldyBSZWdFeHAoIiciLCJnIik7Cgl0ZXh0ID0gdGV4dC5yZXBsYWNlKHJl LCJcXCciKTsKCXJlID0gbmV3IFJlZ0V4cCgiXFxuIiwiZyIpOwoJdGV4dCA9IHRl eHQucmVwbGFjZShyZSwiXFxuIik7CglyZXR1cm4gZXNjYXBlUXVvdGVzSFRNTCh0 ZXh0KTsKfQoKZnVuY3Rpb24gZXNjYXBlUXVvdGVzSFRNTCh0ZXh0KSB7Cgl2YXIg cmUgPSBuZXcgUmVnRXhwKCcmJywiZyIpOwoJdGV4dCA9IHRleHQucmVwbGFjZShy ZSwiJmFtcDsiKTsKCXJlID0gbmV3IFJlZ0V4cCgnIicsImciKTsKCXRleHQgPSB0 ZXh0LnJlcGxhY2UocmUsIiZxdW90OyIpOwoJcmUgPSBuZXcgUmVnRXhwKCc8Jywi ZyIpOwoJdGV4dCA9IHRleHQucmVwbGFjZShyZSwiJmx0OyIpOwoJcmUgPSBuZXcg UmVnRXhwKCc+JywiZyIpOwoJdGV4dCA9IHRleHQucmVwbGFjZShyZSwiJmd0OyIp OwoJcmV0dXJuIHRleHQ7Cn0KCgovKioKICogU2V0IHRoZSBhY2Nlc3NrZXkgcHJl Zml4IGJhc2VkIG9uIGJyb3dzZXIgZGV0ZWN0aW9uLgogKi8KdmFyIHRvb2x0aXBB Y2Nlc3NLZXlQcmVmaXggPSAnYWx0LSc7CmlmIChpc19vcGVyYSkgewoJdG9vbHRp cEFjY2Vzc0tleVByZWZpeCA9ICdzaGlmdC1lc2MtJzsKfSBlbHNlIGlmICghaXNf c2FmYXJpX3dpbiAmJiBpc19zYWZhcmkgJiYgd2Via2l0X3ZlcnNpb24gPiA1MjYp IHsKCXRvb2x0aXBBY2Nlc3NLZXlQcmVmaXggPSAnY3RybC1hbHQtJzsKfSBlbHNl IGlmICghaXNfc2FmYXJpX3dpbiAmJiAoaXNfc2FmYXJpCgkJfHwgY2xpZW50UEMu aW5kZXhPZignbWFjJykgIT0gLTEKCQl8fCBjbGllbnRQQy5pbmRleE9mKCdrb25x dWVyb3InKSAhPSAtMSApKSB7Cgl0b29sdGlwQWNjZXNzS2V5UHJlZml4ID0gJ2N0 cmwtJzsKfSBlbHNlIGlmIChpc19mZjIpIHsKCXRvb2x0aXBBY2Nlc3NLZXlQcmVm aXggPSAnYWx0LXNoaWZ0LSc7Cn0KdmFyIHRvb2x0aXBBY2Nlc3NLZXlSZWdleHAg PSAvXFsoY3RybC0pPyhhbHQtKT8oc2hpZnQtKT8oZXNjLSk/KC4pXF0kLzsKCi8q KgogKiBBZGQgdGhlIGFwcHJvcHJpYXRlIHByZWZpeCB0byB0aGUgYWNjZXNza2V5 IHNob3duIGluIHRoZSB0b29sdGlwLgogKiBJZiB0aGUgbm9kZUxpc3QgcGFyYW1l dGVyIGlzIGdpdmVuLCBvbmx5IHRob3NlIG5vZGVzIGFyZSB1cGRhdGVkOwogKiBv dGhlcndpc2UsIGFsbCB0aGUgbm9kZXMgdGhhdCB3aWxsIHByb2JhYmx5IGhhdmUg YWNjZXNza2V5cyBieQogKiBkZWZhdWx0IGFyZSB1cGRhdGVkLgogKgogKiBAcGFy YW0gQXJyYXkgbm9kZUxpc3QgLS0gbGlzdCBvZiBlbGVtZW50cyB0byB1cGRhdGUK ICovCmZ1bmN0aW9uIHVwZGF0ZVRvb2x0aXBBY2Nlc3NLZXlzKCBub2RlTGlzdCAp IHsKCWlmICggIW5vZGVMaXN0ICkgewoJCS8vIFJhdGhlciB0aGFuIHNjYW4gYWxs IGxpbmtzIG9uIHRoZSB3aG9sZSBwYWdlLCB3ZSBjYW4ganVzdCBzY2FuIHRoZXNl CgkJLy8gY29udGFpbmVycyB3aGljaCBjb250YWluIHRoZSByZWxldmFudCBsaW5r cy4gVGhpcyBpcyByZWFsbHkganVzdCBhbgoJCS8vIG9wdGltaXphdGlvbiB0ZWNo bmlxdWUuCgkJdmFyIGxpbmtDb250YWluZXJzID0gWwoJCQkiY29sdW1uLW9uZSIs IC8vIE1vbm9ib29rIGFuZCBNb2Rlcm4KCQkJImhlYWQiLCAicGFuZWwiLCAicC1s b2dvIiAvLyBWZWN0b3IKCQldOwoJCWZvciAoIHZhciBpIGluIGxpbmtDb250YWlu ZXJzICkgewoJCQl2YXIgbGlua0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCBsaW5rQ29udGFpbmVyc1tpXSApOwoJCQlpZiAoIGxpbmtDb250YWlu ZXIgKSB7CgkJCQl1cGRhdGVUb29sdGlwQWNjZXNzS2V5cyggbGlua0NvbnRhaW5l ci5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpICk7CgkJCX0KCQl9CgkJLy8gdGhl c2UgYXJlIHJhcmUgZW5vdWdoIHRoYXQgbm8gc3VjaCBvcHRpbWl6YXRpb24gaXMg bmVlZGVkCgkJdXBkYXRlVG9vbHRpcEFjY2Vzc0tleXMoIGRvY3VtZW50LmdldEVs ZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpICk7CgkJdXBkYXRlVG9vbHRpcEFjY2Vz c0tleXMoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsYWJlbCIpICk7 CgkJcmV0dXJuOwoJfQoKCWZvciAoIHZhciBpID0gMDsgaSA8IG5vZGVMaXN0Lmxl bmd0aDsgaSsrICkgewoJCXZhciBlbGVtZW50ID0gbm9kZUxpc3RbaV07CgkJdmFy IHRpcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpOwoJCWlmICggdGlw ICYmIHRvb2x0aXBBY2Nlc3NLZXlSZWdleHAuZXhlYyh0aXApICkgewoJCQl0aXAg PSB0aXAucmVwbGFjZSh0b29sdGlwQWNjZXNzS2V5UmVnZXhwLAoJCQkJCSAgIlsi K3Rvb2x0aXBBY2Nlc3NLZXlQcmVmaXgrIiQ1XSIpOwoJCQllbGVtZW50LnNldEF0 dHJpYnV0ZSgidGl0bGUiLCB0aXAgKTsKCQl9Cgl9Cn0KCi8qKgogKiBBZGQgYSBs aW5rIHRvIG9uZSBvZiB0aGUgcG9ydGxldCBtZW51cyBvbiB0aGUgcGFnZSwgaW5j bHVkaW5nOgogKgogKiBwLWNhY3Rpb25zOiBDb250ZW50IGFjdGlvbnMgKHNob3du IGFzIHRhYnMgYWJvdmUgdGhlIG1haW4gY29udGVudCBpbiBNb25vYm9vaykKICog cC1wZXJzb25hbDogUGVyc29uYWwgdG9vbHMgKHNob3duIGF0IHRoZSB0b3Agcmln aHQgb2YgdGhlIHBhZ2UgaW4gTW9ub2Jvb2spCiAqIHAtbmF2aWdhdGlvbjogTmF2 aWdhdGlvbgogKiBwLXRiOiBUb29sYm94CiAqCiAqIFRoaXMgZnVuY3Rpb24gZXhp c3RzIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgY3VzdG9tIEpTIGF1dGhvcnMuICBB bGwKICogYnV0IHRoZSBmaXJzdCB0aHJlZSBwYXJhbWV0ZXJzIGFyZSBvcHRpb25h bCwgdGhvdWdoIHByb3ZpZGluZyBhdAogKiBsZWFzdCBhbiBpZCBhbmQgYSB0b29s dGlwIGlzIHJlY29tbWVuZGVkLgogKgogKiBCeSBkZWZhdWx0IHRoZSBuZXcgbGlu ayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBUbwogKiBh ZGQgdGhlIGxpbmsgYmVmb3JlIGEgZ2l2ZW4gZXhpc3RpbmcgaXRlbSwgcGFzcyB0 aGUgRE9NIG5vZGUgb2YKICogdGhhdCBpdGVtIChlYXNpbHkgb2J0YWluZWQgd2l0 aCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgpKSBhcyB0aGUKICogbmV4dG5vZGUg cGFyYW1ldGVyOyB0byBhZGQgdGhlIGxpbmsgX2FmdGVyXyBhbiBleGlzdGluZyBp dGVtLCBwYXNzCiAqIHRoZSBub2RlJ3MgbmV4dFNpYmxpbmcgaW5zdGVhZC4KICoK ICogQHBhcmFtIFN0cmluZyBwb3J0bGV0IC0tIGlkIG9mIHRoZSB0YXJnZXQgcG9y dGxldCAoInAtY2FjdGlvbnMiLCAicC1wZXJzb25hbCIsICJwLW5hdmlnYXRpb24i IG9yICJwLXRiIikKICogQHBhcmFtIFN0cmluZyBocmVmIC0tIGxpbmsgVVJMCiAq IEBwYXJhbSBTdHJpbmcgdGV4dCAtLSBsaW5rIHRleHQgKHdpbGwgYmUgYXV0b21h dGljYWxseSBsb3dlcmNhc2VkIGJ5IENTUyBmb3IgcC1jYWN0aW9ucyBpbiBNb25v Ym9vaykKICogQHBhcmFtIFN0cmluZyBpZCAtLSBpZCBvZiB0aGUgbmV3IGl0ZW0s IHNob3VsZCBiZSB1bmlxdWUgYW5kIHByZWZlcmFibHkgaGF2ZSB0aGUgYXBwcm9w cmlhdGUgcHJlZml4ICgiY2EtIiwgInB0LSIsICJuLSIgb3IgInQtIikKICogQHBh cmFtIFN0cmluZyB0b29sdGlwIC0tIHRleHQgdG8gc2hvdyB3aGVuIGhvdmVyaW5n IG92ZXIgdGhlIGxpbmssIHdpdGhvdXQgYWNjZXNza2V5IHN1ZmZpeAogKiBAcGFy YW0gU3RyaW5nIGFjY2Vzc2tleSAtLSBhY2Nlc3NrZXkgdG8gYWN0aXZhdGUgdGhp cyBsaW5rIChvbmUgY2hhcmFjdGVyLCB0cnkgdG8gYXZvaWQgY29uZmxpY3RzKQog KiBAcGFyYW0gTm9kZSBuZXh0bm9kZSAtLSB0aGUgRE9NIG5vZGUgYmVmb3JlIHdo aWNoIHRoZSBuZXcgaXRlbSBzaG91bGQgYmUgYWRkZWQsIHNob3VsZCBiZSBhbm90 aGVyIGl0ZW0gaW4gdGhlIHNhbWUgbGlzdAogKgogKiBAcmV0dXJuIE5vZGUgLS0g dGhlIERPTSBub2RlIG9mIHRoZSBuZXcgaXRlbSAoYW4gTEkgZWxlbWVudCkgb3Ig bnVsbAogKi8KZnVuY3Rpb24gYWRkUG9ydGxldExpbmsocG9ydGxldCwgaHJlZiwg dGV4dCwgaWQsIHRvb2x0aXAsIGFjY2Vzc2tleSwgbmV4dG5vZGUpIHsKCXZhciBy b290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocG9ydGxldCk7CglpZiAoICFy b290ICkgcmV0dXJuIG51bGw7Cgl2YXIgbm9kZSA9IHJvb3QuZ2V0RWxlbWVudHNC eVRhZ05hbWUoICJ1bCIgKVswXTsKCWlmICggIW5vZGUgKSByZXR1cm4gbnVsbDsK CgkvLyB1bmhpZGUgcG9ydGxldCBpZiBpdCB3YXMgaGlkZGVuIGJlZm9yZQoJcm9v dC5jbGFzc05hbWUgPSByb290LmNsYXNzTmFtZS5yZXBsYWNlKCAvKF58ICllbXB0 eVBvcnRsZXQoIHwkKS8sICIkMiIgKTsKCgl2YXIgc3BhbiA9IGRvY3VtZW50LmNy ZWF0ZUVsZW1lbnQoICJzcGFuIiApOwoJc3Bhbi5hcHBlbmRDaGlsZCggZG9jdW1l bnQuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOwoKCXZhciBsaW5rID0gZG9jdW1l bnQuY3JlYXRlRWxlbWVudCggImEiICk7CglsaW5rLmFwcGVuZENoaWxkKCBzcGFu ICk7CglsaW5rLmhyZWYgPSBocmVmOwoKCXZhciBpdGVtID0gZG9jdW1lbnQuY3Jl YXRlRWxlbWVudCggImxpIiApOwoJaXRlbS5hcHBlbmRDaGlsZCggbGluayApOwoJ aWYgKCBpZCApIGl0ZW0uaWQgPSBpZDsKCglpZiAoIGFjY2Vzc2tleSApIHsKCQls aW5rLnNldEF0dHJpYnV0ZSggImFjY2Vzc2tleSIsIGFjY2Vzc2tleSApOwoJCXRv b2x0aXAgKz0gIiBbIithY2Nlc3NrZXkrIl0iOwoJfQoJaWYgKCB0b29sdGlwICkg ewoJCWxpbmsuc2V0QXR0cmlidXRlKCAidGl0bGUiLCB0b29sdGlwICk7Cgl9Cglp ZiAoIGFjY2Vzc2tleSAmJiB0b29sdGlwICkgewoJCXVwZGF0ZVRvb2x0aXBBY2Nl c3NLZXlzKCBuZXcgQXJyYXkoIGxpbmsgKSApOwoJfQoKCWlmICggbmV4dG5vZGUg JiYgbmV4dG5vZGUucGFyZW50Tm9kZSA9PSBub2RlICkKCQlub2RlLmluc2VydEJl Zm9yZSggaXRlbSwgbmV4dG5vZGUgKTsKCWVsc2UKCQlub2RlLmFwcGVuZENoaWxk KCBpdGVtICk7ICAvLyBJRSBjb21wYXRpYmlsaXR5ICg/KQoKCXJldHVybiBpdGVt Owp9CgpmdW5jdGlvbiBnZXRJbm5lclRleHQoZWwpIHsKCWlmICh0eXBlb2YgZWwg PT0gInN0cmluZyIpIHJldHVybiBlbDsKCWlmICh0eXBlb2YgZWwgPT0gInVuZGVm aW5lZCIpIHsgcmV0dXJuIGVsIH07CglpZiAoZWwudGV4dENvbnRlbnQpIHJldHVy biBlbC50ZXh0Q29udGVudDsgLy8gbm90IG5lZWRlZCBidXQgaXQgaXMgZmFzdGVy CglpZiAoZWwuaW5uZXJUZXh0KSByZXR1cm4gZWwuaW5uZXJUZXh0OyAgICAgLy8g SUUgZG9lc24ndCBoYXZlIHRleHRDb250ZW50Cgl2YXIgc3RyID0gIiI7CgoJdmFy IGNzID0gZWwuY2hpbGROb2RlczsKCXZhciBsID0gY3MubGVuZ3RoOwoJZm9yICh2 YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKCQlzd2l0Y2ggKGNzW2ldLm5vZGVUeXBl KSB7CgkJCWNhc2UgMTogLy9FTEVNRU5UX05PREUKCQkJCXN0ciArPSB0c19nZXRJ bm5lclRleHQoY3NbaV0pOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzoJLy9URVhUX05P REUKCQkJCXN0ciArPSBjc1tpXS5ub2RlVmFsdWU7CgkJCQlicmVhazsKCQl9Cgl9 CglyZXR1cm4gc3RyOwp9CgoKLyoqCiAqIFNldCB1cCBhY2Nlc3NrZXlzL3Rvb2x0 aXBzIGZyb20gdGhlIGRlcHJlY2F0ZWQgdGEgYXJyYXkuICBJZiBkb0lkCiAqIGlz IHNwZWNpZmllZCwgb25seSBzZXQgdXAgZm9yIHRoYXQgaWQuICBOb3RlIHRoYXQg dGhpcyBmdW5jdGlvbiBpcwogKiBkZXByZWNhdGVkIGFuZCB3aWxsIG5vdCBiZSBz dXBwb3J0ZWQgaW5kZWZpbml0ZWx5IC0tIHVzZQogKiB1cGRhdGVUb29sdGlwQWNj ZXNzS2V5KCkgaW5zdGVhZC4KICoKICogQHBhcmFtIG1peGVkIGRvSWQgc3RyaW5n IG9yIG51bGwKICovCmZ1bmN0aW9uIGFrZXl0dCggZG9JZCApIHsKCS8vIEEgbG90 IG9mIHVzZXIgc2NyaXB0cyAoYW5kIHNvbWUgb2YgdGhlIGNvZGUgYmVsb3cpIGJy ZWFrIGlmCgkvLyB0YSBpc24ndCBkZWZpbmVkLCBzbyB3ZSBtYWtlIHN1cmUgaXQg aXMuICBFeHBsaWN0bHkgdXNpbmcKCS8vIHdpbmRvdy50YSBhdm9pZHMgYSAidGEg aXMgbm90IGRlZmluZWQiIGVycm9yLgoJaWYgKCF3aW5kb3cudGEpIHdpbmRvdy50 YSA9IG5ldyBBcnJheTsKCgkvLyBNYWtlIGEgbG9jYWwsIHBvc3NpYmx5IHJlc3Ry aWN0ZWQsIGNvcHkgdG8gYXZvaWQgY2xvYmJlcmluZwoJLy8gdGhlIG9yaWdpbmFs LgoJdmFyIHRhOwoJaWYgKCBkb0lkICkgewoJCXRhID0gW2RvSWRdOwoJfSBlbHNl IHsKCQl0YSA9IHdpbmRvdy50YTsKCX0KCgkvLyBOb3cgZGVhbCB3aXRoIGV2aWwg ZGVwcmVjYXRlZCB0YQoJdmFyIHdhdGNoQ2hlY2tib3hFeGlzdHMgPSBkb2N1bWVu dC5nZXRFbGVtZW50QnlJZCggJ3dwV2F0Y2h0aGlzJyApID8gdHJ1ZSA6IGZhbHNl OwoJZm9yICh2YXIgaWQgaW4gdGEpIHsKCQl2YXIgbiA9IGRvY3VtZW50LmdldEVs ZW1lbnRCeUlkKGlkKTsKCQlpZiAobikgewoJCQl2YXIgYSA9IG51bGw7CgkJCXZh ciBhayA9ICcnOwoJCQkvLyBBcmUgd2UgcHV0dGluZyBhY2Nlc3NrZXkgaW4gaXQK CQkJaWYgKHRhW2lkXVswXS5sZW5ndGggPiAwKSB7CgkJCQkvLyBJcyB0aGlzIG9i amVjdCBhIG9iamVjdD8gSWYgbm90IGFzc3VtZSBpdCdzIHRoZSBuZXh0IGNoaWxk LgoKCQkJCWlmIChuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gImEiKSB7CgkJ CQkJYSA9IG47CgkJCQl9IGVsc2UgewoJCQkJCWEgPSBuLmNoaWxkTm9kZXNbMF07 CgkJCQl9CgkJCSAJLy8gRG9uJ3QgYWRkIGFuIGFjY2Vzc2tleSBmb3IgdGhlIHdh dGNoIHRhYiBpZiB0aGUgd2F0Y2gKCQkJIAkvLyBjaGVja2JveCBpcyBhbHNvIGF2 YWlsYWJsZS4KCQkJCWlmIChhICYmICgoaWQgIT0gJ2NhLXdhdGNoJyAmJiBpZCAh PSAnY2EtdW53YXRjaCcpIHx8ICF3YXRjaENoZWNrYm94RXhpc3RzKSkgewoJCQkJ CWEuYWNjZXNzS2V5ID0gdGFbaWRdWzBdOwoJCQkJCWFrID0gJyBbJyt0b29sdGlw QWNjZXNzS2V5UHJlZml4K3RhW2lkXVswXSsnXSc7CgkJCQl9CgkJCX0gZWxzZSB7 CgkJCQkvLyBXZSBkb24ndCBjYXJlIHdoYXQgdHlwZSB0aGUgb2JqZWN0IGlzIHdo ZW4gYXNzaWduaW5nIHRvb2x0aXAKCQkJCWEgPSBuOwoJCQkJYWsgPSAnJzsKCQkJ fQoKCQkJaWYgKGEpIHsKCQkJCWEudGl0bGUgPSB0YVtpZF1bMV0rYWs7CgkJCX0K CQl9Cgl9Cn0KCnZhciBjaGVja2JveGVzOwp2YXIgbGFzdENoZWNrYm94OwoKZnVu Y3Rpb24gc2V0dXBDaGVja2JveFNoaWZ0Q2xpY2soKSB7CgljaGVja2JveGVzID0g W107CglsYXN0Q2hlY2tib3ggPSBudWxsOwoJdmFyIGlucHV0cyA9IGRvY3VtZW50 LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpOwoJYWRkQ2hlY2tib3hDbGlj a0hhbmRsZXJzKGlucHV0cyk7Cn0KCmZ1bmN0aW9uIGFkZENoZWNrYm94Q2xpY2tI YW5kbGVycyhpbnB1dHMsIHN0YXJ0KSB7CglpZiAoICFzdGFydCkgc3RhcnQgPSAw OwoKCXZhciBmaW5pc2ggPSBzdGFydCArIDI1MDsKCWlmICggZmluaXNoID4gaW5w dXRzLmxlbmd0aCApCgkJZmluaXNoID0gaW5wdXRzLmxlbmd0aDsKCglmb3IgKCB2 YXIgaSA9IHN0YXJ0OyBpIDwgZmluaXNoOyBpKysgKSB7CgkJdmFyIGNiID0gaW5w dXRzW2ldOwoJCWlmICggIWNiLnR5cGUgfHwgY2IudHlwZS50b0xvd2VyQ2FzZSgp ICE9ICdjaGVja2JveCcgKQoJCQljb250aW51ZTsKCQl2YXIgZW5kID0gY2hlY2ti b3hlcy5sZW5ndGg7CgkJY2hlY2tib3hlc1tlbmRdID0gY2I7CgkJY2IuaW5kZXgg PSBlbmQ7CgkJY2Iub25jbGljayA9IGNoZWNrYm94Q2xpY2tIYW5kbGVyOwoJfQoK CWlmICggZmluaXNoIDwgaW5wdXRzLmxlbmd0aCApIHsKCQlzZXRUaW1lb3V0KCBm dW5jdGlvbiAoKSB7CgkJCWFkZENoZWNrYm94Q2xpY2tIYW5kbGVycyhpbnB1dHMs IGZpbmlzaCk7CgkJfSwgMjAwICk7Cgl9Cn0KCmZ1bmN0aW9uIGNoZWNrYm94Q2xp Y2tIYW5kbGVyKGUpIHsKCWlmICh0eXBlb2YgZSA9PSAndW5kZWZpbmVkJykgewoJ CWUgPSB3aW5kb3cuZXZlbnQ7Cgl9CglpZiAoICFlLnNoaWZ0S2V5IHx8IGxhc3RD aGVja2JveCA9PT0gbnVsbCApIHsKCQlsYXN0Q2hlY2tib3ggPSB0aGlzLmluZGV4 OwoJCXJldHVybiB0cnVlOwoJfQoJdmFyIGVuZFN0YXRlID0gdGhpcy5jaGVja2Vk OwoJdmFyIHN0YXJ0LCBmaW5pc2g7CglpZiAoIHRoaXMuaW5kZXggPCBsYXN0Q2hl Y2tib3ggKSB7CgkJc3RhcnQgPSB0aGlzLmluZGV4ICsgMTsKCQlmaW5pc2ggPSBs YXN0Q2hlY2tib3g7Cgl9IGVsc2UgewoJCXN0YXJ0ID0gbGFzdENoZWNrYm94OwoJ CWZpbmlzaCA9IHRoaXMuaW5kZXggLSAxOwoJfQoJZm9yICh2YXIgaSA9IHN0YXJ0 OyBpIDw9IGZpbmlzaDsgKytpICkgewoJCWNoZWNrYm94ZXNbaV0uY2hlY2tlZCA9 IGVuZFN0YXRlOwoJCWlmKCBpID4gc3RhcnQgJiYgdHlwZW9mIGNoZWNrYm94ZXNb aV0ub25jaGFuZ2UgPT0gJ2Z1bmN0aW9uJyApCgkJCWNoZWNrYm94ZXNbaV0ub25j aGFuZ2UoKTsgLy8gZmlyZSB0cmlnZ2VycwoJfQoJbGFzdENoZWNrYm94ID0gdGhp cy5pbmRleDsKCXJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiB0b2dnbGVfZWxlbWVu dF9hY3RpdmF0aW9uKGlkYSxpZGIpIHsKCWlmICggIWRvY3VtZW50LmdldEVsZW1l bnRCeUlkICkgewoJCXJldHVybjsKCX0KCS8vIFNob3cgdGhlIGFwcHJvcHJpYXRl IHVwbG9hZCBzaXplIGxpbWl0IG1lc3NhZ2UKCWlmKCBpZGIgPT0gJ3dwVXBsb2Fk RmlsZVVSTCcgKSB7CgkJdmFyIGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgg J213LXVwbG9hZC1tYXhmaWxlc2l6ZScgKTsKCQlpZiggZSApIGUuc3R5bGUuZGlz cGxheSA9ICJub25lIjsKCgkJdmFyIGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZCggJ213LXVwbG9hZC1tYXhmaWxlc2l6ZS11cmwnICk7CgkJaWYoIGUgKSBlLnN0 eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoJfQoJaWYoIGlkYiA9PSAnd3BVcGxvYWRG aWxlJyApIHsKCQl2YXIgZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnbXct dXBsb2FkLW1heGZpbGVzaXplLXVybCcgKTsKCQlpZiggZSApIGUuc3R5bGUuZGlz cGxheSA9ICAibm9uZSI7CgoJCXZhciBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQoICdtdy11cGxvYWQtbWF4ZmlsZXNpemUnICk7CgkJaWYoIGUgKSBlLnN0eWxl LmRpc3BsYXkgPSAgImJsb2NrIjsKCX0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlk KCBpZGEgKS5kaXNhYmxlZCA9IHRydWU7Cglkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZCggaWRiICkuZGlzYWJsZWQgPSBmYWxzZTsKfQoKZnVuY3Rpb24gdG9nZ2xlX2Vs ZW1lbnRfY2hlY2soaWRhLGlkYikgewoJaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50 QnlJZCkgewoJCXJldHVybjsKCX0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlk YSkuY2hlY2tlZD10cnVlOwoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRiKS5j aGVja2VkPWZhbHNlOwp9CgovKgoJV3JpdHRlbiBieSBKb25hdGhhbiBTbm9vaywg aHR0cDovL3d3dy5zbm9vay5jYS9qb25hdGhhbgoJQWRkLW9ucyBieSBSb2JlcnQg TnltYW4sIGh0dHA6Ly93d3cucm9iZXJ0bnltYW4uY29tCglBdXRob3Igc2F5cyAi VGhlIGNyZWRpdCBjb21tZW50IGlzIGFsbCBpdCB0YWtlcywgbm8gbGljZW5zZS4g R28gY3Jhenkgd2l0aCBpdCE6LSkiCglGcm9tIGh0dHA6Ly93d3cucm9iZXJ0bnlt YW4uY29tLzIwMDUvMTEvMDcvdGhlLXVsdGltYXRlLWdldGVsZW1lbnRzYnljbGFz c25hbWUvCiovCmZ1bmN0aW9uIGdldEVsZW1lbnRzQnlDbGFzc05hbWUob0VsbSwg c3RyVGFnTmFtZSwgb0NsYXNzTmFtZXMpewoJdmFyIGFyclJldHVybkVsZW1lbnRz ID0gbmV3IEFycmF5KCk7CglpZiAoIHR5cGVvZiggb0VsbS5nZXRFbGVtZW50c0J5 Q2xhc3NOYW1lICkgPT0gImZ1bmN0aW9uIiApIHsKCQkvKiBVc2UgYSBuYXRpdmUg aW1wbGVtZW50YXRpb24gd2hlcmUgcG9zc2libGUgRkYzLCBTYWYzLjIsIE9wZXJh IDkuNSAqLwoJCXZhciBhcnJOYXRpdmVSZXR1cm4gPSBvRWxtLmdldEVsZW1lbnRz QnlDbGFzc05hbWUoIG9DbGFzc05hbWVzICk7CgkJaWYgKCBzdHJUYWdOYW1lID09 ICIqIiApCgkJCXJldHVybiBhcnJOYXRpdmVSZXR1cm47CgkJZm9yICggdmFyIGg9 MDsgaCA8IGFyck5hdGl2ZVJldHVybi5sZW5ndGg7IGgrKyApIHsKCQkJaWYoIGFy ck5hdGl2ZVJldHVybltoXS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gc3RyVGFn TmFtZS50b0xvd2VyQ2FzZSgpICkKCQkJCWFyclJldHVybkVsZW1lbnRzW2FyclJl dHVybkVsZW1lbnRzLmxlbmd0aF0gPSBhcnJOYXRpdmVSZXR1cm5baF07CgkJfQoJ CXJldHVybiBhcnJSZXR1cm5FbGVtZW50czsKCX0KCXZhciBhcnJFbGVtZW50cyA9 IChzdHJUYWdOYW1lID09ICIqIiAmJiBvRWxtLmFsbCk/IG9FbG0uYWxsIDogb0Vs bS5nZXRFbGVtZW50c0J5VGFnTmFtZShzdHJUYWdOYW1lKTsKCXZhciBhcnJSZWdF eHBDbGFzc05hbWVzID0gbmV3IEFycmF5KCk7CglpZih0eXBlb2Ygb0NsYXNzTmFt ZXMgPT0gIm9iamVjdCIpewoJCWZvcih2YXIgaT0wOyBpPG9DbGFzc05hbWVzLmxl bmd0aDsgaSsrKXsKCQkJYXJyUmVnRXhwQ2xhc3NOYW1lc1thcnJSZWdFeHBDbGFz c05hbWVzLmxlbmd0aF0gPQoJCQkJbmV3IFJlZ0V4cCgiKF58XFxzKSIgKyBvQ2xh c3NOYW1lc1tpXS5yZXBsYWNlKC9cLS9nLCAiXFwtIikgKyAiKFxcc3wkKSIpOwoJ CX0KCX0KCWVsc2V7CgkJYXJyUmVnRXhwQ2xhc3NOYW1lc1thcnJSZWdFeHBDbGFz c05hbWVzLmxlbmd0aF0gPQoJCQluZXcgUmVnRXhwKCIoXnxcXHMpIiArIG9DbGFz c05hbWVzLnJlcGxhY2UoL1wtL2csICJcXC0iKSArICIoXFxzfCQpIik7Cgl9Cgl2 YXIgb0VsZW1lbnQ7Cgl2YXIgYk1hdGNoZXNBbGw7Cglmb3IodmFyIGo9MDsgajxh cnJFbGVtZW50cy5sZW5ndGg7IGorKyl7CgkJb0VsZW1lbnQgPSBhcnJFbGVtZW50 c1tqXTsKCQliTWF0Y2hlc0FsbCA9IHRydWU7CgkJZm9yKHZhciBrPTA7IGs8YXJy UmVnRXhwQ2xhc3NOYW1lcy5sZW5ndGg7IGsrKyl7CgkJCWlmKCFhcnJSZWdFeHBD bGFzc05hbWVzW2tdLnRlc3Qob0VsZW1lbnQuY2xhc3NOYW1lKSl7CgkJCQliTWF0 Y2hlc0FsbCA9IGZhbHNlOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYoYk1hdGNo ZXNBbGwpewoJCQlhcnJSZXR1cm5FbGVtZW50c1thcnJSZXR1cm5FbGVtZW50cy5s ZW5ndGhdID0gb0VsZW1lbnQ7CgkJfQoJfQoJcmV0dXJuIChhcnJSZXR1cm5FbGVt ZW50cykKfQoKZnVuY3Rpb24gcmVkaXJlY3RUb0ZyYWdtZW50KGZyYWdtZW50KSB7 Cgl2YXIgbWF0Y2ggPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdl YktpdFwvKFxkKykvKTsKCWlmIChtYXRjaCkgewoJCXZhciB3ZWJLaXRWZXJzaW9u ID0gcGFyc2VJbnQobWF0Y2hbMV0pOwoJCWlmICh3ZWJLaXRWZXJzaW9uIDwgNDIw KSB7CgkJCS8vIFJlbGVhc2VkIFNhZmFyaSB3LyBXZWJLaXQgNDE4LjkuMSBtZXNz ZXMgdXAgaG9ycmlibHkKCQkJLy8gTmlnaHRsaWVzIG9mIDQyMCsgYXJlIG9rCgkJ CXJldHVybjsKCQl9Cgl9CglpZiAoaXNfZ2Vja28pIHsKCQkvLyBNb3ppbGxhIG5l ZWRzIHRvIHdhaXQgdW50aWwgYWZ0ZXIgbG9hZCwgb3RoZXJ3aXNlIHRoZSB3aW5k b3cgZG9lc24ndCBzY3JvbGwKCQlhZGRPbmxvYWRIb29rKGZ1bmN0aW9uICgpIHsK CQkJaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICIiKQoJCQkJd2luZG93Lmxv Y2F0aW9uLmhhc2ggPSBmcmFnbWVudDsKCQl9KTsKCX0gZWxzZSB7CgkJaWYgKHdp bmRvdy5sb2NhdGlvbi5oYXNoID09ICIiKQoJCQl3aW5kb3cubG9jYXRpb24uaGFz aCA9IGZyYWdtZW50OwoJfQp9CgovKgogKiBUYWJsZSBzb3J0aW5nIHNjcmlwdCBi YXNlZCBvbiBvbmUgKGMpIDE5OTctMjAwNiBTdHVhcnQgTGFuZ3JpZGdlIGFuZCBK b29zdAogKiBkZSBWYWxrOgogKiBodHRwOi8vd3d3Lmpvb3N0ZGV2YWxrLm5sL2Nv ZGUvc29ydGFibGUtdGFibGUvCiAqIGh0dHA6Ly93d3cua3J5b2dlbml4Lm9yZy9j b2RlL2Jyb3dzZXIvc29ydHRhYmxlLwogKgogKiBAdG9kbyBkb24ndCBicmVhayBv biBjb2xzcGFucy9yb3dzcGFucyAoYnVnIDgwMjgpCiAqIEB0b2RvIGxhbmd1YWdl LXNwZWNpZmljIGRpZ2l0IGdyb3VwaW5nL2RlY2ltYWxzIChidWcgODA2MykKICog QHRvZG8gc3VwcG9ydCBhbGwgYWNjZXB0ZWQgZGF0ZSBmb3JtYXRzIChidWcgODIy NikKICovCgp2YXIgdHNfaW1hZ2VfcGF0aCA9IHN0eWxlcGF0aCsiL2NvbW1vbi9p bWFnZXMvIjsKdmFyIHRzX2ltYWdlX3VwID0gInNvcnRfdXAuZ2lmIjsKdmFyIHRz X2ltYWdlX2Rvd24gPSAic29ydF9kb3duLmdpZiI7CnZhciB0c19pbWFnZV9ub25l ID0gInNvcnRfbm9uZS5naWYiOwp2YXIgdHNfZXVyb3BlYW5kYXRlID0gd2dDb250 ZW50TGFuZ3VhZ2UgIT0gImVuIjsgLy8gVGhlIG5vbi1BbWVyaWNhbi1pbmNsaW5l ZCBjYW4gY2hhbmdlIHRvICJ0cnVlIgp2YXIgdHNfYWx0ZXJuYXRlX3Jvd19jb2xv cnMgPSBmYWxzZTsKdmFyIHRzX251bWJlcl90cmFuc2Zvcm1fdGFibGUgPSBudWxs Owp2YXIgdHNfbnVtYmVyX3JlZ2V4ID0gbnVsbDsKCmZ1bmN0aW9uIHNvcnRhYmxl c19pbml0KCkgewoJdmFyIGlkbnVtID0gMDsKCS8vIEZpbmQgYWxsIHRhYmxlcyB3 aXRoIGNsYXNzIHNvcnRhYmxlIGFuZCBtYWtlIHRoZW0gc29ydGFibGUKCXZhciB0 YWJsZXMgPSBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGRvY3VtZW50LCAidGFibGUi LCAic29ydGFibGUiKTsKCWZvciAodmFyIHRpID0gMDsgdGkgPCB0YWJsZXMubGVu Z3RoIDsgdGkrKykgewoJCWlmICghdGFibGVzW3RpXS5pZCkgewoJCQl0YWJsZXNb dGldLnNldEF0dHJpYnV0ZSgnaWQnLCdzb3J0YWJsZV90YWJsZV9pZF8nK2lkbnVt KTsKCQkJKytpZG51bTsKCQl9CgkJdHNfbWFrZVNvcnRhYmxlKHRhYmxlc1t0aV0p OwoJfQp9CgpmdW5jdGlvbiB0c19tYWtlU29ydGFibGUodGFibGUpIHsKCXZhciBm aXJzdFJvdzsKCWlmICh0YWJsZS5yb3dzICYmIHRhYmxlLnJvd3MubGVuZ3RoID4g MCkgewoJCWlmICh0YWJsZS50SGVhZCAmJiB0YWJsZS50SGVhZC5yb3dzLmxlbmd0 aCA+IDApIHsKCQkJZmlyc3RSb3cgPSB0YWJsZS50SGVhZC5yb3dzW3RhYmxlLnRI ZWFkLnJvd3MubGVuZ3RoLTFdOwoJCX0gZWxzZSB7CgkJCWZpcnN0Um93ID0gdGFi bGUucm93c1swXTsKCQl9Cgl9CglpZiAoIWZpcnN0Um93KSByZXR1cm47CgoJLy8g V2UgaGF2ZSBhIGZpcnN0IHJvdzogYXNzdW1lIGl0J3MgdGhlIGhlYWRlciwgYW5k IG1ha2UgaXRzIGNvbnRlbnRzIGNsaWNrYWJsZSBsaW5rcwoJZm9yICh2YXIgaSA9 IDA7IGkgPCBmaXJzdFJvdy5jZWxscy5sZW5ndGg7IGkrKykgewoJCXZhciBjZWxs ID0gZmlyc3RSb3cuY2VsbHNbaV07CgkJaWYgKCgiICIrY2VsbC5jbGFzc05hbWUr IiAiKS5pbmRleE9mKCIgdW5zb3J0YWJsZSAiKSA9PSAtMSkgewoJCQljZWxsLmlu bmVySFRNTCArPSAnJm5ic3A7Jm5ic3A7JwoJCQkJKyAnPGEgaHJlZj0iIyIgY2xh c3M9InNvcnRoZWFkZXIiICcKCQkJCSsgJ29uY2xpY2s9InRzX3Jlc29ydFRhYmxl KHRoaXMpO3JldHVybiBmYWxzZTsiPicKCQkJCSsgJzxzcGFuIGNsYXNzPSJzb3J0 YXJyb3ciPicKCQkJCSsgJzxpbWcgc3JjPSInCgkJCQkrIHRzX2ltYWdlX3BhdGgK CQkJCSsgdHNfaW1hZ2Vfbm9uZQoJCQkJKyAnIiBhbHQ9IiZkYXJyOyIvPjwvc3Bh bj48L2E+JzsKCQl9Cgl9CglpZiAodHNfYWx0ZXJuYXRlX3Jvd19jb2xvcnMpIHsK CQl0c19hbHRlcm5hdGUodGFibGUpOwoJfQp9CgpmdW5jdGlvbiB0c19nZXRJbm5l clRleHQoZWwpIHsKCXJldHVybiBnZXRJbm5lclRleHQoIGVsICk7Cn0KCmZ1bmN0 aW9uIHRzX3Jlc29ydFRhYmxlKGxuaykgewoJLy8gZ2V0IHRoZSBzcGFuCgl2YXIg c3BhbiA9IGxuay5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3BhbicpWzBdOwoKCXZh ciB0ZCA9IGxuay5wYXJlbnROb2RlOwoJdmFyIHRyID0gdGQucGFyZW50Tm9kZTsK CXZhciBjb2x1bW4gPSB0ZC5jZWxsSW5kZXg7CgoJdmFyIHRhYmxlID0gdHIucGFy ZW50Tm9kZTsKCXdoaWxlICh0YWJsZSAmJiAhKHRhYmxlLnRhZ05hbWUgJiYgdGFi bGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICd0YWJsZScpKQoJCXRhYmxlID0g dGFibGUucGFyZW50Tm9kZTsKCWlmICghdGFibGUpIHJldHVybjsKCglpZiAodGFi bGUucm93cy5sZW5ndGggPD0gMSkgcmV0dXJuOwoKCS8vIEdlbmVyYXRlIHRoZSBu dW1iZXIgdHJhbnNmb3JtIHRhYmxlIGlmIGl0J3Mgbm90IGRvbmUgYWxyZWFkeQoJ aWYgKHRzX251bWJlcl90cmFuc2Zvcm1fdGFibGUgPT0gbnVsbCkgewoJCXRzX2lu aXRUcmFuc2Zvcm1UYWJsZSgpOwoJfQoKCS8vIFdvcmsgb3V0IGEgdHlwZSBmb3Ig dGhlIGNvbHVtbgoJLy8gU2tpcCB0aGUgZmlyc3Qgcm93IGlmIHRoYXQncyB3aGVy ZSB0aGUgaGVhZGluZ3MgYXJlCgl2YXIgcm93U3RhcnQgPSAodGFibGUudEhlYWQg JiYgdGFibGUudEhlYWQucm93cy5sZW5ndGggPiAwID8gMCA6IDEpOwoKCXZhciBp dG0gPSAiIjsKCWZvciAodmFyIGkgPSByb3dTdGFydDsgaSA8IHRhYmxlLnJvd3Mu bGVuZ3RoOyBpKyspIHsKCQlpZiAodGFibGUucm93c1tpXS5jZWxscy5sZW5ndGgg PiBjb2x1bW4pIHsKCQkJaXRtID0gdHNfZ2V0SW5uZXJUZXh0KHRhYmxlLnJvd3Nb aV0uY2VsbHNbY29sdW1uXSk7CgkJCWl0bSA9IGl0bS5yZXBsYWNlKC9eW1xzXHhh MF0rLywgIiIpLnJlcGxhY2UoL1tcc1x4YTBdKyQvLCAiIik7CgkJCWlmIChpdG0g IT0gIiIpIGJyZWFrOwoJCX0KCX0KCgkvLyBUT0RPOiBidWcgODIyNiwgbG9jYWxp c2VkIGRhdGUgZm9ybWF0cwoJdmFyIHNvcnRmbiA9IHRzX3NvcnRfZ2VuZXJpYzsK CXZhciBwcmVwcm9jZXNzb3IgPSB0c190b0xvd2VyQ2FzZTsKCWlmICgvXlxkXGRb XC8uIC1dW2EtekEtWl17M31bXC8uIC1dXGRcZFxkXGQkLy50ZXN0KGl0bSkpIHsK CQlwcmVwcm9jZXNzb3IgPSB0c19kYXRlVG9Tb3J0S2V5OwoJfSBlbHNlIGlmICgv XlxkXGRbXC8uLV1cZFxkW1wvLi1dXGRcZFxkXGQkLy50ZXN0KGl0bSkpIHsKCQlw cmVwcm9jZXNzb3IgPSB0c19kYXRlVG9Tb3J0S2V5OwoJfSBlbHNlIGlmICgvXlxk XGRbXC8uLV1cZFxkW1wvLi1dXGRcZCQvLnRlc3QoaXRtKSkgewoJCXByZXByb2Nl c3NvciA9IHRzX2RhdGVUb1NvcnRLZXk7CgkvLyBwb3VuZCBkb2xsYXIgZXVybyB5 ZW4gY3VycmVuY3kgY2VudHMKCX0gZWxzZSBpZiAoLyheW1x1MDBhMyRcdTIwYWNc dTAwYTRcdTAwYTVdfFx1MDBhMiQpLy50ZXN0KGl0bSkpIHsKCQlwcmVwcm9jZXNz b3IgPSB0c19jdXJyZW5jeVRvU29ydEtleTsKCX0gZWxzZSBpZiAodHNfbnVtYmVy X3JlZ2V4LnRlc3QoaXRtKSkgewoJCXByZXByb2Nlc3NvciA9IHRzX3BhcnNlRmxv YXQ7Cgl9CgoJdmFyIHJldmVyc2UgPSAoc3Bhbi5nZXRBdHRyaWJ1dGUoInNvcnRk aXIiKSA9PSAnZG93bicpOwoKCXZhciBuZXdSb3dzID0gbmV3IEFycmF5KCk7Cgl2 YXIgc3RhdGljUm93cyA9IG5ldyBBcnJheSgpOwoJZm9yICh2YXIgaiA9IHJvd1N0 YXJ0OyBqIDwgdGFibGUucm93cy5sZW5ndGg7IGorKykgewoJCXZhciByb3cgPSB0 YWJsZS5yb3dzW2pdOwoJCWlmKCgiICIrcm93LmNsYXNzTmFtZSsiICIpLmluZGV4 T2YoIiB1bnNvcnRhYmxlICIpIDwgMCkgewoJCQl2YXIga2V5VGV4dCA9IHRzX2dl dElubmVyVGV4dChyb3cuY2VsbHNbY29sdW1uXSk7CgkJCWlmKGtleVRleHQgPT0g dW5kZWZpbmVkKSB7CgkJCQlrZXlUZXh0ID0gIiI7IAoJCQl9CgkJCXZhciBvbGRJ bmRleCA9IChyZXZlcnNlID8gLWogOiBqKTsKCQkJdmFyIHByZXByb2Nlc3NlZCA9 IHByZXByb2Nlc3Nvcigga2V5VGV4dC5yZXBsYWNlKC9eW1xzXHhhMF0rLywgIiIp LnJlcGxhY2UoL1tcc1x4YTBdKyQvLCAiIikgKTsKCgkJCW5ld1Jvd3NbbmV3Um93 cy5sZW5ndGhdID0gbmV3IEFycmF5KHJvdywgcHJlcHJvY2Vzc2VkLCBvbGRJbmRl eCk7CgkJfSBlbHNlIHN0YXRpY1Jvd3Nbc3RhdGljUm93cy5sZW5ndGhdID0gbmV3 IEFycmF5KHJvdywgZmFsc2UsIGotcm93U3RhcnQpOwoJfQoKCW5ld1Jvd3Muc29y dChzb3J0Zm4pOwoKCXZhciBhcnJvd0hUTUw7CglpZiAocmV2ZXJzZSkgewoJCWFy cm93SFRNTCA9ICc8aW1nIHNyYz0iJysgdHNfaW1hZ2VfcGF0aCArIHRzX2ltYWdl X2Rvd24gKyAnIiBhbHQ9IiZkYXJyOyIvPic7CgkJbmV3Um93cy5yZXZlcnNlKCk7 CgkJc3Bhbi5zZXRBdHRyaWJ1dGUoJ3NvcnRkaXInLCd1cCcpOwoJfSBlbHNlIHsK CQlhcnJvd0hUTUwgPSAnPGltZyBzcmM9IicrIHRzX2ltYWdlX3BhdGggKyB0c19p bWFnZV91cCArICciIGFsdD0iJnVhcnI7Ii8+JzsKCQlzcGFuLnNldEF0dHJpYnV0 ZSgnc29ydGRpcicsJ2Rvd24nKTsKCX0KCglmb3IgKHZhciBpID0gMDsgaSA8IHN0 YXRpY1Jvd3MubGVuZ3RoOyBpKyspIHsKCQl2YXIgcm93ID0gc3RhdGljUm93c1tp XTsKCQluZXdSb3dzLnNwbGljZShyb3dbMl0sIDAsIHJvdyk7Cgl9CgoJLy8gV2Ug YXBwZW5kQ2hpbGQgcm93cyB0aGF0IGFscmVhZHkgZXhpc3QgdG8gdGhlIHRib2R5 LCBzbyBpdCBtb3ZlcyB0aGVtIHJhdGhlciB0aGFuIGNyZWF0aW5nIG5ldyBvbmVz CgkvLyBkb24ndCBkbyBzb3J0Ym90dG9tIHJvd3MKCWZvciAodmFyIGkgPSAwOyBp IDwgbmV3Um93cy5sZW5ndGg7IGkrKykgewoJCWlmICgoIiAiK25ld1Jvd3NbaV1b MF0uY2xhc3NOYW1lKyIgIikuaW5kZXhPZigiIHNvcnRib3R0b20gIikgPT0gLTEp CgkJCXRhYmxlLnRCb2RpZXNbMF0uYXBwZW5kQ2hpbGQobmV3Um93c1tpXVswXSk7 Cgl9CgkvLyBkbyBzb3J0Ym90dG9tIHJvd3Mgb25seQoJZm9yICh2YXIgaSA9IDA7 IGkgPCBuZXdSb3dzLmxlbmd0aDsgaSsrKSB7CgkJaWYgKCgiICIrbmV3Um93c1tp XVswXS5jbGFzc05hbWUrIiAiKS5pbmRleE9mKCIgc29ydGJvdHRvbSAiKSAhPSAt MSkKCQkJdGFibGUudEJvZGllc1swXS5hcHBlbmRDaGlsZChuZXdSb3dzW2ldWzBd KTsKCX0KCgkvLyBEZWxldGUgYW55IG90aGVyIGFycm93cyB0aGVyZSBtYXkgYmUg c2hvd2luZwoJdmFyIHNwYW5zID0gZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0ciwg InNwYW4iLCAic29ydGFycm93Iik7Cglmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5z Lmxlbmd0aDsgaSsrKSB7CgkJc3BhbnNbaV0uaW5uZXJIVE1MID0gJzxpbWcgc3Jj PSInKyB0c19pbWFnZV9wYXRoICsgdHNfaW1hZ2Vfbm9uZSArICciIGFsdD0iJmRh cnI7Ii8+JzsKCX0KCXNwYW4uaW5uZXJIVE1MID0gYXJyb3dIVE1MOwoKCWlmICh0 c19hbHRlcm5hdGVfcm93X2NvbG9ycykgewoJCXRzX2FsdGVybmF0ZSh0YWJsZSk7 Cgl9Cn0KCmZ1bmN0aW9uIHRzX2luaXRUcmFuc2Zvcm1UYWJsZSgpIHsKCWlmICgg dHlwZW9mIHdnU2VwYXJhdG9yVHJhbnNmb3JtVGFibGUgPT0gInVuZGVmaW5lZCIK CQkJfHwgKCB3Z1NlcGFyYXRvclRyYW5zZm9ybVRhYmxlWzBdID09ICcnICYmIHdn RGlnaXRUcmFuc2Zvcm1UYWJsZVsyXSA9PSAnJyApICkKCXsKCQlkaWdpdENsYXNz ID0gIlswLTksLl0iOwoJCXRzX251bWJlcl90cmFuc2Zvcm1fdGFibGUgPSBmYWxz ZTsKCX0gZWxzZSB7CgkJdHNfbnVtYmVyX3RyYW5zZm9ybV90YWJsZSA9IHt9OwoJ CS8vIFVucGFjayB0aGUgdHJhbnNmb3JtIHRhYmxlCgkJLy8gU2VwYXJhdG9ycwoJ CWFzY2lpID0gd2dTZXBhcmF0b3JUcmFuc2Zvcm1UYWJsZVswXS5zcGxpdCgiXHQi KTsKCQlsb2NhbGlzZWQgPSB3Z1NlcGFyYXRvclRyYW5zZm9ybVRhYmxlWzFdLnNw bGl0KCJcdCIpOwoJCWZvciAoIHZhciBpID0gMDsgaSA8IGFzY2lpLmxlbmd0aDsg aSsrICkgewoJCQl0c19udW1iZXJfdHJhbnNmb3JtX3RhYmxlW2xvY2FsaXNlZFtp XV0gPSBhc2NpaVtpXTsKCQl9CgkJLy8gRGlnaXRzCgkJYXNjaWkgPSB3Z0RpZ2l0 VHJhbnNmb3JtVGFibGVbMF0uc3BsaXQoIlx0Iik7CgkJbG9jYWxpc2VkID0gd2dE aWdpdFRyYW5zZm9ybVRhYmxlWzFdLnNwbGl0KCJcdCIpOwoJCWZvciAoIHZhciBp ID0gMDsgaSA8IGFzY2lpLmxlbmd0aDsgaSsrICkgewoJCQl0c19udW1iZXJfdHJh bnNmb3JtX3RhYmxlW2xvY2FsaXNlZFtpXV0gPSBhc2NpaVtpXTsKCQl9CgoJCS8v IENvbnN0cnVjdCByZWdleCBmb3IgbnVtYmVyIGlkZW50aWZpY2F0aW9uCgkJZGln aXRzID0gWycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAn OCcsICc5JywgJywnLCAnXFwuJ107CgkJbWF4RGlnaXRMZW5ndGggPSAxOwoJCWZv ciAoIHZhciBkaWdpdCBpbiB0c19udW1iZXJfdHJhbnNmb3JtX3RhYmxlICkgewoJ CQkvLyBFc2NhcGUgcmVnZXggbWV0YWNoYXJhY3RlcnMKCQkJZGlnaXRzLnB1c2go CgkJCQlkaWdpdC5yZXBsYWNlKCAvW1xcXFwkXCpcK1w/XC5cKFwpXHxce1x9XFtc XVwtXS8sCgkJCQkJZnVuY3Rpb24oIHMgKSB7IHJldHVybiAnXFwnICsgczsgfSAp CgkJCSk7CgkJCWlmIChkaWdpdC5sZW5ndGggPiBtYXhEaWdpdExlbmd0aCkgewoJ CQkJbWF4RGlnaXRMZW5ndGggPSBkaWdpdC5sZW5ndGg7CgkJCX0KCQl9CgkJaWYg KCBtYXhEaWdpdExlbmd0aCA+IDEgKSB7CgkJCWRpZ2l0Q2xhc3MgPSAnWycgKyBk aWdpdHMuam9pbiggJycsIGRpZ2l0cyApICsgJ10nOwoJCX0gZWxzZSB7CgkJCWRp Z2l0Q2xhc3MgPSAnKCcgKyBkaWdpdHMuam9pbiggJ3wnLCBkaWdpdHMgKSArICcp JzsKCQl9Cgl9CgoJLy8gV2UgYWxsb3cgYSB0cmFpbGluZyBwZXJjZW50IHNpZ24s IHdoaWNoIHdlIGp1c3Qgc3RyaXAuICBUaGlzIHdvcmtzIGZpbmUKCS8vIGlmIHBl cmNlbnRzIGFuZCByZWd1bGFyIG51bWJlcnMgYXJlbid0IGJlaW5nIG1peGVkLgoJ dHNfbnVtYmVyX3JlZ2V4ID0gbmV3IFJlZ0V4cCgKCQkiXigiICsKCQkJIlsrLV0/ WzAtOV1bMC05LF0qKFxcLlswLTksXSopPyhFWystXT9bMC05XVswLTksXSopPyIg KyAvLyBGb3J0cmFuLXN0eWxlIHNjaWVudGlmaWMKCQkJInwiICsKCQkJIlsrLV0/ IiArIGRpZ2l0Q2xhc3MgKyAiKyU/IiArIC8vIEdlbmVyaWMgbG9jYWxpc2VkCgkJ IikkIiwgImkiCgkpOwp9CgpmdW5jdGlvbiB0c190b0xvd2VyQ2FzZSggcyApIHsK CXJldHVybiBzLnRvTG93ZXJDYXNlKCk7Cn0KCmZ1bmN0aW9uIHRzX2RhdGVUb1Nv cnRLZXkoZGF0ZSkgewoJLy8geTJrIG5vdGVzOiB0d28gZGlnaXQgeWVhcnMgbGVz cyB0aGFuIDUwIGFyZSB0cmVhdGVkIGFzIDIwWFgsIGdyZWF0ZXIgdGhhbiA1MCBh cmUgdHJlYXRlZCBhcyAxOVhYCglpZiAoZGF0ZS5sZW5ndGggPT0gMTEpIHsKCQlz d2l0Y2ggKGRhdGUuc3Vic3RyKDMsMykudG9Mb3dlckNhc2UoKSkgewoJCQljYXNl ICJqYW4iOiB2YXIgbW9udGggPSAiMDEiOyBicmVhazsKCQkJY2FzZSAiZmViIjog dmFyIG1vbnRoID0gIjAyIjsgYnJlYWs7CgkJCWNhc2UgIm1hciI6IHZhciBtb250 aCA9ICIwMyI7IGJyZWFrOwoJCQljYXNlICJhcHIiOiB2YXIgbW9udGggPSAiMDQi OyBicmVhazsKCQkJY2FzZSAibWF5IjogdmFyIG1vbnRoID0gIjA1IjsgYnJlYWs7 CgkJCWNhc2UgImp1biI6IHZhciBtb250aCA9ICIwNiI7IGJyZWFrOwoJCQljYXNl ICJqdWwiOiB2YXIgbW9udGggPSAiMDciOyBicmVhazsKCQkJY2FzZSAiYXVnIjog dmFyIG1vbnRoID0gIjA4IjsgYnJlYWs7CgkJCWNhc2UgInNlcCI6IHZhciBtb250 aCA9ICIwOSI7IGJyZWFrOwoJCQljYXNlICJvY3QiOiB2YXIgbW9udGggPSAiMTAi OyBicmVhazsKCQkJY2FzZSAibm92IjogdmFyIG1vbnRoID0gIjExIjsgYnJlYWs7 CgkJCWNhc2UgImRlYyI6IHZhciBtb250aCA9ICIxMiI7IGJyZWFrOwoJCQkvLyBk ZWZhdWx0OiB2YXIgbW9udGggPSAiMDAiOwoJCX0KCQlyZXR1cm4gZGF0ZS5zdWJz dHIoNyw0KSttb250aCtkYXRlLnN1YnN0cigwLDIpOwoJfSBlbHNlIGlmIChkYXRl Lmxlbmd0aCA9PSAxMCkgewoJCWlmICh0c19ldXJvcGVhbmRhdGUgPT0gZmFsc2Up IHsKCQkJcmV0dXJuIGRhdGUuc3Vic3RyKDYsNCkrZGF0ZS5zdWJzdHIoMCwyKStk YXRlLnN1YnN0cigzLDIpOwoJCX0gZWxzZSB7CgkJCXJldHVybiBkYXRlLnN1YnN0 cig2LDQpK2RhdGUuc3Vic3RyKDMsMikrZGF0ZS5zdWJzdHIoMCwyKTsKCQl9Cgl9 IGVsc2UgaWYgKGRhdGUubGVuZ3RoID09IDgpIHsKCQl5ciA9IGRhdGUuc3Vic3Ry KDYsMik7CgkJaWYgKHBhcnNlSW50KHlyKSA8IDUwKSB7CgkJCXlyID0gJzIwJyt5 cjsKCQl9IGVsc2UgewoJCQl5ciA9ICcxOScreXI7CgkJfQoJCWlmICh0c19ldXJv cGVhbmRhdGUgPT0gdHJ1ZSkgewoJCQlyZXR1cm4geXIrZGF0ZS5zdWJzdHIoMywy KStkYXRlLnN1YnN0cigwLDIpOwoJCX0gZWxzZSB7CgkJCXJldHVybiB5citkYXRl LnN1YnN0cigwLDIpK2RhdGUuc3Vic3RyKDMsMik7CgkJfQoJfQoJcmV0dXJuICIw MDAwMDAwMCI7Cn0KCmZ1bmN0aW9uIHRzX3BhcnNlRmxvYXQoIHMgKSB7CglpZiAo ICFzICkgewoJCXJldHVybiAwOwoJfQoJaWYgKHRzX251bWJlcl90cmFuc2Zvcm1f dGFibGUgIT0gZmFsc2UpIHsKCQl2YXIgbmV3TnVtID0gJycsIGM7CgoJCWZvciAo IHZhciBwID0gMDsgcCA8IHMubGVuZ3RoOyBwKysgKSB7CgkJCWMgPSBzLmNoYXJB dCggcCApOwoJCQlpZiAoYyBpbiB0c19udW1iZXJfdHJhbnNmb3JtX3RhYmxlKSB7 CgkJCQluZXdOdW0gKz0gdHNfbnVtYmVyX3RyYW5zZm9ybV90YWJsZVtjXTsKCQkJ fSBlbHNlIHsKCQkJCW5ld051bSArPSBjOwoJCQl9CgkJfQoJCXMgPSBuZXdOdW07 Cgl9CgoJbnVtID0gcGFyc2VGbG9hdChzLnJlcGxhY2UoLywvZywgIiIpKTsKCXJl dHVybiAoaXNOYU4obnVtKSA/IDAgOiBudW0pOwp9CgpmdW5jdGlvbiB0c19jdXJy ZW5jeVRvU29ydEtleSggcyApIHsKCXJldHVybiB0c19wYXJzZUZsb2F0KHMucmVw bGFjZSgvW14wLTkuLF0vZywnJykpOwp9CgpmdW5jdGlvbiB0c19zb3J0X2dlbmVy aWMoYSwgYikgewoJcmV0dXJuIGFbMV0gPCBiWzFdID8gLTEgOiBhWzFdID4gYlsx XSA/IDEgOiBhWzJdIC0gYlsyXTsKfQoKZnVuY3Rpb24gdHNfYWx0ZXJuYXRlKHRh YmxlKSB7CgkvLyBUYWtlIG9iamVjdCB0YWJsZSBhbmQgZ2V0IGFsbCBpdCdzIHRi b2RpZXMuCgl2YXIgdGFibGVCb2RpZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFn TmFtZSgidGJvZHkiKTsKCS8vIExvb3AgdGhyb3VnaCB0aGVzZSB0Ym9kaWVzCglm b3IgKHZhciBpID0gMDsgaSA8IHRhYmxlQm9kaWVzLmxlbmd0aDsgaSsrKSB7CgkJ Ly8gVGFrZSB0aGUgdGJvZHksIGFuZCBnZXQgYWxsIGl0J3Mgcm93cwoJCXZhciB0 YWJsZVJvd3MgPSB0YWJsZUJvZGllc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgi dHIiKTsKCQkvLyBMb29wIHRocm91Z2ggdGhlc2Ugcm93cwoJCS8vIFN0YXJ0IGF0 IDEgYmVjYXVzZSB3ZSB3YW50IHRvIGxlYXZlIHRoZSBoZWFkaW5nIHJvdyB1bnRv dWNoZWQKCQlmb3IgKHZhciBqID0gMDsgaiA8IHRhYmxlUm93cy5sZW5ndGg7IGor KykgewoJCQkvLyBDaGVjayBpZiBqIGlzIGV2ZW4sIGFuZCBhcHBseSBjbGFzc2Vz IGZvciBib3RoIHBvc3NpYmxlIHJlc3VsdHMKCQkJdmFyIG9sZENsYXNzZXMgPSB0 YWJsZVJvd3Nbal0uY2xhc3NOYW1lLnNwbGl0KCIgIik7CgkJCXZhciBuZXdDbGFz c05hbWUgPSAiIjsKCQkJZm9yICh2YXIgayA9IDA7IGsgPCBvbGRDbGFzc2VzLmxl bmd0aDsgaysrKSB7CgkJCQlpZiAob2xkQ2xhc3Nlc1trXSAhPSAiIiAmJiBvbGRD bGFzc2VzW2tdICE9ICJldmVuIiAmJiBvbGRDbGFzc2VzW2tdICE9ICJvZGQiKQoJ CQkJCW5ld0NsYXNzTmFtZSArPSBvbGRDbGFzc2VzW2tdICsgIiAiOwoJCQl9CgkJ CXRhYmxlUm93c1tqXS5jbGFzc05hbWUgPSBuZXdDbGFzc05hbWUgKyAoaiAlIDIg PT0gMCA/ICJldmVuIiA6ICJvZGQiKTsKCQl9Cgl9Cn0KCi8qCiAqIEVuZCBvZiB0 YWJsZSBzb3J0aW5nIGNvZGUKICovCgoKLyoqCiAqIEFkZCBhIGN1dGUgbGl0dGxl IGJveCBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4gdG8gaW5mb3JtIHRoZSB1c2Vy IG9mCiAqIHNvbWV0aGluZywgcmVwbGFjaW5nIGFueSBwcmVleGlzdGluZyBtZXNz YWdlLgogKgogKiBAcGFyYW0gU3RyaW5nIC1vci0gRG9tIE9iamVjdCBtZXNzYWdl IEhUTUwgdG8gYmUgcHV0IGluc2lkZSB0aGUgcmlnaHQgZGl2CiAqIEBwYXJhbSBT dHJpbmcgY2xhc3NOYW1lICAgVXNlZCBpbiBhZGRpbmcgYSBjbGFzczsgc2hvdWxk IGJlIGRpZmZlcmVudCBmb3IgZWFjaAogKiAgIGNhbGwgdG8gYWxsb3cgQ1NTL0pT IHRvIGhpZGUgZGlmZmVyZW50IGJveGVzLiAgbnVsbCA9IG5vIGNsYXNzIHVzZWQu CiAqIEByZXR1cm4gQm9vbGVhbiAgICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNl IG9uIGZhaWx1cmUKICovCmZ1bmN0aW9uIGpzTXNnKCBtZXNzYWdlLCBjbGFzc05h bWUgKSB7CglpZiAoICFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCApIHsKCQlyZXR1 cm4gZmFsc2U7Cgl9CgkvLyBXZSBzcGVjaWFsLWNhc2Ugc2tpbiBzdHJ1Y3R1cmVz IHByb3ZpZGVkIGJ5IHRoZSBzb2Z0d2FyZS4gIFNraW5zIHRoYXQKCS8vIGNob29z ZSB0byBhYmFuZG9uIG9yIHNpZ25pZmljYW50bHkgbW9kaWZ5IG91ciBmb3JtYXR0 aW5nIGNhbiBqdXN0IGRlZmluZQoJLy8gYW4gbXctanMtbWVzc2FnZSBkaXYgdG8g c3RhcnQgd2l0aC4KCXZhciBtZXNzYWdlRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoICdtdy1qcy1tZXNzYWdlJyApOwoJaWYgKCAhbWVzc2FnZURpdiApIHsK CQltZXNzYWdlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTsK CQlpZiAoIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnY29sdW1uLWNvbnRlbnQn ICkKCQkmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2NvbnRlbnQnICkgKSB7 CgkJCS8vIE1vbm9Cb29rLCBwcmVzdW1hYmx5CgkJCWRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCAnY29udGVudCcgKS5pbnNlcnRCZWZvcmUoCgkJCQltZXNzYWdlRGl2 LAoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdjb250ZW50JyApLmZpcnN0 Q2hpbGQKCQkJKTsKCQl9IGVsc2UgaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZCgnY29udGVudCcpCgkJJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdhcnRp Y2xlJyApICkgewoJCQkvLyBOb24tTW9ub2Jvb2sgYnV0IHN0aWxsIHJlY29nbml6 YWJsZSAob2xkLXN0eWxlKQoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2Fy dGljbGUnKS5pbnNlcnRCZWZvcmUoCgkJCQltZXNzYWdlRGl2LAoJCQkJZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQoICdhcnRpY2xlJyApLmZpcnN0Q2hpbGQKCQkJKTsK CQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCW1lc3NhZ2VEaXYu c2V0QXR0cmlidXRlKCAnaWQnLCAnbXctanMtbWVzc2FnZScgKTsKCW1lc3NhZ2VE aXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CglpZiggY2xhc3NOYW1lICkgewoJ CW1lc3NhZ2VEaXYuc2V0QXR0cmlidXRlKCAnY2xhc3MnLCAnbXctanMtbWVzc2Fn ZS0nK2NsYXNzTmFtZSApOwoJfQoKCWlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ29i amVjdCcpIHsKCQl3aGlsZSAobWVzc2FnZURpdi5oYXNDaGlsZE5vZGVzKCkpIC8v IFJlbW92ZSBvbGQgY29udGVudAoJCQltZXNzYWdlRGl2LnJlbW92ZUNoaWxkKG1l c3NhZ2VEaXYuZmlyc3RDaGlsZCk7CgkJbWVzc2FnZURpdi5hcHBlbmRDaGlsZCAo bWVzc2FnZSk7IC8vIEFwcGVuZCBuZXcgY29udGVudAoJfQoJZWxzZSB7CgkJbWVz c2FnZURpdi5pbm5lckhUTUwgPSBtZXNzYWdlOwoJfQoJcmV0dXJuIHRydWU7Cn0K Ci8qKgogKiBJbmplY3QgYSBjdXRlIGxpdHRsZSBwcm9ncmVzcyBzcGlubmVyIGFm dGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudAogKgogKiBAcGFyYW0gZWxlbWVudCBF bGVtZW50IHRvIGluamVjdCBhZnRlcgogKiBAcGFyYW0gaWQgSWRlbnRpZmllciBz dHJpbmcgKGZvciB1c2Ugd2l0aCByZW1vdmVTcGlubmVyKCksIGJlbG93KQogKi8K ZnVuY3Rpb24gaW5qZWN0U3Bpbm5lciggZWxlbWVudCwgaWQgKSB7Cgl2YXIgc3Bp bm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbWciICk7CglzcGlubmVy LmlkID0gIm13LXNwaW5uZXItIiArIGlkOwoJc3Bpbm5lci5zcmMgPSBzdHlsZXBh dGggKyAiL2NvbW1vbi9pbWFnZXMvc3Bpbm5lci5naWYiOwoJc3Bpbm5lci5hbHQg PSBzcGlubmVyLnRpdGxlID0gIi4uLiI7CglpZiggZWxlbWVudC5uZXh0U2libGlu ZyApIHsKCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBzcGlubmVy LCBlbGVtZW50Lm5leHRTaWJsaW5nICk7Cgl9IGVsc2UgewoJCWVsZW1lbnQucGFy ZW50Tm9kZS5hcHBlbmRDaGlsZCggc3Bpbm5lciApOwoJfQp9CgovKioKICogUmVt b3ZlIGEgcHJvZ3Jlc3Mgc3Bpbm5lciBhZGRlZCB3aXRoIGluamVjdFNwaW5uZXIo KQogKgogKiBAcGFyYW0gaWQgSWRlbnRpZmllciBzdHJpbmcKICovCmZ1bmN0aW9u IHJlbW92ZVNwaW5uZXIoIGlkICkgewoJdmFyIHNwaW5uZXIgPSBkb2N1bWVudC5n ZXRFbGVtZW50QnlJZCggIm13LXNwaW5uZXItIiArIGlkICk7CglpZiggc3Bpbm5l ciApIHsKCQlzcGlubmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNwaW5uZXIg KTsKCX0KfQoKZnVuY3Rpb24gcnVuT25sb2FkSG9vaygpIHsKCS8vIGRvbid0IHJ1 biBhbnl0aGluZyBiZWxvdyB0aGlzIGZvciBub24tZG9tIGJyb3dzZXJzCglpZiAo ZG9uZU9ubG9hZEhvb2sgfHwgIShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCAmJiBk b2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkpIHsKCQlyZXR1cm47Cgl9CgoJ Ly8gc2V0IHRoaXMgYmVmb3JlIHJ1bm5pbmcgYW55IGhvb2tzLCBzaW5jZSBhbnkg ZXJyb3JzIGJlbG93CgkvLyBtaWdodCBjYXVzZSB0aGUgZnVuY3Rpb24gdG8gdGVy bWluYXRlIHByZW1hdHVyZWx5Cglkb25lT25sb2FkSG9vayA9IHRydWU7CgoJdXBk YXRlVG9vbHRpcEFjY2Vzc0tleXMoIG51bGwgKTsKCWFrZXl0dCggbnVsbCApOwoJ c2V0dXBDaGVja2JveFNoaWZ0Q2xpY2soKTsKCXNvcnRhYmxlc19pbml0KCk7CgoJ Ly8gUnVuIGFueSBhZGRlZC1vbiBmdW5jdGlvbnMKCWZvciAodmFyIGkgPSAwOyBp IDwgb25sb2FkRnVuY3RzLmxlbmd0aDsgaSsrKSB7CgkJb25sb2FkRnVuY3RzW2ld KCk7Cgl9Cn0KCi8qKgogKiBBZGQgYW4gZXZlbnQgaGFuZGxlciB0byBhbiBlbGVt ZW50CiAqCiAqIEBwYXJhbSBFbGVtZW50IGVsZW1lbnQgRWxlbWVudCB0byBhZGQg aGFuZGxlciB0bwogKiBAcGFyYW0gU3RyaW5nIGF0dGFjaCBFdmVudCB0byBhdHRh Y2ggdG8KICogQHBhcmFtIGNhbGxhYmxlIGhhbmRsZXIgRXZlbnQgaGFuZGxlciBj YWxsYmFjawogKi8KZnVuY3Rpb24gYWRkSGFuZGxlciggZWxlbWVudCwgYXR0YWNo LCBoYW5kbGVyICkgewoJaWYoIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgewoJ CWVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggYXR0YWNoLCBoYW5kbGVyLCBmYWxz ZSApOwoJfSBlbHNlIGlmKCB3aW5kb3cuYXR0YWNoRXZlbnQgKSB7CgkJZWxlbWVu dC5hdHRhY2hFdmVudCggJ29uJyArIGF0dGFjaCwgaGFuZGxlciApOwoJfQp9Cgov KioKICogQWRkIGEgY2xpY2sgZXZlbnQgaGFuZGxlciB0byBhbiBlbGVtZW50CiAq CiAqIEBwYXJhbSBFbGVtZW50IGVsZW1lbnQgRWxlbWVudCB0byBhZGQgaGFuZGxl ciB0bwogKiBAcGFyYW0gY2FsbGFibGUgaGFuZGxlciBFdmVudCBoYW5kbGVyIGNh bGxiYWNrCiAqLwpmdW5jdGlvbiBhZGRDbGlja0hhbmRsZXIoIGVsZW1lbnQsIGhh bmRsZXIgKSB7CglhZGRIYW5kbGVyKCBlbGVtZW50LCAnY2xpY2snLCBoYW5kbGVy ICk7Cn0KCi8qKgogKiBSZW1vdmVzIGFuIGV2ZW50IGhhbmRsZXIgZnJvbSBhbiBl bGVtZW50CiAqCiAqIEBwYXJhbSBFbGVtZW50IGVsZW1lbnQgRWxlbWVudCB0byBy ZW1vdmUgaGFuZGxlciBmcm9tCiAqIEBwYXJhbSBTdHJpbmcgcmVtb3ZlIEV2ZW50 IHRvIHJlbW92ZQogKiBAcGFyYW0gY2FsbGFibGUgaGFuZGxlciBFdmVudCBoYW5k bGVyIGNhbGxiYWNrIHRvIHJlbW92ZQogKi8KZnVuY3Rpb24gcmVtb3ZlSGFuZGxl ciggZWxlbWVudCwgcmVtb3ZlLCBoYW5kbGVyICkgewoJaWYoIHdpbmRvdy5yZW1v dmVFdmVudExpc3RlbmVyICkgewoJCWVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5l ciggcmVtb3ZlLCBoYW5kbGVyLCBmYWxzZSApOwoJfSBlbHNlIGlmKCB3aW5kb3cu ZGV0YWNoRXZlbnQgKSB7CgkJZWxlbWVudC5kZXRhY2hFdmVudCggJ29uJyArIHJl bW92ZSwgaGFuZGxlciApOwoJfQp9Ci8vbm90ZTogYWxsIHNraW5zIHNob3VsZCBj YWxsIHJ1bk9ubG9hZEhvb2soKSBhdCB0aGUgZW5kIG9mIGh0bWwgb3V0cHV0LAov LyAgICAgIHNvIHRoZSBiZWxvdyBzaG91bGQgYmUgcmVkdW5kYW50LiBJdCdzIHRo ZXJlIGp1c3QgaW4gY2FzZS4KaG9va0V2ZW50KCJsb2FkIiwgcnVuT25sb2FkSG9v ayk7Cg== ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=ajax.js Content-Type: application/x-javascript; name=ajax.js Content-Location: http://bits.wikimedia.org/skins-1.5/common/ajax.js?urid=257z2 Content-Transfer-Encoding: Base64 Ly8gcmVtb3RlIHNjcmlwdGluZyBsaWJyYXJ5Ci8vIChjKSBjb3B5cmlnaHQgMjAw NSBtb2Rlcm5tZXRob2QsIGluYwp2YXIgc2FqYXhfZGVidWdfbW9kZSA9IGZhbHNl Owp2YXIgc2FqYXhfcmVxdWVzdF90eXBlID0gIkdFVCI7CgovKioKKiBpZiBzYWph eF9kZWJ1Z19tb2RlIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gb3V0cHV0cyBnaXZl biB0aGUgbWVzc2FnZSBpbnRvIAoqIHRoZSBlbGVtZW50IHdpdGggaWQgPSBzYWph eF9kZWJ1ZzsgaWYgbm8gc3VjaCBlbGVtZW50IGV4aXN0cyBpbiB0aGUgZG9jdW1l bnQsIAoqIGl0IGlzIGluamVjdGVkLgoqLwpmdW5jdGlvbiBzYWpheF9kZWJ1Zyh0 ZXh0KSB7CglpZiAoIXNhamF4X2RlYnVnX21vZGUpIHJldHVybiBmYWxzZTsKCgl2 YXIgZT0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhamF4X2RlYnVnJyk7CgoJ aWYgKCFlKSB7CgkJZT0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOwoJCWUu Y2xhc3NOYW1lPSAnc2FqYXhfZGVidWcnOwoJCWUuaWQ9ICdzYWpheF9kZWJ1Zyc7 CgoJCXZhciBiPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIp WzBdOwoKCQlpZiAoYi5maXJzdENoaWxkKSBiLmluc2VydEJlZm9yZShlLCBiLmZp cnN0Q2hpbGQpOwoJCWVsc2UgYi5hcHBlbmRDaGlsZChlKTsKCX0KCgl2YXIgbT0g ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgltLmFwcGVuZENoaWxkKCBk b2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggdGV4dCApICk7CgoJZS5hcHBlbmRDaGls ZCggbSApOwoKCXJldHVybiB0cnVlOwp9CgovKioKKiBjb21wYXRpYmlsaXR5IHdy YXBwZXIgZm9yIGNyZWF0aW5nIGEgbmV3IFhNTEh0dHBSZXF1ZXN0IG9iamVjdC4K Ki8KZnVuY3Rpb24gc2FqYXhfaW5pdF9vYmplY3QoKSB7CglzYWpheF9kZWJ1Zygi c2FqYXhfaW5pdF9vYmplY3QoKSBjYWxsZWQuLiIpCgl2YXIgQTsKCXRyeSB7CgkJ Ly8gVHJ5IHRoZSBuZXcgc3R5bGUgYmVmb3JlIEFjdGl2ZVggc28gd2UgZG9uJ3QK CQkvLyB1bm5lY2Vzc2FyaWx5IHRyaWdnZXIgd2FybmluZ3MgaW4gSUUgNyB3aGVu CgkJLy8gc2V0IHRvIHByb21wdCBhYm91dCBBY3RpdmVYIHVzYWdlCgkJQSA9IG5l dyBYTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoZSkgewoJCXRyeSB7CgkJCUE9 bmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQIik7CgkJfSBjYXRjaCAo ZSkgewoJCQl0cnkgewoJCQkJQT1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0 LlhNTEhUVFAiKTsKCQkJfSBjYXRjaCAob2MpIHsKCQkJCUE9bnVsbDsKCQkJfQoJ CX0KCX0KCWlmICghQSkKCQlzYWpheF9kZWJ1ZygiQ291bGQgbm90IGNyZWF0ZSBj b25uZWN0aW9uIG9iamVjdC4iKTsKCglyZXR1cm4gQTsKfQoKLyoqCiogUGVyZm9y bSBhbiBhamF4IGNhbGwgdG8gbWVkaWF3aWtpLiBDYWxscyBhcmUgaGFuZGVsZWQg YnkgQWpheERpc3BhdGNoZXIucGhwCiogICBmdW5jX25hbWUgLSB0aGUgbmFtZSBv ZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC4gTXVzdCBiZSByZWdpc3RlcmVkIGluICR3 Z0FqYXhFeHBvcnRMaXN0CiogICBhcmdzIC0gYW4gYXJyYXkgb2YgYXJndW1lbnRz IHRvIHRoYXQgZnVuY3Rpb24KKiAgIHRhcmdldCAtIHRoZSB0YXJnZXQgdGhhdCB3 aWxsIGhhbmRsZSB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsLiBJZiB0aGlzIGlzIGEg ZnVuY3Rpb24sCiogICAgICAgICAgICBpZiB3aWxsIGJlIGNhbGxlZCB3aXRoIHRo ZSBYTUxIdHRwUmVxdWVzdCBhcyBhIHBhcmFtZXRlcjsgaWYgaXQncyBhbiBpbnB1 dAoqICAgICAgICAgICAgZWxlbWVudCwgaXRzIHZhbHVlIHdpbGwgYmUgc2V0IHRv IHRoZSByZXN1bHRUZXh0OyBpZiBpdCdzIGFub3RoZXIgdHlwZSBvZgoqICAgICAg ICAgICAgZWxlbWVudCwgaXRzIGlubmVySFRNTCB3aWxsIGJlIHNldCB0byB0aGUg cmVzdWx0VGV4dC4KKgoqIEV4YW1wbGU6CiogICAgc2FqYXhfZG9fY2FsbCgnZG9G b28nLCBbMSwgMiwgM10sIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzaG93Rm9v IikpOwoqCiogVGhpcyB3aWxsIGNhbGwgdGhlIGRvRm9vIGZ1bmN0aW9uIHZpYSBN ZWRpYVdpa2kncyBBamF4RGlzcGF0Y2hlciwgd2l0aAoqICgxLCAyLCAzKSBhcyB0 aGUgcGFyYW1ldGVyIGxpc3QsIGFuZCB3aWxsIHNob3cgdGhlIHJlc3VsdCBpbiB0 aGUgZWxlbWVudAoqIHdpdGggaWQgPSBzaG93Rm9vCiovCmZ1bmN0aW9uIHNhamF4 X2RvX2NhbGwoZnVuY19uYW1lLCBhcmdzLCB0YXJnZXQpIHsKCXZhciBpLCB4LCBu OwoJdmFyIHVyaTsKCXZhciBwb3N0X2RhdGE7Cgl1cmkgPSB3Z1NlcnZlciArCgkJ KCh3Z1NjcmlwdCA9PSBudWxsKSA/ICh3Z1NjcmlwdFBhdGggKyAiL2luZGV4LnBo cCIpIDogd2dTY3JpcHQpICsKCQkiP2FjdGlvbj1hamF4IjsKCWlmIChzYWpheF9y ZXF1ZXN0X3R5cGUgPT0gIkdFVCIpIHsKCQlpZiAodXJpLmluZGV4T2YoIj8iKSA9 PSAtMSkKCQkJdXJpID0gdXJpICsgIj9ycz0iICsgZW5jb2RlVVJJQ29tcG9uZW50 KGZ1bmNfbmFtZSk7CgkJZWxzZQoJCQl1cmkgPSB1cmkgKyAiJnJzPSIgKyBlbmNv ZGVVUklDb21wb25lbnQoZnVuY19uYW1lKTsKCQlmb3IgKGkgPSAwOyBpIDwgYXJn cy5sZW5ndGg7IGkrKykKCQkJdXJpID0gdXJpICsgIiZyc2FyZ3NbXT0iICsgZW5j b2RlVVJJQ29tcG9uZW50KGFyZ3NbaV0pOwoJCS8vdXJpID0gdXJpICsgIiZyc3Ju ZD0iICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7CgkJcG9zdF9kYXRhID0gbnVsbDsK CX0gZWxzZSB7CgkJcG9zdF9kYXRhID0gInJzPSIgKyBlbmNvZGVVUklDb21wb25l bnQoZnVuY19uYW1lKTsKCQlmb3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkr KykKCQkJcG9zdF9kYXRhID0gcG9zdF9kYXRhICsgIiZyc2FyZ3NbXT0iICsgZW5j b2RlVVJJQ29tcG9uZW50KGFyZ3NbaV0pOwoJfQoJeCA9IHNhamF4X2luaXRfb2Jq ZWN0KCk7CglpZiAoIXgpIHsKCQlhbGVydCgiQUpBWCBub3Qgc3VwcG9ydGVkIik7 CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXRyeSB7CgkJeC5vcGVuKHNhamF4X3JlcXVl c3RfdHlwZSwgdXJpLCB0cnVlKTsKCX0gY2F0Y2ggKGUpIHsKCQlpZiAod2luZG93 LmxvY2F0aW9uLmhvc3RuYW1lID09ICJsb2NhbGhvc3QiKSB7CgkJCWFsZXJ0KCJZ b3VyIGJyb3dzZXIgYmxvY2tzIFhNTEh0dHBSZXF1ZXN0IHRvICdsb2NhbGhvc3Qn LCB0cnkgdXNpbmcgYSByZWFsIGhvc3RuYW1lIGZvciBkZXZlbG9wbWVudC90ZXN0 aW5nLiIpOwoJCX0KCQl0aHJvdyBlOwoJfQoJaWYgKHNhamF4X3JlcXVlc3RfdHlw ZSA9PSAiUE9TVCIpIHsKCQl4LnNldFJlcXVlc3RIZWFkZXIoIk1ldGhvZCIsICJQ T1NUICIgKyB1cmkgKyAiIEhUVFAvMS4xIik7CgkJeC5zZXRSZXF1ZXN0SGVhZGVy KCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNv ZGVkIik7Cgl9Cgl4LnNldFJlcXVlc3RIZWFkZXIoIlByYWdtYSIsICJjYWNoZT15 ZXMiKTsKCXguc2V0UmVxdWVzdEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJuby10 cmFuc2Zvcm0iKTsKCXgub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7 CgkJaWYgKHgucmVhZHlTdGF0ZSAhPSA0KQoJCQlyZXR1cm47CgoJCXNhamF4X2Rl YnVnKCJyZWNlaXZlZCAoIiArIHguc3RhdHVzICsgIiAiICsgeC5zdGF0dXNUZXh0 ICsgIikgIiArIHgucmVzcG9uc2VUZXh0KTsKCgkJLy9pZiAoeC5zdGF0dXMgIT0g MjAwKQoJCS8vCWFsZXJ0KCJFcnJvcjogIiArIHguc3RhdHVzICsgIiAiICsgeC5z dGF0dXNUZXh0ICsgIjogIiArIHgucmVzcG9uc2VUZXh0KTsKCQkvL2Vsc2UKCgkJ aWYgKCB0eXBlb2YoIHRhcmdldCApID09ICdmdW5jdGlvbicgKSB7CgkJCXRhcmdl dCggeCApOwoJCX0KCQllbHNlIGlmICggdHlwZW9mKCB0YXJnZXQgKSA9PSAnb2Jq ZWN0JyApIHsKCQkJaWYgKCB0YXJnZXQudGFnTmFtZSA9PSAnSU5QVVQnICkgewoJ CQkJaWYgKHguc3RhdHVzID09IDIwMCkgdGFyZ2V0LnZhbHVlPSB4LnJlc3BvbnNl VGV4dDsKCQkJCS8vZWxzZSBhbGVydCgiRXJyb3I6ICIgKyB4LnN0YXR1cyArICIg IiArIHguc3RhdHVzVGV4dCArICIgKCIgKyB4LnJlc3BvbnNlVGV4dCArICIpIik7 CgkJCX0KCQkJZWxzZSB7CgkJCQlpZiAoeC5zdGF0dXMgPT0gMjAwKSB0YXJnZXQu aW5uZXJIVE1MID0geC5yZXNwb25zZVRleHQ7CgkJCQllbHNlIHRhcmdldC5pbm5l ckhUTUw9ICI8ZGl2IGNsYXNzPSdlcnJvcic+RXJyb3I6ICIgKyB4LnN0YXR1cyAr ICIgIiArIHguc3RhdHVzVGV4dCArICIgKCIgKyB4LnJlc3BvbnNlVGV4dCArICIp PC9kaXY+IjsKCQkJfQoJCX0KCQllbHNlIHsKCQkJYWxlcnQoImJhZCB0YXJnZXQg Zm9yIHNhamF4X2RvX2NhbGw6IG5vdCBhIGZ1bmN0aW9uIG9yIG9iamVjdDogIiAr IHRhcmdldCk7CgkJfQoKCQlyZXR1cm47Cgl9CgoJc2FqYXhfZGVidWcoZnVuY19u YW1lICsgIiB1cmkgPSAiICsgdXJpICsgIiAvIHBvc3QgPSAiICsgcG9zdF9kYXRh KTsKCXguc2VuZChwb3N0X2RhdGEpOwoJc2FqYXhfZGVidWcoZnVuY19uYW1lICsg IiB3YWl0aW5nLi4iKTsKCWRlbGV0ZSB4OwoKCXJldHVybiB0cnVlOwp9CgovKioK ICogQHJldHVybiBib29sZWFuIHdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMg WE1MSHR0cFJlcXVlc3QKICovCmZ1bmN0aW9uIHdmU3VwcG9ydHNBamF4KCkgewoJ dmFyIHJlcXVlc3QgPSBzYWpheF9pbml0X29iamVjdCgpOwoJdmFyIHN1cHBvcnRz QWpheCA9IHJlcXVlc3QgPyB0cnVlIDogZmFsc2U7CglkZWxldGUgcmVxdWVzdDsK CXJldHVybiBzdXBwb3J0c0FqYXg7Cn0KCg== ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=mwsuggest.js Content-Type: application/x-javascript; name=mwsuggest.js Content-Location: http://bits.wikimedia.org/skins-1.5/common/mwsuggest.js?urid=257z2 Content-Transfer-Encoding: Base64 LyoKICogT3BlblNlYXJjaCBhamF4IHN1Z2dlc3Rpb24gZW5naW5lIGZvciBNZWRp YVdpa2kKICoKICogdXNlcyBjb3JlIE1lZGlhV2lraSBvcGVuIHNlYXJjaCBzdXBw b3J0IHRvIGZldGNoIHN1Z2dlc3Rpb25zCiAqIGFuZCBzaG93IHRoZW0gYmVsb3cg c2VhcmNoIGJveGVzIGFuZCBvdGhlciBpbnB1dHMKICoKICogYnkgUm9iZXJ0IFN0 b2puaWMgKEFwcmlsIDIwMDgpCiAqLwoKLy8gc2VhcmNoX2JveF9pZCAtPiBSZXN1 bHRzIG9iamVjdAp2YXIgb3NfbWFwID0ge307Ci8vIGNhY2hlZCBkYXRhLCB1cmwg LT4ganNvbl90ZXh0CnZhciBvc19jYWNoZSA9IHt9OwovLyBnbG9iYWwgdmFyaWFi bGVzIGZvciBzdWdnZXN0X2tleXByZXNzCnZhciBvc19jdXJfa2V5cHJlc3NlZCA9 IDA7CnZhciBvc19rZXlwcmVzc2VkX2NvdW50ID0gMDsKLy8gdHlwZTogVGltZXIK dmFyIG9zX3RpbWVyID0gbnVsbDsKLy8gdGllIG1vdXNlZG93bi91cCBldmVudHMK dmFyIG9zX21vdXNlX3ByZXNzZWQgPSBmYWxzZTsKdmFyIG9zX21vdXNlX251bSA9 IC0xOwovLyBpZiB0cnVlLCB0aGUgbGFzdCBjaGFuZ2Ugd2FzIG1hZGUgYnkgbW91 c2UgKGFuZCBub3Qga2V5Ym9hcmQpCnZhciBvc19tb3VzZV9tb3ZlZCA9IGZhbHNl OwovLyBkZWxheSBiZXR3ZWVuIGtleXByZXNzIGFuZCBzdWdnZXN0aW9uIChpbiBt cykKdmFyIG9zX3NlYXJjaF90aW1lb3V0ID0gMjUwOwovLyB0aGVzZSBwYWlycyBv ZiBpbnB1dHMvZm9ybXMgd2lsbCBiZSBhdXRvbG9hZGVkIGF0IHN0YXJ0dXAKdmFy IG9zX2F1dG9sb2FkX2lucHV0cyA9IG5ldyBBcnJheSgnc2VhcmNoSW5wdXQnLCAn c2VhcmNoSW5wdXQyJywgJ3Bvd2VyU2VhcmNoVGV4dCcsICdzZWFyY2hUZXh0Jyk7 CnZhciBvc19hdXRvbG9hZF9mb3JtcyA9IG5ldyBBcnJheSgnc2VhcmNoZm9ybScs ICdzZWFyY2hmb3JtMicsICdwb3dlcnNlYXJjaCcsICdzZWFyY2gnICk7Ci8vIGlm IHdlIHN0b3BwZWQgdGhlIHNlcnZpY2UKdmFyIG9zX2lzX3N0b3BwZWQgPSBmYWxz ZTsKLy8gbWF4IGxpbmVzIHRvIHNob3cgaW4gc3VnZ2VzdCB0YWJsZQp2YXIgb3Nf bWF4X2xpbmVzX3Blcl9zdWdnZXN0ID0gNzsKLy8gbnVtYmVyIG9mIHN0ZXBzIHRv IGFuaW1hdGUgZXhwYW5zaW9uL2NvbnRyYWN0aW9uIG9mIGNvbnRhaW5lciB3aWR0 aAp2YXIgb3NfYW5pbWF0aW9uX3N0ZXBzID0gNjsKLy8gbnVtIG9mIHBpeGVscyBv ZiBzbWFsbGVzdCBzdGVwCnZhciBvc19hbmltYXRpb25fbWluX3N0ZXAgPSAyOwov LyBkZWxheSBiZXR3ZWVuIHN0ZXBzIChpbiBtcykKdmFyIG9zX2FuaW1hdGlvbl9k ZWxheSA9IDMwOwovLyBtYXggd2lkdGggb2YgY29udGFpbmVyIGluIHBlcmNlbnQg b2Ygbm9ybWFsIHNpemUgKDEgPT0gMTAwJSkKdmFyIG9zX2NvbnRhaW5lcl9tYXhf d2lkdGggPSAyOwovLyBjdXJyZW50bHkgYWN0aXZlIGFuaW1hdGlvbiB0aW1lcgp2 YXIgb3NfYW5pbWF0aW9uX3RpbWVyID0gbnVsbDsKCi8qKiBUaW1lb3V0IHRpbWVy IGNsYXNzIHRoYXQgd2lsbCBmZXRjaCB0aGUgcmVzdWx0cyAqLwpmdW5jdGlvbiBv c19UaW1lcihpZCxyLHF1ZXJ5KXsKCXRoaXMuaWQgPSBpZDsKCXRoaXMuciA9IHI7 Cgl0aGlzLnF1ZXJ5ID0gcXVlcnk7Cn0KCi8qKiBUaW1lciB1c2VyIHRvIGFuaW1h dGUgZXhwYW5zaW9uL2NvbnRyYWN0aW9uIG9mIGNvbnRhaW5lciB3aWR0aCAqLwpm dW5jdGlvbiBvc19BbmltYXRpb25UaW1lcihyLCB0YXJnZXQpewoJdGhpcy5yID0g cjsKCXZhciBjdXJyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoci5jb250 YWluZXIpLm9mZnNldFdpZHRoOwoJdGhpcy5pbmMgPSBNYXRoLnJvdW5kKCh0YXJn ZXQtY3VycmVudCkgLyBvc19hbmltYXRpb25fc3RlcHMpOwoJaWYodGhpcy5pbmMg PCBvc19hbmltYXRpb25fbWluX3N0ZXAgJiYgdGhpcy5pbmMgPj0wKQoJCXRoaXMu aW5jID0gb3NfYW5pbWF0aW9uX21pbl9zdGVwOyAvLyBtaW5pbWFsIGFuaW1hdGlv biBzdGVwCglpZih0aGlzLmluYyA+IC1vc19hbmltYXRpb25fbWluX3N0ZXAgJiYg dGhpcy5pbmMgPDApCgkJdGhpcy5pbmMgPSAtb3NfYW5pbWF0aW9uX21pbl9zdGVw OwoJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Cn0KCi8qKiBQcm9wZXJ0eSBjbGFzcyBm b3Igc2luZ2xlIHNlYXJjaCBib3ggKi8KZnVuY3Rpb24gb3NfUmVzdWx0cyhuYW1l LCBmb3JtbmFtZSl7Cgl0aGlzLnNlYXJjaGZvcm0gPSBmb3JtbmFtZTsgLy8gaWQg b2YgdGhlIHNlYXJjaGZvcm0KCXRoaXMuc2VhcmNoYm94ID0gbmFtZTsgLy8gaWQg b2YgdGhlIHNlYXJjaGJveAoJdGhpcy5jb250YWluZXIgPSBuYW1lKyJTdWdnZXN0 IjsgLy8gZGl2IHRoYXQgaG9sZHMgcmVzdWx0cwoJdGhpcy5yZXN1bHRUYWJsZSA9 IG5hbWUrIlJlc3VsdCI7IC8vIGlkIGJhc2UgZm9yIHRoZSByZXN1bHQgdGFibGUg KCtudW0gPSB0YWJsZSByb3cpCgl0aGlzLnJlc3VsdFRleHQgPSBuYW1lKyJSZXN1 bHRUZXh0IjsgLy8gaWQgYmFzZSBmb3IgdGhlIHNwYW5zIHdpdGhpbiByZXN1bHQg dGFibGVzICgrbnVtKQoJdGhpcy50b2dnbGUgPSBuYW1lKyJUb2dnbGUiOyAvLyBk aXYgdGhhdCBoYXMgdGhlIHRvZ2dsZSAoZW5hYmxlL2Rpc2FibGUpIGxpbmsKCXRo aXMucXVlcnkgPSBudWxsOyAvLyBsYXN0IHByb2Nlc3NlZCBxdWVyeQoJdGhpcy5y ZXN1bHRzID0gbnVsbDsgIC8vIHBhcnNlZCB0aXRsZXMKCXRoaXMucmVzdWx0Q291 bnQgPSAwOyAvLyBudW1iZXIgb2YgcmVzdWx0cwoJdGhpcy5vcmlnaW5hbCA9IG51 bGw7IC8vIHF1ZXJ5IHRoYXQgdXNlciBlbnRlcmVkCgl0aGlzLnNlbGVjdGVkID0g LTE7IC8vIHdoaWNoIHJlc3VsdCBpcyBzZWxlY3RlZAoJdGhpcy5jb250YWluZXJD b3VudCA9IDA7IC8vIG51bWJlciBvZiByZXN1bHRzIHZpc2libGUgaW4gY29udGFp bmVyCgl0aGlzLmNvbnRhaW5lclJvdyA9IDA7IC8vIGhlaWdodCBvZiByZXN1bHQg ZmllbGQgaW4gdGhlIGNvbnRhaW5lcgoJdGhpcy5jb250YWluZXJUb3RhbCA9IDA7 IC8vIHRvdGFsIGhlaWdodCBvZiB0aGUgY29udGFpbmVyIHdpbGwgYWxsIHJlc3Vs dHMKCXRoaXMudmlzaWJsZSA9IGZhbHNlOyAvLyBpZiBjb250YWluZXIgaXMgdmlz aWJsZQoJdGhpcy5zdGF5SGlkZGVuID0gZmFsc2U7IC8vIGRvbid0IHRyeSB0byBz aG93IGlmIGxvc3QgZm9jdXMKfQoKLyoqIEhpZGUgcmVzdWx0cyBkaXYgKi8KZnVu Y3Rpb24gb3NfaGlkZVJlc3VsdHMocil7Cgl2YXIgYyA9IGRvY3VtZW50LmdldEVs ZW1lbnRCeUlkKHIuY29udGFpbmVyKTsKCWlmKGMgIT0gbnVsbCkKCQljLnN0eWxl LnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKCXIudmlzaWJsZSA9IGZhbHNlOwoJci5z ZWxlY3RlZCA9IC0xOwp9CgovKiogU2hvdyByZXN1bHRzIGRpdiAqLwpmdW5jdGlv biBvc19zaG93UmVzdWx0cyhyKXsKCWlmKG9zX2lzX3N0b3BwZWQpCgkJcmV0dXJu OwoJaWYoci5zdGF5SGlkZGVuKQoJCXJldHVybgoJb3NfZml0Q29udGFpbmVyKHIp OwoJdmFyIGMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChyLmNvbnRhaW5lcik7 CglyLnNlbGVjdGVkID0gLTE7CglpZihjICE9IG51bGwpewoJCWMuc2Nyb2xsVG9w ID0gMDsKCQljLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CgkJci52aXNp YmxlID0gdHJ1ZTsKCX0KfQoKZnVuY3Rpb24gb3Nfb3BlcmFXaWR0aEZpeCh4KXsK CS8vIEZvciBicm93c2VycyB0aGF0IGRvbid0IHVuZGVyc3RhbmQgb3ZlcmZsb3ct eCwgZXN0aW1hdGUgc2Nyb2xsYmFyIHdpZHRoCglpZih0eXBlb2YgZG9jdW1lbnQu Ym9keS5zdHlsZS5vdmVyZmxvd1ggIT0gInN0cmluZyIpewoJCXJldHVybiAzMDsK CX0KCXJldHVybiAwOwp9CgpmdW5jdGlvbiBvc19lbmNvZGVRdWVyeSh2YWx1ZSl7 CiAgaWYgKGVuY29kZVVSSUNvbXBvbmVudCkgewogICAgcmV0dXJuIGVuY29kZVVS SUNvbXBvbmVudCh2YWx1ZSk7CiAgfQogIGlmKGVzY2FwZSkgewogICAgcmV0dXJu IGVzY2FwZSh2YWx1ZSk7CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIG9z X2RlY29kZVZhbHVlKHZhbHVlKXsKICBpZiAoZGVjb2RlVVJJQ29tcG9uZW50KSB7 CiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKICB9CiAgaWYo dW5lc2NhcGUpewogIAlyZXR1cm4gdW5lc2NhcGUodmFsdWUpOwogIH0KICByZXR1 cm4gbnVsbDsKfQoKLyoqIEJyb3dlci1kZXBlbmRlbnQgZnVuY3Rpb25zIHRvIGZp bmQgd2luZG93IGlubmVyIHNpemUsIGFuZCBzY3JvbGwgc3RhdHVzICovCmZ1bmN0 aW9uIGZfY2xpZW50V2lkdGgoKSB7CglyZXR1cm4gZl9maWx0ZXJSZXN1bHRzICgK CQl3aW5kb3cuaW5uZXJXaWR0aCA/IHdpbmRvdy5pbm5lcldpZHRoIDogMCwKCQlk b2N1bWVudC5kb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1l bnQuY2xpZW50V2lkdGggOiAwLAoJCWRvY3VtZW50LmJvZHkgPyBkb2N1bWVudC5i b2R5LmNsaWVudFdpZHRoIDogMAoJKTsKfQpmdW5jdGlvbiBmX2NsaWVudEhlaWdo dCgpIHsKCXJldHVybiBmX2ZpbHRlclJlc3VsdHMgKAoJCXdpbmRvdy5pbm5lckhl aWdodCA/IHdpbmRvdy5pbm5lckhlaWdodCA6IDAsCgkJZG9jdW1lbnQuZG9jdW1l bnRFbGVtZW50ID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdo dCA6IDAsCgkJZG9jdW1lbnQuYm9keSA/IGRvY3VtZW50LmJvZHkuY2xpZW50SGVp Z2h0IDogMAoJKTsKfQpmdW5jdGlvbiBmX3Njcm9sbExlZnQoKSB7CglyZXR1cm4g Zl9maWx0ZXJSZXN1bHRzICgKCQl3aW5kb3cucGFnZVhPZmZzZXQgPyB3aW5kb3cu cGFnZVhPZmZzZXQgOiAwLAoJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA/IGRv Y3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IDogMCwKCQlkb2N1bWVu dC5ib2R5ID8gZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IDogMAoJKTsKfQpmdW5j dGlvbiBmX3Njcm9sbFRvcCgpIHsKCXJldHVybiBmX2ZpbHRlclJlc3VsdHMgKAoJ CXdpbmRvdy5wYWdlWU9mZnNldCA/IHdpbmRvdy5wYWdlWU9mZnNldCA6IDAsCgkJ ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVt ZW50LnNjcm9sbFRvcCA6IDAsCgkJZG9jdW1lbnQuYm9keSA/IGRvY3VtZW50LmJv ZHkuc2Nyb2xsVG9wIDogMAoJKTsKfQpmdW5jdGlvbiBmX2ZpbHRlclJlc3VsdHMo bl93aW4sIG5fZG9jZWwsIG5fYm9keSkgewoJdmFyIG5fcmVzdWx0ID0gbl93aW4g PyBuX3dpbiA6IDA7CglpZiAobl9kb2NlbCAmJiAoIW5fcmVzdWx0IHx8IChuX3Jl c3VsdCA+IG5fZG9jZWwpKSkKCQluX3Jlc3VsdCA9IG5fZG9jZWw7CglyZXR1cm4g bl9ib2R5ICYmICghbl9yZXN1bHQgfHwgKG5fcmVzdWx0ID4gbl9ib2R5KSkgPyBu X2JvZHkgOiBuX3Jlc3VsdDsKfQoKLyoqIEdldCB0aGUgaGVpZ2h0IGF2YWlsYWJs ZSBmb3IgdGhlIHJlc3VsdHMgY29udGFpbmVyICovCmZ1bmN0aW9uIG9zX2F2YWls YWJsZUhlaWdodChyKXsKCXZhciBhYnNUb3AgPSBkb2N1bWVudC5nZXRFbGVtZW50 QnlJZChyLmNvbnRhaW5lcikuc3R5bGUudG9wOwoJdmFyIHB4ID0gYWJzVG9wLmxh c3RJbmRleE9mKCJweCIpOwoJaWYocHggPiAwKQoJCWFic1RvcCA9IGFic1RvcC5z dWJzdHJpbmcoMCxweCk7CglyZXR1cm4gZl9jbGllbnRIZWlnaHQoKSAtIChhYnNU b3AgLSBmX3Njcm9sbFRvcCgpKTsKfQoKCi8qKiBHZXQgZWxlbWVudCBhYnNvbHV0 ZSBwb3NpdGlvbiB7bGVmdCx0b3B9ICovCmZ1bmN0aW9uIG9zX2dldEVsZW1lbnRQ b3NpdGlvbihlbGVtSUQpewoJdmFyIG9mZnNldFRyYWlsID0gZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQoZWxlbUlEKTsKCXZhciBvZmZzZXRMZWZ0ID0gMDsKCXZhciBv ZmZzZXRUb3AgPSAwOwoJd2hpbGUgKG9mZnNldFRyYWlsKXsKCQlvZmZzZXRMZWZ0 ICs9IG9mZnNldFRyYWlsLm9mZnNldExlZnQ7CgkJb2Zmc2V0VG9wICs9IG9mZnNl dFRyYWlsLm9mZnNldFRvcDsKCQlvZmZzZXRUcmFpbCA9IG9mZnNldFRyYWlsLm9m ZnNldFBhcmVudDsKCX0KCWlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2Yo J01hYycpICE9IC0xICYmIHR5cGVvZiBkb2N1bWVudC5ib2R5LmxlZnRNYXJnaW4g IT0gJ3VuZGVmaW5lZCcpewoJCW9mZnNldExlZnQgKz0gZG9jdW1lbnQuYm9keS5s ZWZ0TWFyZ2luOwoJCW9mZnNldFRvcCArPSBkb2N1bWVudC5ib2R5LnRvcE1hcmdp bjsKCX0KCXJldHVybiB7bGVmdDpvZmZzZXRMZWZ0LHRvcDpvZmZzZXRUb3B9Owp9 CgovKiogQ3JlYXRlIHRoZSBjb250YWluZXIgZGl2IHRoYXQgd2lsbCBob2xkIHRo ZSBzdWdnZXN0ZWQgdGl0bGVzICovCmZ1bmN0aW9uIG9zX2NyZWF0ZUNvbnRhaW5l cihyKXsKCXZhciBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Cgl2 YXIgcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHIuc2VhcmNoYm94KTsKCXZh ciBwb3MgPSBvc19nZXRFbGVtZW50UG9zaXRpb24oci5zZWFyY2hib3gpOwoJdmFy IGxlZnQgPSBwb3MubGVmdDsKCXZhciB0b3AgPSBwb3MudG9wICsgcy5vZmZzZXRI ZWlnaHQ7CgljLmNsYXNzTmFtZSA9ICJvcy1zdWdnZXN0IjsKCWMuc2V0QXR0cmli dXRlKCJpZCIsIHIuY29udGFpbmVyKTsKCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hp bGQoYyk7CgoJLy8gZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHN0eWxlIHBhcmFtcwoJ Ly8gSUUgd29ya2Fyb3VuZCwgY2Fubm90IGV4cGxpY2l0ZWx5IHNldCAic3R5bGUi IGF0dHJpYnV0ZQoJYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHIuY29udGFp bmVyKTsKCWMuc3R5bGUudG9wID0gdG9wKyJweCI7CgljLnN0eWxlLmxlZnQgPSBs ZWZ0KyJweCI7CgljLnN0eWxlLndpZHRoID0gcy5vZmZzZXRXaWR0aCsicHgiOwoK CS8vIG1vdXNlIGV2ZW50IGhhbmRsZXJzCgljLm9ubW91c2VvdmVyID0gZnVuY3Rp b24oZXZlbnQpIHsgb3NfZXZlbnRNb3VzZW92ZXIoci5zZWFyY2hib3gsIGV2ZW50 KTsgfTsKCWMub25tb3VzZW1vdmUgPSBmdW5jdGlvbihldmVudCkgeyBvc19ldmVu dE1vdXNlbW92ZShyLnNlYXJjaGJveCwgZXZlbnQpOyB9OwoJYy5vbm1vdXNlZG93 biA9IGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBvc19ldmVudE1vdXNlZG93bihy LnNlYXJjaGJveCwgZXZlbnQpOyB9OwoJYy5vbm1vdXNldXAgPSBmdW5jdGlvbihl dmVudCkgeyBvc19ldmVudE1vdXNldXAoci5zZWFyY2hib3gsIGV2ZW50KTsgfTsK CXJldHVybiBjOwp9CgovKiogY2hhbmdlIGNvbnRhaW5lciBoZWlnaHQgdG8gZml0 IHRvIHNjcmVlbiAqLwpmdW5jdGlvbiBvc19maXRDb250YWluZXIocil7Cgl2YXIg YyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHIuY29udGFpbmVyKTsKCXZhciBo ID0gb3NfYXZhaWxhYmxlSGVpZ2h0KHIpIC0gMjA7Cgl2YXIgaW5jID0gci5jb250 YWluZXJSb3c7CgloID0gcGFyc2VJbnQoaC9pbmMpICogaW5jOwoJaWYoaCA8ICgy ICogaW5jKSAmJiByLnJlc3VsdENvdW50ID4gMSkgLy8gbWluOiB0d28gcmVzdWx0 cwoJCWggPSAyICogaW5jOwoJaWYoKGgvaW5jKSA+IG9zX21heF9saW5lc19wZXJf c3VnZ2VzdCApCgkJaCA9IGluYyAqIG9zX21heF9saW5lc19wZXJfc3VnZ2VzdDsK CWlmKGggPCByLmNvbnRhaW5lclRvdGFsKXsKCQljLnN0eWxlLmhlaWdodCA9IGgg KyJweCI7CgkJci5jb250YWluZXJDb3VudCA9IHBhcnNlSW50KE1hdGgucm91bmQo aC9pbmMpKTsKCX0gZWxzZXsKCQljLnN0eWxlLmhlaWdodCA9IHIuY29udGFpbmVy VG90YWwrInB4IjsKCQlyLmNvbnRhaW5lckNvdW50ID0gci5yZXN1bHRDb3VudDsK CX0KfQovKiogSWYgc29tZSBlbnRyaWVzIGFyZSBsb25nZXIgdGhhbiB0aGUgYm94 LCByZXBsYWNlIHRleHQgd2l0aCAiLi4uIiAqLwpmdW5jdGlvbiBvc190cmltUmVz dWx0VGV4dChyKXsKCS8vIGZpbmQgbWF4IHdpZHRoLCBmaXJzdCBzZWUgaWYgd2Ug Y291bGQgZXhwYW5kIHRoZSBjb250YWluZXIgdG8gZml0IGl0Cgl2YXIgbWF4VyA9 IDA7Cglmb3IodmFyIGk9MDtpPHIucmVzdWx0Q291bnQ7aSsrKXsKCQl2YXIgZSA9 IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHIucmVzdWx0VGV4dCtpKTsKCQlpZihl Lm9mZnNldFdpZHRoID4gbWF4VykKCQkJbWF4VyA9IGUub2Zmc2V0V2lkdGg7Cgl9 Cgl2YXIgdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHIuY29udGFpbmVyKS5v ZmZzZXRXaWR0aDsKCXZhciBmaXggPSAwOwoJaWYoci5jb250YWluZXJDb3VudCA8 IHIucmVzdWx0Q291bnQpewoJCWZpeCA9IDIwOyAvLyBnaXZlIDIwcHggZm9yIHNj cm9sbGJhcgoJfSBlbHNlCgkJZml4ID0gb3Nfb3BlcmFXaWR0aEZpeCh3KTsKCWlm KGZpeCA8IDQpCgkJZml4ID0gNDsgLy8gYmFzaWMgcGFkZGluZwoJbWF4VyArPSBm aXg7CgoJLy8gcmVzaXplIGNvbnRhaW5lciB0byBmaXQgbW9yZSBkYXRhIGlmIHBl cm1pdHRlZAoJdmFyIG5vcm1XID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoci5z ZWFyY2hib3gpLm9mZnNldFdpZHRoOwoJdmFyIHByb3AgPSBtYXhXIC8gbm9ybVc7 CglpZihwcm9wID4gb3NfY29udGFpbmVyX21heF93aWR0aCkKCQlwcm9wID0gb3Nf Y29udGFpbmVyX21heF93aWR0aDsKCWVsc2UgaWYocHJvcCA8IDEpCgkJcHJvcCA9 IDE7Cgl2YXIgbmV3VyA9IE1hdGgucm91bmQoIG5vcm1XICogcHJvcCApOwoJaWYo IHcgIT0gbmV3VyApewoJCXcgPSBuZXdXOwoJCWlmKCBvc19hbmltYXRpb25fdGlt ZXIgIT0gbnVsbCApCgkJCWNsZWFySW50ZXJ2YWwob3NfYW5pbWF0aW9uX3RpbWVy LmlkKQoJCW9zX2FuaW1hdGlvbl90aW1lciA9IG5ldyBvc19BbmltYXRpb25UaW1l cihyLHcpOwoJCW9zX2FuaW1hdGlvbl90aW1lci5pZCA9IHNldEludGVydmFsKCJv c19hbmltYXRlQ2hhbmdlV2lkdGgoKSIsb3NfYW5pbWF0aW9uX2RlbGF5KTsKCQl3 IC09IGZpeDsgLy8gdGhpcyBtdWNoIGlzIHJlc2VydmVkCgl9CgoJLy8gdHJpbSBy ZXN1bHRzCglpZih3IDwgMTApCgkJcmV0dXJuOwoJZm9yKHZhciBpPTA7aTxyLnJl c3VsdENvdW50O2krKyl7CgkJdmFyIGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZChyLnJlc3VsdFRleHQraSk7CgkJdmFyIHJlcGxhY2UgPSAxOwoJCXZhciBsYXN0 VyA9IGUub2Zmc2V0V2lkdGgrMTsKCQl2YXIgaXRlcmF0aW9uID0gMDsKCQl2YXIg Y2hhbmdlZFRleHQgPSBmYWxzZTsKCQl3aGlsZShlLm9mZnNldFdpZHRoID4gdyAm JiAoZS5vZmZzZXRXaWR0aCA8IGxhc3RXIHx8IGl0ZXJhdGlvbjwyKSl7CgkJCWNo YW5nZWRUZXh0ID0gdHJ1ZTsKCQkJbGFzdFcgPSBlLm9mZnNldFdpZHRoOwoJCQl2 YXIgbCA9IGUuaW5uZXJIVE1MOwoJCQllLmlubmVySFRNTCA9IGwuc3Vic3RyaW5n KDAsbC5sZW5ndGgtcmVwbGFjZSkrIi4uLiI7CgkJCWl0ZXJhdGlvbisrOwoJCQly ZXBsYWNlID0gNDsgLy8gaG93IG1hbnkgY2hhcnMgdG8gcmVwbGFjZQoJCX0KCQlp ZihjaGFuZ2VkVGV4dCl7CgkJCS8vIHNob3cgaGludCBmb3IgdHJpbW1lZCB0aXRs ZXMKCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoci5yZXN1bHRUYWJsZStpKS5z ZXRBdHRyaWJ1dGUoInRpdGxlIixyLnJlc3VsdHNbaV0pOwoJCX0KCX0KfQoKLyoq IEludm9rZWQgb24gdGltZXIgdG8gYW5pbWF0ZSBjaGFuZ2UgaW4gY29udGFpbmVy IHdpZHRoICovCmZ1bmN0aW9uIG9zX2FuaW1hdGVDaGFuZ2VXaWR0aCgpewoJdmFy IHIgPSBvc19hbmltYXRpb25fdGltZXIucjsKCXZhciBjID0gZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQoci5jb250YWluZXIpOwoJdmFyIHcgPSBjLm9mZnNldFdpZHRo OwoJdmFyIG5vcm1XID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoci5zZWFyY2hi b3gpLm9mZnNldFdpZHRoOwoJdmFyIG5vcm1MID0gb3NfZ2V0RWxlbWVudFBvc2l0 aW9uKHIuc2VhcmNoYm94KS5sZWZ0OwoJdmFyIGluYyA9IG9zX2FuaW1hdGlvbl90 aW1lci5pbmM7Cgl2YXIgdGFyZ2V0ID0gb3NfYW5pbWF0aW9uX3RpbWVyLnRhcmdl dDsKCXZhciBudyA9IHcgKyBpbmM7CglpZiggKGluYyA+IDAgJiYgbncgPj0gdGFy Z2V0KSB8fCAoaW5jIDw9IDAgJiYgbncgPD0gdGFyZ2V0KSApewoJCS8vIGZpbmlz aGVkICEKCQljLnN0eWxlLndpZHRoID0gdGFyZ2V0KyJweCI7CgkJY2xlYXJJbnRl cnZhbChvc19hbmltYXRpb25fdGltZXIuaWQpCgkJb3NfYW5pbWF0aW9uX3RpbWVy ID0gbnVsbDsKCX0gZWxzZXsKCQkvLyBpbi1wcm9ncmVzcwoJCWMuc3R5bGUud2lk dGggPSBudysicHgiOwoJCWlmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIg PT0gInJ0bCIpCgkJCWMuc3R5bGUubGVmdCA9IChub3JtTCArIG5vcm1XICsgKHRh cmdldCAtIG53KSAtIG9zX2FuaW1hdGlvbl90aW1lci50YXJnZXQgLSAxKSsicHgi OwoJfQp9CgovKiogSGFuZGxlcyBkYXRhIGZyb20gWE1MSHR0cFJlcXVlc3QsIGFu ZCB1cGRhdGVzIHRoZSBzdWdnZXN0IHJlc3VsdHMgKi8KZnVuY3Rpb24gb3NfdXBk YXRlUmVzdWx0cyhyLCBxdWVyeSwgdGV4dCwgY2FjaGVLZXkpewoJb3NfY2FjaGVb Y2FjaGVLZXldID0gdGV4dDsKCXIucXVlcnkgPSBxdWVyeTsKCXIub3JpZ2luYWwg PSBxdWVyeTsKCWlmKHRleHQgPT0gIiIpewoJCXIucmVzdWx0cyA9IG51bGw7CgkJ ci5yZXN1bHRDb3VudCA9IDA7CgkJb3NfaGlkZVJlc3VsdHMocik7Cgl9IGVsc2V7 CgkJdHJ5IHsKCQkJdmFyIHAgPSBldmFsKCcoJyt0ZXh0KycpJyk7IC8vIHNpbXBs ZSBqc29uIHBhcnNlLCBjb3VsZCBkbyBhIHNhZmVyIG9uZQoJCQlpZihwLmxlbmd0 aDwyIHx8IHBbMV0ubGVuZ3RoID09IDApewoJCQkJci5yZXN1bHRzID0gbnVsbDsK CQkJCXIucmVzdWx0Q291bnQgPSAwOwoJCQkJb3NfaGlkZVJlc3VsdHMocik7CgkJ CQlyZXR1cm47CgkJCX0KCQkJdmFyIGMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZChyLmNvbnRhaW5lcik7CgkJCWlmKGMgPT0gbnVsbCkKCQkJCWMgPSBvc19jcmVh dGVDb250YWluZXIocik7CgkJCWMuaW5uZXJIVE1MID0gb3NfY3JlYXRlUmVzdWx0 VGFibGUocixwWzFdKTsKCQkJLy8gaW5pdCBjb250YWluZXIgdGFibGUgc2l6ZXMK CQkJdmFyIHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChyLnJlc3VsdFRhYmxl KTsKCQkJci5jb250YWluZXJUb3RhbCA9IHQub2Zmc2V0SGVpZ2h0OwoJCQlyLmNv bnRhaW5lclJvdyA9IHQub2Zmc2V0SGVpZ2h0IC8gci5yZXN1bHRDb3VudDsKCQkJ b3NfZml0Q29udGFpbmVyKHIpOwoJCQlvc190cmltUmVzdWx0VGV4dChyKTsKCQkJ b3Nfc2hvd1Jlc3VsdHMocik7CgkJfSBjYXRjaChlKXsKCQkJLy8gYmFkIHJlc3Bv bnNlIGZyb20gc2VydmVyIG9yIHN1Y2gKCQkJb3NfaGlkZVJlc3VsdHMocik7CgkJ CW9zX2NhY2hlW2NhY2hlS2V5XSA9IG51bGw7CgkJfQoJfQp9CgovKiogQ3JlYXRl IHRoZSByZXN1bHQgdGFibGUgdG8gYmUgcGxhY2VkIGluIHRoZSBjb250YWluZXIg ZGl2ICovCmZ1bmN0aW9uIG9zX2NyZWF0ZVJlc3VsdFRhYmxlKHIsIHJlc3VsdHMp ewoJdmFyIGMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChyLmNvbnRhaW5lcik7 Cgl2YXIgd2lkdGggPSBjLm9mZnNldFdpZHRoIC0gb3Nfb3BlcmFXaWR0aEZpeChj Lm9mZnNldFdpZHRoKTsKCXZhciBodG1sID0gIjx0YWJsZSBjbGFzcz1cIm9zLXN1 Z2dlc3QtcmVzdWx0c1wiIGlkPVwiIityLnJlc3VsdFRhYmxlKyJcIiBzdHlsZT1c IndpZHRoOiAiK3dpZHRoKyJweDtcIj4iOwoJci5yZXN1bHRzID0gbmV3IEFycmF5 KCk7CglyLnJlc3VsdENvdW50ID0gcmVzdWx0cy5sZW5ndGg7Cglmb3IoaT0wO2k8 cmVzdWx0cy5sZW5ndGg7aSsrKXsKCQl2YXIgdGl0bGUgPSBvc19kZWNvZGVWYWx1 ZShyZXN1bHRzW2ldKTsKCQlyLnJlc3VsdHNbaV0gPSB0aXRsZTsKCQlodG1sICs9 ICI8dHI+PHRkIGNsYXNzPVwib3Mtc3VnZ2VzdC1yZXN1bHRcIiBpZD1cIiIrci5y ZXN1bHRUYWJsZStpKyJcIj48c3BhbiBpZD1cIiIrci5yZXN1bHRUZXh0K2krIlwi PiIrdGl0bGUrIjwvc3Bhbj48L3RkPjwvdHI+IjsKCX0KCWh0bWwrPSI8L3RhYmxl PiIKCXJldHVybiBodG1sOwp9CgovKiogRmV0Y2ggbmFtZXNwYWNlcyBmcm9tIGNo ZWNrYm94ZXMgb3IgaGlkZGVuIGZpZWxkcyBpbiB0aGUgc2VhcmNoIGZvcm0sCiAg ICBpZiBub25lIGRlZmluZWQgdXNlIHdnU2VhcmNoTmFtZXNwYWNlcyBnbG9iYWwg Ki8KZnVuY3Rpb24gb3NfZ2V0TmFtZXNwYWNlcyhyKXsKCXZhciBuYW1lc3BhY2Vz ID0gIiI7Cgl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5mb3Jtc1tyLnNlYXJjaGZv cm1dLmVsZW1lbnRzOwoJZm9yKGk9MDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsr KXsKCQl2YXIgbmFtZSA9IGVsZW1lbnRzW2ldLm5hbWU7CgkJaWYodHlwZW9mIG5h bWUgIT0gJ3VuZGVmaW5lZCcgJiYgbmFtZS5sZW5ndGggPiAyCgkJJiYgbmFtZVsw XT09J24nICYmIG5hbWVbMV09PSdzJwoJCSYmICgoZWxlbWVudHNbaV0udHlwZT09 J2NoZWNrYm94JyAmJiBlbGVtZW50c1tpXS5jaGVja2VkKQoJCSAJfHwgKGVsZW1l bnRzW2ldLnR5cGU9PSdoaWRkZW4nICYmIGVsZW1lbnRzW2ldLnZhbHVlPT0iMSIp KSApewoJCQlpZihuYW1lc3BhY2VzIT0iIikKCQkJCW5hbWVzcGFjZXMrPSJ8IjsK CQkJbmFtZXNwYWNlcys9bmFtZS5zdWJzdHJpbmcoMik7CgkJfQoJfQoJaWYobmFt ZXNwYWNlcyA9PSAiIikKCQluYW1lc3BhY2VzID0gd2dTZWFyY2hOYW1lc3BhY2Vz LmpvaW4oInwiKTsKCXJldHVybiBuYW1lc3BhY2VzOwp9CgovKiogVXBkYXRlIHJl c3VsdHMgaWYgdXNlciBoYXNuJ3QgYWxyZWFkeSB0eXBlZCBzb21ldGhpbmcgZWxz ZSAqLwpmdW5jdGlvbiBvc191cGRhdGVJZlJlbGV2YW50KHIsIHF1ZXJ5LCB0ZXh0 LCBjYWNoZUtleSl7Cgl2YXIgdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHIu c2VhcmNoYm94KTsKCWlmKHQgIT0gbnVsbCAmJiB0LnZhbHVlID09IHF1ZXJ5KXsg Ly8gY2hlY2sgaWYgcmVzcG9uc2UgaXMgc3RpbGwgcmVsZXZhbnQKCQlvc191cGRh dGVSZXN1bHRzKHIsIHF1ZXJ5LCB0ZXh0LCBjYWNoZUtleSk7Cgl9CglyLnF1ZXJ5 ID0gcXVlcnk7Cn0KCi8qKiBGZXRjaCByZXN1bHRzIGFmdGVyIHNvbWUgdGltZW91 dCAqLwpmdW5jdGlvbiBvc19kZWxheWVkRmV0Y2goKXsKCWlmKG9zX3RpbWVyID09 IG51bGwpCgkJcmV0dXJuOwoJdmFyIHIgPSBvc190aW1lci5yOwoJdmFyIHF1ZXJ5 ID0gb3NfdGltZXIucXVlcnk7Cglvc190aW1lciA9IG51bGw7Cgl2YXIgcGF0aCA9 IHdnTVdTdWdnZXN0VGVtcGxhdGUucmVwbGFjZSgie25hbWVzcGFjZXN9Iixvc19n ZXROYW1lc3BhY2VzKHIpKQoJCQkJCQkJICAJICAucmVwbGFjZSgie2RibmFtZX0i LHdnREJuYW1lKQoJCQkJCQkJICAJICAucmVwbGFjZSgie3NlYXJjaFRlcm1zfSIs b3NfZW5jb2RlUXVlcnkocXVlcnkpKTsKCgkvLyB0cnkgdG8gZ2V0IGZyb20gY2Fj aGUsIGlmIG5vdCBmZXRjaCB1c2luZyBhamF4Cgl2YXIgY2FjaGVkID0gb3NfY2Fj aGVbcGF0aF07CglpZihjYWNoZWQgIT0gbnVsbCl7CgkJb3NfdXBkYXRlSWZSZWxl dmFudChyLCBxdWVyeSwgY2FjaGVkLCBwYXRoKTsKCX0gZWxzZXsKCQl2YXIgeG1s aHR0cCA9IHNhamF4X2luaXRfb2JqZWN0KCk7CgkJaWYoeG1saHR0cCl7CgkJCXRy eSB7CgkJCQl4bWxodHRwLm9wZW4oIkdFVCIsIHBhdGgsIHRydWUpOwoJCQkJeG1s aHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXsKCQkgICAgICAgIAlp ZiAoeG1saHR0cC5yZWFkeVN0YXRlPT00ICYmIHR5cGVvZiBvc191cGRhdGVJZlJl bGV2YW50ID09ICdmdW5jdGlvbicpIHsKCQkgICAgICAgIAkJb3NfdXBkYXRlSWZS ZWxldmFudChyLCBxdWVyeSwgeG1saHR0cC5yZXNwb25zZVRleHQsIHBhdGgpOwoJ ICAgICAgICAJCX0KCSAgICAgIAkJfTsKCSAgICAgCQl4bWxodHRwLnNlbmQobnVs bCk7CgkgICAgIAl9IGNhdGNoIChlKSB7CgkJCQlpZiAod2luZG93LmxvY2F0aW9u Lmhvc3RuYW1lID09ICJsb2NhbGhvc3QiKSB7CgkJCQkJYWxlcnQoIllvdXIgYnJv d3NlciBibG9ja3MgWE1MSHR0cFJlcXVlc3QgdG8gJ2xvY2FsaG9zdCcsIHRyeSB1 c2luZyBhIHJlYWwgaG9zdG5hbWUgZm9yIGRldmVsb3BtZW50L3Rlc3RpbmcuIik7 CgkJCQl9CgkJCQl0aHJvdyBlOwoJCQl9CgkJfQoJfQp9CgovKiogSW5pdCB0aW1l ZCB1cGRhdGUgdmlhIG9zX2RlbGF5ZWRVcGRhdGUoKSAqLwpmdW5jdGlvbiBvc19m ZXRjaFJlc3VsdHMociwgcXVlcnksIHRpbWVvdXQpewoJaWYocXVlcnkgPT0gIiIp ewoJCXIucXVlcnkgPSAiIjsKCQlvc19oaWRlUmVzdWx0cyhyKTsKCQlyZXR1cm47 Cgl9IGVsc2UgaWYocXVlcnkgPT0gci5xdWVyeSkKCQlyZXR1cm47IC8vIG5vIGNo YW5nZQoKCW9zX2lzX3N0b3BwZWQgPSBmYWxzZTsgLy8gbWFrZSBzdXJlIHdlJ3Jl IHJ1bm5pbmcKCgkvKiB2YXIgY2FjaGVLZXkgPSB3Z0RCbmFtZSsiOiIrcXVlcnk7 Cgl2YXIgY2FjaGVkID0gb3NfY2FjaGVbY2FjaGVLZXldOwoJaWYoY2FjaGVkICE9 IG51bGwpewoJCW9zX3VwZGF0ZVJlc3VsdHMocix3Z0RCbmFtZSxxdWVyeSxjYWNo ZWQpOwoJCXJldHVybjsKCX0gKi8KCgkvLyBjYW5jZWwgYW55IHBlbmRpbmcgZmV0 Y2hlcwoJaWYob3NfdGltZXIgIT0gbnVsbCAmJiBvc190aW1lci5pZCAhPSBudWxs KQoJCWNsZWFyVGltZW91dChvc190aW1lci5pZCk7CgkvLyBzY2hlZHVsZSBkZWxh eWVkIGZldGNoaW5nIG9mIHJlc3VsdHMKCWlmKHRpbWVvdXQgIT0gMCl7CgkJb3Nf dGltZXIgPSBuZXcgb3NfVGltZXIoc2V0VGltZW91dCgib3NfZGVsYXllZEZldGNo KCkiLHRpbWVvdXQpLHIscXVlcnkpOwoJfSBlbHNlewoJCW9zX3RpbWVyID0gbmV3 IG9zX1RpbWVyKG51bGwscixxdWVyeSk7CgkJb3NfZGVsYXllZEZldGNoKCk7IC8v IGRvIGl0IG5vdyEKCX0KCn0KLyoqIENoYW5nZSB0aGUgaGlnaGxpZ2h0ZWQgcm93 IChpLmUuIHN1Z2dlc3Rpb24pLCBmcm9tIHBvc2l0aW9uIGN1ciB0byBuZXh0ICov CmZ1bmN0aW9uIG9zX2NoYW5nZUhpZ2hsaWdodChyLCBjdXIsIG5leHQsIHVwZGF0 ZVNlYXJjaEJveCl7CglpZiAobmV4dCA+PSByLnJlc3VsdENvdW50KQoJCW5leHQg PSByLnJlc3VsdENvdW50LTE7CglpZiAobmV4dCA8IC0xKQoJCW5leHQgPSAtMTsK CXIuc2VsZWN0ZWQgPSBuZXh0OwogICAJaWYgKGN1ciA9PSBuZXh0KQogICAgCXJl dHVybjsgLy8gbm90aGluZyB0byBkby4KCiAgICBpZihjdXIgPj0gMCl7CiAgICAJ dmFyIGN1clJvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHIucmVzdWx0VGFi bGUgKyBjdXIpOwogICAgCWlmKGN1clJvdyAhPSBudWxsKQogICAgCQljdXJSb3cu Y2xhc3NOYW1lID0gIm9zLXN1Z2dlc3QtcmVzdWx0IjsKICAgIH0KICAgIHZhciBu ZXdUZXh0OwogICAgaWYobmV4dCA+PSAwKXsKICAgIAl2YXIgbmV4dFJvdyA9IGRv Y3VtZW50LmdldEVsZW1lbnRCeUlkKHIucmVzdWx0VGFibGUgKyBuZXh0KTsKICAg IAlpZihuZXh0Um93ICE9IG51bGwpCiAgICAJCW5leHRSb3cuY2xhc3NOYW1lID0g b3NfSGlnaGxpZ2h0Q2xhc3MoKTsKICAgIAluZXdUZXh0ID0gci5yZXN1bHRzW25l eHRdOwogICAgfSBlbHNlCiAgICAJbmV3VGV4dCA9IHIub3JpZ2luYWw7CgogICAg Ly8gYWRqdXN0IHRoZSBzY3JvbGxiYXIgaWYgYW55CiAgICBpZihyLmNvbnRhaW5l ckNvdW50IDwgci5yZXN1bHRDb3VudCl7CiAgICAJdmFyIGMgPSBkb2N1bWVudC5n ZXRFbGVtZW50QnlJZChyLmNvbnRhaW5lcik7CiAgICAJdmFyIHZTdGFydCA9IGMu c2Nyb2xsVG9wIC8gci5jb250YWluZXJSb3c7CiAgICAJdmFyIHZFbmQgPSB2U3Rh cnQgKyByLmNvbnRhaW5lckNvdW50OwogICAgCWlmKG5leHQgPCB2U3RhcnQpCiAg ICAJCWMuc2Nyb2xsVG9wID0gbmV4dCAqIHIuY29udGFpbmVyUm93OwogICAgCWVs c2UgaWYobmV4dCA+PSB2RW5kKQogICAgCQljLnNjcm9sbFRvcCA9IChuZXh0IC0g ci5jb250YWluZXJDb3VudCArIDEpICogci5jb250YWluZXJSb3c7CiAgICB9Cgog ICAgLy8gdXBkYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VhcmNoIGJveAogICAg aWYodXBkYXRlU2VhcmNoQm94KXsKICAgIAlvc191cGRhdGVTZWFyY2hRdWVyeShy LG5ld1RleHQpOwogICAgfQp9CgpmdW5jdGlvbiBvc19IaWdobGlnaHRDbGFzcygp IHsKCXZhciBtYXRjaCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxl V2ViS2l0XC8oXGQrKS8pOwoJaWYgKG1hdGNoKSB7CgkJdmFyIHdlYktpdFZlcnNp b24gPSBwYXJzZUludChtYXRjaFsxXSk7CgkJaWYgKHdlYktpdFZlcnNpb24gPCA1 MjMpIHsKCQkJLy8gQ1NTIHN5c3RlbSBoaWdobGlnaHQgY29sb3JzIGJyb2tlbiBv biBvbGQgU2FmYXJpCgkJCS8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df YnVnLmNnaT9pZD02MTI5CgkJCS8vIFNhZmFyaSAzLjAuNCwgMy4xIGtub3duIG9r CgkJCXJldHVybiAib3Mtc3VnZ2VzdC1yZXN1bHQtaGwtd2Via2l0IjsKCQl9Cgl9 CglyZXR1cm4gIm9zLXN1Z2dlc3QtcmVzdWx0LWhsIjsKfQoKZnVuY3Rpb24gb3Nf dXBkYXRlU2VhcmNoUXVlcnkocixuZXdUZXh0KXsKCWRvY3VtZW50LmdldEVsZW1l bnRCeUlkKHIuc2VhcmNoYm94KS52YWx1ZSA9IG5ld1RleHQ7CiAgICByLnF1ZXJ5 ID0gbmV3VGV4dDsKfQoKLyoqIEZpbmQgZXZlbnQgdGFyZ2V0ICovCmZ1bmN0aW9u IG9zX2dldFRhcmdldChlKXsKCWlmICghZSkgZSA9IHdpbmRvdy5ldmVudDsKCWlm IChlLnRhcmdldCkgcmV0dXJuIGUudGFyZ2V0OwoJZWxzZSBpZiAoZS5zcmNFbGVt ZW50KSByZXR1cm4gZS5zcmNFbGVtZW50OwoJZWxzZSByZXR1cm4gbnVsbDsKfQoK CgovKioqKioqKioqKioqKioqKioqKioKICogIEtleWJvYXJkIGV2ZW50cwogKioq KioqKioqKioqKioqKioqKiovCgovKiogRXZlbnQgaGFuZGxlciB0aGF0IHdpbGwg ZmV0Y2ggcmVzdWx0cyBvbiBrZXl1cCAqLwpmdW5jdGlvbiBvc19ldmVudEtleXVw KGUpewoJdmFyIHRhcmcgPSBvc19nZXRUYXJnZXQoZSk7Cgl2YXIgciA9IG9zX21h cFt0YXJnLmlkXTsKCWlmKHIgPT0gbnVsbCkKCQlyZXR1cm47IC8vIG5vdCBvdXIg ZXZlbnQKCgkvLyBzb21lIGJyb3dzZXJzIHdvbid0IGdlbmVyYXRlIGtleXByZXNz ZWQgZm9yIGFycm93IGtleXMsIGNhdGNoIGl0CglpZihvc19rZXlwcmVzc2VkX2Nv dW50ID09IDApewoJCW9zX3Byb2Nlc3NLZXkocixvc19jdXJfa2V5cHJlc3NlZCx0 YXJnKTsKCX0KCXZhciBxdWVyeSA9IHRhcmcudmFsdWU7Cglvc19mZXRjaFJlc3Vs dHMocixxdWVyeSxvc19zZWFyY2hfdGltZW91dCk7Cn0KCi8qKiBjYXRjaCBhcnJv d3MgdXAvZG93biBhbmQgZXNjYXBlIHRvIGhpZGUgdGhlIHN1Z2dlc3Rpb25zICov CmZ1bmN0aW9uIG9zX3Byb2Nlc3NLZXkocixrZXlwcmVzc2VkLHRhcmcpewoJaWYg KGtleXByZXNzZWQgPT0gNDApeyAvLyBBcnJvdyBEb3duCiAgICAJaWYgKHIudmlz aWJsZSkgewogICAgICAJCW9zX2NoYW5nZUhpZ2hsaWdodChyLCByLnNlbGVjdGVk LCByLnNlbGVjdGVkKzEsIHRydWUpOwogICAgCX0gZWxzZSBpZihvc190aW1lciA9 PSBudWxsKXsKICAgIAkJLy8gdXNlciB3YW50cyB0byBnZXQgc3VnZ2VzdGlvbnMg bm93CiAgICAJCXIucXVlcnkgPSAiIjsKCQkJb3NfZmV0Y2hSZXN1bHRzKHIsdGFy Zy52YWx1ZSwwKTsKICAgIAl9CiAgCX0gZWxzZSBpZiAoa2V5cHJlc3NlZCA9PSAz OCl7IC8vIEFycm93IFVwCiAgCQlpZiAoci52aXNpYmxlKXsKICAJCQlvc19jaGFu Z2VIaWdobGlnaHQociwgci5zZWxlY3RlZCwgci5zZWxlY3RlZC0xLCB0cnVlKTsK ICAJCX0KICAJfSBlbHNlIGlmKGtleXByZXNzZWQgPT0gMjcpeyAvLyBFc2NhcGUK ICAJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHIuc2VhcmNoYm94KS52YWx1ZSA9 IHIub3JpZ2luYWw7CiAgCQlyLnF1ZXJ5ID0gci5vcmlnaW5hbDsKICAJCW9zX2hp ZGVSZXN1bHRzKHIpOwogIAl9IGVsc2UgaWYoci5xdWVyeSAhPSBkb2N1bWVudC5n ZXRFbGVtZW50QnlJZChyLnNlYXJjaGJveCkudmFsdWUpewogIAkJLy8gb3NfaGlk ZVJlc3VsdHMocik7IC8vIGRvbid0IHNob3cgb2xkIHN1Z2dlc3Rpb25zCiAgCX0K fQoKLyoqIFdoZW4ga2V5cyBpcyBoZWxkIGRvd24gdXNlIGEgdGltZXIgdG8gb3V0 cHV0IHJlZ3VsYXIgZXZlbnRzICovCmZ1bmN0aW9uIG9zX2V2ZW50S2V5cHJlc3Mo ZSl7Cgl2YXIgdGFyZyA9IG9zX2dldFRhcmdldChlKTsKCXZhciByID0gb3NfbWFw W3RhcmcuaWRdOwoJaWYociA9PSBudWxsKQoJCXJldHVybjsgLy8gbm90IG91ciBl dmVudAoKCXZhciBrZXlwcmVzc2VkID0gb3NfY3VyX2tleXByZXNzZWQ7CgoJb3Nf a2V5cHJlc3NlZF9jb3VudCsrOwoJb3NfcHJvY2Vzc0tleShyLGtleXByZXNzZWQs dGFyZyk7Cn0KCi8qKiBDYXRjaCB0aGUga2V5IGNvZGUgKEZpcmVmb3ggYnVnKSAg Ki8KZnVuY3Rpb24gb3NfZXZlbnRLZXlkb3duKGUpewoJaWYgKCFlKSBlID0gd2lu ZG93LmV2ZW50OwoJdmFyIHRhcmcgPSBvc19nZXRUYXJnZXQoZSk7Cgl2YXIgciA9 IG9zX21hcFt0YXJnLmlkXTsKCWlmKHIgPT0gbnVsbCkKCQlyZXR1cm47IC8vIG5v dCBvdXIgZXZlbnQKCglvc19tb3VzZV9tb3ZlZCA9IGZhbHNlOwoKCW9zX2N1cl9r ZXlwcmVzc2VkID0gKGUua2V5Q29kZSA9PSB1bmRlZmluZWQpID8gZS53aGljaCA6 IGUua2V5Q29kZTsKCW9zX2tleXByZXNzZWRfY291bnQgPSAwOwp9CgovKiogRXZl bnQ6IGxvc3Mgb2YgZm9jdXMgb2YgaW5wdXQgYm94ICovCmZ1bmN0aW9uIG9zX2V2 ZW50Qmx1cihlKXsKCXZhciB0YXJnID0gb3NfZ2V0VGFyZ2V0KGUpOwoJdmFyIHIg PSBvc19tYXBbdGFyZy5pZF07CglpZihyID09IG51bGwpCgkJcmV0dXJuOyAvLyBu b3Qgb3VyIGV2ZW50CglpZighb3NfbW91c2VfcHJlc3NlZCl7CgkJb3NfaGlkZVJl c3VsdHMocik7CgkJLy8gZm9yY2UgY2FudmFzIHRvIHN0YXkgaGlkZGVuCgkJci5z dGF5SGlkZGVuID0gdHJ1ZQoJCS8vIGNhbmNlbCBhbnkgcGVuZGluZyBmZXRjaGVz CgkJaWYob3NfdGltZXIgIT0gbnVsbCAmJiBvc190aW1lci5pZCAhPSBudWxsKQoJ CQljbGVhclRpbWVvdXQob3NfdGltZXIuaWQpOwoJCW9zX3RpbWVyID0gbnVsbAoJ fQp9CgovKiogRXZlbnQ6IGZvY3VzIChjYXRjaCBvbmx5IHdoZW4gc3RvcHBlZCkg Ki8KZnVuY3Rpb24gb3NfZXZlbnRGb2N1cyhlKXsKCXZhciB0YXJnID0gb3NfZ2V0 VGFyZ2V0KGUpOwoJdmFyIHIgPSBvc19tYXBbdGFyZy5pZF07CglpZihyID09IG51 bGwpCgkJcmV0dXJuOyAvLyBub3Qgb3VyIGV2ZW50CglyLnN0YXlIaWRkZW4gPSBm YWxzZQp9CgoKCi8qKioqKioqKioqKioqKioqKioqKgogKiAgTW91c2UgZXZlbnRz CiAqKioqKioqKioqKioqKioqKioqKi8KCi8qKiBNb3VzZSBvdmVyIHRoZSBjb250 YWluZXIgKi8KZnVuY3Rpb24gb3NfZXZlbnRNb3VzZW92ZXIoc3JjSWQsIGUpewoJ dmFyIHRhcmcgPSBvc19nZXRUYXJnZXQoZSk7Cgl2YXIgciA9IG9zX21hcFtzcmNJ ZF07CglpZihyID09IG51bGwgfHwgIW9zX21vdXNlX21vdmVkKQoJCXJldHVybjsg Ly8gbm90IG91ciBldmVudAoJdmFyIG51bSA9IG9zX2dldE51bWJlclN1ZmZpeCh0 YXJnLmlkKTsKCWlmKG51bSA+PSAwKQoJCW9zX2NoYW5nZUhpZ2hsaWdodChyLHIu c2VsZWN0ZWQsbnVtLGZhbHNlKTsKCn0KCi8qIEdldCByb3cgd2hlcmUgdGhlIGV2 ZW50IG9jY3VyZWQgKGZyb20gaXRzIGlkKSAqLwpmdW5jdGlvbiBvc19nZXROdW1i ZXJTdWZmaXgoaWQpewoJdmFyIG51bSA9IGlkLnN1YnN0cmluZyhpZC5sZW5ndGgt Mik7CglpZiggISAobnVtLmNoYXJBdCgwKSA+PSAnMCcgJiYgbnVtLmNoYXJBdCgw KSA8PSAnOScpICkKCQludW0gPSBudW0uc3Vic3RyaW5nKDEpOwoJaWYob3NfaXNO dW1iZXIobnVtKSkKCQlyZXR1cm4gcGFyc2VJbnQobnVtKTsKCWVsc2UKCQlyZXR1 cm4gLTE7Cn0KCi8qKiBTYXZlIG1vdXNlIG1vdmUgYXMgbGFzdCBhY3Rpb24gKi8K ZnVuY3Rpb24gb3NfZXZlbnRNb3VzZW1vdmUoc3JjSWQsIGUpewoJb3NfbW91c2Vf bW92ZWQgPSB0cnVlOwp9CgovKiogTW91c2UgYnV0dG9uIGhlbGQgZG93biwgcmVn aXN0ZXIgcG9zc2libGUgY2xpY2sgICovCmZ1bmN0aW9uIG9zX2V2ZW50TW91c2Vk b3duKHNyY0lkLCBlKXsKCXZhciB0YXJnID0gb3NfZ2V0VGFyZ2V0KGUpOwoJdmFy IHIgPSBvc19tYXBbc3JjSWRdOwoJaWYociA9PSBudWxsKQoJCXJldHVybjsgLy8g bm90IG91ciBldmVudAoJdmFyIG51bSA9IG9zX2dldE51bWJlclN1ZmZpeCh0YXJn LmlkKTsKCglvc19tb3VzZV9wcmVzc2VkID0gdHJ1ZTsKCWlmKG51bSA+PSAwKXsK CQlvc19tb3VzZV9udW0gPSBudW07CgkJLy8gb3NfdXBkYXRlU2VhcmNoUXVlcnko cixyLnJlc3VsdHNbbnVtXSk7Cgl9CgkvLyBrZWVwIHRoZSBmb2N1cyBvbiB0aGUg c2VhcmNoIGZpZWxkCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZChyLnNlYXJjaGJv eCkuZm9jdXMoKTsKCglyZXR1cm4gZmFsc2U7IC8vIHByZXZlbnRzIHNlbGVjdGlv bgp9CgovKiogTW91c2UgYnV0dG9uIHJlbGVhc2VkLCBjaGVjayBmb3IgY2xpY2sg b24gc29tZSByb3cgKi8KZnVuY3Rpb24gb3NfZXZlbnRNb3VzZXVwKHNyY0lkLCBl KXsKCXZhciB0YXJnID0gb3NfZ2V0VGFyZ2V0KGUpOwoJdmFyIHIgPSBvc19tYXBb c3JjSWRdOwoJaWYociA9PSBudWxsKQoJCXJldHVybjsgLy8gbm90IG91ciBldmVu dAoJdmFyIG51bSA9IG9zX2dldE51bWJlclN1ZmZpeCh0YXJnLmlkKTsKCglpZihu dW0gPj0gMCAmJiBvc19tb3VzZV9udW0gPT0gbnVtKXsKCQlvc191cGRhdGVTZWFy Y2hRdWVyeShyLHIucmVzdWx0c1tudW1dKTsKCQlvc19oaWRlUmVzdWx0cyhyKTsK CQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZChyLnNlYXJjaGZvcm0pLnN1Ym1pdCgp OwoJfQoJb3NfbW91c2VfcHJlc3NlZCA9IGZhbHNlOwoJLy8ga2VlcCB0aGUgZm9j dXMgb24gdGhlIHNlYXJjaCBmaWVsZAoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo ci5zZWFyY2hib3gpLmZvY3VzKCk7Cn0KCi8qKiBDaGVjayBpZiB4IGlzIGEgdmFs aWQgaW50ZWdlciAqLwpmdW5jdGlvbiBvc19pc051bWJlcih4KXsKCWlmKHggPT0g IiIgfHwgaXNOYU4oeCkpCgkJcmV0dXJuIGZhbHNlOwoJZm9yKHZhciBpPTA7aTx4 Lmxlbmd0aDtpKyspewoJCXZhciBjID0geC5jaGFyQXQoaSk7CgkJaWYoICEgKGMg Pj0gJzAnICYmIGMgPD0gJzknKSApCgkJCXJldHVybiBmYWxzZTsKCX0KCXJldHVy biB0cnVlOwp9CgoKLyoqIFdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkIGhpZGUg ZXZlcnl0aGluZywgY2FuY2VsIHVwZGF0ZXMuLi4gKi8KZnVuY3Rpb24gb3NfZXZl bnRPbnN1Ym1pdChlKXsKCXZhciB0YXJnID0gb3NfZ2V0VGFyZ2V0KGUpOwoKCW9z X2lzX3N0b3BwZWQgPSB0cnVlOwoJLy8ga2lsbCB0aW1lZCByZXF1ZXN0cwoJaWYo b3NfdGltZXIgIT0gbnVsbCAmJiBvc190aW1lci5pZCAhPSBudWxsKXsKCQljbGVh clRpbWVvdXQob3NfdGltZXIuaWQpOwoJCW9zX3RpbWVyID0gbnVsbDsKCX0KCS8v IEhpZGUgYWxsIHN1Z2dlc3Rpb25zCglmb3IoaT0wO2k8b3NfYXV0b2xvYWRfaW5w dXRzLmxlbmd0aDtpKyspewoJCXZhciByID0gb3NfbWFwW29zX2F1dG9sb2FkX2lu cHV0c1tpXV07CgkJaWYociAhPSBudWxsKXsKCQkJdmFyIGIgPSBkb2N1bWVudC5n ZXRFbGVtZW50QnlJZChyLnNlYXJjaGZvcm0pOwoJCQlpZihiICE9IG51bGwgJiYg YiA9PSB0YXJnKXsKCQkJCS8vIHNldCBxdWVyeSB2YWx1ZSBzbyB0aGUgaGFuZGxl ciB3b24ndCB0cnkgdG8gZmV0Y2ggYWRkaXRpb25hbCByZXN1bHRzCgkJCQlyLnF1 ZXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoci5zZWFyY2hib3gpLnZhbHVl OwoJCQl9CgkJCW9zX2hpZGVSZXN1bHRzKHIpOwoJCX0KCX0KCXJldHVybiB0cnVl Owp9CgpmdW5jdGlvbiBvc19ob29rRXZlbnQoZWxlbWVudCwgaG9va05hbWUsIGhv b2tGdW5jdCkgewoJaWYgKGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewoJCWVs ZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihob29rTmFtZSwgaG9va0Z1bmN0LCBmYWxz ZSk7Cgl9IGVsc2UgaWYgKHdpbmRvdy5hdHRhY2hFdmVudCkgewoJCWVsZW1lbnQu YXR0YWNoRXZlbnQoIm9uIiArIGhvb2tOYW1lLCBob29rRnVuY3QpOwoJfQp9Cgov KiogSW5pdCBSZXN1bHQgb2JqZWN0cyBhbmQgZXZlbnQgaGFuZGxlcnMgKi8KZnVu Y3Rpb24gb3NfaW5pdEhhbmRsZXJzKG5hbWUsIGZvcm1uYW1lLCBlbGVtZW50KXsK CXZhciByID0gbmV3IG9zX1Jlc3VsdHMobmFtZSwgZm9ybW5hbWUpOwoJLy8gZXZl bnQgaGFuZGxlcgoJb3NfaG9va0V2ZW50KGVsZW1lbnQsICJrZXl1cCIsIGZ1bmN0 aW9uKGV2ZW50KSB7IG9zX2V2ZW50S2V5dXAoZXZlbnQpOyB9KTsKCW9zX2hvb2tF dmVudChlbGVtZW50LCAia2V5ZG93biIsIGZ1bmN0aW9uKGV2ZW50KSB7IG9zX2V2 ZW50S2V5ZG93bihldmVudCk7IH0pOwoJb3NfaG9va0V2ZW50KGVsZW1lbnQsICJr ZXlwcmVzcyIsIGZ1bmN0aW9uKGV2ZW50KSB7IG9zX2V2ZW50S2V5cHJlc3MoZXZl bnQpOyB9KTsKCW9zX2hvb2tFdmVudChlbGVtZW50LCAiYmx1ciIsIGZ1bmN0aW9u KGV2ZW50KSB7IG9zX2V2ZW50Qmx1cihldmVudCk7IH0pOwoJb3NfaG9va0V2ZW50 KGVsZW1lbnQsICJmb2N1cyIsIGZ1bmN0aW9uKGV2ZW50KSB7IG9zX2V2ZW50Rm9j dXMoZXZlbnQpOyB9KTsKCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJhdXRvY29tcGxl dGUiLCJvZmYiKTsKCS8vIHN0b3BwaW5nIGhhbmRsZXIKCW9zX2hvb2tFdmVudChk b2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtbmFtZSksICJzdWJtaXQiLCBmdW5j dGlvbihldmVudCl7IHJldHVybiBvc19ldmVudE9uc3VibWl0KGV2ZW50KTsgfSk7 Cglvc19tYXBbbmFtZV0gPSByOwoJLy8gdG9nZ2xlIGxpbmsKCWlmKGRvY3VtZW50 LmdldEVsZW1lbnRCeUlkKHIudG9nZ2xlKSA9PSBudWxsKXsKCQkvLyBUT0RPOiBk aXNhYmxlIHRoaXMgd2hpbGUgd2UgZmlndXJlIG91dCBhIHdheSBmb3IgdGhpcyB0 byB3b3JrIGluIGFsbCBicm93c2VycwoJCS8qIGlmKG5hbWU9PSdzZWFyY2hJbnB1 dCcpewoJCQkvLyBzcGVjaWFsIGNhc2U6IHBsYWNlIGFib3ZlIHRoZSBtYWluIHNl YXJjaCBib3gKCQkJdmFyIHQgPSBvc19jcmVhdGVUb2dnbGUociwib3Mtc3VnZ2Vz dC10b2dnbGUiKTsKCQkJdmFyIHNlYXJjaEJvZHkgPSBkb2N1bWVudC5nZXRFbGVt ZW50QnlJZCgnc2VhcmNoQm9keScpOwoJCQl2YXIgZmlyc3QgPSBzZWFyY2hCb2R5 LnBhcmVudE5vZGUuZmlyc3RDaGlsZC5uZXh0U2libGluZy5hcHBlbmRDaGlsZCh0 KTsKCQl9IGVsc2V7CgkJCS8vIGRlZmF1bHQ6IHBsYWNlIGJlbG93IHNlYXJjaCBi b3ggdG8gdGhlIHJpZ2h0CgkJCXZhciB0ID0gb3NfY3JlYXRlVG9nZ2xlKHIsIm9z LXN1Z2dlc3QtdG9nZ2xlLWRlZiIpOwoJCQl2YXIgdG9wID0gZWxlbWVudC5vZmZz ZXRUb3AgKyBlbGVtZW50Lm9mZnNldEhlaWdodDsKCQkJdmFyIGxlZnQgPSBlbGVt ZW50Lm9mZnNldExlZnQgKyBlbGVtZW50Lm9mZnNldFdpZHRoOwoJCQl0LnN0eWxl LnBvc2l0aW9uID0gImFic29sdXRlIjsKCQkJdC5zdHlsZS50b3AgPSB0b3AgKyAi cHgiOwoJCQl0LnN0eWxlLmxlZnQgPSBsZWZ0ICsgInB4IjsKCQkJZWxlbWVudC5w YXJlbnROb2RlLmFwcGVuZENoaWxkKHQpOwoJCQkvLyBvbmx5IG5vdyB3aWR0aCBn ZXRzIGNhbGN1bGF0ZWQsIHNoaWZ0IHJpZ2h0CgkJCWxlZnQgLT0gdC5vZmZzZXRX aWR0aDsKCQkJdC5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CgkJCXQuc3R5bGUu dmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKCQl9ICovCgl9Cgp9CgovKiogUmV0dXJu IHRoZSBzcGFuIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgdG9nZ2xlIGxpbmsg Ki8KZnVuY3Rpb24gb3NfY3JlYXRlVG9nZ2xlKHIsY2xhc3NOYW1lKXsKCXZhciB0 ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwoJdC5jbGFzc05hbWUg PSBjbGFzc05hbWU7Cgl0LnNldEF0dHJpYnV0ZSgiaWQiLCByLnRvZ2dsZSk7Cgl2 YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKCWxpbmsuc2V0 QXR0cmlidXRlKCJocmVmIiwiamF2YXNjcmlwdDp2b2lkKDApOyIpOwoJbGluay5v bmNsaWNrID0gZnVuY3Rpb24oKXsgb3NfdG9nZ2xlKHIuc2VhcmNoYm94LHIuc2Vh cmNoZm9ybSkgfTsKCXZhciBtc2cgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh3 Z01XU3VnZ2VzdE1lc3NhZ2VzWzBdKTsKCWxpbmsuYXBwZW5kQ2hpbGQobXNnKTsK CXQuYXBwZW5kQ2hpbGQobGluayk7CglyZXR1cm4gdDsKfQoKLyoqIENhbGwgd2hl biB1c2VyIGNsaWNrcyBvbiBzb21lIG9mIHRoZSB0b2dnbGUgbGlua3MgKi8KZnVu Y3Rpb24gb3NfdG9nZ2xlKGlucHV0SWQsZm9ybU5hbWUpewoJciA9IG9zX21hcFtp bnB1dElkXTsKCXZhciBtc2cgPSAnJzsKCWlmKHIgPT0gbnVsbCl7CgkJb3NfZW5h YmxlU3VnZ2VzdGlvbnNPbihpbnB1dElkLGZvcm1OYW1lKTsKCQlyID0gb3NfbWFw W2lucHV0SWRdOwoJCW1zZyA9IHdnTVdTdWdnZXN0TWVzc2FnZXNbMF07Cgl9IGVs c2V7CgkJb3NfZGlzYWJsZVN1Z2dlc3Rpb25zT24oaW5wdXRJZCxmb3JtTmFtZSk7 CgkJbXNnID0gd2dNV1N1Z2dlc3RNZXNzYWdlc1sxXTsKCX0KCS8vIGNoYW5nZSBt ZXNzYWdlCgl2YXIgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHIudG9n Z2xlKS5maXJzdENoaWxkOwoJbGluay5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3Jl YXRlVGV4dE5vZGUobXNnKSxsaW5rLmZpcnN0Q2hpbGQpOwp9CgovKiogQ2FsbCB0 aGlzIHRvIGVuYWJsZSBzdWdnZXN0aW9ucyBvbiBpbnB1dCAoaWQ9aW5wdXRJZCks IG9uIGEgZm9ybSAobmFtZT1mb3JtTmFtZSkgKi8KZnVuY3Rpb24gb3NfZW5hYmxl U3VnZ2VzdGlvbnNPbihpbnB1dElkLCBmb3JtTmFtZSl7Cglvc19pbml0SGFuZGxl cnMoIGlucHV0SWQsIGZvcm1OYW1lLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChp bnB1dElkKSApOwp9CgovKiogQ2FsbCB0aGlzIHRvIGRpc2FibGUgc3VnZ2VzdGlv cyBvbiBpbnB1dCBib3ggKGlkPWlucHV0SWQpICovCmZ1bmN0aW9uIG9zX2Rpc2Fi bGVTdWdnZXN0aW9uc09uKGlucHV0SWQpewoJciA9IG9zX21hcFtpbnB1dElkXTsK CWlmKHIgIT0gbnVsbCl7CgkJLy8gY2FuY2VsL2hpZGUgcmVzdWx0cwoJCW9zX3Rp bWVyID0gbnVsbDsKCQlvc19oaWRlUmVzdWx0cyhyKTsKCQkvLyB0dXJuIGF1dG9j b21wbGV0ZSBvbiAhCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCku c2V0QXR0cmlidXRlKCJhdXRvY29tcGxldGUiLCJvbiIpOwoJCS8vIHJlbW92ZSBk ZXNjcmlwdG9yCgkJb3NfbWFwW2lucHV0SWRdID0gbnVsbDsKCX0KCQoJLy8gUmVt b3ZlIHRoZSBlbGVtZW50IGZyb20gdGhlIG9zX2F1dG9sb2FkXyogYXJyYXlzCgl2 YXIgaW5kZXggPSBvc19hdXRvbG9hZF9pbnB1dHMuaW5kZXhPZihpbnB1dElkKTsK CWlmICggaW5kZXggPj0gMCApCgkJb3NfYXV0b2xvYWRfaW5wdXRzW2luZGV4XSA9 IG9zX2F1dG9sb2FkX2Zvcm1zW2luZGV4XSA9ICcnOwp9CgovKiogSW5pdGlhbGl6 YXRpb24sIGNhbGwgdXBvbiBwYWdlIG9ubG9hZCAqLwpmdW5jdGlvbiBvc19NV1N1 Z2dlc3RJbml0KCkgewoJZm9yKGk9MDtpPG9zX2F1dG9sb2FkX2lucHV0cy5sZW5n dGg7aSsrKXsKCQl2YXIgaWQgPSBvc19hdXRvbG9hZF9pbnB1dHNbaV07CgkJdmFy IGZvcm0gPSBvc19hdXRvbG9hZF9mb3Jtc1tpXTsKCQllbGVtZW50ID0gZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJaWYoZWxlbWVudCAhPSBudWxsKQoJ CQlvc19pbml0SGFuZGxlcnMoaWQsZm9ybSxlbGVtZW50KTsKCX0KfQoKaG9va0V2 ZW50KCJsb2FkIiwgb3NfTVdTdWdnZXN0SW5pdCk7Cg== ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=js2.combined.min.js Content-Type: application/x-javascript; name=js2.combined.min.js Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/js/js2.combined.min.js?8 Content-Transfer-Encoding: Base64 CihmdW5jdGlvbigpe3Zhcgp3aW5kb3c9dGhpcyx1bmRlZmluZWQsX2pRdWVyeT13 aW5kb3cualF1ZXJ5LF8kPXdpbmRvdy4kLGpRdWVyeT13aW5kb3cualF1ZXJ5PXdp bmRvdy4kPWZ1bmN0aW9uKHNlbGVjdG9yLGNvbnRleHQpe3JldHVybiBuZXcgalF1 ZXJ5LmZuLmluaXQoc2VsZWN0b3IsY29udGV4dCk7fSxxdWlja0V4cHI9L15bXjxd Kig8KC58XHMpKz4pW14+XSokfF4jKFtcdy1dKykkLyxpc1NpbXBsZT0vXi5bXjoj XFtcLixdKiQvO2pRdWVyeS5mbj1qUXVlcnkucHJvdG90eXBlPXtpbml0OmZ1bmN0 aW9uKHNlbGVjdG9yLGNvbnRleHQpe3NlbGVjdG9yPXNlbGVjdG9yfHxkb2N1bWVu dDtpZihzZWxlY3Rvci5ub2RlVHlwZSl7dGhpc1swXT1zZWxlY3Rvcjt0aGlzLmxl bmd0aD0xO3RoaXMuY29udGV4dD1zZWxlY3RvcjtyZXR1cm4gdGhpczt9CmlmKHR5 cGVvZiBzZWxlY3Rvcj09PSJzdHJpbmciKXt2YXIgbWF0Y2g9cXVpY2tFeHByLmV4 ZWMoc2VsZWN0b3IpO2lmKG1hdGNoJiYobWF0Y2hbMV18fCFjb250ZXh0KSl7aWYo bWF0Y2hbMV0pCnNlbGVjdG9yPWpRdWVyeS5jbGVhbihbbWF0Y2hbMV1dLGNvbnRl eHQpO2Vsc2V7dmFyIGVsZW09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hb M10pO2lmKGVsZW0mJmVsZW0uaWQhPW1hdGNoWzNdKQpyZXR1cm4galF1ZXJ5KCku ZmluZChzZWxlY3Rvcik7dmFyIHJldD1qUXVlcnkoZWxlbXx8W10pO3JldC5jb250 ZXh0PWRvY3VtZW50O3JldC5zZWxlY3Rvcj1zZWxlY3RvcjtyZXR1cm4gcmV0O319 ZWxzZQpyZXR1cm4galF1ZXJ5KGNvbnRleHQpLmZpbmQoc2VsZWN0b3IpO31lbHNl IGlmKGpRdWVyeS5pc0Z1bmN0aW9uKHNlbGVjdG9yKSkKcmV0dXJuIGpRdWVyeShk b2N1bWVudCkucmVhZHkoc2VsZWN0b3IpO2lmKHNlbGVjdG9yLnNlbGVjdG9yJiZz ZWxlY3Rvci5jb250ZXh0KXt0aGlzLnNlbGVjdG9yPXNlbGVjdG9yLnNlbGVjdG9y O3RoaXMuY29udGV4dD1zZWxlY3Rvci5jb250ZXh0O30KcmV0dXJuIHRoaXMuc2V0 QXJyYXkoalF1ZXJ5LmlzQXJyYXkoc2VsZWN0b3IpP3NlbGVjdG9yOmpRdWVyeS5t YWtlQXJyYXkoc2VsZWN0b3IpKTt9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS4zLjIi LHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGg7fSxnZXQ6ZnVuY3Rp b24obnVtKXtyZXR1cm4gbnVtPT09dW5kZWZpbmVkP0FycmF5LnByb3RvdHlwZS5z bGljZS5jYWxsKHRoaXMpOnRoaXNbbnVtXTt9LHB1c2hTdGFjazpmdW5jdGlvbihl bGVtcyxuYW1lLHNlbGVjdG9yKXt2YXIgcmV0PWpRdWVyeShlbGVtcyk7cmV0LnBy ZXZPYmplY3Q9dGhpcztyZXQuY29udGV4dD10aGlzLmNvbnRleHQ7aWYobmFtZT09 PSJmaW5kIikKcmV0LnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0 b3I/IiAiOiIiKStzZWxlY3RvcjtlbHNlIGlmKG5hbWUpCnJldC5zZWxlY3Rvcj10 aGlzLnNlbGVjdG9yKyIuIituYW1lKyIoIitzZWxlY3RvcisiKSI7cmV0dXJuIHJl dDt9LHNldEFycmF5OmZ1bmN0aW9uKGVsZW1zKXt0aGlzLmxlbmd0aD0wO0FycmF5 LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMsZWxlbXMpO3JldHVybiB0aGlzO30s ZWFjaDpmdW5jdGlvbihjYWxsYmFjayxhcmdzKXtyZXR1cm4galF1ZXJ5LmVhY2go dGhpcyxjYWxsYmFjayxhcmdzKTt9LGluZGV4OmZ1bmN0aW9uKGVsZW0pe3JldHVy biBqUXVlcnkuaW5BcnJheShlbGVtJiZlbGVtLmpxdWVyeT9lbGVtWzBdOmVsZW0s dGhpcyk7fSxhdHRyOmZ1bmN0aW9uKG5hbWUsdmFsdWUsdHlwZSl7dmFyIG9wdGlv bnM9bmFtZTtpZih0eXBlb2YgbmFtZT09PSJzdHJpbmciKQppZih2YWx1ZT09PXVu ZGVmaW5lZCkKcmV0dXJuIHRoaXNbMF0mJmpRdWVyeVt0eXBlfHwiYXR0ciJdKHRo aXNbMF0sbmFtZSk7ZWxzZXtvcHRpb25zPXt9O29wdGlvbnNbbmFtZV09dmFsdWU7 fQpyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpe2ZvcihuYW1lIGluIG9wdGlv bnMpCmpRdWVyeS5hdHRyKHR5cGU/dGhpcy5zdHlsZTp0aGlzLG5hbWUsalF1ZXJ5 LnByb3AodGhpcyxvcHRpb25zW25hbWVdLHR5cGUsaSxuYW1lKSk7fSk7fSxjc3M6 ZnVuY3Rpb24oa2V5LHZhbHVlKXtpZigoa2V5PT0nd2lkdGgnfHxrZXk9PSdoZWln aHQnKSYmcGFyc2VGbG9hdCh2YWx1ZSk8MCkKdmFsdWU9dW5kZWZpbmVkO3JldHVy biB0aGlzLmF0dHIoa2V5LHZhbHVlLCJjdXJDU1MiKTt9LHRleHQ6ZnVuY3Rpb24o dGV4dCl7aWYodHlwZW9mIHRleHQhPT0ib2JqZWN0IiYmdGV4dCE9bnVsbCkKcmV0 dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJE b2N1bWVudHx8ZG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKHRleHQpKTt2YXIgcmV0 PSIiO2pRdWVyeS5lYWNoKHRleHR8fHRoaXMsZnVuY3Rpb24oKXtqUXVlcnkuZWFj aCh0aGlzLmNoaWxkTm9kZXMsZnVuY3Rpb24oKXtpZih0aGlzLm5vZGVUeXBlIT04 KQpyZXQrPXRoaXMubm9kZVR5cGUhPTE/dGhpcy5ub2RlVmFsdWU6alF1ZXJ5LmZu LnRleHQoW3RoaXNdKTt9KTt9KTtyZXR1cm4gcmV0O30sd3JhcEFsbDpmdW5jdGlv bihodG1sKXtpZih0aGlzWzBdKXt2YXIgd3JhcD1qUXVlcnkoaHRtbCx0aGlzWzBd Lm93bmVyRG9jdW1lbnQpLmNsb25lKCk7aWYodGhpc1swXS5wYXJlbnROb2RlKQp3 cmFwLmluc2VydEJlZm9yZSh0aGlzWzBdKTt3cmFwLm1hcChmdW5jdGlvbigpe3Zh ciBlbGVtPXRoaXM7d2hpbGUoZWxlbS5maXJzdENoaWxkKQplbGVtPWVsZW0uZmly c3RDaGlsZDtyZXR1cm4gZWxlbTt9KS5hcHBlbmQodGhpcyk7fQpyZXR1cm4gdGhp czt9LHdyYXBJbm5lcjpmdW5jdGlvbihodG1sKXtyZXR1cm4gdGhpcy5lYWNoKGZ1 bmN0aW9uKCl7alF1ZXJ5KHRoaXMpLmNvbnRlbnRzKCkud3JhcEFsbChodG1sKTt9 KTt9LHdyYXA6ZnVuY3Rpb24oaHRtbCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlv bigpe2pRdWVyeSh0aGlzKS53cmFwQWxsKGh0bWwpO30pO30sYXBwZW5kOmZ1bmN0 aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLHRydWUsZnVuY3Rp b24oZWxlbSl7aWYodGhpcy5ub2RlVHlwZT09MSkKdGhpcy5hcHBlbmRDaGlsZChl bGVtKTt9KTt9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5p cChhcmd1bWVudHMsdHJ1ZSxmdW5jdGlvbihlbGVtKXtpZih0aGlzLm5vZGVUeXBl PT0xKQp0aGlzLmluc2VydEJlZm9yZShlbGVtLHRoaXMuZmlyc3RDaGlsZCk7fSk7 fSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVu dHMsZmFsc2UsZnVuY3Rpb24oZWxlbSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJl Zm9yZShlbGVtLHRoaXMpO30pO30sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp cy5kb21NYW5pcChhcmd1bWVudHMsZmFsc2UsZnVuY3Rpb24oZWxlbSl7dGhpcy5w YXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtLHRoaXMubmV4dFNpYmxpbmcpO30p O30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8alF1ZXJ5 KFtdKTt9LHB1c2g6W10ucHVzaCxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGlj ZSxmaW5kOmZ1bmN0aW9uKHNlbGVjdG9yKXtpZih0aGlzLmxlbmd0aD09PTEpe3Zh ciByZXQ9dGhpcy5wdXNoU3RhY2soW10sImZpbmQiLHNlbGVjdG9yKTtyZXQubGVu Z3RoPTA7alF1ZXJ5LmZpbmQoc2VsZWN0b3IsdGhpc1swXSxyZXQpO3JldHVybiBy ZXQ7fWVsc2V7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGpRdWVyeS51bmlxdWUoalF1 ZXJ5Lm1hcCh0aGlzLGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZmluZChz ZWxlY3RvcixlbGVtKTt9KSksImZpbmQiLHNlbGVjdG9yKTt9fSxjbG9uZTpmdW5j dGlvbihldmVudHMpe3ZhciByZXQ9dGhpcy5tYXAoZnVuY3Rpb24oKXtpZighalF1 ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50JiYhalF1ZXJ5LmlzWE1MRG9jKHRoaXMp KXt2YXIgaHRtbD10aGlzLm91dGVySFRNTDtpZighaHRtbCl7dmFyIGRpdj10aGlz Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZGl2LmFwcGVuZENo aWxkKHRoaXMuY2xvbmVOb2RlKHRydWUpKTtodG1sPWRpdi5pbm5lckhUTUw7fQpy ZXR1cm4galF1ZXJ5LmNsZWFuKFtodG1sLnJlcGxhY2UoLyBqUXVlcnlcZCs9Iig/ OlxkK3xudWxsKSIvZywiIikucmVwbGFjZSgvXlxzKi8sIiIpXSlbMF07fWVsc2UK cmV0dXJuIHRoaXMuY2xvbmVOb2RlKHRydWUpO30pO2lmKGV2ZW50cz09PXRydWUp e3ZhciBvcmlnPXRoaXMuZmluZCgiKiIpLmFuZFNlbGYoKSxpPTA7cmV0LmZpbmQo IioiKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMubm9kZU5hbWUh PT1vcmlnW2ldLm5vZGVOYW1lKQpyZXR1cm47dmFyIGV2ZW50cz1qUXVlcnkuZGF0 YShvcmlnW2ldLCJldmVudHMiKTtmb3IodmFyIHR5cGUgaW4gZXZlbnRzKXtmb3Io dmFyIGhhbmRsZXIgaW4gZXZlbnRzW3R5cGVdKXtqUXVlcnkuZXZlbnQuYWRkKHRo aXMsdHlwZSxldmVudHNbdHlwZV1baGFuZGxlcl0sZXZlbnRzW3R5cGVdW2hhbmRs ZXJdLmRhdGEpO319CmkrKzt9KTt9CnJldHVybiByZXQ7fSxmaWx0ZXI6ZnVuY3Rp b24oc2VsZWN0b3Ipe3JldHVybiB0aGlzLnB1c2hTdGFjayhqUXVlcnkuaXNGdW5j dGlvbihzZWxlY3RvcikmJmpRdWVyeS5ncmVwKHRoaXMsZnVuY3Rpb24oZWxlbSxp KXtyZXR1cm4gc2VsZWN0b3IuY2FsbChlbGVtLGkpO30pfHxqUXVlcnkubXVsdGlG aWx0ZXIoc2VsZWN0b3IsalF1ZXJ5LmdyZXAodGhpcyxmdW5jdGlvbihlbGVtKXty ZXR1cm4gZWxlbS5ub2RlVHlwZT09PTE7fSkpLCJmaWx0ZXIiLHNlbGVjdG9yKTt9 LGNsb3Nlc3Q6ZnVuY3Rpb24oc2VsZWN0b3Ipe3ZhciBwb3M9alF1ZXJ5LmV4cHIu bWF0Y2guUE9TLnRlc3Qoc2VsZWN0b3IpP2pRdWVyeShzZWxlY3Rvcik6bnVsbCxj bG9zZXI9MDtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgY3VyPXRoaXM7 d2hpbGUoY3VyJiZjdXIub3duZXJEb2N1bWVudCl7aWYocG9zP3Bvcy5pbmRleChj dXIpPi0xOmpRdWVyeShjdXIpLmlzKHNlbGVjdG9yKSl7alF1ZXJ5LmRhdGEoY3Vy LCJjbG9zZXN0IixjbG9zZXIpO3JldHVybiBjdXI7fQpjdXI9Y3VyLnBhcmVudE5v ZGU7Y2xvc2VyKys7fX0pO30sbm90OmZ1bmN0aW9uKHNlbGVjdG9yKXtpZih0eXBl b2Ygc2VsZWN0b3I9PT0ic3RyaW5nIikKaWYoaXNTaW1wbGUudGVzdChzZWxlY3Rv cikpCnJldHVybiB0aGlzLnB1c2hTdGFjayhqUXVlcnkubXVsdGlGaWx0ZXIoc2Vs ZWN0b3IsdGhpcyx0cnVlKSwibm90IixzZWxlY3Rvcik7ZWxzZQpzZWxlY3Rvcj1q UXVlcnkubXVsdGlGaWx0ZXIoc2VsZWN0b3IsdGhpcyk7dmFyIGlzQXJyYXlMaWtl PXNlbGVjdG9yLmxlbmd0aCYmc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoLTFdIT09 dW5kZWZpbmVkJiYhc2VsZWN0b3Iubm9kZVR5cGU7cmV0dXJuIHRoaXMuZmlsdGVy KGZ1bmN0aW9uKCl7cmV0dXJuIGlzQXJyYXlMaWtlP2pRdWVyeS5pbkFycmF5KHRo aXMsc2VsZWN0b3IpPDA6dGhpcyE9c2VsZWN0b3I7fSk7fSxhZGQ6ZnVuY3Rpb24o c2VsZWN0b3Ipe3JldHVybiB0aGlzLnB1c2hTdGFjayhqUXVlcnkudW5pcXVlKGpR dWVyeS5tZXJnZSh0aGlzLmdldCgpLHR5cGVvZiBzZWxlY3Rvcj09PSJzdHJpbmci P2pRdWVyeShzZWxlY3Rvcik6alF1ZXJ5Lm1ha2VBcnJheShzZWxlY3RvcikpKSk7 fSxpczpmdW5jdGlvbihzZWxlY3Rvcil7cmV0dXJuISFzZWxlY3RvciYmalF1ZXJ5 Lm11bHRpRmlsdGVyKHNlbGVjdG9yLHRoaXMpLmxlbmd0aD4wO30saGFzQ2xhc3M6 ZnVuY3Rpb24oc2VsZWN0b3Ipe3JldHVybiEhc2VsZWN0b3ImJnRoaXMuaXMoIi4i K3NlbGVjdG9yKTt9LHZhbDpmdW5jdGlvbih2YWx1ZSl7aWYodmFsdWU9PT11bmRl ZmluZWQpe3ZhciBlbGVtPXRoaXNbMF07aWYoZWxlbSl7aWYoalF1ZXJ5Lm5vZGVO YW1lKGVsZW0sJ29wdGlvbicpKQpyZXR1cm4oZWxlbS5hdHRyaWJ1dGVzLnZhbHVl fHx7fSkuc3BlY2lmaWVkP2VsZW0udmFsdWU6ZWxlbS50ZXh0O2lmKGpRdWVyeS5u b2RlTmFtZShlbGVtLCJzZWxlY3QiKSl7dmFyIGluZGV4PWVsZW0uc2VsZWN0ZWRJ bmRleCx2YWx1ZXM9W10sb3B0aW9ucz1lbGVtLm9wdGlvbnMsb25lPWVsZW0udHlw ZT09InNlbGVjdC1vbmUiO2lmKGluZGV4PDApCnJldHVybiBudWxsO2Zvcih2YXIg aT1vbmU/aW5kZXg6MCxtYXg9b25lP2luZGV4KzE6b3B0aW9ucy5sZW5ndGg7aTxt YXg7aSsrKXt2YXIgb3B0aW9uPW9wdGlvbnNbaV07aWYob3B0aW9uLnNlbGVjdGVk KXt2YWx1ZT1qUXVlcnkob3B0aW9uKS52YWwoKTtpZihvbmUpCnJldHVybiB2YWx1 ZTt2YWx1ZXMucHVzaCh2YWx1ZSk7fX0KcmV0dXJuIHZhbHVlczt9CnJldHVybihl bGVtLnZhbHVlfHwiIikucmVwbGFjZSgvXHIvZywiIik7fQpyZXR1cm4gdW5kZWZp bmVkO30KaWYodHlwZW9mIHZhbHVlPT09Im51bWJlciIpCnZhbHVlKz0nJztyZXR1 cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlVHlwZSE9MSkKcmV0 dXJuO2lmKGpRdWVyeS5pc0FycmF5KHZhbHVlKSYmL3JhZGlvfGNoZWNrYm94Ly50 ZXN0KHRoaXMudHlwZSkpCnRoaXMuY2hlY2tlZD0oalF1ZXJ5LmluQXJyYXkodGhp cy52YWx1ZSx2YWx1ZSk+PTB8fGpRdWVyeS5pbkFycmF5KHRoaXMubmFtZSx2YWx1 ZSk+PTApO2Vsc2UgaWYoalF1ZXJ5Lm5vZGVOYW1lKHRoaXMsInNlbGVjdCIpKXt2 YXIgdmFsdWVzPWpRdWVyeS5tYWtlQXJyYXkodmFsdWUpO2pRdWVyeSgib3B0aW9u Iix0aGlzKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD0oalF1ZXJ5Lmlu QXJyYXkodGhpcy52YWx1ZSx2YWx1ZXMpPj0wfHxqUXVlcnkuaW5BcnJheSh0aGlz LnRleHQsdmFsdWVzKT49MCk7fSk7aWYoIXZhbHVlcy5sZW5ndGgpCnRoaXMuc2Vs ZWN0ZWRJbmRleD0tMTt9ZWxzZQp0aGlzLnZhbHVlPXZhbHVlO30pO30saHRtbDpm dW5jdGlvbih2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkPyh0aGlzWzBd P3RoaXNbMF0uaW5uZXJIVE1MLnJlcGxhY2UoLyBqUXVlcnlcZCs9Iig/OlxkK3xu dWxsKSIvZywiIik6bnVsbCk6dGhpcy5lbXB0eSgpLmFwcGVuZCh2YWx1ZSk7fSxy ZXBsYWNlV2l0aDpmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIHRoaXMuYWZ0ZXIodmFs dWUpLnJlbW92ZSgpO30sZXE6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMuc2xpY2Uo aSwraSsxKTt9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNr KEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNs aWNlIixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4o IiwiKSk7fSxtYXA6ZnVuY3Rpb24oY2FsbGJhY2spe3JldHVybiB0aGlzLnB1c2hT dGFjayhqUXVlcnkubWFwKHRoaXMsZnVuY3Rpb24oZWxlbSxpKXtyZXR1cm4gY2Fs bGJhY2suY2FsbChlbGVtLGksZWxlbSk7fSkpO30sYW5kU2VsZjpmdW5jdGlvbigp e3JldHVybiB0aGlzLmFkZCh0aGlzLnByZXZPYmplY3QpO30sZG9tTWFuaXA6ZnVu Y3Rpb24oYXJncyx0YWJsZSxjYWxsYmFjayl7aWYodGhpc1swXSl7dmFyIGZyYWdt ZW50PSh0aGlzWzBdLm93bmVyRG9jdW1lbnR8fHRoaXNbMF0pLmNyZWF0ZURvY3Vt ZW50RnJhZ21lbnQoKSxzY3JpcHRzPWpRdWVyeS5jbGVhbihhcmdzLCh0aGlzWzBd Lm93bmVyRG9jdW1lbnR8fHRoaXNbMF0pLGZyYWdtZW50KSxmaXJzdD1mcmFnbWVu dC5maXJzdENoaWxkO2lmKGZpcnN0KQpmb3IodmFyIGk9MCxsPXRoaXMubGVuZ3Ro O2k8bDtpKyspCmNhbGxiYWNrLmNhbGwocm9vdCh0aGlzW2ldLGZpcnN0KSx0aGlz Lmxlbmd0aD4xfHxpPjA/ZnJhZ21lbnQuY2xvbmVOb2RlKHRydWUpOmZyYWdtZW50 KTtpZihzY3JpcHRzKQpqUXVlcnkuZWFjaChzY3JpcHRzLGV2YWxTY3JpcHQpO30K cmV0dXJuIHRoaXM7ZnVuY3Rpb24gcm9vdChlbGVtLGN1cil7cmV0dXJuIHRhYmxl JiZqUXVlcnkubm9kZU5hbWUoZWxlbSwidGFibGUiKSYmalF1ZXJ5Lm5vZGVOYW1l KGN1ciwidHIiKT8oZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVsw XXx8ZWxlbS5hcHBlbmRDaGlsZChlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxl bWVudCgidGJvZHkiKSkpOmVsZW07fX19O2pRdWVyeS5mbi5pbml0LnByb3RvdHlw ZT1qUXVlcnkuZm47ZnVuY3Rpb24gZXZhbFNjcmlwdChpLGVsZW0pe2lmKGVsZW0u c3JjKQpqUXVlcnkuYWpheCh7dXJsOmVsZW0uc3JjLGFzeW5jOmZhbHNlLGRhdGFU eXBlOiJzY3JpcHQifSk7ZWxzZQpqUXVlcnkuZ2xvYmFsRXZhbChlbGVtLnRleHR8 fGVsZW0udGV4dENvbnRlbnR8fGVsZW0uaW5uZXJIVE1MfHwiIik7aWYoZWxlbS5w YXJlbnROb2RlKQplbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbSk7fQpm dW5jdGlvbiBub3coKXtyZXR1cm4rbmV3IERhdGU7fQpqUXVlcnkuZXh0ZW5kPWpR dWVyeS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgdGFyZ2V0PWFyZ3VtZW50c1sw XXx8e30saT0xLGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGRlZXA9ZmFsc2Usb3B0 aW9ucztpZih0eXBlb2YgdGFyZ2V0PT09ImJvb2xlYW4iKXtkZWVwPXRhcmdldDt0 YXJnZXQ9YXJndW1lbnRzWzFdfHx7fTtpPTI7fQppZih0eXBlb2YgdGFyZ2V0IT09 Im9iamVjdCImJiFqUXVlcnkuaXNGdW5jdGlvbih0YXJnZXQpKQp0YXJnZXQ9e307 aWYobGVuZ3RoPT1pKXt0YXJnZXQ9dGhpczstLWk7fQpmb3IoO2k8bGVuZ3RoO2kr KykKaWYoKG9wdGlvbnM9YXJndW1lbnRzW2ldKSE9bnVsbCkKZm9yKHZhciBuYW1l IGluIG9wdGlvbnMpe3ZhciBzcmM9dGFyZ2V0W25hbWVdLGNvcHk9b3B0aW9uc1tu YW1lXTtpZih0YXJnZXQ9PT1jb3B5KQpjb250aW51ZTtpZihkZWVwJiZjb3B5JiZ0 eXBlb2YgY29weT09PSJvYmplY3QiJiYhY29weS5ub2RlVHlwZSkKdGFyZ2V0W25h bWVdPWpRdWVyeS5leHRlbmQoZGVlcCxzcmN8fChjb3B5Lmxlbmd0aCE9bnVsbD9b XTp7fSksY29weSk7ZWxzZSBpZihjb3B5IT09dW5kZWZpbmVkKQp0YXJnZXRbbmFt ZV09Y29weTt9CnJldHVybiB0YXJnZXQ7fTt2YXIgZXhjbHVkZT0vei0/aW5kZXh8 Zm9udC0/d2VpZ2h0fG9wYWNpdHl8em9vbXxsaW5lLT9oZWlnaHQvaSxkZWZhdWx0 Vmlldz1kb2N1bWVudC5kZWZhdWx0Vmlld3x8e30sdG9TdHJpbmc9T2JqZWN0LnBy b3RvdHlwZS50b1N0cmluZztqUXVlcnkuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0 aW9uKGRlZXApe3dpbmRvdy4kPV8kO2lmKGRlZXApCndpbmRvdy5qUXVlcnk9X2pR dWVyeTtyZXR1cm4galF1ZXJ5O30saXNGdW5jdGlvbjpmdW5jdGlvbihvYmope3Jl dHVybiB0b1N0cmluZy5jYWxsKG9iaik9PT0iW29iamVjdCBGdW5jdGlvbl0iO30s aXNBcnJheTpmdW5jdGlvbihvYmope3JldHVybiB0b1N0cmluZy5jYWxsKG9iaik9 PT0iW29iamVjdCBBcnJheV0iO30saXNYTUxEb2M6ZnVuY3Rpb24oZWxlbSl7cmV0 dXJuIGVsZW0ubm9kZVR5cGU9PT05JiZlbGVtLmRvY3VtZW50RWxlbWVudC5ub2Rl TmFtZSE9PSJIVE1MInx8ISFlbGVtLm93bmVyRG9jdW1lbnQmJmpRdWVyeS5pc1hN TERvYyhlbGVtLm93bmVyRG9jdW1lbnQpO30sZ2xvYmFsRXZhbDpmdW5jdGlvbihk YXRhKXtpZihkYXRhJiYvXFMvLnRlc3QoZGF0YSkpe3ZhciBoZWFkPWRvY3VtZW50 LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGRvY3VtZW50LmRvY3Vt ZW50RWxlbWVudCxzY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0 Iik7c2NyaXB0LnR5cGU9InRleHQvamF2YXNjcmlwdCI7aWYoalF1ZXJ5LnN1cHBv cnQuc2NyaXB0RXZhbCkKc2NyaXB0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0 ZVRleHROb2RlKGRhdGEpKTtlbHNlCnNjcmlwdC50ZXh0PWRhdGE7aGVhZC5pbnNl cnRCZWZvcmUoc2NyaXB0LGhlYWQuZmlyc3RDaGlsZCk7aGVhZC5yZW1vdmVDaGls ZChzY3JpcHQpO319LG5vZGVOYW1lOmZ1bmN0aW9uKGVsZW0sbmFtZSl7cmV0dXJu IGVsZW0ubm9kZU5hbWUmJmVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKT09bmFt ZS50b1VwcGVyQ2FzZSgpO30sZWFjaDpmdW5jdGlvbihvYmplY3QsY2FsbGJhY2ss YXJncyl7dmFyIG5hbWUsaT0wLGxlbmd0aD1vYmplY3QubGVuZ3RoO2lmKGFyZ3Mp e2lmKGxlbmd0aD09PXVuZGVmaW5lZCl7Zm9yKG5hbWUgaW4gb2JqZWN0KQppZihj YWxsYmFjay5hcHBseShvYmplY3RbbmFtZV0sYXJncyk9PT1mYWxzZSkKYnJlYWs7 fWVsc2UKZm9yKDtpPGxlbmd0aDspCmlmKGNhbGxiYWNrLmFwcGx5KG9iamVjdFtp KytdLGFyZ3MpPT09ZmFsc2UpCmJyZWFrO31lbHNle2lmKGxlbmd0aD09PXVuZGVm aW5lZCl7Zm9yKG5hbWUgaW4gb2JqZWN0KQppZihjYWxsYmFjay5jYWxsKG9iamVj dFtuYW1lXSxuYW1lLG9iamVjdFtuYW1lXSk9PT1mYWxzZSkKYnJlYWs7fWVsc2UK Zm9yKHZhciB2YWx1ZT1vYmplY3RbMF07aTxsZW5ndGgmJmNhbGxiYWNrLmNhbGwo dmFsdWUsaSx2YWx1ZSkhPT1mYWxzZTt2YWx1ZT1vYmplY3RbKytpXSl7fX0KcmV0 dXJuIG9iamVjdDt9LHByb3A6ZnVuY3Rpb24oZWxlbSx2YWx1ZSx0eXBlLGksbmFt ZSl7aWYoalF1ZXJ5LmlzRnVuY3Rpb24odmFsdWUpKQp2YWx1ZT12YWx1ZS5jYWxs KGVsZW0saSk7cmV0dXJuIHR5cGVvZiB2YWx1ZT09PSJudW1iZXIiJiZ0eXBlPT0i Y3VyQ1NTIiYmIWV4Y2x1ZGUudGVzdChuYW1lKT92YWx1ZSsicHgiOnZhbHVlO30s Y2xhc3NOYW1lOnthZGQ6ZnVuY3Rpb24oZWxlbSxjbGFzc05hbWVzKXtqUXVlcnku ZWFjaCgoY2xhc3NOYW1lc3x8IiIpLnNwbGl0KC9ccysvKSxmdW5jdGlvbihpLGNs YXNzTmFtZSl7aWYoZWxlbS5ub2RlVHlwZT09MSYmIWpRdWVyeS5jbGFzc05hbWUu aGFzKGVsZW0uY2xhc3NOYW1lLGNsYXNzTmFtZSkpCmVsZW0uY2xhc3NOYW1lKz0o ZWxlbS5jbGFzc05hbWU/IiAiOiIiKStjbGFzc05hbWU7fSk7fSxyZW1vdmU6ZnVu Y3Rpb24oZWxlbSxjbGFzc05hbWVzKXtpZihlbGVtLm5vZGVUeXBlPT0xKQplbGVt LmNsYXNzTmFtZT1jbGFzc05hbWVzIT09dW5kZWZpbmVkP2pRdWVyeS5ncmVwKGVs ZW0uY2xhc3NOYW1lLnNwbGl0KC9ccysvKSxmdW5jdGlvbihjbGFzc05hbWUpe3Jl dHVybiFqUXVlcnkuY2xhc3NOYW1lLmhhcyhjbGFzc05hbWVzLGNsYXNzTmFtZSk7 fSkuam9pbigiICIpOiIiO30saGFzOmZ1bmN0aW9uKGVsZW0sY2xhc3NOYW1lKXty ZXR1cm4gZWxlbSYmalF1ZXJ5LmluQXJyYXkoY2xhc3NOYW1lLChlbGVtLmNsYXNz TmFtZXx8ZWxlbSkudG9TdHJpbmcoKS5zcGxpdCgvXHMrLykpPi0xO319LHN3YXA6 ZnVuY3Rpb24oZWxlbSxvcHRpb25zLGNhbGxiYWNrKXt2YXIgb2xkPXt9O2Zvcih2 YXIgbmFtZSBpbiBvcHRpb25zKXtvbGRbbmFtZV09ZWxlbS5zdHlsZVtuYW1lXTtl bGVtLnN0eWxlW25hbWVdPW9wdGlvbnNbbmFtZV07fQpjYWxsYmFjay5jYWxsKGVs ZW0pO2Zvcih2YXIgbmFtZSBpbiBvcHRpb25zKQplbGVtLnN0eWxlW25hbWVdPW9s ZFtuYW1lXTt9LGNzczpmdW5jdGlvbihlbGVtLG5hbWUsZm9yY2UsZXh0cmEpe2lm KG5hbWU9PSJ3aWR0aCJ8fG5hbWU9PSJoZWlnaHQiKXt2YXIgdmFsLHByb3BzPXtw b3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToi YmxvY2sifSx3aGljaD1uYW1lPT0id2lkdGgiP1siTGVmdCIsIlJpZ2h0Il06WyJU b3AiLCJCb3R0b20iXTtmdW5jdGlvbiBnZXRXSCgpe3ZhbD1uYW1lPT0id2lkdGgi P2VsZW0ub2Zmc2V0V2lkdGg6ZWxlbS5vZmZzZXRIZWlnaHQ7aWYoZXh0cmE9PT0i Ym9yZGVyIikKcmV0dXJuO2pRdWVyeS5lYWNoKHdoaWNoLGZ1bmN0aW9uKCl7aWYo IWV4dHJhKQp2YWwtPXBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyhlbGVtLCJwYWRk aW5nIit0aGlzLHRydWUpKXx8MDtpZihleHRyYT09PSJtYXJnaW4iKQp2YWwrPXBh cnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyhlbGVtLCJtYXJnaW4iK3RoaXMsdHJ1ZSkp fHwwO2Vsc2UKdmFsLT1wYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoZWxlbSwiYm9y ZGVyIit0aGlzKyJXaWR0aCIsdHJ1ZSkpfHwwO30pO30KaWYoZWxlbS5vZmZzZXRX aWR0aCE9PTApCmdldFdIKCk7ZWxzZQpqUXVlcnkuc3dhcChlbGVtLHByb3BzLGdl dFdIKTtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLnJvdW5kKHZhbCkpO30KcmV0dXJu IGpRdWVyeS5jdXJDU1MoZWxlbSxuYW1lLGZvcmNlKTt9LGN1ckNTUzpmdW5jdGlv bihlbGVtLG5hbWUsZm9yY2Upe3ZhciByZXQsc3R5bGU9ZWxlbS5zdHlsZTtpZihu YW1lPT0ib3BhY2l0eSImJiFqUXVlcnkuc3VwcG9ydC5vcGFjaXR5KXtyZXQ9alF1 ZXJ5LmF0dHIoc3R5bGUsIm9wYWNpdHkiKTtyZXR1cm4gcmV0PT0iIj8iMSI6cmV0 O30KaWYobmFtZS5tYXRjaCgvZmxvYXQvaSkpCm5hbWU9c3R5bGVGbG9hdDtpZigh Zm9yY2UmJnN0eWxlJiZzdHlsZVtuYW1lXSkKcmV0PXN0eWxlW25hbWVdO2Vsc2Ug aWYoZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSl7aWYobmFtZS5tYXRjaCgv ZmxvYXQvaSkpCm5hbWU9ImZsb2F0IjtuYW1lPW5hbWUucmVwbGFjZSgvKFtBLVpd KS9nLCItJDEiKS50b0xvd2VyQ2FzZSgpO3ZhciBjb21wdXRlZFN0eWxlPWRlZmF1 bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSxudWxsKTtpZihjb21wdXRlZFN0 eWxlKQpyZXQ9Y29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO2lm KG5hbWU9PSJvcGFjaXR5IiYmcmV0PT0iIikKcmV0PSIxIjt9ZWxzZSBpZihlbGVt LmN1cnJlbnRTdHlsZSl7dmFyIGNhbWVsQ2FzZT1uYW1lLnJlcGxhY2UoL1wtKFx3 KS9nLGZ1bmN0aW9uKGFsbCxsZXR0ZXIpe3JldHVybiBsZXR0ZXIudG9VcHBlckNh c2UoKTt9KTtyZXQ9ZWxlbS5jdXJyZW50U3R5bGVbbmFtZV18fGVsZW0uY3VycmVu dFN0eWxlW2NhbWVsQ2FzZV07aWYoIS9eXGQrKHB4KT8kL2kudGVzdChyZXQpJiYv XlxkLy50ZXN0KHJldCkpe3ZhciBsZWZ0PXN0eWxlLmxlZnQscnNMZWZ0PWVsZW0u cnVudGltZVN0eWxlLmxlZnQ7ZWxlbS5ydW50aW1lU3R5bGUubGVmdD1lbGVtLmN1 cnJlbnRTdHlsZS5sZWZ0O3N0eWxlLmxlZnQ9cmV0fHwwO3JldD1zdHlsZS5waXhl bExlZnQrInB4IjtzdHlsZS5sZWZ0PWxlZnQ7ZWxlbS5ydW50aW1lU3R5bGUubGVm dD1yc0xlZnQ7fX0KcmV0dXJuIHJldDt9LGNsZWFuOmZ1bmN0aW9uKGVsZW1zLGNv bnRleHQsZnJhZ21lbnQpe2NvbnRleHQ9Y29udGV4dHx8ZG9jdW1lbnQ7aWYodHlw ZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudD09PSJ1bmRlZmluZWQiKQpjb250ZXh0 PWNvbnRleHQub3duZXJEb2N1bWVudHx8Y29udGV4dFswXSYmY29udGV4dFswXS5v d25lckRvY3VtZW50fHxkb2N1bWVudDtpZighZnJhZ21lbnQmJmVsZW1zLmxlbmd0 aD09PTEmJnR5cGVvZiBlbGVtc1swXT09PSJzdHJpbmciKXt2YXIgbWF0Y2g9L148 KFx3KylccypcLz8+JC8uZXhlYyhlbGVtc1swXSk7aWYobWF0Y2gpCnJldHVybltj b250ZXh0LmNyZWF0ZUVsZW1lbnQobWF0Y2hbMV0pXTt9CnZhciByZXQ9W10sc2Ny aXB0cz1bXSxkaXY9Y29udGV4dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtqUXVlcnku ZWFjaChlbGVtcyxmdW5jdGlvbihpLGVsZW0pe2lmKHR5cGVvZiBlbGVtPT09Im51 bWJlciIpCmVsZW0rPScnO2lmKCFlbGVtKQpyZXR1cm47aWYodHlwZW9mIGVsZW09 PT0ic3RyaW5nIil7ZWxlbT1lbGVtLnJlcGxhY2UoLyg8KFx3KylbXj5dKj8pXC8+ L2csZnVuY3Rpb24oYWxsLGZyb250LHRhZyl7cmV0dXJuIHRhZy5tYXRjaCgvXihh YmJyfGJyfGNvbHxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtfGhyfGFyZWF8ZW1i ZWQpJC9pKT9hbGw6ZnJvbnQrIj48LyIrdGFnKyI+Ijt9KTt2YXIgdGFncz1lbGVt LnJlcGxhY2UoL15ccysvLCIiKS5zdWJzdHJpbmcoMCwxMCkudG9Mb3dlckNhc2Uo KTt2YXIgd3JhcD0hdGFncy5pbmRleE9mKCI8b3B0IikmJlsxLCI8c2VsZWN0IG11 bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il18fCF0YWdzLmluZGV4T2Yo IjxsZWciKSYmWzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdfHx0YWdzLm1h dGNoKC9ePCh0aGVhZHx0Ym9keXx0Zm9vdHxjb2xnfGNhcCkvKSYmWzEsIjx0YWJs ZT4iLCI8L3RhYmxlPiJdfHwhdGFncy5pbmRleE9mKCI8dHIiKSYmWzIsIjx0YWJs ZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdfHwoIXRhZ3MuaW5kZXhPZigi PHRkIil8fCF0YWdzLmluZGV4T2YoIjx0aCIpKSYmWzMsIjx0YWJsZT48dGJvZHk+ PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdfHwhdGFncy5pbmRleE9mKCI8 Y29sIikmJlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwv Y29sZ3JvdXA+PC90YWJsZT4iXXx8IWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxp emUmJlsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdfHxbMCwiIiwiIl07ZGl2LmlubmVy SFRNTD13cmFwWzFdK2VsZW0rd3JhcFsyXTt3aGlsZSh3cmFwWzBdLS0pCmRpdj1k aXYubGFzdENoaWxkO2lmKCFqUXVlcnkuc3VwcG9ydC50Ym9keSl7dmFyIGhhc0Jv ZHk9Lzx0Ym9keS9pLnRlc3QoZWxlbSksdGJvZHk9IXRhZ3MuaW5kZXhPZigiPHRh YmxlIikmJiFoYXNCb2R5P2Rpdi5maXJzdENoaWxkJiZkaXYuZmlyc3RDaGlsZC5j aGlsZE5vZGVzOndyYXBbMV09PSI8dGFibGU+IiYmIWhhc0JvZHk/ZGl2LmNoaWxk Tm9kZXM6W107Zm9yKHZhciBqPXRib2R5Lmxlbmd0aC0xO2o+PTA7LS1qKQppZihq UXVlcnkubm9kZU5hbWUodGJvZHlbal0sInRib2R5IikmJiF0Ym9keVtqXS5jaGls ZE5vZGVzLmxlbmd0aCkKdGJvZHlbal0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0 Ym9keVtqXSk7fQppZighalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2Um Ji9eXHMvLnRlc3QoZWxlbSkpCmRpdi5pbnNlcnRCZWZvcmUoY29udGV4dC5jcmVh dGVUZXh0Tm9kZShlbGVtLm1hdGNoKC9eXHMqLylbMF0pLGRpdi5maXJzdENoaWxk KTtlbGVtPWpRdWVyeS5tYWtlQXJyYXkoZGl2LmNoaWxkTm9kZXMpO30KaWYoZWxl bS5ub2RlVHlwZSkKcmV0LnB1c2goZWxlbSk7ZWxzZQpyZXQ9alF1ZXJ5Lm1lcmdl KHJldCxlbGVtKTt9KTtpZihmcmFnbWVudCl7Zm9yKHZhciBpPTA7cmV0W2ldO2kr Kyl7aWYoalF1ZXJ5Lm5vZGVOYW1lKHJldFtpXSwic2NyaXB0IikmJighcmV0W2ld LnR5cGV8fHJldFtpXS50eXBlLnRvTG93ZXJDYXNlKCk9PT0idGV4dC9qYXZhc2Ny aXB0Iikpe3NjcmlwdHMucHVzaChyZXRbaV0ucGFyZW50Tm9kZT9yZXRbaV0ucGFy ZW50Tm9kZS5yZW1vdmVDaGlsZChyZXRbaV0pOnJldFtpXSk7fWVsc2V7aWYocmV0 W2ldLm5vZGVUeXBlPT09MSkKcmV0LnNwbGljZS5hcHBseShyZXQsW2krMSwwXS5j b25jYXQoalF1ZXJ5Lm1ha2VBcnJheShyZXRbaV0uZ2V0RWxlbWVudHNCeVRhZ05h bWUoInNjcmlwdCIpKSkpO2ZyYWdtZW50LmFwcGVuZENoaWxkKHJldFtpXSk7fX0K cmV0dXJuIHNjcmlwdHM7fQpyZXR1cm4gcmV0O30sYXR0cjpmdW5jdGlvbihlbGVt LG5hbWUsdmFsdWUpe2lmKCFlbGVtfHxlbGVtLm5vZGVUeXBlPT0zfHxlbGVtLm5v ZGVUeXBlPT04KQpyZXR1cm4gdW5kZWZpbmVkO3ZhciBub3R4bWw9IWpRdWVyeS5p c1hNTERvYyhlbGVtKSxzZXQ9dmFsdWUhPT11bmRlZmluZWQ7bmFtZT1ub3R4bWwm JmpRdWVyeS5wcm9wc1tuYW1lXXx8bmFtZTtpZihlbGVtLnRhZ05hbWUpe3ZhciBz cGVjaWFsPS9ocmVmfHNyY3xzdHlsZS8udGVzdChuYW1lKTtpZihuYW1lPT0ic2Vs ZWN0ZWQiJiZlbGVtLnBhcmVudE5vZGUpCmVsZW0ucGFyZW50Tm9kZS5zZWxlY3Rl ZEluZGV4O2lmKG5hbWUgaW4gZWxlbSYmbm90eG1sJiYhc3BlY2lhbCl7aWYoc2V0 KXtpZihuYW1lPT0idHlwZSImJmpRdWVyeS5ub2RlTmFtZShlbGVtLCJpbnB1dCIp JiZlbGVtLnBhcmVudE5vZGUpCnRocm93InR5cGUgcHJvcGVydHkgY2FuJ3QgYmUg Y2hhbmdlZCI7ZWxlbVtuYW1lXT12YWx1ZTt9CmlmKGpRdWVyeS5ub2RlTmFtZShl bGVtLCJmb3JtIikmJmVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkKcmV0dXJu IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKS5ub2RlVmFsdWU7aWYobmFtZT09 InRhYkluZGV4Iil7dmFyIGF0dHJpYnV0ZU5vZGU9ZWxlbS5nZXRBdHRyaWJ1dGVO b2RlKCJ0YWJJbmRleCIpO3JldHVybiBhdHRyaWJ1dGVOb2RlJiZhdHRyaWJ1dGVO b2RlLnNwZWNpZmllZD9hdHRyaWJ1dGVOb2RlLnZhbHVlOmVsZW0ubm9kZU5hbWUu bWF0Y2goLyhidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkvaSk/ MDplbGVtLm5vZGVOYW1lLm1hdGNoKC9eKGF8YXJlYSkkL2kpJiZlbGVtLmhyZWY/ MDp1bmRlZmluZWQ7fQpyZXR1cm4gZWxlbVtuYW1lXTt9CmlmKCFqUXVlcnkuc3Vw cG9ydC5zdHlsZSYmbm90eG1sJiZuYW1lPT0ic3R5bGUiKQpyZXR1cm4galF1ZXJ5 LmF0dHIoZWxlbS5zdHlsZSwiY3NzVGV4dCIsdmFsdWUpO2lmKHNldCkKZWxlbS5z ZXRBdHRyaWJ1dGUobmFtZSwiIit2YWx1ZSk7dmFyIGF0dHI9IWpRdWVyeS5zdXBw b3J0LmhyZWZOb3JtYWxpemVkJiZub3R4bWwmJnNwZWNpYWw/ZWxlbS5nZXRBdHRy aWJ1dGUobmFtZSwyKTplbGVtLmdldEF0dHJpYnV0ZShuYW1lKTtyZXR1cm4gYXR0 cj09PW51bGw/dW5kZWZpbmVkOmF0dHI7fQppZighalF1ZXJ5LnN1cHBvcnQub3Bh Y2l0eSYmbmFtZT09Im9wYWNpdHkiKXtpZihzZXQpe2VsZW0uem9vbT0xO2VsZW0u ZmlsdGVyPShlbGVtLmZpbHRlcnx8IiIpLnJlcGxhY2UoL2FscGhhXChbXildKlwp LywiIikrCihwYXJzZUludCh2YWx1ZSkrJyc9PSJOYU4iPyIiOiJhbHBoYShvcGFj aXR5PSIrdmFsdWUqMTAwKyIpIik7fQpyZXR1cm4gZWxlbS5maWx0ZXImJmVsZW0u ZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9Iik+PTA/KHBhcnNlRmxvYXQoZWxlbS5m aWx0ZXIubWF0Y2goL29wYWNpdHk9KFteKV0qKS8pWzFdKS8xMDApKycnOiIiO30K bmFtZT1uYW1lLnJlcGxhY2UoLy0oW2Etel0pL2lnLGZ1bmN0aW9uKGFsbCxsZXR0 ZXIpe3JldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTt9KTtpZihzZXQpCmVsZW1b bmFtZV09dmFsdWU7cmV0dXJuIGVsZW1bbmFtZV07fSx0cmltOmZ1bmN0aW9uKHRl eHQpe3JldHVybih0ZXh0fHwiIikucmVwbGFjZSgvXlxzK3xccyskL2csIiIpO30s bWFrZUFycmF5OmZ1bmN0aW9uKGFycmF5KXt2YXIgcmV0PVtdO2lmKGFycmF5IT1u dWxsKXt2YXIgaT1hcnJheS5sZW5ndGg7aWYoaT09bnVsbHx8dHlwZW9mIGFycmF5 PT09InN0cmluZyJ8fGpRdWVyeS5pc0Z1bmN0aW9uKGFycmF5KXx8YXJyYXkuc2V0 SW50ZXJ2YWwpCnJldFswXT1hcnJheTtlbHNlCndoaWxlKGkpCnJldFstLWldPWFy cmF5W2ldO30KcmV0dXJuIHJldDt9LGluQXJyYXk6ZnVuY3Rpb24oZWxlbSxhcnJh eSl7Zm9yKHZhciBpPTAsbGVuZ3RoPWFycmF5Lmxlbmd0aDtpPGxlbmd0aDtpKysp CmlmKGFycmF5W2ldPT09ZWxlbSkKcmV0dXJuIGk7cmV0dXJuLTE7fSxtZXJnZTpm dW5jdGlvbihmaXJzdCxzZWNvbmQpe3ZhciBpPTAsZWxlbSxwb3M9Zmlyc3QubGVu Z3RoO2lmKCFqUXVlcnkuc3VwcG9ydC5nZXRBbGwpe3doaWxlKChlbGVtPXNlY29u ZFtpKytdKSE9bnVsbCkKaWYoZWxlbS5ub2RlVHlwZSE9OCkKZmlyc3RbcG9zKytd PWVsZW07fWVsc2UKd2hpbGUoKGVsZW09c2Vjb25kW2krK10pIT1udWxsKQpmaXJz dFtwb3MrK109ZWxlbTtyZXR1cm4gZmlyc3Q7fSx1bmlxdWU6ZnVuY3Rpb24oYXJy YXkpe3ZhciByZXQ9W10sZG9uZT17fTt0cnl7Zm9yKHZhciBpPTAsbGVuZ3RoPWFy cmF5Lmxlbmd0aDtpPGxlbmd0aDtpKyspe3ZhciBpZD1qUXVlcnkuZGF0YShhcnJh eVtpXSk7aWYoIWRvbmVbaWRdKXtkb25lW2lkXT10cnVlO3JldC5wdXNoKGFycmF5 W2ldKTt9fX1jYXRjaChlKXtyZXQ9YXJyYXk7fQpyZXR1cm4gcmV0O30sZ3JlcDpm dW5jdGlvbihlbGVtcyxjYWxsYmFjayxpbnYpe3ZhciByZXQ9W107Zm9yKHZhciBp PTAsbGVuZ3RoPWVsZW1zLmxlbmd0aDtpPGxlbmd0aDtpKyspCmlmKCFpbnYhPSFj YWxsYmFjayhlbGVtc1tpXSxpKSkKcmV0LnB1c2goZWxlbXNbaV0pO3JldHVybiBy ZXQ7fSxtYXA6ZnVuY3Rpb24oZWxlbXMsY2FsbGJhY2spe3ZhciByZXQ9W107Zm9y KHZhciBpPTAsbGVuZ3RoPWVsZW1zLmxlbmd0aDtpPGxlbmd0aDtpKyspe3ZhciB2 YWx1ZT1jYWxsYmFjayhlbGVtc1tpXSxpKTtpZih2YWx1ZSE9bnVsbCkKcmV0W3Jl dC5sZW5ndGhdPXZhbHVlO30KcmV0dXJuIHJldC5jb25jYXQuYXBwbHkoW10scmV0 KTt9fSk7dmFyIHVzZXJBZ2VudD1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJD YXNlKCk7alF1ZXJ5LmJyb3dzZXI9e3ZlcnNpb246KHVzZXJBZ2VudC5tYXRjaCgv LisoPzpydnxpdHxyYXxpZSlbXC86IF0oW1xkLl0rKS8pfHxbMCwnMCddKVsxXSxz YWZhcmk6L3dlYmtpdC8udGVzdCh1c2VyQWdlbnQpLG9wZXJhOi9vcGVyYS8udGVz dCh1c2VyQWdlbnQpLG1zaWU6L21zaWUvLnRlc3QodXNlckFnZW50KSYmIS9vcGVy YS8udGVzdCh1c2VyQWdlbnQpLG1vemlsbGE6L21vemlsbGEvLnRlc3QodXNlckFn ZW50KSYmIS8oY29tcGF0aWJsZXx3ZWJraXQpLy50ZXN0KHVzZXJBZ2VudCl9O2pR dWVyeS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0ucGFy ZW50Tm9kZTt9LHBhcmVudHM6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5k aXIoZWxlbSwicGFyZW50Tm9kZSIpO30sbmV4dDpmdW5jdGlvbihlbGVtKXtyZXR1 cm4galF1ZXJ5Lm50aChlbGVtLDIsIm5leHRTaWJsaW5nIik7fSxwcmV2OmZ1bmN0 aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwicHJldmlvdXNTaWJs aW5nIik7fSxuZXh0QWxsOmZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZGly KGVsZW0sIm5leHRTaWJsaW5nIik7fSxwcmV2QWxsOmZ1bmN0aW9uKGVsZW0pe3Jl dHVybiBqUXVlcnkuZGlyKGVsZW0sInByZXZpb3VzU2libGluZyIpO30sc2libGlu Z3M6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5zaWJsaW5nKGVsZW0ucGFy ZW50Tm9kZS5maXJzdENoaWxkLGVsZW0pO30sY2hpbGRyZW46ZnVuY3Rpb24oZWxl bSl7cmV0dXJuIGpRdWVyeS5zaWJsaW5nKGVsZW0uZmlyc3RDaGlsZCk7fSxjb250 ZW50czpmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKGVsZW0s ImlmcmFtZSIpP2VsZW0uY29udGVudERvY3VtZW50fHxlbGVtLmNvbnRlbnRXaW5k b3cuZG9jdW1lbnQ6alF1ZXJ5Lm1ha2VBcnJheShlbGVtLmNoaWxkTm9kZXMpO319 LGZ1bmN0aW9uKG5hbWUsZm4pe2pRdWVyeS5mbltuYW1lXT1mdW5jdGlvbihzZWxl Y3Rvcil7dmFyIHJldD1qUXVlcnkubWFwKHRoaXMsZm4pO2lmKHNlbGVjdG9yJiZ0 eXBlb2Ygc2VsZWN0b3I9PSJzdHJpbmciKQpyZXQ9alF1ZXJ5Lm11bHRpRmlsdGVy KHNlbGVjdG9yLHJldCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGpRdWVyeS51bmlx dWUocmV0KSxuYW1lLHNlbGVjdG9yKTt9O30pO2pRdWVyeS5lYWNoKHthcHBlbmRU bzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVm b3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRo In0sZnVuY3Rpb24obmFtZSxvcmlnaW5hbCl7alF1ZXJ5LmZuW25hbWVdPWZ1bmN0 aW9uKHNlbGVjdG9yKXt2YXIgcmV0PVtdLGluc2VydD1qUXVlcnkoc2VsZWN0b3Ip O2Zvcih2YXIgaT0wLGw9aW5zZXJ0Lmxlbmd0aDtpPGw7aSsrKXt2YXIgZWxlbXM9 KGk+MD90aGlzLmNsb25lKHRydWUpOnRoaXMpLmdldCgpO2pRdWVyeS5mbltvcmln aW5hbF0uYXBwbHkoalF1ZXJ5KGluc2VydFtpXSksZWxlbXMpO3JldD1yZXQuY29u Y2F0KGVsZW1zKTt9CnJldHVybiB0aGlzLnB1c2hTdGFjayhyZXQsbmFtZSxzZWxl Y3Rvcik7fTt9KTtqUXVlcnkuZWFjaCh7cmVtb3ZlQXR0cjpmdW5jdGlvbihuYW1l KXtqUXVlcnkuYXR0cih0aGlzLG5hbWUsIiIpO2lmKHRoaXMubm9kZVR5cGU9PTEp CnRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO30sYWRkQ2xhc3M6ZnVuY3Rpb24o Y2xhc3NOYW1lcyl7alF1ZXJ5LmNsYXNzTmFtZS5hZGQodGhpcyxjbGFzc05hbWVz KTt9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGNsYXNzTmFtZXMpe2pRdWVyeS5jbGFz c05hbWUucmVtb3ZlKHRoaXMsY2xhc3NOYW1lcyk7fSx0b2dnbGVDbGFzczpmdW5j dGlvbihjbGFzc05hbWVzLHN0YXRlKXtpZih0eXBlb2Ygc3RhdGUhPT0iYm9vbGVh biIpCnN0YXRlPSFqUXVlcnkuY2xhc3NOYW1lLmhhcyh0aGlzLGNsYXNzTmFtZXMp O2pRdWVyeS5jbGFzc05hbWVbc3RhdGU/ImFkZCI6InJlbW92ZSJdKHRoaXMsY2xh c3NOYW1lcyk7fSxyZW1vdmU6ZnVuY3Rpb24oc2VsZWN0b3Ipe2lmKCFzZWxlY3Rv cnx8alF1ZXJ5LmZpbHRlcihzZWxlY3RvcixbdGhpc10pLmxlbmd0aCl7alF1ZXJ5 KCIqIix0aGlzKS5hZGQoW3RoaXNdKS5lYWNoKGZ1bmN0aW9uKCl7alF1ZXJ5LmV2 ZW50LnJlbW92ZSh0aGlzKTtqUXVlcnkucmVtb3ZlRGF0YSh0aGlzKTt9KTtpZih0 aGlzLnBhcmVudE5vZGUpCnRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlz KTt9fSxlbXB0eTpmdW5jdGlvbigpe2pRdWVyeSh0aGlzKS5jaGlsZHJlbigpLnJl bW92ZSgpO3doaWxlKHRoaXMuZmlyc3RDaGlsZCkKdGhpcy5yZW1vdmVDaGlsZCh0 aGlzLmZpcnN0Q2hpbGQpO319LGZ1bmN0aW9uKG5hbWUsZm4pe2pRdWVyeS5mbltu YW1lXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZm4sYXJndW1lbnRzKTt9 O30pO2Z1bmN0aW9uIG51bShlbGVtLHByb3Ape3JldHVybiBlbGVtWzBdJiZwYXJz ZUludChqUXVlcnkuY3VyQ1NTKGVsZW1bMF0scHJvcCx0cnVlKSwxMCl8fDA7fQp2 YXIgZXhwYW5kbz0ialF1ZXJ5Iitub3coKSx1dWlkPTAsd2luZG93RGF0YT17fTtq UXVlcnkuZXh0ZW5kKHtjYWNoZTp7fSxkYXRhOmZ1bmN0aW9uKGVsZW0sbmFtZSxk YXRhKXtlbGVtPWVsZW09PXdpbmRvdz93aW5kb3dEYXRhOmVsZW07dmFyIGlkPWVs ZW1bZXhwYW5kb107aWYoIWlkKQppZD1lbGVtW2V4cGFuZG9dPSsrdXVpZDtpZihu YW1lJiYhalF1ZXJ5LmNhY2hlW2lkXSkKalF1ZXJ5LmNhY2hlW2lkXT17fTtpZihk YXRhIT09dW5kZWZpbmVkKQpqUXVlcnkuY2FjaGVbaWRdW25hbWVdPWRhdGE7cmV0 dXJuIG5hbWU/alF1ZXJ5LmNhY2hlW2lkXVtuYW1lXTppZDt9LHJlbW92ZURhdGE6 ZnVuY3Rpb24oZWxlbSxuYW1lKXtlbGVtPWVsZW09PXdpbmRvdz93aW5kb3dEYXRh OmVsZW07dmFyIGlkPWVsZW1bZXhwYW5kb107aWYobmFtZSl7aWYoalF1ZXJ5LmNh Y2hlW2lkXSl7ZGVsZXRlIGpRdWVyeS5jYWNoZVtpZF1bbmFtZV07bmFtZT0iIjtm b3IobmFtZSBpbiBqUXVlcnkuY2FjaGVbaWRdKQpicmVhaztpZighbmFtZSkKalF1 ZXJ5LnJlbW92ZURhdGEoZWxlbSk7fX1lbHNle3RyeXtkZWxldGUgZWxlbVtleHBh bmRvXTt9Y2F0Y2goZSl7aWYoZWxlbS5yZW1vdmVBdHRyaWJ1dGUpCmVsZW0ucmVt b3ZlQXR0cmlidXRlKGV4cGFuZG8pO30KZGVsZXRlIGpRdWVyeS5jYWNoZVtpZF07 fX0scXVldWU6ZnVuY3Rpb24oZWxlbSx0eXBlLGRhdGEpe2lmKGVsZW0pe3R5cGU9 KHR5cGV8fCJmeCIpKyJxdWV1ZSI7dmFyIHE9alF1ZXJ5LmRhdGEoZWxlbSx0eXBl KTtpZighcXx8alF1ZXJ5LmlzQXJyYXkoZGF0YSkpCnE9alF1ZXJ5LmRhdGEoZWxl bSx0eXBlLGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkpO2Vsc2UgaWYoZGF0YSkKcS5w dXNoKGRhdGEpO30KcmV0dXJuIHE7fSxkZXF1ZXVlOmZ1bmN0aW9uKGVsZW0sdHlw ZSl7dmFyIHF1ZXVlPWpRdWVyeS5xdWV1ZShlbGVtLHR5cGUpLGZuPXF1ZXVlLnNo aWZ0KCk7aWYoIXR5cGV8fHR5cGU9PT0iZngiKQpmbj1xdWV1ZVswXTtpZihmbiE9 PXVuZGVmaW5lZCkKZm4uY2FsbChlbGVtKTt9fSk7alF1ZXJ5LmZuLmV4dGVuZCh7 ZGF0YTpmdW5jdGlvbihrZXksdmFsdWUpe3ZhciBwYXJ0cz1rZXkuc3BsaXQoIi4i KTtwYXJ0c1sxXT1wYXJ0c1sxXT8iLiIrcGFydHNbMV06IiI7aWYodmFsdWU9PT11 bmRlZmluZWQpe3ZhciBkYXRhPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEi K3BhcnRzWzFdKyIhIixbcGFydHNbMF1dKTtpZihkYXRhPT09dW5kZWZpbmVkJiZ0 aGlzLmxlbmd0aCkKZGF0YT1qUXVlcnkuZGF0YSh0aGlzWzBdLGtleSk7cmV0dXJu IGRhdGE9PT11bmRlZmluZWQmJnBhcnRzWzFdP3RoaXMuZGF0YShwYXJ0c1swXSk6 ZGF0YTt9ZWxzZQpyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIitwYXJ0c1sx XSsiISIsW3BhcnRzWzBdLHZhbHVlXSkuZWFjaChmdW5jdGlvbigpe2pRdWVyeS5k YXRhKHRoaXMsa2V5LHZhbHVlKTt9KTt9LHJlbW92ZURhdGE6ZnVuY3Rpb24oa2V5 KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7alF1ZXJ5LnJlbW92ZURhdGEo dGhpcyxrZXkpO30pO30scXVldWU6ZnVuY3Rpb24odHlwZSxkYXRhKXtpZih0eXBl b2YgdHlwZSE9PSJzdHJpbmciKXtkYXRhPXR5cGU7dHlwZT0iZngiO30KaWYoZGF0 YT09PXVuZGVmaW5lZCkKcmV0dXJuIGpRdWVyeS5xdWV1ZSh0aGlzWzBdLHR5cGUp O3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcXVldWU9alF1ZXJ5LnF1 ZXVlKHRoaXMsdHlwZSxkYXRhKTtpZih0eXBlPT0iZngiJiZxdWV1ZS5sZW5ndGg9 PTEpCnF1ZXVlWzBdLmNhbGwodGhpcyk7fSk7fSxkZXF1ZXVlOmZ1bmN0aW9uKHR5 cGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtqUXVlcnkuZGVxdWV1ZSh0 aGlzLHR5cGUpO30pO319KTsoZnVuY3Rpb24oKXt2YXIgY2h1bmtlcj0vKCg/Olwo KD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtbXltcXV0qXF18WyciXVte JyJdKlsnIl18W15bXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+ XSkoXHMqLFxzKik/L2csZG9uZT0wLHRvU3RyaW5nPU9iamVjdC5wcm90b3R5cGUu dG9TdHJpbmc7dmFyIFNpenpsZT1mdW5jdGlvbihzZWxlY3Rvcixjb250ZXh0LHJl c3VsdHMsc2VlZCl7cmVzdWx0cz1yZXN1bHRzfHxbXTtjb250ZXh0PWNvbnRleHR8 fGRvY3VtZW50O2lmKGNvbnRleHQubm9kZVR5cGUhPT0xJiZjb250ZXh0Lm5vZGVU eXBlIT09OSkKcmV0dXJuW107aWYoIXNlbGVjdG9yfHx0eXBlb2Ygc2VsZWN0b3Ih PT0ic3RyaW5nIil7cmV0dXJuIHJlc3VsdHM7fQp2YXIgcGFydHM9W10sbSxzZXQs Y2hlY2tTZXQsY2hlY2ssbW9kZSxleHRyYSxwcnVuZT10cnVlO2NodW5rZXIubGFz dEluZGV4PTA7d2hpbGUoKG09Y2h1bmtlci5leGVjKHNlbGVjdG9yKSkhPT1udWxs KXtwYXJ0cy5wdXNoKG1bMV0pO2lmKG1bMl0pe2V4dHJhPVJlZ0V4cC5yaWdodENv bnRleHQ7YnJlYWs7fX0KaWYocGFydHMubGVuZ3RoPjEmJm9yaWdQT1MuZXhlYyhz ZWxlY3Rvcikpe2lmKHBhcnRzLmxlbmd0aD09PTImJkV4cHIucmVsYXRpdmVbcGFy dHNbMF1dKXtzZXQ9cG9zUHJvY2VzcyhwYXJ0c1swXStwYXJ0c1sxXSxjb250ZXh0 KTt9ZWxzZXtzZXQ9RXhwci5yZWxhdGl2ZVtwYXJ0c1swXV0/W2NvbnRleHRdOlNp enpsZShwYXJ0cy5zaGlmdCgpLGNvbnRleHQpO3doaWxlKHBhcnRzLmxlbmd0aCl7 c2VsZWN0b3I9cGFydHMuc2hpZnQoKTtpZihFeHByLnJlbGF0aXZlW3NlbGVjdG9y XSkKc2VsZWN0b3IrPXBhcnRzLnNoaWZ0KCk7c2V0PXBvc1Byb2Nlc3Moc2VsZWN0 b3Isc2V0KTt9fX1lbHNle3ZhciByZXQ9c2VlZD97ZXhwcjpwYXJ0cy5wb3AoKSxz ZXQ6bWFrZUFycmF5KHNlZWQpfTpTaXp6bGUuZmluZChwYXJ0cy5wb3AoKSxwYXJ0 cy5sZW5ndGg9PT0xJiZjb250ZXh0LnBhcmVudE5vZGU/Y29udGV4dC5wYXJlbnRO b2RlOmNvbnRleHQsaXNYTUwoY29udGV4dCkpO3NldD1TaXp6bGUuZmlsdGVyKHJl dC5leHByLHJldC5zZXQpO2lmKHBhcnRzLmxlbmd0aD4wKXtjaGVja1NldD1tYWtl QXJyYXkoc2V0KTt9ZWxzZXtwcnVuZT1mYWxzZTt9CndoaWxlKHBhcnRzLmxlbmd0 aCl7dmFyIGN1cj1wYXJ0cy5wb3AoKSxwb3A9Y3VyO2lmKCFFeHByLnJlbGF0aXZl W2N1cl0pe2N1cj0iIjt9ZWxzZXtwb3A9cGFydHMucG9wKCk7fQppZihwb3A9PW51 bGwpe3BvcD1jb250ZXh0O30KRXhwci5yZWxhdGl2ZVtjdXJdKGNoZWNrU2V0LHBv cCxpc1hNTChjb250ZXh0KSk7fX0KaWYoIWNoZWNrU2V0KXtjaGVja1NldD1zZXQ7 fQppZighY2hlY2tTZXQpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVk IGV4cHJlc3Npb246ICIrKGN1cnx8c2VsZWN0b3IpO30KaWYodG9TdHJpbmcuY2Fs bChjaGVja1NldCk9PT0iW29iamVjdCBBcnJheV0iKXtpZighcHJ1bmUpe3Jlc3Vs dHMucHVzaC5hcHBseShyZXN1bHRzLGNoZWNrU2V0KTt9ZWxzZSBpZihjb250ZXh0 Lm5vZGVUeXBlPT09MSl7Zm9yKHZhciBpPTA7Y2hlY2tTZXRbaV0hPW51bGw7aSsr KXtpZihjaGVja1NldFtpXSYmKGNoZWNrU2V0W2ldPT09dHJ1ZXx8Y2hlY2tTZXRb aV0ubm9kZVR5cGU9PT0xJiZjb250YWlucyhjb250ZXh0LGNoZWNrU2V0W2ldKSkp e3Jlc3VsdHMucHVzaChzZXRbaV0pO319fWVsc2V7Zm9yKHZhciBpPTA7Y2hlY2tT ZXRbaV0hPW51bGw7aSsrKXtpZihjaGVja1NldFtpXSYmY2hlY2tTZXRbaV0ubm9k ZVR5cGU9PT0xKXtyZXN1bHRzLnB1c2goc2V0W2ldKTt9fX19ZWxzZXttYWtlQXJy YXkoY2hlY2tTZXQscmVzdWx0cyk7fQppZihleHRyYSl7U2l6emxlKGV4dHJhLGNv bnRleHQscmVzdWx0cyxzZWVkKTtpZihzb3J0T3JkZXIpe2hhc0R1cGxpY2F0ZT1m YWxzZTtyZXN1bHRzLnNvcnQoc29ydE9yZGVyKTtpZihoYXNEdXBsaWNhdGUpe2Zv cih2YXIgaT0xO2k8cmVzdWx0cy5sZW5ndGg7aSsrKXtpZihyZXN1bHRzW2ldPT09 cmVzdWx0c1tpLTFdKXtyZXN1bHRzLnNwbGljZShpLS0sMSk7fX19fX0KcmV0dXJu IHJlc3VsdHM7fTtTaXp6bGUubWF0Y2hlcz1mdW5jdGlvbihleHByLHNldCl7cmV0 dXJuIFNpenpsZShleHByLG51bGwsbnVsbCxzZXQpO307U2l6emxlLmZpbmQ9ZnVu Y3Rpb24oZXhwcixjb250ZXh0LGlzWE1MKXt2YXIgc2V0LG1hdGNoO2lmKCFleHBy KXtyZXR1cm5bXTt9CmZvcih2YXIgaT0wLGw9RXhwci5vcmRlci5sZW5ndGg7aTxs O2krKyl7dmFyIHR5cGU9RXhwci5vcmRlcltpXSxtYXRjaDtpZigobWF0Y2g9RXhw ci5tYXRjaFt0eXBlXS5leGVjKGV4cHIpKSl7dmFyIGxlZnQ9UmVnRXhwLmxlZnRD b250ZXh0O2lmKGxlZnQuc3Vic3RyKGxlZnQubGVuZ3RoLTEpIT09IlxcIil7bWF0 Y2hbMV09KG1hdGNoWzFdfHwiIikucmVwbGFjZSgvXFwvZywiIik7c2V0PUV4cHIu ZmluZFt0eXBlXShtYXRjaCxjb250ZXh0LGlzWE1MKTtpZihzZXQhPW51bGwpe2V4 cHI9ZXhwci5yZXBsYWNlKEV4cHIubWF0Y2hbdHlwZV0sIiIpO2JyZWFrO319fX0K aWYoIXNldCl7c2V0PWNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTt9 CnJldHVybntzZXQ6c2V0LGV4cHI6ZXhwcn07fTtTaXp6bGUuZmlsdGVyPWZ1bmN0 aW9uKGV4cHIsc2V0LGlucGxhY2Usbm90KXt2YXIgb2xkPWV4cHIscmVzdWx0PVtd LGN1ckxvb3A9c2V0LG1hdGNoLGFueUZvdW5kLGlzWE1MRmlsdGVyPXNldCYmc2V0 WzBdJiZpc1hNTChzZXRbMF0pO3doaWxlKGV4cHImJnNldC5sZW5ndGgpe2Zvcih2 YXIgdHlwZSBpbiBFeHByLmZpbHRlcil7aWYoKG1hdGNoPUV4cHIubWF0Y2hbdHlw ZV0uZXhlYyhleHByKSkhPW51bGwpe3ZhciBmaWx0ZXI9RXhwci5maWx0ZXJbdHlw ZV0sZm91bmQsaXRlbTthbnlGb3VuZD1mYWxzZTtpZihjdXJMb29wPT1yZXN1bHQp e3Jlc3VsdD1bXTt9CmlmKEV4cHIucHJlRmlsdGVyW3R5cGVdKXttYXRjaD1FeHBy LnByZUZpbHRlclt0eXBlXShtYXRjaCxjdXJMb29wLGlucGxhY2UscmVzdWx0LG5v dCxpc1hNTEZpbHRlcik7aWYoIW1hdGNoKXthbnlGb3VuZD1mb3VuZD10cnVlO31l bHNlIGlmKG1hdGNoPT09dHJ1ZSl7Y29udGludWU7fX0KaWYobWF0Y2gpe2Zvcih2 YXIgaT0wOyhpdGVtPWN1ckxvb3BbaV0pIT1udWxsO2krKyl7aWYoaXRlbSl7Zm91 bmQ9ZmlsdGVyKGl0ZW0sbWF0Y2gsaSxjdXJMb29wKTt2YXIgcGFzcz1ub3ReISFm b3VuZDtpZihpbnBsYWNlJiZmb3VuZCE9bnVsbCl7aWYocGFzcyl7YW55Rm91bmQ9 dHJ1ZTt9ZWxzZXtjdXJMb29wW2ldPWZhbHNlO319ZWxzZSBpZihwYXNzKXtyZXN1 bHQucHVzaChpdGVtKTthbnlGb3VuZD10cnVlO319fX0KaWYoZm91bmQhPT11bmRl ZmluZWQpe2lmKCFpbnBsYWNlKXtjdXJMb29wPXJlc3VsdDt9CmV4cHI9ZXhwci5y ZXBsYWNlKEV4cHIubWF0Y2hbdHlwZV0sIiIpO2lmKCFhbnlGb3VuZCl7cmV0dXJu W107fQpicmVhazt9fX0KaWYoZXhwcj09b2xkKXtpZihhbnlGb3VuZD09bnVsbCl7 dGhyb3ciU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitl eHByO31lbHNle2JyZWFrO319Cm9sZD1leHByO30KcmV0dXJuIGN1ckxvb3A7fTt2 YXIgRXhwcj1TaXp6bGUuc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRB RyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKS8s Q0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLyxOQU1FOi9c W25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRl8tXXxcXC4pKylbJyJdKlxd LyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKVxzKig/ OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sVEFHOi9eKCg/Oltcd1x1 MDBjMC1cdUZGRkZcKl8tXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8 Zmlyc3QpLWNoaWxkKD86XCgoZXZlbnxvZGR8W1xkbistXSopXCkpPy8sUE9TOi86 KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/ KD89W14tXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwu KSspKD86XCgoWyciXSopKCg/OlwoW15cKV0rXCl8W15cMlwoXCldKikrKVwyXCkp Py99LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3Ii fSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGVsZW0pe3JldHVybiBlbGVtLmdl dEF0dHJpYnV0ZSgiaHJlZiIpO319LHJlbGF0aXZlOnsiKyI6ZnVuY3Rpb24oY2hl Y2tTZXQscGFydCxpc1hNTCl7dmFyIGlzUGFydFN0cj10eXBlb2YgcGFydD09PSJz dHJpbmciLGlzVGFnPWlzUGFydFN0ciYmIS9cVy8udGVzdChwYXJ0KSxpc1BhcnRT dHJOb3RUYWc9aXNQYXJ0U3RyJiYhaXNUYWc7aWYoaXNUYWcmJiFpc1hNTCl7cGFy dD1wYXJ0LnRvVXBwZXJDYXNlKCk7fQpmb3IodmFyIGk9MCxsPWNoZWNrU2V0Lmxl bmd0aCxlbGVtO2k8bDtpKyspe2lmKChlbGVtPWNoZWNrU2V0W2ldKSl7d2hpbGUo KGVsZW09ZWxlbS5wcmV2aW91c1NpYmxpbmcpJiZlbGVtLm5vZGVUeXBlIT09MSl7 fQpjaGVja1NldFtpXT1pc1BhcnRTdHJOb3RUYWd8fGVsZW0mJmVsZW0ubm9kZU5h bWU9PT1wYXJ0P2VsZW18fGZhbHNlOmVsZW09PT1wYXJ0O319CmlmKGlzUGFydFN0 ck5vdFRhZyl7U2l6emxlLmZpbHRlcihwYXJ0LGNoZWNrU2V0LHRydWUpO319LCI+ IjpmdW5jdGlvbihjaGVja1NldCxwYXJ0LGlzWE1MKXt2YXIgaXNQYXJ0U3RyPXR5 cGVvZiBwYXJ0PT09InN0cmluZyI7aWYoaXNQYXJ0U3RyJiYhL1xXLy50ZXN0KHBh cnQpKXtwYXJ0PWlzWE1MP3BhcnQ6cGFydC50b1VwcGVyQ2FzZSgpO2Zvcih2YXIg aT0wLGw9Y2hlY2tTZXQubGVuZ3RoO2k8bDtpKyspe3ZhciBlbGVtPWNoZWNrU2V0 W2ldO2lmKGVsZW0pe3ZhciBwYXJlbnQ9ZWxlbS5wYXJlbnROb2RlO2NoZWNrU2V0 W2ldPXBhcmVudC5ub2RlTmFtZT09PXBhcnQ/cGFyZW50OmZhbHNlO319fWVsc2V7 Zm9yKHZhciBpPTAsbD1jaGVja1NldC5sZW5ndGg7aTxsO2krKyl7dmFyIGVsZW09 Y2hlY2tTZXRbaV07aWYoZWxlbSl7Y2hlY2tTZXRbaV09aXNQYXJ0U3RyP2VsZW0u cGFyZW50Tm9kZTplbGVtLnBhcmVudE5vZGU9PT1wYXJ0O319CmlmKGlzUGFydFN0 cil7U2l6emxlLmZpbHRlcihwYXJ0LGNoZWNrU2V0LHRydWUpO319fSwiIjpmdW5j dGlvbihjaGVja1NldCxwYXJ0LGlzWE1MKXt2YXIgZG9uZU5hbWU9ZG9uZSsrLGNo ZWNrRm49ZGlyQ2hlY2s7aWYoIXBhcnQubWF0Y2goL1xXLykpe3ZhciBub2RlQ2hl Y2s9cGFydD1pc1hNTD9wYXJ0OnBhcnQudG9VcHBlckNhc2UoKTtjaGVja0ZuPWRp ck5vZGVDaGVjazt9CmNoZWNrRm4oInBhcmVudE5vZGUiLHBhcnQsZG9uZU5hbWUs Y2hlY2tTZXQsbm9kZUNoZWNrLGlzWE1MKTt9LCJ+IjpmdW5jdGlvbihjaGVja1Nl dCxwYXJ0LGlzWE1MKXt2YXIgZG9uZU5hbWU9ZG9uZSsrLGNoZWNrRm49ZGlyQ2hl Y2s7aWYodHlwZW9mIHBhcnQ9PT0ic3RyaW5nIiYmIXBhcnQubWF0Y2goL1xXLykp e3ZhciBub2RlQ2hlY2s9cGFydD1pc1hNTD9wYXJ0OnBhcnQudG9VcHBlckNhc2Uo KTtjaGVja0ZuPWRpck5vZGVDaGVjazt9CmNoZWNrRm4oInByZXZpb3VzU2libGlu ZyIscGFydCxkb25lTmFtZSxjaGVja1NldCxub2RlQ2hlY2ssaXNYTUwpO319LGZp bmQ6e0lEOmZ1bmN0aW9uKG1hdGNoLGNvbnRleHQsaXNYTUwpe2lmKHR5cGVvZiBj b250ZXh0LmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiFpc1hNTCl7dmFy IG09Y29udGV4dC5nZXRFbGVtZW50QnlJZChtYXRjaFsxXSk7cmV0dXJuIG0/W21d OltdO319LE5BTUU6ZnVuY3Rpb24obWF0Y2gsY29udGV4dCxpc1hNTCl7aWYodHlw ZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUhPT0idW5kZWZpbmVkIil7dmFy IHJldD1bXSxyZXN1bHRzPWNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUobWF0Y2hb MV0pO2Zvcih2YXIgaT0wLGw9cmVzdWx0cy5sZW5ndGg7aTxsO2krKyl7aWYocmVz dWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PW1hdGNoWzFdKXtyZXQucHVz aChyZXN1bHRzW2ldKTt9fQpyZXR1cm4gcmV0Lmxlbmd0aD09PTA/bnVsbDpyZXQ7 fX0sVEFHOmZ1bmN0aW9uKG1hdGNoLGNvbnRleHQpe3JldHVybiBjb250ZXh0Lmdl dEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFdKTt9fSxwcmVGaWx0ZXI6e0NMQVNT OmZ1bmN0aW9uKG1hdGNoLGN1ckxvb3AsaW5wbGFjZSxyZXN1bHQsbm90LGlzWE1M KXttYXRjaD0iICIrbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywiIikrIiAiO2lmKGlz WE1MKXtyZXR1cm4gbWF0Y2g7fQpmb3IodmFyIGk9MCxlbGVtOyhlbGVtPWN1ckxv b3BbaV0pIT1udWxsO2krKyl7aWYoZWxlbSl7aWYobm90XihlbGVtLmNsYXNzTmFt ZSYmKCIgIitlbGVtLmNsYXNzTmFtZSsiICIpLmluZGV4T2YobWF0Y2gpPj0wKSl7 aWYoIWlucGxhY2UpCnJlc3VsdC5wdXNoKGVsZW0pO31lbHNlIGlmKGlucGxhY2Up e2N1ckxvb3BbaV09ZmFsc2U7fX19CnJldHVybiBmYWxzZTt9LElEOmZ1bmN0aW9u KG1hdGNoKXtyZXR1cm4gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywiIik7fSxUQUc6 ZnVuY3Rpb24obWF0Y2gsY3VyTG9vcCl7Zm9yKHZhciBpPTA7Y3VyTG9vcFtpXT09 PWZhbHNlO2krKyl7fQpyZXR1cm4gY3VyTG9vcFtpXSYmaXNYTUwoY3VyTG9vcFtp XSk/bWF0Y2hbMV06bWF0Y2hbMV0udG9VcHBlckNhc2UoKTt9LENISUxEOmZ1bmN0 aW9uKG1hdGNoKXtpZihtYXRjaFsxXT09Im50aCIpe3ZhciB0ZXN0PS8oLT8pKFxk KiluKCg/OlwrfC0pP1xkKikvLmV4ZWMobWF0Y2hbMl09PSJldmVuIiYmIjJuInx8 bWF0Y2hbMl09PSJvZGQiJiYiMm4rMSJ8fCEvXEQvLnRlc3QobWF0Y2hbMl0pJiYi MG4rIittYXRjaFsyXXx8bWF0Y2hbMl0pO21hdGNoWzJdPSh0ZXN0WzFdKyh0ZXN0 WzJdfHwxKSktMDttYXRjaFszXT10ZXN0WzNdLTA7fQptYXRjaFswXT1kb25lKys7 cmV0dXJuIG1hdGNoO30sQVRUUjpmdW5jdGlvbihtYXRjaCxjdXJMb29wLGlucGxh Y2UscmVzdWx0LG5vdCxpc1hNTCl7dmFyIG5hbWU9bWF0Y2hbMV0ucmVwbGFjZSgv XFwvZywiIik7aWYoIWlzWE1MJiZFeHByLmF0dHJNYXBbbmFtZV0pe21hdGNoWzFd PUV4cHIuYXR0ck1hcFtuYW1lXTt9CmlmKG1hdGNoWzJdPT09In49Iil7bWF0Y2hb NF09IiAiK21hdGNoWzRdKyIgIjt9CnJldHVybiBtYXRjaDt9LFBTRVVETzpmdW5j dGlvbihtYXRjaCxjdXJMb29wLGlucGxhY2UscmVzdWx0LG5vdCl7aWYobWF0Y2hb MV09PT0ibm90Iil7aWYobWF0Y2hbM10ubWF0Y2goY2h1bmtlcikubGVuZ3RoPjF8 fC9eXHcvLnRlc3QobWF0Y2hbM10pKXttYXRjaFszXT1TaXp6bGUobWF0Y2hbM10s bnVsbCxudWxsLGN1ckxvb3ApO31lbHNle3ZhciByZXQ9U2l6emxlLmZpbHRlciht YXRjaFszXSxjdXJMb29wLGlucGxhY2UsdHJ1ZV5ub3QpO2lmKCFpbnBsYWNlKXty ZXN1bHQucHVzaC5hcHBseShyZXN1bHQscmV0KTt9CnJldHVybiBmYWxzZTt9fWVs c2UgaWYoRXhwci5tYXRjaC5QT1MudGVzdChtYXRjaFswXSl8fEV4cHIubWF0Y2gu Q0hJTEQudGVzdChtYXRjaFswXSkpe3JldHVybiB0cnVlO30KcmV0dXJuIG1hdGNo O30sUE9TOmZ1bmN0aW9uKG1hdGNoKXttYXRjaC51bnNoaWZ0KHRydWUpO3JldHVy biBtYXRjaDt9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGVsZW0pe3JldHVy biBlbGVtLmRpc2FibGVkPT09ZmFsc2UmJmVsZW0udHlwZSE9PSJoaWRkZW4iO30s ZGlzYWJsZWQ6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0uZGlzYWJsZWQ9PT10 cnVlO30sY2hlY2tlZDpmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5jaGVja2Vk PT09dHJ1ZTt9LHNlbGVjdGVkOmZ1bmN0aW9uKGVsZW0pe2VsZW0ucGFyZW50Tm9k ZS5zZWxlY3RlZEluZGV4O3JldHVybiBlbGVtLnNlbGVjdGVkPT09dHJ1ZTt9LHBh cmVudDpmdW5jdGlvbihlbGVtKXtyZXR1cm4hIWVsZW0uZmlyc3RDaGlsZDt9LGVt cHR5OmZ1bmN0aW9uKGVsZW0pe3JldHVybiFlbGVtLmZpcnN0Q2hpbGQ7fSxoYXM6 ZnVuY3Rpb24oZWxlbSxpLG1hdGNoKXtyZXR1cm4hIVNpenpsZShtYXRjaFszXSxl bGVtKS5sZW5ndGg7fSxoZWFkZXI6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuL2hcZC9p LnRlc3QoZWxlbS5ub2RlTmFtZSk7fSx0ZXh0OmZ1bmN0aW9uKGVsZW0pe3JldHVy biJ0ZXh0Ij09PWVsZW0udHlwZTt9LHJhZGlvOmZ1bmN0aW9uKGVsZW0pe3JldHVy biJyYWRpbyI9PT1lbGVtLnR5cGU7fSxjaGVja2JveDpmdW5jdGlvbihlbGVtKXty ZXR1cm4iY2hlY2tib3giPT09ZWxlbS50eXBlO30sZmlsZTpmdW5jdGlvbihlbGVt KXtyZXR1cm4iZmlsZSI9PT1lbGVtLnR5cGU7fSxwYXNzd29yZDpmdW5jdGlvbihl bGVtKXtyZXR1cm4icGFzc3dvcmQiPT09ZWxlbS50eXBlO30sc3VibWl0OmZ1bmN0 aW9uKGVsZW0pe3JldHVybiJzdWJtaXQiPT09ZWxlbS50eXBlO30saW1hZ2U6ZnVu Y3Rpb24oZWxlbSl7cmV0dXJuImltYWdlIj09PWVsZW0udHlwZTt9LHJlc2V0OmZ1 bmN0aW9uKGVsZW0pe3JldHVybiJyZXNldCI9PT1lbGVtLnR5cGU7fSxidXR0b246 ZnVuY3Rpb24oZWxlbSl7cmV0dXJuImJ1dHRvbiI9PT1lbGVtLnR5cGV8fGVsZW0u bm9kZU5hbWUudG9VcHBlckNhc2UoKT09PSJCVVRUT04iO30saW5wdXQ6ZnVuY3Rp b24oZWxlbSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50 ZXN0KGVsZW0ubm9kZU5hbWUpO319LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9u KGVsZW0saSl7cmV0dXJuIGk9PT0wO30sbGFzdDpmdW5jdGlvbihlbGVtLGksbWF0 Y2gsYXJyYXkpe3JldHVybiBpPT09YXJyYXkubGVuZ3RoLTE7fSxldmVuOmZ1bmN0 aW9uKGVsZW0saSl7cmV0dXJuIGklMj09PTA7fSxvZGQ6ZnVuY3Rpb24oZWxlbSxp KXtyZXR1cm4gaSUyPT09MTt9LGx0OmZ1bmN0aW9uKGVsZW0saSxtYXRjaCl7cmV0 dXJuIGk8bWF0Y2hbM10tMDt9LGd0OmZ1bmN0aW9uKGVsZW0saSxtYXRjaCl7cmV0 dXJuIGk+bWF0Y2hbM10tMDt9LG50aDpmdW5jdGlvbihlbGVtLGksbWF0Y2gpe3Jl dHVybiBtYXRjaFszXS0wPT1pO30sZXE6ZnVuY3Rpb24oZWxlbSxpLG1hdGNoKXty ZXR1cm4gbWF0Y2hbM10tMD09aTt9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihl bGVtLG1hdGNoLGksYXJyYXkpe3ZhciBuYW1lPW1hdGNoWzFdLGZpbHRlcj1FeHBy LmZpbHRlcnNbbmFtZV07aWYoZmlsdGVyKXtyZXR1cm4gZmlsdGVyKGVsZW0saSxt YXRjaCxhcnJheSk7fWVsc2UgaWYobmFtZT09PSJjb250YWlucyIpe3JldHVybihl bGVtLnRleHRDb250ZW50fHxlbGVtLmlubmVyVGV4dHx8IiIpLmluZGV4T2YobWF0 Y2hbM10pPj0wO31lbHNlIGlmKG5hbWU9PT0ibm90Iil7dmFyIG5vdD1tYXRjaFsz XTtmb3IodmFyIGk9MCxsPW5vdC5sZW5ndGg7aTxsO2krKyl7aWYobm90W2ldPT09 ZWxlbSl7cmV0dXJuIGZhbHNlO319CnJldHVybiB0cnVlO319LENISUxEOmZ1bmN0 aW9uKGVsZW0sbWF0Y2gpe3ZhciB0eXBlPW1hdGNoWzFdLG5vZGU9ZWxlbTtzd2l0 Y2godHlwZSl7Y2FzZSdvbmx5JzpjYXNlJ2ZpcnN0Jzp3aGlsZShub2RlPW5vZGUu cHJldmlvdXNTaWJsaW5nKXtpZihub2RlLm5vZGVUeXBlPT09MSlyZXR1cm4gZmFs c2U7fQppZih0eXBlPT0nZmlyc3QnKXJldHVybiB0cnVlO25vZGU9ZWxlbTtjYXNl J2xhc3QnOndoaWxlKG5vZGU9bm9kZS5uZXh0U2libGluZyl7aWYobm9kZS5ub2Rl VHlwZT09PTEpcmV0dXJuIGZhbHNlO30KcmV0dXJuIHRydWU7Y2FzZSdudGgnOnZh ciBmaXJzdD1tYXRjaFsyXSxsYXN0PW1hdGNoWzNdO2lmKGZpcnN0PT0xJiZsYXN0 PT0wKXtyZXR1cm4gdHJ1ZTt9CnZhciBkb25lTmFtZT1tYXRjaFswXSxwYXJlbnQ9 ZWxlbS5wYXJlbnROb2RlO2lmKHBhcmVudCYmKHBhcmVudC5zaXpjYWNoZSE9PWRv bmVOYW1lfHwhZWxlbS5ub2RlSW5kZXgpKXt2YXIgY291bnQ9MDtmb3Iobm9kZT1w YXJlbnQuZmlyc3RDaGlsZDtub2RlO25vZGU9bm9kZS5uZXh0U2libGluZyl7aWYo bm9kZS5ub2RlVHlwZT09PTEpe25vZGUubm9kZUluZGV4PSsrY291bnQ7fX0KcGFy ZW50LnNpemNhY2hlPWRvbmVOYW1lO30KdmFyIGRpZmY9ZWxlbS5ub2RlSW5kZXgt bGFzdDtpZihmaXJzdD09MCl7cmV0dXJuIGRpZmY9PTA7fWVsc2V7cmV0dXJuKGRp ZmYlZmlyc3Q9PTAmJmRpZmYvZmlyc3Q+PTApO319fSxJRDpmdW5jdGlvbihlbGVt LG1hdGNoKXtyZXR1cm4gZWxlbS5ub2RlVHlwZT09PTEmJmVsZW0uZ2V0QXR0cmli dXRlKCJpZCIpPT09bWF0Y2g7fSxUQUc6ZnVuY3Rpb24oZWxlbSxtYXRjaCl7cmV0 dXJuKG1hdGNoPT09IioiJiZlbGVtLm5vZGVUeXBlPT09MSl8fGVsZW0ubm9kZU5h bWU9PT1tYXRjaDt9LENMQVNTOmZ1bmN0aW9uKGVsZW0sbWF0Y2gpe3JldHVybigi ICIrKGVsZW0uY2xhc3NOYW1lfHxlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkr IiAiKS5pbmRleE9mKG1hdGNoKT4tMTt9LEFUVFI6ZnVuY3Rpb24oZWxlbSxtYXRj aCl7dmFyIG5hbWU9bWF0Y2hbMV0scmVzdWx0PUV4cHIuYXR0ckhhbmRsZVtuYW1l XT9FeHByLmF0dHJIYW5kbGVbbmFtZV0oZWxlbSk6ZWxlbVtuYW1lXSE9bnVsbD9l bGVtW25hbWVdOmVsZW0uZ2V0QXR0cmlidXRlKG5hbWUpLHZhbHVlPXJlc3VsdCsi Iix0eXBlPW1hdGNoWzJdLGNoZWNrPW1hdGNoWzRdO3JldHVybiByZXN1bHQ9PW51 bGw/dHlwZT09PSIhPSI6dHlwZT09PSI9Ij92YWx1ZT09PWNoZWNrOnR5cGU9PT0i Kj0iP3ZhbHVlLmluZGV4T2YoY2hlY2spPj0wOnR5cGU9PT0ifj0iPygiICIrdmFs dWUrIiAiKS5pbmRleE9mKGNoZWNrKT49MDohY2hlY2s/dmFsdWUmJnJlc3VsdCE9 PWZhbHNlOnR5cGU9PT0iIT0iP3ZhbHVlIT1jaGVjazp0eXBlPT09Il49Ij92YWx1 ZS5pbmRleE9mKGNoZWNrKT09PTA6dHlwZT09PSIkPSI/dmFsdWUuc3Vic3RyKHZh bHVlLmxlbmd0aC1jaGVjay5sZW5ndGgpPT09Y2hlY2s6dHlwZT09PSJ8PSI/dmFs dWU9PT1jaGVja3x8dmFsdWUuc3Vic3RyKDAsY2hlY2subGVuZ3RoKzEpPT09Y2hl Y2srIi0iOmZhbHNlO30sUE9TOmZ1bmN0aW9uKGVsZW0sbWF0Y2gsaSxhcnJheSl7 dmFyIG5hbWU9bWF0Y2hbMl0sZmlsdGVyPUV4cHIuc2V0RmlsdGVyc1tuYW1lXTtp ZihmaWx0ZXIpe3JldHVybiBmaWx0ZXIoZWxlbSxpLG1hdGNoLGFycmF5KTt9fX19 O3ZhciBvcmlnUE9TPUV4cHIubWF0Y2guUE9TO2Zvcih2YXIgdHlwZSBpbiBFeHBy Lm1hdGNoKXtFeHByLm1hdGNoW3R5cGVdPVJlZ0V4cChFeHByLm1hdGNoW3R5cGVd LnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpO30KdmFy IG1ha2VBcnJheT1mdW5jdGlvbihhcnJheSxyZXN1bHRzKXthcnJheT1BcnJheS5w cm90b3R5cGUuc2xpY2UuY2FsbChhcnJheSk7aWYocmVzdWx0cyl7cmVzdWx0cy5w dXNoLmFwcGx5KHJlc3VsdHMsYXJyYXkpO3JldHVybiByZXN1bHRzO30KcmV0dXJu IGFycmF5O307dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50 LmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKTt9Y2F0Y2goZSl7bWFrZUFycmF5 PWZ1bmN0aW9uKGFycmF5LHJlc3VsdHMpe3ZhciByZXQ9cmVzdWx0c3x8W107aWYo dG9TdHJpbmcuY2FsbChhcnJheSk9PT0iW29iamVjdCBBcnJheV0iKXtBcnJheS5w cm90b3R5cGUucHVzaC5hcHBseShyZXQsYXJyYXkpO31lbHNle2lmKHR5cGVvZiBh cnJheS5sZW5ndGg9PT0ibnVtYmVyIil7Zm9yKHZhciBpPTAsbD1hcnJheS5sZW5n dGg7aTxsO2krKyl7cmV0LnB1c2goYXJyYXlbaV0pO319ZWxzZXtmb3IodmFyIGk9 MDthcnJheVtpXTtpKyspe3JldC5wdXNoKGFycmF5W2ldKTt9fX0KcmV0dXJuIHJl dDt9O30KdmFyIHNvcnRPcmRlcjtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQu Y29tcGFyZURvY3VtZW50UG9zaXRpb24pe3NvcnRPcmRlcj1mdW5jdGlvbihhLGIp e3ZhciByZXQ9YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOmE9PT1i PzA6MTtpZihyZXQ9PT0wKXtoYXNEdXBsaWNhdGU9dHJ1ZTt9CnJldHVybiByZXQ7 fTt9ZWxzZSBpZigic291cmNlSW5kZXgiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVt ZW50KXtzb3J0T3JkZXI9ZnVuY3Rpb24oYSxiKXt2YXIgcmV0PWEuc291cmNlSW5k ZXgtYi5zb3VyY2VJbmRleDtpZihyZXQ9PT0wKXtoYXNEdXBsaWNhdGU9dHJ1ZTt9 CnJldHVybiByZXQ7fTt9ZWxzZSBpZihkb2N1bWVudC5jcmVhdGVSYW5nZSl7c29y dE9yZGVyPWZ1bmN0aW9uKGEsYil7dmFyIGFSYW5nZT1hLm93bmVyRG9jdW1lbnQu Y3JlYXRlUmFuZ2UoKSxiUmFuZ2U9Yi5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdl KCk7YVJhbmdlLnNlbGVjdE5vZGUoYSk7YVJhbmdlLmNvbGxhcHNlKHRydWUpO2JS YW5nZS5zZWxlY3ROb2RlKGIpO2JSYW5nZS5jb2xsYXBzZSh0cnVlKTt2YXIgcmV0 PWFSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5E LGJSYW5nZSk7aWYocmV0PT09MCl7aGFzRHVwbGljYXRlPXRydWU7fQpyZXR1cm4g cmV0O307fQooZnVuY3Rpb24oKXt2YXIgZm9ybT1kb2N1bWVudC5jcmVhdGVFbGVt ZW50KCJmb3JtIiksaWQ9InNjcmlwdCIrKG5ldyBEYXRlKS5nZXRUaW1lKCk7Zm9y bS5pbm5lckhUTUw9IjxpbnB1dCBuYW1lPSciK2lkKyInLz4iO3ZhciByb290PWRv Y3VtZW50LmRvY3VtZW50RWxlbWVudDtyb290Lmluc2VydEJlZm9yZShmb3JtLHJv b3QuZmlyc3RDaGlsZCk7aWYoISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkp e0V4cHIuZmluZC5JRD1mdW5jdGlvbihtYXRjaCxjb250ZXh0LGlzWE1MKXtpZih0 eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYhaXNY TUwpe3ZhciBtPWNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pO3JldHVy biBtP20uaWQ9PT1tYXRjaFsxXXx8dHlwZW9mIG0uZ2V0QXR0cmlidXRlTm9kZSE9 PSJ1bmRlZmluZWQiJiZtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVl PT09bWF0Y2hbMV0/W21dOnVuZGVmaW5lZDpbXTt9fTtFeHByLmZpbHRlci5JRD1m dW5jdGlvbihlbGVtLG1hdGNoKXt2YXIgbm9kZT10eXBlb2YgZWxlbS5nZXRBdHRy aWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJmVsZW0uZ2V0QXR0cmlidXRlTm9kZSgi aWQiKTtyZXR1cm4gZWxlbS5ub2RlVHlwZT09PTEmJm5vZGUmJm5vZGUubm9kZVZh bHVlPT09bWF0Y2g7fTt9CnJvb3QucmVtb3ZlQ2hpbGQoZm9ybSk7fSkoKTsoZnVu Y3Rpb24oKXt2YXIgZGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Rp di5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSk7aWYoZGl2 LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoPjApe0V4cHIuZmluZC5U QUc9ZnVuY3Rpb24obWF0Y2gsY29udGV4dCl7dmFyIHJlc3VsdHM9Y29udGV4dC5n ZXRFbGVtZW50c0J5VGFnTmFtZShtYXRjaFsxXSk7aWYobWF0Y2hbMV09PT0iKiIp e3ZhciB0bXA9W107Zm9yKHZhciBpPTA7cmVzdWx0c1tpXTtpKyspe2lmKHJlc3Vs dHNbaV0ubm9kZVR5cGU9PT0xKXt0bXAucHVzaChyZXN1bHRzW2ldKTt9fQpyZXN1 bHRzPXRtcDt9CnJldHVybiByZXN1bHRzO307fQpkaXYuaW5uZXJIVE1MPSI8YSBo cmVmPScjJz48L2E+IjtpZihkaXYuZmlyc3RDaGlsZCYmdHlwZW9mIGRpdi5maXJz dENoaWxkLmdldEF0dHJpYnV0ZSE9PSJ1bmRlZmluZWQiJiZkaXYuZmlyc3RDaGls ZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIil7RXhwci5hdHRySGFuZGxlLmhy ZWY9ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVm IiwyKTt9O319KSgpO2lmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpKGZ1bmN0 aW9uKCl7dmFyIG9sZFNpenpsZT1TaXp6bGUsZGl2PWRvY3VtZW50LmNyZWF0ZUVs ZW1lbnQoImRpdiIpO2Rpdi5pbm5lckhUTUw9IjxwIGNsYXNzPSdURVNUJz48L3A+ IjtpZihkaXYucXVlcnlTZWxlY3RvckFsbCYmZGl2LnF1ZXJ5U2VsZWN0b3JBbGwo Ii5URVNUIikubGVuZ3RoPT09MCl7cmV0dXJuO30KU2l6emxlPWZ1bmN0aW9uKHF1 ZXJ5LGNvbnRleHQsZXh0cmEsc2VlZCl7Y29udGV4dD1jb250ZXh0fHxkb2N1bWVu dDtpZighc2VlZCYmY29udGV4dC5ub2RlVHlwZT09PTkmJiFpc1hNTChjb250ZXh0 KSl7dHJ5e3JldHVybiBtYWtlQXJyYXkoY29udGV4dC5xdWVyeVNlbGVjdG9yQWxs KHF1ZXJ5KSxleHRyYSk7fWNhdGNoKGUpe319CnJldHVybiBvbGRTaXp6bGUocXVl cnksY29udGV4dCxleHRyYSxzZWVkKTt9O1NpenpsZS5maW5kPW9sZFNpenpsZS5m aW5kO1NpenpsZS5maWx0ZXI9b2xkU2l6emxlLmZpbHRlcjtTaXp6bGUuc2VsZWN0 b3JzPW9sZFNpenpsZS5zZWxlY3RvcnM7U2l6emxlLm1hdGNoZXM9b2xkU2l6emxl Lm1hdGNoZXM7fSkoKTtpZihkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1l JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFt ZSkoZnVuY3Rpb24oKXt2YXIgZGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRp diIpO2Rpdi5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRp diBjbGFzcz0ndGVzdCc+PC9kaXY+IjtpZihkaXYuZ2V0RWxlbWVudHNCeUNsYXNz TmFtZSgiZSIpLmxlbmd0aD09PTApCnJldHVybjtkaXYubGFzdENoaWxkLmNsYXNz TmFtZT0iZSI7aWYoZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5n dGg9PT0xKQpyZXR1cm47RXhwci5vcmRlci5zcGxpY2UoMSwwLCJDTEFTUyIpO0V4 cHIuZmluZC5DTEFTUz1mdW5jdGlvbihtYXRjaCxjb250ZXh0LGlzWE1MKXtpZih0 eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09InVuZGVmaW5l ZCImJiFpc1hNTCl7cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFt ZShtYXRjaFsxXSk7fX07fSkoKTtmdW5jdGlvbiBkaXJOb2RlQ2hlY2soZGlyLGN1 cixkb25lTmFtZSxjaGVja1NldCxub2RlQ2hlY2ssaXNYTUwpe3ZhciBzaWJEaXI9 ZGlyPT0icHJldmlvdXNTaWJsaW5nIiYmIWlzWE1MO2Zvcih2YXIgaT0wLGw9Y2hl Y2tTZXQubGVuZ3RoO2k8bDtpKyspe3ZhciBlbGVtPWNoZWNrU2V0W2ldO2lmKGVs ZW0pe2lmKHNpYkRpciYmZWxlbS5ub2RlVHlwZT09PTEpe2VsZW0uc2l6Y2FjaGU9 ZG9uZU5hbWU7ZWxlbS5zaXpzZXQ9aTt9CmVsZW09ZWxlbVtkaXJdO3ZhciBtYXRj aD1mYWxzZTt3aGlsZShlbGVtKXtpZihlbGVtLnNpemNhY2hlPT09ZG9uZU5hbWUp e21hdGNoPWNoZWNrU2V0W2VsZW0uc2l6c2V0XTticmVhazt9CmlmKGVsZW0ubm9k ZVR5cGU9PT0xJiYhaXNYTUwpe2VsZW0uc2l6Y2FjaGU9ZG9uZU5hbWU7ZWxlbS5z aXpzZXQ9aTt9CmlmKGVsZW0ubm9kZU5hbWU9PT1jdXIpe21hdGNoPWVsZW07YnJl YWs7fQplbGVtPWVsZW1bZGlyXTt9CmNoZWNrU2V0W2ldPW1hdGNoO319fQpmdW5j dGlvbiBkaXJDaGVjayhkaXIsY3VyLGRvbmVOYW1lLGNoZWNrU2V0LG5vZGVDaGVj ayxpc1hNTCl7dmFyIHNpYkRpcj1kaXI9PSJwcmV2aW91c1NpYmxpbmciJiYhaXNY TUw7Zm9yKHZhciBpPTAsbD1jaGVja1NldC5sZW5ndGg7aTxsO2krKyl7dmFyIGVs ZW09Y2hlY2tTZXRbaV07aWYoZWxlbSl7aWYoc2liRGlyJiZlbGVtLm5vZGVUeXBl PT09MSl7ZWxlbS5zaXpjYWNoZT1kb25lTmFtZTtlbGVtLnNpenNldD1pO30KZWxl bT1lbGVtW2Rpcl07dmFyIG1hdGNoPWZhbHNlO3doaWxlKGVsZW0pe2lmKGVsZW0u c2l6Y2FjaGU9PT1kb25lTmFtZSl7bWF0Y2g9Y2hlY2tTZXRbZWxlbS5zaXpzZXRd O2JyZWFrO30KaWYoZWxlbS5ub2RlVHlwZT09PTEpe2lmKCFpc1hNTCl7ZWxlbS5z aXpjYWNoZT1kb25lTmFtZTtlbGVtLnNpenNldD1pO30KaWYodHlwZW9mIGN1ciE9 PSJzdHJpbmciKXtpZihlbGVtPT09Y3VyKXttYXRjaD10cnVlO2JyZWFrO319ZWxz ZSBpZihTaXp6bGUuZmlsdGVyKGN1cixbZWxlbV0pLmxlbmd0aD4wKXttYXRjaD1l bGVtO2JyZWFrO319CmVsZW09ZWxlbVtkaXJdO30KY2hlY2tTZXRbaV09bWF0Y2g7 fX19CnZhciBjb250YWlucz1kb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlv bj9mdW5jdGlvbihhLGIpe3JldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9u KGIpJjE2O306ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5z P2EuY29udGFpbnMoYik6dHJ1ZSk7fTt2YXIgaXNYTUw9ZnVuY3Rpb24oZWxlbSl7 cmV0dXJuIGVsZW0ubm9kZVR5cGU9PT05JiZlbGVtLmRvY3VtZW50RWxlbWVudC5u b2RlTmFtZSE9PSJIVE1MInx8ISFlbGVtLm93bmVyRG9jdW1lbnQmJmlzWE1MKGVs ZW0ub3duZXJEb2N1bWVudCk7fTt2YXIgcG9zUHJvY2Vzcz1mdW5jdGlvbihzZWxl Y3Rvcixjb250ZXh0KXt2YXIgdG1wU2V0PVtdLGxhdGVyPSIiLG1hdGNoLHJvb3Q9 Y29udGV4dC5ub2RlVHlwZT9bY29udGV4dF06Y29udGV4dDt3aGlsZSgobWF0Y2g9 RXhwci5tYXRjaC5QU0VVRE8uZXhlYyhzZWxlY3RvcikpKXtsYXRlcis9bWF0Y2hb MF07c2VsZWN0b3I9c2VsZWN0b3IucmVwbGFjZShFeHByLm1hdGNoLlBTRVVETywi Iik7fQpzZWxlY3Rvcj1FeHByLnJlbGF0aXZlW3NlbGVjdG9yXT9zZWxlY3Rvcisi KiI6c2VsZWN0b3I7Zm9yKHZhciBpPTAsbD1yb290Lmxlbmd0aDtpPGw7aSsrKXtT aXp6bGUoc2VsZWN0b3Iscm9vdFtpXSx0bXBTZXQpO30KcmV0dXJuIFNpenpsZS5m aWx0ZXIobGF0ZXIsdG1wU2V0KTt9O2pRdWVyeS5maW5kPVNpenpsZTtqUXVlcnku ZmlsdGVyPVNpenpsZS5maWx0ZXI7alF1ZXJ5LmV4cHI9U2l6emxlLnNlbGVjdG9y cztqUXVlcnkuZXhwclsiOiJdPWpRdWVyeS5leHByLmZpbHRlcnM7U2l6emxlLnNl bGVjdG9ycy5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxl bS5vZmZzZXRXaWR0aD09PTB8fGVsZW0ub2Zmc2V0SGVpZ2h0PT09MDt9O1Npenps ZS5zZWxlY3RvcnMuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGVsZW0pe3JldHVy biBlbGVtLm9mZnNldFdpZHRoPjB8fGVsZW0ub2Zmc2V0SGVpZ2h0PjA7fTtTaXp6 bGUuc2VsZWN0b3JzLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oZWxlbSl7cmV0 dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsZnVuY3Rpb24oZm4pe3JldHVy biBlbGVtPT09Zm4uZWxlbTt9KS5sZW5ndGg7fTtqUXVlcnkubXVsdGlGaWx0ZXI9 ZnVuY3Rpb24oZXhwcixlbGVtcyxub3Qpe2lmKG5vdCl7ZXhwcj0iOm5vdCgiK2V4 cHIrIikiO30KcmV0dXJuIFNpenpsZS5tYXRjaGVzKGV4cHIsZWxlbXMpO307alF1 ZXJ5LmRpcj1mdW5jdGlvbihlbGVtLGRpcil7dmFyIG1hdGNoZWQ9W10sY3VyPWVs ZW1bZGlyXTt3aGlsZShjdXImJmN1ciE9ZG9jdW1lbnQpe2lmKGN1ci5ub2RlVHlw ZT09MSkKbWF0Y2hlZC5wdXNoKGN1cik7Y3VyPWN1cltkaXJdO30KcmV0dXJuIG1h dGNoZWQ7fTtqUXVlcnkubnRoPWZ1bmN0aW9uKGN1cixyZXN1bHQsZGlyLGVsZW0p e3Jlc3VsdD1yZXN1bHR8fDE7dmFyIG51bT0wO2Zvcig7Y3VyO2N1cj1jdXJbZGly XSkKaWYoY3VyLm5vZGVUeXBlPT0xJiYrK251bT09cmVzdWx0KQpicmVhaztyZXR1 cm4gY3VyO307alF1ZXJ5LnNpYmxpbmc9ZnVuY3Rpb24obixlbGVtKXt2YXIgcj1b XTtmb3IoO247bj1uLm5leHRTaWJsaW5nKXtpZihuLm5vZGVUeXBlPT0xJiZuIT1l bGVtKQpyLnB1c2gobik7fQpyZXR1cm4gcjt9O3JldHVybjt3aW5kb3cuU2l6emxl PVNpenpsZTt9KSgpO2pRdWVyeS5ldmVudD17YWRkOmZ1bmN0aW9uKGVsZW0sdHlw ZXMsaGFuZGxlcixkYXRhKXtpZihlbGVtLm5vZGVUeXBlPT0zfHxlbGVtLm5vZGVU eXBlPT04KQpyZXR1cm47aWYoZWxlbS5zZXRJbnRlcnZhbCYmZWxlbSE9d2luZG93 KQplbGVtPXdpbmRvdztpZighaGFuZGxlci5ndWlkKQpoYW5kbGVyLmd1aWQ9dGhp cy5ndWlkKys7aWYoZGF0YSE9PXVuZGVmaW5lZCl7dmFyIGZuPWhhbmRsZXI7aGFu ZGxlcj10aGlzLnByb3h5KGZuKTtoYW5kbGVyLmRhdGE9ZGF0YTt9CnZhciBldmVu dHM9alF1ZXJ5LmRhdGEoZWxlbSwiZXZlbnRzIil8fGpRdWVyeS5kYXRhKGVsZW0s ImV2ZW50cyIse30pLGhhbmRsZT1qUXVlcnkuZGF0YShlbGVtLCJoYW5kbGUiKXx8 alF1ZXJ5LmRhdGEoZWxlbSwiaGFuZGxlIixmdW5jdGlvbigpe3JldHVybiB0eXBl b2YgalF1ZXJ5IT09InVuZGVmaW5lZCImJiFqUXVlcnkuZXZlbnQudHJpZ2dlcmVk P2pRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoYXJndW1lbnRzLmNhbGxlZS5lbGVt LGFyZ3VtZW50cyk6dW5kZWZpbmVkO30pO2hhbmRsZS5lbGVtPWVsZW07alF1ZXJ5 LmVhY2godHlwZXMuc3BsaXQoL1xzKy8pLGZ1bmN0aW9uKGluZGV4LHR5cGUpe3Zh ciBuYW1lc3BhY2VzPXR5cGUuc3BsaXQoIi4iKTt0eXBlPW5hbWVzcGFjZXMuc2hp ZnQoKTtoYW5kbGVyLnR5cGU9bmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5qb2lu KCIuIik7dmFyIGhhbmRsZXJzPWV2ZW50c1t0eXBlXTtpZihqUXVlcnkuZXZlbnQu c3BlY2lhbEFsbFt0eXBlXSkKalF1ZXJ5LmV2ZW50LnNwZWNpYWxBbGxbdHlwZV0u c2V0dXAuY2FsbChlbGVtLGRhdGEsbmFtZXNwYWNlcyk7aWYoIWhhbmRsZXJzKXto YW5kbGVycz1ldmVudHNbdHlwZV09e307aWYoIWpRdWVyeS5ldmVudC5zcGVjaWFs W3R5cGVdfHxqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXS5zZXR1cC5jYWxsKGVs ZW0sZGF0YSxuYW1lc3BhY2VzKT09PWZhbHNlKXtpZihlbGVtLmFkZEV2ZW50TGlz dGVuZXIpCmVsZW0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLGhhbmRsZSxmYWxzZSk7 ZWxzZSBpZihlbGVtLmF0dGFjaEV2ZW50KQplbGVtLmF0dGFjaEV2ZW50KCJvbiIr dHlwZSxoYW5kbGUpO319CmhhbmRsZXJzW2hhbmRsZXIuZ3VpZF09aGFuZGxlcjtq UXVlcnkuZXZlbnQuZ2xvYmFsW3R5cGVdPXRydWU7fSk7ZWxlbT1udWxsO30sZ3Vp ZDoxLGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oZWxlbSx0eXBlcyxoYW5kbGVy KXtpZihlbGVtLm5vZGVUeXBlPT0zfHxlbGVtLm5vZGVUeXBlPT04KQpyZXR1cm47 dmFyIGV2ZW50cz1qUXVlcnkuZGF0YShlbGVtLCJldmVudHMiKSxyZXQsaW5kZXg7 aWYoZXZlbnRzKXtpZih0eXBlcz09PXVuZGVmaW5lZHx8KHR5cGVvZiB0eXBlcz09 PSJzdHJpbmciJiZ0eXBlcy5jaGFyQXQoMCk9PSIuIikpCmZvcih2YXIgdHlwZSBp biBldmVudHMpCnRoaXMucmVtb3ZlKGVsZW0sdHlwZSsodHlwZXN8fCIiKSk7ZWxz ZXtpZih0eXBlcy50eXBlKXtoYW5kbGVyPXR5cGVzLmhhbmRsZXI7dHlwZXM9dHlw ZXMudHlwZTt9CmpRdWVyeS5lYWNoKHR5cGVzLnNwbGl0KC9ccysvKSxmdW5jdGlv bihpbmRleCx0eXBlKXt2YXIgbmFtZXNwYWNlcz10eXBlLnNwbGl0KCIuIik7dHlw ZT1uYW1lc3BhY2VzLnNoaWZ0KCk7dmFyIG5hbWVzcGFjZT1SZWdFeHAoIihefFxc LikiK25hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSsiKFxc LnwkKSIpO2lmKGV2ZW50c1t0eXBlXSl7aWYoaGFuZGxlcikKZGVsZXRlIGV2ZW50 c1t0eXBlXVtoYW5kbGVyLmd1aWRdO2Vsc2UKZm9yKHZhciBoYW5kbGUgaW4gZXZl bnRzW3R5cGVdKQppZihuYW1lc3BhY2UudGVzdChldmVudHNbdHlwZV1baGFuZGxl XS50eXBlKSkKZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVdO2lmKGpRdWVyeS5l dmVudC5zcGVjaWFsQWxsW3R5cGVdKQpqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0 eXBlXS50ZWFyZG93bi5jYWxsKGVsZW0sbmFtZXNwYWNlcyk7Zm9yKHJldCBpbiBl dmVudHNbdHlwZV0pYnJlYWs7aWYoIXJldCl7aWYoIWpRdWVyeS5ldmVudC5zcGVj aWFsW3R5cGVdfHxqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXS50ZWFyZG93bi5j YWxsKGVsZW0sbmFtZXNwYWNlcyk9PT1mYWxzZSl7aWYoZWxlbS5yZW1vdmVFdmVu dExpc3RlbmVyKQplbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSxqUXVlcnku ZGF0YShlbGVtLCJoYW5kbGUiKSxmYWxzZSk7ZWxzZSBpZihlbGVtLmRldGFjaEV2 ZW50KQplbGVtLmRldGFjaEV2ZW50KCJvbiIrdHlwZSxqUXVlcnkuZGF0YShlbGVt LCJoYW5kbGUiKSk7fQpyZXQ9bnVsbDtkZWxldGUgZXZlbnRzW3R5cGVdO319fSk7 fQpmb3IocmV0IGluIGV2ZW50cylicmVhaztpZighcmV0KXt2YXIgaGFuZGxlPWpR dWVyeS5kYXRhKGVsZW0sImhhbmRsZSIpO2lmKGhhbmRsZSloYW5kbGUuZWxlbT1u dWxsO2pRdWVyeS5yZW1vdmVEYXRhKGVsZW0sImV2ZW50cyIpO2pRdWVyeS5yZW1v dmVEYXRhKGVsZW0sImhhbmRsZSIpO319fSx0cmlnZ2VyOmZ1bmN0aW9uKGV2ZW50 LGRhdGEsZWxlbSxidWJibGluZyl7dmFyIHR5cGU9ZXZlbnQudHlwZXx8ZXZlbnQ7 aWYoIWJ1YmJsaW5nKXtldmVudD10eXBlb2YgZXZlbnQ9PT0ib2JqZWN0Ij9ldmVu dFtleHBhbmRvXT9ldmVudDpqUXVlcnkuZXh0ZW5kKGpRdWVyeS5FdmVudCh0eXBl KSxldmVudCk6alF1ZXJ5LkV2ZW50KHR5cGUpO2lmKHR5cGUuaW5kZXhPZigiISIp Pj0wKXtldmVudC50eXBlPXR5cGU9dHlwZS5zbGljZSgwLC0xKTtldmVudC5leGNs dXNpdmU9dHJ1ZTt9CmlmKCFlbGVtKXtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtp Zih0aGlzLmdsb2JhbFt0eXBlXSkKalF1ZXJ5LmVhY2goalF1ZXJ5LmNhY2hlLGZ1 bmN0aW9uKCl7aWYodGhpcy5ldmVudHMmJnRoaXMuZXZlbnRzW3R5cGVdKQpqUXVl cnkuZXZlbnQudHJpZ2dlcihldmVudCxkYXRhLHRoaXMuaGFuZGxlLmVsZW0pO30p O30KaWYoIWVsZW18fGVsZW0ubm9kZVR5cGU9PTN8fGVsZW0ubm9kZVR5cGU9PTgp CnJldHVybiB1bmRlZmluZWQ7ZXZlbnQucmVzdWx0PXVuZGVmaW5lZDtldmVudC50 YXJnZXQ9ZWxlbTtkYXRhPWpRdWVyeS5tYWtlQXJyYXkoZGF0YSk7ZGF0YS51bnNo aWZ0KGV2ZW50KTt9CmV2ZW50LmN1cnJlbnRUYXJnZXQ9ZWxlbTt2YXIgaGFuZGxl PWpRdWVyeS5kYXRhKGVsZW0sImhhbmRsZSIpO2lmKGhhbmRsZSkKaGFuZGxlLmFw cGx5KGVsZW0sZGF0YSk7aWYoKCFlbGVtW3R5cGVdfHwoalF1ZXJ5Lm5vZGVOYW1l KGVsZW0sJ2EnKSYmdHlwZT09ImNsaWNrIikpJiZlbGVtWyJvbiIrdHlwZV0mJmVs ZW1bIm9uIit0eXBlXS5hcHBseShlbGVtLGRhdGEpPT09ZmFsc2UpCmV2ZW50LnJl c3VsdD1mYWxzZTtpZighYnViYmxpbmcmJmVsZW1bdHlwZV0mJiFldmVudC5pc0Rl ZmF1bHRQcmV2ZW50ZWQoKSYmIShqUXVlcnkubm9kZU5hbWUoZWxlbSwnYScpJiZ0 eXBlPT0iY2xpY2siKSl7dGhpcy50cmlnZ2VyZWQ9dHJ1ZTt0cnl7ZWxlbVt0eXBl XSgpO31jYXRjaChlKXt9fQp0aGlzLnRyaWdnZXJlZD1mYWxzZTtpZighZXZlbnQu aXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7dmFyIHBhcmVudD1lbGVtLnBhcmVudE5v ZGV8fGVsZW0ub3duZXJEb2N1bWVudDtpZihwYXJlbnQpCmpRdWVyeS5ldmVudC50 cmlnZ2VyKGV2ZW50LGRhdGEscGFyZW50LHRydWUpO319LGhhbmRsZTpmdW5jdGlv bihldmVudCl7dmFyIGFsbCxoYW5kbGVycztldmVudD1hcmd1bWVudHNbMF09alF1 ZXJ5LmV2ZW50LmZpeChldmVudHx8d2luZG93LmV2ZW50KTtldmVudC5jdXJyZW50 VGFyZ2V0PXRoaXM7dmFyIG5hbWVzcGFjZXM9ZXZlbnQudHlwZS5zcGxpdCgiLiIp O2V2ZW50LnR5cGU9bmFtZXNwYWNlcy5zaGlmdCgpO2FsbD0hbmFtZXNwYWNlcy5s ZW5ndGgmJiFldmVudC5leGNsdXNpdmU7dmFyIG5hbWVzcGFjZT1SZWdFeHAoIihe fFxcLikiK25hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSsi KFxcLnwkKSIpO2hhbmRsZXJzPShqUXVlcnkuZGF0YSh0aGlzLCJldmVudHMiKXx8 e30pW2V2ZW50LnR5cGVdO2Zvcih2YXIgaiBpbiBoYW5kbGVycyl7dmFyIGhhbmRs ZXI9aGFuZGxlcnNbal07aWYoYWxsfHxuYW1lc3BhY2UudGVzdChoYW5kbGVyLnR5 cGUpKXtldmVudC5oYW5kbGVyPWhhbmRsZXI7ZXZlbnQuZGF0YT1oYW5kbGVyLmRh dGE7dmFyIHJldD1oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihyZXQh PT11bmRlZmluZWQpe2V2ZW50LnJlc3VsdD1yZXQ7aWYocmV0PT09ZmFsc2Upe2V2 ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7fX0K aWYoZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkKYnJlYWs7 fX19LHByb3BzOiJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1 dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5 IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVu dCBoYW5kbGVyIGtleUNvZGUgbWV0YUtleSBuZXdWYWx1ZSBvcmlnaW5hbFRhcmdl dCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdl dCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9F bGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSxmaXg6ZnVu Y3Rpb24oZXZlbnQpe2lmKGV2ZW50W2V4cGFuZG9dKQpyZXR1cm4gZXZlbnQ7dmFy IG9yaWdpbmFsRXZlbnQ9ZXZlbnQ7ZXZlbnQ9alF1ZXJ5LkV2ZW50KG9yaWdpbmFs RXZlbnQpO2Zvcih2YXIgaT10aGlzLnByb3BzLmxlbmd0aCxwcm9wO2k7KXtwcm9w PXRoaXMucHJvcHNbLS1pXTtldmVudFtwcm9wXT1vcmlnaW5hbEV2ZW50W3Byb3Bd O30KaWYoIWV2ZW50LnRhcmdldCkKZXZlbnQudGFyZ2V0PWV2ZW50LnNyY0VsZW1l bnR8fGRvY3VtZW50O2lmKGV2ZW50LnRhcmdldC5ub2RlVHlwZT09MykKZXZlbnQu dGFyZ2V0PWV2ZW50LnRhcmdldC5wYXJlbnROb2RlO2lmKCFldmVudC5yZWxhdGVk VGFyZ2V0JiZldmVudC5mcm9tRWxlbWVudCkKZXZlbnQucmVsYXRlZFRhcmdldD1l dmVudC5mcm9tRWxlbWVudD09ZXZlbnQudGFyZ2V0P2V2ZW50LnRvRWxlbWVudDpl dmVudC5mcm9tRWxlbWVudDtpZihldmVudC5wYWdlWD09bnVsbCYmZXZlbnQuY2xp ZW50WCE9bnVsbCl7dmFyIGRvYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYm9k eT1kb2N1bWVudC5ib2R5O2V2ZW50LnBhZ2VYPWV2ZW50LmNsaWVudFgrKGRvYyYm ZG9jLnNjcm9sbExlZnR8fGJvZHkmJmJvZHkuc2Nyb2xsTGVmdHx8MCktKGRvYy5j bGllbnRMZWZ0fHwwKTtldmVudC5wYWdlWT1ldmVudC5jbGllbnRZKyhkb2MmJmRv Yy5zY3JvbGxUb3B8fGJvZHkmJmJvZHkuc2Nyb2xsVG9wfHwwKS0oZG9jLmNsaWVu dFRvcHx8MCk7fQppZighZXZlbnQud2hpY2gmJigoZXZlbnQuY2hhckNvZGV8fGV2 ZW50LmNoYXJDb2RlPT09MCk/ZXZlbnQuY2hhckNvZGU6ZXZlbnQua2V5Q29kZSkp CmV2ZW50LndoaWNoPWV2ZW50LmNoYXJDb2RlfHxldmVudC5rZXlDb2RlO2lmKCFl dmVudC5tZXRhS2V5JiZldmVudC5jdHJsS2V5KQpldmVudC5tZXRhS2V5PWV2ZW50 LmN0cmxLZXk7aWYoIWV2ZW50LndoaWNoJiZldmVudC5idXR0b24pCmV2ZW50Lndo aWNoPShldmVudC5idXR0b24mMT8xOihldmVudC5idXR0b24mMj8zOihldmVudC5i dXR0b24mND8yOjApKSk7cmV0dXJuIGV2ZW50O30scHJveHk6ZnVuY3Rpb24oZm4s cHJveHkpe3Byb3h5PXByb3h5fHxmdW5jdGlvbigpe3JldHVybiBmbi5hcHBseSh0 aGlzLGFyZ3VtZW50cyk7fTtwcm94eS5ndWlkPWZuLmd1aWQ9Zm4uZ3VpZHx8cHJv eHkuZ3VpZHx8dGhpcy5ndWlkKys7cmV0dXJuIHByb3h5O30sc3BlY2lhbDp7cmVh ZHk6e3NldHVwOmJpbmRSZWFkeSx0ZWFyZG93bjpmdW5jdGlvbigpe319fSxzcGVj aWFsQWxsOntsaXZlOntzZXR1cDpmdW5jdGlvbihzZWxlY3RvcixuYW1lc3BhY2Vz KXtqUXVlcnkuZXZlbnQuYWRkKHRoaXMsbmFtZXNwYWNlc1swXSxsaXZlSGFuZGxl cik7fSx0ZWFyZG93bjpmdW5jdGlvbihuYW1lc3BhY2VzKXtpZihuYW1lc3BhY2Vz Lmxlbmd0aCl7dmFyIHJlbW92ZT0wLG5hbWU9UmVnRXhwKCIoXnxcXC4pIituYW1l c3BhY2VzWzBdKyIoXFwufCQpIik7alF1ZXJ5LmVhY2goKGpRdWVyeS5kYXRhKHRo aXMsImV2ZW50cyIpLmxpdmV8fHt9KSxmdW5jdGlvbigpe2lmKG5hbWUudGVzdCh0 aGlzLnR5cGUpKQpyZW1vdmUrKzt9KTtpZihyZW1vdmU8MSkKalF1ZXJ5LmV2ZW50 LnJlbW92ZSh0aGlzLG5hbWVzcGFjZXNbMF0sbGl2ZUhhbmRsZXIpO319fX19O2pR dWVyeS5FdmVudD1mdW5jdGlvbihzcmMpe2lmKCF0aGlzLnByZXZlbnREZWZhdWx0 KQpyZXR1cm4gbmV3IGpRdWVyeS5FdmVudChzcmMpO2lmKHNyYyYmc3JjLnR5cGUp e3RoaXMub3JpZ2luYWxFdmVudD1zcmM7dGhpcy50eXBlPXNyYy50eXBlO31lbHNl CnRoaXMudHlwZT1zcmM7dGhpcy50aW1lU3RhbXA9bm93KCk7dGhpc1tleHBhbmRv XT10cnVlO307ZnVuY3Rpb24gcmV0dXJuRmFsc2UoKXtyZXR1cm4gZmFsc2U7fQpm dW5jdGlvbiByZXR1cm5UcnVlKCl7cmV0dXJuIHRydWU7fQpqUXVlcnkuRXZlbnQu cHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZh dWx0UHJldmVudGVkPXJldHVyblRydWU7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50 O2lmKCFlKQpyZXR1cm47aWYoZS5wcmV2ZW50RGVmYXVsdCkKZS5wcmV2ZW50RGVm YXVsdCgpO2UucmV0dXJuVmFsdWU9ZmFsc2U7fSxzdG9wUHJvcGFnYXRpb246ZnVu Y3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXJldHVyblRydWU7dmFy IGU9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKCFlKQpyZXR1cm47aWYoZS5zdG9wUHJv cGFnYXRpb24pCmUuc3RvcFByb3BhZ2F0aW9uKCk7ZS5jYW5jZWxCdWJibGU9dHJ1 ZTt9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJ bW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9cmV0dXJuVHJ1ZTt0aGlzLnN0b3BQ cm9wYWdhdGlvbigpO30saXNEZWZhdWx0UHJldmVudGVkOnJldHVybkZhbHNlLGlz UHJvcGFnYXRpb25TdG9wcGVkOnJldHVybkZhbHNlLGlzSW1tZWRpYXRlUHJvcGFn YXRpb25TdG9wcGVkOnJldHVybkZhbHNlfTt2YXIgd2l0aGluRWxlbWVudD1mdW5j dGlvbihldmVudCl7dmFyIHBhcmVudD1ldmVudC5yZWxhdGVkVGFyZ2V0O3doaWxl KHBhcmVudCYmcGFyZW50IT10aGlzKQp0cnl7cGFyZW50PXBhcmVudC5wYXJlbnRO b2RlO30KY2F0Y2goZSl7cGFyZW50PXRoaXM7fQppZihwYXJlbnQhPXRoaXMpe2V2 ZW50LnR5cGU9ZXZlbnQuZGF0YTtqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KHRo aXMsYXJndW1lbnRzKTt9fTtqUXVlcnkuZWFjaCh7bW91c2VvdmVyOidtb3VzZWVu dGVyJyxtb3VzZW91dDonbW91c2VsZWF2ZSd9LGZ1bmN0aW9uKG9yaWcsZml4KXtq UXVlcnkuZXZlbnQuc3BlY2lhbFtmaXhdPXtzZXR1cDpmdW5jdGlvbigpe2pRdWVy eS5ldmVudC5hZGQodGhpcyxvcmlnLHdpdGhpbkVsZW1lbnQsZml4KTt9LHRlYXJk b3duOmZ1bmN0aW9uKCl7alF1ZXJ5LmV2ZW50LnJlbW92ZSh0aGlzLG9yaWcsd2l0 aGluRWxlbWVudCk7fX07fSk7alF1ZXJ5LmZuLmV4dGVuZCh7YmluZDpmdW5jdGlv bih0eXBlLGRhdGEsZm4pe3JldHVybiB0eXBlPT0idW5sb2FkIj90aGlzLm9uZSh0 eXBlLGRhdGEsZm4pOnRoaXMuZWFjaChmdW5jdGlvbigpe2pRdWVyeS5ldmVudC5h ZGQodGhpcyx0eXBlLGZufHxkYXRhLGZuJiZkYXRhKTt9KTt9LG9uZTpmdW5jdGlv bih0eXBlLGRhdGEsZm4pe3ZhciBvbmU9alF1ZXJ5LmV2ZW50LnByb3h5KGZufHxk YXRhLGZ1bmN0aW9uKGV2ZW50KXtqUXVlcnkodGhpcykudW5iaW5kKGV2ZW50LG9u ZSk7cmV0dXJuKGZufHxkYXRhKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSk7cmV0 dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2pRdWVyeS5ldmVudC5hZGQodGhpcyx0 eXBlLG9uZSxmbiYmZGF0YSk7fSk7fSx1bmJpbmQ6ZnVuY3Rpb24odHlwZSxmbil7 cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2pRdWVyeS5ldmVudC5yZW1vdmUo dGhpcyx0eXBlLGZuKTt9KTt9LHRyaWdnZXI6ZnVuY3Rpb24odHlwZSxkYXRhKXty ZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7alF1ZXJ5LmV2ZW50LnRyaWdnZXIo dHlwZSxkYXRhLHRoaXMpO30pO30sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24odHlw ZSxkYXRhKXtpZih0aGlzWzBdKXt2YXIgZXZlbnQ9alF1ZXJ5LkV2ZW50KHR5cGUp O2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7 alF1ZXJ5LmV2ZW50LnRyaWdnZXIoZXZlbnQsZGF0YSx0aGlzWzBdKTtyZXR1cm4g ZXZlbnQucmVzdWx0O319LHRvZ2dsZTpmdW5jdGlvbihmbil7dmFyIGFyZ3M9YXJn dW1lbnRzLGk9MTt3aGlsZShpPGFyZ3MubGVuZ3RoKQpqUXVlcnkuZXZlbnQucHJv eHkoZm4sYXJnc1tpKytdKTtyZXR1cm4gdGhpcy5jbGljayhqUXVlcnkuZXZlbnQu cHJveHkoZm4sZnVuY3Rpb24oZXZlbnQpe3RoaXMubGFzdFRvZ2dsZT0odGhpcy5s YXN0VG9nZ2xlfHwwKSVpO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGFy Z3NbdGhpcy5sYXN0VG9nZ2xlKytdLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ZmFs c2U7fSkpO30saG92ZXI6ZnVuY3Rpb24oZm5PdmVyLGZuT3V0KXtyZXR1cm4gdGhp cy5tb3VzZWVudGVyKGZuT3ZlcikubW91c2VsZWF2ZShmbk91dCk7fSxyZWFkeTpm dW5jdGlvbihmbil7YmluZFJlYWR5KCk7aWYoalF1ZXJ5LmlzUmVhZHkpCmZuLmNh bGwoZG9jdW1lbnQsalF1ZXJ5KTtlbHNlCmpRdWVyeS5yZWFkeUxpc3QucHVzaChm bik7cmV0dXJuIHRoaXM7fSxsaXZlOmZ1bmN0aW9uKHR5cGUsZm4pe3ZhciBwcm94 eT1qUXVlcnkuZXZlbnQucHJveHkoZm4pO3Byb3h5Lmd1aWQrPXRoaXMuc2VsZWN0 b3IrdHlwZTtqUXVlcnkoZG9jdW1lbnQpLmJpbmQobGl2ZUNvbnZlcnQodHlwZSx0 aGlzLnNlbGVjdG9yKSx0aGlzLnNlbGVjdG9yLHByb3h5KTtyZXR1cm4gdGhpczt9 LGRpZTpmdW5jdGlvbih0eXBlLGZuKXtqUXVlcnkoZG9jdW1lbnQpLnVuYmluZChs aXZlQ29udmVydCh0eXBlLHRoaXMuc2VsZWN0b3IpLGZuP3tndWlkOmZuLmd1aWQr dGhpcy5zZWxlY3Rvcit0eXBlfTpudWxsKTtyZXR1cm4gdGhpczt9fSk7ZnVuY3Rp b24gbGl2ZUhhbmRsZXIoZXZlbnQpe3ZhciBjaGVjaz1SZWdFeHAoIihefFxcLiki K2V2ZW50LnR5cGUrIihcXC58JCkiKSxzdG9wPXRydWUsZWxlbXM9W107alF1ZXJ5 LmVhY2goalF1ZXJ5LmRhdGEodGhpcywiZXZlbnRzIikubGl2ZXx8W10sZnVuY3Rp b24oaSxmbil7aWYoY2hlY2sudGVzdChmbi50eXBlKSl7dmFyIGVsZW09alF1ZXJ5 KGV2ZW50LnRhcmdldCkuY2xvc2VzdChmbi5kYXRhKVswXTtpZihlbGVtKQplbGVt cy5wdXNoKHtlbGVtOmVsZW0sZm46Zm59KTt9fSk7ZWxlbXMuc29ydChmdW5jdGlv bihhLGIpe3JldHVybiBqUXVlcnkuZGF0YShhLmVsZW0sImNsb3Nlc3QiKS1qUXVl cnkuZGF0YShiLmVsZW0sImNsb3Nlc3QiKTt9KTtqUXVlcnkuZWFjaChlbGVtcyxm dW5jdGlvbigpe2lmKHRoaXMuZm4uY2FsbCh0aGlzLmVsZW0sZXZlbnQsdGhpcy5m bi5kYXRhKT09PWZhbHNlKQpyZXR1cm4oc3RvcD1mYWxzZSk7fSk7cmV0dXJuIHN0 b3A7fQpmdW5jdGlvbiBsaXZlQ29udmVydCh0eXBlLHNlbGVjdG9yKXtyZXR1cm5b ImxpdmUiLHR5cGUsc2VsZWN0b3IucmVwbGFjZSgvXC4vZywiYCIpLnJlcGxhY2Uo LyAvZywifCIpXS5qb2luKCIuIik7fQpqUXVlcnkuZXh0ZW5kKHtpc1JlYWR5OmZh bHNlLHJlYWR5TGlzdDpbXSxyZWFkeTpmdW5jdGlvbigpe2lmKCFqUXVlcnkuaXNS ZWFkeSl7alF1ZXJ5LmlzUmVhZHk9dHJ1ZTtpZihqUXVlcnkucmVhZHlMaXN0KXtq UXVlcnkuZWFjaChqUXVlcnkucmVhZHlMaXN0LGZ1bmN0aW9uKCl7dGhpcy5jYWxs KGRvY3VtZW50LGpRdWVyeSk7fSk7alF1ZXJ5LnJlYWR5TGlzdD1udWxsO30KalF1 ZXJ5KGRvY3VtZW50KS50cmlnZ2VySGFuZGxlcigicmVhZHkiKTt9fX0pO3ZhciBy ZWFkeUJvdW5kPWZhbHNlO2Z1bmN0aW9uIGJpbmRSZWFkeSgpe2lmKHJlYWR5Qm91 bmQpcmV0dXJuO3JlYWR5Qm91bmQ9dHJ1ZTtpZihkb2N1bWVudC5hZGRFdmVudExp c3RlbmVyKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9h ZGVkIixmdW5jdGlvbigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRP TUNvbnRlbnRMb2FkZWQiLGFyZ3VtZW50cy5jYWxsZWUsZmFsc2UpO2pRdWVyeS5y ZWFkeSgpO30sZmFsc2UpO31lbHNlIGlmKGRvY3VtZW50LmF0dGFjaEV2ZW50KXtk b2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixmdW5jdGlv bigpe2lmKGRvY3VtZW50LnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXtkb2N1bWVu dC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixhcmd1bWVudHMuY2Fs bGVlKTtqUXVlcnkucmVhZHkoKTt9fSk7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVt ZW50LmRvU2Nyb2xsJiZ3aW5kb3c9PXdpbmRvdy50b3ApKGZ1bmN0aW9uKCl7aWYo alF1ZXJ5LmlzUmVhZHkpcmV0dXJuO3RyeXtkb2N1bWVudC5kb2N1bWVudEVsZW1l bnQuZG9TY3JvbGwoImxlZnQiKTt9Y2F0Y2goZXJyb3Ipe3NldFRpbWVvdXQoYXJn dW1lbnRzLmNhbGxlZSwwKTtyZXR1cm47fQpqUXVlcnkucmVhZHkoKTt9KSgpO30K alF1ZXJ5LmV2ZW50LmFkZCh3aW5kb3csImxvYWQiLGpRdWVyeS5yZWFkeSk7fQpq UXVlcnkuZWFjaCgoImJsdXIsZm9jdXMsbG9hZCxyZXNpemUsc2Nyb2xsLHVubG9h ZCxjbGljayxkYmxjbGljaywiKyJtb3VzZWRvd24sbW91c2V1cCxtb3VzZW1vdmUs bW91c2VvdmVyLG1vdXNlb3V0LG1vdXNlZW50ZXIsbW91c2VsZWF2ZSwiKyJjaGFu Z2Usc2VsZWN0LHN1Ym1pdCxrZXlkb3duLGtleXByZXNzLGtleXVwLGVycm9yIiku c3BsaXQoIiwiKSxmdW5jdGlvbihpLG5hbWUpe2pRdWVyeS5mbltuYW1lXT1mdW5j dGlvbihmbil7cmV0dXJuIGZuP3RoaXMuYmluZChuYW1lLGZuKTp0aGlzLnRyaWdn ZXIobmFtZSk7fTt9KTtqUXVlcnkod2luZG93KS5iaW5kKCd1bmxvYWQnLGZ1bmN0 aW9uKCl7Zm9yKHZhciBpZCBpbiBqUXVlcnkuY2FjaGUpCmlmKGlkIT0xJiZqUXVl cnkuY2FjaGVbaWRdLmhhbmRsZSkKalF1ZXJ5LmV2ZW50LnJlbW92ZShqUXVlcnku Y2FjaGVbaWRdLmhhbmRsZS5lbGVtKTt9KTsoZnVuY3Rpb24oKXtqUXVlcnkuc3Vw cG9ydD17fTt2YXIgcm9vdD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsc2NyaXB0 PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGRpdj1kb2N1bWVudC5j cmVhdGVFbGVtZW50KCJkaXYiKSxpZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRp bWUoKTtkaXYuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZGl2LmlubmVySFRNTD0nICAg PGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Ii9hIiBzdHlsZT0iY29sb3I6 cmVkO2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTsiPmE8L2E+PHNlbGVjdD48b3B0aW9u PnRleHQ8L29wdGlvbj48L3NlbGVjdD48b2JqZWN0PjxwYXJhbS8+PC9vYmplY3Q+ Jzt2YXIgYWxsPWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLGE9ZGl2Lmdl dEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWFsbHx8IWFsbC5sZW5ndGh8 fCFhKXtyZXR1cm47fQpqUXVlcnkuc3VwcG9ydD17bGVhZGluZ1doaXRlc3BhY2U6 ZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGU9PTMsdGJvZHk6IWRpdi5nZXRFbGVtZW50 c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsb2JqZWN0QWxsOiEhZGl2LmdldEVs ZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXS5nZXRFbGVtZW50c0J5VGFnTmFt ZSgiKiIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhZGl2LmdldEVsZW1lbnRzQnlU YWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi9yZWQvLnRlc3QoYS5nZXRBdHRy aWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOmEuZ2V0QXR0cmlidXRlKCJo cmVmIik9PT0iL2EiLG9wYWNpdHk6YS5zdHlsZS5vcGFjaXR5PT09IjAuNSIsY3Nz RmxvYXQ6ISFhLnN0eWxlLmNzc0Zsb2F0LHNjcmlwdEV2YWw6ZmFsc2Usbm9DbG9u ZUV2ZW50OnRydWUsYm94TW9kZWw6bnVsbH07c2NyaXB0LnR5cGU9InRleHQvamF2 YXNjcmlwdCI7dHJ5e3NjcmlwdC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVU ZXh0Tm9kZSgid2luZG93LiIraWQrIj0xOyIpKTt9Y2F0Y2goZSl7fQpyb290Lmlu c2VydEJlZm9yZShzY3JpcHQscm9vdC5maXJzdENoaWxkKTtpZih3aW5kb3dbaWRd KXtqUXVlcnkuc3VwcG9ydC5zY3JpcHRFdmFsPXRydWU7ZGVsZXRlIHdpbmRvd1tp ZF07fQpyb290LnJlbW92ZUNoaWxkKHNjcmlwdCk7aWYoZGl2LmF0dGFjaEV2ZW50 JiZkaXYuZmlyZUV2ZW50KXtkaXYuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0 aW9uKCl7alF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50PWZhbHNlO2Rpdi5kZXRh Y2hFdmVudCgib25jbGljayIsYXJndW1lbnRzLmNhbGxlZSk7fSk7ZGl2LmNsb25l Tm9kZSh0cnVlKS5maXJlRXZlbnQoIm9uY2xpY2siKTt9CmpRdWVyeShmdW5jdGlv bigpe3ZhciBkaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZGl2LnN0 eWxlLndpZHRoPWRpdi5zdHlsZS5wYWRkaW5nTGVmdD0iMXB4Ijtkb2N1bWVudC5i b2R5LmFwcGVuZENoaWxkKGRpdik7alF1ZXJ5LmJveE1vZGVsPWpRdWVyeS5zdXBw b3J0LmJveE1vZGVsPWRpdi5vZmZzZXRXaWR0aD09PTI7ZG9jdW1lbnQuYm9keS5y ZW1vdmVDaGlsZChkaXYpLnN0eWxlLmRpc3BsYXk9J25vbmUnO30pO30pKCk7dmFy IHN0eWxlRmxvYXQ9alF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQ/ImNzc0Zsb2F0Ijoi c3R5bGVGbG9hdCI7alF1ZXJ5LnByb3BzPXsiZm9yIjoiaHRtbEZvciIsImNsYXNz IjoiY2xhc3NOYW1lIiwiZmxvYXQiOnN0eWxlRmxvYXQsY3NzRmxvYXQ6c3R5bGVG bG9hdCxzdHlsZUZsb2F0OnN0eWxlRmxvYXQscmVhZG9ubHk6InJlYWRPbmx5Iixt YXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixy b3dzcGFuOiJyb3dTcGFuIix0YWJpbmRleDoidGFiSW5kZXgifTtqUXVlcnkuZm4u ZXh0ZW5kKHtfbG9hZDpqUXVlcnkuZm4ubG9hZCxsb2FkOmZ1bmN0aW9uKHVybCxw YXJhbXMsY2FsbGJhY2spe2lmKHR5cGVvZiB1cmwhPT0ic3RyaW5nIikKcmV0dXJu IHRoaXMuX2xvYWQodXJsKTt2YXIgb2ZmPXVybC5pbmRleE9mKCIgIik7aWYob2Zm Pj0wKXt2YXIgc2VsZWN0b3I9dXJsLnNsaWNlKG9mZix1cmwubGVuZ3RoKTt1cmw9 dXJsLnNsaWNlKDAsb2ZmKTt9CnZhciB0eXBlPSJHRVQiO2lmKHBhcmFtcykKaWYo alF1ZXJ5LmlzRnVuY3Rpb24ocGFyYW1zKSl7Y2FsbGJhY2s9cGFyYW1zO3BhcmFt cz1udWxsO31lbHNlIGlmKHR5cGVvZiBwYXJhbXM9PT0ib2JqZWN0Iil7cGFyYW1z PWpRdWVyeS5wYXJhbShwYXJhbXMpO3R5cGU9IlBPU1QiO30KdmFyIHNlbGY9dGhp cztqUXVlcnkuYWpheCh7dXJsOnVybCx0eXBlOnR5cGUsZGF0YVR5cGU6Imh0bWwi LGRhdGE6cGFyYW1zLGNvbXBsZXRlOmZ1bmN0aW9uKHJlcyxzdGF0dXMpe2lmKHN0 YXR1cz09InN1Y2Nlc3MifHxzdGF0dXM9PSJub3Rtb2RpZmllZCIpCnNlbGYuaHRt bChzZWxlY3Rvcj9qUXVlcnkoIjxkaXYvPiIpLmFwcGVuZChyZXMucmVzcG9uc2VU ZXh0LnJlcGxhY2UoLzxzY3JpcHQoLnxccykqP1wvc2NyaXB0Pi9nLCIiKSkuZmlu ZChzZWxlY3Rvcik6cmVzLnJlc3BvbnNlVGV4dCk7aWYoY2FsbGJhY2spCnNlbGYu ZWFjaChjYWxsYmFjayxbcmVzLnJlc3BvbnNlVGV4dCxzdGF0dXMscmVzXSk7fX0p O3JldHVybiB0aGlzO30sc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGpRdWVy eS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpO30sc2VyaWFsaXplQXJyYXk6 ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhp cy5lbGVtZW50cz9qUXVlcnkubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXM7 fSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlz YWJsZWQmJih0aGlzLmNoZWNrZWR8fC9zZWxlY3R8dGV4dGFyZWEvaS50ZXN0KHRo aXMubm9kZU5hbWUpfHwvdGV4dHxoaWRkZW58cGFzc3dvcmR8c2VhcmNoL2kudGVz dCh0aGlzLnR5cGUpKTt9KS5tYXAoZnVuY3Rpb24oaSxlbGVtKXt2YXIgdmFsPWpR dWVyeSh0aGlzKS52YWwoKTtyZXR1cm4gdmFsPT1udWxsP251bGw6alF1ZXJ5Lmlz QXJyYXkodmFsKT9qUXVlcnkubWFwKHZhbCxmdW5jdGlvbih2YWwsaSl7cmV0dXJu e25hbWU6ZWxlbS5uYW1lLHZhbHVlOnZhbH07fSk6e25hbWU6ZWxlbS5uYW1lLHZh bHVlOnZhbH07fSkuZ2V0KCk7fX0pO2pRdWVyeS5lYWNoKCJhamF4U3RhcnQsYWph eFN0b3AsYWpheENvbXBsZXRlLGFqYXhFcnJvcixhamF4U3VjY2VzcyxhamF4U2Vu ZCIuc3BsaXQoIiwiKSxmdW5jdGlvbihpLG8pe2pRdWVyeS5mbltvXT1mdW5jdGlv bihmKXtyZXR1cm4gdGhpcy5iaW5kKG8sZik7fTt9KTt2YXIganNjPW5vdygpO2pR dWVyeS5leHRlbmQoe2dldDpmdW5jdGlvbih1cmwsZGF0YSxjYWxsYmFjayx0eXBl KXtpZihqUXVlcnkuaXNGdW5jdGlvbihkYXRhKSl7Y2FsbGJhY2s9ZGF0YTtkYXRh PW51bGw7fQpyZXR1cm4galF1ZXJ5LmFqYXgoe3R5cGU6IkdFVCIsdXJsOnVybCxk YXRhOmRhdGEsc3VjY2VzczpjYWxsYmFjayxkYXRhVHlwZTp0eXBlfSk7fSxnZXRT Y3JpcHQ6ZnVuY3Rpb24odXJsLGNhbGxiYWNrKXtyZXR1cm4galF1ZXJ5LmdldCh1 cmwsbnVsbCxjYWxsYmFjaywic2NyaXB0Iik7fSxnZXRKU09OOmZ1bmN0aW9uKHVy bCxkYXRhLGNhbGxiYWNrKXtyZXR1cm4galF1ZXJ5LmdldCh1cmwsZGF0YSxjYWxs YmFjaywianNvbiIpO30scG9zdDpmdW5jdGlvbih1cmwsZGF0YSxjYWxsYmFjayx0 eXBlKXtpZihqUXVlcnkuaXNGdW5jdGlvbihkYXRhKSl7Y2FsbGJhY2s9ZGF0YTtk YXRhPXt9O30KcmV0dXJuIGpRdWVyeS5hamF4KHt0eXBlOiJQT1NUIix1cmw6dXJs LGRhdGE6ZGF0YSxzdWNjZXNzOmNhbGxiYWNrLGRhdGFUeXBlOnR5cGV9KTt9LGFq YXhTZXR1cDpmdW5jdGlvbihzZXR0aW5ncyl7alF1ZXJ5LmV4dGVuZChqUXVlcnku YWpheFNldHRpbmdzLHNldHRpbmdzKTt9LGFqYXhTZXR0aW5nczp7dXJsOmxvY2F0 aW9uLmhyZWYsZ2xvYmFsOnRydWUsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBw bGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTp0cnVl LGFzeW5jOnRydWUseGhyOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5BY3RpdmVY T2JqZWN0P25ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOm5l dyBYTUxIdHRwUmVxdWVzdCgpO30sYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94 bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHNjcmlwdDoidGV4dC9qYXZh c2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iixqc29uOiJhcHBsaWNhdGlv bi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLHRleHQ6InRleHQvcGxhaW4iLF9kZWZh dWx0OiIqLyoifX0sbGFzdE1vZGlmaWVkOnt9LGFqYXg6ZnVuY3Rpb24ocyl7cz1q UXVlcnkuZXh0ZW5kKHRydWUscyxqUXVlcnkuZXh0ZW5kKHRydWUse30salF1ZXJ5 LmFqYXhTZXR0aW5ncyxzKSk7dmFyIGpzb25wLGpzcmU9Lz1cPygmfCQpL2csc3Rh dHVzLGRhdGEsdHlwZT1zLnR5cGUudG9VcHBlckNhc2UoKTtpZihzLmRhdGEmJnMu cHJvY2Vzc0RhdGEmJnR5cGVvZiBzLmRhdGEhPT0ic3RyaW5nIikKcy5kYXRhPWpR dWVyeS5wYXJhbShzLmRhdGEpO2lmKHMuZGF0YVR5cGU9PSJqc29ucCIpe2lmKHR5 cGU9PSJHRVQiKXtpZighcy51cmwubWF0Y2goanNyZSkpCnMudXJsKz0ocy51cmwu bWF0Y2goL1w/Lyk/IiYiOiI/IikrKHMuanNvbnB8fCJjYWxsYmFjayIpKyI9PyI7 fWVsc2UgaWYoIXMuZGF0YXx8IXMuZGF0YS5tYXRjaChqc3JlKSkKcy5kYXRhPShz LmRhdGE/cy5kYXRhKyImIjoiIikrKHMuanNvbnB8fCJjYWxsYmFjayIpKyI9PyI7 cy5kYXRhVHlwZT0ianNvbiI7fQppZihzLmRhdGFUeXBlPT0ianNvbiImJihzLmRh dGEmJnMuZGF0YS5tYXRjaChqc3JlKXx8cy51cmwubWF0Y2goanNyZSkpKXtqc29u cD0ianNvbnAiK2pzYysrO2lmKHMuZGF0YSkKcy5kYXRhPShzLmRhdGErIiIpLnJl cGxhY2UoanNyZSwiPSIranNvbnArIiQxIik7cy51cmw9cy51cmwucmVwbGFjZShq c3JlLCI9Iitqc29ucCsiJDEiKTtzLmRhdGFUeXBlPSJzY3JpcHQiO3dpbmRvd1tq c29ucF09ZnVuY3Rpb24odG1wKXtkYXRhPXRtcDtzdWNjZXNzKCk7Y29tcGxldGUo KTt3aW5kb3dbanNvbnBdPXVuZGVmaW5lZDt0cnl7ZGVsZXRlIHdpbmRvd1tqc29u cF07fWNhdGNoKGUpe30KaWYoaGVhZCkKaGVhZC5yZW1vdmVDaGlsZChzY3JpcHQp O307fQppZihzLmRhdGFUeXBlPT0ic2NyaXB0IiYmcy5jYWNoZT09bnVsbCkKcy5j YWNoZT1mYWxzZTtpZihzLmNhY2hlPT09ZmFsc2UmJnR5cGU9PSJHRVQiKXt2YXIg dHM9bm93KCk7dmFyIHJldD1zLnVybC5yZXBsYWNlKC8oXD98JilfPS4qPygmfCQp LywiJDFfPSIrdHMrIiQyIik7cy51cmw9cmV0KygocmV0PT1zLnVybCk/KHMudXJs Lm1hdGNoKC9cPy8pPyImIjoiPyIpKyJfPSIrdHM6IiIpO30KaWYocy5kYXRhJiZ0 eXBlPT0iR0VUIil7cy51cmwrPShzLnVybC5tYXRjaCgvXD8vKT8iJiI6Ij8iKStz LmRhdGE7cy5kYXRhPW51bGw7fQppZihzLmdsb2JhbCYmIWpRdWVyeS5hY3RpdmUr KykKalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO3ZhciBwYXJ0cz0v Xihcdys6KT9cL1wvKFteXC8/I10rKS8uZXhlYyhzLnVybCk7aWYocy5kYXRhVHlw ZT09InNjcmlwdCImJnR5cGU9PSJHRVQiJiZwYXJ0cyYmKHBhcnRzWzFdJiZwYXJ0 c1sxXSE9bG9jYXRpb24ucHJvdG9jb2x8fHBhcnRzWzJdIT1sb2NhdGlvbi5ob3N0 KSl7dmFyIGhlYWQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQi KVswXTt2YXIgc2NyaXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIp O3NjcmlwdC5zcmM9cy51cmw7aWYocy5zY3JpcHRDaGFyc2V0KQpzY3JpcHQuY2hh cnNldD1zLnNjcmlwdENoYXJzZXQ7aWYoIWpzb25wKXt2YXIgZG9uZT1mYWxzZTtz Y3JpcHQub25sb2FkPXNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24o KXtpZighZG9uZSYmKCF0aGlzLnJlYWR5U3RhdGV8fHRoaXMucmVhZHlTdGF0ZT09 ImxvYWRlZCJ8fHRoaXMucmVhZHlTdGF0ZT09ImNvbXBsZXRlIikpe2RvbmU9dHJ1 ZTtzdWNjZXNzKCk7Y29tcGxldGUoKTtzY3JpcHQub25sb2FkPXNjcmlwdC5vbnJl YWR5c3RhdGVjaGFuZ2U9bnVsbDtoZWFkLnJlbW92ZUNoaWxkKHNjcmlwdCk7fX07 fQpoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7cmV0dXJuIHVuZGVmaW5lZDt9CnZh ciByZXF1ZXN0RG9uZT1mYWxzZTt2YXIgeGhyPXMueGhyKCk7aWYocy51c2VybmFt ZSkKeGhyLm9wZW4odHlwZSxzLnVybCxzLmFzeW5jLHMudXNlcm5hbWUscy5wYXNz d29yZCk7ZWxzZQp4aHIub3Blbih0eXBlLHMudXJsLHMuYXN5bmMpO3RyeXtpZihz LmRhdGEpCnhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHMuY29u dGVudFR5cGUpO2lmKHMuaWZNb2RpZmllZCkKeGhyLnNldFJlcXVlc3RIZWFkZXIo IklmLU1vZGlmaWVkLVNpbmNlIixqUXVlcnkubGFzdE1vZGlmaWVkW3MudXJsXXx8 IlRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIik7eGhyLnNldFJlcXVlc3RI ZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCJYTUxIdHRwUmVxdWVzdCIpO3hoci5z ZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHMuZGF0YVR5cGUmJnMuYWNjZXB0c1tz LmRhdGFUeXBlXT9zLmFjY2VwdHNbcy5kYXRhVHlwZV0rIiwgKi8qIjpzLmFjY2Vw dHMuX2RlZmF1bHQpO31jYXRjaChlKXt9CmlmKHMuYmVmb3JlU2VuZCYmcy5iZWZv cmVTZW5kKHhocixzKT09PWZhbHNlKXtpZihzLmdsb2JhbCYmIS0talF1ZXJ5LmFj dGl2ZSkKalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIik7eGhyLmFib3J0 KCk7cmV0dXJuIGZhbHNlO30KaWYocy5nbG9iYWwpCmpRdWVyeS5ldmVudC50cmln Z2VyKCJhamF4U2VuZCIsW3hocixzXSk7dmFyIG9ucmVhZHlzdGF0ZWNoYW5nZT1m dW5jdGlvbihpc1RpbWVvdXQpe2lmKHhoci5yZWFkeVN0YXRlPT0wKXtpZihpdmFs KXtjbGVhckludGVydmFsKGl2YWwpO2l2YWw9bnVsbDtpZihzLmdsb2JhbCYmIS0t alF1ZXJ5LmFjdGl2ZSkKalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIik7 fX1lbHNlIGlmKCFyZXF1ZXN0RG9uZSYmeGhyJiYoeGhyLnJlYWR5U3RhdGU9PTR8 fGlzVGltZW91dD09InRpbWVvdXQiKSl7cmVxdWVzdERvbmU9dHJ1ZTtpZihpdmFs KXtjbGVhckludGVydmFsKGl2YWwpO2l2YWw9bnVsbDt9CnN0YXR1cz1pc1RpbWVv dXQ9PSJ0aW1lb3V0Ij8idGltZW91dCI6IWpRdWVyeS5odHRwU3VjY2Vzcyh4aHIp PyJlcnJvciI6cy5pZk1vZGlmaWVkJiZqUXVlcnkuaHR0cE5vdE1vZGlmaWVkKHho cixzLnVybCk/Im5vdG1vZGlmaWVkIjoic3VjY2VzcyI7aWYoc3RhdHVzPT0ic3Vj Y2VzcyIpe3RyeXtkYXRhPWpRdWVyeS5odHRwRGF0YSh4aHIscy5kYXRhVHlwZSxz KTt9Y2F0Y2goZSl7c3RhdHVzPSJwYXJzZXJlcnJvciI7fX0KaWYoc3RhdHVzPT0i c3VjY2VzcyIpe3ZhciBtb2RSZXM7dHJ5e21vZFJlcz14aHIuZ2V0UmVzcG9uc2VI ZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTt9Y2F0Y2goZSl7fQppZihzLmlmTW9kaWZp ZWQmJm1vZFJlcykKalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF09bW9kUmVzO2lm KCFqc29ucCkKc3VjY2VzcygpO31lbHNlCmpRdWVyeS5oYW5kbGVFcnJvcihzLHho cixzdGF0dXMpO2NvbXBsZXRlKCk7aWYoaXNUaW1lb3V0KQp4aHIuYWJvcnQoKTtp ZihzLmFzeW5jKQp4aHI9bnVsbDt9fTtpZihzLmFzeW5jKXt2YXIgaXZhbD1zZXRJ bnRlcnZhbChvbnJlYWR5c3RhdGVjaGFuZ2UsMTMpO2lmKHMudGltZW91dD4wKQpz ZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoeGhyJiYhcmVxdWVzdERvbmUpCm9ucmVh ZHlzdGF0ZWNoYW5nZSgidGltZW91dCIpO30scy50aW1lb3V0KTt9CnRyeXt4aHIu c2VuZChzLmRhdGEpO31jYXRjaChlKXtqUXVlcnkuaGFuZGxlRXJyb3Iocyx4aHIs bnVsbCxlKTt9CmlmKCFzLmFzeW5jKQpvbnJlYWR5c3RhdGVjaGFuZ2UoKTtmdW5j dGlvbiBzdWNjZXNzKCl7aWYocy5zdWNjZXNzKQpzLnN1Y2Nlc3MoZGF0YSxzdGF0 dXMpO2lmKHMuZ2xvYmFsKQpqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFN1Y2Nl c3MiLFt4aHIsc10pO30KZnVuY3Rpb24gY29tcGxldGUoKXtpZihzLmNvbXBsZXRl KQpzLmNvbXBsZXRlKHhocixzdGF0dXMpO2lmKHMuZ2xvYmFsKQpqUXVlcnkuZXZl bnQudHJpZ2dlcigiYWpheENvbXBsZXRlIixbeGhyLHNdKTtpZihzLmdsb2JhbCYm IS0talF1ZXJ5LmFjdGl2ZSkKalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9w Iik7fQpyZXR1cm4geGhyO30saGFuZGxlRXJyb3I6ZnVuY3Rpb24ocyx4aHIsc3Rh dHVzLGUpe2lmKHMuZXJyb3Ipcy5lcnJvcih4aHIsc3RhdHVzLGUpO2lmKHMuZ2xv YmFsKQpqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheEVycm9yIixbeGhyLHMsZV0p O30sYWN0aXZlOjAsaHR0cFN1Y2Nlc3M6ZnVuY3Rpb24oeGhyKXt0cnl7cmV0dXJu IXhoci5zdGF0dXMmJmxvY2F0aW9uLnByb3RvY29sPT0iZmlsZToifHwoeGhyLnN0 YXR1cz49MjAwJiZ4aHIuc3RhdHVzPDMwMCl8fHhoci5zdGF0dXM9PTMwNHx8eGhy LnN0YXR1cz09MTIyMzt9Y2F0Y2goZSl7fQpyZXR1cm4gZmFsc2U7fSxodHRwTm90 TW9kaWZpZWQ6ZnVuY3Rpb24oeGhyLHVybCl7dHJ5e3ZhciB4aHJSZXM9eGhyLmdl dFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7cmV0dXJuIHhoci5zdGF0 dXM9PTMwNHx8eGhyUmVzPT1qUXVlcnkubGFzdE1vZGlmaWVkW3VybF07fWNhdGNo KGUpe30KcmV0dXJuIGZhbHNlO30saHR0cERhdGE6ZnVuY3Rpb24oeGhyLHR5cGUs cyl7dmFyIGN0PXhoci5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIiks eG1sPXR5cGU9PSJ4bWwifHwhdHlwZSYmY3QmJmN0LmluZGV4T2YoInhtbCIpPj0w LGRhdGE9eG1sP3hoci5yZXNwb25zZVhNTDp4aHIucmVzcG9uc2VUZXh0O2lmKHht bCYmZGF0YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZT09InBhcnNlcmVycm9yIikK dGhyb3cicGFyc2VyZXJyb3IiO2lmKHMmJnMuZGF0YUZpbHRlcikKZGF0YT1zLmRh dGFGaWx0ZXIoZGF0YSx0eXBlKTtpZih0eXBlb2YgZGF0YT09PSJzdHJpbmciKXtp Zih0eXBlPT0ic2NyaXB0IikKalF1ZXJ5Lmdsb2JhbEV2YWwoZGF0YSk7aWYodHlw ZT09Impzb24iKQpkYXRhPXdpbmRvd1siZXZhbCJdKCIoIitkYXRhKyIpIik7fQpy ZXR1cm4gZGF0YTt9LHBhcmFtOmZ1bmN0aW9uKGEpe3ZhciBzPVtdO2Z1bmN0aW9u IGFkZChrZXksdmFsdWUpe3Nbcy5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChr ZXkpKyc9JytlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO307aWYoalF1ZXJ5Lmlz QXJyYXkoYSl8fGEuanF1ZXJ5KQpqUXVlcnkuZWFjaChhLGZ1bmN0aW9uKCl7YWRk KHRoaXMubmFtZSx0aGlzLnZhbHVlKTt9KTtlbHNlCmZvcih2YXIgaiBpbiBhKQpp ZihqUXVlcnkuaXNBcnJheShhW2pdKSkKalF1ZXJ5LmVhY2goYVtqXSxmdW5jdGlv bigpe2FkZChqLHRoaXMpO30pO2Vsc2UKYWRkKGosalF1ZXJ5LmlzRnVuY3Rpb24o YVtqXSk/YVtqXSgpOmFbal0pO3JldHVybiBzLmpvaW4oIiYiKS5yZXBsYWNlKC8l MjAvZywiKyIpO319KTt2YXIgZWxlbWRpc3BsYXk9e30sdGltZXJJZCxmeEF0dHJz PVtbImhlaWdodCIsIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSIsInBhZGRpbmdU b3AiLCJwYWRkaW5nQm90dG9tIl0sWyJ3aWR0aCIsIm1hcmdpbkxlZnQiLCJtYXJn aW5SaWdodCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Il0sWyJvcGFjaXR5 Il1dO2Z1bmN0aW9uIGdlbkZ4KHR5cGUsbnVtKXt2YXIgb2JqPXt9O2pRdWVyeS5l YWNoKGZ4QXR0cnMuY29uY2F0LmFwcGx5KFtdLGZ4QXR0cnMuc2xpY2UoMCxudW0p KSxmdW5jdGlvbigpe29ialt0aGlzXT10eXBlO30pO3JldHVybiBvYmo7fQpqUXVl cnkuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXtpZihz cGVlZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShnZW5GeCgic2hvdyIsMyksc3BlZWQs Y2FsbGJhY2spO31lbHNle2Zvcih2YXIgaT0wLGw9dGhpcy5sZW5ndGg7aTxsO2kr Kyl7dmFyIG9sZD1qUXVlcnkuZGF0YSh0aGlzW2ldLCJvbGRkaXNwbGF5Iik7dGhp c1tpXS5zdHlsZS5kaXNwbGF5PW9sZHx8IiI7aWYoalF1ZXJ5LmNzcyh0aGlzW2ld LCJkaXNwbGF5Iik9PT0ibm9uZSIpe3ZhciB0YWdOYW1lPXRoaXNbaV0udGFnTmFt ZSxkaXNwbGF5O2lmKGVsZW1kaXNwbGF5W3RhZ05hbWVdKXtkaXNwbGF5PWVsZW1k aXNwbGF5W3RhZ05hbWVdO31lbHNle3ZhciBlbGVtPWpRdWVyeSgiPCIrdGFnTmFt ZSsiIC8+IikuYXBwZW5kVG8oImJvZHkiKTtkaXNwbGF5PWVsZW0uY3NzKCJkaXNw bGF5Iik7aWYoZGlzcGxheT09PSJub25lIikKZGlzcGxheT0iYmxvY2siO2VsZW0u cmVtb3ZlKCk7ZWxlbWRpc3BsYXlbdGFnTmFtZV09ZGlzcGxheTt9CmpRdWVyeS5k YXRhKHRoaXNbaV0sIm9sZGRpc3BsYXkiLGRpc3BsYXkpO319CmZvcih2YXIgaT0w LGw9dGhpcy5sZW5ndGg7aTxsO2krKyl7dGhpc1tpXS5zdHlsZS5kaXNwbGF5PWpR dWVyeS5kYXRhKHRoaXNbaV0sIm9sZGRpc3BsYXkiKXx8IiI7fQpyZXR1cm4gdGhp czt9fSxoaWRlOmZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXtpZihzcGVlZCl7cmV0 dXJuIHRoaXMuYW5pbWF0ZShnZW5GeCgiaGlkZSIsMyksc3BlZWQsY2FsbGJhY2sp O31lbHNle2Zvcih2YXIgaT0wLGw9dGhpcy5sZW5ndGg7aTxsO2krKyl7dmFyIG9s ZD1qUXVlcnkuZGF0YSh0aGlzW2ldLCJvbGRkaXNwbGF5Iik7aWYoIW9sZCYmb2xk IT09Im5vbmUiKQpqUXVlcnkuZGF0YSh0aGlzW2ldLCJvbGRkaXNwbGF5IixqUXVl cnkuY3NzKHRoaXNbaV0sImRpc3BsYXkiKSk7fQpmb3IodmFyIGk9MCxsPXRoaXMu bGVuZ3RoO2k8bDtpKyspe3RoaXNbaV0uc3R5bGUuZGlzcGxheT0ibm9uZSI7fQpy ZXR1cm4gdGhpczt9fSxfdG9nZ2xlOmpRdWVyeS5mbi50b2dnbGUsdG9nZ2xlOmZ1 bmN0aW9uKGZuLGZuMil7dmFyIGJvb2w9dHlwZW9mIGZuPT09ImJvb2xlYW4iO3Jl dHVybiBqUXVlcnkuaXNGdW5jdGlvbihmbikmJmpRdWVyeS5pc0Z1bmN0aW9uKGZu Mik/dGhpcy5fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpmbj09bnVsbHx8 Ym9vbD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgc3RhdGU9Ym9vbD9mbjpqUXVl cnkodGhpcykuaXMoIjpoaWRkZW4iKTtqUXVlcnkodGhpcylbc3RhdGU/InNob3ci OiJoaWRlIl0oKTt9KTp0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsMyksZm4s Zm4yKTt9LGZhZGVUbzpmdW5jdGlvbihzcGVlZCx0byxjYWxsYmFjayl7cmV0dXJu IHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTp0b30sc3BlZWQsY2FsbGJhY2spO30sYW5p bWF0ZTpmdW5jdGlvbihwcm9wLHNwZWVkLGVhc2luZyxjYWxsYmFjayl7dmFyIG9w dGFsbD1qUXVlcnkuc3BlZWQoc3BlZWQsZWFzaW5nLGNhbGxiYWNrKTtyZXR1cm4g dGhpc1tvcHRhbGwucXVldWU9PT1mYWxzZT8iZWFjaCI6InF1ZXVlIl0oZnVuY3Rp b24oKXt2YXIgb3B0PWpRdWVyeS5leHRlbmQoe30sb3B0YWxsKSxwLGhpZGRlbj10 aGlzLm5vZGVUeXBlPT0xJiZqUXVlcnkodGhpcykuaXMoIjpoaWRkZW4iKSxzZWxm PXRoaXM7Zm9yKHAgaW4gcHJvcCl7aWYocHJvcFtwXT09ImhpZGUiJiZoaWRkZW58 fHByb3BbcF09PSJzaG93IiYmIWhpZGRlbikKcmV0dXJuIG9wdC5jb21wbGV0ZS5j YWxsKHRoaXMpO2lmKChwPT0iaGVpZ2h0Inx8cD09IndpZHRoIikmJnRoaXMuc3R5 bGUpe29wdC5kaXNwbGF5PWpRdWVyeS5jc3ModGhpcywiZGlzcGxheSIpO29wdC5v dmVyZmxvdz10aGlzLnN0eWxlLm92ZXJmbG93O319CmlmKG9wdC5vdmVyZmxvdyE9 bnVsbCkKdGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtvcHQuY3VyQW5pbT1q UXVlcnkuZXh0ZW5kKHt9LHByb3ApO2pRdWVyeS5lYWNoKHByb3AsZnVuY3Rpb24o bmFtZSx2YWwpe3ZhciBlPW5ldyBqUXVlcnkuZngoc2VsZixvcHQsbmFtZSk7aWYo L3RvZ2dsZXxzaG93fGhpZGUvLnRlc3QodmFsKSkKZVt2YWw9PSJ0b2dnbGUiP2hp ZGRlbj8ic2hvdyI6ImhpZGUiOnZhbF0ocHJvcCk7ZWxzZXt2YXIgcGFydHM9dmFs LnRvU3RyaW5nKCkubWF0Y2goL14oWystXT0pPyhbXGQrLS5dKykoLiopJC8pLHN0 YXJ0PWUuY3VyKHRydWUpfHwwO2lmKHBhcnRzKXt2YXIgZW5kPXBhcnNlRmxvYXQo cGFydHNbMl0pLHVuaXQ9cGFydHNbM118fCJweCI7aWYodW5pdCE9InB4Iil7c2Vs Zi5zdHlsZVtuYW1lXT0oZW5kfHwxKSt1bml0O3N0YXJ0PSgoZW5kfHwxKS9lLmN1 cih0cnVlKSkqc3RhcnQ7c2VsZi5zdHlsZVtuYW1lXT1zdGFydCt1bml0O30KaWYo cGFydHNbMV0pCmVuZD0oKHBhcnRzWzFdPT0iLT0iPy0xOjEpKmVuZCkrc3RhcnQ7 ZS5jdXN0b20oc3RhcnQsZW5kLHVuaXQpO31lbHNlCmUuY3VzdG9tKHN0YXJ0LHZh bCwiIik7fX0pO3JldHVybiB0cnVlO30pO30sc3RvcDpmdW5jdGlvbihjbGVhclF1 ZXVlLGdvdG9FbmQpe3ZhciB0aW1lcnM9alF1ZXJ5LnRpbWVycztpZihjbGVhclF1 ZXVlKQp0aGlzLnF1ZXVlKFtdKTt0aGlzLmVhY2goZnVuY3Rpb24oKXtmb3IodmFy IGk9dGltZXJzLmxlbmd0aC0xO2k+PTA7aS0tKQppZih0aW1lcnNbaV0uZWxlbT09 dGhpcyl7aWYoZ290b0VuZCkKdGltZXJzW2ldKHRydWUpO3RpbWVycy5zcGxpY2Uo aSwxKTt9fSk7aWYoIWdvdG9FbmQpCnRoaXMuZGVxdWV1ZSgpO3JldHVybiB0aGlz O319KTtqUXVlcnkuZWFjaCh7c2xpZGVEb3duOmdlbkZ4KCJzaG93IiwxKSxzbGlk ZVVwOmdlbkZ4KCJoaWRlIiwxKSxzbGlkZVRvZ2dsZTpnZW5GeCgidG9nZ2xlIiwx KSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRl In19LGZ1bmN0aW9uKG5hbWUscHJvcHMpe2pRdWVyeS5mbltuYW1lXT1mdW5jdGlv bihzcGVlZCxjYWxsYmFjayl7cmV0dXJuIHRoaXMuYW5pbWF0ZShwcm9wcyxzcGVl ZCxjYWxsYmFjayk7fTt9KTtqUXVlcnkuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihz cGVlZCxlYXNpbmcsZm4pe3ZhciBvcHQ9dHlwZW9mIHNwZWVkPT09Im9iamVjdCI/ c3BlZWQ6e2NvbXBsZXRlOmZufHwhZm4mJmVhc2luZ3x8alF1ZXJ5LmlzRnVuY3Rp b24oc3BlZWQpJiZzcGVlZCxkdXJhdGlvbjpzcGVlZCxlYXNpbmc6Zm4mJmVhc2lu Z3x8ZWFzaW5nJiYhalF1ZXJ5LmlzRnVuY3Rpb24oZWFzaW5nKSYmZWFzaW5nfTtv cHQuZHVyYXRpb249alF1ZXJ5LmZ4Lm9mZj8wOnR5cGVvZiBvcHQuZHVyYXRpb249 PT0ibnVtYmVyIj9vcHQuZHVyYXRpb246alF1ZXJ5LmZ4LnNwZWVkc1tvcHQuZHVy YXRpb25dfHxqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O29wdC5vbGQ9b3B0LmNv bXBsZXRlO29wdC5jb21wbGV0ZT1mdW5jdGlvbigpe2lmKG9wdC5xdWV1ZSE9PWZh bHNlKQpqUXVlcnkodGhpcykuZGVxdWV1ZSgpO2lmKGpRdWVyeS5pc0Z1bmN0aW9u KG9wdC5vbGQpKQpvcHQub2xkLmNhbGwodGhpcyk7fTtyZXR1cm4gb3B0O30sZWFz aW5nOntsaW5lYXI6ZnVuY3Rpb24ocCxuLGZpcnN0TnVtLGRpZmYpe3JldHVybiBm aXJzdE51bStkaWZmKnA7fSxzd2luZzpmdW5jdGlvbihwLG4sZmlyc3ROdW0sZGlm Zil7cmV0dXJuKCgtTWF0aC5jb3MocCpNYXRoLlBJKS8yKSswLjUpKmRpZmYrZmly c3ROdW07fX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGVsZW0sb3B0aW9ucyxwcm9w KXt0aGlzLm9wdGlvbnM9b3B0aW9uczt0aGlzLmVsZW09ZWxlbTt0aGlzLnByb3A9 cHJvcDtpZighb3B0aW9ucy5vcmlnKQpvcHRpb25zLm9yaWc9e307fX0pO2pRdWVy eS5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9u cy5zdGVwKQp0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5v dyx0aGlzKTsoalF1ZXJ5LmZ4LnN0ZXBbdGhpcy5wcm9wXXx8alF1ZXJ5LmZ4LnN0 ZXAuX2RlZmF1bHQpKHRoaXMpO2lmKCh0aGlzLnByb3A9PSJoZWlnaHQifHx0aGlz LnByb3A9PSJ3aWR0aCIpJiZ0aGlzLmVsZW0uc3R5bGUpCnRoaXMuZWxlbS5zdHls ZS5kaXNwbGF5PSJibG9jayI7fSxjdXI6ZnVuY3Rpb24oZm9yY2Upe2lmKHRoaXMu ZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5l bGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKQpyZXR1cm4gdGhpcy5lbGVtW3Ro aXMucHJvcF07dmFyIHI9cGFyc2VGbG9hdChqUXVlcnkuY3NzKHRoaXMuZWxlbSx0 aGlzLnByb3AsZm9yY2UpKTtyZXR1cm4gciYmcj4tMTAwMDA/cjpwYXJzZUZsb2F0 KGpRdWVyeS5jdXJDU1ModGhpcy5lbGVtLHRoaXMucHJvcCkpfHwwO30sY3VzdG9t OmZ1bmN0aW9uKGZyb20sdG8sdW5pdCl7dGhpcy5zdGFydFRpbWU9bm93KCk7dGhp cy5zdGFydD1mcm9tO3RoaXMuZW5kPXRvO3RoaXMudW5pdD11bml0fHx0aGlzLnVu aXR8fCJweCI7dGhpcy5ub3c9dGhpcy5zdGFydDt0aGlzLnBvcz10aGlzLnN0YXRl PTA7dmFyIHNlbGY9dGhpcztmdW5jdGlvbiB0KGdvdG9FbmQpe3JldHVybiBzZWxm LnN0ZXAoZ290b0VuZCk7fQp0LmVsZW09dGhpcy5lbGVtO2lmKHQoKSYmalF1ZXJ5 LnRpbWVycy5wdXNoKHQpJiYhdGltZXJJZCl7dGltZXJJZD1zZXRJbnRlcnZhbChm dW5jdGlvbigpe3ZhciB0aW1lcnM9alF1ZXJ5LnRpbWVycztmb3IodmFyIGk9MDtp PHRpbWVycy5sZW5ndGg7aSsrKQppZighdGltZXJzW2ldKCkpCnRpbWVycy5zcGxp Y2UoaS0tLDEpO2lmKCF0aW1lcnMubGVuZ3RoKXtjbGVhckludGVydmFsKHRpbWVy SWQpO3RpbWVySWQ9dW5kZWZpbmVkO319LDEzKTt9fSxzaG93OmZ1bmN0aW9uKCl7 dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1qUXVlcnkuYXR0cih0aGlzLmVs ZW0uc3R5bGUsdGhpcy5wcm9wKTt0aGlzLm9wdGlvbnMuc2hvdz10cnVlO3RoaXMu Y3VzdG9tKHRoaXMucHJvcD09IndpZHRoInx8dGhpcy5wcm9wPT0iaGVpZ2h0Ij8x OjAsdGhpcy5jdXIoKSk7alF1ZXJ5KHRoaXMuZWxlbSkuc2hvdygpO30saGlkZTpm dW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09alF1ZXJ5LmF0 dHIodGhpcy5lbGVtLnN0eWxlLHRoaXMucHJvcCk7dGhpcy5vcHRpb25zLmhpZGU9 dHJ1ZTt0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApO30sc3RlcDpmdW5jdGlvbihn b3RvRW5kKXt2YXIgdD1ub3coKTtpZihnb3RvRW5kfHx0Pj10aGlzLm9wdGlvbnMu ZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kO3RoaXMu cG9zPXRoaXMuc3RhdGU9MTt0aGlzLnVwZGF0ZSgpO3RoaXMub3B0aW9ucy5jdXJB bmltW3RoaXMucHJvcF09dHJ1ZTt2YXIgZG9uZT10cnVlO2Zvcih2YXIgaSBpbiB0 aGlzLm9wdGlvbnMuY3VyQW5pbSkKaWYodGhpcy5vcHRpb25zLmN1ckFuaW1baV0h PT10cnVlKQpkb25lPWZhbHNlO2lmKGRvbmUpe2lmKHRoaXMub3B0aW9ucy5kaXNw bGF5IT1udWxsKXt0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3c9dGhpcy5vcHRpb25z Lm92ZXJmbG93O3RoaXMuZWxlbS5zdHlsZS5kaXNwbGF5PXRoaXMub3B0aW9ucy5k aXNwbGF5O2lmKGpRdWVyeS5jc3ModGhpcy5lbGVtLCJkaXNwbGF5Iik9PSJub25l IikKdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt9CmlmKHRoaXMub3B0 aW9ucy5oaWRlKQpqUXVlcnkodGhpcy5lbGVtKS5oaWRlKCk7aWYodGhpcy5vcHRp b25zLmhpZGV8fHRoaXMub3B0aW9ucy5zaG93KQpmb3IodmFyIHAgaW4gdGhpcy5v cHRpb25zLmN1ckFuaW0pCmpRdWVyeS5hdHRyKHRoaXMuZWxlbS5zdHlsZSxwLHRo aXMub3B0aW9ucy5vcmlnW3BdKTt0aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCh0 aGlzLmVsZW0pO30KcmV0dXJuIGZhbHNlO31lbHNle3ZhciBuPXQtdGhpcy5zdGFy dFRpbWU7dGhpcy5zdGF0ZT1uL3RoaXMub3B0aW9ucy5kdXJhdGlvbjt0aGlzLnBv cz1qUXVlcnkuZWFzaW5nW3RoaXMub3B0aW9ucy5lYXNpbmd8fChqUXVlcnkuZWFz aW5nLnN3aW5nPyJzd2luZyI6ImxpbmVhciIpXSh0aGlzLnN0YXRlLG4sMCwxLHRo aXMub3B0aW9ucy5kdXJhdGlvbik7dGhpcy5ub3c9dGhpcy5zdGFydCsoKHRoaXMu ZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zKTt0aGlzLnVwZGF0ZSgpO30KcmV0dXJu IHRydWU7fX07alF1ZXJ5LmV4dGVuZChqUXVlcnkuZngse3NwZWVkczp7c2xvdzo2 MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9u KGZ4KXtqUXVlcnkuYXR0cihmeC5lbGVtLnN0eWxlLCJvcGFjaXR5IixmeC5ub3cp O30sX2RlZmF1bHQ6ZnVuY3Rpb24oZngpe2lmKGZ4LmVsZW0uc3R5bGUmJmZ4LmVs ZW0uc3R5bGVbZngucHJvcF0hPW51bGwpCmZ4LmVsZW0uc3R5bGVbZngucHJvcF09 Zngubm93K2Z4LnVuaXQ7ZWxzZQpmeC5lbGVtW2Z4LnByb3BdPWZ4Lm5vdzt9fX0p O2lmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiZ2V0Qm91bmRpbmdDbGllbnRS ZWN0Il0pCmpRdWVyeS5mbi5vZmZzZXQ9ZnVuY3Rpb24oKXtpZighdGhpc1swXSly ZXR1cm57dG9wOjAsbGVmdDowfTtpZih0aGlzWzBdPT09dGhpc1swXS5vd25lckRv Y3VtZW50LmJvZHkpcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCh0aGlz WzBdKTt2YXIgYm94PXRoaXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZG9j PXRoaXNbMF0ub3duZXJEb2N1bWVudCxib2R5PWRvYy5ib2R5LGRvY0VsZW09ZG9j LmRvY3VtZW50RWxlbWVudCxjbGllbnRUb3A9ZG9jRWxlbS5jbGllbnRUb3B8fGJv ZHkuY2xpZW50VG9wfHwwLGNsaWVudExlZnQ9ZG9jRWxlbS5jbGllbnRMZWZ0fHxi b2R5LmNsaWVudExlZnR8fDAsdG9wPWJveC50b3ArKHNlbGYucGFnZVlPZmZzZXR8 fGpRdWVyeS5ib3hNb2RlbCYmZG9jRWxlbS5zY3JvbGxUb3B8fGJvZHkuc2Nyb2xs VG9wKS1jbGllbnRUb3AsbGVmdD1ib3gubGVmdCsoc2VsZi5wYWdlWE9mZnNldHx8 alF1ZXJ5LmJveE1vZGVsJiZkb2NFbGVtLnNjcm9sbExlZnR8fGJvZHkuc2Nyb2xs TGVmdCktY2xpZW50TGVmdDtyZXR1cm57dG9wOnRvcCxsZWZ0OmxlZnR9O307ZWxz ZQpqUXVlcnkuZm4ub2Zmc2V0PWZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJu e3RvcDowLGxlZnQ6MH07aWYodGhpc1swXT09PXRoaXNbMF0ub3duZXJEb2N1bWVu dC5ib2R5KXJldHVybiBqUXVlcnkub2Zmc2V0LmJvZHlPZmZzZXQodGhpc1swXSk7 alF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplZHx8alF1ZXJ5Lm9mZnNldC5pbml0aWFs aXplKCk7dmFyIGVsZW09dGhpc1swXSxvZmZzZXRQYXJlbnQ9ZWxlbS5vZmZzZXRQ YXJlbnQscHJldk9mZnNldFBhcmVudD1lbGVtLGRvYz1lbGVtLm93bmVyRG9jdW1l bnQsY29tcHV0ZWRTdHlsZSxkb2NFbGVtPWRvYy5kb2N1bWVudEVsZW1lbnQsYm9k eT1kb2MuYm9keSxkZWZhdWx0Vmlldz1kb2MuZGVmYXVsdFZpZXcscHJldkNvbXB1 dGVkU3R5bGU9ZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLG51bGwp LHRvcD1lbGVtLm9mZnNldFRvcCxsZWZ0PWVsZW0ub2Zmc2V0TGVmdDt3aGlsZSgo ZWxlbT1lbGVtLnBhcmVudE5vZGUpJiZlbGVtIT09Ym9keSYmZWxlbSE9PWRvY0Vs ZW0pe2NvbXB1dGVkU3R5bGU9ZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShl bGVtLG51bGwpO3RvcC09ZWxlbS5zY3JvbGxUb3AsbGVmdC09ZWxlbS5zY3JvbGxM ZWZ0O2lmKGVsZW09PT1vZmZzZXRQYXJlbnQpe3RvcCs9ZWxlbS5vZmZzZXRUb3As bGVmdCs9ZWxlbS5vZmZzZXRMZWZ0O2lmKGpRdWVyeS5vZmZzZXQuZG9lc05vdEFk ZEJvcmRlciYmIShqUXVlcnkub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFu ZENlbGxzJiYvXnQoYWJsZXxkfGgpJC9pLnRlc3QoZWxlbS50YWdOYW1lKSkpCnRv cCs9cGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwxMCl8fDAs bGVmdCs9cGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsMTAp fHwwO3ByZXZPZmZzZXRQYXJlbnQ9b2Zmc2V0UGFyZW50LG9mZnNldFBhcmVudD1l bGVtLm9mZnNldFBhcmVudDt9CmlmKGpRdWVyeS5vZmZzZXQuc3VidHJhY3RzQm9y ZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjb21wdXRlZFN0eWxlLm92ZXJmbG93 IT09InZpc2libGUiKQp0b3ArPXBhcnNlSW50KGNvbXB1dGVkU3R5bGUuYm9yZGVy VG9wV2lkdGgsMTApfHwwLGxlZnQrPXBhcnNlSW50KGNvbXB1dGVkU3R5bGUuYm9y ZGVyTGVmdFdpZHRoLDEwKXx8MDtwcmV2Q29tcHV0ZWRTdHlsZT1jb21wdXRlZFN0 eWxlO30KaWYocHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb249PT0icmVsYXRpdmUi fHxwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbj09PSJzdGF0aWMiKQp0b3ArPWJv ZHkub2Zmc2V0VG9wLGxlZnQrPWJvZHkub2Zmc2V0TGVmdDtpZihwcmV2Q29tcHV0 ZWRTdHlsZS5wb3NpdGlvbj09PSJmaXhlZCIpCnRvcCs9TWF0aC5tYXgoZG9jRWxl bS5zY3JvbGxUb3AsYm9keS5zY3JvbGxUb3ApLGxlZnQrPU1hdGgubWF4KGRvY0Vs ZW0uc2Nyb2xsTGVmdCxib2R5LnNjcm9sbExlZnQpO3JldHVybnt0b3A6dG9wLGxl ZnQ6bGVmdH07fTtqUXVlcnkub2Zmc2V0PXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7 aWYodGhpcy5pbml0aWFsaXplZClyZXR1cm47dmFyIGJvZHk9ZG9jdW1lbnQuYm9k eSxjb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksaW5uZXJE aXYsY2hlY2tEaXYsdGFibGUsdGQscnVsZXMscHJvcCxib2R5TWFyZ2luVG9wPWJv ZHkuc3R5bGUubWFyZ2luVG9wLGh0bWw9JzxkaXYgc3R5bGU9InBvc2l0aW9uOmFi c29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMw MDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyI+PGRpdj48L2Rpdj48 L2Rpdj48dGFibGUgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6 MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRo OjFweDtoZWlnaHQ6MXB4OyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIw Ij48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPic7cnVsZXM9e3Bvc2l0aW9uOidh YnNvbHV0ZScsdG9wOjAsbGVmdDowLG1hcmdpbjowLGJvcmRlcjowLHdpZHRoOicx cHgnLGhlaWdodDonMXB4Jyx2aXNpYmlsaXR5OidoaWRkZW4nfTtmb3IocHJvcCBp biBydWxlcyljb250YWluZXIuc3R5bGVbcHJvcF09cnVsZXNbcHJvcF07Y29udGFp bmVyLmlubmVySFRNTD1odG1sO2JvZHkuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lcixi b2R5LmZpcnN0Q2hpbGQpO2lubmVyRGl2PWNvbnRhaW5lci5maXJzdENoaWxkLGNo ZWNrRGl2PWlubmVyRGl2LmZpcnN0Q2hpbGQsdGQ9aW5uZXJEaXYubmV4dFNpYmxp bmcuZmlyc3RDaGlsZC5maXJzdENoaWxkO3RoaXMuZG9lc05vdEFkZEJvcmRlcj0o Y2hlY2tEaXYub2Zmc2V0VG9wIT09NSk7dGhpcy5kb2VzQWRkQm9yZGVyRm9yVGFi bGVBbmRDZWxscz0odGQub2Zmc2V0VG9wPT09NSk7aW5uZXJEaXYuc3R5bGUub3Zl cmZsb3c9J2hpZGRlbicsaW5uZXJEaXYuc3R5bGUucG9zaXRpb249J3JlbGF0aXZl Jzt0aGlzLnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZT0oY2hl Y2tEaXYub2Zmc2V0VG9wPT09LTUpO2JvZHkuc3R5bGUubWFyZ2luVG9wPScxcHgn O3RoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9KGJvZHkub2Zm c2V0VG9wPT09MCk7Ym9keS5zdHlsZS5tYXJnaW5Ub3A9Ym9keU1hcmdpblRvcDti b2R5LnJlbW92ZUNoaWxkKGNvbnRhaW5lcik7dGhpcy5pbml0aWFsaXplZD10cnVl O30sYm9keU9mZnNldDpmdW5jdGlvbihib2R5KXtqUXVlcnkub2Zmc2V0LmluaXRp YWxpemVkfHxqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgdG9wPWJvZHku b2Zmc2V0VG9wLGxlZnQ9Ym9keS5vZmZzZXRMZWZ0O2lmKGpRdWVyeS5vZmZzZXQu ZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQpCnRvcCs9cGFyc2VJbnQo alF1ZXJ5LmN1ckNTUyhib2R5LCdtYXJnaW5Ub3AnLHRydWUpLDEwKXx8MCxsZWZ0 Kz1wYXJzZUludChqUXVlcnkuY3VyQ1NTKGJvZHksJ21hcmdpbkxlZnQnLHRydWUp LDEwKXx8MDtyZXR1cm57dG9wOnRvcCxsZWZ0OmxlZnR9O319O2pRdWVyeS5mbi5l eHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGxlZnQ9MCx0b3A9MCxyZXN1 bHRzO2lmKHRoaXNbMF0pe3ZhciBvZmZzZXRQYXJlbnQ9dGhpcy5vZmZzZXRQYXJl bnQoKSxvZmZzZXQ9dGhpcy5vZmZzZXQoKSxwYXJlbnRPZmZzZXQ9L15ib2R5fGh0 bWwkL2kudGVzdChvZmZzZXRQYXJlbnRbMF0udGFnTmFtZSk/e3RvcDowLGxlZnQ6 MH06b2Zmc2V0UGFyZW50Lm9mZnNldCgpO29mZnNldC50b3AtPW51bSh0aGlzLCdt YXJnaW5Ub3AnKTtvZmZzZXQubGVmdC09bnVtKHRoaXMsJ21hcmdpbkxlZnQnKTtw YXJlbnRPZmZzZXQudG9wKz1udW0ob2Zmc2V0UGFyZW50LCdib3JkZXJUb3BXaWR0 aCcpO3BhcmVudE9mZnNldC5sZWZ0Kz1udW0ob2Zmc2V0UGFyZW50LCdib3JkZXJM ZWZ0V2lkdGgnKTtyZXN1bHRzPXt0b3A6b2Zmc2V0LnRvcC1wYXJlbnRPZmZzZXQu dG9wLGxlZnQ6b2Zmc2V0LmxlZnQtcGFyZW50T2Zmc2V0LmxlZnR9O30KcmV0dXJu IHJlc3VsdHM7fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXt2YXIgb2Zmc2V0UGFy ZW50PXRoaXNbMF0ub2Zmc2V0UGFyZW50fHxkb2N1bWVudC5ib2R5O3doaWxlKG9m ZnNldFBhcmVudCYmKCEvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNldFBhcmVudC50 YWdOYW1lKSYmalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnQsJ3Bvc2l0aW9uJyk9PSdz dGF0aWMnKSkKb2Zmc2V0UGFyZW50PW9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7 cmV0dXJuIGpRdWVyeShvZmZzZXRQYXJlbnQpO319KTtqUXVlcnkuZWFjaChbJ0xl ZnQnLCdUb3AnXSxmdW5jdGlvbihpLG5hbWUpe3ZhciBtZXRob2Q9J3Njcm9sbCcr bmFtZTtqUXVlcnkuZm5bbWV0aG9kXT1mdW5jdGlvbih2YWwpe2lmKCF0aGlzWzBd KXJldHVybiBudWxsO3JldHVybiB2YWwhPT11bmRlZmluZWQ/dGhpcy5lYWNoKGZ1 bmN0aW9uKCl7dGhpcz09d2luZG93fHx0aGlzPT1kb2N1bWVudD93aW5kb3cuc2Ny b2xsVG8oIWk/dmFsOmpRdWVyeSh3aW5kb3cpLnNjcm9sbExlZnQoKSxpP3ZhbDpq UXVlcnkod2luZG93KS5zY3JvbGxUb3AoKSk6dGhpc1ttZXRob2RdPXZhbDt9KTp0 aGlzWzBdPT13aW5kb3d8fHRoaXNbMF09PWRvY3VtZW50P3NlbGZbaT8ncGFnZVlP ZmZzZXQnOidwYWdlWE9mZnNldCddfHxqUXVlcnkuYm94TW9kZWwmJmRvY3VtZW50 LmRvY3VtZW50RWxlbWVudFttZXRob2RdfHxkb2N1bWVudC5ib2R5W21ldGhvZF06 dGhpc1swXVttZXRob2RdO307fSk7alF1ZXJ5LmVhY2goWyJIZWlnaHQiLCJXaWR0 aCJdLGZ1bmN0aW9uKGksbmFtZSl7dmFyIHRsPWk/IkxlZnQiOiJUb3AiLGJyPWk/ IlJpZ2h0IjoiQm90dG9tIixsb3dlcj1uYW1lLnRvTG93ZXJDYXNlKCk7alF1ZXJ5 LmZuWyJpbm5lciIrbmFtZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1swXT9qUXVl cnkuY3NzKHRoaXNbMF0sbG93ZXIsZmFsc2UsInBhZGRpbmciKTpudWxsO307alF1 ZXJ5LmZuWyJvdXRlciIrbmFtZV09ZnVuY3Rpb24obWFyZ2luKXtyZXR1cm4gdGhp c1swXT9qUXVlcnkuY3NzKHRoaXNbMF0sbG93ZXIsZmFsc2UsbWFyZ2luPyJtYXJn aW4iOiJib3JkZXIiKTpudWxsO307dmFyIHR5cGU9bmFtZS50b0xvd2VyQ2FzZSgp O2pRdWVyeS5mblt0eXBlXT1mdW5jdGlvbihzaXplKXtyZXR1cm4gdGhpc1swXT09 d2luZG93P2RvY3VtZW50LmNvbXBhdE1vZGU9PSJDU1MxQ29tcGF0IiYmZG9jdW1l bnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK25hbWVdfHxkb2N1bWVudC5ib2R5 WyJjbGllbnQiK25hbWVdOnRoaXNbMF09PWRvY3VtZW50P01hdGgubWF4KGRvY3Vt ZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IituYW1lXSxkb2N1bWVudC5ib2R5 WyJzY3JvbGwiK25hbWVdLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsic2Nyb2xs IituYW1lXSxkb2N1bWVudC5ib2R5WyJvZmZzZXQiK25hbWVdLGRvY3VtZW50LmRv Y3VtZW50RWxlbWVudFsib2Zmc2V0IituYW1lXSk6c2l6ZT09PXVuZGVmaW5lZD8o dGhpcy5sZW5ndGg/alF1ZXJ5LmNzcyh0aGlzWzBdLHR5cGUpOm51bGwpOnRoaXMu Y3NzKHR5cGUsdHlwZW9mIHNpemU9PT0ic3RyaW5nIj9zaXplOnNpemUrInB4Iik7 fTt9KTt9KSgpOztqUXVlcnkudWl8fChmdW5jdGlvbigkKXt2YXIgX3JlbW92ZT0k LmZuLnJlbW92ZSxpc0ZGMj0kLmJyb3dzZXIubW96aWxsYSYmKHBhcnNlRmxvYXQo JC5icm93c2VyLnZlcnNpb24pPDEuOSk7JC51aT17dmVyc2lvbjoiMS43LjIiLHBs dWdpbjp7YWRkOmZ1bmN0aW9uKG1vZHVsZSxvcHRpb24sc2V0KXt2YXIgcHJvdG89 JC51aVttb2R1bGVdLnByb3RvdHlwZTtmb3IodmFyIGkgaW4gc2V0KXtwcm90by5w bHVnaW5zW2ldPXByb3RvLnBsdWdpbnNbaV18fFtdO3Byb3RvLnBsdWdpbnNbaV0u cHVzaChbb3B0aW9uLHNldFtpXV0pO319LGNhbGw6ZnVuY3Rpb24oaW5zdGFuY2Us bmFtZSxhcmdzKXt2YXIgc2V0PWluc3RhbmNlLnBsdWdpbnNbbmFtZV07aWYoIXNl dHx8IWluc3RhbmNlLmVsZW1lbnRbMF0ucGFyZW50Tm9kZSl7cmV0dXJuO30KZm9y KHZhciBpPTA7aTxzZXQubGVuZ3RoO2krKyl7aWYoaW5zdGFuY2Uub3B0aW9uc1tz ZXRbaV1bMF1dKXtzZXRbaV1bMV0uYXBwbHkoaW5zdGFuY2UuZWxlbWVudCxhcmdz KTt9fX19LGNvbnRhaW5zOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGRvY3VtZW50LmNv bXBhcmVEb2N1bWVudFBvc2l0aW9uP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24o YikmMTY6YSE9PWImJmEuY29udGFpbnMoYik7fSxoYXNTY3JvbGw6ZnVuY3Rpb24o ZWwsYSl7aWYoJChlbCkuY3NzKCdvdmVyZmxvdycpPT0naGlkZGVuJyl7cmV0dXJu IGZhbHNlO30KdmFyIHNjcm9sbD0oYSYmYT09J2xlZnQnKT8nc2Nyb2xsTGVmdCc6 J3Njcm9sbFRvcCcsaGFzPWZhbHNlO2lmKGVsW3Njcm9sbF0+MCl7cmV0dXJuIHRy dWU7fQplbFtzY3JvbGxdPTE7aGFzPShlbFtzY3JvbGxdPjApO2VsW3Njcm9sbF09 MDtyZXR1cm4gaGFzO30saXNPdmVyQXhpczpmdW5jdGlvbih4LHJlZmVyZW5jZSxz aXplKXtyZXR1cm4oeD5yZWZlcmVuY2UpJiYoeDwocmVmZXJlbmNlK3NpemUpKTt9 LGlzT3ZlcjpmdW5jdGlvbih5LHgsdG9wLGxlZnQsaGVpZ2h0LHdpZHRoKXtyZXR1 cm4gJC51aS5pc092ZXJBeGlzKHksdG9wLGhlaWdodCkmJiQudWkuaXNPdmVyQXhp cyh4LGxlZnQsd2lkdGgpO30sa2V5Q29kZTp7QkFDS1NQQUNFOjgsQ0FQU19MT0NL OjIwLENPTU1BOjE4OCxDT05UUk9MOjE3LERFTEVURTo0NixET1dOOjQwLEVORDoz NSxFTlRFUjoxMyxFU0NBUEU6MjcsSE9NRTozNixJTlNFUlQ6NDUsTEVGVDozNyxO VU1QQURfQUREOjEwNyxOVU1QQURfREVDSU1BTDoxMTAsTlVNUEFEX0RJVklERTox MTEsTlVNUEFEX0VOVEVSOjEwOCxOVU1QQURfTVVMVElQTFk6MTA2LE5VTVBBRF9T VUJUUkFDVDoxMDksUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxS SUdIVDozOSxTSElGVDoxNixTUEFDRTozMixUQUI6OSxVUDozOH19O2lmKGlzRkYy KXt2YXIgYXR0cj0kLmF0dHIscmVtb3ZlQXR0cj0kLmZuLnJlbW92ZUF0dHIsYXJp YU5TPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA3L2FhYSIsYXJpYVN0YXRlPS9e YXJpYS0vLGFyaWFSb2xlPS9ed2Fpcm9sZTovOyQuYXR0cj1mdW5jdGlvbihlbGVt LG5hbWUsdmFsdWUpe3ZhciBzZXQ9dmFsdWUhPT11bmRlZmluZWQ7cmV0dXJuKG5h bWU9PSdyb2xlJz8oc2V0P2F0dHIuY2FsbCh0aGlzLGVsZW0sbmFtZSwid2Fpcm9s ZToiK3ZhbHVlKTooYXR0ci5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCIiKS5yZXBs YWNlKGFyaWFSb2xlLCIiKSk6KGFyaWFTdGF0ZS50ZXN0KG5hbWUpPyhzZXQ/ZWxl bS5zZXRBdHRyaWJ1dGVOUyhhcmlhTlMsbmFtZS5yZXBsYWNlKGFyaWFTdGF0ZSwi YWFhOiIpLHZhbHVlKTphdHRyLmNhbGwodGhpcyxlbGVtLG5hbWUucmVwbGFjZShh cmlhU3RhdGUsImFhYToiKSkpOmF0dHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKSk7 fTskLmZuLnJlbW92ZUF0dHI9ZnVuY3Rpb24obmFtZSl7cmV0dXJuKGFyaWFTdGF0 ZS50ZXN0KG5hbWUpP3RoaXMuZWFjaChmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0 cmlidXRlTlMoYXJpYU5TLG5hbWUucmVwbGFjZShhcmlhU3RhdGUsIiIpKTt9KTpy ZW1vdmVBdHRyLmNhbGwodGhpcyxuYW1lKSk7fTt9CiQuZm4uZXh0ZW5kKHtyZW1v dmU6ZnVuY3Rpb24oKXskKCIqIix0aGlzKS5hZGQodGhpcykuZWFjaChmdW5jdGlv bigpeyQodGhpcykudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpO30pO3JldHVybiBf cmVtb3ZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGVuYWJsZVNlbGVjdGlvbjpm dW5jdGlvbigpe3JldHVybiB0aGlzLmF0dHIoJ3Vuc2VsZWN0YWJsZScsJ29mZicp LmNzcygnTW96VXNlclNlbGVjdCcsJycpLnVuYmluZCgnc2VsZWN0c3RhcnQudWkn KTt9LGRpc2FibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hdHRy KCd1bnNlbGVjdGFibGUnLCdvbicpLmNzcygnTW96VXNlclNlbGVjdCcsJ25vbmUn KS5iaW5kKCdzZWxlY3RzdGFydC51aScsZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2U7 fSk7fSxzY3JvbGxQYXJlbnQ6ZnVuY3Rpb24oKXt2YXIgc2Nyb2xsUGFyZW50O2lm KCgkLmJyb3dzZXIubXNpZSYmKC8oc3RhdGljfHJlbGF0aXZlKS8pLnRlc3QodGhp cy5jc3MoJ3Bvc2l0aW9uJykpKXx8KC9hYnNvbHV0ZS8pLnRlc3QodGhpcy5jc3Mo J3Bvc2l0aW9uJykpKXtzY3JvbGxQYXJlbnQ9dGhpcy5wYXJlbnRzKCkuZmlsdGVy KGZ1bmN0aW9uKCl7cmV0dXJuKC8ocmVsYXRpdmV8YWJzb2x1dGV8Zml4ZWQpLyku dGVzdCgkLmN1ckNTUyh0aGlzLCdwb3NpdGlvbicsMSkpJiYoLyhhdXRvfHNjcm9s bCkvKS50ZXN0KCQuY3VyQ1NTKHRoaXMsJ292ZXJmbG93JywxKSskLmN1ckNTUyh0 aGlzLCdvdmVyZmxvdy15JywxKSskLmN1ckNTUyh0aGlzLCdvdmVyZmxvdy14Jywx KSk7fSkuZXEoMCk7fWVsc2V7c2Nyb2xsUGFyZW50PXRoaXMucGFyZW50cygpLmZp bHRlcihmdW5jdGlvbigpe3JldHVybigvKGF1dG98c2Nyb2xsKS8pLnRlc3QoJC5j dXJDU1ModGhpcywnb3ZlcmZsb3cnLDEpKyQuY3VyQ1NTKHRoaXMsJ292ZXJmbG93 LXknLDEpKyQuY3VyQ1NTKHRoaXMsJ292ZXJmbG93LXgnLDEpKTt9KS5lcSgwKTt9 CnJldHVybigvZml4ZWQvKS50ZXN0KHRoaXMuY3NzKCdwb3NpdGlvbicpKXx8IXNj cm9sbFBhcmVudC5sZW5ndGg/JChkb2N1bWVudCk6c2Nyb2xsUGFyZW50O319KTsk LmV4dGVuZCgkLmV4cHJbJzonXSx7ZGF0YTpmdW5jdGlvbihlbGVtLGksbWF0Y2gp e3JldHVybiEhJC5kYXRhKGVsZW0sbWF0Y2hbM10pO30sZm9jdXNhYmxlOmZ1bmN0 aW9uKGVsZW1lbnQpe3ZhciBub2RlTmFtZT1lbGVtZW50Lm5vZGVOYW1lLnRvTG93 ZXJDYXNlKCksdGFiSW5kZXg9JC5hdHRyKGVsZW1lbnQsJ3RhYmluZGV4Jyk7cmV0 dXJuKC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdC8udGVzdChu b2RlTmFtZSk/IWVsZW1lbnQuZGlzYWJsZWQ6J2EnPT1ub2RlTmFtZXx8J2FyZWEn PT1ub2RlTmFtZT9lbGVtZW50LmhyZWZ8fCFpc05hTih0YWJJbmRleCk6IWlzTmFO KHRhYkluZGV4KSkmJiEkKGVsZW1lbnQpWydhcmVhJz09bm9kZU5hbWU/J3BhcmVu dHMnOidjbG9zZXN0J10oJzpoaWRkZW4nKS5sZW5ndGg7fSx0YWJiYWJsZTpmdW5j dGlvbihlbGVtZW50KXt2YXIgdGFiSW5kZXg9JC5hdHRyKGVsZW1lbnQsJ3RhYmlu ZGV4Jyk7cmV0dXJuKGlzTmFOKHRhYkluZGV4KXx8dGFiSW5kZXg+PTApJiYkKGVs ZW1lbnQpLmlzKCc6Zm9jdXNhYmxlJyk7fX0pO2Z1bmN0aW9uIGdldHRlcihuYW1l c3BhY2UscGx1Z2luLG1ldGhvZCxhcmdzKXtmdW5jdGlvbiBnZXRNZXRob2RzKHR5 cGUpe3ZhciBtZXRob2RzPSRbbmFtZXNwYWNlXVtwbHVnaW5dW3R5cGVdfHxbXTty ZXR1cm4odHlwZW9mIG1ldGhvZHM9PSdzdHJpbmcnP21ldGhvZHMuc3BsaXQoLyw/ XHMrLyk6bWV0aG9kcyk7fQp2YXIgbWV0aG9kcz1nZXRNZXRob2RzKCdnZXR0ZXIn KTtpZihhcmdzLmxlbmd0aD09MSYmdHlwZW9mIGFyZ3NbMF09PSdzdHJpbmcnKXtt ZXRob2RzPW1ldGhvZHMuY29uY2F0KGdldE1ldGhvZHMoJ2dldHRlclNldHRlcicp KTt9CnJldHVybigkLmluQXJyYXkobWV0aG9kLG1ldGhvZHMpIT0tMSk7fQokLndp ZGdldD1mdW5jdGlvbihuYW1lLHByb3RvdHlwZSl7dmFyIG5hbWVzcGFjZT1uYW1l LnNwbGl0KCIuIilbMF07bmFtZT1uYW1lLnNwbGl0KCIuIilbMV07JC5mbltuYW1l XT1mdW5jdGlvbihvcHRpb25zKXt2YXIgaXNNZXRob2RDYWxsPSh0eXBlb2Ygb3B0 aW9ucz09J3N0cmluZycpLGFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwo YXJndW1lbnRzLDEpO2lmKGlzTWV0aG9kQ2FsbCYmb3B0aW9ucy5zdWJzdHJpbmco MCwxKT09J18nKXtyZXR1cm4gdGhpczt9CmlmKGlzTWV0aG9kQ2FsbCYmZ2V0dGVy KG5hbWVzcGFjZSxuYW1lLG9wdGlvbnMsYXJncykpe3ZhciBpbnN0YW5jZT0kLmRh dGEodGhpc1swXSxuYW1lKTtyZXR1cm4oaW5zdGFuY2U/aW5zdGFuY2Vbb3B0aW9u c10uYXBwbHkoaW5zdGFuY2UsYXJncyk6dW5kZWZpbmVkKTt9CnJldHVybiB0aGlz LmVhY2goZnVuY3Rpb24oKXt2YXIgaW5zdGFuY2U9JC5kYXRhKHRoaXMsbmFtZSk7 KCFpbnN0YW5jZSYmIWlzTWV0aG9kQ2FsbCYmJC5kYXRhKHRoaXMsbmFtZSxuZXcg JFtuYW1lc3BhY2VdW25hbWVdKHRoaXMsb3B0aW9ucykpLl9pbml0KCkpOyhpbnN0 YW5jZSYmaXNNZXRob2RDYWxsJiYkLmlzRnVuY3Rpb24oaW5zdGFuY2Vbb3B0aW9u c10pJiZpbnN0YW5jZVtvcHRpb25zXS5hcHBseShpbnN0YW5jZSxhcmdzKSk7fSk7 fTskW25hbWVzcGFjZV09JFtuYW1lc3BhY2VdfHx7fTskW25hbWVzcGFjZV1bbmFt ZV09ZnVuY3Rpb24oZWxlbWVudCxvcHRpb25zKXt2YXIgc2VsZj10aGlzO3RoaXMu bmFtZXNwYWNlPW5hbWVzcGFjZTt0aGlzLndpZGdldE5hbWU9bmFtZTt0aGlzLndp ZGdldEV2ZW50UHJlZml4PSRbbmFtZXNwYWNlXVtuYW1lXS5ldmVudFByZWZpeHx8 bmFtZTt0aGlzLndpZGdldEJhc2VDbGFzcz1uYW1lc3BhY2UrJy0nK25hbWU7dGhp cy5vcHRpb25zPSQuZXh0ZW5kKHt9LCQud2lkZ2V0LmRlZmF1bHRzLCRbbmFtZXNw YWNlXVtuYW1lXS5kZWZhdWx0cywkLm1ldGFkYXRhJiYkLm1ldGFkYXRhLmdldChl bGVtZW50KVtuYW1lXSxvcHRpb25zKTt0aGlzLmVsZW1lbnQ9JChlbGVtZW50KS5i aW5kKCdzZXREYXRhLicrbmFtZSxmdW5jdGlvbihldmVudCxrZXksdmFsdWUpe2lm KGV2ZW50LnRhcmdldD09ZWxlbWVudCl7cmV0dXJuIHNlbGYuX3NldERhdGEoa2V5 LHZhbHVlKTt9fSkuYmluZCgnZ2V0RGF0YS4nK25hbWUsZnVuY3Rpb24oZXZlbnQs a2V5KXtpZihldmVudC50YXJnZXQ9PWVsZW1lbnQpe3JldHVybiBzZWxmLl9nZXRE YXRhKGtleSk7fX0pLmJpbmQoJ3JlbW92ZScsZnVuY3Rpb24oKXtyZXR1cm4gc2Vs Zi5kZXN0cm95KCk7fSk7fTskW25hbWVzcGFjZV1bbmFtZV0ucHJvdG90eXBlPSQu ZXh0ZW5kKHt9LCQud2lkZ2V0LnByb3RvdHlwZSxwcm90b3R5cGUpOyRbbmFtZXNw YWNlXVtuYW1lXS5nZXR0ZXJTZXR0ZXI9J29wdGlvbic7fTskLndpZGdldC5wcm90 b3R5cGU9e19pbml0OmZ1bmN0aW9uKCl7fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhp cy5lbGVtZW50LnJlbW92ZURhdGEodGhpcy53aWRnZXROYW1lKS5yZW1vdmVDbGFz cyh0aGlzLndpZGdldEJhc2VDbGFzcysnLWRpc2FibGVkJysnICcrdGhpcy5uYW1l c3BhY2UrJy1zdGF0ZS1kaXNhYmxlZCcpLnJlbW92ZUF0dHIoJ2FyaWEtZGlzYWJs ZWQnKTt9LG9wdGlvbjpmdW5jdGlvbihrZXksdmFsdWUpe3ZhciBvcHRpb25zPWtl eSxzZWxmPXRoaXM7aWYodHlwZW9mIGtleT09InN0cmluZyIpe2lmKHZhbHVlPT09 dW5kZWZpbmVkKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YShrZXkpO30Kb3B0aW9ucz17 fTtvcHRpb25zW2tleV09dmFsdWU7fQokLmVhY2gob3B0aW9ucyxmdW5jdGlvbihr ZXksdmFsdWUpe3NlbGYuX3NldERhdGEoa2V5LHZhbHVlKTt9KTt9LF9nZXREYXRh OmZ1bmN0aW9uKGtleSl7cmV0dXJuIHRoaXMub3B0aW9uc1trZXldO30sX3NldERh dGE6ZnVuY3Rpb24oa2V5LHZhbHVlKXt0aGlzLm9wdGlvbnNba2V5XT12YWx1ZTtp ZihrZXk9PSdkaXNhYmxlZCcpe3RoaXMuZWxlbWVudApbdmFsdWU/J2FkZENsYXNz JzoncmVtb3ZlQ2xhc3MnXSh0aGlzLndpZGdldEJhc2VDbGFzcysnLWRpc2FibGVk JysnICcrCnRoaXMubmFtZXNwYWNlKyctc3RhdGUtZGlzYWJsZWQnKS5hdHRyKCJh cmlhLWRpc2FibGVkIix2YWx1ZSk7fX0sZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5f c2V0RGF0YSgnZGlzYWJsZWQnLGZhbHNlKTt9LGRpc2FibGU6ZnVuY3Rpb24oKXt0 aGlzLl9zZXREYXRhKCdkaXNhYmxlZCcsdHJ1ZSk7fSxfdHJpZ2dlcjpmdW5jdGlv bih0eXBlLGV2ZW50LGRhdGEpe3ZhciBjYWxsYmFjaz10aGlzLm9wdGlvbnNbdHlw ZV0sZXZlbnROYW1lPSh0eXBlPT10aGlzLndpZGdldEV2ZW50UHJlZml4P3R5cGU6 dGhpcy53aWRnZXRFdmVudFByZWZpeCt0eXBlKTtldmVudD0kLkV2ZW50KGV2ZW50 KTtldmVudC50eXBlPWV2ZW50TmFtZTtpZihldmVudC5vcmlnaW5hbEV2ZW50KXtm b3IodmFyIGk9JC5ldmVudC5wcm9wcy5sZW5ndGgscHJvcDtpOyl7cHJvcD0kLmV2 ZW50LnByb3BzWy0taV07ZXZlbnRbcHJvcF09ZXZlbnQub3JpZ2luYWxFdmVudFtw cm9wXTt9fQp0aGlzLmVsZW1lbnQudHJpZ2dlcihldmVudCxkYXRhKTtyZXR1cm4h KCQuaXNGdW5jdGlvbihjYWxsYmFjaykmJmNhbGxiYWNrLmNhbGwodGhpcy5lbGVt ZW50WzBdLGV2ZW50LGRhdGEpPT09ZmFsc2V8fGV2ZW50LmlzRGVmYXVsdFByZXZl bnRlZCgpKTt9fTskLndpZGdldC5kZWZhdWx0cz17ZGlzYWJsZWQ6ZmFsc2V9OyQu dWkubW91c2U9e19tb3VzZUluaXQ6ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3Ro aXMuZWxlbWVudC5iaW5kKCdtb3VzZWRvd24uJyt0aGlzLndpZGdldE5hbWUsZnVu Y3Rpb24oZXZlbnQpe3JldHVybiBzZWxmLl9tb3VzZURvd24oZXZlbnQpO30pLmJp bmQoJ2NsaWNrLicrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGV2ZW50KXtpZihz ZWxmLl9wcmV2ZW50Q2xpY2tFdmVudCl7c2VsZi5fcHJldmVudENsaWNrRXZlbnQ9 ZmFsc2U7ZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7cmV0dXJuIGZh bHNlO319KTtpZigkLmJyb3dzZXIubXNpZSl7dGhpcy5fbW91c2VVbnNlbGVjdGFi bGU9dGhpcy5lbGVtZW50LmF0dHIoJ3Vuc2VsZWN0YWJsZScpO3RoaXMuZWxlbWVu dC5hdHRyKCd1bnNlbGVjdGFibGUnLCdvbicpO30KdGhpcy5zdGFydGVkPWZhbHNl O30sX21vdXNlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC51bmJpbmQo Jy4nK3RoaXMud2lkZ2V0TmFtZSk7KCQuYnJvd3Nlci5tc2llJiZ0aGlzLmVsZW1l bnQuYXR0cigndW5zZWxlY3RhYmxlJyx0aGlzLl9tb3VzZVVuc2VsZWN0YWJsZSkp O30sX21vdXNlRG93bjpmdW5jdGlvbihldmVudCl7ZXZlbnQub3JpZ2luYWxFdmVu dD1ldmVudC5vcmlnaW5hbEV2ZW50fHx7fTtpZihldmVudC5vcmlnaW5hbEV2ZW50 Lm1vdXNlSGFuZGxlZCl7cmV0dXJuO30KKHRoaXMuX21vdXNlU3RhcnRlZCYmdGhp cy5fbW91c2VVcChldmVudCkpO3RoaXMuX21vdXNlRG93bkV2ZW50PWV2ZW50O3Zh ciBzZWxmPXRoaXMsYnRuSXNMZWZ0PShldmVudC53aGljaD09MSksZWxJc0NhbmNl bD0odHlwZW9mIHRoaXMub3B0aW9ucy5jYW5jZWw9PSJzdHJpbmciPyQoZXZlbnQu dGFyZ2V0KS5wYXJlbnRzKCkuYWRkKGV2ZW50LnRhcmdldCkuZmlsdGVyKHRoaXMu b3B0aW9ucy5jYW5jZWwpLmxlbmd0aDpmYWxzZSk7aWYoIWJ0bklzTGVmdHx8ZWxJ c0NhbmNlbHx8IXRoaXMuX21vdXNlQ2FwdHVyZShldmVudCkpe3JldHVybiB0cnVl O30KdGhpcy5tb3VzZURlbGF5TWV0PSF0aGlzLm9wdGlvbnMuZGVsYXk7aWYoIXRo aXMubW91c2VEZWxheU1ldCl7dGhpcy5fbW91c2VEZWxheVRpbWVyPXNldFRpbWVv dXQoZnVuY3Rpb24oKXtzZWxmLm1vdXNlRGVsYXlNZXQ9dHJ1ZTt9LHRoaXMub3B0 aW9ucy5kZWxheSk7fQppZih0aGlzLl9tb3VzZURpc3RhbmNlTWV0KGV2ZW50KSYm dGhpcy5fbW91c2VEZWxheU1ldChldmVudCkpe3RoaXMuX21vdXNlU3RhcnRlZD0o dGhpcy5fbW91c2VTdGFydChldmVudCkhPT1mYWxzZSk7aWYoIXRoaXMuX21vdXNl U3RhcnRlZCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm4gdHJ1ZTt9fQp0 aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1mdW5jdGlvbihldmVudCl7cmV0dXJuIHNl bGYuX21vdXNlTW92ZShldmVudCk7fTt0aGlzLl9tb3VzZVVwRGVsZWdhdGU9ZnVu Y3Rpb24oZXZlbnQpe3JldHVybiBzZWxmLl9tb3VzZVVwKGV2ZW50KTt9OyQoZG9j dW1lbnQpLmJpbmQoJ21vdXNlbW92ZS4nK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9t b3VzZU1vdmVEZWxlZ2F0ZSkuYmluZCgnbW91c2V1cC4nK3RoaXMud2lkZ2V0TmFt ZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpOygkLmJyb3dzZXIuc2FmYXJpfHxldmVu dC5wcmV2ZW50RGVmYXVsdCgpKTtldmVudC5vcmlnaW5hbEV2ZW50Lm1vdXNlSGFu ZGxlZD10cnVlO3JldHVybiB0cnVlO30sX21vdXNlTW92ZTpmdW5jdGlvbihldmVu dCl7aWYoJC5icm93c2VyLm1zaWUmJiFldmVudC5idXR0b24pe3JldHVybiB0aGlz Ll9tb3VzZVVwKGV2ZW50KTt9CmlmKHRoaXMuX21vdXNlU3RhcnRlZCl7dGhpcy5f bW91c2VEcmFnKGV2ZW50KTtyZXR1cm4gZXZlbnQucHJldmVudERlZmF1bHQoKTt9 CmlmKHRoaXMuX21vdXNlRGlzdGFuY2VNZXQoZXZlbnQpJiZ0aGlzLl9tb3VzZURl bGF5TWV0KGV2ZW50KSl7dGhpcy5fbW91c2VTdGFydGVkPSh0aGlzLl9tb3VzZVN0 YXJ0KHRoaXMuX21vdXNlRG93bkV2ZW50LGV2ZW50KSE9PWZhbHNlKTsodGhpcy5f bW91c2VTdGFydGVkP3RoaXMuX21vdXNlRHJhZyhldmVudCk6dGhpcy5fbW91c2VV cChldmVudCkpO30KcmV0dXJuIXRoaXMuX21vdXNlU3RhcnRlZDt9LF9tb3VzZVVw OmZ1bmN0aW9uKGV2ZW50KXskKGRvY3VtZW50KS51bmJpbmQoJ21vdXNlbW92ZS4n K3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkudW5iaW5k KCdtb3VzZXVwLicrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0 ZSk7aWYodGhpcy5fbW91c2VTdGFydGVkKXt0aGlzLl9tb3VzZVN0YXJ0ZWQ9ZmFs c2U7dGhpcy5fcHJldmVudENsaWNrRXZlbnQ9KGV2ZW50LnRhcmdldD09dGhpcy5f bW91c2VEb3duRXZlbnQudGFyZ2V0KTt0aGlzLl9tb3VzZVN0b3AoZXZlbnQpO30K cmV0dXJuIGZhbHNlO30sX21vdXNlRGlzdGFuY2VNZXQ6ZnVuY3Rpb24oZXZlbnQp e3JldHVybihNYXRoLm1heChNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5w YWdlWC1ldmVudC5wYWdlWCksTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQu cGFnZVktZXZlbnQucGFnZVkpKT49dGhpcy5vcHRpb25zLmRpc3RhbmNlKTt9LF9t b3VzZURlbGF5TWV0OmZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4gdGhpcy5tb3VzZURl bGF5TWV0O30sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oZXZlbnQpe30sX21vdXNlRHJh ZzpmdW5jdGlvbihldmVudCl7fSxfbW91c2VTdG9wOmZ1bmN0aW9uKGV2ZW50KXt9 LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oZXZlbnQpe3JldHVybiB0cnVlO319OyQu dWkubW91c2UuZGVmYXVsdHM9e2NhbmNlbDpudWxsLGRpc3RhbmNlOjEsZGVsYXk6 MH07fSkoalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JC53aWRnZXQoInVpLmRyYWdnYWJs ZSIsJC5leHRlbmQoe30sJC51aS5tb3VzZSx7X2luaXQ6ZnVuY3Rpb24oKXtpZih0 aGlzLm9wdGlvbnMuaGVscGVyPT0nb3JpZ2luYWwnJiYhKC9eKD86cnxhfGYpLyku dGVzdCh0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKSkKdGhpcy5lbGVtZW50 WzBdLnN0eWxlLnBvc2l0aW9uPSdyZWxhdGl2ZSc7KHRoaXMub3B0aW9ucy5hZGRD bGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZSIpKTso dGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVp LWRyYWdnYWJsZS1kaXNhYmxlZCIpKTt0aGlzLl9tb3VzZUluaXQoKTt9LGRlc3Ry b3k6ZnVuY3Rpb24oKXtpZighdGhpcy5lbGVtZW50LmRhdGEoJ2RyYWdnYWJsZScp KXJldHVybjt0aGlzLmVsZW1lbnQucmVtb3ZlRGF0YSgiZHJhZ2dhYmxlIikudW5i aW5kKCIuZHJhZ2dhYmxlIikucmVtb3ZlQ2xhc3MoInVpLWRyYWdnYWJsZSIKKyIg dWktZHJhZ2dhYmxlLWRyYWdnaW5nIgorIiB1aS1kcmFnZ2FibGUtZGlzYWJsZWQi KTt0aGlzLl9tb3VzZURlc3Ryb3koKTt9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24o ZXZlbnQpe3ZhciBvPXRoaXMub3B0aW9ucztpZih0aGlzLmhlbHBlcnx8by5kaXNh YmxlZHx8JChldmVudC50YXJnZXQpLmlzKCcudWktcmVzaXphYmxlLWhhbmRsZScp KQpyZXR1cm4gZmFsc2U7dGhpcy5oYW5kbGU9dGhpcy5fZ2V0SGFuZGxlKGV2ZW50 KTtpZighdGhpcy5oYW5kbGUpCnJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTt9LF9t b3VzZVN0YXJ0OmZ1bmN0aW9uKGV2ZW50KXt2YXIgbz10aGlzLm9wdGlvbnM7dGhp cy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKGV2ZW50KTt0aGlzLl9jYWNoZUhl bHBlclByb3BvcnRpb25zKCk7aWYoJC51aS5kZG1hbmFnZXIpCiQudWkuZGRtYW5h Z2VyLmN1cnJlbnQ9dGhpczt0aGlzLl9jYWNoZU1hcmdpbnMoKTt0aGlzLmNzc1Bv c2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKTt0aGlzLnNjcm9sbFBh cmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKTt0aGlzLm9mZnNldD10aGlz LmVsZW1lbnQub2Zmc2V0KCk7dGhpcy5vZmZzZXQ9e3RvcDp0aGlzLm9mZnNldC50 b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMub2Zmc2V0LmxlZnQtdGhpcy5t YXJnaW5zLmxlZnR9OyQuZXh0ZW5kKHRoaXMub2Zmc2V0LHtjbGljazp7bGVmdDpl dmVudC5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDpldmVudC5wYWdlWS10aGlz Lm9mZnNldC50b3B9LHBhcmVudDp0aGlzLl9nZXRQYXJlbnRPZmZzZXQoKSxyZWxh dGl2ZTp0aGlzLl9nZXRSZWxhdGl2ZU9mZnNldCgpfSk7dGhpcy5vcmlnaW5hbFBv c2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oZXZlbnQpO3RoaXMub3JpZ2lu YWxQYWdlWD1ldmVudC5wYWdlWDt0aGlzLm9yaWdpbmFsUGFnZVk9ZXZlbnQucGFn ZVk7aWYoby5jdXJzb3JBdCkKdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihv LmN1cnNvckF0KTtpZihvLmNvbnRhaW5tZW50KQp0aGlzLl9zZXRDb250YWlubWVu dCgpO3RoaXMuX3RyaWdnZXIoInN0YXJ0IixldmVudCk7dGhpcy5fY2FjaGVIZWxw ZXJQcm9wb3J0aW9ucygpO2lmKCQudWkuZGRtYW5hZ2VyJiYhby5kcm9wQmVoYXZp b3VyKQokLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLGV2ZW50KTt0 aGlzLmhlbHBlci5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWRyYWdnaW5nIik7dGhp cy5fbW91c2VEcmFnKGV2ZW50LHRydWUpO3JldHVybiB0cnVlO30sX21vdXNlRHJh ZzpmdW5jdGlvbihldmVudCxub1Byb3BhZ2F0aW9uKXt0aGlzLnBvc2l0aW9uPXRo aXMuX2dlbmVyYXRlUG9zaXRpb24oZXZlbnQpO3RoaXMucG9zaXRpb25BYnM9dGhp cy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7aWYoIW5vUHJvcGFnYXRp b24pe3ZhciB1aT10aGlzLl91aUhhc2goKTt0aGlzLl90cmlnZ2VyKCdkcmFnJyxl dmVudCx1aSk7dGhpcy5wb3NpdGlvbj11aS5wb3NpdGlvbjt9CmlmKCF0aGlzLm9w dGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil0aGlzLmhlbHBlclsw XS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsncHgnO2lmKCF0aGlzLm9w dGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil0aGlzLmhlbHBlclsw XS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArJ3B4JztpZigkLnVpLmRkbWFu YWdlcikkLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsZXZlbnQpO3JldHVybiBmYWxz ZTt9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oZXZlbnQpe3ZhciBkcm9wcGVkPWZhbHNl O2lmKCQudWkuZGRtYW5hZ2VyJiYhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXIp CmRyb3BwZWQ9JC51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLGV2ZW50KTtpZih0aGlz LmRyb3BwZWQpe2Ryb3BwZWQ9dGhpcy5kcm9wcGVkO3RoaXMuZHJvcHBlZD1mYWxz ZTt9CmlmKCh0aGlzLm9wdGlvbnMucmV2ZXJ0PT0iaW52YWxpZCImJiFkcm9wcGVk KXx8KHRoaXMub3B0aW9ucy5yZXZlcnQ9PSJ2YWxpZCImJmRyb3BwZWQpfHx0aGlz Lm9wdGlvbnMucmV2ZXJ0PT09dHJ1ZXx8KCQuaXNGdW5jdGlvbih0aGlzLm9wdGlv bnMucmV2ZXJ0KSYmdGhpcy5vcHRpb25zLnJldmVydC5jYWxsKHRoaXMuZWxlbWVu dCxkcm9wcGVkKSkpe3ZhciBzZWxmPXRoaXM7JCh0aGlzLmhlbHBlcikuYW5pbWF0 ZSh0aGlzLm9yaWdpbmFsUG9zaXRpb24scGFyc2VJbnQodGhpcy5vcHRpb25zLnJl dmVydER1cmF0aW9uLDEwKSxmdW5jdGlvbigpe3NlbGYuX3RyaWdnZXIoInN0b3Ai LGV2ZW50KTtzZWxmLl9jbGVhcigpO30pO31lbHNle3RoaXMuX3RyaWdnZXIoInN0 b3AiLGV2ZW50KTt0aGlzLl9jbGVhcigpO30KcmV0dXJuIGZhbHNlO30sX2dldEhh bmRsZTpmdW5jdGlvbihldmVudCl7dmFyIGhhbmRsZT0hdGhpcy5vcHRpb25zLmhh bmRsZXx8ISQodGhpcy5vcHRpb25zLmhhbmRsZSx0aGlzLmVsZW1lbnQpLmxlbmd0 aD90cnVlOmZhbHNlOyQodGhpcy5vcHRpb25zLmhhbmRsZSx0aGlzLmVsZW1lbnQp LmZpbmQoIioiKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbigpe2lmKHRoaXM9PWV2 ZW50LnRhcmdldCloYW5kbGU9dHJ1ZTt9KTtyZXR1cm4gaGFuZGxlO30sX2NyZWF0 ZUhlbHBlcjpmdW5jdGlvbihldmVudCl7dmFyIG89dGhpcy5vcHRpb25zO3ZhciBo ZWxwZXI9JC5pc0Z1bmN0aW9uKG8uaGVscGVyKT8kKG8uaGVscGVyLmFwcGx5KHRo aXMuZWxlbWVudFswXSxbZXZlbnRdKSk6KG8uaGVscGVyPT0nY2xvbmUnP3RoaXMu ZWxlbWVudC5jbG9uZSgpOnRoaXMuZWxlbWVudCk7aWYoIWhlbHBlci5wYXJlbnRz KCdib2R5JykubGVuZ3RoKQpoZWxwZXIuYXBwZW5kVG8oKG8uYXBwZW5kVG89PSdw YXJlbnQnP3RoaXMuZWxlbWVudFswXS5wYXJlbnROb2RlOm8uYXBwZW5kVG8pKTtp ZihoZWxwZXJbMF0hPXRoaXMuZWxlbWVudFswXSYmISgvKGZpeGVkfGFic29sdXRl KS8pLnRlc3QoaGVscGVyLmNzcygicG9zaXRpb24iKSkpCmhlbHBlci5jc3MoInBv c2l0aW9uIiwiYWJzb2x1dGUiKTtyZXR1cm4gaGVscGVyO30sX2FkanVzdE9mZnNl dEZyb21IZWxwZXI6ZnVuY3Rpb24ob2JqKXtpZihvYmoubGVmdCE9dW5kZWZpbmVk KXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9b2JqLmxlZnQrdGhpcy5tYXJnaW5zLmxl ZnQ7aWYob2JqLnJpZ2h0IT11bmRlZmluZWQpdGhpcy5vZmZzZXQuY2xpY2subGVm dD10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLW9iai5yaWdodCt0aGlzLm1h cmdpbnMubGVmdDtpZihvYmoudG9wIT11bmRlZmluZWQpdGhpcy5vZmZzZXQuY2xp Y2sudG9wPW9iai50b3ArdGhpcy5tYXJnaW5zLnRvcDtpZihvYmouYm90dG9tIT11 bmRlZmluZWQpdGhpcy5vZmZzZXQuY2xpY2sudG9wPXRoaXMuaGVscGVyUHJvcG9y dGlvbnMuaGVpZ2h0LW9iai5ib3R0b20rdGhpcy5tYXJnaW5zLnRvcDt9LF9nZXRQ YXJlbnRPZmZzZXQ6ZnVuY3Rpb24oKXt0aGlzLm9mZnNldFBhcmVudD10aGlzLmhl bHBlci5vZmZzZXRQYXJlbnQoKTt2YXIgcG89dGhpcy5vZmZzZXRQYXJlbnQub2Zm c2V0KCk7aWYodGhpcy5jc3NQb3NpdGlvbj09J2Fic29sdXRlJyYmdGhpcy5zY3Jv bGxQYXJlbnRbMF0hPWRvY3VtZW50JiYkLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xs UGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSl7cG8ubGVmdCs9dGhpcy5z Y3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpO3BvLnRvcCs9dGhpcy5zY3JvbGxQYXJl bnQuc2Nyb2xsVG9wKCk7fQppZigodGhpcy5vZmZzZXRQYXJlbnRbMF09PWRvY3Vt ZW50LmJvZHkpfHwodGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZSYmdGhpcy5v ZmZzZXRQYXJlbnRbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0naHRtbCcmJiQu YnJvd3Nlci5tc2llKSkKcG89e3RvcDowLGxlZnQ6MH07cmV0dXJue3RvcDpwby50 b3ArKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lk dGgiKSwxMCl8fDApLGxlZnQ6cG8ubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQ YXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfTt9LF9nZXRSZWxh dGl2ZU9mZnNldDpmdW5jdGlvbigpe2lmKHRoaXMuY3NzUG9zaXRpb249PSJyZWxh dGl2ZSIpe3ZhciBwPXRoaXMuZWxlbWVudC5wb3NpdGlvbigpO3JldHVybnt0b3A6 cC50b3AtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygidG9wIiksMTApfHwwKSt0 aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSxsZWZ0OnAubGVmdC0ocGFyc2VJ bnQodGhpcy5oZWxwZXIuY3NzKCJsZWZ0IiksMTApfHwwKSt0aGlzLnNjcm9sbFBh cmVudC5zY3JvbGxMZWZ0KCl9O31lbHNle3JldHVybnt0b3A6MCxsZWZ0OjB9O319 LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6KHBh cnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDApLHRv cDoocGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luVG9wIiksMTApfHww KX07fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVs cGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxo ZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX07fSxfc2V0Q29udGFpbm1l bnQ6ZnVuY3Rpb24oKXt2YXIgbz10aGlzLm9wdGlvbnM7aWYoby5jb250YWlubWVu dD09J3BhcmVudCcpby5jb250YWlubWVudD10aGlzLmhlbHBlclswXS5wYXJlbnRO b2RlO2lmKG8uY29udGFpbm1lbnQ9PSdkb2N1bWVudCd8fG8uY29udGFpbm1lbnQ9 PSd3aW5kb3cnKXRoaXMuY29udGFpbm1lbnQ9WzAtdGhpcy5vZmZzZXQucmVsYXRp dmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCwwLXRoaXMub2Zmc2V0LnJl bGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLCQoby5jb250YWlubWVu dD09J2RvY3VtZW50Jz9kb2N1bWVudDp3aW5kb3cpLndpZHRoKCktdGhpcy5oZWxw ZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCwoJChvLmNvbnRh aW5tZW50PT0nZG9jdW1lbnQnP2RvY3VtZW50OndpbmRvdykuaGVpZ2h0KCl8fGRv Y3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVy UHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdO2lmKCEoL14oZG9j dW1lbnR8d2luZG93fHBhcmVudCkkLykudGVzdChvLmNvbnRhaW5tZW50KSYmby5j b250YWlubWVudC5jb25zdHJ1Y3RvciE9QXJyYXkpe3ZhciBjZT0kKG8uY29udGFp bm1lbnQpWzBdO2lmKCFjZSlyZXR1cm47dmFyIGNvPSQoby5jb250YWlubWVudCku b2Zmc2V0KCk7dmFyIG92ZXI9KCQoY2UpLmNzcygib3ZlcmZsb3ciKSE9J2hpZGRl bicpO3RoaXMuY29udGFpbm1lbnQ9W2NvLmxlZnQrKHBhcnNlSW50KCQoY2UpLmNz cygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoJChjZSkuY3Nz KCJwYWRkaW5nTGVmdCIpLDEwKXx8MCktdGhpcy5tYXJnaW5zLmxlZnQsY28udG9w KyhwYXJzZUludCgkKGNlKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSso cGFyc2VJbnQoJChjZSkuY3NzKCJwYWRkaW5nVG9wIiksMTApfHwwKS10aGlzLm1h cmdpbnMudG9wLGNvLmxlZnQrKG92ZXI/TWF0aC5tYXgoY2Uuc2Nyb2xsV2lkdGgs Y2Uub2Zmc2V0V2lkdGgpOmNlLm9mZnNldFdpZHRoKS0ocGFyc2VJbnQoJChjZSku Y3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludCgkKGNlKS5j c3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9u cy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCxjby50b3ArKG92ZXI/TWF0aC5tYXgo Y2Uuc2Nyb2xsSGVpZ2h0LGNlLm9mZnNldEhlaWdodCk6Y2Uub2Zmc2V0SGVpZ2h0 KS0ocGFyc2VJbnQoJChjZSkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkt KHBhcnNlSW50KCQoY2UpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKXx8MCktdGhp cy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF07fWVs c2UgaWYoby5jb250YWlubWVudC5jb25zdHJ1Y3Rvcj09QXJyYXkpe3RoaXMuY29u dGFpbm1lbnQ9by5jb250YWlubWVudDt9fSxfY29udmVydFBvc2l0aW9uVG86ZnVu Y3Rpb24oZCxwb3Mpe2lmKCFwb3MpcG9zPXRoaXMucG9zaXRpb247dmFyIG1vZD1k PT0iYWJzb2x1dGUiPzE6LTE7dmFyIG89dGhpcy5vcHRpb25zLHNjcm9sbD10aGlz LmNzc1Bvc2l0aW9uPT0nYWJzb2x1dGUnJiYhKHRoaXMuc2Nyb2xsUGFyZW50WzBd IT1kb2N1bWVudCYmJC51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0 aGlzLm9mZnNldFBhcmVudFswXSkpP3RoaXMub2Zmc2V0UGFyZW50OnRoaXMuc2Ny b2xsUGFyZW50LHNjcm9sbElzUm9vdE5vZGU9KC8oaHRtbHxib2R5KS9pKS50ZXN0 KHNjcm9sbFswXS50YWdOYW1lKTtyZXR1cm57dG9wOihwb3MudG9wCit0aGlzLm9m ZnNldC5yZWxhdGl2ZS50b3AqbW9kCit0aGlzLm9mZnNldC5wYXJlbnQudG9wKm1v ZAotKCQuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSdmaXhlZCc/ MDoodGhpcy5jc3NQb3NpdGlvbj09J2ZpeGVkJz8tdGhpcy5zY3JvbGxQYXJlbnQu c2Nyb2xsVG9wKCk6KHNjcm9sbElzUm9vdE5vZGU/MDpzY3JvbGwuc2Nyb2xsVG9w KCkpKSptb2QpKSxsZWZ0Oihwb3MubGVmdAordGhpcy5vZmZzZXQucmVsYXRpdmUu bGVmdCptb2QKK3RoaXMub2Zmc2V0LnBhcmVudC5sZWZ0Km1vZAotKCQuYnJvd3Nl ci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSdmaXhlZCc/MDoodGhpcy5jc3NQ b3NpdGlvbj09J2ZpeGVkJz8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgp OnNjcm9sbElzUm9vdE5vZGU/MDpzY3JvbGwuc2Nyb2xsTGVmdCgpKSptb2QpKX07 fSxfZ2VuZXJhdGVQb3NpdGlvbjpmdW5jdGlvbihldmVudCl7dmFyIG89dGhpcy5v cHRpb25zLHNjcm9sbD10aGlzLmNzc1Bvc2l0aW9uPT0nYWJzb2x1dGUnJiYhKHRo aXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmJC51aS5jb250YWlucyh0aGlz LnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkpP3RoaXMub2Zm c2V0UGFyZW50OnRoaXMuc2Nyb2xsUGFyZW50LHNjcm9sbElzUm9vdE5vZGU9KC8o aHRtbHxib2R5KS9pKS50ZXN0KHNjcm9sbFswXS50YWdOYW1lKTtpZih0aGlzLmNz c1Bvc2l0aW9uPT0ncmVsYXRpdmUnJiYhKHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1k b2N1bWVudCYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPXRoaXMub2Zmc2V0UGFyZW50 WzBdKSl7dGhpcy5vZmZzZXQucmVsYXRpdmU9dGhpcy5fZ2V0UmVsYXRpdmVPZmZz ZXQoKTt9CnZhciBwYWdlWD1ldmVudC5wYWdlWDt2YXIgcGFnZVk9ZXZlbnQucGFn ZVk7aWYodGhpcy5vcmlnaW5hbFBvc2l0aW9uKXtpZih0aGlzLmNvbnRhaW5tZW50 KXtpZihldmVudC5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29u dGFpbm1lbnRbMF0pcGFnZVg9dGhpcy5jb250YWlubWVudFswXSt0aGlzLm9mZnNl dC5jbGljay5sZWZ0O2lmKGV2ZW50LnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRv cDx0aGlzLmNvbnRhaW5tZW50WzFdKXBhZ2VZPXRoaXMuY29udGFpbm1lbnRbMV0r dGhpcy5vZmZzZXQuY2xpY2sudG9wO2lmKGV2ZW50LnBhZ2VYLXRoaXMub2Zmc2V0 LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXSlwYWdlWD10aGlzLmNvbnRh aW5tZW50WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQ7aWYoZXZlbnQucGFnZVkt dGhpcy5vZmZzZXQuY2xpY2sudG9wPnRoaXMuY29udGFpbm1lbnRbM10pcGFnZVk9 dGhpcy5jb250YWlubWVudFszXSt0aGlzLm9mZnNldC5jbGljay50b3A7fQppZihv LmdyaWQpe3ZhciB0b3A9dGhpcy5vcmlnaW5hbFBhZ2VZK01hdGgucm91bmQoKHBh Z2VZLXRoaXMub3JpZ2luYWxQYWdlWSkvby5ncmlkWzFdKSpvLmdyaWRbMV07cGFn ZVk9dGhpcy5jb250YWlubWVudD8oISh0b3AtdGhpcy5vZmZzZXQuY2xpY2sudG9w PHRoaXMuY29udGFpbm1lbnRbMV18fHRvcC10aGlzLm9mZnNldC5jbGljay50b3A+ dGhpcy5jb250YWlubWVudFszXSk/dG9wOighKHRvcC10aGlzLm9mZnNldC5jbGlj ay50b3A8dGhpcy5jb250YWlubWVudFsxXSk/dG9wLW8uZ3JpZFsxXTp0b3Arby5n cmlkWzFdKSk6dG9wO3ZhciBsZWZ0PXRoaXMub3JpZ2luYWxQYWdlWCtNYXRoLnJv dW5kKChwYWdlWC10aGlzLm9yaWdpbmFsUGFnZVgpL28uZ3JpZFswXSkqby5ncmlk WzBdO3BhZ2VYPXRoaXMuY29udGFpbm1lbnQ/KCEobGVmdC10aGlzLm9mZnNldC5j bGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF18fGxlZnQtdGhpcy5vZmZzZXQu Y2xpY2subGVmdD50aGlzLmNvbnRhaW5tZW50WzJdKT9sZWZ0OighKGxlZnQtdGhp cy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdKT9sZWZ0LW8u Z3JpZFswXTpsZWZ0K28uZ3JpZFswXSkpOmxlZnQ7fX0KcmV0dXJue3RvcDoocGFn ZVkKLXRoaXMub2Zmc2V0LmNsaWNrLnRvcAotdGhpcy5vZmZzZXQucmVsYXRpdmUu dG9wCi10aGlzLm9mZnNldC5wYXJlbnQudG9wCisoJC5icm93c2VyLnNhZmFyaSYm dGhpcy5jc3NQb3NpdGlvbj09J2ZpeGVkJz8wOih0aGlzLmNzc1Bvc2l0aW9uPT0n Zml4ZWQnPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTooc2Nyb2xsSXNS b290Tm9kZT8wOnNjcm9sbC5zY3JvbGxUb3AoKSkpKSksbGVmdDoocGFnZVgKLXRo aXMub2Zmc2V0LmNsaWNrLmxlZnQKLXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQK LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0CisoJC5icm93c2VyLnNhZmFyaSYmdGhp cy5jc3NQb3NpdGlvbj09J2ZpeGVkJz8wOih0aGlzLmNzc1Bvc2l0aW9uPT0nZml4 ZWQnPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6c2Nyb2xsSXNSb290 Tm9kZT8wOnNjcm9sbC5zY3JvbGxMZWZ0KCkpKSl9O30sX2NsZWFyOmZ1bmN0aW9u KCl7dGhpcy5oZWxwZXIucmVtb3ZlQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2lu ZyIpO2lmKHRoaXMuaGVscGVyWzBdIT10aGlzLmVsZW1lbnRbMF0mJiF0aGlzLmNh bmNlbEhlbHBlclJlbW92YWwpdGhpcy5oZWxwZXIucmVtb3ZlKCk7dGhpcy5oZWxw ZXI9bnVsbDt0aGlzLmNhbmNlbEhlbHBlclJlbW92YWw9ZmFsc2U7fSxfdHJpZ2dl cjpmdW5jdGlvbih0eXBlLGV2ZW50LHVpKXt1aT11aXx8dGhpcy5fdWlIYXNoKCk7 JC51aS5wbHVnaW4uY2FsbCh0aGlzLHR5cGUsW2V2ZW50LHVpXSk7aWYodHlwZT09 ImRyYWciKXRoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8o ImFic29sdXRlIik7cmV0dXJuICQud2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5j YWxsKHRoaXMsdHlwZSxldmVudCx1aSk7fSxwbHVnaW5zOnt9LF91aUhhc2g6ZnVu Y3Rpb24oZXZlbnQpe3JldHVybntoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246 dGhpcy5wb3NpdGlvbixhYnNvbHV0ZVBvc2l0aW9uOnRoaXMucG9zaXRpb25BYnMs b2Zmc2V0OnRoaXMucG9zaXRpb25BYnN9O319KSk7JC5leHRlbmQoJC51aS5kcmFn Z2FibGUse3ZlcnNpb246IjEuNy4yIixldmVudFByZWZpeDoiZHJhZyIsZGVmYXVs dHM6e2FkZENsYXNzZXM6dHJ1ZSxhcHBlbmRUbzoicGFyZW50IixheGlzOmZhbHNl LGNhbmNlbDoiOmlucHV0LG9wdGlvbiIsY29ubmVjdFRvU29ydGFibGU6ZmFsc2Us Y29udGFpbm1lbnQ6ZmFsc2UsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDpmYWxzZSxk ZWxheTowLGRpc3RhbmNlOjEsZ3JpZDpmYWxzZSxoYW5kbGU6ZmFsc2UsaGVscGVy OiJvcmlnaW5hbCIsaWZyYW1lRml4OmZhbHNlLG9wYWNpdHk6ZmFsc2UscmVmcmVz aFBvc2l0aW9uczpmYWxzZSxyZXZlcnQ6ZmFsc2UscmV2ZXJ0RHVyYXRpb246NTAw LHNjb3BlOiJkZWZhdWx0IixzY3JvbGw6dHJ1ZSxzY3JvbGxTZW5zaXRpdml0eToy MCxzY3JvbGxTcGVlZDoyMCxzbmFwOmZhbHNlLHNuYXBNb2RlOiJib3RoIixzbmFw VG9sZXJhbmNlOjIwLHN0YWNrOmZhbHNlLHpJbmRleDpmYWxzZX19KTskLnVpLnBs dWdpbi5hZGQoImRyYWdnYWJsZSIsImNvbm5lY3RUb1NvcnRhYmxlIix7c3RhcnQ6 ZnVuY3Rpb24oZXZlbnQsdWkpe3ZhciBpbnN0PSQodGhpcykuZGF0YSgiZHJhZ2dh YmxlIiksbz1pbnN0Lm9wdGlvbnMsdWlTb3J0YWJsZT0kLmV4dGVuZCh7fSx1aSx7 aXRlbTppbnN0LmVsZW1lbnR9KTtpbnN0LnNvcnRhYmxlcz1bXTskKG8uY29ubmVj dFRvU29ydGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgc29ydGFibGU9JC5kYXRh KHRoaXMsJ3NvcnRhYmxlJyk7aWYoc29ydGFibGUmJiFzb3J0YWJsZS5vcHRpb25z LmRpc2FibGVkKXtpbnN0LnNvcnRhYmxlcy5wdXNoKHtpbnN0YW5jZTpzb3J0YWJs ZSxzaG91bGRSZXZlcnQ6c29ydGFibGUub3B0aW9ucy5yZXZlcnR9KTtzb3J0YWJs ZS5fcmVmcmVzaEl0ZW1zKCk7c29ydGFibGUuX3RyaWdnZXIoImFjdGl2YXRlIixl dmVudCx1aVNvcnRhYmxlKTt9fSk7fSxzdG9wOmZ1bmN0aW9uKGV2ZW50LHVpKXt2 YXIgaW5zdD0kKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLHVpU29ydGFibGU9JC5l eHRlbmQoe30sdWkse2l0ZW06aW5zdC5lbGVtZW50fSk7JC5lYWNoKGluc3Quc29y dGFibGVzLGZ1bmN0aW9uKCl7aWYodGhpcy5pbnN0YW5jZS5pc092ZXIpe3RoaXMu aW5zdGFuY2UuaXNPdmVyPTA7aW5zdC5jYW5jZWxIZWxwZXJSZW1vdmFsPXRydWU7 dGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPWZhbHNlO2lmKHRoaXMu c2hvdWxkUmV2ZXJ0KXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9dHJ1ZTt0 aGlzLmluc3RhbmNlLl9tb3VzZVN0b3AoZXZlbnQpO3RoaXMuaW5zdGFuY2Uub3B0 aW9ucy5oZWxwZXI9dGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXI7aWYoaW5z dC5vcHRpb25zLmhlbHBlcj09J29yaWdpbmFsJykKdGhpcy5pbnN0YW5jZS5jdXJy ZW50SXRlbS5jc3Moe3RvcDonYXV0bycsbGVmdDonYXV0byd9KTt9ZWxzZXt0aGlz Lmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ZmFsc2U7dGhpcy5pbnN0YW5j ZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsZXZlbnQsdWlTb3J0YWJsZSk7fX0pO30s ZHJhZzpmdW5jdGlvbihldmVudCx1aSl7dmFyIGluc3Q9JCh0aGlzKS5kYXRhKCJk cmFnZ2FibGUiKSxzZWxmPXRoaXM7dmFyIGNoZWNrUG9zPWZ1bmN0aW9uKG8pe3Zh ciBkeUNsaWNrPXRoaXMub2Zmc2V0LmNsaWNrLnRvcCxkeENsaWNrPXRoaXMub2Zm c2V0LmNsaWNrLmxlZnQ7dmFyIGhlbHBlclRvcD10aGlzLnBvc2l0aW9uQWJzLnRv cCxoZWxwZXJMZWZ0PXRoaXMucG9zaXRpb25BYnMubGVmdDt2YXIgaXRlbUhlaWdo dD1vLmhlaWdodCxpdGVtV2lkdGg9by53aWR0aDt2YXIgaXRlbVRvcD1vLnRvcCxp dGVtTGVmdD1vLmxlZnQ7cmV0dXJuICQudWkuaXNPdmVyKGhlbHBlclRvcCtkeUNs aWNrLGhlbHBlckxlZnQrZHhDbGljayxpdGVtVG9wLGl0ZW1MZWZ0LGl0ZW1IZWln aHQsaXRlbVdpZHRoKTt9OyQuZWFjaChpbnN0LnNvcnRhYmxlcyxmdW5jdGlvbihp KXt0aGlzLmluc3RhbmNlLnBvc2l0aW9uQWJzPWluc3QucG9zaXRpb25BYnM7dGhp cy5pbnN0YW5jZS5oZWxwZXJQcm9wb3J0aW9ucz1pbnN0LmhlbHBlclByb3BvcnRp b25zO3RoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrPWluc3Qub2Zmc2V0LmNsaWNr O2lmKHRoaXMuaW5zdGFuY2UuX2ludGVyc2VjdHNXaXRoKHRoaXMuaW5zdGFuY2Uu Y29udGFpbmVyQ2FjaGUpKXtpZighdGhpcy5pbnN0YW5jZS5pc092ZXIpe3RoaXMu aW5zdGFuY2UuaXNPdmVyPTE7dGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbT0kKHNl bGYpLmNsb25lKCkuYXBwZW5kVG8odGhpcy5pbnN0YW5jZS5lbGVtZW50KS5kYXRh KCJzb3J0YWJsZS1pdGVtIix0cnVlKTt0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hl bHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyO3RoaXMuaW5zdGFuY2Uu b3B0aW9ucy5oZWxwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdWkuaGVscGVyWzBdO307 ZXZlbnQudGFyZ2V0PXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW1bMF07dGhpcy5p bnN0YW5jZS5fbW91c2VDYXB0dXJlKGV2ZW50LHRydWUpO3RoaXMuaW5zdGFuY2Uu X21vdXNlU3RhcnQoZXZlbnQsdHJ1ZSx0cnVlKTt0aGlzLmluc3RhbmNlLm9mZnNl dC5jbGljay50b3A9aW5zdC5vZmZzZXQuY2xpY2sudG9wO3RoaXMuaW5zdGFuY2Uu b2Zmc2V0LmNsaWNrLmxlZnQ9aW5zdC5vZmZzZXQuY2xpY2subGVmdDt0aGlzLmlu c3RhbmNlLm9mZnNldC5wYXJlbnQubGVmdC09aW5zdC5vZmZzZXQucGFyZW50Lmxl ZnQtdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQ7dGhpcy5pbnN0YW5j ZS5vZmZzZXQucGFyZW50LnRvcC09aW5zdC5vZmZzZXQucGFyZW50LnRvcC10aGlz Lmluc3RhbmNlLm9mZnNldC5wYXJlbnQudG9wO2luc3QuX3RyaWdnZXIoInRvU29y dGFibGUiLGV2ZW50KTtpbnN0LmRyb3BwZWQ9dGhpcy5pbnN0YW5jZS5lbGVtZW50 O2luc3QuY3VycmVudEl0ZW09aW5zdC5lbGVtZW50O3RoaXMuaW5zdGFuY2UuZnJv bU91dHNpZGU9aW5zdDt9CmlmKHRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0pdGhp cy5pbnN0YW5jZS5fbW91c2VEcmFnKGV2ZW50KTt9ZWxzZXtpZih0aGlzLmluc3Rh bmNlLmlzT3Zlcil7dGhpcy5pbnN0YW5jZS5pc092ZXI9MDt0aGlzLmluc3RhbmNl LmNhbmNlbEhlbHBlclJlbW92YWw9dHJ1ZTt0aGlzLmluc3RhbmNlLm9wdGlvbnMu cmV2ZXJ0PWZhbHNlO3RoaXMuaW5zdGFuY2UuX3RyaWdnZXIoJ291dCcsZXZlbnQs dGhpcy5pbnN0YW5jZS5fdWlIYXNoKHRoaXMuaW5zdGFuY2UpKTt0aGlzLmluc3Rh bmNlLl9tb3VzZVN0b3AoZXZlbnQsdHJ1ZSk7dGhpcy5pbnN0YW5jZS5vcHRpb25z LmhlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcjt0aGlzLmluc3Rh bmNlLmN1cnJlbnRJdGVtLnJlbW92ZSgpO2lmKHRoaXMuaW5zdGFuY2UucGxhY2Vo b2xkZXIpdGhpcy5pbnN0YW5jZS5wbGFjZWhvbGRlci5yZW1vdmUoKTtpbnN0Ll90 cmlnZ2VyKCJmcm9tU29ydGFibGUiLGV2ZW50KTtpbnN0LmRyb3BwZWQ9ZmFsc2U7 fX07fSk7fX0pOyQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiY3Vyc29yIix7 c3RhcnQ6ZnVuY3Rpb24oZXZlbnQsdWkpe3ZhciB0PSQoJ2JvZHknKSxvPSQodGhp cykuZGF0YSgnZHJhZ2dhYmxlJykub3B0aW9ucztpZih0LmNzcygiY3Vyc29yIikp by5fY3Vyc29yPXQuY3NzKCJjdXJzb3IiKTt0LmNzcygiY3Vyc29yIixvLmN1cnNv cik7fSxzdG9wOmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgbz0kKHRoaXMpLmRhdGEo J2RyYWdnYWJsZScpLm9wdGlvbnM7aWYoby5fY3Vyc29yKSQoJ2JvZHknKS5jc3Mo ImN1cnNvciIsby5fY3Vyc29yKTt9fSk7JC51aS5wbHVnaW4uYWRkKCJkcmFnZ2Fi bGUiLCJpZnJhbWVGaXgiLHtzdGFydDpmdW5jdGlvbihldmVudCx1aSl7dmFyIG89 JCh0aGlzKS5kYXRhKCdkcmFnZ2FibGUnKS5vcHRpb25zOyQoby5pZnJhbWVGaXg9 PT10cnVlPyJpZnJhbWUiOm8uaWZyYW1lRml4KS5lYWNoKGZ1bmN0aW9uKCl7JCgn PGRpdiBjbGFzcz0idWktZHJhZ2dhYmxlLWlmcmFtZUZpeCIgc3R5bGU9ImJhY2tn cm91bmQ6ICNmZmY7Ij48L2Rpdj4nKS5jc3Moe3dpZHRoOnRoaXMub2Zmc2V0V2lk dGgrInB4IixoZWlnaHQ6dGhpcy5vZmZzZXRIZWlnaHQrInB4Iixwb3NpdGlvbjoi YWJzb2x1dGUiLG9wYWNpdHk6IjAuMDAxIix6SW5kZXg6MTAwMH0pLmNzcygkKHRo aXMpLm9mZnNldCgpKS5hcHBlbmRUbygiYm9keSIpO30pO30sc3RvcDpmdW5jdGlv bihldmVudCx1aSl7JCgiZGl2LnVpLWRyYWdnYWJsZS1pZnJhbWVGaXgiKS5lYWNo KGZ1bmN0aW9uKCl7dGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpO30p O319KTskLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsIm9wYWNpdHkiLHtzdGFy dDpmdW5jdGlvbihldmVudCx1aSl7dmFyIHQ9JCh1aS5oZWxwZXIpLG89JCh0aGlz KS5kYXRhKCdkcmFnZ2FibGUnKS5vcHRpb25zO2lmKHQuY3NzKCJvcGFjaXR5Iikp by5fb3BhY2l0eT10LmNzcygib3BhY2l0eSIpO3QuY3NzKCdvcGFjaXR5JyxvLm9w YWNpdHkpO30sc3RvcDpmdW5jdGlvbihldmVudCx1aSl7dmFyIG89JCh0aGlzKS5k YXRhKCdkcmFnZ2FibGUnKS5vcHRpb25zO2lmKG8uX29wYWNpdHkpJCh1aS5oZWxw ZXIpLmNzcygnb3BhY2l0eScsby5fb3BhY2l0eSk7fX0pOyQudWkucGx1Z2luLmFk ZCgiZHJhZ2dhYmxlIiwic2Nyb2xsIix7c3RhcnQ6ZnVuY3Rpb24oZXZlbnQsdWkp e3ZhciBpPSQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIik7aWYoaS5zY3JvbGxQYXJl bnRbMF0hPWRvY3VtZW50JiZpLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0nSFRN TCcpaS5vdmVyZmxvd09mZnNldD1pLnNjcm9sbFBhcmVudC5vZmZzZXQoKTt9LGRy YWc6ZnVuY3Rpb24oZXZlbnQsdWkpe3ZhciBpPSQodGhpcykuZGF0YSgiZHJhZ2dh YmxlIiksbz1pLm9wdGlvbnMsc2Nyb2xsZWQ9ZmFsc2U7aWYoaS5zY3JvbGxQYXJl bnRbMF0hPWRvY3VtZW50JiZpLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0nSFRN TCcpe2lmKCFvLmF4aXN8fG8uYXhpcyE9J3gnKXtpZigoaS5vdmVyZmxvd09mZnNl dC50b3AraS5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0SGVpZ2h0KS1ldmVudC5wYWdl WTxvLnNjcm9sbFNlbnNpdGl2aXR5KQppLnNjcm9sbFBhcmVudFswXS5zY3JvbGxU b3A9c2Nyb2xsZWQ9aS5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wK28uc2Nyb2xs U3BlZWQ7ZWxzZSBpZihldmVudC5wYWdlWS1pLm92ZXJmbG93T2Zmc2V0LnRvcDxv LnNjcm9sbFNlbnNpdGl2aXR5KQppLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3A9 c2Nyb2xsZWQ9aS5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wLW8uc2Nyb2xsU3Bl ZWQ7fQppZighby5heGlzfHxvLmF4aXMhPSd5Jyl7aWYoKGkub3ZlcmZsb3dPZmZz ZXQubGVmdCtpLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aCktZXZlbnQucGFn ZVg8by5zY3JvbGxTZW5zaXRpdml0eSkKaS5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xs TGVmdD1zY3JvbGxlZD1pLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0K28uc2Ny b2xsU3BlZWQ7ZWxzZSBpZihldmVudC5wYWdlWC1pLm92ZXJmbG93T2Zmc2V0Lmxl ZnQ8by5zY3JvbGxTZW5zaXRpdml0eSkKaS5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xs TGVmdD1zY3JvbGxlZD1pLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LW8uc2Ny b2xsU3BlZWQ7fX1lbHNle2lmKCFvLmF4aXN8fG8uYXhpcyE9J3gnKXtpZihldmVu dC5wYWdlWS0kKGRvY3VtZW50KS5zY3JvbGxUb3AoKTxvLnNjcm9sbFNlbnNpdGl2 aXR5KQpzY3JvbGxlZD0kKGRvY3VtZW50KS5zY3JvbGxUb3AoJChkb2N1bWVudCku c2Nyb2xsVG9wKCktby5zY3JvbGxTcGVlZCk7ZWxzZSBpZigkKHdpbmRvdykuaGVp Z2h0KCktKGV2ZW50LnBhZ2VZLSQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTxvLnNj cm9sbFNlbnNpdGl2aXR5KQpzY3JvbGxlZD0kKGRvY3VtZW50KS5zY3JvbGxUb3Ao JChkb2N1bWVudCkuc2Nyb2xsVG9wKCkrby5zY3JvbGxTcGVlZCk7fQppZighby5h eGlzfHxvLmF4aXMhPSd5Jyl7aWYoZXZlbnQucGFnZVgtJChkb2N1bWVudCkuc2Ny b2xsTGVmdCgpPG8uc2Nyb2xsU2Vuc2l0aXZpdHkpCnNjcm9sbGVkPSQoZG9jdW1l bnQpLnNjcm9sbExlZnQoJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpLW8uc2Nyb2xs U3BlZWQpO2Vsc2UgaWYoJCh3aW5kb3cpLndpZHRoKCktKGV2ZW50LnBhZ2VYLSQo ZG9jdW1lbnQpLnNjcm9sbExlZnQoKSk8by5zY3JvbGxTZW5zaXRpdml0eSkKc2Ny b2xsZWQ9JChkb2N1bWVudCkuc2Nyb2xsTGVmdCgkKGRvY3VtZW50KS5zY3JvbGxM ZWZ0KCkrby5zY3JvbGxTcGVlZCk7fX0KaWYoc2Nyb2xsZWQhPT1mYWxzZSYmJC51 aS5kZG1hbmFnZXImJiFvLmRyb3BCZWhhdmlvdXIpCiQudWkuZGRtYW5hZ2VyLnBy ZXBhcmVPZmZzZXRzKGksZXZlbnQpO319KTskLnVpLnBsdWdpbi5hZGQoImRyYWdn YWJsZSIsInNuYXAiLHtzdGFydDpmdW5jdGlvbihldmVudCx1aSl7dmFyIGk9JCh0 aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxvPWkub3B0aW9ucztpLnNuYXBFbGVtZW50 cz1bXTskKG8uc25hcC5jb25zdHJ1Y3RvciE9U3RyaW5nPyhvLnNuYXAuaXRlbXN8 fCc6ZGF0YShkcmFnZ2FibGUpJyk6by5zbmFwKS5lYWNoKGZ1bmN0aW9uKCl7dmFy ICR0PSQodGhpcyk7dmFyICRvPSR0Lm9mZnNldCgpO2lmKHRoaXMhPWkuZWxlbWVu dFswXSlpLnNuYXBFbGVtZW50cy5wdXNoKHtpdGVtOnRoaXMsd2lkdGg6JHQub3V0 ZXJXaWR0aCgpLGhlaWdodDokdC5vdXRlckhlaWdodCgpLHRvcDokby50b3AsbGVm dDokby5sZWZ0fSk7fSk7fSxkcmFnOmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgaW5z dD0kKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLG89aW5zdC5vcHRpb25zO3ZhciBk PW8uc25hcFRvbGVyYW5jZTt2YXIgeDE9dWkub2Zmc2V0LmxlZnQseDI9eDEraW5z dC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCx5MT11aS5vZmZzZXQudG9wLHkyPXkx K2luc3QuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0O2Zvcih2YXIgaT1pbnN0LnNu YXBFbGVtZW50cy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGw9aW5zdC5zbmFwRWxl bWVudHNbaV0ubGVmdCxyPWwraW5zdC5zbmFwRWxlbWVudHNbaV0ud2lkdGgsdD1p bnN0LnNuYXBFbGVtZW50c1tpXS50b3AsYj10K2luc3Quc25hcEVsZW1lbnRzW2ld LmhlaWdodDtpZighKChsLWQ8eDEmJngxPHIrZCYmdC1kPHkxJiZ5MTxiK2QpfHwo bC1kPHgxJiZ4MTxyK2QmJnQtZDx5MiYmeTI8YitkKXx8KGwtZDx4MiYmeDI8citk JiZ0LWQ8eTEmJnkxPGIrZCl8fChsLWQ8eDImJngyPHIrZCYmdC1kPHkyJiZ5Mjxi K2QpKSl7aWYoaW5zdC5zbmFwRWxlbWVudHNbaV0uc25hcHBpbmcpKGluc3Qub3B0 aW9ucy5zbmFwLnJlbGVhc2UmJmluc3Qub3B0aW9ucy5zbmFwLnJlbGVhc2UuY2Fs bChpbnN0LmVsZW1lbnQsZXZlbnQsJC5leHRlbmQoaW5zdC5fdWlIYXNoKCkse3Nu YXBJdGVtOmluc3Quc25hcEVsZW1lbnRzW2ldLml0ZW19KSkpO2luc3Quc25hcEVs ZW1lbnRzW2ldLnNuYXBwaW5nPWZhbHNlO2NvbnRpbnVlO30KaWYoby5zbmFwTW9k ZSE9J2lubmVyJyl7dmFyIHRzPU1hdGguYWJzKHQteTIpPD1kO3ZhciBicz1NYXRo LmFicyhiLXkxKTw9ZDt2YXIgbHM9TWF0aC5hYnMobC14Mik8PWQ7dmFyIHJzPU1h dGguYWJzKHIteDEpPD1kO2lmKHRzKXVpLnBvc2l0aW9uLnRvcD1pbnN0Ll9jb252 ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6dC1pbnN0LmhlbHBlclByb3Bv cnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3AtaW5zdC5tYXJnaW5zLnRvcDtpZihi cyl1aS5wb3NpdGlvbi50b3A9aW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0 aXZlIix7dG9wOmIsbGVmdDowfSkudG9wLWluc3QubWFyZ2lucy50b3A7aWYobHMp dWkucG9zaXRpb24ubGVmdD1pbnN0Ll9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRp dmUiLHt0b3A6MCxsZWZ0OmwtaW5zdC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aH0p LmxlZnQtaW5zdC5tYXJnaW5zLmxlZnQ7aWYocnMpdWkucG9zaXRpb24ubGVmdD1p bnN0Ll9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0OnJ9 KS5sZWZ0LWluc3QubWFyZ2lucy5sZWZ0O30KdmFyIGZpcnN0PSh0c3x8YnN8fGxz fHxycyk7aWYoby5zbmFwTW9kZSE9J291dGVyJyl7dmFyIHRzPU1hdGguYWJzKHQt eTEpPD1kO3ZhciBicz1NYXRoLmFicyhiLXkyKTw9ZDt2YXIgbHM9TWF0aC5hYnMo bC14MSk8PWQ7dmFyIHJzPU1hdGguYWJzKHIteDIpPD1kO2lmKHRzKXVpLnBvc2l0 aW9uLnRvcD1pbnN0Ll9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6 dCxsZWZ0OjB9KS50b3AtaW5zdC5tYXJnaW5zLnRvcDtpZihicyl1aS5wb3NpdGlv bi50b3A9aW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOmIt aW5zdC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsbGVmdDowfSkudG9wLWluc3Qu bWFyZ2lucy50b3A7aWYobHMpdWkucG9zaXRpb24ubGVmdD1pbnN0Ll9jb252ZXJ0 UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omx9KS5sZWZ0LWluc3Qu bWFyZ2lucy5sZWZ0O2lmKHJzKXVpLnBvc2l0aW9uLmxlZnQ9aW5zdC5fY29udmVy dFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpyLWluc3QuaGVscGVy UHJvcG9ydGlvbnMud2lkdGh9KS5sZWZ0LWluc3QubWFyZ2lucy5sZWZ0O30KaWYo IWluc3Quc25hcEVsZW1lbnRzW2ldLnNuYXBwaW5nJiYodHN8fGJzfHxsc3x8cnN8 fGZpcnN0KSkKKGluc3Qub3B0aW9ucy5zbmFwLnNuYXAmJmluc3Qub3B0aW9ucy5z bmFwLnNuYXAuY2FsbChpbnN0LmVsZW1lbnQsZXZlbnQsJC5leHRlbmQoaW5zdC5f dWlIYXNoKCkse3NuYXBJdGVtOmluc3Quc25hcEVsZW1lbnRzW2ldLml0ZW19KSkp O2luc3Quc25hcEVsZW1lbnRzW2ldLnNuYXBwaW5nPSh0c3x8YnN8fGxzfHxyc3x8 Zmlyc3QpO307fX0pOyQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic3RhY2si LHtzdGFydDpmdW5jdGlvbihldmVudCx1aSl7dmFyIG89JCh0aGlzKS5kYXRhKCJk cmFnZ2FibGUiKS5vcHRpb25zO3ZhciBncm91cD0kLm1ha2VBcnJheSgkKG8uc3Rh Y2suZ3JvdXApKS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuKHBhcnNlSW50KCQo YSkuY3NzKCJ6SW5kZXgiKSwxMCl8fG8uc3RhY2subWluKS0ocGFyc2VJbnQoJChi KS5jc3MoInpJbmRleCIpLDEwKXx8by5zdGFjay5taW4pO30pOyQoZ3JvdXApLmVh Y2goZnVuY3Rpb24oaSl7dGhpcy5zdHlsZS56SW5kZXg9by5zdGFjay5taW4raTt9 KTt0aGlzWzBdLnN0eWxlLnpJbmRleD1vLnN0YWNrLm1pbitncm91cC5sZW5ndGg7 fX0pOyQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6 ZnVuY3Rpb24oZXZlbnQsdWkpe3ZhciB0PSQodWkuaGVscGVyKSxvPSQodGhpcyku ZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztpZih0LmNzcygiekluZGV4Iikpby5f ekluZGV4PXQuY3NzKCJ6SW5kZXgiKTt0LmNzcygnekluZGV4JyxvLnpJbmRleCk7 fSxzdG9wOmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgbz0kKHRoaXMpLmRhdGEoImRy YWdnYWJsZSIpLm9wdGlvbnM7aWYoby5fekluZGV4KSQodWkuaGVscGVyKS5jc3Mo J3pJbmRleCcsby5fekluZGV4KTt9fSk7fSkoalF1ZXJ5KTsoZnVuY3Rpb24oJCl7 JC53aWRnZXQoInVpLmRyb3BwYWJsZSIse19pbml0OmZ1bmN0aW9uKCl7dmFyIG89 dGhpcy5vcHRpb25zLGFjY2VwdD1vLmFjY2VwdDt0aGlzLmlzb3Zlcj0wO3RoaXMu aXNvdXQ9MTt0aGlzLm9wdGlvbnMuYWNjZXB0PXRoaXMub3B0aW9ucy5hY2NlcHQm JiQuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuYWNjZXB0KT90aGlzLm9wdGlvbnMu YWNjZXB0OmZ1bmN0aW9uKGQpe3JldHVybiBkLmlzKGFjY2VwdCk7fTt0aGlzLnBy b3BvcnRpb25zPXt3aWR0aDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVp Z2h0OnRoaXMuZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9OyQudWkuZGRtYW5hZ2Vy LmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXT0kLnVpLmRkbWFuYWdlci5k cm9wcGFibGVzW3RoaXMub3B0aW9ucy5zY29wZV18fFtdOyQudWkuZGRtYW5hZ2Vy LmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXS5wdXNoKHRoaXMpOyh0aGlz Lm9wdGlvbnMuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1k cm9wcGFibGUiKSk7fSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGRyb3A9JC51aS5k ZG1hbmFnZXIuZHJvcHBhYmxlc1t0aGlzLm9wdGlvbnMuc2NvcGVdO2Zvcih2YXIg aT0wO2k8ZHJvcC5sZW5ndGg7aSsrKQppZihkcm9wW2ldPT10aGlzKQpkcm9wLnNw bGljZShpLDEpO3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktZHJvcHBhYmxl IHVpLWRyb3BwYWJsZS1kaXNhYmxlZCIpLnJlbW92ZURhdGEoImRyb3BwYWJsZSIp LnVuYmluZCgiLmRyb3BwYWJsZSIpO30sX3NldERhdGE6ZnVuY3Rpb24oa2V5LHZh bHVlKXtpZihrZXk9PSdhY2NlcHQnKXt0aGlzLm9wdGlvbnMuYWNjZXB0PXZhbHVl JiYkLmlzRnVuY3Rpb24odmFsdWUpP3ZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiBk LmlzKHZhbHVlKTt9O31lbHNleyQud2lkZ2V0LnByb3RvdHlwZS5fc2V0RGF0YS5h cHBseSh0aGlzLGFyZ3VtZW50cyk7fX0sX2FjdGl2YXRlOmZ1bmN0aW9uKGV2ZW50 KXt2YXIgZHJhZ2dhYmxlPSQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYodGhpcy5v cHRpb25zLmFjdGl2ZUNsYXNzKXRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9w dGlvbnMuYWN0aXZlQ2xhc3MpOyhkcmFnZ2FibGUmJnRoaXMuX3RyaWdnZXIoJ2Fj dGl2YXRlJyxldmVudCx0aGlzLnVpKGRyYWdnYWJsZSkpKTt9LF9kZWFjdGl2YXRl OmZ1bmN0aW9uKGV2ZW50KXt2YXIgZHJhZ2dhYmxlPSQudWkuZGRtYW5hZ2VyLmN1 cnJlbnQ7aWYodGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKXRoaXMuZWxlbWVudC5y ZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpOyhkcmFnZ2FibGUm JnRoaXMuX3RyaWdnZXIoJ2RlYWN0aXZhdGUnLGV2ZW50LHRoaXMudWkoZHJhZ2dh YmxlKSkpO30sX292ZXI6ZnVuY3Rpb24oZXZlbnQpe3ZhciBkcmFnZ2FibGU9JC51 aS5kZG1hbmFnZXIuY3VycmVudDtpZighZHJhZ2dhYmxlfHwoZHJhZ2dhYmxlLmN1 cnJlbnRJdGVtfHxkcmFnZ2FibGUuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFsw XSlyZXR1cm47aWYodGhpcy5vcHRpb25zLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVu dFswXSwoZHJhZ2dhYmxlLmN1cnJlbnRJdGVtfHxkcmFnZ2FibGUuZWxlbWVudCkp KXtpZih0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyl0aGlzLmVsZW1lbnQuYWRkQ2xh c3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpO3RoaXMuX3RyaWdnZXIoJ292ZXIn LGV2ZW50LHRoaXMudWkoZHJhZ2dhYmxlKSk7fX0sX291dDpmdW5jdGlvbihldmVu dCl7dmFyIGRyYWdnYWJsZT0kLnVpLmRkbWFuYWdlci5jdXJyZW50O2lmKCFkcmFn Z2FibGV8fChkcmFnZ2FibGUuY3VycmVudEl0ZW18fGRyYWdnYWJsZS5lbGVtZW50 KVswXT09dGhpcy5lbGVtZW50WzBdKXJldHVybjtpZih0aGlzLm9wdGlvbnMuYWNj ZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLChkcmFnZ2FibGUuY3VycmVudEl0ZW18 fGRyYWdnYWJsZS5lbGVtZW50KSkpe2lmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNz KXRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFz cyk7dGhpcy5fdHJpZ2dlcignb3V0JyxldmVudCx0aGlzLnVpKGRyYWdnYWJsZSkp O319LF9kcm9wOmZ1bmN0aW9uKGV2ZW50LGN1c3RvbSl7dmFyIGRyYWdnYWJsZT1j dXN0b218fCQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYoIWRyYWdnYWJsZXx8KGRy YWdnYWJsZS5jdXJyZW50SXRlbXx8ZHJhZ2dhYmxlLmVsZW1lbnQpWzBdPT10aGlz LmVsZW1lbnRbMF0pcmV0dXJuIGZhbHNlO3ZhciBjaGlsZHJlbkludGVyc2VjdGlv bj1mYWxzZTt0aGlzLmVsZW1lbnQuZmluZCgiOmRhdGEoZHJvcHBhYmxlKSIpLm5v dCgiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLmVhY2goZnVuY3Rpb24oKXt2YXIg aW5zdD0kLmRhdGEodGhpcywnZHJvcHBhYmxlJyk7aWYoaW5zdC5vcHRpb25zLmdy ZWVkeSYmJC51aS5pbnRlcnNlY3QoZHJhZ2dhYmxlLCQuZXh0ZW5kKGluc3Qse29m ZnNldDppbnN0LmVsZW1lbnQub2Zmc2V0KCl9KSxpbnN0Lm9wdGlvbnMudG9sZXJh bmNlKSl7Y2hpbGRyZW5JbnRlcnNlY3Rpb249dHJ1ZTtyZXR1cm4gZmFsc2U7fX0p O2lmKGNoaWxkcmVuSW50ZXJzZWN0aW9uKXJldHVybiBmYWxzZTtpZih0aGlzLm9w dGlvbnMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLChkcmFnZ2FibGUuY3Vy cmVudEl0ZW18fGRyYWdnYWJsZS5lbGVtZW50KSkpe2lmKHRoaXMub3B0aW9ucy5h Y3RpdmVDbGFzcyl0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25z LmFjdGl2ZUNsYXNzKTtpZih0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyl0aGlzLmVs ZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpO3RoaXMu X3RyaWdnZXIoJ2Ryb3AnLGV2ZW50LHRoaXMudWkoZHJhZ2dhYmxlKSk7cmV0dXJu IHRoaXMuZWxlbWVudDt9CnJldHVybiBmYWxzZTt9LHVpOmZ1bmN0aW9uKGMpe3Jl dHVybntkcmFnZ2FibGU6KGMuY3VycmVudEl0ZW18fGMuZWxlbWVudCksaGVscGVy OmMuaGVscGVyLHBvc2l0aW9uOmMucG9zaXRpb24sYWJzb2x1dGVQb3NpdGlvbjpj LnBvc2l0aW9uQWJzLG9mZnNldDpjLnBvc2l0aW9uQWJzfTt9fSk7JC5leHRlbmQo JC51aS5kcm9wcGFibGUse3ZlcnNpb246IjEuNy4yIixldmVudFByZWZpeDonZHJv cCcsZGVmYXVsdHM6e2FjY2VwdDonKicsYWN0aXZlQ2xhc3M6ZmFsc2UsYWRkQ2xh c3Nlczp0cnVlLGdyZWVkeTpmYWxzZSxob3ZlckNsYXNzOmZhbHNlLHNjb3BlOidk ZWZhdWx0Jyx0b2xlcmFuY2U6J2ludGVyc2VjdCd9fSk7JC51aS5pbnRlcnNlY3Q9 ZnVuY3Rpb24oZHJhZ2dhYmxlLGRyb3BwYWJsZSx0b2xlcmFuY2VNb2RlKXtpZigh ZHJvcHBhYmxlLm9mZnNldClyZXR1cm4gZmFsc2U7dmFyIHgxPShkcmFnZ2FibGUu cG9zaXRpb25BYnN8fGRyYWdnYWJsZS5wb3NpdGlvbi5hYnNvbHV0ZSkubGVmdCx4 Mj14MStkcmFnZ2FibGUuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgseTE9KGRyYWdn YWJsZS5wb3NpdGlvbkFic3x8ZHJhZ2dhYmxlLnBvc2l0aW9uLmFic29sdXRlKS50 b3AseTI9eTErZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLmhlaWdodDt2YXIg bD1kcm9wcGFibGUub2Zmc2V0LmxlZnQscj1sK2Ryb3BwYWJsZS5wcm9wb3J0aW9u cy53aWR0aCx0PWRyb3BwYWJsZS5vZmZzZXQudG9wLGI9dCtkcm9wcGFibGUucHJv cG9ydGlvbnMuaGVpZ2h0O3N3aXRjaCh0b2xlcmFuY2VNb2RlKXtjYXNlJ2ZpdCc6 cmV0dXJuKGw8eDEmJngyPHImJnQ8eTEmJnkyPGIpO2JyZWFrO2Nhc2UnaW50ZXJz ZWN0JzpyZXR1cm4obDx4MSsoZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLndp ZHRoLzIpJiZ4Mi0oZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzIp PHImJnQ8eTErKGRyYWdnYWJsZS5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMikm JnkyLShkcmFnZ2FibGUuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzIpPGIpO2Jy ZWFrO2Nhc2UncG9pbnRlcic6dmFyIGRyYWdnYWJsZUxlZnQ9KChkcmFnZ2FibGUu cG9zaXRpb25BYnN8fGRyYWdnYWJsZS5wb3NpdGlvbi5hYnNvbHV0ZSkubGVmdCso ZHJhZ2dhYmxlLmNsaWNrT2Zmc2V0fHxkcmFnZ2FibGUub2Zmc2V0LmNsaWNrKS5s ZWZ0KSxkcmFnZ2FibGVUb3A9KChkcmFnZ2FibGUucG9zaXRpb25BYnN8fGRyYWdn YWJsZS5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wKyhkcmFnZ2FibGUuY2xpY2tPZmZz ZXR8fGRyYWdnYWJsZS5vZmZzZXQuY2xpY2spLnRvcCksaXNPdmVyPSQudWkuaXNP dmVyKGRyYWdnYWJsZVRvcCxkcmFnZ2FibGVMZWZ0LHQsbCxkcm9wcGFibGUucHJv cG9ydGlvbnMuaGVpZ2h0LGRyb3BwYWJsZS5wcm9wb3J0aW9ucy53aWR0aCk7cmV0 dXJuIGlzT3ZlcjticmVhaztjYXNlJ3RvdWNoJzpyZXR1cm4oKHkxPj10JiZ5MTw9 Yil8fCh5Mj49dCYmeTI8PWIpfHwoeTE8dCYmeTI+YikpJiYoKHgxPj1sJiZ4MTw9 cil8fCh4Mj49bCYmeDI8PXIpfHwoeDE8bCYmeDI+cikpO2JyZWFrO2RlZmF1bHQ6 cmV0dXJuIGZhbHNlO2JyZWFrO319OyQudWkuZGRtYW5hZ2VyPXtjdXJyZW50Om51 bGwsZHJvcHBhYmxlczp7J2RlZmF1bHQnOltdfSxwcmVwYXJlT2Zmc2V0czpmdW5j dGlvbih0LGV2ZW50KXt2YXIgbT0kLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Qu b3B0aW9ucy5zY29wZV07dmFyIHR5cGU9ZXZlbnQ/ZXZlbnQudHlwZTpudWxsO3Zh ciBsaXN0PSh0LmN1cnJlbnRJdGVtfHx0LmVsZW1lbnQpLmZpbmQoIjpkYXRhKGRy b3BwYWJsZSkiKS5hbmRTZWxmKCk7ZHJvcHBhYmxlc0xvb3A6Zm9yKHZhciBpPTA7 aTxtLmxlbmd0aDtpKyspe2lmKG1baV0ub3B0aW9ucy5kaXNhYmxlZHx8KHQmJiFt W2ldLm9wdGlvbnMuYWNjZXB0LmNhbGwobVtpXS5lbGVtZW50WzBdLCh0LmN1cnJl bnRJdGVtfHx0LmVsZW1lbnQpKSkpY29udGludWU7Zm9yKHZhciBqPTA7ajxsaXN0 Lmxlbmd0aDtqKyspe2lmKGxpc3Rbal09PW1baV0uZWxlbWVudFswXSl7bVtpXS5w cm9wb3J0aW9ucy5oZWlnaHQ9MDtjb250aW51ZSBkcm9wcGFibGVzTG9vcDt9fTtt W2ldLnZpc2libGU9bVtpXS5lbGVtZW50LmNzcygiZGlzcGxheSIpIT0ibm9uZSI7 aWYoIW1baV0udmlzaWJsZSljb250aW51ZTttW2ldLm9mZnNldD1tW2ldLmVsZW1l bnQub2Zmc2V0KCk7bVtpXS5wcm9wb3J0aW9ucz17d2lkdGg6bVtpXS5lbGVtZW50 WzBdLm9mZnNldFdpZHRoLGhlaWdodDptW2ldLmVsZW1lbnRbMF0ub2Zmc2V0SGVp Z2h0fTtpZih0eXBlPT0ibW91c2Vkb3duIiltW2ldLl9hY3RpdmF0ZS5jYWxsKG1b aV0sZXZlbnQpO319LGRyb3A6ZnVuY3Rpb24oZHJhZ2dhYmxlLGV2ZW50KXt2YXIg ZHJvcHBlZD1mYWxzZTskLmVhY2goJC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tk cmFnZ2FibGUub3B0aW9ucy5zY29wZV0sZnVuY3Rpb24oKXtpZighdGhpcy5vcHRp b25zKXJldHVybjtpZighdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2li bGUmJiQudWkuaW50ZXJzZWN0KGRyYWdnYWJsZSx0aGlzLHRoaXMub3B0aW9ucy50 b2xlcmFuY2UpKQpkcm9wcGVkPXRoaXMuX2Ryb3AuY2FsbCh0aGlzLGV2ZW50KTtp ZighdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJnRoaXMub3B0 aW9ucy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sKGRyYWdnYWJsZS5jdXJy ZW50SXRlbXx8ZHJhZ2dhYmxlLmVsZW1lbnQpKSl7dGhpcy5pc291dD0xO3RoaXMu aXNvdmVyPTA7dGhpcy5fZGVhY3RpdmF0ZS5jYWxsKHRoaXMsZXZlbnQpO319KTty ZXR1cm4gZHJvcHBlZDt9LGRyYWc6ZnVuY3Rpb24oZHJhZ2dhYmxlLGV2ZW50KXtp ZihkcmFnZ2FibGUub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zKSQudWkuZGRtYW5h Z2VyLnByZXBhcmVPZmZzZXRzKGRyYWdnYWJsZSxldmVudCk7JC5lYWNoKCQudWku ZGRtYW5hZ2VyLmRyb3BwYWJsZXNbZHJhZ2dhYmxlLm9wdGlvbnMuc2NvcGVdLGZ1 bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkfHx0aGlzLmdyZWVkeUNo aWxkfHwhdGhpcy52aXNpYmxlKXJldHVybjt2YXIgaW50ZXJzZWN0cz0kLnVpLmlu dGVyc2VjdChkcmFnZ2FibGUsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlKTt2 YXIgYz0haW50ZXJzZWN0cyYmdGhpcy5pc292ZXI9PTE/J2lzb3V0JzooaW50ZXJz ZWN0cyYmdGhpcy5pc292ZXI9PTA/J2lzb3Zlcic6bnVsbCk7aWYoIWMpcmV0dXJu O3ZhciBwYXJlbnRJbnN0YW5jZTtpZih0aGlzLm9wdGlvbnMuZ3JlZWR5KXt2YXIg cGFyZW50PXRoaXMuZWxlbWVudC5wYXJlbnRzKCc6ZGF0YShkcm9wcGFibGUpOmVx KDApJyk7aWYocGFyZW50Lmxlbmd0aCl7cGFyZW50SW5zdGFuY2U9JC5kYXRhKHBh cmVudFswXSwnZHJvcHBhYmxlJyk7cGFyZW50SW5zdGFuY2UuZ3JlZWR5Q2hpbGQ9 KGM9PSdpc292ZXInPzE6MCk7fX0KaWYocGFyZW50SW5zdGFuY2UmJmM9PSdpc292 ZXInKXtwYXJlbnRJbnN0YW5jZVsnaXNvdmVyJ109MDtwYXJlbnRJbnN0YW5jZVsn aXNvdXQnXT0xO3BhcmVudEluc3RhbmNlLl9vdXQuY2FsbChwYXJlbnRJbnN0YW5j ZSxldmVudCk7fQp0aGlzW2NdPTE7dGhpc1tjPT0naXNvdXQnPydpc292ZXInOidp c291dCddPTA7dGhpc1tjPT0iaXNvdmVyIj8iX292ZXIiOiJfb3V0Il0uY2FsbCh0 aGlzLGV2ZW50KTtpZihwYXJlbnRJbnN0YW5jZSYmYz09J2lzb3V0Jyl7cGFyZW50 SW5zdGFuY2VbJ2lzb3V0J109MDtwYXJlbnRJbnN0YW5jZVsnaXNvdmVyJ109MTtw YXJlbnRJbnN0YW5jZS5fb3Zlci5jYWxsKHBhcmVudEluc3RhbmNlLGV2ZW50KTt9 fSk7fX07fSkoalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JC53aWRnZXQoInVpLnJlc2l6 YWJsZSIsJC5leHRlbmQoe30sJC51aS5tb3VzZSx7X2luaXQ6ZnVuY3Rpb24oKXt2 YXIgc2VsZj10aGlzLG89dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudC5hZGRDbGFz cygidWktcmVzaXphYmxlIik7JC5leHRlbmQodGhpcyx7X2FzcGVjdFJhdGlvOiEh KG8uYXNwZWN0UmF0aW8pLGFzcGVjdFJhdGlvOm8uYXNwZWN0UmF0aW8sb3JpZ2lu YWxFbGVtZW50OnRoaXMuZWxlbWVudCxfcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVt ZW50czpbXSxfaGVscGVyOm8uaGVscGVyfHxvLmdob3N0fHxvLmFuaW1hdGU/by5o ZWxwZXJ8fCd1aS1yZXNpemFibGUtaGVscGVyJzpudWxsfSk7aWYodGhpcy5lbGVt ZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9jYW52YXN8dGV4dGFyZWF8aW5wdXR8c2Vs ZWN0fGJ1dHRvbnxpbWcvaSkpe2lmKC9yZWxhdGl2ZS8udGVzdCh0aGlzLmVsZW1l bnQuY3NzKCdwb3NpdGlvbicpKSYmJC5icm93c2VyLm9wZXJhKQp0aGlzLmVsZW1l bnQuY3NzKHtwb3NpdGlvbjoncmVsYXRpdmUnLHRvcDonYXV0bycsbGVmdDonYXV0 byd9KTt0aGlzLmVsZW1lbnQud3JhcCgkKCc8ZGl2IGNsYXNzPSJ1aS13cmFwcGVy IiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbjsiPjwvZGl2PicpLmNzcyh7cG9zaXRp b246dGhpcy5lbGVtZW50LmNzcygncG9zaXRpb24nKSx3aWR0aDp0aGlzLmVsZW1l bnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQo KSx0b3A6dGhpcy5lbGVtZW50LmNzcygndG9wJyksbGVmdDp0aGlzLmVsZW1lbnQu Y3NzKCdsZWZ0Jyl9KSk7dGhpcy5lbGVtZW50PXRoaXMuZWxlbWVudC5wYXJlbnQo KS5kYXRhKCJyZXNpemFibGUiLHRoaXMuZWxlbWVudC5kYXRhKCdyZXNpemFibGUn KSk7dGhpcy5lbGVtZW50SXNXcmFwcGVyPXRydWU7dGhpcy5lbGVtZW50LmNzcyh7 bWFyZ2luTGVmdDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkxlZnQi KSxtYXJnaW5Ub3A6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Ub3Ai KSxtYXJnaW5SaWdodDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblJp Z2h0IiksbWFyZ2luQm90dG9tOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFy Z2luQm90dG9tIil9KTt0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbkxl ZnQ6MCxtYXJnaW5Ub3A6MCxtYXJnaW5SaWdodDowLG1hcmdpbkJvdHRvbTowfSk7 dGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlPXRoaXMub3JpZ2luYWxFbGVtZW50LmNz cygncmVzaXplJyk7dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCdyZXNpemUnLCdu b25lJyk7dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5wdXNoKHRo aXMub3JpZ2luYWxFbGVtZW50LmNzcyh7cG9zaXRpb246J3N0YXRpYycsem9vbTox LGRpc3BsYXk6J2Jsb2NrJ30pKTt0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21h cmdpbjp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoJ21hcmdpbicpfSk7dGhpcy5f cHJvcG9ydGlvbmFsbHlSZXNpemUoKTt9CnRoaXMuaGFuZGxlcz1vLmhhbmRsZXN8 fCghJCgnLnVpLXJlc2l6YWJsZS1oYW5kbGUnLHRoaXMuZWxlbWVudCkubGVuZ3Ro PyJlLHMsc2UiOntuOicudWktcmVzaXphYmxlLW4nLGU6Jy51aS1yZXNpemFibGUt ZScsczonLnVpLXJlc2l6YWJsZS1zJyx3OicudWktcmVzaXphYmxlLXcnLHNlOicu dWktcmVzaXphYmxlLXNlJyxzdzonLnVpLXJlc2l6YWJsZS1zdycsbmU6Jy51aS1y ZXNpemFibGUtbmUnLG53OicudWktcmVzaXphYmxlLW53J30pO2lmKHRoaXMuaGFu ZGxlcy5jb25zdHJ1Y3Rvcj09U3RyaW5nKXtpZih0aGlzLmhhbmRsZXM9PSdhbGwn KXRoaXMuaGFuZGxlcz0nbixlLHMsdyxzZSxzdyxuZSxudyc7dmFyIG49dGhpcy5o YW5kbGVzLnNwbGl0KCIsIik7dGhpcy5oYW5kbGVzPXt9O2Zvcih2YXIgaT0wO2k8 bi5sZW5ndGg7aSsrKXt2YXIgaGFuZGxlPSQudHJpbShuW2ldKSxobmFtZT0ndWkt cmVzaXphYmxlLScraGFuZGxlO3ZhciBheGlzPSQoJzxkaXYgY2xhc3M9InVpLXJl c2l6YWJsZS1oYW5kbGUgJytobmFtZSsnIj48L2Rpdj4nKTtpZigvc3d8c2V8bmV8 bncvLnRlc3QoaGFuZGxlKSlheGlzLmNzcyh7ekluZGV4Oisrby56SW5kZXh9KTtp Zignc2UnPT1oYW5kbGUpe2F4aXMuYWRkQ2xhc3MoJ3VpLWljb24gdWktaWNvbi1n cmlwc21hbGwtZGlhZ29uYWwtc2UnKTt9O3RoaXMuaGFuZGxlc1toYW5kbGVdPScu dWktcmVzaXphYmxlLScraGFuZGxlO3RoaXMuZWxlbWVudC5hcHBlbmQoYXhpcyk7 fX0KdGhpcy5fcmVuZGVyQXhpcz1mdW5jdGlvbih0YXJnZXQpe3RhcmdldD10YXJn ZXR8fHRoaXMuZWxlbWVudDtmb3IodmFyIGkgaW4gdGhpcy5oYW5kbGVzKXtpZih0 aGlzLmhhbmRsZXNbaV0uY29uc3RydWN0b3I9PVN0cmluZykKdGhpcy5oYW5kbGVz W2ldPSQodGhpcy5oYW5kbGVzW2ldLHRoaXMuZWxlbWVudCkuc2hvdygpO2lmKHRo aXMuZWxlbWVudElzV3JhcHBlciYmdGhpcy5vcmlnaW5hbEVsZW1lbnRbMF0ubm9k ZU5hbWUubWF0Y2goL3RleHRhcmVhfGlucHV0fHNlbGVjdHxidXR0b24vaSkpe3Zh ciBheGlzPSQodGhpcy5oYW5kbGVzW2ldLHRoaXMuZWxlbWVudCkscGFkV3JhcHBl cj0wO3BhZFdyYXBwZXI9L3N3fG5lfG53fHNlfG58cy8udGVzdChpKT9heGlzLm91 dGVySGVpZ2h0KCk6YXhpcy5vdXRlcldpZHRoKCk7dmFyIHBhZFBvcz1bJ3BhZGRp bmcnLC9uZXxud3xuLy50ZXN0KGkpPydUb3AnOi9zZXxzd3xzLy50ZXN0KGkpPydC b3R0b20nOi9eZSQvLnRlc3QoaSk/J1JpZ2h0JzonTGVmdCddLmpvaW4oIiIpO3Rh cmdldC5jc3MocGFkUG9zLHBhZFdyYXBwZXIpO3RoaXMuX3Byb3BvcnRpb25hbGx5 UmVzaXplKCk7fQppZighJCh0aGlzLmhhbmRsZXNbaV0pLmxlbmd0aCkKY29udGlu dWU7fX07dGhpcy5fcmVuZGVyQXhpcyh0aGlzLmVsZW1lbnQpO3RoaXMuX2hhbmRs ZXM9JCgnLnVpLXJlc2l6YWJsZS1oYW5kbGUnLHRoaXMuZWxlbWVudCkuZGlzYWJs ZVNlbGVjdGlvbigpO3RoaXMuX2hhbmRsZXMubW91c2VvdmVyKGZ1bmN0aW9uKCl7 aWYoIXNlbGYucmVzaXppbmcpe2lmKHRoaXMuY2xhc3NOYW1lKQp2YXIgYXhpcz10 aGlzLmNsYXNzTmFtZS5tYXRjaCgvdWktcmVzaXphYmxlLShzZXxzd3xuZXxud3xu fGV8c3x3KS9pKTtzZWxmLmF4aXM9YXhpcyYmYXhpc1sxXT9heGlzWzFdOidzZSc7 fX0pO2lmKG8uYXV0b0hpZGUpe3RoaXMuX2hhbmRsZXMuaGlkZSgpOyQodGhpcy5l bGVtZW50KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIikuaG92ZXIo ZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtYXV0 b2hpZGUiKTtzZWxmLl9oYW5kbGVzLnNob3coKTt9LGZ1bmN0aW9uKCl7aWYoIXNl bGYucmVzaXppbmcpeyQodGhpcykuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRv aGlkZSIpO3NlbGYuX2hhbmRsZXMuaGlkZSgpO319KTt9CnRoaXMuX21vdXNlSW5p dCgpO30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX21vdXNlRGVzdHJveSgpO3Zh ciBfZGVzdHJveT1mdW5jdGlvbihleHApeyQoZXhwKS5yZW1vdmVDbGFzcygidWkt cmVzaXphYmxlIHVpLXJlc2l6YWJsZS1kaXNhYmxlZCB1aS1yZXNpemFibGUtcmVz aXppbmciKS5yZW1vdmVEYXRhKCJyZXNpemFibGUiKS51bmJpbmQoIi5yZXNpemFi bGUiKS5maW5kKCcudWktcmVzaXphYmxlLWhhbmRsZScpLnJlbW92ZSgpO307aWYo dGhpcy5lbGVtZW50SXNXcmFwcGVyKXtfZGVzdHJveSh0aGlzLmVsZW1lbnQpO3Zh ciB3cmFwcGVyPXRoaXMuZWxlbWVudDt3cmFwcGVyLnBhcmVudCgpLmFwcGVuZCh0 aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOndyYXBwZXIuY3NzKCdw b3NpdGlvbicpLHdpZHRoOndyYXBwZXIub3V0ZXJXaWR0aCgpLGhlaWdodDp3cmFw cGVyLm91dGVySGVpZ2h0KCksdG9wOndyYXBwZXIuY3NzKCd0b3AnKSxsZWZ0Ondy YXBwZXIuY3NzKCdsZWZ0Jyl9KSkuZW5kKCkucmVtb3ZlKCk7fQp0aGlzLm9yaWdp bmFsRWxlbWVudC5jc3MoJ3Jlc2l6ZScsdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxl KTtfZGVzdHJveSh0aGlzLm9yaWdpbmFsRWxlbWVudCk7fSxfbW91c2VDYXB0dXJl OmZ1bmN0aW9uKGV2ZW50KXt2YXIgaGFuZGxlPWZhbHNlO2Zvcih2YXIgaSBpbiB0 aGlzLmhhbmRsZXMpe2lmKCQodGhpcy5oYW5kbGVzW2ldKVswXT09ZXZlbnQudGFy Z2V0KWhhbmRsZT10cnVlO30KcmV0dXJuIHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8 ISFoYW5kbGU7fSxfbW91c2VTdGFydDpmdW5jdGlvbihldmVudCl7dmFyIG89dGhp cy5vcHRpb25zLGluaVBvcz10aGlzLmVsZW1lbnQucG9zaXRpb24oKSxlbD10aGlz LmVsZW1lbnQ7dGhpcy5yZXNpemluZz10cnVlO3RoaXMuZG9jdW1lbnRTY3JvbGw9 e3RvcDokKGRvY3VtZW50KS5zY3JvbGxUb3AoKSxsZWZ0OiQoZG9jdW1lbnQpLnNj cm9sbExlZnQoKX07aWYoZWwuaXMoJy51aS1kcmFnZ2FibGUnKXx8KC9hYnNvbHV0 ZS8pLnRlc3QoZWwuY3NzKCdwb3NpdGlvbicpKSl7ZWwuY3NzKHtwb3NpdGlvbjon YWJzb2x1dGUnLHRvcDppbmlQb3MudG9wLGxlZnQ6aW5pUG9zLmxlZnR9KTt9Cmlm KCQuYnJvd3Nlci5vcGVyYSYmKC9yZWxhdGl2ZS8pLnRlc3QoZWwuY3NzKCdwb3Np dGlvbicpKSkKZWwuY3NzKHtwb3NpdGlvbjoncmVsYXRpdmUnLHRvcDonYXV0bycs bGVmdDonYXV0byd9KTt0aGlzLl9yZW5kZXJQcm94eSgpO3ZhciBjdXJsZWZ0PW51 bSh0aGlzLmhlbHBlci5jc3MoJ2xlZnQnKSksY3VydG9wPW51bSh0aGlzLmhlbHBl ci5jc3MoJ3RvcCcpKTtpZihvLmNvbnRhaW5tZW50KXtjdXJsZWZ0Kz0kKG8uY29u dGFpbm1lbnQpLnNjcm9sbExlZnQoKXx8MDtjdXJ0b3ArPSQoby5jb250YWlubWVu dCkuc2Nyb2xsVG9wKCl8fDA7fQp0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZz ZXQoKTt0aGlzLnBvc2l0aW9uPXtsZWZ0OmN1cmxlZnQsdG9wOmN1cnRvcH07dGhp cy5zaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6ZWwub3V0ZXJXaWR0aCgpLGhlaWdo dDplbC5vdXRlckhlaWdodCgpfTp7d2lkdGg6ZWwud2lkdGgoKSxoZWlnaHQ6ZWwu aGVpZ2h0KCl9O3RoaXMub3JpZ2luYWxTaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6 ZWwub3V0ZXJXaWR0aCgpLGhlaWdodDplbC5vdXRlckhlaWdodCgpfTp7d2lkdGg6 ZWwud2lkdGgoKSxoZWlnaHQ6ZWwuaGVpZ2h0KCl9O3RoaXMub3JpZ2luYWxQb3Np dGlvbj17bGVmdDpjdXJsZWZ0LHRvcDpjdXJ0b3B9O3RoaXMuc2l6ZURpZmY9e3dp ZHRoOmVsLm91dGVyV2lkdGgoKS1lbC53aWR0aCgpLGhlaWdodDplbC5vdXRlckhl aWdodCgpLWVsLmhlaWdodCgpfTt0aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbj17 bGVmdDpldmVudC5wYWdlWCx0b3A6ZXZlbnQucGFnZVl9O3RoaXMuYXNwZWN0UmF0 aW89KHR5cGVvZiBvLmFzcGVjdFJhdGlvPT0nbnVtYmVyJyk/by5hc3BlY3RSYXRp bzooKHRoaXMub3JpZ2luYWxTaXplLndpZHRoL3RoaXMub3JpZ2luYWxTaXplLmhl aWdodCl8fDEpO3ZhciBjdXJzb3I9JCgnLnVpLXJlc2l6YWJsZS0nK3RoaXMuYXhp cykuY3NzKCdjdXJzb3InKTskKCdib2R5JykuY3NzKCdjdXJzb3InLGN1cnNvcj09 J2F1dG8nP3RoaXMuYXhpcysnLXJlc2l6ZSc6Y3Vyc29yKTtlbC5hZGRDbGFzcygi dWktcmVzaXphYmxlLXJlc2l6aW5nIik7dGhpcy5fcHJvcGFnYXRlKCJzdGFydCIs ZXZlbnQpO3JldHVybiB0cnVlO30sX21vdXNlRHJhZzpmdW5jdGlvbihldmVudCl7 dmFyIGVsPXRoaXMuaGVscGVyLG89dGhpcy5vcHRpb25zLHByb3BzPXt9LHNlbGY9 dGhpcyxzbXA9dGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb24sYT10aGlzLmF4aXM7 dmFyIGR4PShldmVudC5wYWdlWC1zbXAubGVmdCl8fDAsZHk9KGV2ZW50LnBhZ2VZ LXNtcC50b3ApfHwwO3ZhciB0cmlnZ2VyPXRoaXMuX2NoYW5nZVthXTtpZighdHJp Z2dlcilyZXR1cm4gZmFsc2U7dmFyIGRhdGE9dHJpZ2dlci5hcHBseSh0aGlzLFtl dmVudCxkeCxkeV0pLGllNj0kLmJyb3dzZXIubXNpZSYmJC5icm93c2VyLnZlcnNp b248Nyxjc2RpZj10aGlzLnNpemVEaWZmO2lmKHRoaXMuX2FzcGVjdFJhdGlvfHxl dmVudC5zaGlmdEtleSkKZGF0YT10aGlzLl91cGRhdGVSYXRpbyhkYXRhLGV2ZW50 KTtkYXRhPXRoaXMuX3Jlc3BlY3RTaXplKGRhdGEsZXZlbnQpO3RoaXMuX3Byb3Bh Z2F0ZSgicmVzaXplIixldmVudCk7ZWwuY3NzKHt0b3A6dGhpcy5wb3NpdGlvbi50 b3ArInB4IixsZWZ0OnRoaXMucG9zaXRpb24ubGVmdCsicHgiLHdpZHRoOnRoaXMu c2l6ZS53aWR0aCsicHgiLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0KyJweCJ9KTtp ZighdGhpcy5faGVscGVyJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1l bnRzLmxlbmd0aCkKdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKTt0aGlzLl91 cGRhdGVDYWNoZShkYXRhKTt0aGlzLl90cmlnZ2VyKCdyZXNpemUnLGV2ZW50LHRo aXMudWkoKSk7cmV0dXJuIGZhbHNlO30sX21vdXNlU3RvcDpmdW5jdGlvbihldmVu dCl7dGhpcy5yZXNpemluZz1mYWxzZTt2YXIgbz10aGlzLm9wdGlvbnMsc2VsZj10 aGlzO2lmKHRoaXMuX2hlbHBlcil7dmFyIHByPXRoaXMuX3Byb3BvcnRpb25hbGx5 UmVzaXplRWxlbWVudHMsaXN0YT1wci5sZW5ndGgmJigvdGV4dGFyZWEvaSkudGVz dChwclswXS5ub2RlTmFtZSksc29mZnNldGg9aXN0YSYmJC51aS5oYXNTY3JvbGwo cHJbMF0sJ2xlZnQnKT8wOnNlbGYuc2l6ZURpZmYuaGVpZ2h0LHNvZmZzZXR3PWlz dGE/MDpzZWxmLnNpemVEaWZmLndpZHRoO3ZhciBzPXt3aWR0aDooc2VsZi5zaXpl LndpZHRoLXNvZmZzZXR3KSxoZWlnaHQ6KHNlbGYuc2l6ZS5oZWlnaHQtc29mZnNl dGgpfSxsZWZ0PShwYXJzZUludChzZWxmLmVsZW1lbnQuY3NzKCdsZWZ0JyksMTAp KyhzZWxmLnBvc2l0aW9uLmxlZnQtc2VsZi5vcmlnaW5hbFBvc2l0aW9uLmxlZnQp KXx8bnVsbCx0b3A9KHBhcnNlSW50KHNlbGYuZWxlbWVudC5jc3MoJ3RvcCcpLDEw KSsoc2VsZi5wb3NpdGlvbi50b3Atc2VsZi5vcmlnaW5hbFBvc2l0aW9uLnRvcCkp fHxudWxsO2lmKCFvLmFuaW1hdGUpCnRoaXMuZWxlbWVudC5jc3MoJC5leHRlbmQo cyx7dG9wOnRvcCxsZWZ0OmxlZnR9KSk7c2VsZi5oZWxwZXIuaGVpZ2h0KHNlbGYu c2l6ZS5oZWlnaHQpO3NlbGYuaGVscGVyLndpZHRoKHNlbGYuc2l6ZS53aWR0aCk7 aWYodGhpcy5faGVscGVyJiYhby5hbmltYXRlKXRoaXMuX3Byb3BvcnRpb25hbGx5 UmVzaXplKCk7fQokKCdib2R5JykuY3NzKCdjdXJzb3InLCdhdXRvJyk7dGhpcy5l bGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKTt0aGlz Ll9wcm9wYWdhdGUoInN0b3AiLGV2ZW50KTtpZih0aGlzLl9oZWxwZXIpdGhpcy5o ZWxwZXIucmVtb3ZlKCk7cmV0dXJuIGZhbHNlO30sX3VwZGF0ZUNhY2hlOmZ1bmN0 aW9uKGRhdGEpe3ZhciBvPXRoaXMub3B0aW9uczt0aGlzLm9mZnNldD10aGlzLmhl bHBlci5vZmZzZXQoKTtpZihpc051bWJlcihkYXRhLmxlZnQpKXRoaXMucG9zaXRp b24ubGVmdD1kYXRhLmxlZnQ7aWYoaXNOdW1iZXIoZGF0YS50b3ApKXRoaXMucG9z aXRpb24udG9wPWRhdGEudG9wO2lmKGlzTnVtYmVyKGRhdGEuaGVpZ2h0KSl0aGlz LnNpemUuaGVpZ2h0PWRhdGEuaGVpZ2h0O2lmKGlzTnVtYmVyKGRhdGEud2lkdGgp KXRoaXMuc2l6ZS53aWR0aD1kYXRhLndpZHRoO30sX3VwZGF0ZVJhdGlvOmZ1bmN0 aW9uKGRhdGEsZXZlbnQpe3ZhciBvPXRoaXMub3B0aW9ucyxjcG9zPXRoaXMucG9z aXRpb24sY3NpemU9dGhpcy5zaXplLGE9dGhpcy5heGlzO2lmKGRhdGEuaGVpZ2h0 KWRhdGEud2lkdGg9KGNzaXplLmhlaWdodCp0aGlzLmFzcGVjdFJhdGlvKTtlbHNl IGlmKGRhdGEud2lkdGgpZGF0YS5oZWlnaHQ9KGNzaXplLndpZHRoL3RoaXMuYXNw ZWN0UmF0aW8pO2lmKGE9PSdzdycpe2RhdGEubGVmdD1jcG9zLmxlZnQrKGNzaXpl LndpZHRoLWRhdGEud2lkdGgpO2RhdGEudG9wPW51bGw7fQppZihhPT0nbncnKXtk YXRhLnRvcD1jcG9zLnRvcCsoY3NpemUuaGVpZ2h0LWRhdGEuaGVpZ2h0KTtkYXRh LmxlZnQ9Y3Bvcy5sZWZ0Kyhjc2l6ZS53aWR0aC1kYXRhLndpZHRoKTt9CnJldHVy biBkYXRhO30sX3Jlc3BlY3RTaXplOmZ1bmN0aW9uKGRhdGEsZXZlbnQpe3ZhciBl bD10aGlzLmhlbHBlcixvPXRoaXMub3B0aW9ucyxwUmF0aW89dGhpcy5fYXNwZWN0 UmF0aW98fGV2ZW50LnNoaWZ0S2V5LGE9dGhpcy5heGlzLGlzbWF4dz1pc051bWJl cihkYXRhLndpZHRoKSYmby5tYXhXaWR0aCYmKG8ubWF4V2lkdGg8ZGF0YS53aWR0 aCksaXNtYXhoPWlzTnVtYmVyKGRhdGEuaGVpZ2h0KSYmby5tYXhIZWlnaHQmJihv Lm1heEhlaWdodDxkYXRhLmhlaWdodCksaXNtaW53PWlzTnVtYmVyKGRhdGEud2lk dGgpJiZvLm1pbldpZHRoJiYoby5taW5XaWR0aD5kYXRhLndpZHRoKSxpc21pbmg9 aXNOdW1iZXIoZGF0YS5oZWlnaHQpJiZvLm1pbkhlaWdodCYmKG8ubWluSGVpZ2h0 PmRhdGEuaGVpZ2h0KTtpZihpc21pbncpZGF0YS53aWR0aD1vLm1pbldpZHRoO2lm KGlzbWluaClkYXRhLmhlaWdodD1vLm1pbkhlaWdodDtpZihpc21heHcpZGF0YS53 aWR0aD1vLm1heFdpZHRoO2lmKGlzbWF4aClkYXRhLmhlaWdodD1vLm1heEhlaWdo dDt2YXIgZHc9dGhpcy5vcmlnaW5hbFBvc2l0aW9uLmxlZnQrdGhpcy5vcmlnaW5h bFNpemUud2lkdGgsZGg9dGhpcy5wb3NpdGlvbi50b3ArdGhpcy5zaXplLmhlaWdo dDt2YXIgY3c9L3N3fG53fHcvLnRlc3QoYSksY2g9L253fG5lfG4vLnRlc3QoYSk7 aWYoaXNtaW53JiZjdylkYXRhLmxlZnQ9ZHctby5taW5XaWR0aDtpZihpc21heHcm JmN3KWRhdGEubGVmdD1kdy1vLm1heFdpZHRoO2lmKGlzbWluaCYmY2gpZGF0YS50 b3A9ZGgtby5taW5IZWlnaHQ7aWYoaXNtYXhoJiZjaClkYXRhLnRvcD1kaC1vLm1h eEhlaWdodDt2YXIgaXNOb3R3aD0hZGF0YS53aWR0aCYmIWRhdGEuaGVpZ2h0O2lm KGlzTm90d2gmJiFkYXRhLmxlZnQmJmRhdGEudG9wKWRhdGEudG9wPW51bGw7ZWxz ZSBpZihpc05vdHdoJiYhZGF0YS50b3AmJmRhdGEubGVmdClkYXRhLmxlZnQ9bnVs bDtyZXR1cm4gZGF0YTt9LF9wcm9wb3J0aW9uYWxseVJlc2l6ZTpmdW5jdGlvbigp e3ZhciBvPXRoaXMub3B0aW9ucztpZighdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNp emVFbGVtZW50cy5sZW5ndGgpcmV0dXJuO3ZhciBlbGVtZW50PXRoaXMuaGVscGVy fHx0aGlzLmVsZW1lbnQ7Zm9yKHZhciBpPTA7aTx0aGlzLl9wcm9wb3J0aW9uYWxs eVJlc2l6ZUVsZW1lbnRzLmxlbmd0aDtpKyspe3ZhciBwcmVsPXRoaXMuX3Byb3Bv cnRpb25hbGx5UmVzaXplRWxlbWVudHNbaV07aWYoIXRoaXMuYm9yZGVyRGlmKXt2 YXIgYj1bcHJlbC5jc3MoJ2JvcmRlclRvcFdpZHRoJykscHJlbC5jc3MoJ2JvcmRl clJpZ2h0V2lkdGgnKSxwcmVsLmNzcygnYm9yZGVyQm90dG9tV2lkdGgnKSxwcmVs LmNzcygnYm9yZGVyTGVmdFdpZHRoJyldLHA9W3ByZWwuY3NzKCdwYWRkaW5nVG9w JykscHJlbC5jc3MoJ3BhZGRpbmdSaWdodCcpLHByZWwuY3NzKCdwYWRkaW5nQm90 dG9tJykscHJlbC5jc3MoJ3BhZGRpbmdMZWZ0JyldO3RoaXMuYm9yZGVyRGlmPSQu bWFwKGIsZnVuY3Rpb24odixpKXt2YXIgYm9yZGVyPXBhcnNlSW50KHYsMTApfHww LHBhZGRpbmc9cGFyc2VJbnQocFtpXSwxMCl8fDA7cmV0dXJuIGJvcmRlcitwYWRk aW5nO30pO30KaWYoJC5icm93c2VyLm1zaWUmJiEoISgkKGVsZW1lbnQpLmlzKCc6 aGlkZGVuJyl8fCQoZWxlbWVudCkucGFyZW50cygnOmhpZGRlbicpLmxlbmd0aCkp KQpjb250aW51ZTtwcmVsLmNzcyh7aGVpZ2h0OihlbGVtZW50LmhlaWdodCgpLXRo aXMuYm9yZGVyRGlmWzBdLXRoaXMuYm9yZGVyRGlmWzJdKXx8MCx3aWR0aDooZWxl bWVudC53aWR0aCgpLXRoaXMuYm9yZGVyRGlmWzFdLXRoaXMuYm9yZGVyRGlmWzNd KXx8MH0pO307fSxfcmVuZGVyUHJveHk6ZnVuY3Rpb24oKXt2YXIgZWw9dGhpcy5l bGVtZW50LG89dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudE9mZnNldD1lbC5vZmZz ZXQoKTtpZih0aGlzLl9oZWxwZXIpe3RoaXMuaGVscGVyPXRoaXMuaGVscGVyfHwk KCc8ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47Ij48L2Rpdj4nKTt2YXIgaWU2 PSQuYnJvd3Nlci5tc2llJiYkLmJyb3dzZXIudmVyc2lvbjw3LGllNm9mZnNldD0o aWU2PzE6MCkscHh5b2Zmc2V0PShpZTY/MjotMSk7dGhpcy5oZWxwZXIuYWRkQ2xh c3ModGhpcy5faGVscGVyKS5jc3Moe3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldp ZHRoKCkrcHh5b2Zmc2V0LGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQo KStweHlvZmZzZXQscG9zaXRpb246J2Fic29sdXRlJyxsZWZ0OnRoaXMuZWxlbWVu dE9mZnNldC5sZWZ0LWllNm9mZnNldCsncHgnLHRvcDp0aGlzLmVsZW1lbnRPZmZz ZXQudG9wLWllNm9mZnNldCsncHgnLHpJbmRleDorK28uekluZGV4fSk7dGhpcy5o ZWxwZXIuYXBwZW5kVG8oImJvZHkiKS5kaXNhYmxlU2VsZWN0aW9uKCk7fWVsc2V7 dGhpcy5oZWxwZXI9dGhpcy5lbGVtZW50O319LF9jaGFuZ2U6e2U6ZnVuY3Rpb24o ZXZlbnQsZHgsZHkpe3JldHVybnt3aWR0aDp0aGlzLm9yaWdpbmFsU2l6ZS53aWR0 aCtkeH07fSx3OmZ1bmN0aW9uKGV2ZW50LGR4LGR5KXt2YXIgbz10aGlzLm9wdGlv bnMsY3M9dGhpcy5vcmlnaW5hbFNpemUsc3A9dGhpcy5vcmlnaW5hbFBvc2l0aW9u O3JldHVybntsZWZ0OnNwLmxlZnQrZHgsd2lkdGg6Y3Mud2lkdGgtZHh9O30sbjpm dW5jdGlvbihldmVudCxkeCxkeSl7dmFyIG89dGhpcy5vcHRpb25zLGNzPXRoaXMu b3JpZ2luYWxTaXplLHNwPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57dG9w OnNwLnRvcCtkeSxoZWlnaHQ6Y3MuaGVpZ2h0LWR5fTt9LHM6ZnVuY3Rpb24oZXZl bnQsZHgsZHkpe3JldHVybntoZWlnaHQ6dGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0 K2R5fTt9LHNlOmZ1bmN0aW9uKGV2ZW50LGR4LGR5KXtyZXR1cm4gJC5leHRlbmQo dGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5n ZS5lLmFwcGx5KHRoaXMsW2V2ZW50LGR4LGR5XSkpO30sc3c6ZnVuY3Rpb24oZXZl bnQsZHgsZHkpe3JldHVybiAkLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0 aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbZXZlbnQs ZHgsZHldKSk7fSxuZTpmdW5jdGlvbihldmVudCxkeCxkeSl7cmV0dXJuICQuZXh0 ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9j aGFuZ2UuZS5hcHBseSh0aGlzLFtldmVudCxkeCxkeV0pKTt9LG53OmZ1bmN0aW9u KGV2ZW50LGR4LGR5KXtyZXR1cm4gJC5leHRlbmQodGhpcy5fY2hhbmdlLm4uYXBw bHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW2V2 ZW50LGR4LGR5XSkpO319LF9wcm9wYWdhdGU6ZnVuY3Rpb24obixldmVudCl7JC51 aS5wbHVnaW4uY2FsbCh0aGlzLG4sW2V2ZW50LHRoaXMudWkoKV0pOyhuIT0icmVz aXplIiYmdGhpcy5fdHJpZ2dlcihuLGV2ZW50LHRoaXMudWkoKSkpO30scGx1Z2lu czp7fSx1aTpmdW5jdGlvbigpe3JldHVybntvcmlnaW5hbEVsZW1lbnQ6dGhpcy5v cmlnaW5hbEVsZW1lbnQsZWxlbWVudDp0aGlzLmVsZW1lbnQsaGVscGVyOnRoaXMu aGVscGVyLHBvc2l0aW9uOnRoaXMucG9zaXRpb24sc2l6ZTp0aGlzLnNpemUsb3Jp Z2luYWxTaXplOnRoaXMub3JpZ2luYWxTaXplLG9yaWdpbmFsUG9zaXRpb246dGhp cy5vcmlnaW5hbFBvc2l0aW9ufTt9fSkpOyQuZXh0ZW5kKCQudWkucmVzaXphYmxl LHt2ZXJzaW9uOiIxLjcuMiIsZXZlbnRQcmVmaXg6InJlc2l6ZSIsZGVmYXVsdHM6 e2Fsc29SZXNpemU6ZmFsc2UsYW5pbWF0ZTpmYWxzZSxhbmltYXRlRHVyYXRpb246 InNsb3ciLGFuaW1hdGVFYXNpbmc6InN3aW5nIixhc3BlY3RSYXRpbzpmYWxzZSxh dXRvSGlkZTpmYWxzZSxjYW5jZWw6IjppbnB1dCxvcHRpb24iLGNvbnRhaW5tZW50 OmZhbHNlLGRlbGF5OjAsZGlzdGFuY2U6MSxnaG9zdDpmYWxzZSxncmlkOmZhbHNl LGhhbmRsZXM6ImUscyxzZSIsaGVscGVyOmZhbHNlLG1heEhlaWdodDpudWxsLG1h eFdpZHRoOm51bGwsbWluSGVpZ2h0OjEwLG1pbldpZHRoOjEwLHpJbmRleDoxMDAw fX0pOyQudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYWxzb1Jlc2l6ZSIse3N0 YXJ0OmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgc2VsZj0kKHRoaXMpLmRhdGEoInJl c2l6YWJsZSIpLG89c2VsZi5vcHRpb25zO19zdG9yZT1mdW5jdGlvbihleHApeyQo ZXhwKS5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS5kYXRhKCJyZXNpemFibGUtYWxz b3Jlc2l6ZSIse3dpZHRoOnBhcnNlSW50KCQodGhpcykud2lkdGgoKSwxMCksaGVp Z2h0OnBhcnNlSW50KCQodGhpcykuaGVpZ2h0KCksMTApLGxlZnQ6cGFyc2VJbnQo JCh0aGlzKS5jc3MoJ2xlZnQnKSwxMCksdG9wOnBhcnNlSW50KCQodGhpcykuY3Nz KCd0b3AnKSwxMCl9KTt9KTt9O2lmKHR5cGVvZihvLmFsc29SZXNpemUpPT0nb2Jq ZWN0JyYmIW8uYWxzb1Jlc2l6ZS5wYXJlbnROb2RlKXtpZihvLmFsc29SZXNpemUu bGVuZ3RoKXtvLmFsc29SZXNpemU9by5hbHNvUmVzaXplWzBdO19zdG9yZShvLmFs c29SZXNpemUpO30KZWxzZXskLmVhY2goby5hbHNvUmVzaXplLGZ1bmN0aW9uKGV4 cCxjKXtfc3RvcmUoZXhwKTt9KTt9fWVsc2V7X3N0b3JlKG8uYWxzb1Jlc2l6ZSk7 fX0scmVzaXplOmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgc2VsZj0kKHRoaXMpLmRh dGEoInJlc2l6YWJsZSIpLG89c2VsZi5vcHRpb25zLG9zPXNlbGYub3JpZ2luYWxT aXplLG9wPXNlbGYub3JpZ2luYWxQb3NpdGlvbjt2YXIgZGVsdGE9e2hlaWdodDoo c2VsZi5zaXplLmhlaWdodC1vcy5oZWlnaHQpfHwwLHdpZHRoOihzZWxmLnNpemUu d2lkdGgtb3Mud2lkdGgpfHwwLHRvcDooc2VsZi5wb3NpdGlvbi50b3Atb3AudG9w KXx8MCxsZWZ0OihzZWxmLnBvc2l0aW9uLmxlZnQtb3AubGVmdCl8fDB9LF9hbHNv UmVzaXplPWZ1bmN0aW9uKGV4cCxjKXskKGV4cCkuZWFjaChmdW5jdGlvbigpe3Zh ciBlbD0kKHRoaXMpLHN0YXJ0PSQodGhpcykuZGF0YSgicmVzaXphYmxlLWFsc29y ZXNpemUiKSxzdHlsZT17fSxjc3M9YyYmYy5sZW5ndGg/YzpbJ3dpZHRoJywnaGVp Z2h0JywndG9wJywnbGVmdCddOyQuZWFjaChjc3N8fFsnd2lkdGgnLCdoZWlnaHQn LCd0b3AnLCdsZWZ0J10sZnVuY3Rpb24oaSxwcm9wKXt2YXIgc3VtPShzdGFydFtw cm9wXXx8MCkrKGRlbHRhW3Byb3BdfHwwKTtpZihzdW0mJnN1bT49MCkKc3R5bGVb cHJvcF09c3VtfHxudWxsO30pO2lmKC9yZWxhdGl2ZS8udGVzdChlbC5jc3MoJ3Bv c2l0aW9uJykpJiYkLmJyb3dzZXIub3BlcmEpe3NlbGYuX3JldmVydFRvUmVsYXRp dmVQb3NpdGlvbj10cnVlO2VsLmNzcyh7cG9zaXRpb246J2Fic29sdXRlJyx0b3A6 J2F1dG8nLGxlZnQ6J2F1dG8nfSk7fQplbC5jc3Moc3R5bGUpO30pO307aWYodHlw ZW9mKG8uYWxzb1Jlc2l6ZSk9PSdvYmplY3QnJiYhby5hbHNvUmVzaXplLm5vZGVU eXBlKXskLmVhY2goby5hbHNvUmVzaXplLGZ1bmN0aW9uKGV4cCxjKXtfYWxzb1Jl c2l6ZShleHAsYyk7fSk7fWVsc2V7X2Fsc29SZXNpemUoby5hbHNvUmVzaXplKTt9 fSxzdG9wOmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgc2VsZj0kKHRoaXMpLmRhdGEo InJlc2l6YWJsZSIpO2lmKHNlbGYuX3JldmVydFRvUmVsYXRpdmVQb3NpdGlvbiYm JC5icm93c2VyLm9wZXJhKXtzZWxmLl9yZXZlcnRUb1JlbGF0aXZlUG9zaXRpb249 ZmFsc2U7ZWwuY3NzKHtwb3NpdGlvbjoncmVsYXRpdmUnfSk7fQokKHRoaXMpLnJl bW92ZURhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplLXN0YXJ0Iik7fX0pOyQudWku cGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYW5pbWF0ZSIse3N0b3A6ZnVuY3Rpb24o ZXZlbnQsdWkpe3ZhciBzZWxmPSQodGhpcykuZGF0YSgicmVzaXphYmxlIiksbz1z ZWxmLm9wdGlvbnM7dmFyIHByPXNlbGYuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxl bWVudHMsaXN0YT1wci5sZW5ndGgmJigvdGV4dGFyZWEvaSkudGVzdChwclswXS5u b2RlTmFtZSksc29mZnNldGg9aXN0YSYmJC51aS5oYXNTY3JvbGwocHJbMF0sJ2xl ZnQnKT8wOnNlbGYuc2l6ZURpZmYuaGVpZ2h0LHNvZmZzZXR3PWlzdGE/MDpzZWxm LnNpemVEaWZmLndpZHRoO3ZhciBzdHlsZT17d2lkdGg6KHNlbGYuc2l6ZS53aWR0 aC1zb2Zmc2V0dyksaGVpZ2h0OihzZWxmLnNpemUuaGVpZ2h0LXNvZmZzZXRoKX0s bGVmdD0ocGFyc2VJbnQoc2VsZi5lbGVtZW50LmNzcygnbGVmdCcpLDEwKSsoc2Vs Zi5wb3NpdGlvbi5sZWZ0LXNlbGYub3JpZ2luYWxQb3NpdGlvbi5sZWZ0KSl8fG51 bGwsdG9wPShwYXJzZUludChzZWxmLmVsZW1lbnQuY3NzKCd0b3AnKSwxMCkrKHNl bGYucG9zaXRpb24udG9wLXNlbGYub3JpZ2luYWxQb3NpdGlvbi50b3ApKXx8bnVs bDtzZWxmLmVsZW1lbnQuYW5pbWF0ZSgkLmV4dGVuZChzdHlsZSx0b3AmJmxlZnQ/ e3RvcDp0b3AsbGVmdDpsZWZ0fTp7fSkse2R1cmF0aW9uOm8uYW5pbWF0ZUR1cmF0 aW9uLGVhc2luZzpvLmFuaW1hdGVFYXNpbmcsc3RlcDpmdW5jdGlvbigpe3ZhciBk YXRhPXt3aWR0aDpwYXJzZUludChzZWxmLmVsZW1lbnQuY3NzKCd3aWR0aCcpLDEw KSxoZWlnaHQ6cGFyc2VJbnQoc2VsZi5lbGVtZW50LmNzcygnaGVpZ2h0JyksMTAp LHRvcDpwYXJzZUludChzZWxmLmVsZW1lbnQuY3NzKCd0b3AnKSwxMCksbGVmdDpw YXJzZUludChzZWxmLmVsZW1lbnQuY3NzKCdsZWZ0JyksMTApfTtpZihwciYmcHIu bGVuZ3RoKSQocHJbMF0pLmNzcyh7d2lkdGg6ZGF0YS53aWR0aCxoZWlnaHQ6ZGF0 YS5oZWlnaHR9KTtzZWxmLl91cGRhdGVDYWNoZShkYXRhKTtzZWxmLl9wcm9wYWdh dGUoInJlc2l6ZSIsZXZlbnQpO319KTt9fSk7JC51aS5wbHVnaW4uYWRkKCJyZXNp emFibGUiLCJjb250YWlubWVudCIse3N0YXJ0OmZ1bmN0aW9uKGV2ZW50LHVpKXt2 YXIgc2VsZj0kKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLG89c2VsZi5vcHRpb25z LGVsPXNlbGYuZWxlbWVudDt2YXIgb2M9by5jb250YWlubWVudCxjZT0ob2MgaW5z dGFuY2VvZiAkKT9vYy5nZXQoMCk6KC9wYXJlbnQvLnRlc3Qob2MpKT9lbC5wYXJl bnQoKS5nZXQoMCk6b2M7aWYoIWNlKXJldHVybjtzZWxmLmNvbnRhaW5lckVsZW1l bnQ9JChjZSk7aWYoL2RvY3VtZW50Ly50ZXN0KG9jKXx8b2M9PWRvY3VtZW50KXtz ZWxmLmNvbnRhaW5lck9mZnNldD17bGVmdDowLHRvcDowfTtzZWxmLmNvbnRhaW5l clBvc2l0aW9uPXtsZWZ0OjAsdG9wOjB9O3NlbGYucGFyZW50RGF0YT17ZWxlbWVu dDokKGRvY3VtZW50KSxsZWZ0OjAsdG9wOjAsd2lkdGg6JChkb2N1bWVudCkud2lk dGgoKSxoZWlnaHQ6JChkb2N1bWVudCkuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHku cGFyZW50Tm9kZS5zY3JvbGxIZWlnaHR9O30KZWxzZXt2YXIgZWxlbWVudD0kKGNl KSxwPVtdOyQoWyJUb3AiLCJSaWdodCIsIkxlZnQiLCJCb3R0b20iXSkuZWFjaChm dW5jdGlvbihpLG5hbWUpe3BbaV09bnVtKGVsZW1lbnQuY3NzKCJwYWRkaW5nIitu YW1lKSk7fSk7c2VsZi5jb250YWluZXJPZmZzZXQ9ZWxlbWVudC5vZmZzZXQoKTtz ZWxmLmNvbnRhaW5lclBvc2l0aW9uPWVsZW1lbnQucG9zaXRpb24oKTtzZWxmLmNv bnRhaW5lclNpemU9e2hlaWdodDooZWxlbWVudC5pbm5lckhlaWdodCgpLXBbM10p LHdpZHRoOihlbGVtZW50LmlubmVyV2lkdGgoKS1wWzFdKX07dmFyIGNvPXNlbGYu Y29udGFpbmVyT2Zmc2V0LGNoPXNlbGYuY29udGFpbmVyU2l6ZS5oZWlnaHQsY3c9 c2VsZi5jb250YWluZXJTaXplLndpZHRoLHdpZHRoPSgkLnVpLmhhc1Njcm9sbChj ZSwibGVmdCIpP2NlLnNjcm9sbFdpZHRoOmN3KSxoZWlnaHQ9KCQudWkuaGFzU2Ny b2xsKGNlKT9jZS5zY3JvbGxIZWlnaHQ6Y2gpO3NlbGYucGFyZW50RGF0YT17ZWxl bWVudDpjZSxsZWZ0OmNvLmxlZnQsdG9wOmNvLnRvcCx3aWR0aDp3aWR0aCxoZWln aHQ6aGVpZ2h0fTt9fSxyZXNpemU6ZnVuY3Rpb24oZXZlbnQsdWkpe3ZhciBzZWxm PSQodGhpcykuZGF0YSgicmVzaXphYmxlIiksbz1zZWxmLm9wdGlvbnMscHM9c2Vs Zi5jb250YWluZXJTaXplLGNvPXNlbGYuY29udGFpbmVyT2Zmc2V0LGNzPXNlbGYu c2l6ZSxjcD1zZWxmLnBvc2l0aW9uLHBSYXRpbz1zZWxmLl9hc3BlY3RSYXRpb3x8 ZXZlbnQuc2hpZnRLZXksY29wPXt0b3A6MCxsZWZ0OjB9LGNlPXNlbGYuY29udGFp bmVyRWxlbWVudDtpZihjZVswXSE9ZG9jdW1lbnQmJigvc3RhdGljLykudGVzdChj ZS5jc3MoJ3Bvc2l0aW9uJykpKWNvcD1jbztpZihjcC5sZWZ0PChzZWxmLl9oZWxw ZXI/Y28ubGVmdDowKSl7c2VsZi5zaXplLndpZHRoPXNlbGYuc2l6ZS53aWR0aCso c2VsZi5faGVscGVyPyhzZWxmLnBvc2l0aW9uLmxlZnQtY28ubGVmdCk6KHNlbGYu cG9zaXRpb24ubGVmdC1jb3AubGVmdCkpO2lmKHBSYXRpbylzZWxmLnNpemUuaGVp Z2h0PXNlbGYuc2l6ZS53aWR0aC9vLmFzcGVjdFJhdGlvO3NlbGYucG9zaXRpb24u bGVmdD1vLmhlbHBlcj9jby5sZWZ0OjA7fQppZihjcC50b3A8KHNlbGYuX2hlbHBl cj9jby50b3A6MCkpe3NlbGYuc2l6ZS5oZWlnaHQ9c2VsZi5zaXplLmhlaWdodCso c2VsZi5faGVscGVyPyhzZWxmLnBvc2l0aW9uLnRvcC1jby50b3ApOnNlbGYucG9z aXRpb24udG9wKTtpZihwUmF0aW8pc2VsZi5zaXplLndpZHRoPXNlbGYuc2l6ZS5o ZWlnaHQqby5hc3BlY3RSYXRpbztzZWxmLnBvc2l0aW9uLnRvcD1zZWxmLl9oZWxw ZXI/Y28udG9wOjA7fQpzZWxmLm9mZnNldC5sZWZ0PXNlbGYucGFyZW50RGF0YS5s ZWZ0K3NlbGYucG9zaXRpb24ubGVmdDtzZWxmLm9mZnNldC50b3A9c2VsZi5wYXJl bnREYXRhLnRvcCtzZWxmLnBvc2l0aW9uLnRvcDt2YXIgd29zZXQ9TWF0aC5hYnMo KHNlbGYuX2hlbHBlcj9zZWxmLm9mZnNldC5sZWZ0LWNvcC5sZWZ0OihzZWxmLm9m ZnNldC5sZWZ0LWNvcC5sZWZ0KSkrc2VsZi5zaXplRGlmZi53aWR0aCksaG9zZXQ9 TWF0aC5hYnMoKHNlbGYuX2hlbHBlcj9zZWxmLm9mZnNldC50b3AtY29wLnRvcDoo c2VsZi5vZmZzZXQudG9wLWNvLnRvcCkpK3NlbGYuc2l6ZURpZmYuaGVpZ2h0KTt2 YXIgaXNQYXJlbnQ9c2VsZi5jb250YWluZXJFbGVtZW50LmdldCgwKT09c2VsZi5l bGVtZW50LnBhcmVudCgpLmdldCgwKSxpc09mZnNldFJlbGF0aXZlPS9yZWxhdGl2 ZXxhYnNvbHV0ZS8udGVzdChzZWxmLmNvbnRhaW5lckVsZW1lbnQuY3NzKCdwb3Np dGlvbicpKTtpZihpc1BhcmVudCYmaXNPZmZzZXRSZWxhdGl2ZSl3b3NldC09c2Vs Zi5wYXJlbnREYXRhLmxlZnQ7aWYod29zZXQrc2VsZi5zaXplLndpZHRoPj1zZWxm LnBhcmVudERhdGEud2lkdGgpe3NlbGYuc2l6ZS53aWR0aD1zZWxmLnBhcmVudERh dGEud2lkdGgtd29zZXQ7aWYocFJhdGlvKXNlbGYuc2l6ZS5oZWlnaHQ9c2VsZi5z aXplLndpZHRoL3NlbGYuYXNwZWN0UmF0aW87fQppZihob3NldCtzZWxmLnNpemUu aGVpZ2h0Pj1zZWxmLnBhcmVudERhdGEuaGVpZ2h0KXtzZWxmLnNpemUuaGVpZ2h0 PXNlbGYucGFyZW50RGF0YS5oZWlnaHQtaG9zZXQ7aWYocFJhdGlvKXNlbGYuc2l6 ZS53aWR0aD1zZWxmLnNpemUuaGVpZ2h0KnNlbGYuYXNwZWN0UmF0aW87fX0sc3Rv cDpmdW5jdGlvbihldmVudCx1aSl7dmFyIHNlbGY9JCh0aGlzKS5kYXRhKCJyZXNp emFibGUiKSxvPXNlbGYub3B0aW9ucyxjcD1zZWxmLnBvc2l0aW9uLGNvPXNlbGYu Y29udGFpbmVyT2Zmc2V0LGNvcD1zZWxmLmNvbnRhaW5lclBvc2l0aW9uLGNlPXNl bGYuY29udGFpbmVyRWxlbWVudDt2YXIgaGVscGVyPSQoc2VsZi5oZWxwZXIpLGhv PWhlbHBlci5vZmZzZXQoKSx3PWhlbHBlci5vdXRlcldpZHRoKCktc2VsZi5zaXpl RGlmZi53aWR0aCxoPWhlbHBlci5vdXRlckhlaWdodCgpLXNlbGYuc2l6ZURpZmYu aGVpZ2h0O2lmKHNlbGYuX2hlbHBlciYmIW8uYW5pbWF0ZSYmKC9yZWxhdGl2ZS8p LnRlc3QoY2UuY3NzKCdwb3NpdGlvbicpKSkKJCh0aGlzKS5jc3Moe2xlZnQ6aG8u bGVmdC1jb3AubGVmdC1jby5sZWZ0LHdpZHRoOncsaGVpZ2h0Omh9KTtpZihzZWxm Ll9oZWxwZXImJiFvLmFuaW1hdGUmJigvc3RhdGljLykudGVzdChjZS5jc3MoJ3Bv c2l0aW9uJykpKQokKHRoaXMpLmNzcyh7bGVmdDpoby5sZWZ0LWNvcC5sZWZ0LWNv LmxlZnQsd2lkdGg6dyxoZWlnaHQ6aH0pO319KTskLnVpLnBsdWdpbi5hZGQoInJl c2l6YWJsZSIsImdob3N0Iix7c3RhcnQ6ZnVuY3Rpb24oZXZlbnQsdWkpe3ZhciBz ZWxmPSQodGhpcykuZGF0YSgicmVzaXphYmxlIiksbz1zZWxmLm9wdGlvbnMsY3M9 c2VsZi5zaXplO3NlbGYuZ2hvc3Q9c2VsZi5vcmlnaW5hbEVsZW1lbnQuY2xvbmUo KTtzZWxmLmdob3N0LmNzcyh7b3BhY2l0eTouMjUsZGlzcGxheTonYmxvY2snLHBv c2l0aW9uOidyZWxhdGl2ZScsaGVpZ2h0OmNzLmhlaWdodCx3aWR0aDpjcy53aWR0 aCxtYXJnaW46MCxsZWZ0OjAsdG9wOjB9KS5hZGRDbGFzcygndWktcmVzaXphYmxl LWdob3N0JykuYWRkQ2xhc3ModHlwZW9mIG8uZ2hvc3Q9PSdzdHJpbmcnP28uZ2hv c3Q6JycpO3NlbGYuZ2hvc3QuYXBwZW5kVG8oc2VsZi5oZWxwZXIpO30scmVzaXpl OmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgc2VsZj0kKHRoaXMpLmRhdGEoInJlc2l6 YWJsZSIpLG89c2VsZi5vcHRpb25zO2lmKHNlbGYuZ2hvc3Qpc2VsZi5naG9zdC5j c3Moe3Bvc2l0aW9uOidyZWxhdGl2ZScsaGVpZ2h0OnNlbGYuc2l6ZS5oZWlnaHQs d2lkdGg6c2VsZi5zaXplLndpZHRofSk7fSxzdG9wOmZ1bmN0aW9uKGV2ZW50LHVp KXt2YXIgc2VsZj0kKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLG89c2VsZi5vcHRp b25zO2lmKHNlbGYuZ2hvc3QmJnNlbGYuaGVscGVyKXNlbGYuaGVscGVyLmdldCgw KS5yZW1vdmVDaGlsZChzZWxmLmdob3N0LmdldCgwKSk7fX0pOyQudWkucGx1Z2lu LmFkZCgicmVzaXphYmxlIiwiZ3JpZCIse3Jlc2l6ZTpmdW5jdGlvbihldmVudCx1 aSl7dmFyIHNlbGY9JCh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxvPXNlbGYub3B0 aW9ucyxjcz1zZWxmLnNpemUsb3M9c2VsZi5vcmlnaW5hbFNpemUsb3A9c2VsZi5v cmlnaW5hbFBvc2l0aW9uLGE9c2VsZi5heGlzLHJhdGlvPW8uX2FzcGVjdFJhdGlv fHxldmVudC5zaGlmdEtleTtvLmdyaWQ9dHlwZW9mIG8uZ3JpZD09Im51bWJlciI/ W28uZ3JpZCxvLmdyaWRdOm8uZ3JpZDt2YXIgb3g9TWF0aC5yb3VuZCgoY3Mud2lk dGgtb3Mud2lkdGgpLyhvLmdyaWRbMF18fDEpKSooby5ncmlkWzBdfHwxKSxveT1N YXRoLnJvdW5kKChjcy5oZWlnaHQtb3MuaGVpZ2h0KS8oby5ncmlkWzFdfHwxKSkq KG8uZ3JpZFsxXXx8MSk7aWYoL14oc2V8c3xlKSQvLnRlc3QoYSkpe3NlbGYuc2l6 ZS53aWR0aD1vcy53aWR0aCtveDtzZWxmLnNpemUuaGVpZ2h0PW9zLmhlaWdodCtv eTt9CmVsc2UgaWYoL14obmUpJC8udGVzdChhKSl7c2VsZi5zaXplLndpZHRoPW9z LndpZHRoK294O3NlbGYuc2l6ZS5oZWlnaHQ9b3MuaGVpZ2h0K295O3NlbGYucG9z aXRpb24udG9wPW9wLnRvcC1veTt9CmVsc2UgaWYoL14oc3cpJC8udGVzdChhKSl7 c2VsZi5zaXplLndpZHRoPW9zLndpZHRoK294O3NlbGYuc2l6ZS5oZWlnaHQ9b3Mu aGVpZ2h0K295O3NlbGYucG9zaXRpb24ubGVmdD1vcC5sZWZ0LW94O30KZWxzZXtz ZWxmLnNpemUud2lkdGg9b3Mud2lkdGgrb3g7c2VsZi5zaXplLmhlaWdodD1vcy5o ZWlnaHQrb3k7c2VsZi5wb3NpdGlvbi50b3A9b3AudG9wLW95O3NlbGYucG9zaXRp b24ubGVmdD1vcC5sZWZ0LW94O319fSk7dmFyIG51bT1mdW5jdGlvbih2KXtyZXR1 cm4gcGFyc2VJbnQodiwxMCl8fDA7fTt2YXIgaXNOdW1iZXI9ZnVuY3Rpb24odmFs dWUpe3JldHVybiFpc05hTihwYXJzZUludCh2YWx1ZSwxMCkpO307fSkoalF1ZXJ5 KTsoZnVuY3Rpb24oJCl7dmFyIHNldERhdGFTd2l0Y2g9e2RyYWdTdGFydDoic3Rh cnQuZHJhZ2dhYmxlIixkcmFnOiJkcmFnLmRyYWdnYWJsZSIsZHJhZ1N0b3A6InN0 b3AuZHJhZ2dhYmxlIixtYXhIZWlnaHQ6Im1heEhlaWdodC5yZXNpemFibGUiLG1p bkhlaWdodDoibWluSGVpZ2h0LnJlc2l6YWJsZSIsbWF4V2lkdGg6Im1heFdpZHRo LnJlc2l6YWJsZSIsbWluV2lkdGg6Im1pbldpZHRoLnJlc2l6YWJsZSIscmVzaXpl U3RhcnQ6InN0YXJ0LnJlc2l6YWJsZSIscmVzaXplOiJkcmFnLnJlc2l6YWJsZSIs cmVzaXplU3RvcDoic3RvcC5yZXNpemFibGUifSx1aURpYWxvZ0NsYXNzZXM9J3Vp LWRpYWxvZyAnKyd1aS13aWRnZXQgJysndWktd2lkZ2V0LWNvbnRlbnQgJysndWkt Y29ybmVyLWFsbCAnOyQud2lkZ2V0KCJ1aS5kaWFsb2ciLHtfaW5pdDpmdW5jdGlv bigpe3RoaXMub3JpZ2luYWxUaXRsZT10aGlzLmVsZW1lbnQuYXR0cigndGl0bGUn KTt2YXIgc2VsZj10aGlzLG9wdGlvbnM9dGhpcy5vcHRpb25zLHRpdGxlPW9wdGlv bnMudGl0bGV8fHRoaXMub3JpZ2luYWxUaXRsZXx8JyZuYnNwOycsdGl0bGVJZD0k LnVpLmRpYWxvZy5nZXRUaXRsZUlkKHRoaXMuZWxlbWVudCksdWlEaWFsb2c9KHRo aXMudWlEaWFsb2c9JCgnPGRpdi8+JykpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkp LmhpZGUoKS5hZGRDbGFzcyh1aURpYWxvZ0NsYXNzZXMrb3B0aW9ucy5kaWFsb2dD bGFzcykuY3NzKHtwb3NpdGlvbjonYWJzb2x1dGUnLG92ZXJmbG93OidoaWRkZW4n LHpJbmRleDpvcHRpb25zLnpJbmRleH0pLmF0dHIoJ3RhYkluZGV4JywtMSkuY3Nz KCdvdXRsaW5lJywwKS5rZXlkb3duKGZ1bmN0aW9uKGV2ZW50KXsob3B0aW9ucy5j bG9zZU9uRXNjYXBlJiZldmVudC5rZXlDb2RlJiZldmVudC5rZXlDb2RlPT0kLnVp LmtleUNvZGUuRVNDQVBFJiZzZWxmLmNsb3NlKGV2ZW50KSk7fSkuYXR0cih7cm9s ZTonZGlhbG9nJywnYXJpYS1sYWJlbGxlZGJ5Jzp0aXRsZUlkfSkubW91c2Vkb3du KGZ1bmN0aW9uKGV2ZW50KXtzZWxmLm1vdmVUb1RvcChmYWxzZSxldmVudCk7fSks dWlEaWFsb2dDb250ZW50PXRoaXMuZWxlbWVudC5zaG93KCkucmVtb3ZlQXR0cign dGl0bGUnKS5hZGRDbGFzcygndWktZGlhbG9nLWNvbnRlbnQgJysndWktd2lkZ2V0 LWNvbnRlbnQnKS5hcHBlbmRUbyh1aURpYWxvZyksdWlEaWFsb2dUaXRsZWJhcj0o dGhpcy51aURpYWxvZ1RpdGxlYmFyPSQoJzxkaXY+PC9kaXY+JykpLmFkZENsYXNz KCd1aS1kaWFsb2ctdGl0bGViYXIgJysndWktd2lkZ2V0LWhlYWRlciAnKyd1aS1j b3JuZXItYWxsICcrJ3VpLWhlbHBlci1jbGVhcmZpeCcpLnByZXBlbmRUbyh1aURp YWxvZyksdWlEaWFsb2dUaXRsZWJhckNsb3NlPSQoJzxhIGhyZWY9IiMiLz4nKS5h ZGRDbGFzcygndWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlICcrJ3VpLWNvcm5lci1h bGwnKS5hdHRyKCdyb2xlJywnYnV0dG9uJykuaG92ZXIoZnVuY3Rpb24oKXt1aURp YWxvZ1RpdGxlYmFyQ2xvc2UuYWRkQ2xhc3MoJ3VpLXN0YXRlLWhvdmVyJyk7fSxm dW5jdGlvbigpe3VpRGlhbG9nVGl0bGViYXJDbG9zZS5yZW1vdmVDbGFzcygndWkt c3RhdGUtaG92ZXInKTt9KS5mb2N1cyhmdW5jdGlvbigpe3VpRGlhbG9nVGl0bGVi YXJDbG9zZS5hZGRDbGFzcygndWktc3RhdGUtZm9jdXMnKTt9KS5ibHVyKGZ1bmN0 aW9uKCl7dWlEaWFsb2dUaXRsZWJhckNsb3NlLnJlbW92ZUNsYXNzKCd1aS1zdGF0 ZS1mb2N1cycpO30pLm1vdXNlZG93bihmdW5jdGlvbihldil7ZXYuc3RvcFByb3Bh Z2F0aW9uKCk7fSkuY2xpY2soZnVuY3Rpb24oZXZlbnQpe3NlbGYuY2xvc2UoZXZl bnQpO3JldHVybiBmYWxzZTt9KS5hcHBlbmRUbyh1aURpYWxvZ1RpdGxlYmFyKSx1 aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0PSh0aGlzLnVpRGlhbG9nVGl0bGViYXJD bG9zZVRleHQ9JCgnPHNwYW4vPicpKS5hZGRDbGFzcygndWktaWNvbiAnKyd1aS1p Y29uLWNsb3NldGhpY2snKS50ZXh0KG9wdGlvbnMuY2xvc2VUZXh0KS5hcHBlbmRU byh1aURpYWxvZ1RpdGxlYmFyQ2xvc2UpLHVpRGlhbG9nVGl0bGU9JCgnPHNwYW4v PicpLmFkZENsYXNzKCd1aS1kaWFsb2ctdGl0bGUnKS5hdHRyKCdpZCcsdGl0bGVJ ZCkuaHRtbCh0aXRsZSkucHJlcGVuZFRvKHVpRGlhbG9nVGl0bGViYXIpO3VpRGlh bG9nVGl0bGViYXIuZmluZCgiKiIpLmFkZCh1aURpYWxvZ1RpdGxlYmFyKS5kaXNh YmxlU2VsZWN0aW9uKCk7KG9wdGlvbnMuZHJhZ2dhYmxlJiYkLmZuLmRyYWdnYWJs ZSYmdGhpcy5fbWFrZURyYWdnYWJsZSgpKTsob3B0aW9ucy5yZXNpemFibGUmJiQu Zm4ucmVzaXphYmxlJiZ0aGlzLl9tYWtlUmVzaXphYmxlKCkpO3RoaXMuX2NyZWF0 ZUJ1dHRvbnMob3B0aW9ucy5idXR0b25zKTt0aGlzLl9pc09wZW49ZmFsc2U7KG9w dGlvbnMuYmdpZnJhbWUmJiQuZm4uYmdpZnJhbWUmJnVpRGlhbG9nLmJnaWZyYW1l KCkpOyhvcHRpb25zLmF1dG9PcGVuJiZ0aGlzLm9wZW4oKSk7fSxkZXN0cm95OmZ1 bmN0aW9uKCl7KHRoaXMub3ZlcmxheSYmdGhpcy5vdmVybGF5LmRlc3Ryb3koKSk7 dGhpcy51aURpYWxvZy5oaWRlKCk7dGhpcy5lbGVtZW50LnVuYmluZCgnLmRpYWxv ZycpLnJlbW92ZURhdGEoJ2RpYWxvZycpLnJlbW92ZUNsYXNzKCd1aS1kaWFsb2ct Y29udGVudCB1aS13aWRnZXQtY29udGVudCcpLmhpZGUoKS5hcHBlbmRUbygnYm9k eScpO3RoaXMudWlEaWFsb2cucmVtb3ZlKCk7KHRoaXMub3JpZ2luYWxUaXRsZSYm dGhpcy5lbGVtZW50LmF0dHIoJ3RpdGxlJyx0aGlzLm9yaWdpbmFsVGl0bGUpKTt9 LGNsb3NlOmZ1bmN0aW9uKGV2ZW50KXt2YXIgc2VsZj10aGlzO2lmKGZhbHNlPT09 c2VsZi5fdHJpZ2dlcignYmVmb3JlY2xvc2UnLGV2ZW50KSl7cmV0dXJuO30KKHNl bGYub3ZlcmxheSYmc2VsZi5vdmVybGF5LmRlc3Ryb3koKSk7c2VsZi51aURpYWxv Zy51bmJpbmQoJ2tleXByZXNzLnVpLWRpYWxvZycpOyhzZWxmLm9wdGlvbnMuaGlk ZT9zZWxmLnVpRGlhbG9nLmhpZGUoc2VsZi5vcHRpb25zLmhpZGUsZnVuY3Rpb24o KXtzZWxmLl90cmlnZ2VyKCdjbG9zZScsZXZlbnQpO30pOnNlbGYudWlEaWFsb2cu aGlkZSgpJiZzZWxmLl90cmlnZ2VyKCdjbG9zZScsZXZlbnQpKTskLnVpLmRpYWxv Zy5vdmVybGF5LnJlc2l6ZSgpO3NlbGYuX2lzT3Blbj1mYWxzZTtpZihzZWxmLm9w dGlvbnMubW9kYWwpe3ZhciBtYXhaPTA7JCgnLnVpLWRpYWxvZycpLmVhY2goZnVu Y3Rpb24oKXtpZih0aGlzIT1zZWxmLnVpRGlhbG9nWzBdKXttYXhaPU1hdGgubWF4 KG1heFosJCh0aGlzKS5jc3MoJ3otaW5kZXgnKSk7fX0pOyQudWkuZGlhbG9nLm1h eFo9bWF4Wjt9fSxpc09wZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNPcGVu O30sbW92ZVRvVG9wOmZ1bmN0aW9uKGZvcmNlLGV2ZW50KXtpZigodGhpcy5vcHRp b25zLm1vZGFsJiYhZm9yY2UpfHwoIXRoaXMub3B0aW9ucy5zdGFjayYmIXRoaXMu b3B0aW9ucy5tb2RhbCkpe3JldHVybiB0aGlzLl90cmlnZ2VyKCdmb2N1cycsZXZl bnQpO30KaWYodGhpcy5vcHRpb25zLnpJbmRleD4kLnVpLmRpYWxvZy5tYXhaKXsk LnVpLmRpYWxvZy5tYXhaPXRoaXMub3B0aW9ucy56SW5kZXg7fQoodGhpcy5vdmVy bGF5JiZ0aGlzLm92ZXJsYXkuJGVsLmNzcygnei1pbmRleCcsJC51aS5kaWFsb2cu b3ZlcmxheS5tYXhaPSsrJC51aS5kaWFsb2cubWF4WikpO3ZhciBzYXZlU2Nyb2xs PXtzY3JvbGxUb3A6dGhpcy5lbGVtZW50LmF0dHIoJ3Njcm9sbFRvcCcpLHNjcm9s bExlZnQ6dGhpcy5lbGVtZW50LmF0dHIoJ3Njcm9sbExlZnQnKX07dGhpcy51aURp YWxvZy5jc3MoJ3otaW5kZXgnLCsrJC51aS5kaWFsb2cubWF4Wik7dGhpcy5lbGVt ZW50LmF0dHIoc2F2ZVNjcm9sbCk7dGhpcy5fdHJpZ2dlcignZm9jdXMnLGV2ZW50 KTt9LG9wZW46ZnVuY3Rpb24oKXtpZih0aGlzLl9pc09wZW4pe3JldHVybjt9CnZh ciBvcHRpb25zPXRoaXMub3B0aW9ucyx1aURpYWxvZz10aGlzLnVpRGlhbG9nO3Ro aXMub3ZlcmxheT1vcHRpb25zLm1vZGFsP25ldyAkLnVpLmRpYWxvZy5vdmVybGF5 KHRoaXMpOm51bGw7KHVpRGlhbG9nLm5leHQoKS5sZW5ndGgmJnVpRGlhbG9nLmFw cGVuZFRvKCdib2R5JykpO3RoaXMuX3NpemUoKTt0aGlzLl9wb3NpdGlvbihvcHRp b25zLnBvc2l0aW9uKTt1aURpYWxvZy5zaG93KG9wdGlvbnMuc2hvdyk7dGhpcy5t b3ZlVG9Ub3AodHJ1ZSk7KG9wdGlvbnMubW9kYWwmJnVpRGlhbG9nLmJpbmQoJ2tl eXByZXNzLnVpLWRpYWxvZycsZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LmtleUNv ZGUhPSQudWkua2V5Q29kZS5UQUIpe3JldHVybjt9CnZhciB0YWJiYWJsZXM9JCgn OnRhYmJhYmxlJyx0aGlzKSxmaXJzdD10YWJiYWJsZXMuZmlsdGVyKCc6Zmlyc3Qn KVswXSxsYXN0PXRhYmJhYmxlcy5maWx0ZXIoJzpsYXN0JylbMF07aWYoZXZlbnQu dGFyZ2V0PT1sYXN0JiYhZXZlbnQuc2hpZnRLZXkpe3NldFRpbWVvdXQoZnVuY3Rp b24oKXtmaXJzdC5mb2N1cygpO30sMSk7fWVsc2UgaWYoZXZlbnQudGFyZ2V0PT1m aXJzdCYmZXZlbnQuc2hpZnRLZXkpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtsYXN0 LmZvY3VzKCk7fSwxKTt9fSkpOyQoW10pLmFkZCh1aURpYWxvZy5maW5kKCcudWkt ZGlhbG9nLWNvbnRlbnQgOnRhYmJhYmxlOmZpcnN0JykpLmFkZCh1aURpYWxvZy5m aW5kKCcudWktZGlhbG9nLWJ1dHRvbnBhbmUgOnRhYmJhYmxlOmZpcnN0JykpLmFk ZCh1aURpYWxvZykuZmlsdGVyKCc6Zmlyc3QnKS5mb2N1cygpO3RoaXMuX3RyaWdn ZXIoJ29wZW4nKTt0aGlzLl9pc09wZW49dHJ1ZTt9LF9jcmVhdGVCdXR0b25zOmZ1 bmN0aW9uKGJ1dHRvbnMpe3ZhciBzZWxmPXRoaXMsaGFzQnV0dG9ucz1mYWxzZSx1 aURpYWxvZ0J1dHRvblBhbmU9JCgnPGRpdj48L2Rpdj4nKS5hZGRDbGFzcygndWkt ZGlhbG9nLWJ1dHRvbnBhbmUgJysndWktd2lkZ2V0LWNvbnRlbnQgJysndWktaGVs cGVyLWNsZWFyZml4Jyk7dGhpcy51aURpYWxvZy5maW5kKCcudWktZGlhbG9nLWJ1 dHRvbnBhbmUnKS5yZW1vdmUoKTsodHlwZW9mIGJ1dHRvbnM9PSdvYmplY3QnJiZi dXR0b25zIT09bnVsbCYmJC5lYWNoKGJ1dHRvbnMsZnVuY3Rpb24oKXtyZXR1cm4h KGhhc0J1dHRvbnM9dHJ1ZSk7fSkpO2lmKGhhc0J1dHRvbnMpeyQuZWFjaChidXR0 b25zLGZ1bmN0aW9uKG5hbWUsZm4peyQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48 L2J1dHRvbj4nKS5hZGRDbGFzcygndWktc3RhdGUtZGVmYXVsdCAnKyd1aS1jb3Ju ZXItYWxsJykudGV4dChuYW1lKS5jbGljayhmdW5jdGlvbigpe2ZuLmFwcGx5KHNl bGYuZWxlbWVudFswXSxhcmd1bWVudHMpO30pLmhvdmVyKGZ1bmN0aW9uKCl7JCh0 aGlzKS5hZGRDbGFzcygndWktc3RhdGUtaG92ZXInKTt9LGZ1bmN0aW9uKCl7JCh0 aGlzKS5yZW1vdmVDbGFzcygndWktc3RhdGUtaG92ZXInKTt9KS5mb2N1cyhmdW5j dGlvbigpeyQodGhpcykuYWRkQ2xhc3MoJ3VpLXN0YXRlLWZvY3VzJyk7fSkuYmx1 cihmdW5jdGlvbigpeyQodGhpcykucmVtb3ZlQ2xhc3MoJ3VpLXN0YXRlLWZvY3Vz Jyk7fSkuYXBwZW5kVG8odWlEaWFsb2dCdXR0b25QYW5lKTt9KTt1aURpYWxvZ0J1 dHRvblBhbmUuYXBwZW5kVG8odGhpcy51aURpYWxvZyk7fX0sX21ha2VEcmFnZ2Fi bGU6ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzLG9wdGlvbnM9dGhpcy5vcHRpb25z LGhlaWdodEJlZm9yZURyYWc7dGhpcy51aURpYWxvZy5kcmFnZ2FibGUoe2NhbmNl bDonLnVpLWRpYWxvZy1jb250ZW50JyxoYW5kbGU6Jy51aS1kaWFsb2ctdGl0bGVi YXInLGNvbnRhaW5tZW50Oidkb2N1bWVudCcsc3RhcnQ6ZnVuY3Rpb24oKXtoZWln aHRCZWZvcmVEcmFnPW9wdGlvbnMuaGVpZ2h0OyQodGhpcykuaGVpZ2h0KCQodGhp cykuaGVpZ2h0KCkpLmFkZENsYXNzKCJ1aS1kaWFsb2ctZHJhZ2dpbmciKTsob3B0 aW9ucy5kcmFnU3RhcnQmJm9wdGlvbnMuZHJhZ1N0YXJ0LmFwcGx5KHNlbGYuZWxl bWVudFswXSxhcmd1bWVudHMpKTt9LGRyYWc6ZnVuY3Rpb24oKXsob3B0aW9ucy5k cmFnJiZvcHRpb25zLmRyYWcuYXBwbHkoc2VsZi5lbGVtZW50WzBdLGFyZ3VtZW50 cykpO30sc3RvcDpmdW5jdGlvbigpeyQodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRp YWxvZy1kcmFnZ2luZyIpLmhlaWdodChoZWlnaHRCZWZvcmVEcmFnKTsob3B0aW9u cy5kcmFnU3RvcCYmb3B0aW9ucy5kcmFnU3RvcC5hcHBseShzZWxmLmVsZW1lbnRb MF0sYXJndW1lbnRzKSk7JC51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKTt9fSk7 fSxfbWFrZVJlc2l6YWJsZTpmdW5jdGlvbihoYW5kbGVzKXtoYW5kbGVzPShoYW5k bGVzPT09dW5kZWZpbmVkP3RoaXMub3B0aW9ucy5yZXNpemFibGU6aGFuZGxlcyk7 dmFyIHNlbGY9dGhpcyxvcHRpb25zPXRoaXMub3B0aW9ucyxyZXNpemVIYW5kbGVz PXR5cGVvZiBoYW5kbGVzPT0nc3RyaW5nJz9oYW5kbGVzOiduLGUscyx3LHNlLHN3 LG5lLG53Jzt0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSh7Y2FuY2VsOicudWktZGlh bG9nLWNvbnRlbnQnLGFsc29SZXNpemU6dGhpcy5lbGVtZW50LG1heFdpZHRoOm9w dGlvbnMubWF4V2lkdGgsbWF4SGVpZ2h0Om9wdGlvbnMubWF4SGVpZ2h0LG1pbldp ZHRoOm9wdGlvbnMubWluV2lkdGgsbWluSGVpZ2h0Om9wdGlvbnMubWluSGVpZ2h0 LHN0YXJ0OmZ1bmN0aW9uKCl7JCh0aGlzKS5hZGRDbGFzcygidWktZGlhbG9nLXJl c2l6aW5nIik7KG9wdGlvbnMucmVzaXplU3RhcnQmJm9wdGlvbnMucmVzaXplU3Rh cnQuYXBwbHkoc2VsZi5lbGVtZW50WzBdLGFyZ3VtZW50cykpO30scmVzaXplOmZ1 bmN0aW9uKCl7KG9wdGlvbnMucmVzaXplJiZvcHRpb25zLnJlc2l6ZS5hcHBseShz ZWxmLmVsZW1lbnRbMF0sYXJndW1lbnRzKSk7fSxoYW5kbGVzOnJlc2l6ZUhhbmRs ZXMsc3RvcDpmdW5jdGlvbigpeyQodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRpYWxv Zy1yZXNpemluZyIpO29wdGlvbnMuaGVpZ2h0PSQodGhpcykuaGVpZ2h0KCk7b3B0 aW9ucy53aWR0aD0kKHRoaXMpLndpZHRoKCk7KG9wdGlvbnMucmVzaXplU3RvcCYm b3B0aW9ucy5yZXNpemVTdG9wLmFwcGx5KHNlbGYuZWxlbWVudFswXSxhcmd1bWVu dHMpKTskLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpO319KS5maW5kKCcudWkt cmVzaXphYmxlLXNlJykuYWRkQ2xhc3MoJ3VpLWljb24gdWktaWNvbi1ncmlwLWRp YWdvbmFsLXNlJyk7fSxfcG9zaXRpb246ZnVuY3Rpb24ocG9zKXt2YXIgd25kPSQo d2luZG93KSxkb2M9JChkb2N1bWVudCkscFRvcD1kb2Muc2Nyb2xsVG9wKCkscExl ZnQ9ZG9jLnNjcm9sbExlZnQoKSxtaW5Ub3A9cFRvcDtpZigkLmluQXJyYXkocG9z LFsnY2VudGVyJywndG9wJywncmlnaHQnLCdib3R0b20nLCdsZWZ0J10pPj0wKXtw b3M9W3Bvcz09J3JpZ2h0J3x8cG9zPT0nbGVmdCc/cG9zOidjZW50ZXInLHBvcz09 J3RvcCd8fHBvcz09J2JvdHRvbSc/cG9zOidtaWRkbGUnXTt9CmlmKHBvcy5jb25z dHJ1Y3RvciE9QXJyYXkpe3Bvcz1bJ2NlbnRlcicsJ21pZGRsZSddO30KaWYocG9z WzBdLmNvbnN0cnVjdG9yPT1OdW1iZXIpe3BMZWZ0Kz1wb3NbMF07fWVsc2V7c3dp dGNoKHBvc1swXSl7Y2FzZSdsZWZ0JzpwTGVmdCs9MDticmVhaztjYXNlJ3JpZ2h0 JzpwTGVmdCs9d25kLndpZHRoKCktdGhpcy51aURpYWxvZy5vdXRlcldpZHRoKCk7 YnJlYWs7ZGVmYXVsdDpjYXNlJ2NlbnRlcic6cExlZnQrPSh3bmQud2lkdGgoKS10 aGlzLnVpRGlhbG9nLm91dGVyV2lkdGgoKSkvMjt9fQppZihwb3NbMV0uY29uc3Ry dWN0b3I9PU51bWJlcil7cFRvcCs9cG9zWzFdO31lbHNle3N3aXRjaChwb3NbMV0p e2Nhc2UndG9wJzpwVG9wKz0wO2JyZWFrO2Nhc2UnYm90dG9tJzpwVG9wKz13bmQu aGVpZ2h0KCktdGhpcy51aURpYWxvZy5vdXRlckhlaWdodCgpO2JyZWFrO2RlZmF1 bHQ6Y2FzZSdtaWRkbGUnOnBUb3ArPSh3bmQuaGVpZ2h0KCktdGhpcy51aURpYWxv Zy5vdXRlckhlaWdodCgpKS8yO319CnBUb3A9TWF0aC5tYXgocFRvcCxtaW5Ub3Ap O3RoaXMudWlEaWFsb2cuY3NzKHt0b3A6cFRvcCxsZWZ0OnBMZWZ0fSk7fSxfc2V0 RGF0YTpmdW5jdGlvbihrZXksdmFsdWUpeyhzZXREYXRhU3dpdGNoW2tleV0mJnRo aXMudWlEaWFsb2cuZGF0YShzZXREYXRhU3dpdGNoW2tleV0sdmFsdWUpKTtzd2l0 Y2goa2V5KXtjYXNlImJ1dHRvbnMiOnRoaXMuX2NyZWF0ZUJ1dHRvbnModmFsdWUp O2JyZWFrO2Nhc2UiY2xvc2VUZXh0Ijp0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9z ZVRleHQudGV4dCh2YWx1ZSk7YnJlYWs7Y2FzZSJkaWFsb2dDbGFzcyI6dGhpcy51 aURpYWxvZy5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZGlhbG9nQ2xhc3MpLmFk ZENsYXNzKHVpRGlhbG9nQ2xhc3Nlcyt2YWx1ZSk7YnJlYWs7Y2FzZSJkcmFnZ2Fi bGUiOih2YWx1ZT90aGlzLl9tYWtlRHJhZ2dhYmxlKCk6dGhpcy51aURpYWxvZy5k cmFnZ2FibGUoJ2Rlc3Ryb3knKSk7YnJlYWs7Y2FzZSJoZWlnaHQiOnRoaXMudWlE aWFsb2cuaGVpZ2h0KHZhbHVlKTticmVhaztjYXNlInBvc2l0aW9uIjp0aGlzLl9w b3NpdGlvbih2YWx1ZSk7YnJlYWs7Y2FzZSJyZXNpemFibGUiOnZhciB1aURpYWxv Zz10aGlzLnVpRGlhbG9nLGlzUmVzaXphYmxlPXRoaXMudWlEaWFsb2cuaXMoJzpk YXRhKHJlc2l6YWJsZSknKTsoaXNSZXNpemFibGUmJiF2YWx1ZSYmdWlEaWFsb2cu cmVzaXphYmxlKCdkZXN0cm95JykpOyhpc1Jlc2l6YWJsZSYmdHlwZW9mIHZhbHVl PT0nc3RyaW5nJyYmdWlEaWFsb2cucmVzaXphYmxlKCdvcHRpb24nLCdoYW5kbGVz Jyx2YWx1ZSkpOyhpc1Jlc2l6YWJsZXx8dGhpcy5fbWFrZVJlc2l6YWJsZSh2YWx1 ZSkpO2JyZWFrO2Nhc2UidGl0bGUiOiQoIi51aS1kaWFsb2ctdGl0bGUiLHRoaXMu dWlEaWFsb2dUaXRsZWJhcikuaHRtbCh2YWx1ZXx8JyZuYnNwOycpO2JyZWFrO2Nh c2Uid2lkdGgiOnRoaXMudWlEaWFsb2cud2lkdGgodmFsdWUpO2JyZWFrO30KJC53 aWRnZXQucHJvdG90eXBlLl9zZXREYXRhLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9 LF9zaXplOmZ1bmN0aW9uKCl7dmFyIG9wdGlvbnM9dGhpcy5vcHRpb25zO3RoaXMu ZWxlbWVudC5jc3Moe2hlaWdodDowLG1pbkhlaWdodDowLHdpZHRoOidhdXRvJ30p O3ZhciBub25Db250ZW50SGVpZ2h0PXRoaXMudWlEaWFsb2cuY3NzKHtoZWlnaHQ6 J2F1dG8nLHdpZHRoOm9wdGlvbnMud2lkdGh9KS5oZWlnaHQoKTt0aGlzLmVsZW1l bnQuY3NzKHttaW5IZWlnaHQ6TWF0aC5tYXgob3B0aW9ucy5taW5IZWlnaHQtbm9u Q29udGVudEhlaWdodCwwKSxoZWlnaHQ6b3B0aW9ucy5oZWlnaHQ9PSdhdXRvJz8n YXV0byc6TWF0aC5tYXgob3B0aW9ucy5oZWlnaHQtbm9uQ29udGVudEhlaWdodCww KX0pO319KTskLmV4dGVuZCgkLnVpLmRpYWxvZyx7dmVyc2lvbjoiMS43LjIiLGRl ZmF1bHRzOnthdXRvT3Blbjp0cnVlLGJnaWZyYW1lOmZhbHNlLGJ1dHRvbnM6e30s Y2xvc2VPbkVzY2FwZTp0cnVlLGNsb3NlVGV4dDonY2xvc2UnLGRpYWxvZ0NsYXNz OicnLGRyYWdnYWJsZTp0cnVlLGhpZGU6bnVsbCxoZWlnaHQ6J2F1dG8nLG1heEhl aWdodDpmYWxzZSxtYXhXaWR0aDpmYWxzZSxtaW5IZWlnaHQ6MTUwLG1pbldpZHRo OjE1MCxtb2RhbDpmYWxzZSxwb3NpdGlvbjonY2VudGVyJyxyZXNpemFibGU6dHJ1 ZSxzaG93Om51bGwsc3RhY2s6dHJ1ZSx0aXRsZTonJyx3aWR0aDozMDAsekluZGV4 OjEwMDB9LGdldHRlcjonaXNPcGVuJyx1dWlkOjAsbWF4WjowLGdldFRpdGxlSWQ6 ZnVuY3Rpb24oJGVsKXtyZXR1cm4ndWktZGlhbG9nLXRpdGxlLScrKCRlbC5hdHRy KCdpZCcpfHwrK3RoaXMudXVpZCk7fSxvdmVybGF5OmZ1bmN0aW9uKGRpYWxvZyl7 dGhpcy4kZWw9JC51aS5kaWFsb2cub3ZlcmxheS5jcmVhdGUoZGlhbG9nKTt9fSk7 JC5leHRlbmQoJC51aS5kaWFsb2cub3ZlcmxheSx7aW5zdGFuY2VzOltdLG1heFo6 MCxldmVudHM6JC5tYXAoJ2ZvY3VzLG1vdXNlZG93bixtb3VzZXVwLGtleWRvd24s a2V5cHJlc3MsY2xpY2snLnNwbGl0KCcsJyksZnVuY3Rpb24oZXZlbnQpe3JldHVy biBldmVudCsnLmRpYWxvZy1vdmVybGF5Jzt9KS5qb2luKCcgJyksY3JlYXRlOmZ1 bmN0aW9uKGRpYWxvZyl7aWYodGhpcy5pbnN0YW5jZXMubGVuZ3RoPT09MCl7c2V0 VGltZW91dChmdW5jdGlvbigpe2lmKCQudWkuZGlhbG9nLm92ZXJsYXkuaW5zdGFu Y2VzLmxlbmd0aCl7JChkb2N1bWVudCkuYmluZCgkLnVpLmRpYWxvZy5vdmVybGF5 LmV2ZW50cyxmdW5jdGlvbihldmVudCl7dmFyIGRpYWxvZ1o9JChldmVudC50YXJn ZXQpLnBhcmVudHMoJy51aS1kaWFsb2cnKS5jc3MoJ3pJbmRleCcpfHwwO3JldHVy bihkaWFsb2daPiQudWkuZGlhbG9nLm92ZXJsYXkubWF4Wik7fSk7fX0sMSk7JChk b2N1bWVudCkuYmluZCgna2V5ZG93bi5kaWFsb2ctb3ZlcmxheScsZnVuY3Rpb24o ZXZlbnQpeyhkaWFsb2cub3B0aW9ucy5jbG9zZU9uRXNjYXBlJiZldmVudC5rZXlD b2RlJiZldmVudC5rZXlDb2RlPT0kLnVpLmtleUNvZGUuRVNDQVBFJiZkaWFsb2cu Y2xvc2UoZXZlbnQpKTt9KTskKHdpbmRvdykuYmluZCgncmVzaXplLmRpYWxvZy1v dmVybGF5JywkLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSk7fQp2YXIgJGVsPSQo JzxkaXY+PC9kaXY+JykuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3Mo J3VpLXdpZGdldC1vdmVybGF5JykuY3NzKHt3aWR0aDp0aGlzLndpZHRoKCksaGVp Z2h0OnRoaXMuaGVpZ2h0KCl9KTsoZGlhbG9nLm9wdGlvbnMuYmdpZnJhbWUmJiQu Zm4uYmdpZnJhbWUmJiRlbC5iZ2lmcmFtZSgpKTt0aGlzLmluc3RhbmNlcy5wdXNo KCRlbCk7cmV0dXJuICRlbDt9LGRlc3Ryb3k6ZnVuY3Rpb24oJGVsKXt0aGlzLmlu c3RhbmNlcy5zcGxpY2UoJC5pbkFycmF5KHRoaXMuaW5zdGFuY2VzLCRlbCksMSk7 aWYodGhpcy5pbnN0YW5jZXMubGVuZ3RoPT09MCl7JChbZG9jdW1lbnQsd2luZG93 XSkudW5iaW5kKCcuZGlhbG9nLW92ZXJsYXknKTt9CiRlbC5yZW1vdmUoKTt2YXIg bWF4Wj0wOyQuZWFjaCh0aGlzLmluc3RhbmNlcyxmdW5jdGlvbigpe21heFo9TWF0 aC5tYXgobWF4Wix0aGlzLmNzcygnei1pbmRleCcpKTt9KTt0aGlzLm1heFo9bWF4 Wjt9LGhlaWdodDpmdW5jdGlvbigpe2lmKCQuYnJvd3Nlci5tc2llJiYkLmJyb3dz ZXIudmVyc2lvbjw3KXt2YXIgc2Nyb2xsSGVpZ2h0PU1hdGgubWF4KGRvY3VtZW50 LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuYm9keS5zY3Jv bGxIZWlnaHQpO3ZhciBvZmZzZXRIZWlnaHQ9TWF0aC5tYXgoZG9jdW1lbnQuZG9j dW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhl aWdodCk7aWYoc2Nyb2xsSGVpZ2h0PG9mZnNldEhlaWdodCl7cmV0dXJuICQod2lu ZG93KS5oZWlnaHQoKSsncHgnO31lbHNle3JldHVybiBzY3JvbGxIZWlnaHQrJ3B4 Jzt9fWVsc2V7cmV0dXJuICQoZG9jdW1lbnQpLmhlaWdodCgpKydweCc7fX0sd2lk dGg6ZnVuY3Rpb24oKXtpZigkLmJyb3dzZXIubXNpZSYmJC5icm93c2VyLnZlcnNp b248Nyl7dmFyIHNjcm9sbFdpZHRoPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50 RWxlbWVudC5zY3JvbGxXaWR0aCxkb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoKTt2 YXIgb2Zmc2V0V2lkdGg9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50 Lm9mZnNldFdpZHRoLGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGgpO2lmKHNjcm9s bFdpZHRoPG9mZnNldFdpZHRoKXtyZXR1cm4gJCh3aW5kb3cpLndpZHRoKCkrJ3B4 Jzt9ZWxzZXtyZXR1cm4gc2Nyb2xsV2lkdGgrJ3B4Jzt9fWVsc2V7cmV0dXJuICQo ZG9jdW1lbnQpLndpZHRoKCkrJ3B4Jzt9fSxyZXNpemU6ZnVuY3Rpb24oKXt2YXIg JG92ZXJsYXlzPSQoW10pOyQuZWFjaCgkLnVpLmRpYWxvZy5vdmVybGF5Lmluc3Rh bmNlcyxmdW5jdGlvbigpeyRvdmVybGF5cz0kb3ZlcmxheXMuYWRkKHRoaXMpO30p OyRvdmVybGF5cy5jc3Moe3dpZHRoOjAsaGVpZ2h0OjB9KS5jc3Moe3dpZHRoOiQu dWkuZGlhbG9nLm92ZXJsYXkud2lkdGgoKSxoZWlnaHQ6JC51aS5kaWFsb2cub3Zl cmxheS5oZWlnaHQoKX0pO319KTskLmV4dGVuZCgkLnVpLmRpYWxvZy5vdmVybGF5 LnByb3RvdHlwZSx7ZGVzdHJveTpmdW5jdGlvbigpeyQudWkuZGlhbG9nLm92ZXJs YXkuZGVzdHJveSh0aGlzLiRlbCk7fX0pO30pKGpRdWVyeSk7KGZ1bmN0aW9uKCQp eyQud2lkZ2V0KCJ1aS50YWJzIix7X2luaXQ6ZnVuY3Rpb24oKXtpZih0aGlzLm9w dGlvbnMuZGVzZWxlY3RhYmxlIT09dW5kZWZpbmVkKXt0aGlzLm9wdGlvbnMuY29s bGFwc2libGU9dGhpcy5vcHRpb25zLmRlc2VsZWN0YWJsZTt9CnRoaXMuX3RhYmlm eSh0cnVlKTt9LF9zZXREYXRhOmZ1bmN0aW9uKGtleSx2YWx1ZSl7aWYoa2V5PT0n c2VsZWN0ZWQnKXtpZih0aGlzLm9wdGlvbnMuY29sbGFwc2libGUmJnZhbHVlPT10 aGlzLm9wdGlvbnMuc2VsZWN0ZWQpe3JldHVybjt9CnRoaXMuc2VsZWN0KHZhbHVl KTt9CmVsc2V7dGhpcy5vcHRpb25zW2tleV09dmFsdWU7aWYoa2V5PT0nZGVzZWxl Y3RhYmxlJyl7dGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlPXZhbHVlO30KdGhpcy5f dGFiaWZ5KCk7fX0sX3RhYklkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpdGxlJiZh LnRpdGxlLnJlcGxhY2UoL1xzL2csJ18nKS5yZXBsYWNlKC9bXkEtWmEtejAtOVwt XzpcLl0vZywnJyl8fHRoaXMub3B0aW9ucy5pZFByZWZpeCskLmRhdGEoYSk7fSxf c2FuaXRpemVTZWxlY3RvcjpmdW5jdGlvbihoYXNoKXtyZXR1cm4gaGFzaC5yZXBs YWNlKC86L2csJ1xcOicpO30sX2Nvb2tpZTpmdW5jdGlvbigpe3ZhciBjb29raWU9 dGhpcy5jb29raWV8fCh0aGlzLmNvb2tpZT10aGlzLm9wdGlvbnMuY29va2llLm5h bWV8fCd1aS10YWJzLScrJC5kYXRhKHRoaXMubGlzdFswXSkpO3JldHVybiAkLmNv b2tpZS5hcHBseShudWxsLFtjb29raWVdLmNvbmNhdCgkLm1ha2VBcnJheShhcmd1 bWVudHMpKSk7fSxfdWk6ZnVuY3Rpb24odGFiLHBhbmVsKXtyZXR1cm57dGFiOnRh YixwYW5lbDpwYW5lbCxpbmRleDp0aGlzLmFuY2hvcnMuaW5kZXgodGFiKX07fSxf Y2xlYW51cDpmdW5jdGlvbigpe3RoaXMubGlzLmZpbHRlcignLnVpLXN0YXRlLXBy b2Nlc3NpbmcnKS5yZW1vdmVDbGFzcygndWktc3RhdGUtcHJvY2Vzc2luZycpLmZp bmQoJ3NwYW46ZGF0YShsYWJlbC50YWJzKScpLmVhY2goZnVuY3Rpb24oKXt2YXIg ZWw9JCh0aGlzKTtlbC5odG1sKGVsLmRhdGEoJ2xhYmVsLnRhYnMnKSkucmVtb3Zl RGF0YSgnbGFiZWwudGFicycpO30pO30sX3RhYmlmeTpmdW5jdGlvbihpbml0KXt0 aGlzLmxpc3Q9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCd1bDpmaXJzdCcpO3RoaXMu bGlzPSQoJ2xpOmhhcyhhW2hyZWZdKScsdGhpcy5saXN0KTt0aGlzLmFuY2hvcnM9 dGhpcy5saXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuICQoJ2EnLHRoaXMpWzBdO30p O3RoaXMucGFuZWxzPSQoW10pO3ZhciBzZWxmPXRoaXMsbz10aGlzLm9wdGlvbnM7 dmFyIGZyYWdtZW50SWQ9L14jLisvO3RoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9u KGksYSl7dmFyIGhyZWY9JChhKS5hdHRyKCdocmVmJyk7dmFyIGhyZWZCYXNlPWhy ZWYuc3BsaXQoJyMnKVswXSxiYXNlRWw7aWYoaHJlZkJhc2UmJihocmVmQmFzZT09 PWxvY2F0aW9uLnRvU3RyaW5nKCkuc3BsaXQoJyMnKVswXXx8KGJhc2VFbD0kKCdi YXNlJylbMF0pJiZocmVmQmFzZT09PWJhc2VFbC5ocmVmKSl7aHJlZj1hLmhhc2g7 YS5ocmVmPWhyZWY7fQppZihmcmFnbWVudElkLnRlc3QoaHJlZikpe3NlbGYucGFu ZWxzPXNlbGYucGFuZWxzLmFkZChzZWxmLl9zYW5pdGl6ZVNlbGVjdG9yKGhyZWYp KTt9CmVsc2UgaWYoaHJlZiE9JyMnKXskLmRhdGEoYSwnaHJlZi50YWJzJyxocmVm KTskLmRhdGEoYSwnbG9hZC50YWJzJyxocmVmLnJlcGxhY2UoLyMuKiQvLCcnKSk7 dmFyIGlkPXNlbGYuX3RhYklkKGEpO2EuaHJlZj0nIycraWQ7dmFyICRwYW5lbD0k KCcjJytpZCk7aWYoISRwYW5lbC5sZW5ndGgpeyRwYW5lbD0kKG8ucGFuZWxUZW1w bGF0ZSkuYXR0cignaWQnLGlkKS5hZGRDbGFzcygndWktdGFicy1wYW5lbCB1aS13 aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tJykuaW5zZXJ0QWZ0ZXIoc2Vs Zi5wYW5lbHNbaS0xXXx8c2VsZi5saXN0KTskcGFuZWwuZGF0YSgnZGVzdHJveS50 YWJzJyx0cnVlKTt9CnNlbGYucGFuZWxzPXNlbGYucGFuZWxzLmFkZCgkcGFuZWwp O30KZWxzZXtvLmRpc2FibGVkLnB1c2goaSk7fX0pO2lmKGluaXQpe3RoaXMuZWxl bWVudC5hZGRDbGFzcygndWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRl bnQgdWktY29ybmVyLWFsbCcpO3RoaXMubGlzdC5hZGRDbGFzcygndWktdGFicy1u YXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQt aGVhZGVyIHVpLWNvcm5lci1hbGwnKTt0aGlzLmxpcy5hZGRDbGFzcygndWktc3Rh dGUtZGVmYXVsdCB1aS1jb3JuZXItdG9wJyk7dGhpcy5wYW5lbHMuYWRkQ2xhc3Mo J3VpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRv bScpO2lmKG8uc2VsZWN0ZWQ9PT11bmRlZmluZWQpe2lmKGxvY2F0aW9uLmhhc2gp e3RoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGksYSl7aWYoYS5oYXNoPT1sb2Nh dGlvbi5oYXNoKXtvLnNlbGVjdGVkPWk7cmV0dXJuIGZhbHNlO319KTt9CmlmKHR5 cGVvZiBvLnNlbGVjdGVkIT0nbnVtYmVyJyYmby5jb29raWUpe28uc2VsZWN0ZWQ9 cGFyc2VJbnQoc2VsZi5fY29va2llKCksMTApO30KaWYodHlwZW9mIG8uc2VsZWN0 ZWQhPSdudW1iZXInJiZ0aGlzLmxpcy5maWx0ZXIoJy51aS10YWJzLXNlbGVjdGVk JykubGVuZ3RoKXtvLnNlbGVjdGVkPXRoaXMubGlzLmluZGV4KHRoaXMubGlzLmZp bHRlcignLnVpLXRhYnMtc2VsZWN0ZWQnKSk7fQpvLnNlbGVjdGVkPW8uc2VsZWN0 ZWR8fDA7fQplbHNlIGlmKG8uc2VsZWN0ZWQ9PT1udWxsKXtvLnNlbGVjdGVkPS0x O30Kby5zZWxlY3RlZD0oKG8uc2VsZWN0ZWQ+PTAmJnRoaXMuYW5jaG9yc1tvLnNl bGVjdGVkXSl8fG8uc2VsZWN0ZWQ8MCk/by5zZWxlY3RlZDowO28uZGlzYWJsZWQ9 JC51bmlxdWUoby5kaXNhYmxlZC5jb25jYXQoJC5tYXAodGhpcy5saXMuZmlsdGVy KCcudWktc3RhdGUtZGlzYWJsZWQnKSxmdW5jdGlvbihuLGkpe3JldHVybiBzZWxm Lmxpcy5pbmRleChuKTt9KSkpLnNvcnQoKTtpZigkLmluQXJyYXkoby5zZWxlY3Rl ZCxvLmRpc2FibGVkKSE9LTEpe28uZGlzYWJsZWQuc3BsaWNlKCQuaW5BcnJheShv LnNlbGVjdGVkLG8uZGlzYWJsZWQpLDEpO30KdGhpcy5wYW5lbHMuYWRkQ2xhc3Mo J3VpLXRhYnMtaGlkZScpO3RoaXMubGlzLnJlbW92ZUNsYXNzKCd1aS10YWJzLXNl bGVjdGVkIHVpLXN0YXRlLWFjdGl2ZScpO2lmKG8uc2VsZWN0ZWQ+PTAmJnRoaXMu YW5jaG9ycy5sZW5ndGgpe3RoaXMucGFuZWxzLmVxKG8uc2VsZWN0ZWQpLnJlbW92 ZUNsYXNzKCd1aS10YWJzLWhpZGUnKTt0aGlzLmxpcy5lcShvLnNlbGVjdGVkKS5h ZGRDbGFzcygndWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUnKTtzZWxm LmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7c2VsZi5fdHJpZ2dlcign c2hvdycsbnVsbCxzZWxmLl91aShzZWxmLmFuY2hvcnNbby5zZWxlY3RlZF0sc2Vs Zi5wYW5lbHNbby5zZWxlY3RlZF0pKTt9KTt0aGlzLmxvYWQoby5zZWxlY3RlZCk7 fQokKHdpbmRvdykuYmluZCgndW5sb2FkJyxmdW5jdGlvbigpe3NlbGYubGlzLmFk ZChzZWxmLmFuY2hvcnMpLnVuYmluZCgnLnRhYnMnKTtzZWxmLmxpcz1zZWxmLmFu Y2hvcnM9c2VsZi5wYW5lbHM9bnVsbDt9KTt9CmVsc2V7by5zZWxlY3RlZD10aGlz Lmxpcy5pbmRleCh0aGlzLmxpcy5maWx0ZXIoJy51aS10YWJzLXNlbGVjdGVkJykp O30KdGhpcy5lbGVtZW50W28uY29sbGFwc2libGU/J2FkZENsYXNzJzoncmVtb3Zl Q2xhc3MnXSgndWktdGFicy1jb2xsYXBzaWJsZScpO2lmKG8uY29va2llKXt0aGlz Ll9jb29raWUoby5zZWxlY3RlZCxvLmNvb2tpZSk7fQpmb3IodmFyIGk9MCxsaTso bGk9dGhpcy5saXNbaV0pO2krKyl7JChsaSlbJC5pbkFycmF5KGksby5kaXNhYmxl ZCkhPS0xJiYhJChsaSkuaGFzQ2xhc3MoJ3VpLXRhYnMtc2VsZWN0ZWQnKT8nYWRk Q2xhc3MnOidyZW1vdmVDbGFzcyddKCd1aS1zdGF0ZS1kaXNhYmxlZCcpO30KaWYo by5jYWNoZT09PWZhbHNlKXt0aGlzLmFuY2hvcnMucmVtb3ZlRGF0YSgnY2FjaGUu dGFicycpO30KdGhpcy5saXMuYWRkKHRoaXMuYW5jaG9ycykudW5iaW5kKCcudGFi cycpO2lmKG8uZXZlbnQhPSdtb3VzZW92ZXInKXt2YXIgYWRkU3RhdGU9ZnVuY3Rp b24oc3RhdGUsZWwpe2lmKGVsLmlzKCc6bm90KC51aS1zdGF0ZS1kaXNhYmxlZCkn KSl7ZWwuYWRkQ2xhc3MoJ3VpLXN0YXRlLScrc3RhdGUpO319O3ZhciByZW1vdmVT dGF0ZT1mdW5jdGlvbihzdGF0ZSxlbCl7ZWwucmVtb3ZlQ2xhc3MoJ3VpLXN0YXRl LScrc3RhdGUpO307dGhpcy5saXMuYmluZCgnbW91c2VvdmVyLnRhYnMnLGZ1bmN0 aW9uKCl7YWRkU3RhdGUoJ2hvdmVyJywkKHRoaXMpKTt9KTt0aGlzLmxpcy5iaW5k KCdtb3VzZW91dC50YWJzJyxmdW5jdGlvbigpe3JlbW92ZVN0YXRlKCdob3Zlcics JCh0aGlzKSk7fSk7dGhpcy5hbmNob3JzLmJpbmQoJ2ZvY3VzLnRhYnMnLGZ1bmN0 aW9uKCl7YWRkU3RhdGUoJ2ZvY3VzJywkKHRoaXMpLmNsb3Nlc3QoJ2xpJykpO30p O3RoaXMuYW5jaG9ycy5iaW5kKCdibHVyLnRhYnMnLGZ1bmN0aW9uKCl7cmVtb3Zl U3RhdGUoJ2ZvY3VzJywkKHRoaXMpLmNsb3Nlc3QoJ2xpJykpO30pO30KdmFyIGhp ZGVGeCxzaG93Rng7aWYoby5meCl7aWYoJC5pc0FycmF5KG8uZngpKXtoaWRlRng9 by5meFswXTtzaG93Rng9by5meFsxXTt9CmVsc2V7aGlkZUZ4PXNob3dGeD1vLmZ4 O319CmZ1bmN0aW9uIHJlc2V0U3R5bGUoJGVsLGZ4KXskZWwuY3NzKHtkaXNwbGF5 OicnfSk7aWYoJC5icm93c2VyLm1zaWUmJmZ4Lm9wYWNpdHkpeyRlbFswXS5zdHls ZS5yZW1vdmVBdHRyaWJ1dGUoJ2ZpbHRlcicpO319CnZhciBzaG93VGFiPXNob3dG eD9mdW5jdGlvbihjbGlja2VkLCRzaG93KXskKGNsaWNrZWQpLmNsb3Nlc3QoJ2xp JykucmVtb3ZlQ2xhc3MoJ3VpLXN0YXRlLWRlZmF1bHQnKS5hZGRDbGFzcygndWkt dGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUnKTskc2hvdy5oaWRlKCkucmVt b3ZlQ2xhc3MoJ3VpLXRhYnMtaGlkZScpLmFuaW1hdGUoc2hvd0Z4LHNob3dGeC5k dXJhdGlvbnx8J25vcm1hbCcsZnVuY3Rpb24oKXtyZXNldFN0eWxlKCRzaG93LHNo b3dGeCk7c2VsZi5fdHJpZ2dlcignc2hvdycsbnVsbCxzZWxmLl91aShjbGlja2Vk LCRzaG93WzBdKSk7fSk7fTpmdW5jdGlvbihjbGlja2VkLCRzaG93KXskKGNsaWNr ZWQpLmNsb3Nlc3QoJ2xpJykucmVtb3ZlQ2xhc3MoJ3VpLXN0YXRlLWRlZmF1bHQn KS5hZGRDbGFzcygndWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUnKTsk c2hvdy5yZW1vdmVDbGFzcygndWktdGFicy1oaWRlJyk7c2VsZi5fdHJpZ2dlcign c2hvdycsbnVsbCxzZWxmLl91aShjbGlja2VkLCRzaG93WzBdKSk7fTt2YXIgaGlk ZVRhYj1oaWRlRng/ZnVuY3Rpb24oY2xpY2tlZCwkaGlkZSl7JGhpZGUuYW5pbWF0 ZShoaWRlRngsaGlkZUZ4LmR1cmF0aW9ufHwnbm9ybWFsJyxmdW5jdGlvbigpe3Nl bGYubGlzLnJlbW92ZUNsYXNzKCd1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFj dGl2ZScpLmFkZENsYXNzKCd1aS1zdGF0ZS1kZWZhdWx0Jyk7JGhpZGUuYWRkQ2xh c3MoJ3VpLXRhYnMtaGlkZScpO3Jlc2V0U3R5bGUoJGhpZGUsaGlkZUZ4KTtzZWxm LmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpO30pO306ZnVuY3Rpb24oY2xpY2tlZCwk aGlkZSwkc2hvdyl7c2VsZi5saXMucmVtb3ZlQ2xhc3MoJ3VpLXRhYnMtc2VsZWN0 ZWQgdWktc3RhdGUtYWN0aXZlJykuYWRkQ2xhc3MoJ3VpLXN0YXRlLWRlZmF1bHQn KTskaGlkZS5hZGRDbGFzcygndWktdGFicy1oaWRlJyk7c2VsZi5lbGVtZW50LmRl cXVldWUoInRhYnMiKTt9O3RoaXMuYW5jaG9ycy5iaW5kKG8uZXZlbnQrJy50YWJz JyxmdW5jdGlvbigpe3ZhciBlbD10aGlzLCRsaT0kKHRoaXMpLmNsb3Nlc3QoJ2xp JyksJGhpZGU9c2VsZi5wYW5lbHMuZmlsdGVyKCc6bm90KC51aS10YWJzLWhpZGUp JyksJHNob3c9JChzZWxmLl9zYW5pdGl6ZVNlbGVjdG9yKHRoaXMuaGFzaCkpO2lm KCgkbGkuaGFzQ2xhc3MoJ3VpLXRhYnMtc2VsZWN0ZWQnKSYmIW8uY29sbGFwc2li bGUpfHwkbGkuaGFzQ2xhc3MoJ3VpLXN0YXRlLWRpc2FibGVkJyl8fCRsaS5oYXND bGFzcygndWktc3RhdGUtcHJvY2Vzc2luZycpfHxzZWxmLl90cmlnZ2VyKCdzZWxl Y3QnLG51bGwsc2VsZi5fdWkodGhpcywkc2hvd1swXSkpPT09ZmFsc2Upe3RoaXMu Ymx1cigpO3JldHVybiBmYWxzZTt9Cm8uc2VsZWN0ZWQ9c2VsZi5hbmNob3JzLmlu ZGV4KHRoaXMpO3NlbGYuYWJvcnQoKTtpZihvLmNvbGxhcHNpYmxlKXtpZigkbGku aGFzQ2xhc3MoJ3VpLXRhYnMtc2VsZWN0ZWQnKSl7by5zZWxlY3RlZD0tMTtpZihv LmNvb2tpZSl7c2VsZi5fY29va2llKG8uc2VsZWN0ZWQsby5jb29raWUpO30Kc2Vs Zi5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe2hpZGVUYWIoZWwsJGhp ZGUpO30pLmRlcXVldWUoInRhYnMiKTt0aGlzLmJsdXIoKTtyZXR1cm4gZmFsc2U7 fQplbHNlIGlmKCEkaGlkZS5sZW5ndGgpe2lmKG8uY29va2llKXtzZWxmLl9jb29r aWUoby5zZWxlY3RlZCxvLmNvb2tpZSk7fQpzZWxmLmVsZW1lbnQucXVldWUoInRh YnMiLGZ1bmN0aW9uKCl7c2hvd1RhYihlbCwkc2hvdyk7fSk7c2VsZi5sb2FkKHNl bGYuYW5jaG9ycy5pbmRleCh0aGlzKSk7dGhpcy5ibHVyKCk7cmV0dXJuIGZhbHNl O319CmlmKG8uY29va2llKXtzZWxmLl9jb29raWUoby5zZWxlY3RlZCxvLmNvb2tp ZSk7fQppZigkc2hvdy5sZW5ndGgpe2lmKCRoaWRlLmxlbmd0aCl7c2VsZi5lbGVt ZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe2hpZGVUYWIoZWwsJGhpZGUpO30p O30Kc2VsZi5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe3Nob3dUYWIo ZWwsJHNob3cpO30pO3NlbGYubG9hZChzZWxmLmFuY2hvcnMuaW5kZXgodGhpcykp O30KZWxzZXt0aHJvdydqUXVlcnkgVUkgVGFiczogTWlzbWF0Y2hpbmcgZnJhZ21l bnQgaWRlbnRpZmllci4nO30KaWYoJC5icm93c2VyLm1zaWUpe3RoaXMuYmx1cigp O319KTt0aGlzLmFuY2hvcnMuYmluZCgnY2xpY2sudGFicycsZnVuY3Rpb24oKXty ZXR1cm4gZmFsc2U7fSk7fSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIG89dGhpcy5v cHRpb25zO3RoaXMuYWJvcnQoKTt0aGlzLmVsZW1lbnQudW5iaW5kKCcudGFicycp LnJlbW92ZUNsYXNzKCd1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVu dCB1aS1jb3JuZXItYWxsIHVpLXRhYnMtY29sbGFwc2libGUnKS5yZW1vdmVEYXRh KCd0YWJzJyk7dGhpcy5saXN0LnJlbW92ZUNsYXNzKCd1aS10YWJzLW5hdiB1aS1o ZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIg dWktY29ybmVyLWFsbCcpO3RoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKCl7dmFy IGhyZWY9JC5kYXRhKHRoaXMsJ2hyZWYudGFicycpO2lmKGhyZWYpe3RoaXMuaHJl Zj1ocmVmO30KdmFyICR0aGlzPSQodGhpcykudW5iaW5kKCcudGFicycpOyQuZWFj aChbJ2hyZWYnLCdsb2FkJywnY2FjaGUnXSxmdW5jdGlvbihpLHByZWZpeCl7JHRo aXMucmVtb3ZlRGF0YShwcmVmaXgrJy50YWJzJyk7fSk7fSk7dGhpcy5saXMudW5i aW5kKCcudGFicycpLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2lm KCQuZGF0YSh0aGlzLCdkZXN0cm95LnRhYnMnKSl7JCh0aGlzKS5yZW1vdmUoKTt9 CmVsc2V7JCh0aGlzKS5yZW1vdmVDbGFzcyhbJ3VpLXN0YXRlLWRlZmF1bHQnLCd1 aS1jb3JuZXItdG9wJywndWktdGFicy1zZWxlY3RlZCcsJ3VpLXN0YXRlLWFjdGl2 ZScsJ3VpLXN0YXRlLWhvdmVyJywndWktc3RhdGUtZm9jdXMnLCd1aS1zdGF0ZS1k aXNhYmxlZCcsJ3VpLXRhYnMtcGFuZWwnLCd1aS13aWRnZXQtY29udGVudCcsJ3Vp LWNvcm5lci1ib3R0b20nLCd1aS10YWJzLWhpZGUnXS5qb2luKCcgJykpO319KTtp ZihvLmNvb2tpZSl7dGhpcy5fY29va2llKG51bGwsby5jb29raWUpO319LGFkZDpm dW5jdGlvbih1cmwsbGFiZWwsaW5kZXgpe2lmKGluZGV4PT09dW5kZWZpbmVkKXtp bmRleD10aGlzLmFuY2hvcnMubGVuZ3RoO30KdmFyIHNlbGY9dGhpcyxvPXRoaXMu b3B0aW9ucywkbGk9JChvLnRhYlRlbXBsYXRlLnJlcGxhY2UoLyNce2hyZWZcfS9n LHVybCkucmVwbGFjZSgvI1x7bGFiZWxcfS9nLGxhYmVsKSksaWQ9IXVybC5pbmRl eE9mKCcjJyk/dXJsLnJlcGxhY2UoJyMnLCcnKTp0aGlzLl90YWJJZCgkKCdhJywk bGkpWzBdKTskbGkuYWRkQ2xhc3MoJ3VpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVy LXRvcCcpLmRhdGEoJ2Rlc3Ryb3kudGFicycsdHJ1ZSk7dmFyICRwYW5lbD0kKCcj JytpZCk7aWYoISRwYW5lbC5sZW5ndGgpeyRwYW5lbD0kKG8ucGFuZWxUZW1wbGF0 ZSkuYXR0cignaWQnLGlkKS5kYXRhKCdkZXN0cm95LnRhYnMnLHRydWUpO30KJHBh bmVsLmFkZENsYXNzKCd1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVp LWNvcm5lci1ib3R0b20gdWktdGFicy1oaWRlJyk7aWYoaW5kZXg+PXRoaXMubGlz Lmxlbmd0aCl7JGxpLmFwcGVuZFRvKHRoaXMubGlzdCk7JHBhbmVsLmFwcGVuZFRv KHRoaXMubGlzdFswXS5wYXJlbnROb2RlKTt9CmVsc2V7JGxpLmluc2VydEJlZm9y ZSh0aGlzLmxpc1tpbmRleF0pOyRwYW5lbC5pbnNlcnRCZWZvcmUodGhpcy5wYW5l bHNbaW5kZXhdKTt9Cm8uZGlzYWJsZWQ9JC5tYXAoby5kaXNhYmxlZCxmdW5jdGlv bihuLGkpe3JldHVybiBuPj1pbmRleD8rK246bjt9KTt0aGlzLl90YWJpZnkoKTtp Zih0aGlzLmFuY2hvcnMubGVuZ3RoPT0xKXskbGkuYWRkQ2xhc3MoJ3VpLXRhYnMt c2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlJyk7JHBhbmVsLnJlbW92ZUNsYXNzKCd1 aS10YWJzLWhpZGUnKTt0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9u KCl7c2VsZi5fdHJpZ2dlcignc2hvdycsbnVsbCxzZWxmLl91aShzZWxmLmFuY2hv cnNbMF0sc2VsZi5wYW5lbHNbMF0pKTt9KTt0aGlzLmxvYWQoMCk7fQp0aGlzLl90 cmlnZ2VyKCdhZGQnLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2luZGV4XSx0 aGlzLnBhbmVsc1tpbmRleF0pKTt9LHJlbW92ZTpmdW5jdGlvbihpbmRleCl7dmFy IG89dGhpcy5vcHRpb25zLCRsaT10aGlzLmxpcy5lcShpbmRleCkucmVtb3ZlKCks JHBhbmVsPXRoaXMucGFuZWxzLmVxKGluZGV4KS5yZW1vdmUoKTtpZigkbGkuaGFz Q2xhc3MoJ3VpLXRhYnMtc2VsZWN0ZWQnKSYmdGhpcy5hbmNob3JzLmxlbmd0aD4x KXt0aGlzLnNlbGVjdChpbmRleCsoaW5kZXgrMTx0aGlzLmFuY2hvcnMubGVuZ3Ro PzE6LTEpKTt9Cm8uZGlzYWJsZWQ9JC5tYXAoJC5ncmVwKG8uZGlzYWJsZWQsZnVu Y3Rpb24obixpKXtyZXR1cm4gbiE9aW5kZXg7fSksZnVuY3Rpb24obixpKXtyZXR1 cm4gbj49aW5kZXg/LS1uOm47fSk7dGhpcy5fdGFiaWZ5KCk7dGhpcy5fdHJpZ2dl cigncmVtb3ZlJyxudWxsLHRoaXMuX3VpKCRsaS5maW5kKCdhJylbMF0sJHBhbmVs WzBdKSk7fSxlbmFibGU6ZnVuY3Rpb24oaW5kZXgpe3ZhciBvPXRoaXMub3B0aW9u cztpZigkLmluQXJyYXkoaW5kZXgsby5kaXNhYmxlZCk9PS0xKXtyZXR1cm47fQp0 aGlzLmxpcy5lcShpbmRleCkucmVtb3ZlQ2xhc3MoJ3VpLXN0YXRlLWRpc2FibGVk Jyk7by5kaXNhYmxlZD0kLmdyZXAoby5kaXNhYmxlZCxmdW5jdGlvbihuLGkpe3Jl dHVybiBuIT1pbmRleDt9KTt0aGlzLl90cmlnZ2VyKCdlbmFibGUnLG51bGwsdGhp cy5fdWkodGhpcy5hbmNob3JzW2luZGV4XSx0aGlzLnBhbmVsc1tpbmRleF0pKTt9 LGRpc2FibGU6ZnVuY3Rpb24oaW5kZXgpe3ZhciBzZWxmPXRoaXMsbz10aGlzLm9w dGlvbnM7aWYoaW5kZXghPW8uc2VsZWN0ZWQpe3RoaXMubGlzLmVxKGluZGV4KS5h ZGRDbGFzcygndWktc3RhdGUtZGlzYWJsZWQnKTtvLmRpc2FibGVkLnB1c2goaW5k ZXgpO28uZGlzYWJsZWQuc29ydCgpO3RoaXMuX3RyaWdnZXIoJ2Rpc2FibGUnLG51 bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2luZGV4XSx0aGlzLnBhbmVsc1tpbmRl eF0pKTt9fSxzZWxlY3Q6ZnVuY3Rpb24oaW5kZXgpe2lmKHR5cGVvZiBpbmRleD09 J3N0cmluZycpe2luZGV4PXRoaXMuYW5jaG9ycy5pbmRleCh0aGlzLmFuY2hvcnMu ZmlsdGVyKCdbaHJlZiQ9JytpbmRleCsnXScpKTt9CmVsc2UgaWYoaW5kZXg9PT1u dWxsKXtpbmRleD0tMTt9CmlmKGluZGV4PT0tMSYmdGhpcy5vcHRpb25zLmNvbGxh cHNpYmxlKXtpbmRleD10aGlzLm9wdGlvbnMuc2VsZWN0ZWQ7fQp0aGlzLmFuY2hv cnMuZXEoaW5kZXgpLnRyaWdnZXIodGhpcy5vcHRpb25zLmV2ZW50KycudGFicycp O30sbG9hZDpmdW5jdGlvbihpbmRleCl7dmFyIHNlbGY9dGhpcyxvPXRoaXMub3B0 aW9ucyxhPXRoaXMuYW5jaG9ycy5lcShpbmRleClbMF0sdXJsPSQuZGF0YShhLCds b2FkLnRhYnMnKTt0aGlzLmFib3J0KCk7aWYoIXVybHx8dGhpcy5lbGVtZW50LnF1 ZXVlKCJ0YWJzIikubGVuZ3RoIT09MCYmJC5kYXRhKGEsJ2NhY2hlLnRhYnMnKSl7 dGhpcy5lbGVtZW50LmRlcXVldWUoInRhYnMiKTtyZXR1cm47fQp0aGlzLmxpcy5l cShpbmRleCkuYWRkQ2xhc3MoJ3VpLXN0YXRlLXByb2Nlc3NpbmcnKTtpZihvLnNw aW5uZXIpe3ZhciBzcGFuPSQoJ3NwYW4nLGEpO3NwYW4uZGF0YSgnbGFiZWwudGFi cycsc3Bhbi5odG1sKCkpLmh0bWwoby5zcGlubmVyKTt9CnRoaXMueGhyPSQuYWph eCgkLmV4dGVuZCh7fSxvLmFqYXhPcHRpb25zLHt1cmw6dXJsLHN1Y2Nlc3M6ZnVu Y3Rpb24ocixzKXskKHNlbGYuX3Nhbml0aXplU2VsZWN0b3IoYS5oYXNoKSkuaHRt bChyKTtzZWxmLl9jbGVhbnVwKCk7aWYoby5jYWNoZSl7JC5kYXRhKGEsJ2NhY2hl LnRhYnMnLHRydWUpO30Kc2VsZi5fdHJpZ2dlcignbG9hZCcsbnVsbCxzZWxmLl91 aShzZWxmLmFuY2hvcnNbaW5kZXhdLHNlbGYucGFuZWxzW2luZGV4XSkpO3RyeXtv LmFqYXhPcHRpb25zLnN1Y2Nlc3MocixzKTt9CmNhdGNoKGUpe30Kc2VsZi5lbGVt ZW50LmRlcXVldWUoInRhYnMiKTt9fSkpO30sYWJvcnQ6ZnVuY3Rpb24oKXt0aGlz LmVsZW1lbnQucXVldWUoW10pO3RoaXMucGFuZWxzLnN0b3AoZmFsc2UsdHJ1ZSk7 aWYodGhpcy54aHIpe3RoaXMueGhyLmFib3J0KCk7ZGVsZXRlIHRoaXMueGhyO30K dGhpcy5fY2xlYW51cCgpO30sdXJsOmZ1bmN0aW9uKGluZGV4LHVybCl7dGhpcy5h bmNob3JzLmVxKGluZGV4KS5yZW1vdmVEYXRhKCdjYWNoZS50YWJzJykuZGF0YSgn bG9hZC50YWJzJyx1cmwpO30sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu YW5jaG9ycy5sZW5ndGg7fX0pOyQuZXh0ZW5kKCQudWkudGFicyx7dmVyc2lvbjon MS43LjInLGdldHRlcjonbGVuZ3RoJyxkZWZhdWx0czp7YWpheE9wdGlvbnM6bnVs bCxjYWNoZTpmYWxzZSxjb29raWU6bnVsbCxjb2xsYXBzaWJsZTpmYWxzZSxkaXNh YmxlZDpbXSxldmVudDonY2xpY2snLGZ4Om51bGwsaWRQcmVmaXg6J3VpLXRhYnMt JyxwYW5lbFRlbXBsYXRlOic8ZGl2PjwvZGl2Picsc3Bpbm5lcjonPGVtPkxvYWRp bmcmIzgyMzA7PC9lbT4nLHRhYlRlbXBsYXRlOic8bGk+PGEgaHJlZj0iI3tocmVm fSI+PHNwYW4+I3tsYWJlbH08L3NwYW4+PC9hPjwvbGk+J319KTskLmV4dGVuZCgk LnVpLnRhYnMucHJvdG90eXBlLHtyb3RhdGlvbjpudWxsLHJvdGF0ZTpmdW5jdGlv bihtcyxjb250aW51aW5nKXt2YXIgc2VsZj10aGlzLG89dGhpcy5vcHRpb25zO3Zh ciByb3RhdGU9c2VsZi5fcm90YXRlfHwoc2VsZi5fcm90YXRlPWZ1bmN0aW9uKGUp e2NsZWFyVGltZW91dChzZWxmLnJvdGF0aW9uKTtzZWxmLnJvdGF0aW9uPXNldFRp bWVvdXQoZnVuY3Rpb24oKXt2YXIgdD1vLnNlbGVjdGVkO3NlbGYuc2VsZWN0KCsr dDxzZWxmLmFuY2hvcnMubGVuZ3RoP3Q6MCk7fSxtcyk7aWYoZSl7ZS5zdG9wUHJv cGFnYXRpb24oKTt9fSk7dmFyIHN0b3A9c2VsZi5fdW5yb3RhdGV8fChzZWxmLl91 bnJvdGF0ZT0hY29udGludWluZz9mdW5jdGlvbihlKXtpZihlLmNsaWVudFgpe3Nl bGYucm90YXRlKG51bGwpO319OmZ1bmN0aW9uKGUpe3Q9by5zZWxlY3RlZDtyb3Rh dGUoKTt9KTtpZihtcyl7dGhpcy5lbGVtZW50LmJpbmQoJ3RhYnNzaG93Jyxyb3Rh dGUpO3RoaXMuYW5jaG9ycy5iaW5kKG8uZXZlbnQrJy50YWJzJyxzdG9wKTtyb3Rh dGUoKTt9CmVsc2V7Y2xlYXJUaW1lb3V0KHNlbGYucm90YXRpb24pO3RoaXMuZWxl bWVudC51bmJpbmQoJ3RhYnNzaG93Jyxyb3RhdGUpO3RoaXMuYW5jaG9ycy51bmJp bmQoby5ldmVudCsnLnRhYnMnLHN0b3ApO2RlbGV0ZSB0aGlzLl9yb3RhdGU7ZGVs ZXRlIHRoaXMuX3Vucm90YXRlO319fSk7fSkoalF1ZXJ5KTsoZnVuY3Rpb24oJCl7 JC5leHRlbmQoJC51aSx7ZGF0ZXBpY2tlcjp7dmVyc2lvbjoiMS43LjIifX0pO3Zh ciBQUk9QX05BTUU9J2RhdGVwaWNrZXInO2Z1bmN0aW9uIERhdGVwaWNrZXIoKXt0 aGlzLmRlYnVnPWZhbHNlO3RoaXMuX2N1ckluc3Q9bnVsbDt0aGlzLl9rZXlFdmVu dD1mYWxzZTt0aGlzLl9kaXNhYmxlZElucHV0cz1bXTt0aGlzLl9kYXRlcGlja2Vy U2hvd2luZz1mYWxzZTt0aGlzLl9pbkRpYWxvZz1mYWxzZTt0aGlzLl9tYWluRGl2 SWQ9J3VpLWRhdGVwaWNrZXItZGl2Jzt0aGlzLl9pbmxpbmVDbGFzcz0ndWktZGF0 ZXBpY2tlci1pbmxpbmUnO3RoaXMuX2FwcGVuZENsYXNzPSd1aS1kYXRlcGlja2Vy LWFwcGVuZCc7dGhpcy5fdHJpZ2dlckNsYXNzPSd1aS1kYXRlcGlja2VyLXRyaWdn ZXInO3RoaXMuX2RpYWxvZ0NsYXNzPSd1aS1kYXRlcGlja2VyLWRpYWxvZyc7dGhp cy5fZGlzYWJsZUNsYXNzPSd1aS1kYXRlcGlja2VyLWRpc2FibGVkJzt0aGlzLl91 bnNlbGVjdGFibGVDbGFzcz0ndWktZGF0ZXBpY2tlci11bnNlbGVjdGFibGUnO3Ro aXMuX2N1cnJlbnRDbGFzcz0ndWktZGF0ZXBpY2tlci1jdXJyZW50LWRheSc7dGhp cy5fZGF5T3ZlckNsYXNzPSd1aS1kYXRlcGlja2VyLWRheXMtY2VsbC1vdmVyJzt0 aGlzLnJlZ2lvbmFsPVtdO3RoaXMucmVnaW9uYWxbJyddPXtjbG9zZVRleHQ6J0Rv bmUnLHByZXZUZXh0OidQcmV2JyxuZXh0VGV4dDonTmV4dCcsY3VycmVudFRleHQ6 J1RvZGF5Jyxtb250aE5hbWVzOlsnSmFudWFyeScsJ0ZlYnJ1YXJ5JywnTWFyY2gn LCdBcHJpbCcsJ01heScsJ0p1bmUnLCdKdWx5JywnQXVndXN0JywnU2VwdGVtYmVy JywnT2N0b2JlcicsJ05vdmVtYmVyJywnRGVjZW1iZXInXSxtb250aE5hbWVzU2hv cnQ6WydKYW4nLCdGZWInLCdNYXInLCdBcHInLCdNYXknLCdKdW4nLCdKdWwnLCdB dWcnLCdTZXAnLCdPY3QnLCdOb3YnLCdEZWMnXSxkYXlOYW1lczpbJ1N1bmRheScs J01vbmRheScsJ1R1ZXNkYXknLCdXZWRuZXNkYXknLCdUaHVyc2RheScsJ0ZyaWRh eScsJ1NhdHVyZGF5J10sZGF5TmFtZXNTaG9ydDpbJ1N1bicsJ01vbicsJ1R1ZScs J1dlZCcsJ1RodScsJ0ZyaScsJ1NhdCddLGRheU5hbWVzTWluOlsnU3UnLCdNbycs J1R1JywnV2UnLCdUaCcsJ0ZyJywnU2EnXSxkYXRlRm9ybWF0OidtbS9kZC95eScs Zmlyc3REYXk6MCxpc1JUTDpmYWxzZX07dGhpcy5fZGVmYXVsdHM9e3Nob3dPbjon Zm9jdXMnLHNob3dBbmltOidzaG93JyxzaG93T3B0aW9uczp7fSxkZWZhdWx0RGF0 ZTpudWxsLGFwcGVuZFRleHQ6JycsYnV0dG9uVGV4dDonLi4uJyxidXR0b25JbWFn ZTonJyxidXR0b25JbWFnZU9ubHk6ZmFsc2UsaGlkZUlmTm9QcmV2TmV4dDpmYWxz ZSxuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0OmZhbHNlLGdvdG9DdXJyZW50OmZhbHNl LGNoYW5nZU1vbnRoOmZhbHNlLGNoYW5nZVllYXI6ZmFsc2Usc2hvd01vbnRoQWZ0 ZXJZZWFyOmZhbHNlLHllYXJSYW5nZTonLTEwOisxMCcsc2hvd090aGVyTW9udGhz OmZhbHNlLGNhbGN1bGF0ZVdlZWs6dGhpcy5pc284NjAxV2VlayxzaG9ydFllYXJD dXRvZmY6JysxMCcsbWluRGF0ZTpudWxsLG1heERhdGU6bnVsbCxkdXJhdGlvbjon bm9ybWFsJyxiZWZvcmVTaG93RGF5Om51bGwsYmVmb3JlU2hvdzpudWxsLG9uU2Vs ZWN0Om51bGwsb25DaGFuZ2VNb250aFllYXI6bnVsbCxvbkNsb3NlOm51bGwsbnVt YmVyT2ZNb250aHM6MSxzaG93Q3VycmVudEF0UG9zOjAsc3RlcE1vbnRoczoxLHN0 ZXBCaWdNb250aHM6MTIsYWx0RmllbGQ6JycsYWx0Rm9ybWF0OicnLGNvbnN0cmFp bklucHV0OnRydWUsc2hvd0J1dHRvblBhbmVsOmZhbHNlfTskLmV4dGVuZCh0aGlz Ll9kZWZhdWx0cyx0aGlzLnJlZ2lvbmFsWycnXSk7dGhpcy5kcERpdj0kKCc8ZGl2 IGlkPSInK3RoaXMuX21haW5EaXZJZCsnIiBjbGFzcz0idWktZGF0ZXBpY2tlciB1 aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IHVp LWNvcm5lci1hbGwgdWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIj48L2Rpdj4n KTt9CiQuZXh0ZW5kKERhdGVwaWNrZXIucHJvdG90eXBlLHttYXJrZXJDbGFzc05h bWU6J2hhc0RhdGVwaWNrZXInLGxvZzpmdW5jdGlvbigpe2lmKHRoaXMuZGVidWcp CmNvbnNvbGUubG9nLmFwcGx5KCcnLGFyZ3VtZW50cyk7fSxzZXREZWZhdWx0czpm dW5jdGlvbihzZXR0aW5ncyl7ZXh0ZW5kUmVtb3ZlKHRoaXMuX2RlZmF1bHRzLHNl dHRpbmdzfHx7fSk7cmV0dXJuIHRoaXM7fSxfYXR0YWNoRGF0ZXBpY2tlcjpmdW5j dGlvbih0YXJnZXQsc2V0dGluZ3Mpe3ZhciBpbmxpbmVTZXR0aW5ncz1udWxsO2Zv cih2YXIgYXR0ck5hbWUgaW4gdGhpcy5fZGVmYXVsdHMpe3ZhciBhdHRyVmFsdWU9 dGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0ZTonK2F0dHJOYW1lKTtpZihhdHRyVmFs dWUpe2lubGluZVNldHRpbmdzPWlubGluZVNldHRpbmdzfHx7fTt0cnl7aW5saW5l U2V0dGluZ3NbYXR0ck5hbWVdPWV2YWwoYXR0clZhbHVlKTt9Y2F0Y2goZXJyKXtp bmxpbmVTZXR0aW5nc1thdHRyTmFtZV09YXR0clZhbHVlO319fQp2YXIgbm9kZU5h bWU9dGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7dmFyIGlubGluZT0obm9k ZU5hbWU9PSdkaXYnfHxub2RlTmFtZT09J3NwYW4nKTtpZighdGFyZ2V0LmlkKQp0 YXJnZXQuaWQ9J2RwJysoKyt0aGlzLnV1aWQpO3ZhciBpbnN0PXRoaXMuX25ld0lu c3QoJCh0YXJnZXQpLGlubGluZSk7aW5zdC5zZXR0aW5ncz0kLmV4dGVuZCh7fSxz ZXR0aW5nc3x8e30saW5saW5lU2V0dGluZ3N8fHt9KTtpZihub2RlTmFtZT09J2lu cHV0Jyl7dGhpcy5fY29ubmVjdERhdGVwaWNrZXIodGFyZ2V0LGluc3QpO31lbHNl IGlmKGlubGluZSl7dGhpcy5faW5saW5lRGF0ZXBpY2tlcih0YXJnZXQsaW5zdCk7 fX0sX25ld0luc3Q6ZnVuY3Rpb24odGFyZ2V0LGlubGluZSl7dmFyIGlkPXRhcmdl dFswXS5pZC5yZXBsYWNlKC8oWzpcW1xdXC5dKS9nLCdcXFxcJDEnKTtyZXR1cm57 aWQ6aWQsaW5wdXQ6dGFyZ2V0LHNlbGVjdGVkRGF5OjAsc2VsZWN0ZWRNb250aDow LHNlbGVjdGVkWWVhcjowLGRyYXdNb250aDowLGRyYXdZZWFyOjAsaW5saW5lOmlu bGluZSxkcERpdjooIWlubGluZT90aGlzLmRwRGl2OiQoJzxkaXYgY2xhc3M9Iicr dGhpcy5faW5saW5lQ2xhc3MrJyB1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13 aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCI+ PC9kaXY+JykpfTt9LF9jb25uZWN0RGF0ZXBpY2tlcjpmdW5jdGlvbih0YXJnZXQs aW5zdCl7dmFyIGlucHV0PSQodGFyZ2V0KTtpbnN0LmFwcGVuZD0kKFtdKTtpbnN0 LnRyaWdnZXI9JChbXSk7aWYoaW5wdXQuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFz c05hbWUpKQpyZXR1cm47dmFyIGFwcGVuZFRleHQ9dGhpcy5fZ2V0KGluc3QsJ2Fw cGVuZFRleHQnKTt2YXIgaXNSVEw9dGhpcy5fZ2V0KGluc3QsJ2lzUlRMJyk7aWYo YXBwZW5kVGV4dCl7aW5zdC5hcHBlbmQ9JCgnPHNwYW4gY2xhc3M9IicrdGhpcy5f YXBwZW5kQ2xhc3MrJyI+JythcHBlbmRUZXh0Kyc8L3NwYW4+Jyk7aW5wdXRbaXNS VEw/J2JlZm9yZSc6J2FmdGVyJ10oaW5zdC5hcHBlbmQpO30KdmFyIHNob3dPbj10 aGlzLl9nZXQoaW5zdCwnc2hvd09uJyk7aWYoc2hvd09uPT0nZm9jdXMnfHxzaG93 T249PSdib3RoJykKaW5wdXQuZm9jdXModGhpcy5fc2hvd0RhdGVwaWNrZXIpO2lm KHNob3dPbj09J2J1dHRvbid8fHNob3dPbj09J2JvdGgnKXt2YXIgYnV0dG9uVGV4 dD10aGlzLl9nZXQoaW5zdCwnYnV0dG9uVGV4dCcpO3ZhciBidXR0b25JbWFnZT10 aGlzLl9nZXQoaW5zdCwnYnV0dG9uSW1hZ2UnKTtpbnN0LnRyaWdnZXI9JCh0aGlz Ll9nZXQoaW5zdCwnYnV0dG9uSW1hZ2VPbmx5Jyk/JCgnPGltZy8+JykuYWRkQ2xh c3ModGhpcy5fdHJpZ2dlckNsYXNzKS5hdHRyKHtzcmM6YnV0dG9uSW1hZ2UsYWx0 OmJ1dHRvblRleHQsdGl0bGU6YnV0dG9uVGV4dH0pOiQoJzxidXR0b24gdHlwZT0i YnV0dG9uIj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3Mp Lmh0bWwoYnV0dG9uSW1hZ2U9PScnP2J1dHRvblRleHQ6JCgnPGltZy8+JykuYXR0 cih7c3JjOmJ1dHRvbkltYWdlLGFsdDpidXR0b25UZXh0LHRpdGxlOmJ1dHRvblRl eHR9KSkpO2lucHV0W2lzUlRMPydiZWZvcmUnOidhZnRlciddKGluc3QudHJpZ2dl cik7aW5zdC50cmlnZ2VyLmNsaWNrKGZ1bmN0aW9uKCl7aWYoJC5kYXRlcGlja2Vy Ll9kYXRlcGlja2VyU2hvd2luZyYmJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQ9PXRh cmdldCkKJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO2Vsc2UKJC5kYXRl cGlja2VyLl9zaG93RGF0ZXBpY2tlcih0YXJnZXQpO3JldHVybiBmYWxzZTt9KTt9 CmlucHV0LmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5rZXlkb3duKHRo aXMuX2RvS2V5RG93bikua2V5cHJlc3ModGhpcy5fZG9LZXlQcmVzcykuYmluZCgi c2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihldmVudCxrZXksdmFsdWUpe2lu c3Quc2V0dGluZ3Nba2V5XT12YWx1ZTt9KS5iaW5kKCJnZXREYXRhLmRhdGVwaWNr ZXIiLGZ1bmN0aW9uKGV2ZW50LGtleSl7cmV0dXJuIHRoaXMuX2dldChpbnN0LGtl eSk7fSk7JC5kYXRhKHRhcmdldCxQUk9QX05BTUUsaW5zdCk7fSxfaW5saW5lRGF0 ZXBpY2tlcjpmdW5jdGlvbih0YXJnZXQsaW5zdCl7dmFyIGRpdlNwYW49JCh0YXJn ZXQpO2lmKGRpdlNwYW4uaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKQpy ZXR1cm47ZGl2U3Bhbi5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuYXBw ZW5kKGluc3QuZHBEaXYpLmJpbmQoInNldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rp b24oZXZlbnQsa2V5LHZhbHVlKXtpbnN0LnNldHRpbmdzW2tleV09dmFsdWU7fSku YmluZCgiZ2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihldmVudCxrZXkpe3Jl dHVybiB0aGlzLl9nZXQoaW5zdCxrZXkpO30pOyQuZGF0YSh0YXJnZXQsUFJPUF9O QU1FLGluc3QpO3RoaXMuX3NldERhdGUoaW5zdCx0aGlzLl9nZXREZWZhdWx0RGF0 ZShpbnN0KSk7dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTt0aGlzLl91cGRh dGVBbHRlcm5hdGUoaW5zdCk7fSxfZGlhbG9nRGF0ZXBpY2tlcjpmdW5jdGlvbihp bnB1dCxkYXRlVGV4dCxvblNlbGVjdCxzZXR0aW5ncyxwb3Mpe3ZhciBpbnN0PXRo aXMuX2RpYWxvZ0luc3Q7aWYoIWluc3Qpe3ZhciBpZD0nZHAnKygrK3RoaXMudXVp ZCk7dGhpcy5fZGlhbG9nSW5wdXQ9JCgnPGlucHV0IHR5cGU9InRleHQiIGlkPSIn K2lkKyciIHNpemU9IjEiIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDog LTEwMHB4OyIvPicpO3RoaXMuX2RpYWxvZ0lucHV0LmtleWRvd24odGhpcy5fZG9L ZXlEb3duKTskKCdib2R5JykuYXBwZW5kKHRoaXMuX2RpYWxvZ0lucHV0KTtpbnN0 PXRoaXMuX2RpYWxvZ0luc3Q9dGhpcy5fbmV3SW5zdCh0aGlzLl9kaWFsb2dJbnB1 dCxmYWxzZSk7aW5zdC5zZXR0aW5ncz17fTskLmRhdGEodGhpcy5fZGlhbG9nSW5w dXRbMF0sUFJPUF9OQU1FLGluc3QpO30KZXh0ZW5kUmVtb3ZlKGluc3Quc2V0dGlu Z3Msc2V0dGluZ3N8fHt9KTt0aGlzLl9kaWFsb2dJbnB1dC52YWwoZGF0ZVRleHQp O3RoaXMuX3Bvcz0ocG9zPyhwb3MubGVuZ3RoP3BvczpbcG9zLnBhZ2VYLHBvcy5w YWdlWV0pOm51bGwpO2lmKCF0aGlzLl9wb3Mpe3ZhciBicm93c2VyV2lkdGg9d2lu ZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRX aWR0aHx8ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDt2YXIgYnJvd3NlckhlaWdo dD13aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5j bGllbnRIZWlnaHR8fGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O3ZhciBzY3Jv bGxYPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0fHxkb2N1bWVu dC5ib2R5LnNjcm9sbExlZnQ7dmFyIHNjcm9sbFk9ZG9jdW1lbnQuZG9jdW1lbnRF bGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7dGhpcy5f cG9zPVsoYnJvd3NlcldpZHRoLzIpLTEwMCtzY3JvbGxYLChicm93c2VySGVpZ2h0 LzIpLTE1MCtzY3JvbGxZXTt9CnRoaXMuX2RpYWxvZ0lucHV0LmNzcygnbGVmdCcs dGhpcy5fcG9zWzBdKydweCcpLmNzcygndG9wJyx0aGlzLl9wb3NbMV0rJ3B4Jyk7 aW5zdC5zZXR0aW5ncy5vblNlbGVjdD1vblNlbGVjdDt0aGlzLl9pbkRpYWxvZz10 cnVlO3RoaXMuZHBEaXYuYWRkQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpO3RoaXMu X3Nob3dEYXRlcGlja2VyKHRoaXMuX2RpYWxvZ0lucHV0WzBdKTtpZigkLmJsb2Nr VUkpCiQuYmxvY2tVSSh0aGlzLmRwRGl2KTskLmRhdGEodGhpcy5fZGlhbG9nSW5w dXRbMF0sUFJPUF9OQU1FLGluc3QpO3JldHVybiB0aGlzO30sX2Rlc3Ryb3lEYXRl cGlja2VyOmZ1bmN0aW9uKHRhcmdldCl7dmFyICR0YXJnZXQ9JCh0YXJnZXQpO3Zh ciBpbnN0PSQuZGF0YSh0YXJnZXQsUFJPUF9OQU1FKTtpZighJHRhcmdldC5oYXND bGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpe3JldHVybjt9CnZhciBub2RlTmFt ZT10YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTskLnJlbW92ZURhdGEodGFy Z2V0LFBST1BfTkFNRSk7aWYobm9kZU5hbWU9PSdpbnB1dCcpe2luc3QuYXBwZW5k LnJlbW92ZSgpO2luc3QudHJpZ2dlci5yZW1vdmUoKTskdGFyZ2V0LnJlbW92ZUNs YXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS51bmJpbmQoJ2ZvY3VzJyx0aGlzLl9z aG93RGF0ZXBpY2tlcikudW5iaW5kKCdrZXlkb3duJyx0aGlzLl9kb0tleURvd24p LnVuYmluZCgna2V5cHJlc3MnLHRoaXMuX2RvS2V5UHJlc3MpO31lbHNlIGlmKG5v ZGVOYW1lPT0nZGl2J3x8bm9kZU5hbWU9PSdzcGFuJykKJHRhcmdldC5yZW1vdmVD bGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuZW1wdHkoKTt9LF9lbmFibGVEYXRl cGlja2VyOmZ1bmN0aW9uKHRhcmdldCl7dmFyICR0YXJnZXQ9JCh0YXJnZXQpO3Zh ciBpbnN0PSQuZGF0YSh0YXJnZXQsUFJPUF9OQU1FKTtpZighJHRhcmdldC5oYXND bGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpe3JldHVybjt9CnZhciBub2RlTmFt ZT10YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihub2RlTmFtZT09J2lu cHV0Jyl7dGFyZ2V0LmRpc2FibGVkPWZhbHNlO2luc3QudHJpZ2dlci5maWx0ZXIo J2J1dHRvbicpLmVhY2goZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkPWZhbHNlO30p LmVuZCgpLmZpbHRlcignaW1nJykuY3NzKHtvcGFjaXR5OicxLjAnLGN1cnNvcjon J30pO30KZWxzZSBpZihub2RlTmFtZT09J2Rpdid8fG5vZGVOYW1lPT0nc3Bhbicp e3ZhciBpbmxpbmU9JHRhcmdldC5jaGlsZHJlbignLicrdGhpcy5faW5saW5lQ2xh c3MpO2lubGluZS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1kaXNh YmxlZCcpO30KdGhpcy5fZGlzYWJsZWRJbnB1dHM9JC5tYXAodGhpcy5fZGlzYWJs ZWRJbnB1dHMsZnVuY3Rpb24odmFsdWUpe3JldHVybih2YWx1ZT09dGFyZ2V0P251 bGw6dmFsdWUpO30pO30sX2Rpc2FibGVEYXRlcGlja2VyOmZ1bmN0aW9uKHRhcmdl dCl7dmFyICR0YXJnZXQ9JCh0YXJnZXQpO3ZhciBpbnN0PSQuZGF0YSh0YXJnZXQs UFJPUF9OQU1FKTtpZighJHRhcmdldC5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNz TmFtZSkpe3JldHVybjt9CnZhciBub2RlTmFtZT10YXJnZXQubm9kZU5hbWUudG9M b3dlckNhc2UoKTtpZihub2RlTmFtZT09J2lucHV0Jyl7dGFyZ2V0LmRpc2FibGVk PXRydWU7aW5zdC50cmlnZ2VyLmZpbHRlcignYnV0dG9uJykuZWFjaChmdW5jdGlv bigpe3RoaXMuZGlzYWJsZWQ9dHJ1ZTt9KS5lbmQoKS5maWx0ZXIoJ2ltZycpLmNz cyh7b3BhY2l0eTonMC41JyxjdXJzb3I6J2RlZmF1bHQnfSk7fQplbHNlIGlmKG5v ZGVOYW1lPT0nZGl2J3x8bm9kZU5hbWU9PSdzcGFuJyl7dmFyIGlubGluZT0kdGFy Z2V0LmNoaWxkcmVuKCcuJyt0aGlzLl9pbmxpbmVDbGFzcyk7aW5saW5lLmNoaWxk cmVuKCkuYWRkQ2xhc3MoJ3VpLXN0YXRlLWRpc2FibGVkJyk7fQp0aGlzLl9kaXNh YmxlZElucHV0cz0kLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxmdW5jdGlvbih2 YWx1ZSl7cmV0dXJuKHZhbHVlPT10YXJnZXQ/bnVsbDp2YWx1ZSk7fSk7dGhpcy5f ZGlzYWJsZWRJbnB1dHNbdGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoXT10YXJn ZXQ7fSxfaXNEaXNhYmxlZERhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0KXtpZigh dGFyZ2V0KXtyZXR1cm4gZmFsc2U7fQpmb3IodmFyIGk9MDtpPHRoaXMuX2Rpc2Fi bGVkSW5wdXRzLmxlbmd0aDtpKyspe2lmKHRoaXMuX2Rpc2FibGVkSW5wdXRzW2ld PT10YXJnZXQpCnJldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO30sX2dldEluc3Q6 ZnVuY3Rpb24odGFyZ2V0KXt0cnl7cmV0dXJuICQuZGF0YSh0YXJnZXQsUFJPUF9O QU1FKTt9CmNhdGNoKGVycil7dGhyb3cnTWlzc2luZyBpbnN0YW5jZSBkYXRhIGZv ciB0aGlzIGRhdGVwaWNrZXInO319LF9vcHRpb25EYXRlcGlja2VyOmZ1bmN0aW9u KHRhcmdldCxuYW1lLHZhbHVlKXt2YXIgaW5zdD10aGlzLl9nZXRJbnN0KHRhcmdl dCk7aWYoYXJndW1lbnRzLmxlbmd0aD09MiYmdHlwZW9mIG5hbWU9PSdzdHJpbmcn KXtyZXR1cm4obmFtZT09J2RlZmF1bHRzJz8kLmV4dGVuZCh7fSwkLmRhdGVwaWNr ZXIuX2RlZmF1bHRzKTooaW5zdD8obmFtZT09J2FsbCc/JC5leHRlbmQoe30saW5z dC5zZXR0aW5ncyk6dGhpcy5fZ2V0KGluc3QsbmFtZSkpOm51bGwpKTt9CnZhciBz ZXR0aW5ncz1uYW1lfHx7fTtpZih0eXBlb2YgbmFtZT09J3N0cmluZycpe3NldHRp bmdzPXt9O3NldHRpbmdzW25hbWVdPXZhbHVlO30KaWYoaW5zdCl7aWYodGhpcy5f Y3VySW5zdD09aW5zdCl7dGhpcy5faGlkZURhdGVwaWNrZXIobnVsbCk7fQp2YXIg ZGF0ZT10aGlzLl9nZXREYXRlRGF0ZXBpY2tlcih0YXJnZXQpO2V4dGVuZFJlbW92 ZShpbnN0LnNldHRpbmdzLHNldHRpbmdzKTt0aGlzLl9zZXREYXRlRGF0ZXBpY2tl cih0YXJnZXQsZGF0ZSk7dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTt9fSxf Y2hhbmdlRGF0ZXBpY2tlcjpmdW5jdGlvbih0YXJnZXQsbmFtZSx2YWx1ZSl7dGhp cy5fb3B0aW9uRGF0ZXBpY2tlcih0YXJnZXQsbmFtZSx2YWx1ZSk7fSxfcmVmcmVz aERhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0KXt2YXIgaW5zdD10aGlzLl9nZXRJ bnN0KHRhcmdldCk7aWYoaW5zdCl7dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0 KTt9fSxfc2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0LGRhdGUsZW5k RGF0ZSl7dmFyIGluc3Q9dGhpcy5fZ2V0SW5zdCh0YXJnZXQpO2lmKGluc3Qpe3Ro aXMuX3NldERhdGUoaW5zdCxkYXRlLGVuZERhdGUpO3RoaXMuX3VwZGF0ZURhdGVw aWNrZXIoaW5zdCk7dGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGluc3QpO319LF9nZXRE YXRlRGF0ZXBpY2tlcjpmdW5jdGlvbih0YXJnZXQpe3ZhciBpbnN0PXRoaXMuX2dl dEluc3QodGFyZ2V0KTtpZihpbnN0JiYhaW5zdC5pbmxpbmUpCnRoaXMuX3NldERh dGVGcm9tRmllbGQoaW5zdCk7cmV0dXJuKGluc3Q/dGhpcy5fZ2V0RGF0ZShpbnN0 KTpudWxsKTt9LF9kb0tleURvd246ZnVuY3Rpb24oZXZlbnQpe3ZhciBpbnN0PSQu ZGF0ZXBpY2tlci5fZ2V0SW5zdChldmVudC50YXJnZXQpO3ZhciBoYW5kbGVkPXRy dWU7dmFyIGlzUlRMPWluc3QuZHBEaXYuaXMoJy51aS1kYXRlcGlja2VyLXJ0bCcp O2luc3QuX2tleUV2ZW50PXRydWU7aWYoJC5kYXRlcGlja2VyLl9kYXRlcGlja2Vy U2hvd2luZykKc3dpdGNoKGV2ZW50LmtleUNvZGUpe2Nhc2UgOTokLmRhdGVwaWNr ZXIuX2hpZGVEYXRlcGlja2VyKG51bGwsJycpO2JyZWFrO2Nhc2UgMTM6dmFyIHNl bD0kKCd0ZC4nKyQuZGF0ZXBpY2tlci5fZGF5T3ZlckNsYXNzKycsIHRkLicrJC5k YXRlcGlja2VyLl9jdXJyZW50Q2xhc3MsaW5zdC5kcERpdik7aWYoc2VsWzBdKQok LmRhdGVwaWNrZXIuX3NlbGVjdERheShldmVudC50YXJnZXQsaW5zdC5zZWxlY3Rl ZE1vbnRoLGluc3Quc2VsZWN0ZWRZZWFyLHNlbFswXSk7ZWxzZQokLmRhdGVwaWNr ZXIuX2hpZGVEYXRlcGlja2VyKG51bGwsJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwn ZHVyYXRpb24nKSk7cmV0dXJuIGZhbHNlO2JyZWFrO2Nhc2UgMjc6JC5kYXRlcGlj a2VyLl9oaWRlRGF0ZXBpY2tlcihudWxsLCQuZGF0ZXBpY2tlci5fZ2V0KGluc3Qs J2R1cmF0aW9uJykpO2JyZWFrO2Nhc2UgMzM6JC5kYXRlcGlja2VyLl9hZGp1c3RE YXRlKGV2ZW50LnRhcmdldCwoZXZlbnQuY3RybEtleT8tJC5kYXRlcGlja2VyLl9n ZXQoaW5zdCwnc3RlcEJpZ01vbnRocycpOi0kLmRhdGVwaWNrZXIuX2dldChpbnN0 LCdzdGVwTW9udGhzJykpLCdNJyk7YnJlYWs7Y2FzZSAzNDokLmRhdGVwaWNrZXIu X2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LChldmVudC5jdHJsS2V5PyskLmRhdGVw aWNrZXIuX2dldChpbnN0LCdzdGVwQmlnTW9udGhzJyk6KyQuZGF0ZXBpY2tlci5f Z2V0KGluc3QsJ3N0ZXBNb250aHMnKSksJ00nKTticmVhaztjYXNlIDM1OmlmKGV2 ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXkpJC5kYXRlcGlja2VyLl9jbGVhckRh dGUoZXZlbnQudGFyZ2V0KTtoYW5kbGVkPWV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1l dGFLZXk7YnJlYWs7Y2FzZSAzNjppZihldmVudC5jdHJsS2V5fHxldmVudC5tZXRh S2V5KSQuZGF0ZXBpY2tlci5fZ290b1RvZGF5KGV2ZW50LnRhcmdldCk7aGFuZGxl ZD1ldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5O2JyZWFrO2Nhc2UgMzc6aWYo ZXZlbnQuY3RybEtleXx8ZXZlbnQubWV0YUtleSkkLmRhdGVwaWNrZXIuX2FkanVz dERhdGUoZXZlbnQudGFyZ2V0LChpc1JUTD8rMTotMSksJ0QnKTtoYW5kbGVkPWV2 ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXk7aWYoZXZlbnQub3JpZ2luYWxFdmVu dC5hbHRLZXkpJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwo ZXZlbnQuY3RybEtleT8tJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwnc3RlcEJpZ01v bnRocycpOi0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCdzdGVwTW9udGhzJykpLCdN Jyk7YnJlYWs7Y2FzZSAzODppZihldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5 KSQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsLTcsJ0QnKTto YW5kbGVkPWV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXk7YnJlYWs7Y2FzZSAz OTppZihldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5KSQuZGF0ZXBpY2tlci5f YWRqdXN0RGF0ZShldmVudC50YXJnZXQsKGlzUlRMPy0xOisxKSwnRCcpO2hhbmRs ZWQ9ZXZlbnQuY3RybEtleXx8ZXZlbnQubWV0YUtleTtpZihldmVudC5vcmlnaW5h bEV2ZW50LmFsdEtleSkkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFy Z2V0LChldmVudC5jdHJsS2V5PyskLmRhdGVwaWNrZXIuX2dldChpbnN0LCdzdGVw QmlnTW9udGhzJyk6KyQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsJ3N0ZXBNb250aHMn KSksJ00nKTticmVhaztjYXNlIDQwOmlmKGV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1l dGFLZXkpJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwrNywn RCcpO2hhbmRsZWQ9ZXZlbnQuY3RybEtleXx8ZXZlbnQubWV0YUtleTticmVhaztk ZWZhdWx0OmhhbmRsZWQ9ZmFsc2U7fQplbHNlIGlmKGV2ZW50LmtleUNvZGU9PTM2 JiZldmVudC5jdHJsS2V5KQokLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKHRo aXMpO2Vsc2V7aGFuZGxlZD1mYWxzZTt9CmlmKGhhbmRsZWQpe2V2ZW50LnByZXZl bnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7fX0sX2RvS2V5UHJl c3M6ZnVuY3Rpb24oZXZlbnQpe3ZhciBpbnN0PSQuZGF0ZXBpY2tlci5fZ2V0SW5z dChldmVudC50YXJnZXQpO2lmKCQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsJ2NvbnN0 cmFpbklucHV0Jykpe3ZhciBjaGFycz0kLmRhdGVwaWNrZXIuX3Bvc3NpYmxlQ2hh cnMoJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwnZGF0ZUZvcm1hdCcpKTt2YXIgY2hy PVN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGU9PXVuZGVmaW5lZD9l dmVudC5rZXlDb2RlOmV2ZW50LmNoYXJDb2RlKTtyZXR1cm4gZXZlbnQuY3RybEtl eXx8KGNocjwnICd8fCFjaGFyc3x8Y2hhcnMuaW5kZXhPZihjaHIpPi0xKTt9fSxf c2hvd0RhdGVwaWNrZXI6ZnVuY3Rpb24oaW5wdXQpe2lucHV0PWlucHV0LnRhcmdl dHx8aW5wdXQ7aWYoaW5wdXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9J2lucHV0 JykKaW5wdXQ9JCgnaW5wdXQnLGlucHV0LnBhcmVudE5vZGUpWzBdO2lmKCQuZGF0 ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIoaW5wdXQpfHwkLmRhdGVwaWNr ZXIuX2xhc3RJbnB1dD09aW5wdXQpCnJldHVybjt2YXIgaW5zdD0kLmRhdGVwaWNr ZXIuX2dldEluc3QoaW5wdXQpO3ZhciBiZWZvcmVTaG93PSQuZGF0ZXBpY2tlci5f Z2V0KGluc3QsJ2JlZm9yZVNob3cnKTtleHRlbmRSZW1vdmUoaW5zdC5zZXR0aW5n cywoYmVmb3JlU2hvdz9iZWZvcmVTaG93LmFwcGx5KGlucHV0LFtpbnB1dCxpbnN0 XSk6e30pKTskLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKG51bGwsJycpOyQu ZGF0ZXBpY2tlci5fbGFzdElucHV0PWlucHV0OyQuZGF0ZXBpY2tlci5fc2V0RGF0 ZUZyb21GaWVsZChpbnN0KTtpZigkLmRhdGVwaWNrZXIuX2luRGlhbG9nKQppbnB1 dC52YWx1ZT0nJztpZighJC5kYXRlcGlja2VyLl9wb3MpeyQuZGF0ZXBpY2tlci5f cG9zPSQuZGF0ZXBpY2tlci5fZmluZFBvcyhpbnB1dCk7JC5kYXRlcGlja2VyLl9w b3NbMV0rPWlucHV0Lm9mZnNldEhlaWdodDt9CnZhciBpc0ZpeGVkPWZhbHNlOyQo aW5wdXQpLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7aXNGaXhlZHw9JCh0aGlz KS5jc3MoJ3Bvc2l0aW9uJyk9PSdmaXhlZCc7cmV0dXJuIWlzRml4ZWQ7fSk7aWYo aXNGaXhlZCYmJC5icm93c2VyLm9wZXJhKXskLmRhdGVwaWNrZXIuX3Bvc1swXS09 ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7JC5kYXRlcGlja2Vy Ll9wb3NbMV0tPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7fQp2 YXIgb2Zmc2V0PXtsZWZ0OiQuZGF0ZXBpY2tlci5fcG9zWzBdLHRvcDokLmRhdGVw aWNrZXIuX3Bvc1sxXX07JC5kYXRlcGlja2VyLl9wb3M9bnVsbDtpbnN0LnJhbmdl U3RhcnQ9bnVsbDtpbnN0LmRwRGl2LmNzcyh7cG9zaXRpb246J2Fic29sdXRlJyxk aXNwbGF5OidibG9jaycsdG9wOictMTAwMHB4J30pOyQuZGF0ZXBpY2tlci5fdXBk YXRlRGF0ZXBpY2tlcihpbnN0KTtvZmZzZXQ9JC5kYXRlcGlja2VyLl9jaGVja09m ZnNldChpbnN0LG9mZnNldCxpc0ZpeGVkKTtpbnN0LmRwRGl2LmNzcyh7cG9zaXRp b246KCQuZGF0ZXBpY2tlci5faW5EaWFsb2cmJiQuYmxvY2tVST8nc3RhdGljJzoo aXNGaXhlZD8nZml4ZWQnOidhYnNvbHV0ZScpKSxkaXNwbGF5Oidub25lJyxsZWZ0 Om9mZnNldC5sZWZ0KydweCcsdG9wOm9mZnNldC50b3ArJ3B4J30pO2lmKCFpbnN0 LmlubGluZSl7dmFyIHNob3dBbmltPSQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsJ3No b3dBbmltJyl8fCdzaG93Jzt2YXIgZHVyYXRpb249JC5kYXRlcGlja2VyLl9nZXQo aW5zdCwnZHVyYXRpb24nKTt2YXIgcG9zdFByb2Nlc3M9ZnVuY3Rpb24oKXskLmRh dGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nPXRydWU7aWYoJC5icm93c2VyLm1z aWUmJnBhcnNlSW50KCQuYnJvd3Nlci52ZXJzaW9uLDEwKTw3KQokKCdpZnJhbWUu dWktZGF0ZXBpY2tlci1jb3ZlcicpLmNzcyh7d2lkdGg6aW5zdC5kcERpdi53aWR0 aCgpKzQsaGVpZ2h0Omluc3QuZHBEaXYuaGVpZ2h0KCkrNH0pO307aWYoJC5lZmZl Y3RzJiYkLmVmZmVjdHNbc2hvd0FuaW1dKQppbnN0LmRwRGl2LnNob3coc2hvd0Fu aW0sJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwnc2hvd09wdGlvbnMnKSxkdXJhdGlv bixwb3N0UHJvY2Vzcyk7ZWxzZQppbnN0LmRwRGl2W3Nob3dBbmltXShkdXJhdGlv bixwb3N0UHJvY2Vzcyk7aWYoZHVyYXRpb249PScnKQpwb3N0UHJvY2VzcygpO2lm KGluc3QuaW5wdXRbMF0udHlwZSE9J2hpZGRlbicpCmluc3QuaW5wdXRbMF0uZm9j dXMoKTskLmRhdGVwaWNrZXIuX2N1ckluc3Q9aW5zdDt9fSxfdXBkYXRlRGF0ZXBp Y2tlcjpmdW5jdGlvbihpbnN0KXt2YXIgZGltcz17d2lkdGg6aW5zdC5kcERpdi53 aWR0aCgpKzQsaGVpZ2h0Omluc3QuZHBEaXYuaGVpZ2h0KCkrNH07dmFyIHNlbGY9 dGhpcztpbnN0LmRwRGl2LmVtcHR5KCkuYXBwZW5kKHRoaXMuX2dlbmVyYXRlSFRN TChpbnN0KSkuZmluZCgnaWZyYW1lLnVpLWRhdGVwaWNrZXItY292ZXInKS5jc3Mo e3dpZHRoOmRpbXMud2lkdGgsaGVpZ2h0OmRpbXMuaGVpZ2h0fSkuZW5kKCkuZmlu ZCgnYnV0dG9uLCAudWktZGF0ZXBpY2tlci1wcmV2LCAudWktZGF0ZXBpY2tlci1u ZXh0LCAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBhJykuYmluZCgnbW91c2Vv dXQnLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygndWktc3RhdGUtaG92 ZXInKTtpZih0aGlzLmNsYXNzTmFtZS5pbmRleE9mKCd1aS1kYXRlcGlja2VyLXBy ZXYnKSE9LTEpJCh0aGlzKS5yZW1vdmVDbGFzcygndWktZGF0ZXBpY2tlci1wcmV2 LWhvdmVyJyk7aWYodGhpcy5jbGFzc05hbWUuaW5kZXhPZigndWktZGF0ZXBpY2tl ci1uZXh0JykhPS0xKSQodGhpcykucmVtb3ZlQ2xhc3MoJ3VpLWRhdGVwaWNrZXIt bmV4dC1ob3ZlcicpO30pLmJpbmQoJ21vdXNlb3ZlcicsZnVuY3Rpb24oKXtpZigh c2VsZi5faXNEaXNhYmxlZERhdGVwaWNrZXIoaW5zdC5pbmxpbmU/aW5zdC5kcERp di5wYXJlbnQoKVswXTppbnN0LmlucHV0WzBdKSl7JCh0aGlzKS5wYXJlbnRzKCcu dWktZGF0ZXBpY2tlci1jYWxlbmRhcicpLmZpbmQoJ2EnKS5yZW1vdmVDbGFzcygn dWktc3RhdGUtaG92ZXInKTskKHRoaXMpLmFkZENsYXNzKCd1aS1zdGF0ZS1ob3Zl cicpO2lmKHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoJ3VpLWRhdGVwaWNrZXItcHJl dicpIT0tMSkkKHRoaXMpLmFkZENsYXNzKCd1aS1kYXRlcGlja2VyLXByZXYtaG92 ZXInKTtpZih0aGlzLmNsYXNzTmFtZS5pbmRleE9mKCd1aS1kYXRlcGlja2VyLW5l eHQnKSE9LTEpJCh0aGlzKS5hZGRDbGFzcygndWktZGF0ZXBpY2tlci1uZXh0LWhv dmVyJyk7fX0pLmVuZCgpLmZpbmQoJy4nK3RoaXMuX2RheU92ZXJDbGFzcysnIGEn KS50cmlnZ2VyKCdtb3VzZW92ZXInKS5lbmQoKTt2YXIgbnVtTW9udGhzPXRoaXMu X2dldE51bWJlck9mTW9udGhzKGluc3QpO3ZhciBjb2xzPW51bU1vbnRoc1sxXTt2 YXIgd2lkdGg9MTc7aWYoY29scz4xKXtpbnN0LmRwRGl2LmFkZENsYXNzKCd1aS1k YXRlcGlja2VyLW11bHRpLScrY29scykuY3NzKCd3aWR0aCcsKHdpZHRoKmNvbHMp KydlbScpO31lbHNle2luc3QuZHBEaXYucmVtb3ZlQ2xhc3MoJ3VpLWRhdGVwaWNr ZXItbXVsdGktMiB1aS1kYXRlcGlja2VyLW11bHRpLTMgdWktZGF0ZXBpY2tlci1t dWx0aS00Jykud2lkdGgoJycpO30KaW5zdC5kcERpdlsobnVtTW9udGhzWzBdIT0x fHxudW1Nb250aHNbMV0hPTE/J2FkZCc6J3JlbW92ZScpKydDbGFzcyddKCd1aS1k YXRlcGlja2VyLW11bHRpJyk7aW5zdC5kcERpdlsodGhpcy5fZ2V0KGluc3QsJ2lz UlRMJyk/J2FkZCc6J3JlbW92ZScpKydDbGFzcyddKCd1aS1kYXRlcGlja2VyLXJ0 bCcpO2lmKGluc3QuaW5wdXQmJmluc3QuaW5wdXRbMF0udHlwZSE9J2hpZGRlbicm Jmluc3Q9PSQuZGF0ZXBpY2tlci5fY3VySW5zdCkKJChpbnN0LmlucHV0WzBdKS5m b2N1cygpO30sX2NoZWNrT2Zmc2V0OmZ1bmN0aW9uKGluc3Qsb2Zmc2V0LGlzRml4 ZWQpe3ZhciBkcFdpZHRoPWluc3QuZHBEaXYub3V0ZXJXaWR0aCgpO3ZhciBkcEhl aWdodD1pbnN0LmRwRGl2Lm91dGVySGVpZ2h0KCk7dmFyIGlucHV0V2lkdGg9aW5z dC5pbnB1dD9pbnN0LmlucHV0Lm91dGVyV2lkdGgoKTowO3ZhciBpbnB1dEhlaWdo dD1pbnN0LmlucHV0P2luc3QuaW5wdXQub3V0ZXJIZWlnaHQoKTowO3ZhciB2aWV3 V2lkdGg9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1l bnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgpKyQoZG9j dW1lbnQpLnNjcm9sbExlZnQoKTt2YXIgdmlld0hlaWdodD0od2luZG93LmlubmVy SGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fHxk b2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkrJChkb2N1bWVudCkuc2Nyb2xsVG9w KCk7b2Zmc2V0LmxlZnQtPSh0aGlzLl9nZXQoaW5zdCwnaXNSVEwnKT8oZHBXaWR0 aC1pbnB1dFdpZHRoKTowKTtvZmZzZXQubGVmdC09KGlzRml4ZWQmJm9mZnNldC5s ZWZ0PT1pbnN0LmlucHV0Lm9mZnNldCgpLmxlZnQpPyQoZG9jdW1lbnQpLnNjcm9s bExlZnQoKTowO29mZnNldC50b3AtPShpc0ZpeGVkJiZvZmZzZXQudG9wPT0oaW5z dC5pbnB1dC5vZmZzZXQoKS50b3AraW5wdXRIZWlnaHQpKT8kKGRvY3VtZW50KS5z Y3JvbGxUb3AoKTowO29mZnNldC5sZWZ0LT0ob2Zmc2V0LmxlZnQrZHBXaWR0aD52 aWV3V2lkdGgmJnZpZXdXaWR0aD5kcFdpZHRoKT9NYXRoLmFicyhvZmZzZXQubGVm dCtkcFdpZHRoLXZpZXdXaWR0aCk6MDtvZmZzZXQudG9wLT0ob2Zmc2V0LnRvcCtk cEhlaWdodD52aWV3SGVpZ2h0JiZ2aWV3SGVpZ2h0PmRwSGVpZ2h0KT9NYXRoLmFi cyhvZmZzZXQudG9wK2RwSGVpZ2h0K2lucHV0SGVpZ2h0KjItdmlld0hlaWdodCk6 MDtyZXR1cm4gb2Zmc2V0O30sX2ZpbmRQb3M6ZnVuY3Rpb24ob2JqKXt3aGlsZShv YmomJihvYmoudHlwZT09J2hpZGRlbid8fG9iai5ub2RlVHlwZSE9MSkpe29iaj1v YmoubmV4dFNpYmxpbmc7fQp2YXIgcG9zaXRpb249JChvYmopLm9mZnNldCgpO3Jl dHVybltwb3NpdGlvbi5sZWZ0LHBvc2l0aW9uLnRvcF07fSxfaGlkZURhdGVwaWNr ZXI6ZnVuY3Rpb24oaW5wdXQsZHVyYXRpb24pe3ZhciBpbnN0PXRoaXMuX2N1cklu c3Q7aWYoIWluc3R8fChpbnB1dCYmaW5zdCE9JC5kYXRhKGlucHV0LFBST1BfTkFN RSkpKQpyZXR1cm47aWYoaW5zdC5zdGF5T3BlbikKdGhpcy5fc2VsZWN0RGF0ZSgn IycraW5zdC5pZCx0aGlzLl9mb3JtYXREYXRlKGluc3QsaW5zdC5jdXJyZW50RGF5 LGluc3QuY3VycmVudE1vbnRoLGluc3QuY3VycmVudFllYXIpKTtpbnN0LnN0YXlP cGVuPWZhbHNlO2lmKHRoaXMuX2RhdGVwaWNrZXJTaG93aW5nKXtkdXJhdGlvbj0o ZHVyYXRpb24hPW51bGw/ZHVyYXRpb246dGhpcy5fZ2V0KGluc3QsJ2R1cmF0aW9u JykpO3ZhciBzaG93QW5pbT10aGlzLl9nZXQoaW5zdCwnc2hvd0FuaW0nKTt2YXIg cG9zdFByb2Nlc3M9ZnVuY3Rpb24oKXskLmRhdGVwaWNrZXIuX3RpZHlEaWFsb2co aW5zdCk7fTtpZihkdXJhdGlvbiE9JycmJiQuZWZmZWN0cyYmJC5lZmZlY3RzW3No b3dBbmltXSkKaW5zdC5kcERpdi5oaWRlKHNob3dBbmltLCQuZGF0ZXBpY2tlci5f Z2V0KGluc3QsJ3Nob3dPcHRpb25zJyksZHVyYXRpb24scG9zdFByb2Nlc3MpO2Vs c2UKaW5zdC5kcERpdlsoZHVyYXRpb249PScnPydoaWRlJzooc2hvd0FuaW09PSdz bGlkZURvd24nPydzbGlkZVVwJzooc2hvd0FuaW09PSdmYWRlSW4nPydmYWRlT3V0 JzonaGlkZScpKSldKGR1cmF0aW9uLHBvc3RQcm9jZXNzKTtpZihkdXJhdGlvbj09 JycpCnRoaXMuX3RpZHlEaWFsb2coaW5zdCk7dmFyIG9uQ2xvc2U9dGhpcy5fZ2V0 KGluc3QsJ29uQ2xvc2UnKTtpZihvbkNsb3NlKQpvbkNsb3NlLmFwcGx5KChpbnN0 LmlucHV0P2luc3QuaW5wdXRbMF06bnVsbCksWyhpbnN0LmlucHV0P2luc3QuaW5w dXQudmFsKCk6JycpLGluc3RdKTt0aGlzLl9kYXRlcGlja2VyU2hvd2luZz1mYWxz ZTt0aGlzLl9sYXN0SW5wdXQ9bnVsbDtpZih0aGlzLl9pbkRpYWxvZyl7dGhpcy5f ZGlhbG9nSW5wdXQuY3NzKHtwb3NpdGlvbjonYWJzb2x1dGUnLGxlZnQ6JzAnLHRv cDonLTEwMHB4J30pO2lmKCQuYmxvY2tVSSl7JC51bmJsb2NrVUkoKTskKCdib2R5 JykuYXBwZW5kKHRoaXMuZHBEaXYpO319CnRoaXMuX2luRGlhbG9nPWZhbHNlO30K dGhpcy5fY3VySW5zdD1udWxsO30sX3RpZHlEaWFsb2c6ZnVuY3Rpb24oaW5zdCl7 aW5zdC5kcERpdi5yZW1vdmVDbGFzcyh0aGlzLl9kaWFsb2dDbGFzcykudW5iaW5k KCcudWktZGF0ZXBpY2tlci1jYWxlbmRhcicpO30sX2NoZWNrRXh0ZXJuYWxDbGlj azpmdW5jdGlvbihldmVudCl7aWYoISQuZGF0ZXBpY2tlci5fY3VySW5zdCkKcmV0 dXJuO3ZhciAkdGFyZ2V0PSQoZXZlbnQudGFyZ2V0KTtpZigoJHRhcmdldC5wYXJl bnRzKCcjJyskLmRhdGVwaWNrZXIuX21haW5EaXZJZCkubGVuZ3RoPT0wKSYmISR0 YXJnZXQuaGFzQ2xhc3MoJC5kYXRlcGlja2VyLm1hcmtlckNsYXNzTmFtZSkmJiEk dGFyZ2V0Lmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5fdHJpZ2dlckNsYXNzKSYmJC5k YXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmISgkLmRhdGVwaWNrZXIuX2lu RGlhbG9nJiYkLmJsb2NrVUkpKQokLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2Vy KG51bGwsJycpO30sX2FkanVzdERhdGU6ZnVuY3Rpb24oaWQsb2Zmc2V0LHBlcmlv ZCl7dmFyIHRhcmdldD0kKGlkKTt2YXIgaW5zdD10aGlzLl9nZXRJbnN0KHRhcmdl dFswXSk7aWYodGhpcy5faXNEaXNhYmxlZERhdGVwaWNrZXIodGFyZ2V0WzBdKSl7 cmV0dXJuO30KdGhpcy5fYWRqdXN0SW5zdERhdGUoaW5zdCxvZmZzZXQrCihwZXJp b2Q9PSdNJz90aGlzLl9nZXQoaW5zdCwnc2hvd0N1cnJlbnRBdFBvcycpOjApLHBl cmlvZCk7dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTt9LF9nb3RvVG9kYXk6 ZnVuY3Rpb24oaWQpe3ZhciB0YXJnZXQ9JChpZCk7dmFyIGluc3Q9dGhpcy5fZ2V0 SW5zdCh0YXJnZXRbMF0pO2lmKHRoaXMuX2dldChpbnN0LCdnb3RvQ3VycmVudCcp JiZpbnN0LmN1cnJlbnREYXkpe2luc3Quc2VsZWN0ZWREYXk9aW5zdC5jdXJyZW50 RGF5O2luc3QuZHJhd01vbnRoPWluc3Quc2VsZWN0ZWRNb250aD1pbnN0LmN1cnJl bnRNb250aDtpbnN0LmRyYXdZZWFyPWluc3Quc2VsZWN0ZWRZZWFyPWluc3QuY3Vy cmVudFllYXI7fQplbHNle3ZhciBkYXRlPW5ldyBEYXRlKCk7aW5zdC5zZWxlY3Rl ZERheT1kYXRlLmdldERhdGUoKTtpbnN0LmRyYXdNb250aD1pbnN0LnNlbGVjdGVk TW9udGg9ZGF0ZS5nZXRNb250aCgpO2luc3QuZHJhd1llYXI9aW5zdC5zZWxlY3Rl ZFllYXI9ZGF0ZS5nZXRGdWxsWWVhcigpO30KdGhpcy5fbm90aWZ5Q2hhbmdlKGlu c3QpO3RoaXMuX2FkanVzdERhdGUodGFyZ2V0KTt9LF9zZWxlY3RNb250aFllYXI6 ZnVuY3Rpb24oaWQsc2VsZWN0LHBlcmlvZCl7dmFyIHRhcmdldD0kKGlkKTt2YXIg aW5zdD10aGlzLl9nZXRJbnN0KHRhcmdldFswXSk7aW5zdC5fc2VsZWN0aW5nTW9u dGhZZWFyPWZhbHNlO2luc3RbJ3NlbGVjdGVkJysocGVyaW9kPT0nTSc/J01vbnRo JzonWWVhcicpXT1pbnN0WydkcmF3JysocGVyaW9kPT0nTSc/J01vbnRoJzonWWVh cicpXT1wYXJzZUludChzZWxlY3Qub3B0aW9uc1tzZWxlY3Quc2VsZWN0ZWRJbmRl eF0udmFsdWUsMTApO3RoaXMuX25vdGlmeUNoYW5nZShpbnN0KTt0aGlzLl9hZGp1 c3REYXRlKHRhcmdldCk7fSxfY2xpY2tNb250aFllYXI6ZnVuY3Rpb24oaWQpe3Zh ciB0YXJnZXQ9JChpZCk7dmFyIGluc3Q9dGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0p O2lmKGluc3QuaW5wdXQmJmluc3QuX3NlbGVjdGluZ01vbnRoWWVhciYmISQuYnJv d3Nlci5tc2llKQppbnN0LmlucHV0WzBdLmZvY3VzKCk7aW5zdC5fc2VsZWN0aW5n TW9udGhZZWFyPSFpbnN0Ll9zZWxlY3RpbmdNb250aFllYXI7fSxfc2VsZWN0RGF5 OmZ1bmN0aW9uKGlkLG1vbnRoLHllYXIsdGQpe3ZhciB0YXJnZXQ9JChpZCk7aWYo JCh0ZCkuaGFzQ2xhc3ModGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MpfHx0aGlzLl9p c0Rpc2FibGVkRGF0ZXBpY2tlcih0YXJnZXRbMF0pKXtyZXR1cm47fQp2YXIgaW5z dD10aGlzLl9nZXRJbnN0KHRhcmdldFswXSk7aW5zdC5zZWxlY3RlZERheT1pbnN0 LmN1cnJlbnREYXk9JCgnYScsdGQpLmh0bWwoKTtpbnN0LnNlbGVjdGVkTW9udGg9 aW5zdC5jdXJyZW50TW9udGg9bW9udGg7aW5zdC5zZWxlY3RlZFllYXI9aW5zdC5j dXJyZW50WWVhcj15ZWFyO2lmKGluc3Quc3RheU9wZW4pe2luc3QuZW5kRGF5PWlu c3QuZW5kTW9udGg9aW5zdC5lbmRZZWFyPW51bGw7fQp0aGlzLl9zZWxlY3REYXRl KGlkLHRoaXMuX2Zvcm1hdERhdGUoaW5zdCxpbnN0LmN1cnJlbnREYXksaW5zdC5j dXJyZW50TW9udGgsaW5zdC5jdXJyZW50WWVhcikpO2lmKGluc3Quc3RheU9wZW4p e2luc3QucmFuZ2VTdGFydD10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcg RGF0ZShpbnN0LmN1cnJlbnRZZWFyLGluc3QuY3VycmVudE1vbnRoLGluc3QuY3Vy cmVudERheSkpO3RoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7fX0sX2NsZWFy RGF0ZTpmdW5jdGlvbihpZCl7dmFyIHRhcmdldD0kKGlkKTt2YXIgaW5zdD10aGlz Ll9nZXRJbnN0KHRhcmdldFswXSk7aW5zdC5zdGF5T3Blbj1mYWxzZTtpbnN0LmVu ZERheT1pbnN0LmVuZE1vbnRoPWluc3QuZW5kWWVhcj1pbnN0LnJhbmdlU3RhcnQ9 bnVsbDt0aGlzLl9zZWxlY3REYXRlKHRhcmdldCwnJyk7fSxfc2VsZWN0RGF0ZTpm dW5jdGlvbihpZCxkYXRlU3RyKXt2YXIgdGFyZ2V0PSQoaWQpO3ZhciBpbnN0PXRo aXMuX2dldEluc3QodGFyZ2V0WzBdKTtkYXRlU3RyPShkYXRlU3RyIT1udWxsP2Rh dGVTdHI6dGhpcy5fZm9ybWF0RGF0ZShpbnN0KSk7aWYoaW5zdC5pbnB1dCkKaW5z dC5pbnB1dC52YWwoZGF0ZVN0cik7dGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGluc3Qp O3ZhciBvblNlbGVjdD10aGlzLl9nZXQoaW5zdCwnb25TZWxlY3QnKTtpZihvblNl bGVjdCkKb25TZWxlY3QuYXBwbHkoKGluc3QuaW5wdXQ/aW5zdC5pbnB1dFswXTpu dWxsKSxbZGF0ZVN0cixpbnN0XSk7ZWxzZSBpZihpbnN0LmlucHV0KQppbnN0Lmlu cHV0LnRyaWdnZXIoJ2NoYW5nZScpO2lmKGluc3QuaW5saW5lKQp0aGlzLl91cGRh dGVEYXRlcGlja2VyKGluc3QpO2Vsc2UgaWYoIWluc3Quc3RheU9wZW4pe3RoaXMu X2hpZGVEYXRlcGlja2VyKG51bGwsdGhpcy5fZ2V0KGluc3QsJ2R1cmF0aW9uJykp O3RoaXMuX2xhc3RJbnB1dD1pbnN0LmlucHV0WzBdO2lmKHR5cGVvZihpbnN0Lmlu cHV0WzBdKSE9J29iamVjdCcpCmluc3QuaW5wdXRbMF0uZm9jdXMoKTt0aGlzLl9s YXN0SW5wdXQ9bnVsbDt9fSxfdXBkYXRlQWx0ZXJuYXRlOmZ1bmN0aW9uKGluc3Qp e3ZhciBhbHRGaWVsZD10aGlzLl9nZXQoaW5zdCwnYWx0RmllbGQnKTtpZihhbHRG aWVsZCl7dmFyIGFsdEZvcm1hdD10aGlzLl9nZXQoaW5zdCwnYWx0Rm9ybWF0Jyl8 fHRoaXMuX2dldChpbnN0LCdkYXRlRm9ybWF0Jyk7dmFyIGRhdGU9dGhpcy5fZ2V0 RGF0ZShpbnN0KTtkYXRlU3RyPXRoaXMuZm9ybWF0RGF0ZShhbHRGb3JtYXQsZGF0 ZSx0aGlzLl9nZXRGb3JtYXRDb25maWcoaW5zdCkpOyQoYWx0RmllbGQpLmVhY2go ZnVuY3Rpb24oKXskKHRoaXMpLnZhbChkYXRlU3RyKTt9KTt9fSxub1dlZWtlbmRz OmZ1bmN0aW9uKGRhdGUpe3ZhciBkYXk9ZGF0ZS5nZXREYXkoKTtyZXR1cm5bKGRh eT4wJiZkYXk8NiksJyddO30saXNvODYwMVdlZWs6ZnVuY3Rpb24oZGF0ZSl7dmFy IGNoZWNrRGF0ZT1uZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksZGF0ZS5nZXRN b250aCgpLGRhdGUuZ2V0RGF0ZSgpKTt2YXIgZmlyc3RNb249bmV3IERhdGUoY2hl Y2tEYXRlLmdldEZ1bGxZZWFyKCksMS0xLDQpO3ZhciBmaXJzdERheT1maXJzdE1v bi5nZXREYXkoKXx8NztmaXJzdE1vbi5zZXREYXRlKGZpcnN0TW9uLmdldERhdGUo KSsxLWZpcnN0RGF5KTtpZihmaXJzdERheTw0JiZjaGVja0RhdGU8Zmlyc3RNb24p e2NoZWNrRGF0ZS5zZXREYXRlKGNoZWNrRGF0ZS5nZXREYXRlKCktMyk7cmV0dXJu ICQuZGF0ZXBpY2tlci5pc284NjAxV2VlayhjaGVja0RhdGUpO31lbHNlIGlmKGNo ZWNrRGF0ZT5uZXcgRGF0ZShjaGVja0RhdGUuZ2V0RnVsbFllYXIoKSwxMi0xLDI4 KSl7Zmlyc3REYXk9bmV3IERhdGUoY2hlY2tEYXRlLmdldEZ1bGxZZWFyKCkrMSwx LTEsNCkuZ2V0RGF5KCl8fDc7aWYoZmlyc3REYXk+NCYmKGNoZWNrRGF0ZS5nZXRE YXkoKXx8Nyk8Zmlyc3REYXktMyl7cmV0dXJuIDE7fX0KcmV0dXJuIE1hdGguZmxv b3IoKChjaGVja0RhdGUtZmlyc3RNb24pLzg2NDAwMDAwKS83KSsxO30scGFyc2VE YXRlOmZ1bmN0aW9uKGZvcm1hdCx2YWx1ZSxzZXR0aW5ncyl7aWYoZm9ybWF0PT1u dWxsfHx2YWx1ZT09bnVsbCkKdGhyb3cnSW52YWxpZCBhcmd1bWVudHMnO3ZhbHVl PSh0eXBlb2YgdmFsdWU9PSdvYmplY3QnP3ZhbHVlLnRvU3RyaW5nKCk6dmFsdWUr JycpO2lmKHZhbHVlPT0nJykKcmV0dXJuIG51bGw7dmFyIHNob3J0WWVhckN1dG9m Zj0oc2V0dGluZ3M/c2V0dGluZ3Muc2hvcnRZZWFyQ3V0b2ZmOm51bGwpfHx0aGlz Ll9kZWZhdWx0cy5zaG9ydFllYXJDdXRvZmY7dmFyIGRheU5hbWVzU2hvcnQ9KHNl dHRpbmdzP3NldHRpbmdzLmRheU5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1 bHRzLmRheU5hbWVzU2hvcnQ7dmFyIGRheU5hbWVzPShzZXR0aW5ncz9zZXR0aW5n cy5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXM7dmFyIG1v bnRoTmFtZXNTaG9ydD0oc2V0dGluZ3M/c2V0dGluZ3MubW9udGhOYW1lc1Nob3J0 Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQ7dmFyIG1vbnRo TmFtZXM9KHNldHRpbmdzP3NldHRpbmdzLm1vbnRoTmFtZXM6bnVsbCl8fHRoaXMu X2RlZmF1bHRzLm1vbnRoTmFtZXM7dmFyIHllYXI9LTE7dmFyIG1vbnRoPS0xO3Zh ciBkYXk9LTE7dmFyIGRveT0tMTt2YXIgbGl0ZXJhbD1mYWxzZTt2YXIgbG9va0Fo ZWFkPWZ1bmN0aW9uKG1hdGNoKXt2YXIgbWF0Y2hlcz0oaUZvcm1hdCsxPGZvcm1h dC5sZW5ndGgmJmZvcm1hdC5jaGFyQXQoaUZvcm1hdCsxKT09bWF0Y2gpO2lmKG1h dGNoZXMpCmlGb3JtYXQrKztyZXR1cm4gbWF0Y2hlczt9O3ZhciBnZXROdW1iZXI9 ZnVuY3Rpb24obWF0Y2gpe2xvb2tBaGVhZChtYXRjaCk7dmFyIG9yaWdTaXplPSht YXRjaD09J0AnPzE0OihtYXRjaD09J3knPzQ6KG1hdGNoPT0nbyc/MzoyKSkpO3Zh ciBzaXplPW9yaWdTaXplO3ZhciBudW09MDt3aGlsZShzaXplPjAmJmlWYWx1ZTx2 YWx1ZS5sZW5ndGgmJnZhbHVlLmNoYXJBdChpVmFsdWUpPj0nMCcmJnZhbHVlLmNo YXJBdChpVmFsdWUpPD0nOScpe251bT1udW0qMTArcGFyc2VJbnQodmFsdWUuY2hh ckF0KGlWYWx1ZSsrKSwxMCk7c2l6ZS0tO30KaWYoc2l6ZT09b3JpZ1NpemUpCnRo cm93J01pc3NpbmcgbnVtYmVyIGF0IHBvc2l0aW9uICcraVZhbHVlO3JldHVybiBu dW07fTt2YXIgZ2V0TmFtZT1mdW5jdGlvbihtYXRjaCxzaG9ydE5hbWVzLGxvbmdO YW1lcyl7dmFyIG5hbWVzPShsb29rQWhlYWQobWF0Y2gpP2xvbmdOYW1lczpzaG9y dE5hbWVzKTt2YXIgc2l6ZT0wO2Zvcih2YXIgaj0wO2o8bmFtZXMubGVuZ3RoO2or KykKc2l6ZT1NYXRoLm1heChzaXplLG5hbWVzW2pdLmxlbmd0aCk7dmFyIG5hbWU9 Jyc7dmFyIGlJbml0PWlWYWx1ZTt3aGlsZShzaXplPjAmJmlWYWx1ZTx2YWx1ZS5s ZW5ndGgpe25hbWUrPXZhbHVlLmNoYXJBdChpVmFsdWUrKyk7Zm9yKHZhciBpPTA7 aTxuYW1lcy5sZW5ndGg7aSsrKQppZihuYW1lPT1uYW1lc1tpXSkKcmV0dXJuIGkr MTtzaXplLS07fQp0aHJvdydVbmtub3duIG5hbWUgYXQgcG9zaXRpb24gJytpSW5p dDt9O3ZhciBjaGVja0xpdGVyYWw9ZnVuY3Rpb24oKXtpZih2YWx1ZS5jaGFyQXQo aVZhbHVlKSE9Zm9ybWF0LmNoYXJBdChpRm9ybWF0KSkKdGhyb3cnVW5leHBlY3Rl ZCBsaXRlcmFsIGF0IHBvc2l0aW9uICcraVZhbHVlO2lWYWx1ZSsrO307dmFyIGlW YWx1ZT0wO2Zvcih2YXIgaUZvcm1hdD0wO2lGb3JtYXQ8Zm9ybWF0Lmxlbmd0aDtp Rm9ybWF0Kyspe2lmKGxpdGVyYWwpCmlmKGZvcm1hdC5jaGFyQXQoaUZvcm1hdCk9 PSInIiYmIWxvb2tBaGVhZCgiJyIpKQpsaXRlcmFsPWZhbHNlO2Vsc2UKY2hlY2tM aXRlcmFsKCk7ZWxzZQpzd2l0Y2goZm9ybWF0LmNoYXJBdChpRm9ybWF0KSl7Y2Fz ZSdkJzpkYXk9Z2V0TnVtYmVyKCdkJyk7YnJlYWs7Y2FzZSdEJzpnZXROYW1lKCdE JyxkYXlOYW1lc1Nob3J0LGRheU5hbWVzKTticmVhaztjYXNlJ28nOmRveT1nZXRO dW1iZXIoJ28nKTticmVhaztjYXNlJ20nOm1vbnRoPWdldE51bWJlcignbScpO2Jy ZWFrO2Nhc2UnTSc6bW9udGg9Z2V0TmFtZSgnTScsbW9udGhOYW1lc1Nob3J0LG1v bnRoTmFtZXMpO2JyZWFrO2Nhc2UneSc6eWVhcj1nZXROdW1iZXIoJ3knKTticmVh aztjYXNlJ0AnOnZhciBkYXRlPW5ldyBEYXRlKGdldE51bWJlcignQCcpKTt5ZWFy PWRhdGUuZ2V0RnVsbFllYXIoKTttb250aD1kYXRlLmdldE1vbnRoKCkrMTtkYXk9 ZGF0ZS5nZXREYXRlKCk7YnJlYWs7Y2FzZSInIjppZihsb29rQWhlYWQoIiciKSkK Y2hlY2tMaXRlcmFsKCk7ZWxzZQpsaXRlcmFsPXRydWU7YnJlYWs7ZGVmYXVsdDpj aGVja0xpdGVyYWwoKTt9fQppZih5ZWFyPT0tMSkKeWVhcj1uZXcgRGF0ZSgpLmdl dEZ1bGxZZWFyKCk7ZWxzZSBpZih5ZWFyPDEwMCkKeWVhcis9bmV3IERhdGUoKS5n ZXRGdWxsWWVhcigpLW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSUxMDArCih5ZWFy PD1zaG9ydFllYXJDdXRvZmY/MDotMTAwKTtpZihkb3k+LTEpe21vbnRoPTE7ZGF5 PWRveTtkb3t2YXIgZGltPXRoaXMuX2dldERheXNJbk1vbnRoKHllYXIsbW9udGgt MSk7aWYoZGF5PD1kaW0pCmJyZWFrO21vbnRoKys7ZGF5LT1kaW07fXdoaWxlKHRy dWUpO30KdmFyIGRhdGU9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERh dGUoeWVhcixtb250aC0xLGRheSkpO2lmKGRhdGUuZ2V0RnVsbFllYXIoKSE9eWVh cnx8ZGF0ZS5nZXRNb250aCgpKzEhPW1vbnRofHxkYXRlLmdldERhdGUoKSE9ZGF5 KQp0aHJvdydJbnZhbGlkIGRhdGUnO3JldHVybiBkYXRlO30sQVRPTToneXktbW0t ZGQnLENPT0tJRTonRCwgZGQgTSB5eScsSVNPXzg2MDE6J3l5LW1tLWRkJyxSRkNf ODIyOidELCBkIE0geScsUkZDXzg1MDonREQsIGRkLU0teScsUkZDXzEwMzY6J0Qs IGQgTSB5JyxSRkNfMTEyMzonRCwgZCBNIHl5JyxSRkNfMjgyMjonRCwgZCBNIHl5 JyxSU1M6J0QsIGQgTSB5JyxUSU1FU1RBTVA6J0AnLFczQzoneXktbW0tZGQnLGZv cm1hdERhdGU6ZnVuY3Rpb24oZm9ybWF0LGRhdGUsc2V0dGluZ3Mpe2lmKCFkYXRl KQpyZXR1cm4nJzt2YXIgZGF5TmFtZXNTaG9ydD0oc2V0dGluZ3M/c2V0dGluZ3Mu ZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9y dDt2YXIgZGF5TmFtZXM9KHNldHRpbmdzP3NldHRpbmdzLmRheU5hbWVzOm51bGwp fHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lczt2YXIgbW9udGhOYW1lc1Nob3J0PShz ZXR0aW5ncz9zZXR0aW5ncy5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2Rl ZmF1bHRzLm1vbnRoTmFtZXNTaG9ydDt2YXIgbW9udGhOYW1lcz0oc2V0dGluZ3M/ c2V0dGluZ3MubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhO YW1lczt2YXIgbG9va0FoZWFkPWZ1bmN0aW9uKG1hdGNoKXt2YXIgbWF0Y2hlcz0o aUZvcm1hdCsxPGZvcm1hdC5sZW5ndGgmJmZvcm1hdC5jaGFyQXQoaUZvcm1hdCsx KT09bWF0Y2gpO2lmKG1hdGNoZXMpCmlGb3JtYXQrKztyZXR1cm4gbWF0Y2hlczt9 O3ZhciBmb3JtYXROdW1iZXI9ZnVuY3Rpb24obWF0Y2gsdmFsdWUsbGVuKXt2YXIg bnVtPScnK3ZhbHVlO2lmKGxvb2tBaGVhZChtYXRjaCkpCndoaWxlKG51bS5sZW5n dGg8bGVuKQpudW09JzAnK251bTtyZXR1cm4gbnVtO307dmFyIGZvcm1hdE5hbWU9 ZnVuY3Rpb24obWF0Y2gsdmFsdWUsc2hvcnROYW1lcyxsb25nTmFtZXMpe3JldHVy bihsb29rQWhlYWQobWF0Y2gpP2xvbmdOYW1lc1t2YWx1ZV06c2hvcnROYW1lc1t2 YWx1ZV0pO307dmFyIG91dHB1dD0nJzt2YXIgbGl0ZXJhbD1mYWxzZTtpZihkYXRl KQpmb3IodmFyIGlGb3JtYXQ9MDtpRm9ybWF0PGZvcm1hdC5sZW5ndGg7aUZvcm1h dCsrKXtpZihsaXRlcmFsKQppZihmb3JtYXQuY2hhckF0KGlGb3JtYXQpPT0iJyIm JiFsb29rQWhlYWQoIiciKSkKbGl0ZXJhbD1mYWxzZTtlbHNlCm91dHB1dCs9Zm9y bWF0LmNoYXJBdChpRm9ybWF0KTtlbHNlCnN3aXRjaChmb3JtYXQuY2hhckF0KGlG b3JtYXQpKXtjYXNlJ2QnOm91dHB1dCs9Zm9ybWF0TnVtYmVyKCdkJyxkYXRlLmdl dERhdGUoKSwyKTticmVhaztjYXNlJ0QnOm91dHB1dCs9Zm9ybWF0TmFtZSgnRCcs ZGF0ZS5nZXREYXkoKSxkYXlOYW1lc1Nob3J0LGRheU5hbWVzKTticmVhaztjYXNl J28nOnZhciBkb3k9ZGF0ZS5nZXREYXRlKCk7Zm9yKHZhciBtPWRhdGUuZ2V0TW9u dGgoKS0xO20+PTA7bS0tKQpkb3krPXRoaXMuX2dldERheXNJbk1vbnRoKGRhdGUu Z2V0RnVsbFllYXIoKSxtKTtvdXRwdXQrPWZvcm1hdE51bWJlcignbycsZG95LDMp O2JyZWFrO2Nhc2UnbSc6b3V0cHV0Kz1mb3JtYXROdW1iZXIoJ20nLGRhdGUuZ2V0 TW9udGgoKSsxLDIpO2JyZWFrO2Nhc2UnTSc6b3V0cHV0Kz1mb3JtYXROYW1lKCdN JyxkYXRlLmdldE1vbnRoKCksbW9udGhOYW1lc1Nob3J0LG1vbnRoTmFtZXMpO2Jy ZWFrO2Nhc2UneSc6b3V0cHV0Kz0obG9va0FoZWFkKCd5Jyk/ZGF0ZS5nZXRGdWxs WWVhcigpOihkYXRlLmdldFllYXIoKSUxMDA8MTA/JzAnOicnKStkYXRlLmdldFll YXIoKSUxMDApO2JyZWFrO2Nhc2UnQCc6b3V0cHV0Kz1kYXRlLmdldFRpbWUoKTti cmVhaztjYXNlIiciOmlmKGxvb2tBaGVhZCgiJyIpKQpvdXRwdXQrPSInIjtlbHNl CmxpdGVyYWw9dHJ1ZTticmVhaztkZWZhdWx0Om91dHB1dCs9Zm9ybWF0LmNoYXJB dChpRm9ybWF0KTt9fQpyZXR1cm4gb3V0cHV0O30sX3Bvc3NpYmxlQ2hhcnM6ZnVu Y3Rpb24oZm9ybWF0KXt2YXIgY2hhcnM9Jyc7dmFyIGxpdGVyYWw9ZmFsc2U7Zm9y KHZhciBpRm9ybWF0PTA7aUZvcm1hdDxmb3JtYXQubGVuZ3RoO2lGb3JtYXQrKykK aWYobGl0ZXJhbCkKaWYoZm9ybWF0LmNoYXJBdChpRm9ybWF0KT09IiciJiYhbG9v a0FoZWFkKCInIikpCmxpdGVyYWw9ZmFsc2U7ZWxzZQpjaGFycys9Zm9ybWF0LmNo YXJBdChpRm9ybWF0KTtlbHNlCnN3aXRjaChmb3JtYXQuY2hhckF0KGlGb3JtYXQp KXtjYXNlJ2QnOmNhc2UnbSc6Y2FzZSd5JzpjYXNlJ0AnOmNoYXJzKz0nMDEyMzQ1 Njc4OSc7YnJlYWs7Y2FzZSdEJzpjYXNlJ00nOnJldHVybiBudWxsO2Nhc2UiJyI6 aWYobG9va0FoZWFkKCInIikpCmNoYXJzKz0iJyI7ZWxzZQpsaXRlcmFsPXRydWU7 YnJlYWs7ZGVmYXVsdDpjaGFycys9Zm9ybWF0LmNoYXJBdChpRm9ybWF0KTt9CnJl dHVybiBjaGFyczt9LF9nZXQ6ZnVuY3Rpb24oaW5zdCxuYW1lKXtyZXR1cm4gaW5z dC5zZXR0aW5nc1tuYW1lXSE9PXVuZGVmaW5lZD9pbnN0LnNldHRpbmdzW25hbWVd OnRoaXMuX2RlZmF1bHRzW25hbWVdO30sX3NldERhdGVGcm9tRmllbGQ6ZnVuY3Rp b24oaW5zdCl7dmFyIGRhdGVGb3JtYXQ9dGhpcy5fZ2V0KGluc3QsJ2RhdGVGb3Jt YXQnKTt2YXIgZGF0ZXM9aW5zdC5pbnB1dD9pbnN0LmlucHV0LnZhbCgpOm51bGw7 aW5zdC5lbmREYXk9aW5zdC5lbmRNb250aD1pbnN0LmVuZFllYXI9bnVsbDt2YXIg ZGF0ZT1kZWZhdWx0RGF0ZT10aGlzLl9nZXREZWZhdWx0RGF0ZShpbnN0KTt2YXIg c2V0dGluZ3M9dGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGluc3QpO3RyeXtkYXRlPXRo aXMucGFyc2VEYXRlKGRhdGVGb3JtYXQsZGF0ZXMsc2V0dGluZ3MpfHxkZWZhdWx0 RGF0ZTt9Y2F0Y2goZXZlbnQpe3RoaXMubG9nKGV2ZW50KTtkYXRlPWRlZmF1bHRE YXRlO30KaW5zdC5zZWxlY3RlZERheT1kYXRlLmdldERhdGUoKTtpbnN0LmRyYXdN b250aD1pbnN0LnNlbGVjdGVkTW9udGg9ZGF0ZS5nZXRNb250aCgpO2luc3QuZHJh d1llYXI9aW5zdC5zZWxlY3RlZFllYXI9ZGF0ZS5nZXRGdWxsWWVhcigpO2luc3Qu Y3VycmVudERheT0oZGF0ZXM/ZGF0ZS5nZXREYXRlKCk6MCk7aW5zdC5jdXJyZW50 TW9udGg9KGRhdGVzP2RhdGUuZ2V0TW9udGgoKTowKTtpbnN0LmN1cnJlbnRZZWFy PShkYXRlcz9kYXRlLmdldEZ1bGxZZWFyKCk6MCk7dGhpcy5fYWRqdXN0SW5zdERh dGUoaW5zdCk7fSxfZ2V0RGVmYXVsdERhdGU6ZnVuY3Rpb24oaW5zdCl7dmFyIGRh dGU9dGhpcy5fZGV0ZXJtaW5lRGF0ZSh0aGlzLl9nZXQoaW5zdCwnZGVmYXVsdERh dGUnKSxuZXcgRGF0ZSgpKTt2YXIgbWluRGF0ZT10aGlzLl9nZXRNaW5NYXhEYXRl KGluc3QsJ21pbicsdHJ1ZSk7dmFyIG1heERhdGU9dGhpcy5fZ2V0TWluTWF4RGF0 ZShpbnN0LCdtYXgnKTtkYXRlPShtaW5EYXRlJiZkYXRlPG1pbkRhdGU/bWluRGF0 ZTpkYXRlKTtkYXRlPShtYXhEYXRlJiZkYXRlPm1heERhdGU/bWF4RGF0ZTpkYXRl KTtyZXR1cm4gZGF0ZTt9LF9kZXRlcm1pbmVEYXRlOmZ1bmN0aW9uKGRhdGUsZGVm YXVsdERhdGUpe3ZhciBvZmZzZXROdW1lcmljPWZ1bmN0aW9uKG9mZnNldCl7dmFy IGRhdGU9bmV3IERhdGUoKTtkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkrb2Zm c2V0KTtyZXR1cm4gZGF0ZTt9O3ZhciBvZmZzZXRTdHJpbmc9ZnVuY3Rpb24ob2Zm c2V0LGdldERheXNJbk1vbnRoKXt2YXIgZGF0ZT1uZXcgRGF0ZSgpO3ZhciB5ZWFy PWRhdGUuZ2V0RnVsbFllYXIoKTt2YXIgbW9udGg9ZGF0ZS5nZXRNb250aCgpO3Zh ciBkYXk9ZGF0ZS5nZXREYXRlKCk7dmFyIHBhdHRlcm49LyhbKy1dP1swLTldKylc cyooZHxEfHd8V3xtfE18eXxZKT8vZzt2YXIgbWF0Y2hlcz1wYXR0ZXJuLmV4ZWMo b2Zmc2V0KTt3aGlsZShtYXRjaGVzKXtzd2l0Y2gobWF0Y2hlc1syXXx8J2QnKXtj YXNlJ2QnOmNhc2UnRCc6ZGF5Kz1wYXJzZUludChtYXRjaGVzWzFdLDEwKTticmVh aztjYXNlJ3cnOmNhc2UnVyc6ZGF5Kz1wYXJzZUludChtYXRjaGVzWzFdLDEwKSo3 O2JyZWFrO2Nhc2UnbSc6Y2FzZSdNJzptb250aCs9cGFyc2VJbnQobWF0Y2hlc1sx XSwxMCk7ZGF5PU1hdGgubWluKGRheSxnZXREYXlzSW5Nb250aCh5ZWFyLG1vbnRo KSk7YnJlYWs7Y2FzZSd5JzpjYXNlJ1knOnllYXIrPXBhcnNlSW50KG1hdGNoZXNb MV0sMTApO2RheT1NYXRoLm1pbihkYXksZ2V0RGF5c0luTW9udGgoeWVhcixtb250 aCkpO2JyZWFrO30KbWF0Y2hlcz1wYXR0ZXJuLmV4ZWMob2Zmc2V0KTt9CnJldHVy biBuZXcgRGF0ZSh5ZWFyLG1vbnRoLGRheSk7fTtkYXRlPShkYXRlPT1udWxsP2Rl ZmF1bHREYXRlOih0eXBlb2YgZGF0ZT09J3N0cmluZyc/b2Zmc2V0U3RyaW5nKGRh dGUsdGhpcy5fZ2V0RGF5c0luTW9udGgpOih0eXBlb2YgZGF0ZT09J251bWJlcic/ KGlzTmFOKGRhdGUpP2RlZmF1bHREYXRlOm9mZnNldE51bWVyaWMoZGF0ZSkpOmRh dGUpKSk7ZGF0ZT0oZGF0ZSYmZGF0ZS50b1N0cmluZygpPT0nSW52YWxpZCBEYXRl Jz9kZWZhdWx0RGF0ZTpkYXRlKTtpZihkYXRlKXtkYXRlLnNldEhvdXJzKDApO2Rh dGUuc2V0TWludXRlcygwKTtkYXRlLnNldFNlY29uZHMoMCk7ZGF0ZS5zZXRNaWxs aXNlY29uZHMoMCk7fQpyZXR1cm4gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3Qo ZGF0ZSk7fSxfZGF5bGlnaHRTYXZpbmdBZGp1c3Q6ZnVuY3Rpb24oZGF0ZSl7aWYo IWRhdGUpcmV0dXJuIG51bGw7ZGF0ZS5zZXRIb3VycyhkYXRlLmdldEhvdXJzKCk+ MTI/ZGF0ZS5nZXRIb3VycygpKzI6MCk7cmV0dXJuIGRhdGU7fSxfc2V0RGF0ZTpm dW5jdGlvbihpbnN0LGRhdGUsZW5kRGF0ZSl7dmFyIGNsZWFyPSEoZGF0ZSk7dmFy IG9yaWdNb250aD1pbnN0LnNlbGVjdGVkTW9udGg7dmFyIG9yaWdZZWFyPWluc3Qu c2VsZWN0ZWRZZWFyO2RhdGU9dGhpcy5fZGV0ZXJtaW5lRGF0ZShkYXRlLG5ldyBE YXRlKCkpO2luc3Quc2VsZWN0ZWREYXk9aW5zdC5jdXJyZW50RGF5PWRhdGUuZ2V0 RGF0ZSgpO2luc3QuZHJhd01vbnRoPWluc3Quc2VsZWN0ZWRNb250aD1pbnN0LmN1 cnJlbnRNb250aD1kYXRlLmdldE1vbnRoKCk7aW5zdC5kcmF3WWVhcj1pbnN0LnNl bGVjdGVkWWVhcj1pbnN0LmN1cnJlbnRZZWFyPWRhdGUuZ2V0RnVsbFllYXIoKTtp ZihvcmlnTW9udGghPWluc3Quc2VsZWN0ZWRNb250aHx8b3JpZ1llYXIhPWluc3Qu c2VsZWN0ZWRZZWFyKQp0aGlzLl9ub3RpZnlDaGFuZ2UoaW5zdCk7dGhpcy5fYWRq dXN0SW5zdERhdGUoaW5zdCk7aWYoaW5zdC5pbnB1dCl7aW5zdC5pbnB1dC52YWwo Y2xlYXI/Jyc6dGhpcy5fZm9ybWF0RGF0ZShpbnN0KSk7fX0sX2dldERhdGU6ZnVu Y3Rpb24oaW5zdCl7dmFyIHN0YXJ0RGF0ZT0oIWluc3QuY3VycmVudFllYXJ8fChp bnN0LmlucHV0JiZpbnN0LmlucHV0LnZhbCgpPT0nJyk/bnVsbDp0aGlzLl9kYXls aWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShpbnN0LmN1cnJlbnRZZWFyLGluc3Qu Y3VycmVudE1vbnRoLGluc3QuY3VycmVudERheSkpKTtyZXR1cm4gc3RhcnREYXRl O30sX2dlbmVyYXRlSFRNTDpmdW5jdGlvbihpbnN0KXt2YXIgdG9kYXk9bmV3IERh dGUoKTt0b2RheT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh0 b2RheS5nZXRGdWxsWWVhcigpLHRvZGF5LmdldE1vbnRoKCksdG9kYXkuZ2V0RGF0 ZSgpKSk7dmFyIGlzUlRMPXRoaXMuX2dldChpbnN0LCdpc1JUTCcpO3ZhciBzaG93 QnV0dG9uUGFuZWw9dGhpcy5fZ2V0KGluc3QsJ3Nob3dCdXR0b25QYW5lbCcpO3Zh ciBoaWRlSWZOb1ByZXZOZXh0PXRoaXMuX2dldChpbnN0LCdoaWRlSWZOb1ByZXZO ZXh0Jyk7dmFyIG5hdmlnYXRpb25Bc0RhdGVGb3JtYXQ9dGhpcy5fZ2V0KGluc3Qs J25hdmlnYXRpb25Bc0RhdGVGb3JtYXQnKTt2YXIgbnVtTW9udGhzPXRoaXMuX2dl dE51bWJlck9mTW9udGhzKGluc3QpO3ZhciBzaG93Q3VycmVudEF0UG9zPXRoaXMu X2dldChpbnN0LCdzaG93Q3VycmVudEF0UG9zJyk7dmFyIHN0ZXBNb250aHM9dGhp cy5fZ2V0KGluc3QsJ3N0ZXBNb250aHMnKTt2YXIgc3RlcEJpZ01vbnRocz10aGlz Ll9nZXQoaW5zdCwnc3RlcEJpZ01vbnRocycpO3ZhciBpc011bHRpTW9udGg9KG51 bU1vbnRoc1swXSE9MXx8bnVtTW9udGhzWzFdIT0xKTt2YXIgY3VycmVudERhdGU9 dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoKCFpbnN0LmN1cnJlbnREYXk/bmV3 IERhdGUoOTk5OSw5LDkpOm5ldyBEYXRlKGluc3QuY3VycmVudFllYXIsaW5zdC5j dXJyZW50TW9udGgsaW5zdC5jdXJyZW50RGF5KSkpO3ZhciBtaW5EYXRlPXRoaXMu X2dldE1pbk1heERhdGUoaW5zdCwnbWluJyx0cnVlKTt2YXIgbWF4RGF0ZT10aGlz Ll9nZXRNaW5NYXhEYXRlKGluc3QsJ21heCcpO3ZhciBkcmF3TW9udGg9aW5zdC5k cmF3TW9udGgtc2hvd0N1cnJlbnRBdFBvczt2YXIgZHJhd1llYXI9aW5zdC5kcmF3 WWVhcjtpZihkcmF3TW9udGg8MCl7ZHJhd01vbnRoKz0xMjtkcmF3WWVhci0tO30K aWYobWF4RGF0ZSl7dmFyIG1heERyYXc9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1 c3QobmV3IERhdGUobWF4RGF0ZS5nZXRGdWxsWWVhcigpLG1heERhdGUuZ2V0TW9u dGgoKS1udW1Nb250aHNbMV0rMSxtYXhEYXRlLmdldERhdGUoKSkpO21heERyYXc9 KG1pbkRhdGUmJm1heERyYXc8bWluRGF0ZT9taW5EYXRlOm1heERyYXcpO3doaWxl KHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRyYXdZZWFyLGRy YXdNb250aCwxKSk+bWF4RHJhdyl7ZHJhd01vbnRoLS07aWYoZHJhd01vbnRoPDAp e2RyYXdNb250aD0xMTtkcmF3WWVhci0tO319fQppbnN0LmRyYXdNb250aD1kcmF3 TW9udGg7aW5zdC5kcmF3WWVhcj1kcmF3WWVhcjt2YXIgcHJldlRleHQ9dGhpcy5f Z2V0KGluc3QsJ3ByZXZUZXh0Jyk7cHJldlRleHQ9KCFuYXZpZ2F0aW9uQXNEYXRl Rm9ybWF0P3ByZXZUZXh0OnRoaXMuZm9ybWF0RGF0ZShwcmV2VGV4dCx0aGlzLl9k YXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhcixkcmF3TW9udGgt c3RlcE1vbnRocywxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGluc3QpKSk7dmFy IHByZXY9KHRoaXMuX2NhbkFkanVzdE1vbnRoKGluc3QsLTEsZHJhd1llYXIsZHJh d01vbnRoKT8nPGEgY2xhc3M9InVpLWRhdGVwaWNrZXItcHJldiB1aS1jb3JuZXIt YWxsIiBvbmNsaWNrPSJEUF9qUXVlcnkuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShc JyMnK2luc3QuaWQrJ1wnLCAtJytzdGVwTW9udGhzKycsIFwnTVwnKTsiJysnIHRp dGxlPSInK3ByZXZUZXh0KyciPjxzcGFuIGNsYXNzPSJ1aS1pY29uIHVpLWljb24t Y2lyY2xlLXRyaWFuZ2xlLScrKGlzUlRMPydlJzondycpKyciPicrcHJldlRleHQr Jzwvc3Bhbj48L2E+JzooaGlkZUlmTm9QcmV2TmV4dD8nJzonPGEgY2xhc3M9InVp LWRhdGVwaWNrZXItcHJldiB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWRpc2FibGVk IiB0aXRsZT0iJytwcmV2VGV4dCsnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1p Y29uLWNpcmNsZS10cmlhbmdsZS0nKyhpc1JUTD8nZSc6J3cnKSsnIj4nK3ByZXZU ZXh0Kyc8L3NwYW4+PC9hPicpKTt2YXIgbmV4dFRleHQ9dGhpcy5fZ2V0KGluc3Qs J25leHRUZXh0Jyk7bmV4dFRleHQ9KCFuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0P25l eHRUZXh0OnRoaXMuZm9ybWF0RGF0ZShuZXh0VGV4dCx0aGlzLl9kYXlsaWdodFNh dmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhcixkcmF3TW9udGgrc3RlcE1vbnRo cywxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGluc3QpKSk7dmFyIG5leHQ9KHRo aXMuX2NhbkFkanVzdE1vbnRoKGluc3QsKzEsZHJhd1llYXIsZHJhd01vbnRoKT8n PGEgY2xhc3M9InVpLWRhdGVwaWNrZXItbmV4dCB1aS1jb3JuZXItYWxsIiBvbmNs aWNrPSJEUF9qUXVlcnkuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShcJyMnK2luc3Qu aWQrJ1wnLCArJytzdGVwTW9udGhzKycsIFwnTVwnKTsiJysnIHRpdGxlPSInK25l eHRUZXh0KyciPjxzcGFuIGNsYXNzPSJ1aS1pY29uIHVpLWljb24tY2lyY2xlLXRy aWFuZ2xlLScrKGlzUlRMPyd3JzonZScpKyciPicrbmV4dFRleHQrJzwvc3Bhbj48 L2E+JzooaGlkZUlmTm9QcmV2TmV4dD8nJzonPGEgY2xhc3M9InVpLWRhdGVwaWNr ZXItbmV4dCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWRpc2FibGVkIiB0aXRsZT0i JytuZXh0VGV4dCsnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNs ZS10cmlhbmdsZS0nKyhpc1JUTD8ndyc6J2UnKSsnIj4nK25leHRUZXh0Kyc8L3Nw YW4+PC9hPicpKTt2YXIgY3VycmVudFRleHQ9dGhpcy5fZ2V0KGluc3QsJ2N1cnJl bnRUZXh0Jyk7dmFyIGdvdG9EYXRlPSh0aGlzLl9nZXQoaW5zdCwnZ290b0N1cnJl bnQnKSYmaW5zdC5jdXJyZW50RGF5P2N1cnJlbnREYXRlOnRvZGF5KTtjdXJyZW50 VGV4dD0oIW5hdmlnYXRpb25Bc0RhdGVGb3JtYXQ/Y3VycmVudFRleHQ6dGhpcy5m b3JtYXREYXRlKGN1cnJlbnRUZXh0LGdvdG9EYXRlLHRoaXMuX2dldEZvcm1hdENv bmZpZyhpbnN0KSkpO3ZhciBjb250cm9scz0oIWluc3QuaW5saW5lPyc8YnV0dG9u IHR5cGU9ImJ1dHRvbiIgY2xhc3M9InVpLWRhdGVwaWNrZXItY2xvc2UgdWktc3Rh dGUtZGVmYXVsdCB1aS1wcmlvcml0eS1wcmltYXJ5IHVpLWNvcm5lci1hbGwiIG9u Y2xpY2s9IkRQX2pRdWVyeS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOyI+ Jyt0aGlzLl9nZXQoaW5zdCwnY2xvc2VUZXh0JykrJzwvYnV0dG9uPic6JycpO3Zh ciBidXR0b25QYW5lbD0oc2hvd0J1dHRvblBhbmVsKT8nPGRpdiBjbGFzcz0idWkt ZGF0ZXBpY2tlci1idXR0b25wYW5lIHVpLXdpZGdldC1jb250ZW50Ij4nKyhpc1JU TD9jb250cm9sczonJykrCih0aGlzLl9pc0luUmFuZ2UoaW5zdCxnb3RvRGF0ZSk/ JzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idWktZGF0ZXBpY2tlci1jdXJy ZW50IHVpLXN0YXRlLWRlZmF1bHQgdWktcHJpb3JpdHktc2Vjb25kYXJ5IHVpLWNv cm5lci1hbGwiIG9uY2xpY2s9IkRQX2pRdWVyeS5kYXRlcGlja2VyLl9nb3RvVG9k YXkoXCcjJytpbnN0LmlkKydcJyk7IicrJz4nK2N1cnJlbnRUZXh0Kyc8L2J1dHRv bj4nOicnKSsoaXNSVEw/Jyc6Y29udHJvbHMpKyc8L2Rpdj4nOicnO3ZhciBmaXJz dERheT1wYXJzZUludCh0aGlzLl9nZXQoaW5zdCwnZmlyc3REYXknKSwxMCk7Zmly c3REYXk9KGlzTmFOKGZpcnN0RGF5KT8wOmZpcnN0RGF5KTt2YXIgZGF5TmFtZXM9 dGhpcy5fZ2V0KGluc3QsJ2RheU5hbWVzJyk7dmFyIGRheU5hbWVzU2hvcnQ9dGhp cy5fZ2V0KGluc3QsJ2RheU5hbWVzU2hvcnQnKTt2YXIgZGF5TmFtZXNNaW49dGhp cy5fZ2V0KGluc3QsJ2RheU5hbWVzTWluJyk7dmFyIG1vbnRoTmFtZXM9dGhpcy5f Z2V0KGluc3QsJ21vbnRoTmFtZXMnKTt2YXIgbW9udGhOYW1lc1Nob3J0PXRoaXMu X2dldChpbnN0LCdtb250aE5hbWVzU2hvcnQnKTt2YXIgYmVmb3JlU2hvd0RheT10 aGlzLl9nZXQoaW5zdCwnYmVmb3JlU2hvd0RheScpO3ZhciBzaG93T3RoZXJNb250 aHM9dGhpcy5fZ2V0KGluc3QsJ3Nob3dPdGhlck1vbnRocycpO3ZhciBjYWxjdWxh dGVXZWVrPXRoaXMuX2dldChpbnN0LCdjYWxjdWxhdGVXZWVrJyl8fHRoaXMuaXNv ODYwMVdlZWs7dmFyIGVuZERhdGU9aW5zdC5lbmREYXk/dGhpcy5fZGF5bGlnaHRT YXZpbmdBZGp1c3QobmV3IERhdGUoaW5zdC5lbmRZZWFyLGluc3QuZW5kTW9udGgs aW5zdC5lbmREYXkpKTpjdXJyZW50RGF0ZTt2YXIgZGVmYXVsdERhdGU9dGhpcy5f Z2V0RGVmYXVsdERhdGUoaW5zdCk7dmFyIGh0bWw9Jyc7Zm9yKHZhciByb3c9MDty b3c8bnVtTW9udGhzWzBdO3JvdysrKXt2YXIgZ3JvdXA9Jyc7Zm9yKHZhciBjb2w9 MDtjb2w8bnVtTW9udGhzWzFdO2NvbCsrKXt2YXIgc2VsZWN0ZWREYXRlPXRoaXMu X2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRyYXdZZWFyLGRyYXdNb250 aCxpbnN0LnNlbGVjdGVkRGF5KSk7dmFyIGNvcm5lckNsYXNzPScgdWktY29ybmVy LWFsbCc7dmFyIGNhbGVuZGVyPScnO2lmKGlzTXVsdGlNb250aCl7Y2FsZW5kZXIr PSc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLWdyb3VwIHVpLWRhdGVwaWNrZXIt Z3JvdXAtJztzd2l0Y2goY29sKXtjYXNlIDA6Y2FsZW5kZXIrPSdmaXJzdCc7Y29y bmVyQ2xhc3M9JyB1aS1jb3JuZXItJysoaXNSVEw/J3JpZ2h0JzonbGVmdCcpO2Jy ZWFrO2Nhc2UgbnVtTW9udGhzWzFdLTE6Y2FsZW5kZXIrPSdsYXN0Jztjb3JuZXJD bGFzcz0nIHVpLWNvcm5lci0nKyhpc1JUTD8nbGVmdCc6J3JpZ2h0Jyk7YnJlYWs7 ZGVmYXVsdDpjYWxlbmRlcis9J21pZGRsZSc7Y29ybmVyQ2xhc3M9Jyc7YnJlYWs7 fQpjYWxlbmRlcis9JyI+Jzt9CmNhbGVuZGVyKz0nPGRpdiBjbGFzcz0idWktZGF0 ZXBpY2tlci1oZWFkZXIgdWktd2lkZ2V0LWhlYWRlciB1aS1oZWxwZXItY2xlYXJm aXgnK2Nvcm5lckNsYXNzKyciPicrCigvYWxsfGxlZnQvLnRlc3QoY29ybmVyQ2xh c3MpJiZyb3c9PTA/KGlzUlRMP25leHQ6cHJldik6JycpKwooL2FsbHxyaWdodC8u dGVzdChjb3JuZXJDbGFzcykmJnJvdz09MD8oaXNSVEw/cHJldjpuZXh0KTonJykr CnRoaXMuX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyKGluc3QsZHJhd01vbnRoLGRy YXdZZWFyLG1pbkRhdGUsbWF4RGF0ZSxzZWxlY3RlZERhdGUscm93PjB8fGNvbD4w LG1vbnRoTmFtZXMsbW9udGhOYW1lc1Nob3J0KSsnPC9kaXY+PHRhYmxlIGNsYXNz PSJ1aS1kYXRlcGlja2VyLWNhbGVuZGFyIj48dGhlYWQ+JysnPHRyPic7dmFyIHRo ZWFkPScnO2Zvcih2YXIgZG93PTA7ZG93PDc7ZG93Kyspe3ZhciBkYXk9KGRvdytm aXJzdERheSklNzt0aGVhZCs9Jzx0aCcrKChkb3crZmlyc3REYXkrNiklNz49NT8n IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXdlZWstZW5kIic6JycpKyc+JysnPHNwYW4g dGl0bGU9IicrZGF5TmFtZXNbZGF5XSsnIj4nK2RheU5hbWVzTWluW2RheV0rJzwv c3Bhbj48L3RoPic7fQpjYWxlbmRlcis9dGhlYWQrJzwvdHI+PC90aGVhZD48dGJv ZHk+Jzt2YXIgZGF5c0luTW9udGg9dGhpcy5fZ2V0RGF5c0luTW9udGgoZHJhd1ll YXIsZHJhd01vbnRoKTtpZihkcmF3WWVhcj09aW5zdC5zZWxlY3RlZFllYXImJmRy YXdNb250aD09aW5zdC5zZWxlY3RlZE1vbnRoKQppbnN0LnNlbGVjdGVkRGF5PU1h dGgubWluKGluc3Quc2VsZWN0ZWREYXksZGF5c0luTW9udGgpO3ZhciBsZWFkRGF5 cz0odGhpcy5fZ2V0Rmlyc3REYXlPZk1vbnRoKGRyYXdZZWFyLGRyYXdNb250aCkt Zmlyc3REYXkrNyklNzt2YXIgbnVtUm93cz0oaXNNdWx0aU1vbnRoPzY6TWF0aC5j ZWlsKChsZWFkRGF5cytkYXlzSW5Nb250aCkvNykpO3ZhciBwcmludERhdGU9dGhp cy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZHJhd1llYXIsZHJhd01v bnRoLDEtbGVhZERheXMpKTtmb3IodmFyIGRSb3c9MDtkUm93PG51bVJvd3M7ZFJv dysrKXtjYWxlbmRlcis9Jzx0cj4nO3ZhciB0Ym9keT0nJztmb3IodmFyIGRvdz0w O2Rvdzw3O2RvdysrKXt2YXIgZGF5U2V0dGluZ3M9KGJlZm9yZVNob3dEYXk/YmVm b3JlU2hvd0RheS5hcHBseSgoaW5zdC5pbnB1dD9pbnN0LmlucHV0WzBdOm51bGwp LFtwcmludERhdGVdKTpbdHJ1ZSwnJ10pO3ZhciBvdGhlck1vbnRoPShwcmludERh dGUuZ2V0TW9udGgoKSE9ZHJhd01vbnRoKTt2YXIgdW5zZWxlY3RhYmxlPW90aGVy TW9udGh8fCFkYXlTZXR0aW5nc1swXXx8KG1pbkRhdGUmJnByaW50RGF0ZTxtaW5E YXRlKXx8KG1heERhdGUmJnByaW50RGF0ZT5tYXhEYXRlKTt0Ym9keSs9Jzx0ZCBj bGFzcz0iJysKKChkb3crZmlyc3REYXkrNiklNz49NT8nIHVpLWRhdGVwaWNrZXIt d2Vlay1lbmQnOicnKSsKKG90aGVyTW9udGg/JyB1aS1kYXRlcGlja2VyLW90aGVy LW1vbnRoJzonJykrCigocHJpbnREYXRlLmdldFRpbWUoKT09c2VsZWN0ZWREYXRl LmdldFRpbWUoKSYmZHJhd01vbnRoPT1pbnN0LnNlbGVjdGVkTW9udGgmJmluc3Qu X2tleUV2ZW50KXx8KGRlZmF1bHREYXRlLmdldFRpbWUoKT09cHJpbnREYXRlLmdl dFRpbWUoKSYmZGVmYXVsdERhdGUuZ2V0VGltZSgpPT1zZWxlY3RlZERhdGUuZ2V0 VGltZSgpKT8nICcrdGhpcy5fZGF5T3ZlckNsYXNzOicnKSsKKHVuc2VsZWN0YWJs ZT8nICcrdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MrJyB1aS1zdGF0ZS1kaXNhYmxl ZCc6JycpKwoob3RoZXJNb250aCYmIXNob3dPdGhlck1vbnRocz8nJzonICcrZGF5 U2V0dGluZ3NbMV0rCihwcmludERhdGUuZ2V0VGltZSgpPj1jdXJyZW50RGF0ZS5n ZXRUaW1lKCkmJnByaW50RGF0ZS5nZXRUaW1lKCk8PWVuZERhdGUuZ2V0VGltZSgp PycgJyt0aGlzLl9jdXJyZW50Q2xhc3M6JycpKwoocHJpbnREYXRlLmdldFRpbWUo KT09dG9kYXkuZ2V0VGltZSgpPycgdWktZGF0ZXBpY2tlci10b2RheSc6JycpKSsn IicrCigoIW90aGVyTW9udGh8fHNob3dPdGhlck1vbnRocykmJmRheVNldHRpbmdz WzJdPycgdGl0bGU9IicrZGF5U2V0dGluZ3NbMl0rJyInOicnKSsKKHVuc2VsZWN0 YWJsZT8nJzonIG9uY2xpY2s9IkRQX2pRdWVyeS5kYXRlcGlja2VyLl9zZWxlY3RE YXkoXCcjJysKaW5zdC5pZCsnXCcsJytkcmF3TW9udGgrJywnK2RyYXdZZWFyKycs IHRoaXMpO3JldHVybiBmYWxzZTsiJykrJz4nKwoob3RoZXJNb250aD8oc2hvd090 aGVyTW9udGhzP3ByaW50RGF0ZS5nZXREYXRlKCk6JyYjeGEwOycpOih1bnNlbGVj dGFibGU/JzxzcGFuIGNsYXNzPSJ1aS1zdGF0ZS1kZWZhdWx0Ij4nK3ByaW50RGF0 ZS5nZXREYXRlKCkrJzwvc3Bhbj4nOic8YSBjbGFzcz0idWktc3RhdGUtZGVmYXVs dCcrCihwcmludERhdGUuZ2V0VGltZSgpPT10b2RheS5nZXRUaW1lKCk/JyB1aS1z dGF0ZS1oaWdobGlnaHQnOicnKSsKKHByaW50RGF0ZS5nZXRUaW1lKCk+PWN1cnJl bnREYXRlLmdldFRpbWUoKSYmcHJpbnREYXRlLmdldFRpbWUoKTw9ZW5kRGF0ZS5n ZXRUaW1lKCk/JyB1aS1zdGF0ZS1hY3RpdmUnOicnKSsnIiBocmVmPSIjIj4nK3By aW50RGF0ZS5nZXREYXRlKCkrJzwvYT4nKSkrJzwvdGQ+JztwcmludERhdGUuc2V0 RGF0ZShwcmludERhdGUuZ2V0RGF0ZSgpKzEpO3ByaW50RGF0ZT10aGlzLl9kYXls aWdodFNhdmluZ0FkanVzdChwcmludERhdGUpO30KY2FsZW5kZXIrPXRib2R5Kyc8 L3RyPic7fQpkcmF3TW9udGgrKztpZihkcmF3TW9udGg+MTEpe2RyYXdNb250aD0w O2RyYXdZZWFyKys7fQpjYWxlbmRlcis9JzwvdGJvZHk+PC90YWJsZT4nKyhpc011 bHRpTW9udGg/JzwvZGl2PicrCigobnVtTW9udGhzWzBdPjAmJmNvbD09bnVtTW9u dGhzWzFdLTEpPyc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXJvdy1icmVhayI+ PC9kaXY+JzonJyk6JycpO2dyb3VwKz1jYWxlbmRlcjt9Cmh0bWwrPWdyb3VwO30K aHRtbCs9YnV0dG9uUGFuZWwrKCQuYnJvd3Nlci5tc2llJiZwYXJzZUludCgkLmJy b3dzZXIudmVyc2lvbiwxMCk8NyYmIWluc3QuaW5saW5lPyc8aWZyYW1lIHNyYz0i amF2YXNjcmlwdDpmYWxzZTsiIGNsYXNzPSJ1aS1kYXRlcGlja2VyLWNvdmVyIiBm cmFtZWJvcmRlcj0iMCI+PC9pZnJhbWU+JzonJyk7aW5zdC5fa2V5RXZlbnQ9ZmFs c2U7cmV0dXJuIGh0bWw7fSxfZ2VuZXJhdGVNb250aFllYXJIZWFkZXI6ZnVuY3Rp b24oaW5zdCxkcmF3TW9udGgsZHJhd1llYXIsbWluRGF0ZSxtYXhEYXRlLHNlbGVj dGVkRGF0ZSxzZWNvbmRhcnksbW9udGhOYW1lcyxtb250aE5hbWVzU2hvcnQpe21p bkRhdGU9KGluc3QucmFuZ2VTdGFydCYmbWluRGF0ZSYmc2VsZWN0ZWREYXRlPG1p bkRhdGU/c2VsZWN0ZWREYXRlOm1pbkRhdGUpO3ZhciBjaGFuZ2VNb250aD10aGlz Ll9nZXQoaW5zdCwnY2hhbmdlTW9udGgnKTt2YXIgY2hhbmdlWWVhcj10aGlzLl9n ZXQoaW5zdCwnY2hhbmdlWWVhcicpO3ZhciBzaG93TW9udGhBZnRlclllYXI9dGhp cy5fZ2V0KGluc3QsJ3Nob3dNb250aEFmdGVyWWVhcicpO3ZhciBodG1sPSc8ZGl2 IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXRpdGxlIj4nO3ZhciBtb250aEh0bWw9Jyc7 aWYoc2Vjb25kYXJ5fHwhY2hhbmdlTW9udGgpCm1vbnRoSHRtbCs9JzxzcGFuIGNs YXNzPSJ1aS1kYXRlcGlja2VyLW1vbnRoIj4nK21vbnRoTmFtZXNbZHJhd01vbnRo XSsnPC9zcGFuPiAnO2Vsc2V7dmFyIGluTWluWWVhcj0obWluRGF0ZSYmbWluRGF0 ZS5nZXRGdWxsWWVhcigpPT1kcmF3WWVhcik7dmFyIGluTWF4WWVhcj0obWF4RGF0 ZSYmbWF4RGF0ZS5nZXRGdWxsWWVhcigpPT1kcmF3WWVhcik7bW9udGhIdG1sKz0n PHNlbGVjdCBjbGFzcz0idWktZGF0ZXBpY2tlci1tb250aCIgJysnb25jaGFuZ2U9 IkRQX2pRdWVyeS5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIoXCcjJytpbnN0 LmlkKydcJywgdGhpcywgXCdNXCcpOyIgJysnb25jbGljaz0iRFBfalF1ZXJ5LmRh dGVwaWNrZXIuX2NsaWNrTW9udGhZZWFyKFwnIycraW5zdC5pZCsnXCcpOyInKyc+ Jztmb3IodmFyIG1vbnRoPTA7bW9udGg8MTI7bW9udGgrKyl7aWYoKCFpbk1pblll YXJ8fG1vbnRoPj1taW5EYXRlLmdldE1vbnRoKCkpJiYoIWluTWF4WWVhcnx8bW9u dGg8PW1heERhdGUuZ2V0TW9udGgoKSkpCm1vbnRoSHRtbCs9JzxvcHRpb24gdmFs dWU9IicrbW9udGgrJyInKwoobW9udGg9PWRyYXdNb250aD8nIHNlbGVjdGVkPSJz ZWxlY3RlZCInOicnKSsnPicrbW9udGhOYW1lc1Nob3J0W21vbnRoXSsnPC9vcHRp b24+Jzt9Cm1vbnRoSHRtbCs9Jzwvc2VsZWN0Pic7fQppZighc2hvd01vbnRoQWZ0 ZXJZZWFyKQpodG1sKz1tb250aEh0bWwrKChzZWNvbmRhcnl8fGNoYW5nZU1vbnRo fHxjaGFuZ2VZZWFyKSYmKCEoY2hhbmdlTW9udGgmJmNoYW5nZVllYXIpKT8nJiN4 YTA7JzonJyk7aWYoc2Vjb25kYXJ5fHwhY2hhbmdlWWVhcikKaHRtbCs9JzxzcGFu IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiPicrZHJhd1llYXIrJzwvc3Bhbj4n O2Vsc2V7dmFyIHllYXJzPXRoaXMuX2dldChpbnN0LCd5ZWFyUmFuZ2UnKS5zcGxp dCgnOicpO3ZhciB5ZWFyPTA7dmFyIGVuZFllYXI9MDtpZih5ZWFycy5sZW5ndGgh PTIpe3llYXI9ZHJhd1llYXItMTA7ZW5kWWVhcj1kcmF3WWVhcisxMDt9ZWxzZSBp Zih5ZWFyc1swXS5jaGFyQXQoMCk9PScrJ3x8eWVhcnNbMF0uY2hhckF0KDApPT0n LScpe3llYXI9ZHJhd1llYXIrcGFyc2VJbnQoeWVhcnNbMF0sMTApO2VuZFllYXI9 ZHJhd1llYXIrcGFyc2VJbnQoeWVhcnNbMV0sMTApO31lbHNle3llYXI9cGFyc2VJ bnQoeWVhcnNbMF0sMTApO2VuZFllYXI9cGFyc2VJbnQoeWVhcnNbMV0sMTApO30K eWVhcj0obWluRGF0ZT9NYXRoLm1heCh5ZWFyLG1pbkRhdGUuZ2V0RnVsbFllYXIo KSk6eWVhcik7ZW5kWWVhcj0obWF4RGF0ZT9NYXRoLm1pbihlbmRZZWFyLG1heERh dGUuZ2V0RnVsbFllYXIoKSk6ZW5kWWVhcik7aHRtbCs9JzxzZWxlY3QgY2xhc3M9 InVpLWRhdGVwaWNrZXIteWVhciIgJysnb25jaGFuZ2U9IkRQX2pRdWVyeS5kYXRl cGlja2VyLl9zZWxlY3RNb250aFllYXIoXCcjJytpbnN0LmlkKydcJywgdGhpcywg XCdZXCcpOyIgJysnb25jbGljaz0iRFBfalF1ZXJ5LmRhdGVwaWNrZXIuX2NsaWNr TW9udGhZZWFyKFwnIycraW5zdC5pZCsnXCcpOyInKyc+Jztmb3IoO3llYXI8PWVu ZFllYXI7eWVhcisrKXtodG1sKz0nPG9wdGlvbiB2YWx1ZT0iJyt5ZWFyKyciJysK KHllYXI9PWRyYXdZZWFyPycgc2VsZWN0ZWQ9InNlbGVjdGVkIic6JycpKyc+Jyt5 ZWFyKyc8L29wdGlvbj4nO30KaHRtbCs9Jzwvc2VsZWN0Pic7fQppZihzaG93TW9u dGhBZnRlclllYXIpCmh0bWwrPShzZWNvbmRhcnl8fGNoYW5nZU1vbnRofHxjaGFu Z2VZZWFyPycmI3hhMDsnOicnKSttb250aEh0bWw7aHRtbCs9JzwvZGl2Pic7cmV0 dXJuIGh0bWw7fSxfYWRqdXN0SW5zdERhdGU6ZnVuY3Rpb24oaW5zdCxvZmZzZXQs cGVyaW9kKXt2YXIgeWVhcj1pbnN0LmRyYXdZZWFyKyhwZXJpb2Q9PSdZJz9vZmZz ZXQ6MCk7dmFyIG1vbnRoPWluc3QuZHJhd01vbnRoKyhwZXJpb2Q9PSdNJz9vZmZz ZXQ6MCk7dmFyIGRheT1NYXRoLm1pbihpbnN0LnNlbGVjdGVkRGF5LHRoaXMuX2dl dERheXNJbk1vbnRoKHllYXIsbW9udGgpKSsKKHBlcmlvZD09J0QnP29mZnNldDow KTt2YXIgZGF0ZT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh5 ZWFyLG1vbnRoLGRheSkpO3ZhciBtaW5EYXRlPXRoaXMuX2dldE1pbk1heERhdGUo aW5zdCwnbWluJyx0cnVlKTt2YXIgbWF4RGF0ZT10aGlzLl9nZXRNaW5NYXhEYXRl KGluc3QsJ21heCcpO2RhdGU9KG1pbkRhdGUmJmRhdGU8bWluRGF0ZT9taW5EYXRl OmRhdGUpO2RhdGU9KG1heERhdGUmJmRhdGU+bWF4RGF0ZT9tYXhEYXRlOmRhdGUp O2luc3Quc2VsZWN0ZWREYXk9ZGF0ZS5nZXREYXRlKCk7aW5zdC5kcmF3TW9udGg9 aW5zdC5zZWxlY3RlZE1vbnRoPWRhdGUuZ2V0TW9udGgoKTtpbnN0LmRyYXdZZWFy PWluc3Quc2VsZWN0ZWRZZWFyPWRhdGUuZ2V0RnVsbFllYXIoKTtpZihwZXJpb2Q9 PSdNJ3x8cGVyaW9kPT0nWScpCnRoaXMuX25vdGlmeUNoYW5nZShpbnN0KTt9LF9u b3RpZnlDaGFuZ2U6ZnVuY3Rpb24oaW5zdCl7dmFyIG9uQ2hhbmdlPXRoaXMuX2dl dChpbnN0LCdvbkNoYW5nZU1vbnRoWWVhcicpO2lmKG9uQ2hhbmdlKQpvbkNoYW5n ZS5hcHBseSgoaW5zdC5pbnB1dD9pbnN0LmlucHV0WzBdOm51bGwpLFtpbnN0LnNl bGVjdGVkWWVhcixpbnN0LnNlbGVjdGVkTW9udGgrMSxpbnN0XSk7fSxfZ2V0TnVt YmVyT2ZNb250aHM6ZnVuY3Rpb24oaW5zdCl7dmFyIG51bU1vbnRocz10aGlzLl9n ZXQoaW5zdCwnbnVtYmVyT2ZNb250aHMnKTtyZXR1cm4obnVtTW9udGhzPT1udWxs P1sxLDFdOih0eXBlb2YgbnVtTW9udGhzPT0nbnVtYmVyJz9bMSxudW1Nb250aHNd Om51bU1vbnRocykpO30sX2dldE1pbk1heERhdGU6ZnVuY3Rpb24oaW5zdCxtaW5N YXgsY2hlY2tSYW5nZSl7dmFyIGRhdGU9dGhpcy5fZGV0ZXJtaW5lRGF0ZSh0aGlz Ll9nZXQoaW5zdCxtaW5NYXgrJ0RhdGUnKSxudWxsKTtyZXR1cm4oIWNoZWNrUmFu Z2V8fCFpbnN0LnJhbmdlU3RhcnQ/ZGF0ZTooIWRhdGV8fGluc3QucmFuZ2VTdGFy dD5kYXRlP2luc3QucmFuZ2VTdGFydDpkYXRlKSk7fSxfZ2V0RGF5c0luTW9udGg6 ZnVuY3Rpb24oeWVhcixtb250aCl7cmV0dXJuIDMyLW5ldyBEYXRlKHllYXIsbW9u dGgsMzIpLmdldERhdGUoKTt9LF9nZXRGaXJzdERheU9mTW9udGg6ZnVuY3Rpb24o eWVhcixtb250aCl7cmV0dXJuIG5ldyBEYXRlKHllYXIsbW9udGgsMSkuZ2V0RGF5 KCk7fSxfY2FuQWRqdXN0TW9udGg6ZnVuY3Rpb24oaW5zdCxvZmZzZXQsY3VyWWVh cixjdXJNb250aCl7dmFyIG51bU1vbnRocz10aGlzLl9nZXROdW1iZXJPZk1vbnRo cyhpbnN0KTt2YXIgZGF0ZT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcg RGF0ZShjdXJZZWFyLGN1ck1vbnRoKyhvZmZzZXQ8MD9vZmZzZXQ6bnVtTW9udGhz WzFdKSwxKSk7aWYob2Zmc2V0PDApCmRhdGUuc2V0RGF0ZSh0aGlzLl9nZXREYXlz SW5Nb250aChkYXRlLmdldEZ1bGxZZWFyKCksZGF0ZS5nZXRNb250aCgpKSk7cmV0 dXJuIHRoaXMuX2lzSW5SYW5nZShpbnN0LGRhdGUpO30sX2lzSW5SYW5nZTpmdW5j dGlvbihpbnN0LGRhdGUpe3ZhciBuZXdNaW5EYXRlPSghaW5zdC5yYW5nZVN0YXJ0 P251bGw6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoaW5zdC5z ZWxlY3RlZFllYXIsaW5zdC5zZWxlY3RlZE1vbnRoLGluc3Quc2VsZWN0ZWREYXkp KSk7bmV3TWluRGF0ZT0obmV3TWluRGF0ZSYmaW5zdC5yYW5nZVN0YXJ0PG5ld01p bkRhdGU/aW5zdC5yYW5nZVN0YXJ0Om5ld01pbkRhdGUpO3ZhciBtaW5EYXRlPW5l d01pbkRhdGV8fHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwnbWluJyk7dmFyIG1h eERhdGU9dGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCdtYXgnKTtyZXR1cm4oKCFt aW5EYXRlfHxkYXRlPj1taW5EYXRlKSYmKCFtYXhEYXRlfHxkYXRlPD1tYXhEYXRl KSk7fSxfZ2V0Rm9ybWF0Q29uZmlnOmZ1bmN0aW9uKGluc3Qpe3ZhciBzaG9ydFll YXJDdXRvZmY9dGhpcy5fZ2V0KGluc3QsJ3Nob3J0WWVhckN1dG9mZicpO3Nob3J0 WWVhckN1dG9mZj0odHlwZW9mIHNob3J0WWVhckN1dG9mZiE9J3N0cmluZyc/c2hv cnRZZWFyQ3V0b2ZmOm5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSUxMDArcGFyc2VJ bnQoc2hvcnRZZWFyQ3V0b2ZmLDEwKSk7cmV0dXJue3Nob3J0WWVhckN1dG9mZjpz aG9ydFllYXJDdXRvZmYsZGF5TmFtZXNTaG9ydDp0aGlzLl9nZXQoaW5zdCwnZGF5 TmFtZXNTaG9ydCcpLGRheU5hbWVzOnRoaXMuX2dldChpbnN0LCdkYXlOYW1lcycp LG1vbnRoTmFtZXNTaG9ydDp0aGlzLl9nZXQoaW5zdCwnbW9udGhOYW1lc1Nob3J0 JyksbW9udGhOYW1lczp0aGlzLl9nZXQoaW5zdCwnbW9udGhOYW1lcycpfTt9LF9m b3JtYXREYXRlOmZ1bmN0aW9uKGluc3QsZGF5LG1vbnRoLHllYXIpe2lmKCFkYXkp e2luc3QuY3VycmVudERheT1pbnN0LnNlbGVjdGVkRGF5O2luc3QuY3VycmVudE1v bnRoPWluc3Quc2VsZWN0ZWRNb250aDtpbnN0LmN1cnJlbnRZZWFyPWluc3Quc2Vs ZWN0ZWRZZWFyO30KdmFyIGRhdGU9KGRheT8odHlwZW9mIGRheT09J29iamVjdCc/ ZGF5OnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsbW9u dGgsZGF5KSkpOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGlu c3QuY3VycmVudFllYXIsaW5zdC5jdXJyZW50TW9udGgsaW5zdC5jdXJyZW50RGF5 KSkpO3JldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KGluc3QsJ2RhdGVG b3JtYXQnKSxkYXRlLHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSk7fX0pO2Z1 bmN0aW9uIGV4dGVuZFJlbW92ZSh0YXJnZXQscHJvcHMpeyQuZXh0ZW5kKHRhcmdl dCxwcm9wcyk7Zm9yKHZhciBuYW1lIGluIHByb3BzKQppZihwcm9wc1tuYW1lXT09 bnVsbHx8cHJvcHNbbmFtZV09PXVuZGVmaW5lZCkKdGFyZ2V0W25hbWVdPXByb3Bz W25hbWVdO3JldHVybiB0YXJnZXQ7fTtmdW5jdGlvbiBpc0FycmF5KGEpe3JldHVy bihhJiYoKCQuYnJvd3Nlci5zYWZhcmkmJnR5cGVvZiBhPT0nb2JqZWN0JyYmYS5s ZW5ndGgpfHwoYS5jb25zdHJ1Y3RvciYmYS5jb25zdHJ1Y3Rvci50b1N0cmluZygp Lm1hdGNoKC9cQXJyYXlcKFwpLykpKSk7fTskLmZuLmRhdGVwaWNrZXI9ZnVuY3Rp b24ob3B0aW9ucyl7aWYoISQuZGF0ZXBpY2tlci5pbml0aWFsaXplZCl7JChkb2N1 bWVudCkubW91c2Vkb3duKCQuZGF0ZXBpY2tlci5fY2hlY2tFeHRlcm5hbENsaWNr KS5maW5kKCdib2R5JykuYXBwZW5kKCQuZGF0ZXBpY2tlci5kcERpdik7JC5kYXRl cGlja2VyLmluaXRpYWxpemVkPXRydWU7fQp2YXIgb3RoZXJBcmdzPUFycmF5LnBy b3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtpZih0eXBlb2Ygb3B0aW9u cz09J3N0cmluZycmJihvcHRpb25zPT0naXNEaXNhYmxlZCd8fG9wdGlvbnM9PSdn ZXREYXRlJykpCnJldHVybiAkLmRhdGVwaWNrZXJbJ18nK29wdGlvbnMrJ0RhdGVw aWNrZXInXS5hcHBseSgkLmRhdGVwaWNrZXIsW3RoaXNbMF1dLmNvbmNhdChvdGhl ckFyZ3MpKTtpZihvcHRpb25zPT0nb3B0aW9uJyYmYXJndW1lbnRzLmxlbmd0aD09 MiYmdHlwZW9mIGFyZ3VtZW50c1sxXT09J3N0cmluZycpCnJldHVybiAkLmRhdGVw aWNrZXJbJ18nK29wdGlvbnMrJ0RhdGVwaWNrZXInXS5hcHBseSgkLmRhdGVwaWNr ZXIsW3RoaXNbMF1dLmNvbmNhdChvdGhlckFyZ3MpKTtyZXR1cm4gdGhpcy5lYWNo KGZ1bmN0aW9uKCl7dHlwZW9mIG9wdGlvbnM9PSdzdHJpbmcnPyQuZGF0ZXBpY2tl clsnXycrb3B0aW9ucysnRGF0ZXBpY2tlciddLmFwcGx5KCQuZGF0ZXBpY2tlcixb dGhpc10uY29uY2F0KG90aGVyQXJncykpOiQuZGF0ZXBpY2tlci5fYXR0YWNoRGF0 ZXBpY2tlcih0aGlzLG9wdGlvbnMpO30pO307JC5kYXRlcGlja2VyPW5ldyBEYXRl cGlja2VyKCk7JC5kYXRlcGlja2VyLmluaXRpYWxpemVkPWZhbHNlOyQuZGF0ZXBp Y2tlci51dWlkPW5ldyBEYXRlKCkuZ2V0VGltZSgpOyQuZGF0ZXBpY2tlci52ZXJz aW9uPSIxLjcuMiI7d2luZG93LkRQX2pRdWVyeT0kO30pKGpRdWVyeSk7aWYoIWdN c2cpdmFyIGdNc2c9e307ZnVuY3Rpb24gbG9hZEdNKG1zZ1NldCl7Zm9yKHZhciBp IGluIG1zZ1NldCl7Z01zZ1tpXT1tc2dTZXRbaV07fX0KZnVuY3Rpb24gZ00oa2V5 LGFyZ3Mpe3ZhciBtcz0nJztpZihrZXkgaW4gZ01zZyl7bXM9Z01zZ1trZXldO2lm KHR5cGVvZiBhcmdzPT0nb2JqZWN0J3x8dHlwZW9mIGFyZ3M9PSdhcnJheScpe2Zv cih2YXIgdiBpbiBhcmdzKXt2YXIgcmVwPSdcJCcrKHBhcnNlSW50KHYpKzEpO21z PW1zLnJlcGxhY2UocmVwLGFyZ3Nbdl0pO319ZWxzZSBpZih0eXBlb2YgYXJncz09 J3N0cmluZyd8fHR5cGVvZiBhcmdzPT0nbnVtYmVyJyl7bXM9bXMucmVwbGFjZSgv XCQxLyxhcmdzKTt9CnJldHVybiBtczt9ZWxzZXtyZXR1cm4nWycra2V5KyddJzt9 fQokaj1qUXVlcnkubm9Db25mbGljdCgpO2Z1bmN0aW9uIGpzMkFkZE9ubG9hZEhv b2soZnVuYyl7JGooZG9jdW1lbnQpLnJlYWR5KGZ1bmMpO30KbXZKc0xvYWRlcj17 ZG9Mb2FkOmZ1bmN0aW9uKGRlcHMsY2FsbGJhY2spe2NhbGxiYWNrKCk7fX07 ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=plugins.combined.min.js Content-Type: application/x-javascript; name=plugins.combined.min.js Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/js/plugins.combined.min.js?68 Content-Transfer-Encoding: Base64 CihmdW5jdGlvbigkKXskLndoaWxlQXN5bmM9ZnVuY3Rpb24ob3B0cykKe3ZhciBk ZWxheT1NYXRoLmFicyhvcHRzLmRlbGF5KXx8MTAsYnVsaz1pc05hTihvcHRzLmJ1 bGspPzUwMDpNYXRoLmFicyhvcHRzLmJ1bGspLHRlc3Q9b3B0cy50ZXN0fHxmdW5j dGlvbigpe3JldHVybiB0cnVlO30sbG9vcD1vcHRzLmxvb3B8fGZ1bmN0aW9uKCl7 fSxlbmQ9b3B0cy5lbmR8fGZ1bmN0aW9uKCl7fTsoZnVuY3Rpb24oKXt2YXIgdD1m YWxzZSxiZWdpbj1uZXcgRGF0ZSgpO3doaWxlKHQ9dGVzdCgpKQp7bG9vcCgpO2lm KGJ1bGs9PT0wfHwobmV3IERhdGUoKS1iZWdpbik+YnVsaykKe2JyZWFrO319Cmlm KHQpCntzZXRUaW1lb3V0KGFyZ3VtZW50cy5jYWxsZWUsZGVsYXkpO30KZWxzZQp7 ZW5kKCk7fX0pKCk7fQokLmVhY2hBc3luYz1mdW5jdGlvbihhcnJheSxvcHRzKQp7 dmFyIGk9MCxsPWFycmF5Lmxlbmd0aCxsb29wPW9wdHMubG9vcHx8ZnVuY3Rpb24o KXt9OyQud2hpbGVBc3luYygkLmV4dGVuZChvcHRzLHt0ZXN0OmZ1bmN0aW9uKCl7 cmV0dXJuIGk8bDt9LGxvb3A6ZnVuY3Rpb24oKQp7dmFyIHZhbD1hcnJheVtpXTty ZXR1cm4gbG9vcC5jYWxsKHZhbCxpKyssdmFsKTt9fSkpO30KJC5mbi5lYWNoQXN5 bmM9ZnVuY3Rpb24ob3B0cykKeyQuZWFjaEFzeW5jKHRoaXMsb3B0cyk7cmV0dXJu IHRoaXM7fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKCQpeyQuZm4uYXV0b0VsbGlwc2U9 ZnVuY3Rpb24ob3B0aW9ucyl7JCh0aGlzKS5lYWNoKGZ1bmN0aW9uKCl7b3B0aW9u cz0kLmV4dGVuZCh7J3Bvc2l0aW9uJzonY2VudGVyJywndG9vbHRpcCc6ZmFsc2V9 LG9wdGlvbnMpO3ZhciB0ZXh0PSQodGhpcykudGV4dCgpO3ZhciAkdGV4dD0kKCc8 c3BhbiAvPicpLnRleHQodGV4dCkuY3NzKCd3aGl0ZVNwYWNlJywnbm93cmFwJyk7 JCh0aGlzKS5lbXB0eSgpLmFwcGVuZCgkdGV4dCk7aWYoJHRleHQud2lkdGgoKT4k KHRoaXMpLndpZHRoKCkpe3N3aXRjaChvcHRpb25zLnBvc2l0aW9uKXtjYXNlJ3Jp Z2h0Jzp2YXIgbD0wLHI9dGV4dC5sZW5ndGg7ZG97dmFyIG09TWF0aC5jZWlsKChs K3IpLzIpOyR0ZXh0LnRleHQodGV4dC5zdWJzdHIoMCxtKSsnLi4uJyk7aWYoJHRl eHQud2lkdGgoKT4kKHRoaXMpLndpZHRoKCkpe3I9bS0xO31lbHNle2w9bTt9fXdo aWxlKGw8cik7JHRleHQudGV4dCh0ZXh0LnN1YnN0cigwLGwpKycuLi4nKTticmVh aztjYXNlJ2NlbnRlcic6dmFyIGk9W01hdGgucm91bmQodGV4dC5sZW5ndGgvMiks TWF0aC5yb3VuZCh0ZXh0Lmxlbmd0aC8yKV07dmFyIHNpZGU9MTt3aGlsZSgkdGV4 dC5vdXRlcldpZHRoKCk+KCQodGhpcykud2lkdGgoKSkmJmlbMF0+MCl7JHRleHQu dGV4dCh0ZXh0LnN1YnN0cigwLGlbMF0pKycuLi4nK3RleHQuc3Vic3RyKGlbMV0p KTtpZihzaWRlPT0wKXtpWzBdLS07c2lkZT0xO31lbHNle2lbMV0rKztzaWRlPTA7 fX0KYnJlYWs7Y2FzZSdsZWZ0Jzp2YXIgcj0wO3doaWxlKCR0ZXh0Lm91dGVyV2lk dGgoKT4kKHRoaXMpLndpZHRoKCkmJnI8dGV4dC5sZW5ndGgpeyR0ZXh0LnRleHQo Jy4uLicrdGV4dC5zdWJzdHIocikpO3IrKzt9CmJyZWFrO30KaWYob3B0aW9ucy50 b29sdGlwKQokdGV4dC5hdHRyKCd0aXRsZScsdGV4dCk7fX0pO307fSkoalF1ZXJ5 KTsoZnVuY3Rpb24oJCl7JC5icm93c2VyVGVzdD1mdW5jdGlvbihhLHope3ZhciB1 PSd1bmtub3duJyx4PSdYJyxtPWZ1bmN0aW9uKHIsaCl7Zm9yKHZhciBpPTA7aTxo Lmxlbmd0aDtpPWkrMSl7cj1yLnJlcGxhY2UoaFtpXVswXSxoW2ldWzFdKTt9CnJl dHVybiByO30sYz1mdW5jdGlvbihpLGEsYixjKXt2YXIgcj17bmFtZTptKChhLmV4 ZWMoaSl8fFt1LHVdKVsxXSxiKX07cltyLm5hbWVdPXRydWU7ci52ZXJzaW9uPShj LmV4ZWMoaSl8fFt4LHgseCx4XSlbM107aWYoci5uYW1lLm1hdGNoKC9zYWZhcmkv KSYmci52ZXJzaW9uPjQwMCl7ci52ZXJzaW9uPScyLjAnO30KaWYoci5uYW1lPT09 J3ByZXN0bycpe3IudmVyc2lvbj0oJC5icm93c2VyLnZlcnNpb24+OS4yNyk/J2Z1 dGhhcmsnOidsaW5lYXJfYic7fQpyLnZlcnNpb25OdW1iZXI9cGFyc2VGbG9hdChy LnZlcnNpb24sMTApfHwwO3IudmVyc2lvblg9KHIudmVyc2lvbiE9PXgpPyhyLnZl cnNpb24rJycpLnN1YnN0cigwLDEpOng7ci5jbGFzc05hbWU9ci5uYW1lK3IudmVy c2lvblg7cmV0dXJuIHI7fTthPShhLm1hdGNoKC9PcGVyYXxOYXZpZ2F0b3J8TWlu ZWZpZWxkfEtIVE1MfENocm9tZS8pP20oYSxbWy8oRmlyZWZveHxNU0lFfEtIVE1M LFxzbGlrZVxzR2Vja298S29ucXVlcm9yKS8sJyddLFsnQ2hyb21lIFNhZmFyaScs J0Nocm9tZSddLFsnS0hUTUwnLCdLb25xdWVyb3InXSxbJ01pbmVmaWVsZCcsJ0Zp cmVmb3gnXSxbJ05hdmlnYXRvcicsJ05ldHNjYXBlJ11dKTphKS50b0xvd2VyQ2Fz ZSgpOyQuYnJvd3Nlcj0kLmV4dGVuZCgoIXopPyQuYnJvd3Nlcjp7fSxjKGEsLyhj YW1pbm98Y2hyb21lfGZpcmVmb3h8bmV0c2NhcGV8a29ucXVlcm9yfGx5bnh8bXNp ZXxvcGVyYXxzYWZhcmkpLyxbXSwvKGNhbWlub3xjaHJvbWV8ZmlyZWZveHxuZXRz Y2FwZXxuZXRzY2FwZTZ8b3BlcmF8dmVyc2lvbnxrb25xdWVyb3J8bHlueHxtc2ll fHNhZmFyaSkoXC98XHMpKFthLXowLTlcLlwrXSo/KShcO3xkZXZ8cmVsfFxzfCQp LykpOyQubGF5b3V0PWMoYSwvKGdlY2tvfGtvbnF1ZXJvcnxtc2llfG9wZXJhfHdl YmtpdCkvLFtbJ2tvbnF1ZXJvcicsJ2todG1sJ10sWydtc2llJywndHJpZGVudCdd LFsnb3BlcmEnLCdwcmVzdG8nXV0sLyhhcHBsZXdlYmtpdHxydnxrb25xdWVyb3J8 bXNpZSkoXDp8XC98XHMpKFthLXowLTlcLl0qPykoXDt8XCl8XHMpLyk7JC5vcz17 bmFtZTooLyh3aW58bWFjfGxpbnV4fHN1bm9zfHNvbGFyaXN8aXBob25lKS8uZXhl YyhuYXZpZ2F0b3IucGxhdGZvcm0udG9Mb3dlckNhc2UoKSl8fFt1XSlbMF0ucmVw bGFjZSgnc3Vub3MnLCdzb2xhcmlzJyl9O2lmKCF6KXskKCdodG1sJykuYWRkQ2xh c3MoWyQub3MubmFtZSwkLmJyb3dzZXIubmFtZSwkLmJyb3dzZXIuY2xhc3NOYW1l LCQubGF5b3V0Lm5hbWUsJC5sYXlvdXQuY2xhc3NOYW1lXS5qb2luKCcgJykpO319 OyQuYnJvd3NlclRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7fSkoalF1ZXJ5KTso ZnVuY3Rpb24oJCl7JC5mbi5jb2xsYXBzaWJsZVRhYnM9ZnVuY3Rpb24oJCRvcHRp b25zKXtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7dmFyICRzZXR0aW5ncz0k LmV4dGVuZCh7fSwkLmNvbGxhcHNpYmxlVGFicy5kZWZhdWx0cywkJG9wdGlvbnMp O3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciAkdGhpcz0kKHRoaXMpOyQuY29sbGFw c2libGVUYWJzLmluc3RhbmNlcz0oJC5jb2xsYXBzaWJsZVRhYnMuaW5zdGFuY2Vz Lmxlbmd0aD09MD8kdGhpczokLmNvbGxhcHNpYmxlVGFicy5pbnN0YW5jZXMuYWRk KCR0aGlzKSk7JHRoaXMuZGF0YSgnY29sbGFwc2libGVUYWJzU2V0dGluZ3MnLCRz ZXR0aW5ncyk7JHRoaXMuY2hpbGRyZW4oJHNldHRpbmdzLmNvbGxhcHNpYmxlKS5l YWNoKGZ1bmN0aW9uKCl7dmFyICRjb2xsYXBzaWJsZT0kKHRoaXMpOyRjb2xsYXBz aWJsZS5kYXRhKCdjb2xsYXBzaWJsZVRhYnNTZXR0aW5ncycseydleHBhbmRlZENv bnRhaW5lcic6JHNldHRpbmdzLmV4cGFuZGVkQ29udGFpbmVyLCdjb2xsYXBzZWRD b250YWluZXInOiRzZXR0aW5ncy5jb2xsYXBzZWRDb250YWluZXIsJ2V4cGFuZGVk V2lkdGgnOiRjb2xsYXBzaWJsZS53aWR0aCgpLCdwcmV2RWxlbWVudCc6JGNvbGxh cHNpYmxlLnByZXYoKX0pO30pO30pO2lmKCEkLmNvbGxhcHNpYmxlVGFicy5ib3Vu ZEV2ZW50KSQod2luZG93KS5kZWxheWVkQmluZCgnNTAwJywncmVzaXplJyxmdW5j dGlvbigpeyQuY29sbGFwc2libGVUYWJzLmhhbmRsZVJlc2l6ZSgpO30pOyQuY29s bGFwc2libGVUYWJzLmhhbmRsZVJlc2l6ZSgpO3JldHVybiB0aGlzO307JC5jb2xs YXBzaWJsZVRhYnM9e2luc3RhbmNlczpbXSxib3VuZEV2ZW50Om51bGwsZGVmYXVs dHM6e2V4cGFuZGVkQ29udGFpbmVyOicjcC12aWV3cyB1bCcsY29sbGFwc2VkQ29u dGFpbmVyOicjcC1jYWN0aW9ucyB1bCcsY29sbGFwc2libGU6J2xpLmNvbGxhcHNp YmxlJyxzaGlmdGluZzpmYWxzZSxleHBhbmRDb25kaXRpb246ZnVuY3Rpb24oZWxl V2lkdGgpe3JldHVybigkKCcjbGVmdC1uYXZpZ2F0aW9uJykucG9zaXRpb24oKS5s ZWZ0KyQoJyNsZWZ0LW5hdmlnYXRpb24nKS53aWR0aCgpKTwoJCgnI3JpZ2h0LW5h dmlnYXRpb24nKS5wb3NpdGlvbigpLmxlZnQtZWxlV2lkdGgpO30sY29sbGFwc2VD b25kaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4oJCgnI2xlZnQtbmF2aWdhdGlvbicp LnBvc2l0aW9uKCkubGVmdCskKCcjbGVmdC1uYXZpZ2F0aW9uJykud2lkdGgoKSk+ JCgnI3JpZ2h0LW5hdmlnYXRpb24nKS5wb3NpdGlvbigpLmxlZnQ7fX0saGFuZGxl UmVzaXplOmZ1bmN0aW9uKGUpeyQuY29sbGFwc2libGVUYWJzLmluc3RhbmNlcy5l YWNoKGZ1bmN0aW9uKCl7dmFyICR0aGlzPSQodGhpcyksZGF0YT0kdGhpcy5kYXRh KCdjb2xsYXBzaWJsZVRhYnNTZXR0aW5ncycpO2lmKGRhdGEuc2hpZnRpbmcpcmV0 dXJuO2lmKCR0aGlzLmNoaWxkcmVuKGRhdGEuY29sbGFwc2libGUpLmxlbmd0aD4w JiZkYXRhLmNvbGxhcHNlQ29uZGl0aW9uKCkpeyR0aGlzLnRyaWdnZXIoImJlZm9y ZVRhYkNvbGxhcHNlIik7JC5jb2xsYXBzaWJsZVRhYnMubW92ZVRvQ29sbGFwc2Vk KCR0aGlzLmNoaWxkcmVuKGRhdGEuY29sbGFwc2libGUrJzpsYXN0JykpO30KaWYo JChkYXRhLmNvbGxhcHNlZENvbnRhaW5lcisnICcrZGF0YS5jb2xsYXBzaWJsZSku bGVuZ3RoPjAmJmRhdGEuZXhwYW5kQ29uZGl0aW9uKCQoZGF0YS5jb2xsYXBzZWRD b250YWluZXIpLmNoaWxkcmVuKGRhdGEuY29sbGFwc2libGUrIjpmaXJzdCIpLmRh dGEoJ2NvbGxhcHNpYmxlVGFic1NldHRpbmdzJykuZXhwYW5kZWRXaWR0aCkpeyR0 aGlzLnRyaWdnZXIoImJlZm9yZVRhYkV4cGFuZCIpOyQuY29sbGFwc2libGVUYWJz Lm1vdmVUb0V4cGFuZGVkKGRhdGEuY29sbGFwc2VkQ29udGFpbmVyKyIgIitkYXRh LmNvbGxhcHNpYmxlKyc6Zmlyc3QnKTt9fSk7fSxtb3ZlVG9Db2xsYXBzZWQ6ZnVu Y3Rpb24oZWxlKXt2YXIgJG1vdmluZz0kKGVsZSk7dmFyIGRhdGE9JG1vdmluZy5k YXRhKCdjb2xsYXBzaWJsZVRhYnNTZXR0aW5ncycpOyQoZGF0YS5leHBhbmRlZENv bnRhaW5lcikuZGF0YSgnY29sbGFwc2libGVUYWJzU2V0dGluZ3MnKS5zaGlmdGlu Zz10cnVlOyRtb3ZpbmcucmVtb3ZlKCkucHJlcGVuZFRvKGRhdGEuY29sbGFwc2Vk Q29udGFpbmVyKS5kYXRhKCdjb2xsYXBzaWJsZVRhYnNTZXR0aW5ncycsZGF0YSk7 JChkYXRhLmV4cGFuZGVkQ29udGFpbmVyKS5kYXRhKCdjb2xsYXBzaWJsZVRhYnNT ZXR0aW5ncycpLnNoaWZ0aW5nPWZhbHNlOyQuY29sbGFwc2libGVUYWJzLmhhbmRs ZVJlc2l6ZSgpO30sbW92ZVRvRXhwYW5kZWQ6ZnVuY3Rpb24oZWxlKXt2YXIgJG1v dmluZz0kKGVsZSk7dmFyIGRhdGE9JG1vdmluZy5kYXRhKCdjb2xsYXBzaWJsZVRh YnNTZXR0aW5ncycpOyQoZGF0YS5leHBhbmRlZENvbnRhaW5lcikuZGF0YSgnY29s bGFwc2libGVUYWJzU2V0dGluZ3MnKS5zaGlmdGluZz10cnVlOyRtb3ZpbmcucmVt b3ZlKCkuaW5zZXJ0QWZ0ZXIoZGF0YS5wcmV2RWxlbWVudCkuZGF0YSgnY29sbGFw c2libGVUYWJzU2V0dGluZ3MnLGRhdGEpOyQoZGF0YS5leHBhbmRlZENvbnRhaW5l cikuZGF0YSgnY29sbGFwc2libGVUYWJzU2V0dGluZ3MnKS5zaGlmdGluZz1mYWxz ZTskLmNvbGxhcHNpYmxlVGFicy5oYW5kbGVSZXNpemUoKTt9fTt9KShqUXVlcnkp O2pRdWVyeS5jb29raWU9ZnVuY3Rpb24obmFtZSx2YWx1ZSxvcHRpb25zKXtpZih0 eXBlb2YgdmFsdWUhPSd1bmRlZmluZWQnKXtvcHRpb25zPW9wdGlvbnN8fHt9O2lm KHZhbHVlPT09bnVsbCl7dmFsdWU9Jyc7b3B0aW9ucy5leHBpcmVzPS0xO30KdmFy IGV4cGlyZXM9Jyc7aWYob3B0aW9ucy5leHBpcmVzJiYodHlwZW9mIG9wdGlvbnMu ZXhwaXJlcz09J251bWJlcid8fG9wdGlvbnMuZXhwaXJlcy50b1VUQ1N0cmluZykp e3ZhciBkYXRlO2lmKHR5cGVvZiBvcHRpb25zLmV4cGlyZXM9PSdudW1iZXInKXtk YXRlPW5ldyBEYXRlKCk7ZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpKyhvcHRp b25zLmV4cGlyZXMqMjQqNjAqNjAqMTAwMCkpO31lbHNle2RhdGU9b3B0aW9ucy5l eHBpcmVzO30KZXhwaXJlcz0nOyBleHBpcmVzPScrZGF0ZS50b1VUQ1N0cmluZygp O30KdmFyIHBhdGg9b3B0aW9ucy5wYXRoPyc7IHBhdGg9Jysob3B0aW9ucy5wYXRo KTonJzt2YXIgZG9tYWluPW9wdGlvbnMuZG9tYWluPyc7IGRvbWFpbj0nKyhvcHRp b25zLmRvbWFpbik6Jyc7dmFyIHNlY3VyZT1vcHRpb25zLnNlY3VyZT8nOyBzZWN1 cmUnOicnO2RvY3VtZW50LmNvb2tpZT1bbmFtZSwnPScsZW5jb2RlVVJJQ29tcG9u ZW50KHZhbHVlKSxleHBpcmVzLHBhdGgsZG9tYWluLHNlY3VyZV0uam9pbignJyk7 fWVsc2V7dmFyIGNvb2tpZVZhbHVlPW51bGw7aWYoZG9jdW1lbnQuY29va2llJiZk b2N1bWVudC5jb29raWUhPScnKXt2YXIgY29va2llcz1kb2N1bWVudC5jb29raWUu c3BsaXQoJzsnKTtmb3IodmFyIGk9MDtpPGNvb2tpZXMubGVuZ3RoO2krKyl7dmFy IGNvb2tpZT1qUXVlcnkudHJpbShjb29raWVzW2ldKTtpZihjb29raWUuc3Vic3Ry aW5nKDAsbmFtZS5sZW5ndGgrMSk9PShuYW1lKyc9Jykpe2Nvb2tpZVZhbHVlPWRl Y29kZVVSSUNvbXBvbmVudChjb29raWUuc3Vic3RyaW5nKG5hbWUubGVuZ3RoKzEp KTticmVhazt9fX0KcmV0dXJuIGNvb2tpZVZhbHVlO319OyhmdW5jdGlvbigkKXtm dW5jdGlvbiBlbmNvZGVFdmVudChldmVudCl7cmV0dXJuIGV2ZW50LnJlcGxhY2Uo Ly0vZywnLS0nKS5yZXBsYWNlKC8gL2csJy0nKTt9CiQuZm4uZXh0ZW5kKHtkZWxh eWVkQmluZDpmdW5jdGlvbih0aW1lb3V0LGV2ZW50LGRhdGEsY2FsbGJhY2spe3Zh ciBlbmNFdmVudD1lbmNvZGVFdmVudChldmVudCk7cmV0dXJuIHRoaXMuZWFjaChm dW5jdGlvbigpe3ZhciB0aGF0PXRoaXM7aWYoISgkKHRoaXMpLmRhdGEoJ19kZWxh eWVkQmluZEJvdW5kLScrZW5jRXZlbnQrJy0nK3RpbWVvdXQpKSl7JCh0aGlzKS5k YXRhKCdfZGVsYXllZEJpbmRCb3VuZC0nK2VuY0V2ZW50KyctJyt0aW1lb3V0LHRy dWUpOyQodGhpcykuYmluZChldmVudCxmdW5jdGlvbigpe3ZhciB0aW1lcklEPSQo dGhpcykuZGF0YSgnX2RlbGF5ZWRCaW5kVGltZXJJRC0nK2VuY0V2ZW50KyctJyt0 aW1lb3V0KTtpZih0eXBlb2YgdGltZXJJRCE9J3VuZGVmaW5lZCcpCmNsZWFyVGlt ZW91dCh0aW1lcklEKTt0aW1lcklEPXNldFRpbWVvdXQoZnVuY3Rpb24oKXskKHRo YXQpLnRyaWdnZXIoJ19kZWxheWVkQmluZC0nK2VuY0V2ZW50KyctJyt0aW1lb3V0 KTt9LHRpbWVvdXQpOyQodGhpcykuZGF0YSgnX2RlbGF5ZWRCaW5kVGltZXJJRC0n K2VuY0V2ZW50KyctJyt0aW1lb3V0LHRpbWVySUQpO30pO30KJCh0aGlzKS5iaW5k KCdfZGVsYXllZEJpbmQtJytlbmNFdmVudCsnLScrdGltZW91dCxkYXRhLGNhbGxi YWNrKTt9KTt9LGRlbGF5ZWRCaW5kQ2FuY2VsOmZ1bmN0aW9uKHRpbWVvdXQsZXZl bnQpe3ZhciBlbmNFdmVudD1lbmNvZGVFdmVudChldmVudCk7cmV0dXJuIHRoaXMu ZWFjaChmdW5jdGlvbigpe3ZhciB0aW1lcklEPSQodGhpcykuZGF0YSgnX2RlbGF5 ZWRCaW5kVGltZXJJRC0nK2VuY0V2ZW50KyctJyt0aW1lb3V0KTtpZih0eXBlb2Yg dGltZXJJRCE9J3VuZGVmaW5lZCcpCmNsZWFyVGltZW91dCh0aW1lcklEKTt9KTt9 LGRlbGF5ZWRCaW5kVW5iaW5kOmZ1bmN0aW9uKHRpbWVvdXQsZXZlbnQsY2FsbGJh Y2spe3ZhciBlbmNFdmVudD1lbmNvZGVFdmVudChldmVudCk7cmV0dXJuIHRoaXMu ZWFjaChmdW5jdGlvbigpeyQodGhpcykudW5iaW5kKCdfZGVsYXllZEJpbmQtJytl bmNFdmVudCsnLScrdGltZW91dCxjYWxsYmFjayk7fSk7fX0pO30pKGpRdWVyeSk7 KGZ1bmN0aW9uKCQpeyQuZm4ubmFtZXNwYWNlU2VsZWN0b3I9ZnVuY3Rpb24oZGVm YXVsdE5TKXtpZih0eXBlb2YgZGVmYXVsdE5TPT0ndW5kZWZpbmVkJykKZGVmYXVs dE5TPTA7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2Zvcih2YXIgaWQgaW4g d2dGb3JtYXR0ZWROYW1lc3BhY2VzKXt2YXIgb3B0PSQoJzxvcHRpb24gLz4nKS5h dHRyKCd2YWx1ZScsaWQpLnRleHQod2dGb3JtYXR0ZWROYW1lc3BhY2VzW2lkXSk7 aWYoaWQ9PWRlZmF1bHROUykKb3B0LmF0dHIoJ3NlbGVjdGVkJywnc2VsZWN0ZWQn KTtvcHQuYXBwZW5kVG8oJCh0aGlzKSk7fX0pO307fSkoalF1ZXJ5KTsoZnVuY3Rp b24oJCl7JC5zdWdnZXN0aW9ucz17Y2FuY2VsOmZ1bmN0aW9uKGNvbnRleHQpe2lm KGNvbnRleHQuZGF0YS50aW1lcklEIT1udWxsKXtjbGVhclRpbWVvdXQoY29udGV4 dC5kYXRhLnRpbWVySUQpO30KaWYodHlwZW9mIGNvbnRleHQuY29uZmlnLmNhbmNl bD09J2Z1bmN0aW9uJyl7Y29udGV4dC5jb25maWcuY2FuY2VsLmNhbGwoY29udGV4 dC5kYXRhLiR0ZXh0Ym94KTt9fSxyZXN0b3JlOmZ1bmN0aW9uKGNvbnRleHQpe2Nv bnRleHQuZGF0YS4kdGV4dGJveC52YWwoY29udGV4dC5kYXRhLnByZXZUZXh0KTt9 LHVwZGF0ZTpmdW5jdGlvbihjb250ZXh0LGRlbGF5ZWQpe2Z1bmN0aW9uIG1heWJl RmV0Y2goKXtpZihjb250ZXh0LmRhdGEuJHRleHRib3gudmFsKCkhPT1jb250ZXh0 LmRhdGEucHJldlRleHQpe2NvbnRleHQuZGF0YS5wcmV2VGV4dD1jb250ZXh0LmRh dGEuJHRleHRib3gudmFsKCk7aWYodHlwZW9mIGNvbnRleHQuY29uZmlnLmZldGNo PT0nZnVuY3Rpb24nKXtjb250ZXh0LmNvbmZpZy5mZXRjaC5jYWxsKGNvbnRleHQu ZGF0YS4kdGV4dGJveCxjb250ZXh0LmRhdGEuJHRleHRib3gudmFsKCkpO319fQpp Zihjb250ZXh0LmRhdGEudGltZXJJRCE9bnVsbCl7Y2xlYXJUaW1lb3V0KGNvbnRl eHQuZGF0YS50aW1lcklEKTt9CmlmKGRlbGF5ZWQpe2NvbnRleHQuZGF0YS50aW1l cklEPXNldFRpbWVvdXQobWF5YmVGZXRjaCxjb250ZXh0LmNvbmZpZy5kZWxheSk7 fWVsc2V7bWF5YmVGZXRjaCgpO30KJC5zdWdnZXN0aW9ucy5zcGVjaWFsKGNvbnRl eHQpO30sc3BlY2lhbDpmdW5jdGlvbihjb250ZXh0KXtpZih0eXBlb2YgY29udGV4 dC5jb25maWcuc3BlY2lhbC5yZW5kZXI9PSdmdW5jdGlvbicpe3NldFRpbWVvdXQo ZnVuY3Rpb24oKXskc3BlY2lhbD1jb250ZXh0LmRhdGEuJGNvbnRhaW5lci5maW5k KCcuc3VnZ2VzdGlvbnMtc3BlY2lhbCcpO2NvbnRleHQuY29uZmlnLnNwZWNpYWwu cmVuZGVyLmNhbGwoJHNwZWNpYWwsY29udGV4dC5kYXRhLiR0ZXh0Ym94LnZhbCgp KTt9LDEpO319LGNvbmZpZ3VyZTpmdW5jdGlvbihjb250ZXh0LHByb3BlcnR5LHZh bHVlKXtzd2l0Y2gocHJvcGVydHkpe2Nhc2UnZmV0Y2gnOmNhc2UnY2FuY2VsJzpj YXNlJ3NwZWNpYWwnOmNhc2UncmVzdWx0JzpjYXNlJyRyZWdpb24nOmNvbnRleHQu Y29uZmlnW3Byb3BlcnR5XT12YWx1ZTticmVhaztjYXNlJ3N1Z2dlc3Rpb25zJzpj b250ZXh0LmNvbmZpZ1twcm9wZXJ0eV09dmFsdWU7aWYodHlwZW9mIGNvbnRleHQu ZGF0YSE9PSd1bmRlZmluZWQnKXtpZihjb250ZXh0LmNvbmZpZy5zdWdnZXN0aW9u cy5sZW5ndGg9PTApe2NvbnRleHQuZGF0YS4kY29udGFpbmVyLmhpZGUoKTt9ZWxz ZXtjb250ZXh0LmRhdGEuJGNvbnRhaW5lci5zaG93KCk7Y29udGV4dC5kYXRhLiRj b250YWluZXIuY3NzKHsndG9wJzpjb250ZXh0LmNvbmZpZy4kcmVnaW9uLm9mZnNl dCgpLnRvcCtjb250ZXh0LmNvbmZpZy4kcmVnaW9uLm91dGVySGVpZ2h0KCksJ2Jv dHRvbSc6J2F1dG8nLCd3aWR0aCc6Y29udGV4dC5jb25maWcuJHJlZ2lvbi5vdXRl cldpZHRoKCksJ2hlaWdodCc6J2F1dG8nLCdsZWZ0Jzpjb250ZXh0LmNvbmZpZy4k cmVnaW9uLm9mZnNldCgpLmxlZnQsJ3JpZ2h0JzonYXV0byd9KTt2YXIgJHJlc3Vs dHM9Y29udGV4dC5kYXRhLiRjb250YWluZXIuY2hpbGRyZW4oJy5zdWdnZXN0aW9u cy1yZXN1bHRzJyk7JHJlc3VsdHMuZW1wdHkoKTtmb3IodmFyIGk9MDtpPGNvbnRl eHQuY29uZmlnLnN1Z2dlc3Rpb25zLmxlbmd0aDtpKyspeyRyZXN1bHQ9JCgnPGRp diAvPicpLmFkZENsYXNzKCdzdWdnZXN0aW9ucy1yZXN1bHQnKS5hdHRyKCdyZWwn LGkpLmRhdGEoJ3RleHQnLGNvbnRleHQuY29uZmlnLnN1Z2dlc3Rpb25zW2ldKS5h cHBlbmRUbygkcmVzdWx0cyk7aWYodHlwZW9mIGNvbnRleHQuY29uZmlnLnJlc3Vs dC5yZW5kZXI9PSdmdW5jdGlvbicpe2NvbnRleHQuY29uZmlnLnJlc3VsdC5yZW5k ZXIuY2FsbCgkcmVzdWx0LGNvbnRleHQuY29uZmlnLnN1Z2dlc3Rpb25zW2ldKTt9 ZWxzZXskcmVzdWx0LnRleHQoY29udGV4dC5jb25maWcuc3VnZ2VzdGlvbnNbaV0p LmF1dG9FbGxpcHNlKCk7fX19fQpicmVhaztjYXNlJ21heFJvd3MnOmNvbnRleHQu Y29uZmlnW3Byb3BlcnR5XT1NYXRoLm1heCgxLE1hdGgubWluKDEwMCx2YWx1ZSkp O2JyZWFrO2Nhc2UnZGVsYXknOmNvbnRleHQuY29uZmlnW3Byb3BlcnR5XT1NYXRo Lm1heCgwLE1hdGgubWluKDEyMDAwLHZhbHVlKSk7YnJlYWs7Y2FzZSdzdWJtaXRP bkNsaWNrJzpjb250ZXh0LmNvbmZpZ1twcm9wZXJ0eV09dmFsdWU/dHJ1ZTpmYWxz ZTticmVhazt9fSxoaWdobGlnaHQ6ZnVuY3Rpb24oY29udGV4dCxyZXN1bHQsdXBk YXRlVGV4dGJveCl7dmFyIHNlbGVjdGVkPWNvbnRleHQuZGF0YS4kY29udGFpbmVy LmZpbmQoJy5zdWdnZXN0aW9ucy1yZXN1bHQtY3VycmVudCcpO2lmKCFyZXN1bHQu Z2V0fHxzZWxlY3RlZC5nZXQoMCkhPXJlc3VsdC5nZXQoMCkpe2lmKHJlc3VsdD09 J3ByZXYnKXtyZXN1bHQ9c2VsZWN0ZWQucHJldigpO31lbHNlIGlmKHJlc3VsdD09 J25leHQnKXtpZihzZWxlY3RlZC5zaXplKCk9PTApCnJlc3VsdD1jb250ZXh0LmRh dGEuJGNvbnRhaW5lci5maW5kKCcuc3VnZ2VzdGlvbnMtcmVzdWx0cyBkaXY6Zmly c3QnKTtlbHNle3Jlc3VsdD1zZWxlY3RlZC5uZXh0KCk7aWYocmVzdWx0LnNpemUo KT09MCkKcmVzdWx0PXNlbGVjdGVkO319CnNlbGVjdGVkLnJlbW92ZUNsYXNzKCdz dWdnZXN0aW9ucy1yZXN1bHQtY3VycmVudCcpO3Jlc3VsdC5hZGRDbGFzcygnc3Vn Z2VzdGlvbnMtcmVzdWx0LWN1cnJlbnQnKTt9CmlmKHVwZGF0ZVRleHRib3gpe2lm KHJlc3VsdC5zaXplKCk9PTApeyQuc3VnZ2VzdGlvbnMucmVzdG9yZShjb250ZXh0 KTt9ZWxzZXtjb250ZXh0LmRhdGEuJHRleHRib3gudmFsKHJlc3VsdC5kYXRhKCd0 ZXh0JykpO2NvbnRleHQuZGF0YS4kdGV4dGJveC5jaGFuZ2UoKTt9fQokLnN1Z2dl c3Rpb25zLnNwZWNpYWwoY29udGV4dCk7fSxrZXlwcmVzczpmdW5jdGlvbihlLGNv bnRleHQsa2V5KXt2YXIgd2FzVmlzaWJsZT1jb250ZXh0LmRhdGEuJGNvbnRhaW5l ci5pcygnOnZpc2libGUnKTt2YXIgcHJldmVudERlZmF1bHQ9ZmFsc2U7c3dpdGNo KGtleSl7Y2FzZSA0MDppZih3YXNWaXNpYmxlKXskLnN1Z2dlc3Rpb25zLmhpZ2hs aWdodChjb250ZXh0LCduZXh0Jyx0cnVlKTt9ZWxzZXskLnN1Z2dlc3Rpb25zLnVw ZGF0ZShjb250ZXh0LGZhbHNlKTt9CmNvbnRleHQuZGF0YS4kdGV4dGJveC50cmln Z2VyKCdjaGFuZ2UnKTtwcmV2ZW50RGVmYXVsdD10cnVlO2JyZWFrO2Nhc2UgMzg6 aWYod2FzVmlzaWJsZSl7JC5zdWdnZXN0aW9ucy5oaWdobGlnaHQoY29udGV4dCwn cHJldicsdHJ1ZSk7fQpjb250ZXh0LmRhdGEuJHRleHRib3gudHJpZ2dlcignY2hh bmdlJyk7cHJldmVudERlZmF1bHQ9d2FzVmlzaWJsZTticmVhaztjYXNlIDI3OmNv bnRleHQuZGF0YS4kY29udGFpbmVyLmhpZGUoKTskLnN1Z2dlc3Rpb25zLnJlc3Rv cmUoY29udGV4dCk7JC5zdWdnZXN0aW9ucy5jYW5jZWwoY29udGV4dCk7Y29udGV4 dC5kYXRhLiR0ZXh0Ym94LnRyaWdnZXIoJ2NoYW5nZScpO3ByZXZlbnREZWZhdWx0 PXdhc1Zpc2libGU7YnJlYWs7Y2FzZSAxMzpjb250ZXh0LmRhdGEuJGNvbnRhaW5l ci5oaWRlKCk7cHJldmVudERlZmF1bHQ9d2FzVmlzaWJsZTtpZih0eXBlb2YgY29u dGV4dC5jb25maWcucmVzdWx0LnNlbGVjdD09J2Z1bmN0aW9uJyl7Y29udGV4dC5j b25maWcucmVzdWx0LnNlbGVjdC5jYWxsKGNvbnRleHQuZGF0YS4kY29udGFpbmVy LmZpbmQoJy5zdWdnZXN0aW9ucy1yZXN1bHQtY3VycmVudCcpLGNvbnRleHQuZGF0 YS4kdGV4dGJveCk7fQpicmVhaztkZWZhdWx0OiQuc3VnZ2VzdGlvbnMudXBkYXRl KGNvbnRleHQsdHJ1ZSk7YnJlYWs7fQppZihwcmV2ZW50RGVmYXVsdCl7ZS5wcmV2 ZW50RGVmYXVsdCgpO2Uuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7fX19OyQu Zm4uc3VnZ2VzdGlvbnM9ZnVuY3Rpb24oKXt2YXIgcmV0dXJuVmFsdWU9bnVsbDt2 YXIgYXJncz1hcmd1bWVudHM7JCh0aGlzKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGNv bnRleHQ9JCh0aGlzKS5kYXRhKCdzdWdnZXN0aW9ucy1jb250ZXh0Jyk7aWYodHlw ZW9mIGNvbnRleHQ9PSd1bmRlZmluZWQnKXtjb250ZXh0PXtjb25maWc6eydmZXRj aCc6ZnVuY3Rpb24oKXt9LCdjYW5jZWwnOmZ1bmN0aW9uKCl7fSwnc3BlY2lhbCc6 e30sJ3Jlc3VsdCc6e30sJyRyZWdpb24nOiQodGhpcyksJ3N1Z2dlc3Rpb25zJzpb XSwnbWF4Um93cyc6NywnZGVsYXknOjEyMDAsJ3N1Ym1pdE9uQ2xpY2snOmZhbHNl fX07fQppZihhcmdzLmxlbmd0aD4wKXtpZih0eXBlb2YgYXJnc1swXT09J29iamVj dCcpe2ZvcihrZXkgaW4gYXJnc1swXSl7JC5zdWdnZXN0aW9ucy5jb25maWd1cmUo Y29udGV4dCxrZXksYXJnc1swXVtrZXldKTt9fWVsc2UgaWYodHlwZW9mIGFyZ3Nb MF09PSdzdHJpbmcnKXtpZihhcmdzLmxlbmd0aD4xKXskLnN1Z2dlc3Rpb25zLmNv bmZpZ3VyZShjb250ZXh0LGFyZ3NbMF0sYXJnc1sxXSk7fWVsc2UgaWYocmV0dXJu VmFsdWU9PW51bGwpe3JldHVyblZhbHVlPShhcmdzWzBdaW4gY29udGV4dC5jb25m aWc/dW5kZWZpbmVkOmNvbnRleHQuY29uZmlnW2FyZ3NbMF1dKTt9fX0KaWYodHlw ZW9mIGNvbnRleHQuZGF0YT09J3VuZGVmaW5lZCcpe2NvbnRleHQuZGF0YT17J3Rp bWVySUQnOm51bGwsJ3ByZXZUZXh0JzpudWxsLCd2aXNpYmxlUmVzdWx0cyc6MCwn bW91c2VEb3duT24nOiQoW10pLCckdGV4dGJveCc6JCh0aGlzKX07Y29udGV4dC5k YXRhLiRjb250YWluZXI9JCgnPGRpdiAvPicpLmNzcyh7J3RvcCc6TWF0aC5yb3Vu ZChjb250ZXh0LmRhdGEuJHRleHRib3gub2Zmc2V0KCkudG9wK2NvbnRleHQuZGF0 YS4kdGV4dGJveC5vdXRlckhlaWdodCgpKSwnbGVmdCc6TWF0aC5yb3VuZChjb250 ZXh0LmRhdGEuJHRleHRib3gub2Zmc2V0KCkubGVmdCksJ3dpZHRoJzpjb250ZXh0 LmRhdGEuJHRleHRib3gub3V0ZXJXaWR0aCgpLCdkaXNwbGF5Jzonbm9uZSd9KS5t b3VzZW92ZXIoZnVuY3Rpb24oZSl7JC5zdWdnZXN0aW9ucy5oaWdobGlnaHQoY29u dGV4dCwkKGUudGFyZ2V0KS5jbG9zZXN0KCcuc3VnZ2VzdGlvbnMtcmVzdWx0cyBk aXYnKSxmYWxzZSk7fSkuYWRkQ2xhc3MoJ3N1Z2dlc3Rpb25zJykuYXBwZW5kKCQo JzxkaXYgLz4nKS5hZGRDbGFzcygnc3VnZ2VzdGlvbnMtcmVzdWx0cycpLm1vdXNl ZG93bihmdW5jdGlvbihlKXtjb250ZXh0LmRhdGEubW91c2VEb3duT249JChlLnRh cmdldCkuY2xvc2VzdCgnLnN1Z2dlc3Rpb25zLXJlc3VsdHMgZGl2Jyk7fSkubW91 c2V1cChmdW5jdGlvbihlKXt2YXIgJHJlc3VsdD0kKGUudGFyZ2V0KS5jbG9zZXN0 KCcuc3VnZ2VzdGlvbnMtcmVzdWx0cyBkaXYnKTt2YXIgJG90aGVyPWNvbnRleHQu ZGF0YS5tb3VzZURvd25Pbjtjb250ZXh0LmRhdGEubW91c2VEb3duT249JChbXSk7 aWYoJHJlc3VsdC5nZXQoMCkhPSRvdGhlci5nZXQoMCkpe3JldHVybjt9CiQuc3Vn Z2VzdGlvbnMuaGlnaGxpZ2h0KGNvbnRleHQsJHJlc3VsdCx0cnVlKTtjb250ZXh0 LmRhdGEuJGNvbnRhaW5lci5oaWRlKCk7aWYodHlwZW9mIGNvbnRleHQuY29uZmln LnJlc3VsdC5zZWxlY3Q9PSdmdW5jdGlvbicpe2NvbnRleHQuY29uZmlnLnJlc3Vs dC5zZWxlY3QuY2FsbCgkcmVzdWx0LGNvbnRleHQuZGF0YS4kdGV4dGJveCk7fQpj b250ZXh0LmRhdGEuJHRleHRib3guZm9jdXMoKTt9KSkuYXBwZW5kKCQoJzxkaXYg Lz4nKS5hZGRDbGFzcygnc3VnZ2VzdGlvbnMtc3BlY2lhbCcpLm1vdXNlZG93bihm dW5jdGlvbihlKXtjb250ZXh0LmRhdGEubW91c2VEb3duT249JChlLnRhcmdldCku Y2xvc2VzdCgnLnN1Z2dlc3Rpb25zLXNwZWNpYWwnKTt9KS5tb3VzZXVwKGZ1bmN0 aW9uKGUpe3ZhciAkc3BlY2lhbD0kKGUudGFyZ2V0KS5jbG9zZXN0KCcuc3VnZ2Vz dGlvbnMtc3BlY2lhbCcpO3ZhciAkb3RoZXI9Y29udGV4dC5kYXRhLm1vdXNlRG93 bk9uO2NvbnRleHQuZGF0YS5tb3VzZURvd25Pbj0kKFtdKTtpZigkc3BlY2lhbC5n ZXQoMCkhPSRvdGhlci5nZXQoMCkpe3JldHVybjt9CmNvbnRleHQuZGF0YS4kY29u dGFpbmVyLmhpZGUoKTtpZih0eXBlb2YgY29udGV4dC5jb25maWcuc3BlY2lhbC5z ZWxlY3Q9PSdmdW5jdGlvbicpe2NvbnRleHQuY29uZmlnLnNwZWNpYWwuc2VsZWN0 LmNhbGwoJHNwZWNpYWwsY29udGV4dC5kYXRhLiR0ZXh0Ym94KTt9CmNvbnRleHQu ZGF0YS4kdGV4dGJveC5mb2N1cygpO30pKS5hcHBlbmRUbygkKCdib2R5JykpOyQo dGhpcykuYXR0cignYXV0b2NvbXBsZXRlJywnb2ZmJykua2V5ZG93bihmdW5jdGlv bihlKXtjb250ZXh0LmRhdGEua2V5cHJlc3NlZD0oZS5rZXlDb2RlPT11bmRlZmlu ZWQpP2Uud2hpY2g6ZS5rZXlDb2RlO2NvbnRleHQuZGF0YS5rZXlwcmVzc2VkQ291 bnQ9MDtzd2l0Y2goY29udGV4dC5kYXRhLmtleXByZXNzZWQpe2Nhc2UgNDA6ZS5w cmV2ZW50RGVmYXVsdCgpO2Uuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7YnJl YWs7Y2FzZSAzODpjYXNlIDI3OmNhc2UgMTM6aWYoY29udGV4dC5kYXRhLiRjb250 YWluZXIuaXMoJzp2aXNpYmxlJykpe2UucHJldmVudERlZmF1bHQoKTtlLnN0b3BJ bW1lZGlhdGVQcm9wYWdhdGlvbigpO319fSkua2V5cHJlc3MoZnVuY3Rpb24oZSl7 Y29udGV4dC5kYXRhLmtleXByZXNzZWRDb3VudCsrOyQuc3VnZ2VzdGlvbnMua2V5 cHJlc3MoZSxjb250ZXh0LGNvbnRleHQuZGF0YS5rZXlwcmVzc2VkKTt9KS5rZXl1 cChmdW5jdGlvbihlKXtpZihjb250ZXh0LmRhdGEua2V5cHJlc3NlZENvdW50PT0w KXskLnN1Z2dlc3Rpb25zLmtleXByZXNzKGUsY29udGV4dCxjb250ZXh0LmRhdGEu a2V5cHJlc3NlZCk7fX0pLmJsdXIoZnVuY3Rpb24oKXtpZihjb250ZXh0LmRhdGEu bW91c2VEb3duT24uc2l6ZSgpPjApe3JldHVybjt9CmNvbnRleHQuZGF0YS4kY29u dGFpbmVyLmhpZGUoKTskLnN1Z2dlc3Rpb25zLmNhbmNlbChjb250ZXh0KTt9KTt9 CiQodGhpcykuZGF0YSgnc3VnZ2VzdGlvbnMtY29udGV4dCcsY29udGV4dCk7fSk7 cmV0dXJuIHJldHVyblZhbHVlIT09bnVsbD9yZXR1cm5WYWx1ZTokKHRoaXMpO307 fSkoalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JC5mbi5leHRlbmQoe2dldFNlbGVjdGlv bjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuanF1ZXJ5P3RoaXNbMF06dGhpczt2YXIg cmV0dmFsPScnO2lmKGUuc3R5bGUuZGlzcGxheT09J25vbmUnKXt9ZWxzZSBpZihk b2N1bWVudC5zZWxlY3Rpb24mJmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5n ZSl7ZS5mb2N1cygpO3ZhciByYW5nZT1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRl UmFuZ2UoKTtyZXR2YWw9cmFuZ2UudGV4dDt9ZWxzZSBpZihlLnNlbGVjdGlvblN0 YXJ0fHxlLnNlbGVjdGlvblN0YXJ0PT0nMCcpe3JldHZhbD1lLnZhbHVlLnN1YnN0 cmluZyhlLnNlbGVjdGlvblN0YXJ0LGUuc2VsZWN0aW9uRW5kKTt9CnJldHVybiBy ZXR2YWw7fSxlbmNhcHN1bGF0ZVNlbGVjdGlvbjpmdW5jdGlvbihwcmUscGVyaSxw b3N0LG93bmxpbmUscmVwbGFjZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigp e2Z1bmN0aW9uIGNoZWNrU2VsZWN0ZWRUZXh0KCl7aWYoIXNlbFRleHQpe3NlbFRl eHQ9cGVyaTtpc1NhbXBsZT10cnVlO31lbHNlIGlmKHJlcGxhY2Upe3NlbFRleHQ9 cGVyaTt9ZWxzZSBpZihzZWxUZXh0LmNoYXJBdChzZWxUZXh0Lmxlbmd0aC0xKT09 JyAnKXtzZWxUZXh0PXNlbFRleHQuc3Vic3RyaW5nKDAsc2VsVGV4dC5sZW5ndGgt MSk7cG9zdCs9JyAnO319CnZhciBzZWxUZXh0PSQodGhpcykuZm9jdXMoKS5nZXRT ZWxlY3Rpb24oKTt2YXIgaXNTYW1wbGU9ZmFsc2U7aWYodGhpcy5zdHlsZS5kaXNw bGF5PT0nbm9uZScpe31lbHNlIGlmKHRoaXMuc2VsZWN0aW9uU3RhcnR8fHRoaXMu c2VsZWN0aW9uU3RhcnQ9PScwJyl7dmFyIHN0YXJ0UG9zPXRoaXMuc2VsZWN0aW9u U3RhcnQ7dmFyIGVuZFBvcz10aGlzLnNlbGVjdGlvbkVuZDtjaGVja1NlbGVjdGVk VGV4dCgpO2lmKG93bmxpbmUpe2lmKHN0YXJ0UG9zIT0wJiZ0aGlzLnZhbHVlLmNo YXJBdChzdGFydFBvcy0xKSE9IlxuIil7cHJlPSJcbiIrcHJlO30KaWYodGhpcy52 YWx1ZS5jaGFyQXQoZW5kUG9zKSE9IlxuIil7cG9zdCs9IlxuIjt9fQp0aGlzLnZh bHVlPXRoaXMudmFsdWUuc3Vic3RyaW5nKDAsc3RhcnRQb3MpK3ByZStzZWxUZXh0 K3Bvc3QrdGhpcy52YWx1ZS5zdWJzdHJpbmcoZW5kUG9zLHRoaXMudmFsdWUubGVu Z3RoKTtpZih3aW5kb3cub3BlcmEpe3ByZT1wcmUucmVwbGFjZSgvXHI/XG4vZywi XHJcbiIpO3NlbFRleHQ9c2VsVGV4dC5yZXBsYWNlKC9ccj9cbi9nLCJcclxuIik7 cG9zdD1wb3N0LnJlcGxhY2UoL1xyP1xuL2csIlxyXG4iKTt9CmlmKGlzU2FtcGxl KXt0aGlzLnNlbGVjdGlvblN0YXJ0PXN0YXJ0UG9zK3ByZS5sZW5ndGg7dGhpcy5z ZWxlY3Rpb25FbmQ9c3RhcnRQb3MrcHJlLmxlbmd0aCtzZWxUZXh0Lmxlbmd0aDt9 ZWxzZXt0aGlzLnNlbGVjdGlvblN0YXJ0PXN0YXJ0UG9zK3ByZS5sZW5ndGgrc2Vs VGV4dC5sZW5ndGgrcG9zdC5sZW5ndGg7dGhpcy5zZWxlY3Rpb25FbmQ9dGhpcy5z ZWxlY3Rpb25TdGFydDt9CiQodGhpcykuc2Nyb2xsVG9DYXJldFBvc2l0aW9uKCk7 fWVsc2UgaWYoZG9jdW1lbnQuc2VsZWN0aW9uJiZkb2N1bWVudC5zZWxlY3Rpb24u Y3JlYXRlUmFuZ2Upe3ZhciByYW5nZT1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRl UmFuZ2UoKTtpZihvd25saW5lJiZyYW5nZS5tb3ZlU3RhcnQpe3ZhciByYW5nZTI9 ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7cmFuZ2UyLmNvbGxhcHNl KCk7cmFuZ2UyLm1vdmVTdGFydCgnY2hhcmFjdGVyJywtMSk7aWYocmFuZ2UyLnRl eHQhPSJcciImJnJhbmdlMi50ZXh0IT0iXG4iJiZyYW5nZTIudGV4dCE9IiIpe3By ZT0iXG4iK3ByZTt9CnZhciByYW5nZTM9ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0 ZVJhbmdlKCk7cmFuZ2UzLmNvbGxhcHNlKGZhbHNlKTtyYW5nZTMubW92ZUVuZCgn Y2hhcmFjdGVyJywxKTtpZihyYW5nZTMudGV4dCE9IlxyIiYmcmFuZ2UzLnRleHQh PSJcbiImJnJhbmdlMy50ZXh0IT0iIil7cG9zdCs9IlxuIjt9fQpjaGVja1NlbGVj dGVkVGV4dCgpO3JhbmdlLnRleHQ9cHJlK3NlbFRleHQrcG9zdDtpZihpc1NhbXBs ZSYmcmFuZ2UubW92ZVN0YXJ0KXtyYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3Rlcics LXBvc3QubGVuZ3RoLXNlbFRleHQubGVuZ3RoKTtyYW5nZS5tb3ZlRW5kKCdjaGFy YWN0ZXInLC1wb3N0Lmxlbmd0aCk7fQpyYW5nZS5zZWxlY3QoKTt9CiQodGhpcyku dHJpZ2dlcignZW5jYXBzdWxhdGVTZWxlY3Rpb24nLFtwcmUscGVyaSxwb3N0LG93 bmxpbmUscmVwbGFjZV0pO30pO30sZ2V0Q2FyZXRQb3NpdGlvbjpmdW5jdGlvbihz dGFydEFuZEVuZCxyZXN0b3JlRm9jdXMpe2Z1bmN0aW9uIGdldENhcmV0KGUpe3Zh ciBjYXJldFBvcz0wLGVuZFBvcz0wO2lmKCQuYnJvd3Nlci5tc2llKXt2YXIgb2xk Rm9jdXM9ZmFsc2U7aWYocmVzdG9yZUZvY3VzKQpvbGRGb2N1cz1kb2N1bWVudC5z ZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5wYXJlbnRFbGVtZW50O2UuZm9jdXMoKTt2 YXIgcG9zdEZpbmlzaGVkPWZhbHNlO3ZhciBwZXJpRmluaXNoZWQ9ZmFsc2U7dmFy IHBvc3RGaW5pc2hlZD1mYWxzZTt2YXIgcHJlVGV4dCxyYXdQcmVUZXh0LHBlcmlU ZXh0O3ZhciByYXdQZXJpVGV4dCxwb3N0VGV4dCxyYXdQb3N0VGV4dDt2YXIgcGVy aVJhbmdlPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLmR1cGxpY2F0 ZSgpO3ZhciBwcmVSYW5nZT1kb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgp O3ByZVJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KGUpO3ByZVJhbmdlLnNldEVuZFBv aW50KCJFbmRUb1N0YXJ0IixwZXJpUmFuZ2UpO3ZhciBwb3N0UmFuZ2U9ZG9jdW1l bnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTtwb3N0UmFuZ2UubW92ZVRvRWxlbWVu dFRleHQoZSk7cG9zdFJhbmdlLnNldEVuZFBvaW50KCJTdGFydFRvRW5kIixwZXJp UmFuZ2UpO3ByZVRleHQ9cmF3UHJlVGV4dD1wcmVSYW5nZS50ZXh0O3BlcmlUZXh0 PXJhd1BlcmlUZXh0PXBlcmlSYW5nZS50ZXh0O3Bvc3RUZXh0PXJhd1Bvc3RUZXh0 PXBvc3RSYW5nZS50ZXh0O2Rve2lmKCFwb3N0RmluaXNoZWQpe2lmKHByZVJhbmdl LmNvbXBhcmVFbmRQb2ludHMoIlN0YXJ0VG9FbmQiLHByZVJhbmdlKT09MCl7cG9z dEZpbmlzaGVkPXRydWU7fWVsc2V7cHJlUmFuZ2UubW92ZUVuZCgiY2hhcmFjdGVy IiwtMSkKaWYocHJlUmFuZ2UudGV4dD09cHJlVGV4dCl7cmF3UHJlVGV4dCs9Ilxy XG4iO31lbHNle3Bvc3RGaW5pc2hlZD10cnVlO319fQppZighcGVyaUZpbmlzaGVk KXtpZihwZXJpUmFuZ2UuY29tcGFyZUVuZFBvaW50cygiU3RhcnRUb0VuZCIscGVy aVJhbmdlKT09MCl7cGVyaUZpbmlzaGVkPXRydWU7fWVsc2V7cGVyaVJhbmdlLm1v dmVFbmQoImNoYXJhY3RlciIsLTEpCmlmKHBlcmlSYW5nZS50ZXh0PT1wZXJpVGV4 dCl7cmF3UGVyaVRleHQrPSJcclxuIjt9ZWxzZXtwZXJpRmluaXNoZWQ9dHJ1ZTt9 fX0KaWYoIXBvc3RGaW5pc2hlZCl7aWYocG9zdFJhbmdlLmNvbXBhcmVFbmRQb2lu dHMoIlN0YXJ0VG9FbmQiLHBvc3RSYW5nZSk9PTApe3Bvc3RGaW5pc2hlZD10cnVl O31lbHNle3Bvc3RSYW5nZS5tb3ZlRW5kKCJjaGFyYWN0ZXIiLC0xKQppZihwb3N0 UmFuZ2UudGV4dD09cG9zdFRleHQpe3Jhd1Bvc3RUZXh0Kz0iXHJcbiI7fWVsc2V7 cG9zdEZpbmlzaGVkPXRydWU7fX19fXdoaWxlKCghcG9zdEZpbmlzaGVkfHwhcGVy aUZpbmlzaGVkfHwhcG9zdEZpbmlzaGVkKSk7Y2FyZXRQb3M9cmF3UHJlVGV4dC5y ZXBsYWNlKC9cclxuL2csIlxuIikubGVuZ3RoO2VuZFBvcz1jYXJldFBvcytyYXdQ ZXJpVGV4dC5yZXBsYWNlKC9cclxuL2csIlxuIikubGVuZ3RoO2lmKG9sZEZvY3Vz JiZvbGRGb2N1cy5mb2N1cykKb2xkRm9jdXMuZm9jdXMoKTt9ZWxzZSBpZihlLnNl bGVjdGlvblN0YXJ0fHxlLnNlbGVjdGlvblN0YXJ0PT0nMCcpe2NhcmV0UG9zPWUu c2VsZWN0aW9uU3RhcnQ7ZW5kUG9zPWUuc2VsZWN0aW9uRW5kO30KcmV0dXJuIHN0 YXJ0QW5kRW5kP1tjYXJldFBvcyxlbmRQb3NdOmNhcmV0UG9zO30KcmV0dXJuIGdl dENhcmV0KHRoaXMuZ2V0KDApKTt9LHNldFNlbGVjdGlvbjpmdW5jdGlvbihzdGFy dCxlbmQpe2lmKHR5cGVvZiBlbmQ9PSd1bmRlZmluZWQnKQplbmQ9c3RhcnQ7cmV0 dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMuc2VsZWN0aW9uU3RhcnR8 fHRoaXMuc2VsZWN0aW9uU3RhcnQ9PScwJyl7aWYoc3RhcnQ+dGhpcy5zZWxlY3Rp b25FbmQpe3RoaXMuc2VsZWN0aW9uRW5kPWVuZDt0aGlzLnNlbGVjdGlvblN0YXJ0 PXN0YXJ0O31lbHNle3RoaXMuc2VsZWN0aW9uU3RhcnQ9c3RhcnQ7dGhpcy5zZWxl Y3Rpb25FbmQ9ZW5kO319ZWxzZSBpZihkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRS YW5nZSl7dmFyIHNlbGVjdGlvbj1kb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5n ZSgpO3NlbGVjdGlvbi5tb3ZlVG9FbGVtZW50VGV4dCh0aGlzKTt2YXIgbGVuZ3Ro PXNlbGVjdGlvbi50ZXh0Lmxlbmd0aDtpZihzdGFydD5sZW5ndGh8fGVuZD5sZW5n dGgpCnJldHVybjtzZWxlY3Rpb24uY29sbGFwc2UoKTtzZWxlY3Rpb24ubW92ZUVu ZCgnY2hhcmFjdGVyJyxlbmQpO3NlbGVjdGlvbi5tb3ZlU3RhcnQoJ2NoYXJhY3Rl cicsc3RhcnQpO3NlbGVjdGlvbi5zZWxlY3QoKTt9fSk7fSxzY3JvbGxUb0NhcmV0 UG9zaXRpb246ZnVuY3Rpb24oZm9yY2Upe2Z1bmN0aW9uIGdldExpbmVMZW5ndGgo ZSl7cmV0dXJuIE1hdGguZmxvb3IoZS5zY3JvbGxXaWR0aC8oJC5vcy5uYW1lPT0n bGludXgnPzc6OCkpO30KZnVuY3Rpb24gZ2V0Q2FyZXRTY3JvbGxQb3NpdGlvbihl KXt2YXIgdGV4dD1lLnZhbHVlLnJlcGxhY2UoL1xyL2csIiIpO3ZhciBjYXJldD0k KGUpLmdldENhcmV0UG9zaXRpb24oKTt2YXIgbGluZUxlbmd0aD1nZXRMaW5lTGVu Z3RoKGUpO3ZhciByb3c9MDt2YXIgY2hhckluTGluZT0wO3ZhciBsYXN0U3BhY2VJ bkxpbmU9MDtmb3IoaT0wO2k8Y2FyZXQ7aSsrKXtjaGFySW5MaW5lKys7aWYodGV4 dC5jaGFyQXQoaSk9PSIgIil7bGFzdFNwYWNlSW5MaW5lPWNoYXJJbkxpbmU7fWVs c2UgaWYodGV4dC5jaGFyQXQoaSk9PSJcbiIpe2xhc3RTcGFjZUluTGluZT0wO2No YXJJbkxpbmU9MDtyb3crKzt9CmlmKGNoYXJJbkxpbmU+bGluZUxlbmd0aCl7aWYo bGFzdFNwYWNlSW5MaW5lPjApe2NoYXJJbkxpbmU9Y2hhckluTGluZS1sYXN0U3Bh Y2VJbkxpbmU7bGFzdFNwYWNlSW5MaW5lPTA7cm93Kys7fX19CnZhciBuZXh0U3Bh Y2U9MDtmb3Ioaj1jYXJldDtqPGNhcmV0K2xpbmVMZW5ndGg7aisrKXtpZih0ZXh0 LmNoYXJBdChqKT09IiAifHx0ZXh0LmNoYXJBdChqKT09IlxuInx8Y2FyZXQ9PXRl eHQubGVuZ3RoKXtuZXh0U3BhY2U9ajticmVhazt9fQppZihuZXh0U3BhY2U+bGlu ZUxlbmd0aCYmY2FyZXQ8PWxpbmVMZW5ndGgpe2NoYXJJbkxpbmU9Y2FyZXQtbGFz dFNwYWNlSW5MaW5lO3JvdysrO30KcmV0dXJuKCQub3MubmFtZT09J21hYyc/MTM6 KCQub3MubmFtZT09J2xpbnV4Jz8xNToxNikpKnJvdzt9CnJldHVybiB0aGlzLmVh Y2goZnVuY3Rpb24oKXtpZih0aGlzLnNlbGVjdGlvblN0YXJ0fHx0aGlzLnNlbGVj dGlvblN0YXJ0PT0nMCcpe3ZhciBzY3JvbGw9Z2V0Q2FyZXRTY3JvbGxQb3NpdGlv bih0aGlzKTtpZihmb3JjZXx8c2Nyb2xsPCQodGhpcykuc2Nyb2xsVG9wKCl8fHNj cm9sbD4kKHRoaXMpLnNjcm9sbFRvcCgpKyQodGhpcykuaGVpZ2h0KCkpCiQodGhp cykuc2Nyb2xsVG9wKHNjcm9sbCk7fWVsc2UgaWYoZG9jdW1lbnQuc2VsZWN0aW9u JiZkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2Upe3ZhciByYW5nZT1kb2N1 bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTt2YXIgcG9zPSQodGhpcykuZ2V0 Q2FyZXRQb3NpdGlvbigpO3ZhciBvbGRTY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3A7 cmFuZ2UubW92ZVRvRWxlbWVudFRleHQodGhpcyk7cmFuZ2UuY29sbGFwc2UoKTty YW5nZS5tb3ZlKCdjaGFyYWN0ZXInLHBvcysxKTtyYW5nZS5zZWxlY3QoKTtpZih0 aGlzLnNjcm9sbFRvcCE9b2xkU2Nyb2xsVG9wKQp0aGlzLnNjcm9sbFRvcCs9cmFu Z2Uub2Zmc2V0VG9wO2Vsc2UgaWYoZm9yY2Upe3JhbmdlLm1vdmUoJ2NoYXJhY3Rl cicsLTEpO3JhbmdlLnNlbGVjdCgpO319CiQodGhpcykudHJpZ2dlcignc2Nyb2xs VG9Qb3NpdGlvbicpO30pO319KTt9KShqUXVlcnkpOyhmdW5jdGlvbigkKXskLndp a2lFZGl0b3I9eydtb2R1bGVzJzp7fSwnaW5zdGFuY2VzJzpbXSwnYnJvd3NlcnMn OnsnbHRyJzp7J21zaWUnOltbJz49Jyw3XV0sJ2ZpcmVmb3gnOltbJz49JywyXSxb JyE9JywnMi4wJ10sWychPScsJzIuMC4wLjEnXSxbJyE9JywnMi4wLjAuMiddLFsn IT0nLCcyLjAuMC4zJ10sWychPScsJzIuMC4wLjQnXV0sJ29wZXJhJzpbWyc+PScs OS42XV0sJ3NhZmFyaSc6W1snPj0nLDMuMV1dfSwncnRsJzp7J21zaWUnOltbJz49 Jyw4XV0sJ2ZpcmVmb3gnOltbJz49JywyXSxbJyE9JywnMi4wJ10sWychPScsJzIu MC4wLjEnXSxbJyE9JywnMi4wLjAuMiddLFsnIT0nLCcyLjAuMC4zJ10sWychPScs JzIuMC4wLjQnXV0sJ29wZXJhJzpbWyc+PScsOS42XV0sJ3NhZmFyaSc6W1snPj0n LDMuMV1dfX0saW1nUGF0aDp3Z1NjcmlwdFBhdGgrJy9leHRlbnNpb25zL1VzYWJp bGl0eUluaXRpYXRpdmUvaW1hZ2VzL3dpa2lFZGl0b3IvJ307JC53aWtpRWRpdG9y LmlzU3VwcG9ydEtub3duPWZ1bmN0aW9uKCl7cmV0dXJuICQuYnJvd3Nlci5uYW1l IGluICQud2lraUVkaXRvci5icm93c2Vyc1skKCdib2R5LnJ0bCcpLnNpemUoKT8n cnRsJzonbHRyJ107fTskLndpa2lFZGl0b3IuaXNTdXBwb3J0ZWQ9ZnVuY3Rpb24o KXtpZighJC53aWtpRWRpdG9yLmlzU3VwcG9ydEtub3duKXtyZXR1cm4gdHJ1ZTt9 CnZhciBicm93c2VyPSQud2lraUVkaXRvci5icm93c2Vyc1skKCdib2R5LnJ0bCcp LnNpemUoKT8ncnRsJzonbHRyJ11bJC5icm93c2VyLm5hbWVdO2Zvcihjb25kaXRp b24gaW4gYnJvd3Nlcil7dmFyIG9wPWJyb3dzZXJbY29uZGl0aW9uXVswXTt2YXIg dmFsPWJyb3dzZXJbY29uZGl0aW9uXVsxXTtpZih0eXBlb2YgdmFsPT0nc3RyaW5n Jyl7aWYoIShldmFsKCckLmJyb3dzZXIudmVyc2lvbicrb3ArJyInK3ZhbCsnIicp KSl7cmV0dXJuIGZhbHNlO319ZWxzZSBpZih0eXBlb2YgdmFsPT0nbnVtYmVyJyl7 aWYoIShldmFsKCckLmJyb3dzZXIudmVyc2lvbk51bWJlcicrb3ArdmFsKSkpe3Jl dHVybiBmYWxzZTt9fX0KcmV0dXJuIHRydWU7fTskLndpa2lFZGl0b3IuYXV0b01z Zz1mdW5jdGlvbihvYmplY3QscHJvcGVydHkpe2lmKHR5cGVvZiBwcm9wZXJ0eT09 J29iamVjdCcpe2ZvcihpIGluIHByb3BlcnR5KXtpZihwcm9wZXJ0eVtpXWluIG9i amVjdHx8cHJvcGVydHlbaV0rJ01zZydpbiBvYmplY3Qpe3Byb3BlcnR5PXByb3Bl cnR5W2ldO2JyZWFrO319fQppZihwcm9wZXJ0eSBpbiBvYmplY3Qpe3JldHVybiBv YmplY3RbcHJvcGVydHldO31lbHNlIGlmKHByb3BlcnR5KydNc2cnaW4gb2JqZWN0 KXtyZXR1cm4gZ00ob2JqZWN0W3Byb3BlcnR5KydNc2cnXSk7fWVsc2V7cmV0dXJu Jyc7fX07JC53aWtpRWRpdG9yLmZpeE9wZXJhQnJva2VubmVzcz1mdW5jdGlvbihz KXtpZih0eXBlb2YgJC5pc09wZXJhQnJva2VuPT0ndW5kZWZpbmVkJyYmJC53aWtp RWRpdG9yLmluc3RhbmNlcy5sZW5ndGg+MCl7dmFyIGRpdj0kKCc8ZGl2IC8+Jyku aGVpZ2h0KDApLndpZHRoKDApLmluc2VydEJlZm9yZSgkLndpa2lFZGl0b3IuaW5z dGFuY2VzWzBdKTt2YXIgdGV4dGFyZWE9JCgnPHRleHRhcmVhIC8+JykuaGVpZ2h0 KDApLmFwcGVuZFRvKGRpdikudmFsKCJmb29cclxuYmFyIik7dmFyIGluZGV4PXRl eHRhcmVhLnZhbCgpLmluZGV4T2YoJ2JhcicpO3RleHRhcmVhLnNlbGVjdCgpO3Rl eHRhcmVhLnNldFNlbGVjdGlvbihpbmRleCxpbmRleCszKTt0ZXh0YXJlYS5lbmNh cHN1bGF0ZVNlbGVjdGlvbignJywnQkFSJywnJyxmYWxzZSx0cnVlKTtpZih0ZXh0 YXJlYS52YWwoKS5zdWJzdHIoLTQpIT0nQkFScicpCiQuaXNPcGVyYUJyb2tlbj1m YWxzZTtlbHNlCiQuaXNPcGVyYUJyb2tlbj10cnVlO2Rpdi5yZW1vdmUoKTt9Cmlm KCQuaXNPcGVyYUJyb2tlbikKcz1zLnJlcGxhY2UoL1xuL2csIlxyXG4iKTtyZXR1 cm4gczt9OyQuZm4ud2lraUVkaXRvcj1mdW5jdGlvbigpe3ZhciBjb250ZXh0PSQo dGhpcykuZGF0YSgnd2lraUVkaXRvci1jb250ZXh0Jyk7aWYodHlwZW9mIGNvbnRl eHQ9PSd1bmRlZmluZWQnKXt2YXIgaW5zdGFuY2U9JC53aWtpRWRpdG9yLmluc3Rh bmNlcy5sZW5ndGg7Y29udGV4dD17JyR0ZXh0YXJlYSc6JCh0aGlzKSwnbW9kdWxl cyc6e30sJ2RhdGEnOnt9LCdpbnN0YW5jZSc6aW5zdGFuY2V9OyQud2lraUVkaXRv ci5pbnN0YW5jZXNbaW5zdGFuY2VdPSQodGhpcyk7JCh0aGlzKS53cmFwKCQoJzxk aXY+PC9kaXY+JykuYWRkQ2xhc3MoJ3dpa2lFZGl0b3ItdWknKS5hdHRyKCdpZCcs J3dpa2lFZGl0b3ItdWknKSkud3JhcCgkKCc8ZGl2PjwvZGl2PicpLmFkZENsYXNz KCd3aWtpRWRpdG9yLXVpLWJvdHRvbScpLmF0dHIoJ2lkJywnd2lraUVkaXRvci11 aS1ib3R0b20nKSkud3JhcCgkKCc8ZGl2PjwvZGl2PicpLmFkZENsYXNzKCd3aWtp RWRpdG9yLXVpLXRleHQnKS5hdHRyKCdpZCcsJ3dpa2lFZGl0b3ItdWktdGV4dCcp KTtjb250ZXh0LiR1aT0kKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgp O2NvbnRleHQuJHVpLmFmdGVyKCQoJzxkaXYgc3R5bGU9ImNsZWFyOmJvdGg7Ij48 L2Rpdj4nKSk7Y29udGV4dC4kdWkucHJlcGVuZCgkKCc8ZGl2PjwvZGl2PicpLmFk ZENsYXNzKCd3aWtpRWRpdG9yLXVpLXRvcCcpLmF0dHIoJ2lkJywnd2lraUVkaXRv ci11aS10b3AnKSk7JCh0aGlzKS5mb2N1cyhmdW5jdGlvbigpe3ZhciBwb3M9JCh0 aGlzKS5kYXRhKCd3aWtpRWRpdG9yLWN1cnNvcicpO2lmKHBvcykKJCh0aGlzKS5z ZXRTZWxlY3Rpb24ocG9zWzBdLHBvc1sxXSk7JCh0aGlzKS5kYXRhKCd3aWtpRWRp dG9yLWN1cnNvcicsZmFsc2UpO30pLmRlbGF5ZWRCaW5kKDEwMCwna2V5dXAgbW91 c2V1cCcsZnVuY3Rpb24oKXskKHRoaXMpLmRhdGEoJ3dpa2lFZGl0b3ItY3Vyc29y JywkKHRoaXMpLmdldENhcmV0UG9zaXRpb24odHJ1ZSkpO30pO2NvbnRleHQuYXBp PXthZGRNb2R1bGU6ZnVuY3Rpb24oY29udGV4dCxkYXRhKXtmdW5jdGlvbiBjYWxs TW9kdWxlQXBpKG1vZHVsZSxjYWxsLGRhdGEpe2lmKG1vZHVsZSBpbiAkLndpa2lF ZGl0b3IubW9kdWxlcyYmJ2ZuJ2luICQud2lraUVkaXRvci5tb2R1bGVzW21vZHVs ZV0mJmNhbGwgaW4gJC53aWtpRWRpdG9yLm1vZHVsZXNbbW9kdWxlXS5mbil7JC53 aWtpRWRpdG9yLm1vZHVsZXNbbW9kdWxlXS5mbltjYWxsXShjb250ZXh0LGRhdGEp O319CmlmKHR5cGVvZiBkYXRhPT0nc3RyaW5nJyl7Y2FsbE1vZHVsZUFwaShkYXRh LCdjcmVhdGUnLHt9KTt9ZWxzZSBpZih0eXBlb2YgZGF0YT09J29iamVjdCcpe2Zv cihtb2R1bGUgaW4gZGF0YSl7aWYodHlwZW9mIG1vZHVsZT09J3N0cmluZycpe2Nh bGxNb2R1bGVBcGkobW9kdWxlLCdjcmVhdGUnLGRhdGFbbW9kdWxlXSk7fX19fX07 Zm9yKG1vZHVsZSBpbiAkLndpa2lFZGl0b3IubW9kdWxlcyl7aWYoJ2FwaSdpbiAk Lndpa2lFZGl0b3IubW9kdWxlc1ttb2R1bGVdKXtmb3IoY2FsbCBpbiAkLndpa2lF ZGl0b3IubW9kdWxlc1ttb2R1bGVdLmFwaSl7aWYoIShjYWxsIGluIGNvbnRleHQu YXBpKSl7Y29udGV4dC5hcGlbY2FsbF09JC53aWtpRWRpdG9yLm1vZHVsZXNbbW9k dWxlXS5hcGlbY2FsbF07fX19fX0KaWYoYXJndW1lbnRzLmxlbmd0aD4wJiZ0eXBl b2YgYXJndW1lbnRzWzBdPT0nb2JqZWN0Jyl7Y29udGV4dC5hcGkuYWRkTW9kdWxl KGNvbnRleHQsYXJndW1lbnRzWzBdKTt9ZWxzZXthcmd1bWVudHM9JC5tYWtlQXJy YXkoYXJndW1lbnRzKTtpZihhcmd1bWVudHMubGVuZ3RoPjApe3ZhciBjYWxsPWFy Z3VtZW50cy5zaGlmdCgpO2lmKGNhbGwgaW4gY29udGV4dC5hcGkpe2NvbnRleHQu YXBpW2NhbGxdKGNvbnRleHQsYXJndW1lbnRzWzBdPT11bmRlZmluZWQ/e306YXJn dW1lbnRzWzBdKTt9fX0KcmV0dXJuICQodGhpcykuZGF0YSgnd2lraUVkaXRvci1j b250ZXh0Jyxjb250ZXh0KTt9O30pKGpRdWVyeSk7UmVnRXhwLmVzY2FwZT1mdW5j dGlvbihzKXtyZXR1cm4gcy5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8XC9cXFtcXV0p L2csJ1xcJDEnKTt9OyhmdW5jdGlvbigkKXskLndpa2lFZGl0b3IubW9kdWxlcy5k aWFsb2dzPXthcGk6e2FkZERpYWxvZzpmdW5jdGlvbihjb250ZXh0LGRhdGEpeyQu d2lraUVkaXRvci5tb2R1bGVzLmRpYWxvZ3MuZm4uY3JlYXRlKGNvbnRleHQseydt b2R1bGVzJzpkYXRhfSl9LG9wZW5EaWFsb2c6ZnVuY3Rpb24oY29udGV4dCxkYXRh KXtpZihkYXRhLmRpYWxvZyBpbiAkLndpa2lFZGl0b3IubW9kdWxlcy5kaWFsb2dz Lm1vZHVsZXMpeyQoJyMnKyQud2lraUVkaXRvci5tb2R1bGVzLmRpYWxvZ3MubW9k dWxlc1tkYXRhLmRpYWxvZ10uaWQpLmRpYWxvZygnb3BlbicpO319LGNsb3NlRGlh bG9nOmZ1bmN0aW9uKGNvbnRleHQsZGF0YSl7aWYoZGF0YS5kaWFsb2cgaW4gJC53 aWtpRWRpdG9yLm1vZHVsZXMuZGlhbG9ncy5tb2R1bGVzKXskKCcjJyskLndpa2lF ZGl0b3IubW9kdWxlcy5kaWFsb2dzLm1vZHVsZXNbZGF0YS5kaWFsb2ddLmlkKS5k aWFsb2coJ2Nsb3NlJyk7fX19LGZuOntjcmVhdGU6ZnVuY3Rpb24oY29udGV4dCxj b25maWcpe2Zvcihtb2R1bGUgaW4gY29uZmlnKXskLndpa2lFZGl0b3IubW9kdWxl cy5kaWFsb2dzLm1vZHVsZXNbbW9kdWxlXT1jb25maWdbbW9kdWxlXTt9Cm12SnNM b2FkZXIuZG9Mb2FkKFsnJGoudWknLCckai51aS5kaWFsb2cnLCckai51aS5kcmFn Z2FibGUnLCckai51aS5yZXNpemFibGUnXSxmdW5jdGlvbigpe2Zvcihtb2R1bGUg aW4gJC53aWtpRWRpdG9yLm1vZHVsZXMuZGlhbG9ncy5tb2R1bGVzKXt2YXIgbW9k dWxlPSQud2lraUVkaXRvci5tb2R1bGVzLmRpYWxvZ3MubW9kdWxlc1ttb2R1bGVd O2lmKCQoJyMnK21vZHVsZS5pZCkuc2l6ZSgpPT0wKXt2YXIgY29uZmlndXJhdGlv bj1tb2R1bGUuZGlhbG9nO2NvbmZpZ3VyYXRpb24uYmdpZnJhbWU9dHJ1ZTtjb25m aWd1cmF0aW9uLmF1dG9PcGVuPWZhbHNlO2NvbmZpZ3VyYXRpb24ubW9kYWw9dHJ1 ZTtjb25maWd1cmF0aW9uLnRpdGxlPSQud2lraUVkaXRvci5hdXRvTXNnKG1vZHVs ZSwndGl0bGUnKTtjb25maWd1cmF0aW9uLm5ld0J1dHRvbnM9e307Zm9yKG1zZyBp biBjb25maWd1cmF0aW9uLmJ1dHRvbnMpCmNvbmZpZ3VyYXRpb24ubmV3QnV0dG9u c1tnTShtc2cpXT1jb25maWd1cmF0aW9uLmJ1dHRvbnNbbXNnXTtjb25maWd1cmF0 aW9uLmJ1dHRvbnM9Y29uZmlndXJhdGlvbi5uZXdCdXR0b25zOyQoJzxkaXYgLz4g JykuYXR0cignaWQnLG1vZHVsZS5pZCkuaHRtbChtb2R1bGUuaHRtbCkuZGF0YSgn Y29udGV4dCcsY29udGV4dCkuYXBwZW5kVG8oJCgnYm9keScpKS5lYWNoKG1vZHVs ZS5pbml0KS5kaWFsb2coY29uZmlndXJhdGlvbikuYmluZCgnZGlhbG9nb3Blbics JC53aWtpRWRpdG9yLm1vZHVsZXMuZGlhbG9ncy5mbi5yZXNpemUpLmZpbmQoJy51 aS10YWJzJykuYmluZCgndGFic3Nob3cnLGZ1bmN0aW9uKCl7JCh0aGlzKS5jbG9z ZXN0KCcudWktZGlhbG9nLWNvbnRlbnQnKS5lYWNoKCQud2lraUVkaXRvci5tb2R1 bGVzLmRpYWxvZ3MuZm4ucmVzaXplKTt9KTt2YXIgbWF4VEk9MDskaignW3RhYmlu ZGV4XScpLmVhY2goZnVuY3Rpb24oKXt2YXIgdGk9cGFyc2VJbnQoJGoodGhpcyku YXR0cigndGFiaW5kZXgnKSk7aWYodGk+bWF4VEkpCm1heFRJPXRpO30pO3ZhciB0 YWJJbmRleD1tYXhUSSsxOyRqKCcudWktZGlhbG9nIGlucHV0LCAudWktZGlhbG9n IGJ1dHRvbicpLm5vdCgnW3RhYmluZGV4XScpLmVhY2goZnVuY3Rpb24oKXskaih0 aGlzKS5hdHRyKCd0YWJpbmRleCcsdGFiSW5kZXgrKyk7fSk7fX19KTt9LHJlc2l6 ZTpmdW5jdGlvbigpe3ZhciB3cmFwcGVyPSQodGhpcykuY2xvc2VzdCgnLnVpLWRp YWxvZycpO3ZhciBvbGRXaWR0aD13cmFwcGVyLndpZHRoKCk7dmFyIG9sZEhpZGRl bj0kKHRoaXMpLmZpbmQoJyonKS5ub3QoJzp2aXNpYmxlJyk7b2xkSGlkZGVuLmVh Y2goZnVuY3Rpb24oKXskKHRoaXMpLmRhdGEoJ29sZHN0eWxlJywkKHRoaXMpLmF0 dHIoJ3N0eWxlJykpO30pO29sZEhpZGRlbi5zaG93KCk7dmFyIG9sZFdTPSQodGhp cykuY3NzKCd3aGl0ZS1zcGFjZScpOyQodGhpcykuY3NzKCd3aGl0ZS1zcGFjZScs J25vd3JhcCcpO2lmKHdyYXBwZXIud2lkdGgoKTw9JCh0aGlzKS5nZXQoMCkuc2Ny b2xsV2lkdGgpeyQodGhpcykud2lkdGgoJCh0aGlzKS5nZXQoMCkuc2Nyb2xsV2lk dGgpO3dyYXBwZXIud2lkdGgod3JhcHBlci5nZXQoMCkuc2Nyb2xsV2lkdGgpOyQo dGhpcykuZGlhbG9nKHsnd2lkdGgnOndyYXBwZXIud2lkdGgoKX0pO3dyYXBwZXIu Y3NzKCdsZWZ0JyxwYXJzZUludCh3cmFwcGVyLmNzcygnbGVmdCcpKS0KKHdyYXBw ZXIud2lkdGgoKS1vbGRXaWR0aCkvMik7fQokKHRoaXMpLmNzcygnd2hpdGUtc3Bh Y2UnLG9sZFdTKTtvbGRIaWRkZW4uZWFjaChmdW5jdGlvbigpeyQodGhpcykuYXR0 cignc3R5bGUnLCQodGhpcykuZGF0YSgnb2xkc3R5bGUnKSk7fSk7fX0sJ21vZHVs ZXMnOnt9fTt9KShqUXVlcnkpOyhmdW5jdGlvbigkKXskLndpa2lFZGl0b3IubW9k dWxlcy50b29sYmFyPXthcGk6e2FkZFRvVG9vbGJhcjpmdW5jdGlvbihjb250ZXh0 LGRhdGEpe2Zvcih0eXBlIGluIGRhdGEpe3N3aXRjaCh0eXBlKXtjYXNlJ3NlY3Rp b25zJzp2YXIgJHNlY3Rpb25zPWNvbnRleHQubW9kdWxlcy4kdG9vbGJhci5maW5k KCdkaXYuc2VjdGlvbnMnKTt2YXIgJHRhYnM9Y29udGV4dC5tb2R1bGVzLiR0b29s YmFyLmZpbmQoJ2Rpdi50YWJzJyk7Zm9yKHNlY3Rpb24gaW4gZGF0YVt0eXBlXSl7 aWYoc2VjdGlvbj09J21haW4nKXtjb250ZXh0Lm1vZHVsZXMuJHRvb2xiYXIucHJl cGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZuLmJ1aWxkU2VjdGlv bihjb250ZXh0LHNlY3Rpb24sZGF0YVt0eXBlXVtzZWN0aW9uXSkpO2NvbnRpbnVl O30KJHNlY3Rpb25zLmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFy LmZuLmJ1aWxkU2VjdGlvbihjb250ZXh0LHNlY3Rpb24sZGF0YVt0eXBlXVtzZWN0 aW9uXSkpOyR0YWJzLmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFy LmZuLmJ1aWxkVGFiKGNvbnRleHQsc2VjdGlvbixkYXRhW3R5cGVdW3NlY3Rpb25d KSk7JHNlY3Rpb249JHNlY3Rpb25zLmZpbmQoJy5zZWN0aW9uOnZpc2libGUnKTtp Zigkc2VjdGlvbi5zaXplKCkpeyRzZWN0aW9ucy5hbmltYXRlKHsnaGVpZ2h0Jzok c2VjdGlvbi5vdXRlckhlaWdodCgpfSwnZmFzdCcpO319CmJyZWFrO2Nhc2UnZ3Jv dXBzJzppZighKCdzZWN0aW9uJ2luIGRhdGEpKXtjb250aW51ZTt9CnZhciAkc2Vj dGlvbj1jb250ZXh0Lm1vZHVsZXMuJHRvb2xiYXIuZmluZCgnZGl2W3JlbD0nK2Rh dGEuc2VjdGlvbisnXS5zZWN0aW9uJyk7Zm9yKGdyb3VwIGluIGRhdGFbdHlwZV0p eyRzZWN0aW9uLmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZu LmJ1aWxkR3JvdXAoY29udGV4dCxncm91cCxkYXRhW3R5cGVdW2dyb3VwXSkpO30K YnJlYWs7Y2FzZSd0b29scyc6aWYoISgnc2VjdGlvbidpbiBkYXRhJiYnZ3JvdXAn aW4gZGF0YSkpe2NvbnRpbnVlO30KdmFyICRncm91cD1jb250ZXh0Lm1vZHVsZXMu JHRvb2xiYXIuZmluZCgnZGl2W3JlbD0nK2RhdGEuc2VjdGlvbisnXS5zZWN0aW9u ICcrJ2RpdltyZWw9JytkYXRhLmdyb3VwKyddLmdyb3VwJyk7Zm9yKHRvb2wgaW4g ZGF0YVt0eXBlXSl7JGdyb3VwLmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50 b29sYmFyLmZuLmJ1aWxkVG9vbChjb250ZXh0LHRvb2wsZGF0YVt0eXBlXVt0b29s XSkpO30KYnJlYWs7Y2FzZSdwYWdlcyc6aWYoISgnc2VjdGlvbidpbiBkYXRhKSl7 Y29udGludWU7fQp2YXIgJHBhZ2VzPWNvbnRleHQubW9kdWxlcy4kdG9vbGJhci5m aW5kKCdkaXZbcmVsPScrZGF0YS5zZWN0aW9uKyddLnNlY3Rpb24gLnBhZ2VzJyk7 dmFyICRpbmRleD1jb250ZXh0Lm1vZHVsZXMuJHRvb2xiYXIuZmluZCgnZGl2W3Jl bD0nK2RhdGEuc2VjdGlvbisnXS5zZWN0aW9uIC5pbmRleCcpO2ZvcihwYWdlIGlu IGRhdGFbdHlwZV0peyRwYWdlcy5hcHBlbmQoJC53aWtpRWRpdG9yLm1vZHVsZXMu dG9vbGJhci5mbi5idWlsZFBhZ2UoY29udGV4dCxwYWdlLGRhdGFbdHlwZV1bcGFn ZV0pKTskaW5kZXguYXBwZW5kKCQud2lraUVkaXRvci5tb2R1bGVzLnRvb2xiYXIu Zm4uYnVpbGRCb29rbWFyayhjb250ZXh0LHBhZ2UsZGF0YVt0eXBlXVtwYWdlXSkp O30KJC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi51cGRhdGVCb29rbGV0 U2VsZWN0aW9uKGNvbnRleHQscGFnZSwkcGFnZXMsJGluZGV4KTticmVhaztjYXNl J3Jvd3MnOmlmKCEoJ3NlY3Rpb24naW4gZGF0YSYmJ3BhZ2UnaW4gZGF0YSkpe2Nv bnRpbnVlO30KdmFyICR0YWJsZT1jb250ZXh0Lm1vZHVsZXMuJHRvb2xiYXIuZmlu ZCgnZGl2W3JlbD0nK2RhdGEuc2VjdGlvbisnXS5zZWN0aW9uICcrJ2RpdltyZWw9 JytkYXRhLnBhZ2UrJ10ucGFnZSB0YWJsZScpO2Zvcihyb3cgaW4gZGF0YVt0eXBl XSl7JHRhYmxlLmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZu LmJ1aWxkUm93KGNvbnRleHQsZGF0YVt0eXBlXVtyb3ddKSk7fQpicmVhaztjYXNl J2NoYXJhY3RlcnMnOmlmKCEoJ3NlY3Rpb24naW4gZGF0YSYmJ3BhZ2UnaW4gZGF0 YSkpe2NvbnRpbnVlO30KJGNoYXJhY3RlcnM9Y29udGV4dC5tb2R1bGVzLiR0b29s YmFyLmZpbmQoJ2RpdltyZWw9JytkYXRhLnNlY3Rpb24rJ10uc2VjdGlvbiAnKydk aXZbcmVsPScrZGF0YS5wYWdlKyddLnBhZ2UgZGl2Jyk7dmFyIGFjdGlvbnM9JGNo YXJhY3RlcnMuZGF0YSgnYWN0aW9ucycpO2ZvcihjaGFyYWN0ZXIgaW4gZGF0YVt0 eXBlXSl7JGNoYXJhY3RlcnMuYXBwZW5kKCQoJC53aWtpRWRpdG9yLm1vZHVsZXMu dG9vbGJhci5mbi5idWlsZENoYXJhY3RlcihkYXRhW3R5cGVdW2NoYXJhY3Rlcl0s YWN0aW9ucykpLmNsaWNrKGZ1bmN0aW9uKCl7JC53aWtpRWRpdG9yLm1vZHVsZXMu dG9vbGJhci5mbi5kb0FjdGlvbigkKHRoaXMpLnBhcmVudCgpLmRhdGEoJ2NvbnRl eHQnKSwkKHRoaXMpLnBhcmVudCgpLmRhdGEoJ2FjdGlvbnMnKVskKHRoaXMpLmF0 dHIoJ3JlbCcpXSk7cmV0dXJuIGZhbHNlO30pKTt9CmJyZWFrO2RlZmF1bHQ6YnJl YWs7fX19LHJlbW92ZUZyb21Ub29sYmFyOmZ1bmN0aW9uKGNvbnRleHQsZGF0YSl7 anNfbG9nKCJmOnJlbW92ZUZyb21Ub29sYmFyIik7aWYodHlwZW9mIGRhdGEuc2Vj dGlvbj09J3N0cmluZycpe3ZhciB0YWI9J2Rpdi50YWJzIHNwYW5bcmVsPScrZGF0 YS5zZWN0aW9uKyddLnRhYic7dmFyIHRhcmdldD0nZGl2W3JlbD0nK2RhdGEuc2Vj dGlvbisnXS5zZWN0aW9uJztpZih0eXBlb2YgZGF0YS5ncm91cD09J3N0cmluZycp e3RhcmdldCs9JyBkaXZbcmVsPScrZGF0YS5ncm91cCsnXS5ncm91cCc7aWYodHlw ZW9mIGRhdGEudG9vbD09J3N0cmluZycpe3RhcmdldCs9JyBkaXZbcmVsPScrZGF0 YS50b29sKyddLnRvb2wnO319ZWxzZSBpZih0eXBlb2YgZGF0YS5wYWdlPT0nc3Ry aW5nJyl7dmFyIGluZGV4PXRhcmdldCsnIGRpdi5pbmRleCBkaXZbcmVsPScrZGF0 YS5wYWdlKyddJzt0YXJnZXQrPScgZGl2LnBhZ2VzIGRpdltyZWw9JytkYXRhLnBh Z2UrJ10ucGFnZSc7aWYodHlwZW9mIGRhdGEuY2hhcmFjdGVyPT0nc3RyaW5nJyl7 dGFyZ2V0Kz0nIGFbcmVsPScrZGF0YS5jaGFyYWN0ZXIrJ10nO31lbHNlIGlmKHR5 cGVvZiBkYXRhLnJvdz09J251bWJlcicpe3RhcmdldCs9JyB0YWJsZSB0cjpub3Qo Omhhcyh0aCkpOmVxKCcrZGF0YS5yb3crJyknO31lbHNle2NvbnRleHQubW9kdWxl cy4kdG9vbGJhci5maW5kKGluZGV4KS5yZW1vdmUoKTskLndpa2lFZGl0b3IubW9k dWxlcy50b29sYmFyLmZuLnVwZGF0ZUJvb2tsZXRTZWxlY3Rpb24oY29udGV4dCxu dWxsLGNvbnRleHQubW9kdWxlcy4kdG9vbGJhci5maW5kKHRhcmdldCksY29udGV4 dC5tb2R1bGVzLiR0b29sYmFyLmZpbmQoaW5kZXgpKTt9fWVsc2V7Y29udGV4dC5t b2R1bGVzLiR0b29sYmFyLmZpbmQodGFiKS5yZW1vdmUoKTt9CmpzX2xvZygndGFy Z2V0IGlzOiAnK3RhcmdldCk7Y29udGV4dC5tb2R1bGVzLiR0b29sYmFyLmZpbmQo dGFyZ2V0KS5yZW1vdmUoKTt9fX0sZm46e2NyZWF0ZTpmdW5jdGlvbihjb250ZXh0 LGNvbmZpZyl7aWYoJyR0b29sYmFyJ2luIGNvbnRleHQubW9kdWxlcyl7cmV0dXJu O30KY29udGV4dC5tb2R1bGVzLiR0b29sYmFyPSQoJzxkaXYgLz4nKS5hZGRDbGFz cygnd2lraUVkaXRvci11aS10b29sYmFyJykuYXR0cignaWQnLCd3aWtpRWRpdG9y LXVpLXRvb2xiYXInKTskLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZuLmJ1 aWxkKGNvbnRleHQsY29uZmlnKTtjb250ZXh0LiR1aS5maW5kKCcud2lraUVkaXRv ci11aS10b3AnKS5hcHBlbmQoY29udGV4dC5tb2R1bGVzLiR0b29sYmFyKTt9LGRv QWN0aW9uOmZ1bmN0aW9uKGNvbnRleHQsYWN0aW9uLHNvdXJjZSl7aWYoJC50cmFj a0FjdGlvbiE9dW5kZWZpbmVkJiZzb3VyY2UuY2xvc2VzdCgnLndpa2lFZGl0b3It dWktdG9vbGJhcicpLnNpemUoKSl7dmFyIHJlbHM9W107dmFyIHN0ZXA9c291cmNl O3ZhciBpPTA7d2hpbGUoIXN0ZXAuaGFzQ2xhc3MoJ3dpa2lFZGl0b3ItdWktdG9v bGJhcicpKXtpZihpPjI1KXticmVhazt9CmkrKzt2YXIgcmVsPXN0ZXAuYXR0cign cmVsJyk7aWYocmVsKXtyZWxzLnB1c2goc3RlcC5hdHRyKCdyZWwnKSk7fQpzdGVw PXN0ZXAucGFyZW50KCk7fQpyZWxzLnJldmVyc2UoKTt2YXIgaWQ9cmVscy5qb2lu KCcuJyk7JC50cmFja0FjdGlvbihpZCk7fQpzd2l0Y2goYWN0aW9uLnR5cGUpe2Nh c2UncmVwbGFjZSc6Y2FzZSdlbmNhcHN1bGF0ZSc6dmFyIHBhcnRzPXsncHJlJzon JywncGVyaSc6JycsJ3Bvc3QnOicnfTtmb3IocGFydCBpbiBwYXJ0cyl7aWYocGFy dCsnTXNnJ2luIGFjdGlvbi5vcHRpb25zKXtwYXJ0c1twYXJ0XT1nTShhY3Rpb24u b3B0aW9uc1twYXJ0KydNc2cnXSwoYWN0aW9uLm9wdGlvbnNbcGFydF18fG51bGwp KTt9ZWxzZXtwYXJ0c1twYXJ0XT0oYWN0aW9uLm9wdGlvbnNbcGFydF18fCcnKX19 CmlmKCdyZWdleCdpbiBhY3Rpb24ub3B0aW9ucyYmJ3JlZ2V4UmVwbGFjZSdpbiBh Y3Rpb24ub3B0aW9ucyl7dmFyIHNlbGVjdGlvbj1jb250ZXh0LiR0ZXh0YXJlYS5n ZXRTZWxlY3Rpb24oKTtpZihzZWxlY3Rpb24hPScnJiZzZWxlY3Rpb24ubWF0Y2go YWN0aW9uLm9wdGlvbnMucmVnZXgpKXtwYXJ0cy5wZXJpPXNlbGVjdGlvbi5yZXBs YWNlKGFjdGlvbi5vcHRpb25zLnJlZ2V4LGFjdGlvbi5vcHRpb25zLnJlZ2V4UmVw bGFjZSk7cGFydHMucHJlPXBhcnRzLnBvc3Q9Jyc7fX0KY29udGV4dC4kdGV4dGFy ZWEuZW5jYXBzdWxhdGVTZWxlY3Rpb24ocGFydHMucHJlLHBhcnRzLnBlcmkscGFy dHMucG9zdCxhY3Rpb24ub3B0aW9ucy5vd25saW5lLGFjdGlvbi50eXBlPT0ncmVw bGFjZScpO2JyZWFrO2Nhc2UnY2FsbGJhY2snOmlmKHR5cGVvZiBhY3Rpb24uZXhl Y3V0ZT09J2Z1bmN0aW9uJyl7YWN0aW9uLmV4ZWN1dGUoY29udGV4dCk7fQpicmVh aztjYXNlJ2RpYWxvZyc6Y29udGV4dC4kdGV4dGFyZWEud2lraUVkaXRvcignb3Bl bkRpYWxvZycseydkaWFsb2cnOmFjdGlvbi5tb2R1bGV9KTticmVhaztkZWZhdWx0 OmJyZWFrO319LGJ1aWxkR3JvdXA6ZnVuY3Rpb24oY29udGV4dCxpZCxncm91cCl7 dmFyICRncm91cD0kKCc8ZGl2IC8+JykuYXR0cih7J2NsYXNzJzonZ3JvdXAgZ3Jv dXAtJytpZCwncmVsJzppZH0pO3ZhciBsYWJlbD0kLndpa2lFZGl0b3IuYXV0b01z Zyhncm91cCwnbGFiZWwnKTtpZihsYWJlbCl7JGdyb3VwLmFwcGVuZCgnPGRpdiBj bGFzcz0ibGFiZWwiPicrbGFiZWwrJzwvZGl2PicpfQp2YXIgZW1wdHk9dHJ1ZTtp ZigndG9vbHMnaW4gZ3JvdXApe2Zvcih0b29sIGluIGdyb3VwLnRvb2xzKXt2YXIg dG9vbD0kLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZuLmJ1aWxkVG9vbChj b250ZXh0LHRvb2wsZ3JvdXAudG9vbHNbdG9vbF0pO2lmKHRvb2wpe2VtcHR5PWZh bHNlOyRncm91cC5hcHBlbmQodG9vbCk7fX19CnJldHVybiBlbXB0eT9udWxsOiRn cm91cDt9LGJ1aWxkVG9vbDpmdW5jdGlvbihjb250ZXh0LGlkLHRvb2wpe2lmKCdm aWx0ZXJzJ2luIHRvb2wpe2ZvcihmaWx0ZXIgaW4gdG9vbC5maWx0ZXJzKXtpZigk KHRvb2wuZmlsdGVyc1tmaWx0ZXJdKS5zaXplKCk9PTApe3JldHVybiBudWxsO319 fQp2YXIgbGFiZWw9JC53aWtpRWRpdG9yLmF1dG9Nc2codG9vbCwnbGFiZWwnKTtz d2l0Y2godG9vbC50eXBlKXtjYXNlJ2J1dHRvbic6dmFyIHNyYz10b29sLmljb24r Jz8nK3dnV2lraUVkaXRvckljb25WZXJzaW9uO2lmKHNyYy5pbmRleE9mKCdodHRw Oi8vJykhPT0wJiZzcmMuaW5kZXhPZignaHR0cHM6Ly8nKSE9PTApe3NyYz0kLndp a2lFZGl0b3IuaW1nUGF0aCsndG9vbGJhci8nK3NyYzt9CiRidXR0b249JCgnPGlt ZyAvPicpLmF0dHIoeydzcmMnOnNyYywnd2lkdGgnOjIyLCdoZWlnaHQnOjIyLCdh bHQnOmxhYmVsLCd0aXRsZSc6bGFiZWwsJ3JlbCc6aWQsJ2NsYXNzJzondG9vbCB0 b29sLWJ1dHRvbid9KTtpZignYWN0aW9uJ2luIHRvb2wpeyRidXR0b24uZGF0YSgn YWN0aW9uJyx0b29sLmFjdGlvbikuZGF0YSgnY29udGV4dCcsY29udGV4dCkuY2xp Y2soZnVuY3Rpb24oKXskLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZuLmRv QWN0aW9uKCQodGhpcykuZGF0YSgnY29udGV4dCcpLCQodGhpcykuZGF0YSgnYWN0 aW9uJyksJCh0aGlzKSk7cmV0dXJuIGZhbHNlO30pO30KcmV0dXJuICRidXR0b247 Y2FzZSdzZWxlY3QnOnZhciAkc2VsZWN0PSQoJzxkaXYgLz4nKS5hdHRyKHsncmVs JzppZCwnY2xhc3MnOid0b29sIHRvb2wtc2VsZWN0J30pLmNsaWNrKGZ1bmN0aW9u KCl7dmFyICRvcHRpb25zPSQodGhpcykuZmluZCgnLm9wdGlvbnMnKTskb3B0aW9u cy5hbmltYXRlKHsnb3BhY2l0eSc6J3RvZ2dsZSd9LCdmYXN0Jyk7fSk7JG9wdGlv bnM9JCgnPGRpdiAvPicpLmFkZENsYXNzKCdvcHRpb25zJyk7aWYoJ2xpc3QnaW4g dG9vbCl7Zm9yKG9wdGlvbiBpbiB0b29sLmxpc3Qpe3ZhciBvcHRpb25MYWJlbD0k Lndpa2lFZGl0b3IuYXV0b01zZyh0b29sLmxpc3Rbb3B0aW9uXSwnbGFiZWwnKTsk b3B0aW9ucy5hcHBlbmQoJCgnPGEgLz4nKS5kYXRhKCdhY3Rpb24nLHRvb2wubGlz dFtvcHRpb25dLmFjdGlvbikuZGF0YSgnY29udGV4dCcsY29udGV4dCkuY2xpY2so ZnVuY3Rpb24oKXskLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZuLmRvQWN0 aW9uKCQodGhpcykuZGF0YSgnY29udGV4dCcpLCQodGhpcykuZGF0YSgnYWN0aW9u JyksJCh0aGlzKSk7fSkudGV4dChvcHRpb25MYWJlbCkuYWRkQ2xhc3MoJ29wdGlv bicpLmF0dHIoJ3JlbCcsb3B0aW9uKSk7fX0KJHNlbGVjdC5hcHBlbmQoJCgnPGRp diAvPicpLmFkZENsYXNzKCdtZW51JykuYXBwZW5kKCRvcHRpb25zKSk7JHNlbGVj dC5hcHBlbmQoJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsYWJlbCcpLnRleHQobGFi ZWwpKTtyZXR1cm4gJHNlbGVjdDtkZWZhdWx0OnJldHVybiBudWxsO319LGJ1aWxk Qm9va21hcms6ZnVuY3Rpb24oY29udGV4dCxpZCxwYWdlKXt2YXIgbGFiZWw9JC53 aWtpRWRpdG9yLmF1dG9Nc2cocGFnZSwnbGFiZWwnKTtyZXR1cm4gJCgnPGRpdiAv PicpLnRleHQobGFiZWwpLmF0dHIoJ3JlbCcsaWQpLmRhdGEoJ2NvbnRleHQnLGNv bnRleHQpLmJpbmQoJ21vdXNlZG93bicsZnVuY3Rpb24oKXskKHRoaXMpLnBhcmVu dCgpLnBhcmVudCgpLmZpbmQoJy5wYWdlJykuaGlkZSgpOyQodGhpcykucGFyZW50 KCkucGFyZW50KCkuZmluZCgnLnBhZ2UtJyskKHRoaXMpLmF0dHIoJ3JlbCcpKS5z aG93KCk7JCh0aGlzKS5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCdjdXJyZW50Jyk7 JCh0aGlzKS5hZGRDbGFzcygnY3VycmVudCcpO3ZhciBzZWN0aW9uPSQodGhpcyku cGFyZW50KCkucGFyZW50KCkuYXR0cigncmVsJyk7aWYoJC50cmFja0FjdGlvbiE9 dW5kZWZpbmVkKXskLnRyYWNrQWN0aW9uKHNlY3Rpb24rJy4nKyQodGhpcykuYXR0 cigncmVsJykpO30KJC5jb29raWUoJ3dpa2lFZGl0b3ItJyskKHRoaXMpLmRhdGEo J2NvbnRleHQnKS5pbnN0YW5jZSsnLWJvb2tsZXQtJytzZWN0aW9uKyctcGFnZScs JCh0aGlzKS5hdHRyKCdyZWwnKSk7fSk7fSxidWlsZFBhZ2U6ZnVuY3Rpb24oY29u dGV4dCxpZCxwYWdlKXt2YXIgJHBhZ2U9JCgnPGRpdiAvPicpLmF0dHIoeydjbGFz cyc6J3BhZ2UgcGFnZS0nK2lkLCdyZWwnOmlkfSk7c3dpdGNoKHBhZ2UubGF5b3V0 KXtjYXNlJ3RhYmxlJzokcGFnZS5hZGRDbGFzcygncGFnZS10YWJsZScpO3ZhciBo dG1sPSc8dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wICcrJ2JvcmRl cj0wIHdpZHRoPSIxMDAlIiBjbGFzcz0idGFibGUgdGFibGUtIicraWQrJyI+Jztp ZignaGVhZGluZ3MnaW4gcGFnZSl7aHRtbCs9JC53aWtpRWRpdG9yLm1vZHVsZXMu dG9vbGJhci5mbi5idWlsZEhlYWRpbmcoY29udGV4dCxwYWdlLmhlYWRpbmdzKX0K aWYoJ3Jvd3MnaW4gcGFnZSl7Zm9yKHJvdyBpbiBwYWdlLnJvd3Mpe2h0bWwrPSQu d2lraUVkaXRvci5tb2R1bGVzLnRvb2xiYXIuZm4uYnVpbGRSb3coY29udGV4dCxw YWdlLnJvd3Nbcm93XSl9fQokcGFnZS5odG1sKGh0bWwpO2JyZWFrO2Nhc2UnY2hh cmFjdGVycyc6JHBhZ2UuYWRkQ2xhc3MoJ3BhZ2UtY2hhcmFjdGVycycpOyRjaGFy YWN0ZXJzPSQoJzxkaXYgLz4nKS5kYXRhKCdjb250ZXh0Jyxjb250ZXh0KS5kYXRh KCdhY3Rpb25zJyx7fSk7dmFyIGFjdGlvbnM9JGNoYXJhY3RlcnMuZGF0YSgnYWN0 aW9ucycpO2lmKCdsYW5ndWFnZSdpbiBwYWdlKXskY2hhcmFjdGVycy5hdHRyKCds YW5nJyxwYWdlLmxhbmd1YWdlKTt9CmlmKCdkaXJlY3Rpb24naW4gcGFnZSl7JGNo YXJhY3RlcnMuYXR0cignZGlyJyxwYWdlLmRpcmVjdGlvbik7fQppZignY2hhcmFj dGVycydpbiBwYWdlKXt2YXIgaHRtbD0nJztmb3IoY2hhcmFjdGVyIGluIHBhZ2Uu Y2hhcmFjdGVycyl7aHRtbCs9JC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5m bi5idWlsZENoYXJhY3RlcihwYWdlLmNoYXJhY3RlcnNbY2hhcmFjdGVyXSxhY3Rp b25zKTt9CiRjaGFyYWN0ZXJzLmh0bWwoaHRtbCkuY2hpbGRyZW4oKS5jbGljayhm dW5jdGlvbigpeyQud2lraUVkaXRvci5tb2R1bGVzLnRvb2xiYXIuZm4uZG9BY3Rp b24oJCh0aGlzKS5wYXJlbnQoKS5kYXRhKCdjb250ZXh0JyksJCh0aGlzKS5wYXJl bnQoKS5kYXRhKCdhY3Rpb25zJylbJCh0aGlzKS5hdHRyKCdyZWwnKV0sJCh0aGlz KSk7cmV0dXJuIGZhbHNlO30pO30KJHBhZ2UuYXBwZW5kKCRjaGFyYWN0ZXJzKTti cmVhazt9CnJldHVybiAkcGFnZTt9LGJ1aWxkSGVhZGluZzpmdW5jdGlvbihjb250 ZXh0LGhlYWRpbmdzKXt2YXIgaHRtbD0nPHRyPic7Zm9yKGhlYWRpbmcgaW4gaGVh ZGluZ3Mpe2h0bWwrPSc8dGg+JyskLndpa2lFZGl0b3IuYXV0b01zZyhoZWFkaW5n c1toZWFkaW5nXSxbJ2h0bWwnLCd0ZXh0J10pKyc8L3RoPic7fQpyZXR1cm4gaHRt bDt9LGJ1aWxkUm93OmZ1bmN0aW9uKGNvbnRleHQscm93KXt2YXIgaHRtbD0nPHRy Pic7Zm9yKGNlbGwgaW4gcm93KXtodG1sKz0nPHRkIGNsYXNzPSJjZWxsIGNlbGwt JytjZWxsKyciIHZhbGlnbj0idG9wIj48c3Bhbj4nKwokLndpa2lFZGl0b3IuYXV0 b01zZyhyb3dbY2VsbF0sWydodG1sJywndGV4dCddKSsnPC9zcGFuPjwvdGQ+Jzt9 Cmh0bWwrPSc8L3RyPic7cmV0dXJuIGh0bWw7fSxidWlsZENoYXJhY3RlcjpmdW5j dGlvbihjaGFyYWN0ZXIsYWN0aW9ucyl7aWYodHlwZW9mIGNoYXJhY3Rlcj09J3N0 cmluZycpe2NoYXJhY3Rlcj17J2xhYmVsJzpjaGFyYWN0ZXIsJ2FjdGlvbic6eyd0 eXBlJzonZW5jYXBzdWxhdGUnLCdvcHRpb25zJzp7J3ByZSc6Y2hhcmFjdGVyfX19 O31lbHNlIGlmKDAgaW4gY2hhcmFjdGVyJiYxIGluIGNoYXJhY3Rlcil7Y2hhcmFj dGVyPXsnbGFiZWwnOmNoYXJhY3RlclswXSwnYWN0aW9uJzp7J3R5cGUnOidlbmNh cHN1bGF0ZScsJ29wdGlvbnMnOnsncHJlJzpjaGFyYWN0ZXJbMV19fX07fQppZign YWN0aW9uJ2luIGNoYXJhY3RlciYmJ2xhYmVsJ2luIGNoYXJhY3Rlcil7YWN0aW9u c1tjaGFyYWN0ZXIubGFiZWxdPWNoYXJhY3Rlci5hY3Rpb247cmV0dXJuJzxhIHJl bD0iJytjaGFyYWN0ZXIubGFiZWwrJyIgaHJlZj0iIyI+JytjaGFyYWN0ZXIubGFi ZWwrJzwvYT4nO319LGJ1aWxkVGFiOmZ1bmN0aW9uKGNvbnRleHQsaWQsc2VjdGlv bil7dmFyIHNlbGVjdGVkPSQuY29va2llKCd3aWtpRWRpdG9yLScrY29udGV4dC5p bnN0YW5jZSsnLXRvb2xiYXItc2VjdGlvbicpO3JldHVybiAkKCc8c3BhbiAvPicp LmF0dHIoeydjbGFzcyc6J3RhYiB0YWItJytpZCwncmVsJzppZH0pLmFwcGVuZCgk KCc8YSAvPicpLmFkZENsYXNzKHNlbGVjdGVkPT1pZD8nY3VycmVudCc6bnVsbCku YXR0cignaHJlZicsJyMnKS50ZXh0KCQud2lraUVkaXRvci5hdXRvTXNnKHNlY3Rp b24sJ2xhYmVsJykpLmRhdGEoJ2NvbnRleHQnLGNvbnRleHQpLmJpbmQoJ21vdXNl dXAnLGZ1bmN0aW9uKGUpeyQodGhpcykuYmx1cigpO30pLmJpbmQoJ2NsaWNrJyxm dW5jdGlvbihlKXt2YXIgJHNlY3Rpb25zPSQodGhpcykuZGF0YSgnY29udGV4dCcp LiR1aS5maW5kKCcuc2VjdGlvbnMnKTt2YXIgJHNlY3Rpb249JCh0aGlzKS5kYXRh KCdjb250ZXh0JykuJHVpLmZpbmQoJy5zZWN0aW9uLScrJCh0aGlzKS5wYXJlbnQo KS5hdHRyKCdyZWwnKSk7dmFyIHNob3c9JHNlY3Rpb24uY3NzKCdkaXNwbGF5Jyk9 PSdub25lJzskcHJldmlvdXNTZWN0aW9ucz0kc2VjdGlvbi5wYXJlbnQoKS5maW5k KCcuc2VjdGlvbjp2aXNpYmxlJyk7JHByZXZpb3VzU2VjdGlvbnMuY3NzKCdwb3Np dGlvbicsJ2Fic29sdXRlJyk7JHByZXZpb3VzU2VjdGlvbnMuZmFkZU91dCgnZmFz dCcsZnVuY3Rpb24oKXskKHRoaXMpLmNzcygncG9zaXRpb24nLCdyZWxhdGl2ZScp O30pOyQodGhpcykucGFyZW50KCkucGFyZW50KCkuZmluZCgnYScpLnJlbW92ZUNs YXNzKCdjdXJyZW50Jyk7JHNlY3Rpb25zLmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4n KTtpZihzaG93KXskc2VjdGlvbi5mYWRlSW4oJ2Zhc3QnKTskc2VjdGlvbnMuYW5p bWF0ZSh7J2hlaWdodCc6JHNlY3Rpb24ub3V0ZXJIZWlnaHQoKX0sJHNlY3Rpb24u b3V0ZXJIZWlnaHQoKSoyLGZ1bmN0aW9uKCl7JCh0aGlzKS5jc3MoJ292ZXJmbG93 JywndmlzaWJsZScpLmNzcygnaGVpZ2h0JywnYXV0bycpO30pOyQodGhpcykuYWRk Q2xhc3MoJ2N1cnJlbnQnKTt9ZWxzZXskc2VjdGlvbnMuY3NzKCdoZWlnaHQnLCRz ZWN0aW9uLm91dGVySGVpZ2h0KCkpLmFuaW1hdGUoeydoZWlnaHQnOjB9LCRzZWN0 aW9uLm91dGVySGVpZ2h0KCkqMixmdW5jdGlvbigpeyQodGhpcykuY3NzKCdvdmVy ZmxvdycsJ3Zpc2libGUnKTt9KTt9CmlmKCQudHJhY2tBY3Rpb24hPXVuZGVmaW5l ZCl7JC50cmFja0FjdGlvbigkc2VjdGlvbi5hdHRyKCdyZWwnKSsnLicrKHNob3c/ J3Nob3cnOidoaWRlJykpO30KJC5jb29raWUoJ3dpa2lFZGl0b3ItJyskKHRoaXMp LmRhdGEoJ2NvbnRleHQnKS5pbnN0YW5jZSsnLXRvb2xiYXItc2VjdGlvbicsc2hv dz8kc2VjdGlvbi5hdHRyKCdyZWwnKTpudWxsKTtyZXR1cm4gZmFsc2U7fSkpO30s YnVpbGRTZWN0aW9uOmZ1bmN0aW9uKGNvbnRleHQsaWQsc2VjdGlvbil7Y29udGV4 dC4kdGV4dGFyZWEudHJpZ2dlcignd2lraUVkaXRvci10b29sYmFyLWJ1aWxkU2Vj dGlvbi0nK2lkLFtzZWN0aW9uXSk7dmFyIHNlbGVjdGVkPSQuY29va2llKCd3aWtp RWRpdG9yLScrY29udGV4dC5pbnN0YW5jZSsnLXRvb2xiYXItc2VjdGlvbicpO3Zh ciAkc2VjdGlvbjtzd2l0Y2goc2VjdGlvbi50eXBlKXtjYXNlJ3Rvb2xiYXInOnZh ciAkc2VjdGlvbj0kKCc8ZGl2IC8+JykuYXR0cih7J2NsYXNzJzondG9vbGJhciBz ZWN0aW9uIHNlY3Rpb24tJytpZCwncmVsJzppZH0pO2lmKCdncm91cHMnaW4gc2Vj dGlvbil7Zm9yKGdyb3VwIGluIHNlY3Rpb24uZ3JvdXBzKXskc2VjdGlvbi5hcHBl bmQoJC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi5idWlsZEdyb3VwKGNv bnRleHQsZ3JvdXAsc2VjdGlvbi5ncm91cHNbZ3JvdXBdKSk7fX0KYnJlYWs7Y2Fz ZSdib29rbGV0Jzp2YXIgJHBhZ2VzPSQoJzxkaXYgLz4nKS5hZGRDbGFzcygncGFn ZXMnKTt2YXIgJGluZGV4PSQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaW5kZXgnKTtp ZigncGFnZXMnaW4gc2VjdGlvbil7Zm9yKHBhZ2UgaW4gc2VjdGlvbi5wYWdlcyl7 JHBhZ2VzLmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZuLmJ1 aWxkUGFnZShjb250ZXh0LHBhZ2Usc2VjdGlvbi5wYWdlc1twYWdlXSkpOyRpbmRl eC5hcHBlbmQoJC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi5idWlsZEJv b2ttYXJrKGNvbnRleHQscGFnZSxzZWN0aW9uLnBhZ2VzW3BhZ2VdKSk7fX0KJHNl Y3Rpb249JCgnPGRpdiAvPicpLmF0dHIoeydjbGFzcyc6J2Jvb2tsZXQgc2VjdGlv biBzZWN0aW9uLScraWQsJ3JlbCc6aWR9KS5hcHBlbmQoJGluZGV4KS5hcHBlbmQo JHBhZ2VzKTskLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZuLnVwZGF0ZUJv b2tsZXRTZWxlY3Rpb24oY29udGV4dCxwYWdlLCRwYWdlcywkaW5kZXgpO2JyZWFr O30KaWYoJHNlY3Rpb24hPT1udWxsJiZpZCE9PSdtYWluJyl7dmFyIHNob3c9c2Vs ZWN0ZWQ9PWlkOyRzZWN0aW9uLmNzcygnZGlzcGxheScsc2hvdz8nYmxvY2snOidu b25lJyk7fQpyZXR1cm4gJHNlY3Rpb247fSx1cGRhdGVCb29rbGV0U2VsZWN0aW9u OmZ1bmN0aW9uKGNvbnRleHQsaWQsJHBhZ2VzLCRpbmRleCl7dmFyIGNvb2tpZT0n d2lraUVkaXRvci0nK2NvbnRleHQuaW5zdGFuY2UrJy1ib29rbGV0LScraWQrJy1w YWdlJzt2YXIgc2VsZWN0ZWQ9JC5jb29raWUoY29va2llKTt2YXIgJHNlbGVjdGVk SW5kZXg9JGluZGV4LmZpbmQoJypbcmVsPScrc2VsZWN0ZWQrJ10nKTtpZigkc2Vs ZWN0ZWRJbmRleC5zaXplKCk9PTApe3NlbGVjdGVkPSRpbmRleC5jaGlsZHJlbigp LmVxKDApLmF0dHIoJ3JlbCcpOyQuY29va2llKGNvb2tpZSxzZWxlY3RlZCk7fQok cGFnZXMuY2hpbGRyZW4oKS5oaWRlKCk7JHBhZ2VzLmZpbmQoJypbcmVsPScrc2Vs ZWN0ZWQrJ10nKS5zaG93KCk7JGluZGV4LmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3Mo J2N1cnJlbnQnKTskc2VsZWN0ZWRJbmRleC5hZGRDbGFzcygnY3VycmVudCcpO30s YnVpbGQ6ZnVuY3Rpb24oY29udGV4dCxjb25maWcpe3ZhciAkdGFicz0kKCc8ZGl2 IC8+JykuYWRkQ2xhc3MoJ3RhYnMnKS5hcHBlbmRUbyhjb250ZXh0Lm1vZHVsZXMu JHRvb2xiYXIpO3ZhciAkc2VjdGlvbnM9JCgnPGRpdiAvPicpLmFkZENsYXNzKCdz ZWN0aW9ucycpLmFwcGVuZFRvKGNvbnRleHQubW9kdWxlcy4kdG9vbGJhcik7Y29u dGV4dC5tb2R1bGVzLiR0b29sYmFyLmFwcGVuZCgkKCc8ZGl2IC8+JykuY3NzKCdj bGVhcicsJ2JvdGgnKSk7dmFyIHNlY3Rpb25RdWV1ZT1bXTtmb3Ioc2VjdGlvbiBp biBjb25maWcpe2lmKHNlY3Rpb249PSdtYWluJyl7Y29udGV4dC5tb2R1bGVzLiR0 b29sYmFyLnByZXBlbmQoJC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi5i dWlsZFNlY3Rpb24oY29udGV4dCxzZWN0aW9uLGNvbmZpZ1tzZWN0aW9uXSkpO31l bHNle3NlY3Rpb25RdWV1ZS5wdXNoKHsnJHNlY3Rpb25zJzokc2VjdGlvbnMsJ2Nv bnRleHQnOmNvbnRleHQsJ2lkJzpzZWN0aW9uLCdjb25maWcnOmNvbmZpZ1tzZWN0 aW9uXX0pOyR0YWJzLmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFy LmZuLmJ1aWxkVGFiKGNvbnRleHQsc2VjdGlvbixjb25maWdbc2VjdGlvbl0pKTt9 fQokLmVhY2hBc3luYyhzZWN0aW9uUXVldWUseydidWxrJzowLCdlbmQnOmZ1bmN0 aW9uKCl7JCgnYm9keScpLmNzcygncG9zaXRpb24nLCdzdGF0aWMnKTskKCdib2R5 JykuY3NzKCdwb3NpdGlvbicsJ3JlbGF0aXZlJyk7fSwnbG9vcCc6ZnVuY3Rpb24o aSxzKXtzLiRzZWN0aW9ucy5hcHBlbmQoJC53aWtpRWRpdG9yLm1vZHVsZXMudG9v bGJhci5mbi5idWlsZFNlY3Rpb24ocy5jb250ZXh0LHMuaWQscy5jb25maWcpKTt2 YXIgJHNlY3Rpb249cy4kc2VjdGlvbnMuZmluZCgnLnNlY3Rpb246dmlzaWJsZScp O2lmKCRzZWN0aW9uLnNpemUoKSl7JHNlY3Rpb25zLmFuaW1hdGUoeydoZWlnaHQn OiRzZWN0aW9uLm91dGVySGVpZ2h0KCl9LCRzZWN0aW9uLm91dGVySGVpZ2h0KCkq Mik7fX19KTt9fX07fSkoalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JC53aWtpRWRpdG9y Lm1vZHVsZXMudG9jPXthcGk6e30sZm46e2NyZWF0ZTpmdW5jdGlvbihjb250ZXh0 LGNvbmZpZyl7aWYoJyR0b2MnaW4gY29udGV4dC5tb2R1bGVzKXtyZXR1cm47fQpj b250ZXh0Lm1vZHVsZXMuJHRvYz0kKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ3dpa2lF ZGl0b3ItdWktdG9jJykuYXR0cignaWQnLCd3aWtpRWRpdG9yLXVpLXRvYycpO3Zh ciBoZWlnaHQ9Y29udGV4dC4kdWkuZmluZCgnLndpa2lFZGl0b3ItdWktYm90dG9t JykuaGVpZ2h0KCkKY29udGV4dC4kdWkuZmluZCgnLndpa2lFZGl0b3ItdWktYm90 dG9tJykuYXBwZW5kKGNvbnRleHQubW9kdWxlcy4kdG9jKTtjb250ZXh0Lm1vZHVs ZXMuJHRvYy5oZWlnaHQoY29udGV4dC4kdWkuZmluZCgnLndpa2lFZGl0b3ItdWkt Ym90dG9tJykuaGVpZ2h0KCkpO2NvbnRleHQubW9kdWxlcy4kdG9jLmNzcyh7J3dp ZHRoJzonMTJlbScsJ21hcmdpblRvcCc6LShoZWlnaHQpfSk7Y29udGV4dC4kdWku ZmluZCgnLndpa2lFZGl0b3ItdWktdGV4dCcpLmNzcygoJCgnYm9keS5ydGwnKS5z aXplKCk/J21hcmdpbkxlZnQnOidtYXJnaW5SaWdodCcpLCcxMmVtJyk7JC53aWtp RWRpdG9yLm1vZHVsZXMudG9jLmZuLmJ1aWxkKGNvbnRleHQsY29uZmlnKTtjb250 ZXh0LiR0ZXh0YXJlYS5kZWxheWVkQmluZCgyNTAsJ21vdXNldXAgc2Nyb2xsVG9Q b3NpdGlvbiBmb2N1cyBrZXl1cCBlbmNhcHN1bGF0ZVNlbGVjdGlvbiBjaGFuZ2Un LGZ1bmN0aW9uKGV2ZW50KXt2YXIgY29udGV4dD0kKHRoaXMpLmRhdGEoJ3dpa2lF ZGl0b3ItY29udGV4dCcpOyQodGhpcykuZWFjaEFzeW5jKHtidWxrOjAsbG9vcDpm dW5jdGlvbigpeyQud2lraUVkaXRvci5tb2R1bGVzLnRvYy5mbi5idWlsZChjb250 ZXh0KTskLndpa2lFZGl0b3IubW9kdWxlcy50b2MuZm4udXBkYXRlKGNvbnRleHQp O319KTt9KS5ibHVyKGZ1bmN0aW9uKCl7dmFyIGNvbnRleHQ9JCh0aGlzKS5kYXRh KCd3aWtpRWRpdG9yLWNvbnRleHQnKTtjb250ZXh0LiR0ZXh0YXJlYS5kZWxheWVk QmluZENhbmNlbCgyNTAsJ21vdXNldXAgc2Nyb2xsVG9Qb3NpdGlvbiBmb2N1cyBr ZXl1cCBlbmNhcHN1bGF0ZVNlbGVjdGlvbiBjaGFuZ2UnKTskLndpa2lFZGl0b3Iu bW9kdWxlcy50b2MuZm4udW5oaWdobGlnaHQoY29udGV4dCk7fSk7fSx1bmhpZ2hs aWdodDpmdW5jdGlvbihjb250ZXh0KXtjb250ZXh0Lm1vZHVsZXMuJHRvYy5maW5k KCdkaXYnKS5yZW1vdmVDbGFzcygnY3VycmVudCcpO30sdXBkYXRlOmZ1bmN0aW9u KGNvbnRleHQpeyQud2lraUVkaXRvci5tb2R1bGVzLnRvYy5mbi51bmhpZ2hsaWdo dChjb250ZXh0KTt2YXIgcG9zaXRpb249Y29udGV4dC4kdGV4dGFyZWEuZ2V0Q2Fy ZXRQb3NpdGlvbigpO3ZhciBzZWN0aW9uPTA7aWYoY29udGV4dC5kYXRhLm91dGxp bmUubGVuZ3RoPjApe2lmKCEocG9zaXRpb248Y29udGV4dC5kYXRhLm91dGxpbmVb MF0ucG9zaXRpb24tMSkpe3doaWxlKHNlY3Rpb248Y29udGV4dC5kYXRhLm91dGxp bmUubGVuZ3RoJiZjb250ZXh0LmRhdGEub3V0bGluZVtzZWN0aW9uXS5wb3NpdGlv bi0xPHBvc2l0aW9uKXtzZWN0aW9uKys7fQpzZWN0aW9uPU1hdGgubWF4KDAsc2Vj dGlvbik7fQp2YXIgc2VjdGlvbkxpbms9Y29udGV4dC5tb2R1bGVzLiR0b2MuZmlu ZCgnZGl2LnNlY3Rpb24tJytzZWN0aW9uKTtzZWN0aW9uTGluay5hZGRDbGFzcygn Y3VycmVudCcpO3ZhciByZWxUb3A9c2VjdGlvbkxpbmsub2Zmc2V0KCkudG9wLWNv bnRleHQubW9kdWxlcy4kdG9jLm9mZnNldCgpLnRvcDt2YXIgc2Nyb2xsVG9wPWNv bnRleHQubW9kdWxlcy4kdG9jLnNjcm9sbFRvcCgpO3ZhciBkaXZIZWlnaHQ9Y29u dGV4dC5tb2R1bGVzLiR0b2MuaGVpZ2h0KCk7dmFyIHNlY3Rpb25IZWlnaHQ9c2Vj dGlvbkxpbmsuaGVpZ2h0KCk7aWYocmVsVG9wPDApCmNvbnRleHQubW9kdWxlcy4k dG9jLnNjcm9sbFRvcChzY3JvbGxUb3ArcmVsVG9wKTtlbHNlIGlmKHJlbFRvcCtz ZWN0aW9uSGVpZ2h0PmRpdkhlaWdodCkKY29udGV4dC5tb2R1bGVzLiR0b2Muc2Ny b2xsVG9wKHNjcm9sbFRvcCtyZWxUb3Arc2VjdGlvbkhlaWdodC1kaXZIZWlnaHQp O319LGJ1aWxkOmZ1bmN0aW9uKGNvbnRleHQpe2Z1bmN0aW9uIGJ1aWxkU3RydWN0 dXJlKG91dGxpbmUsb2Zmc2V0LGxldmVsKXtpZihvZmZzZXQ9PXVuZGVmaW5lZClv ZmZzZXQ9MDtpZihsZXZlbD09dW5kZWZpbmVkKWxldmVsPTE7dmFyIHNlY3Rpb25z PVtdO2Zvcih2YXIgaT1vZmZzZXQ7aTxvdXRsaW5lLmxlbmd0aDtpKyspe2lmKG91 dGxpbmVbaV0ubkxldmVsPT1sZXZlbCl7dmFyIHN1Yj1idWlsZFN0cnVjdHVyZShv dXRsaW5lLGkrMSxsZXZlbCsxKTtpZihzdWIubGVuZ3RoKXtvdXRsaW5lW2ldLnNl Y3Rpb25zPXN1Yjt9CnNlY3Rpb25zW3NlY3Rpb25zLmxlbmd0aF09b3V0bGluZVtp XTt9ZWxzZSBpZihvdXRsaW5lW2ldLm5MZXZlbDxsZXZlbCl7YnJlYWs7fX0KcmV0 dXJuIHNlY3Rpb25zO30KZnVuY3Rpb24gYnVpbGRMaXN0KHN0cnVjdHVyZSl7dmFy IGxpc3Q9JCgnPHVsPjwvdWw+Jyk7Zm9yKGkgaW4gc3RydWN0dXJlKXt2YXIgZGl2 PSQoJzxkaXY+PC9kaXY+JykuYXR0cignaHJlZicsJyMnKS5hZGRDbGFzcygnc2Vj dGlvbi0nK3N0cnVjdHVyZVtpXS5pbmRleCkuZGF0YSgndGV4dGJveCcsY29udGV4 dC4kdGV4dGFyZWEpLmRhdGEoJ3Bvc2l0aW9uJyxzdHJ1Y3R1cmVbaV0ucG9zaXRp b24pLmJpbmQoJ21vdXNlZG93bicsZnVuY3Rpb24oZXZlbnQpeyQodGhpcykuZGF0 YSgndGV4dGJveCcpLmZvY3VzKCkuc2V0U2VsZWN0aW9uKCQodGhpcykuZGF0YSgn cG9zaXRpb24nKSkuc2Nyb2xsVG9DYXJldFBvc2l0aW9uKHRydWUpO2lmKHR5cGVv ZiAkLnRyYWNrQWN0aW9uIT0ndW5kZWZpbmVkJykKJC50cmFja0FjdGlvbignbnRv Yy5oZWFkaW5nJyk7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9KS50ZXh0KHN0cnVj dHVyZVtpXS50ZXh0KTtpZihzdHJ1Y3R1cmVbaV0udGV4dD09JycpCmRpdi5odG1s KCcmbmJzcDsnKTt2YXIgaXRlbT0kKCc8bGk+PC9saT4nKS5hcHBlbmQoZGl2KTtp ZihzdHJ1Y3R1cmVbaV0uc2VjdGlvbnMhPT11bmRlZmluZWQpe2l0ZW0uYXBwZW5k KGJ1aWxkTGlzdChzdHJ1Y3R1cmVbaV0uc2VjdGlvbnMpKTt9Cmxpc3QuYXBwZW5k KGl0ZW0pO30KcmV0dXJuIGxpc3Q7fQp2YXIgb3V0bGluZT1bXTt2YXIgd2lraXRl eHQ9JC53aWtpRWRpdG9yLmZpeE9wZXJhQnJva2VubmVzcyhjb250ZXh0LiR0ZXh0 YXJlYS52YWwoKSk7dmFyIGhlYWRpbmdzPXdpa2l0ZXh0Lm1hdGNoKC9ePXsxLDZ9 W149XG5dW15cbl0qPXsxLDZ9XHMqJC9nbSk7dmFyIG9mZnNldD0wO2hlYWRpbmdz PSQubWFrZUFycmF5KGhlYWRpbmdzKTtmb3IodmFyIGg9MDtoPGhlYWRpbmdzLmxl bmd0aDtoKyspe3RleHQ9JC50cmltKGhlYWRpbmdzW2hdKTt2YXIgcG9zaXRpb249 d2lraXRleHQuaW5kZXhPZih0ZXh0LG9mZnNldCk7aWYocG9zaXRpb24+PW9mZnNl dCl7b2Zmc2V0PXBvc2l0aW9uK3RleHQubGVuZ3RoO31lbHNlIGlmKHBvc2l0aW9u PT0tMSl7Y29udGludWU7fQp2YXIgc3RhcnRMZXZlbD0wO2Zvcih2YXIgYz0wO2M8 dGV4dC5sZW5ndGg7YysrKXtpZih0ZXh0LmNoYXJBdChjKT09Jz0nKXtzdGFydExl dmVsKys7fWVsc2V7YnJlYWs7fX0KdmFyIGVuZExldmVsPTA7Zm9yKHZhciBjPXRl eHQubGVuZ3RoLTE7Yz49MDtjLS0pe2lmKHRleHQuY2hhckF0KGMpPT0nPScpe2Vu ZExldmVsKys7fWVsc2V7YnJlYWs7fX0KdmFyIGxldmVsPU1hdGgubWluKHN0YXJ0 TGV2ZWwsZW5kTGV2ZWwpO3RleHQ9JC50cmltKHRleHQuc3Vic3RyKGxldmVsLHRl eHQubGVuZ3RoLShsZXZlbCoyKSkpO291dGxpbmVbaF09eyd0ZXh0Jzp0ZXh0LCdw b3NpdGlvbic6cG9zaXRpb24sJ2xldmVsJzpsZXZlbCwnaW5kZXgnOmgrMX07fQp2 YXIgbGFzdExldmVsPTA7dmFyIG5MZXZlbD0wO2Zvcih2YXIgaT0wO2k8b3V0bGlu ZS5sZW5ndGg7aSsrKXtpZihvdXRsaW5lW2ldLmxldmVsPmxhc3RMZXZlbCl7bkxl dmVsKys7fQplbHNlIGlmKG91dGxpbmVbaV0ubGV2ZWw8bGFzdExldmVsKXtuTGV2 ZWwtPU1hdGgubWF4KDEsbGFzdExldmVsLW91dGxpbmVbaV0ubGV2ZWwpO30KaWYo bkxldmVsPD0wKXtuTGV2ZWw9MTt9Cm91dGxpbmVbaV0ubkxldmVsPW5MZXZlbDts YXN0TGV2ZWw9b3V0bGluZVtpXS5sZXZlbDt9CnZhciBzdHJ1Y3R1cmU9YnVpbGRT dHJ1Y3R1cmUob3V0bGluZSk7aWYoJCgnaW5wdXRbbmFtZT13cFNlY3Rpb25dJyku dmFsKCk9PScnKXtzdHJ1Y3R1cmUudW5zaGlmdCh7J3RleHQnOndnUGFnZU5hbWUu cmVwbGFjZSgvXy9nLCcgJyksJ2xldmVsJzoxLCdpbmRleCc6MCwncG9zaXRpb24n OjB9KTt9CmNvbnRleHQubW9kdWxlcy4kdG9jLmh0bWwoYnVpbGRMaXN0KHN0cnVj dHVyZSkpO2NvbnRleHQubW9kdWxlcy4kdG9jLmZpbmQoJ2RpdicpLmF1dG9FbGxp cHNlKHsncG9zaXRpb24nOidyaWdodCcsJ3Rvb2x0aXAnOnRydWV9KTtjb250ZXh0 LmRhdGEub3V0bGluZT1vdXRsaW5lO319fTt9KShqUXVlcnkpOw== ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=CollapsibleTabs.js Content-Type: application/x-javascript; name=CollapsibleTabs.js Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/CollapsibleTabs/CollapsibleTabs.js?9 Content-Transfer-Encoding: Base64 anMyQWRkT25sb2FkSG9vayggZnVuY3Rpb24oKSB7CgkKCXZhciBydGwgPSAkaigg J2JvZHkucnRsJyApLnNpemUoKSA/IHRydWUgOiBmYWxzZTsKCQoJLy9PdmVybG9h ZGluZyB0aGUgbW92ZVRvQ29sbGFwc2VkIGZ1bmN0aW9uIHRvIGFuaW1hdGUgdGhl IHRyYW5zaXRpb24gCgkkai5jb2xsYXBzaWJsZVRhYnMubW92ZVRvQ29sbGFwc2Vk ID0gZnVuY3Rpb24oIGVsZSApIHsKCQl2YXIgJG1vdmluZyA9ICRqKGVsZSk7CgkJ JGooJG1vdmluZy5kYXRhKCdjb2xsYXBzaWJsZVRhYnNTZXR0aW5ncycpLmV4cGFu ZGVkQ29udGFpbmVyKS5kYXRhKCdjb2xsYXBzaWJsZVRhYnNTZXR0aW5ncycpLnNo aWZ0aW5nID0gdHJ1ZTsKCQl2YXIgZGF0YSA9ICRtb3ZpbmcuZGF0YSgnY29sbGFw c2libGVUYWJzU2V0dGluZ3MnKTsKCQkvLyBSZW1vdmUgdGhlIGVsZW1lbnQgZnJv bSB3aGVyZSBpdCdzIGF0IGFuZCBwdXQgaXQgaW4gdGhlIGRyb3Bkb3duIG1lbnUK CQl2YXIgdGFyZ2V0ID0gJG1vdmluZy5kYXRhKCdjb2xsYXBzaWJsZVRhYnNTZXR0 aW5ncycpLmNvbGxhcHNlZENvbnRhaW5lcjsKCQkkbW92aW5nLmNzcygicG9zaXRp b24iLCAicmVsYXRpdmUiKS5jc3MoICggcnRsID8gJ2xlZnQnIDogJ3JpZ2h0Jyks IDAgKTsKCQkkbW92aW5nLmFuaW1hdGUoe3dpZHRoOiAnMXB4J30sIm5vcm1hbCIs ZnVuY3Rpb24oKXsKCQkJJGoodGhpcykuaGlkZSgpOwoJCQkvLyBhZGQgdGhlIHBs YWNlaG9sZGVyCgkJCSRqKCc8c3BhbiBjbGFzcz0icGxhY2Vob2xkZXIiIHN0eWxl PSJkaXNwbGF5Om5vbmU7Ij48L3NwYW4+JykuaW5zZXJ0QWZ0ZXIodGhpcyk7CgkJ CSRqKHRoaXMpLnJlbW92ZSgpLnByZXBlbmRUbyh0YXJnZXQpLmRhdGEoJ2NvbGxh cHNpYmxlVGFic1NldHRpbmdzJywgZGF0YSk7CgkJCSRqKHRoaXMpLmF0dHIoJ3N0 eWxlJywgJ2Rpc3BsYXk6bGlzdC1pdGVtOycpOwoJCQkkaigkaihlbGUpLmRhdGEo J2NvbGxhcHNpYmxlVGFic1NldHRpbmdzJykuZXhwYW5kZWRDb250YWluZXIpLmRh dGEoJ2NvbGxhcHNpYmxlVGFic1NldHRpbmdzJykuc2hpZnRpbmcgPSBmYWxzZTsK CQkJJGouY29sbGFwc2libGVUYWJzLmhhbmRsZVJlc2l6ZSgpOwoJCX0pOwoJfTsK CQoJLy8gT3ZlcmxvYWRpbmcgdGhlIG1vdmVUb0V4cGFuZGVkIGZ1bmN0aW9uIHRv IGFuaW1hdGUgdGhlIHRyYW5zaXRpb24KCSRqLmNvbGxhcHNpYmxlVGFicy5tb3Zl VG9FeHBhbmRlZCA9IGZ1bmN0aW9uKCBlbGUgKSB7CgkJdmFyICRtb3ZpbmcgPSAk aihlbGUpOwoJCSRqKCRtb3ZpbmcuZGF0YSgnY29sbGFwc2libGVUYWJzU2V0dGlu Z3MnKS5leHBhbmRlZENvbnRhaW5lcikuZGF0YSgnY29sbGFwc2libGVUYWJzU2V0 dGluZ3MnKS5zaGlmdGluZyA9IHRydWU7CgkJdmFyIGRhdGEgPSAkbW92aW5nLmRh dGEoJ2NvbGxhcHNpYmxlVGFic1NldHRpbmdzJyk7CgkJLy8gZ3JhYiB0aGUgbmV4 dCBhcHBlYXJpbmcgcGxhY2Vob2xkZXIgc28gd2UgY2FuIHVzZSBpdCBmb3IgcmVw bGFjaW5nCgkJdmFyICR0YXJnZXQgPSAkaigkbW92aW5nLmRhdGEoJ2NvbGxhcHNp YmxlVGFic1NldHRpbmdzJykuZXhwYW5kZWRDb250YWluZXIpLmZpbmQoJ3NwYW4u cGxhY2Vob2xkZXI6Zmlyc3QnKTsKCQl2YXIgZXhwYW5kZWRXaWR0aCA9ICRtb3Zp bmcuZGF0YSgnY29sbGFwc2libGVUYWJzU2V0dGluZ3MnKS5leHBhbmRlZFdpZHRo OwoJCSRtb3ZpbmcuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpLmNzcyggKCBy dGwgPyAncmlnaHQnIDogJ2xlZnQnKSwgMCApLmNzcygnd2lkdGgnLCcxcHgnKTsK CQkkdGFyZ2V0LnJlcGxhY2VXaXRoKCRtb3ZpbmcucmVtb3ZlKCkuY3NzKCd3aWR0 aCcsJzFweCcpLmRhdGEoJ2NvbGxhcHNpYmxlVGFic1NldHRpbmdzJywgZGF0YSkK CQkJLmFuaW1hdGUoe3dpZHRoOiBleHBhbmRlZFdpZHRoKyJweCJ9LCAibm9ybWFs IiwgZnVuY3Rpb24oKXsKCQkJJGoodGhpcykuYXR0cignc3R5bGUnLCAnZGlzcGxh eTpibG9jazsnKTsKCQkJJGooJG1vdmluZy5kYXRhKCdjb2xsYXBzaWJsZVRhYnNT ZXR0aW5ncycpLmV4cGFuZGVkQ29udGFpbmVyKS5kYXRhKCdjb2xsYXBzaWJsZVRh YnNTZXR0aW5ncycpLnNoaWZ0aW5nID0gZmFsc2U7CgkJCSRqLmNvbGxhcHNpYmxl VGFicy5oYW5kbGVSZXNpemUoKTsKCQl9KSk7Cgl9OwoJCgkvLyBCaW5kIGNhbGxi YWNrIGZ1bmN0aW9ucyB0byBhbmltYXRlIG91ciBkcm9wIGRvd24gbWVudSBpbiBh bmQgb3V0CgkvLyBhbmQgdGhlbiBjYWxsIHRoZSBjb2xsYXBzaWJsZVRhYnMgZnVu Y3Rpb24gb24gdGhlIG1lbnUgCgkkaignI3Atdmlld3MgdWwnKS5iaW5kKCJiZWZv cmVUYWJDb2xsYXBzZSIsIGZ1bmN0aW9uKCl7CgkJaWYoJGooJyNwLWNhY3Rpb25z JykuY3NzKCdkaXNwbGF5Jyk9PSdub25lJykKCQkkaigiI3AtY2FjdGlvbnMiKS5h ZGRDbGFzcygiZmlsbGVkUG9ydGxldCIpLnJlbW92ZUNsYXNzKCJlbXB0eVBvcnRs ZXQiKQoJCQkuZmluZCgnaDUnKS5jc3MoJ3dpZHRoJywnMXB4JykuYW5pbWF0ZSh7 J3dpZHRoJzonMjZweCd9LCAzOTApOwoJfSkuYmluZCgiYmVmb3JlVGFiRXhwYW5k IiwgZnVuY3Rpb24oKXsKCQlpZigkaignI3AtY2FjdGlvbnMgbGknKS5sZW5ndGg9 PTEpCgkJJGooIiNwLWNhY3Rpb25zIGg1IikuYW5pbWF0ZSh7J3dpZHRoJzonMXB4 J30sMzcwLCBmdW5jdGlvbigpewoJCQkkaih0aGlzKS5hdHRyKCdzdHlsZScsJycp LnBhcmVudCgpLmFkZENsYXNzKCJlbXB0eVBvcnRsZXQiKS5yZW1vdmVDbGFzcygi ZmlsbGVkUG9ydGxldCIpOwoJCX0pOwoJfSkuY29sbGFwc2libGVUYWJzKHsKCQll eHBhbmRDb25kaXRpb246IGZ1bmN0aW9uKGVsZVdpZHRoKSB7CgkJCWlmKCBydGwg KXsKCQkJCXJldHVybiAoICRqKCcjcmlnaHQtbmF2aWdhdGlvbicpLnBvc2l0aW9u KCkubGVmdCArICRqKCcjcmlnaHQtbmF2aWdhdGlvbicpLndpZHRoKCkgKyAxKSAK CQkJCQk8ICgkaignI2xlZnQtbmF2aWdhdGlvbicpLnBvc2l0aW9uKCkubGVmdCAt IGVsZVdpZHRoKTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiAoICRqKCcjbGVmdC1u YXZpZ2F0aW9uJykucG9zaXRpb24oKS5sZWZ0ICsgJGooJyNsZWZ0LW5hdmlnYXRp b24nKS53aWR0aCgpICsgMSkgCgkJCQkJPCAoJGooJyNyaWdodC1uYXZpZ2F0aW9u JykucG9zaXRpb24oKS5sZWZ0IC0gZWxlV2lkdGgpOwoJCQl9CgkJfSwKCQljb2xs YXBzZUNvbmRpdGlvbjogZnVuY3Rpb24oKSB7CgkJCWlmKCBydGwgKXsKCQkJCXJl dHVybiAoICRqKCcjcmlnaHQtbmF2aWdhdGlvbicpLnBvc2l0aW9uKCkubGVmdCAr ICRqKCcjcmlnaHQtbmF2aWdhdGlvbicpLndpZHRoKCkpCgkJCQkJPiAkaignI2xl ZnQtbmF2aWdhdGlvbicpLnBvc2l0aW9uKCkubGVmdDsKCQkJfSBlbHNlIHsKCQkJ CXJldHVybiAoICRqKCcjbGVmdC1uYXZpZ2F0aW9uJykucG9zaXRpb24oKS5sZWZ0 ICsgJGooJyNsZWZ0LW5hdmlnYXRpb24nKS53aWR0aCgpKQoJCQkJCT4gJGooJyNy aWdodC1uYXZpZ2F0aW9uJykucG9zaXRpb24oKS5sZWZ0OwoJCQl9CgkJfQoJfSk7 Cn0pOw== ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=ClickTracking.js Content-Type: application/x-javascript; name=ClickTracking.js Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/ClickTracking/ClickTracking.js?4 Content-Transfer-Encoding: Base64 KGZ1bmN0aW9uKCQpIHsKCWlmKCAhd2dDbGlja1RyYWNraW5nSXNUaHJvdHRsZWQg KSB7CgkJLy8gY3JlYXRlcyAndHJhY2sgYWN0aW9uJyBmdW5jdGlvbiB0byBjYWxs IHRoZSBjbGlja3RyYWNraW5nIEFQSSBhbmQgc2VuZCB0aGUgSUQKCQkkLnRyYWNr QWN0aW9uID0gZnVuY3Rpb24gKCBpZCApIHsKCQkJJGoucG9zdCggd2dTY3JpcHRQ YXRoICsgJy9hcGkucGhwJywgeyAnYWN0aW9uJzogJ2NsaWNrdHJhY2tpbmcnLCAn ZXZlbnRpZCc6IGlkLCAndG9rZW4nOiB3Z1RyYWNraW5nVG9rZW4gfSApOwoJCX07 Cgl9Cgp9KShqUXVlcnkpOwo= ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=centralnotice.js Content-Type: text/javascript; charset=utf-8; name=centralnotice.js Content-Location: http://upload.wikimedia.org/centralnotice/wikipedia/es/centralnotice.js?257z2 Content-Transfer-Encoding: Quoted-Printable function toggleNotice() { var notice =3D document.getElementById('centralNotice'); if (!wgNoticeToggleState) { notice.className =3D notice.className.replace('collapsed', 'expanded')= ; toggleNoticeCookie('0'); } else { notice.className =3D notice.className.replace('expanded', 'collapsed')= ; toggleNoticeCookie('1'); } wgNoticeToggleState =3D !wgNoticeToggleState; } function toggleNoticeStyle(elems, display) { if(elems) for(var i=3D0;i' + wgNotice+''; ------------nnk7Z3j8OtXni0o2soXNAZ Content-Disposition: inline; filename=index.js Content-Type: text/javascript; charset=utf-8; name=index.js Content-Location: http://es.wikipedia.org/w/index.php?title=-&action=raw&gen=js&useskin=monobook&urid=257z2_32870427 Content-Transfer-Encoding: 8bit /* generated javascript */ var skin = 'monobook'; var stylepath = 'http://bits.wikimedia.org/skins-1.5'; /* MediaWiki:Common.js */ window.hitos = []; function hito(nombre) { window.hitos.push([nombre, new Date().getTime()]); } hito("C Common.js"); /** Execute function on page load ********************************************* * * Description: Wrapper around addOnloadHook() for backwards compatibility. * Will be removed in the near future. * Maintainers: [[User:R. Koot]] */ function addLoadEvent( f ) { addOnloadHook( f ); } /* Test if an element has a certain class ************************************** * * Description: Uses regular expressions and caching for better performance. * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]] */ var hasClass = (function () { var reCache = {}; return function (element, className) { return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className); }; })(); /** Internet Explorer bug fix ************************************************** * * Description: UNDOCUMENTED * Maintainers: [[User:Tom-]]? */ if (window.showModalDialog && document.compatMode) { var oldWidth; var docEl = document.documentElement; function fixIEScroll() { if (!oldWidth || docEl.clientWidth > oldWidth) doFixIEScroll(); else setTimeout(doFixIEScroll, 1); oldWidth = docEl.clientWidth; } function doFixIEScroll() { docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : ""; } try { document.attachEvent("onreadystatechange", fixIEScroll); attachEvent("onresize", fixIEScroll); } catch(e) { } } //fix edit summary prompt for undo //this code fixes the fact that the undo function combined with the "no edit summary prompter" causes problems if leaving the //edit summary unchanged //this was added by [[User:Deskana]], code by [[User:Tra]] addOnloadHook(function () { if (document.location.search.indexOf("undo=") != -1 && document.getElementsByName('wpAutoSummary')[0]) { document.getElementsByName('wpAutoSummary')[0].value=''; } }) /* == Búsqueda especial extendida (specialsearch) == Añade a la página [[Special:Search]] enlaces a buscadores externos como Yahoo, Google, MSN Live y Exalead. Trabaja en conjunto con el módulo [[MediaWiki:SpecialSearch.js]] y está basado en [[w:fr:MediaWiki:Monobook.js]]. */ addOnloadHook( function() { if ((wgCanonicalNamespace == "Special") && (wgCanonicalSpecialPageName == "Search")) importScript('MediaWiki:SpecialSearch.js'); } ); /* == Cerrar mensajes == Ver ejemplo en [[Usuario:Chabacano/Fírmalo]], por [[Usuario:Platonides]]. */ addOnloadHook( function() { hito("C cerrar mensajes"); if (document.getElementById("cierraPadre")) { document.getElementById("cierraPadre").childNodes[0].onclick= function () { document.getElementById("cierraPadre").style.cursor = 'pointer'; document.getElementById("cierraPadre").parentNode.style.display = 'none'; return false; /*no seguir el href*/} } hito("F cerrar mensajes"); }); /* == Scripts sólo para biblios == */ function userInGroup(group) { return (wgUserGroups && (('|' + wgUserGroups.join('|') + '|').indexOf('|' + group + '|') != -1)); } if ( userInGroup('sysop') ) importScript( "MediaWiki:Sysop.js" ); /* == Wikimedia Player == Añade reproductor en la misma página. */ document.write(''); /** WikiMiniAtlas ******************************************************* * * Description: WikiMiniAtlas is a popup click and drag world map. * This script causes all of our coordinate links to display the WikiMiniAtlas popup button. * The script itself is located on meta because it is used by many projects. * See [[Meta:WikiMiniAtlas]] for more information. * Created by: [[User:Dschwen]] */ document.write(''); // == Mejoras de diseño de la Portada == /** Mejoras de diseño de la Portada ********************************************************* * * Descripción: Varias mejoras de diseño para la portada, incluyendo un * enlace adicional a la lista completa de idiomas disponibles. * Adaptado de [[en:MediaWiki:Common.js]] */ function mainPageAppendCompleteListLink() { hito("C mainPageAppendCompleteListLink"); try { var node = document.getElementById( "p-lang" ) .getElementsByTagName('div')[0] .getElementsByTagName('ul')[0]; var aNode = document.createElement( 'a' ); var liNode = document.createElement( 'li' ); aNode.appendChild( document.createTextNode( 'Lista completa' ) ); aNode.setAttribute( 'href' , 'http://meta.wikimedia.org/wiki/Lista_de_Wikipedias' ); liNode.appendChild( aNode ); liNode.style.fontWeight = 'bold'; node.appendChild( liNode ); } catch(e) { // lets just ignore what's happened //return; } hito("F mainPageAppendCompleteListLink"); } if ( wgPageName == "Wikipedia:Portada" ) { addOnloadHook( mainPageAppendCompleteListLink ); } // == Redefinición de ordenación de tablas "sortable" == // Traido de la Inclopedia. Ordena nombres de meses en español y cambia puntos por comas. function ts_resortTable(lnk) { // get the span var span = lnk.getElementsByTagName('span')[0]; var td = lnk.parentNode; var tr = td.parentNode; var column = td.cellIndex; var table = tr.parentNode; while (table && !(table.tagName && table.tagName.toLowerCase() == 'table')) table = table.parentNode; if (!table) return; if (table.rows.length <= 1) return; // Generate the number transform table if it's not done already if (ts_number_transform_table == null) { ts_initTransformTable(); } // Work out a type for the column // Skip the first row if that's where the headings are var rowStart = (table.tHead && table.tHead.rows.length > 0 ? 0 : 1); var itm = ""; for (var i = rowStart; i < table.rows.length; i++) { if (table.rows[i].cells.length > column) { itm = ts_getInnerText(table.rows[i].cells[column]); itm = itm.replace(/^[\s\xa0]+/, "").replace(/[\s\xa0]+$/, ""); if (itm != "") break; } } // TODO: bug 8226, localised date formats var sortfn = ts_sort_generic; var preprocessor = ts_toLowerCase; if (/\d\d? de [a-zA-Z]+ de \d+$/.test(itm)) { preprocessor = ts_dateToSortKey; } else if (/^\d\d[\/.-]\d\d[\/.-]\d\d\d\d$/.test(itm)) { preprocessor = ts_dateToSortKey; } else if (/^\d\d[\/.-]\d\d[\/.-]\d\d$/.test(itm)) { preprocessor = ts_dateToSortKey; // pound dollar euro yen currency cents } else if (/(^[\u00a3$\u20ac\u00a4\u00a5]|\u00a2$)/.test(itm)) { preprocessor = ts_currencyToSortKey; } else if (ts_number_regex.test(itm)) { preprocessor = ts_parseFloat; } var reverse = (span.getAttribute("sortdir") == 'down'); var newRows = new Array(); var staticRows = new Array(); for (var j = rowStart; j < table.rows.length; j++) { var row = table.rows[j]; if((" "+row.className+" ").indexOf(" unsortable ") < 0) { var keyText = ts_getInnerText(row.cells[column]); var oldIndex = (reverse ? -j : j); var preprocessed = preprocessor( keyText ); newRows[newRows.length] = new Array(row, preprocessed, oldIndex); } else staticRows[staticRows.length] = new Array(row, false, j-rowStart); } newRows.sort(sortfn); var arrowHTML; if (reverse) { arrowHTML = '↓'; newRows.reverse(); span.setAttribute('sortdir','up'); } else { arrowHTML = '↑'; span.setAttribute('sortdir','down'); } for (var i = 0; i < staticRows.length; i++) { var row = staticRows[i]; newRows.splice(row[2], 0, row); } // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones // don't do sortbottom rows for (var i = 0; i < newRows.length; i++) { if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") == -1) table.tBodies[0].appendChild(newRows[i][0]); } // do sortbottom rows only for (var i = 0; i < newRows.length; i++) { if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") != -1) table.tBodies[0].appendChild(newRows[i][0]); } // Delete any other arrows there may be showing var spans = getElementsByClassName(tr, "span", "sortarrow"); for (var i = 0; i < spans.length; i++) { spans[i].innerHTML = '↓'; } span.innerHTML = arrowHTML; if (ts_alternate_row_colors) { ts_alternate(table); } } function ts_dateToSortKey(date) { if (date.length > 14) { date = date.toLowerCase(); if (date.charAt(1) == " " || date.charAt(1) == "-") { var dia = '0' + date.charAt(0); } else { var dia = date.substr(0, 2); } var iniciomes = date.indexOf(" de ") + 4; var finmes = date.lastIndexOf(" de "); var longmes = finmes - iniciomes; switch (date.substr(iniciomes, longmes)) { case "enero": var mes = "01"; break; case "febrero": var mes = "02"; break; case "marzo": var mes = "03"; break; case "abril": var mes = "04"; break; case "mayo": var mes = "05"; break; case "junio": var mes = "06"; break; case "julio": var mes = "07"; break; case "agosto": var mes = "08"; break; case "septiembre": var mes = "09"; break; case "octubre": var mes = "10"; break; case "noviembre": var mes = "11"; break; case "diciembre": var mes = "12"; break; } for (var anno = date.substr(finmes + 4); anno.length < 4; anno = '0' + anno); return anno + mes + dia; } else if (date.length == 10) { if (ts_europeandate == false) { return date.substr(6,4)+date.substr(0,2)+date.substr(3,2); } else { return date.substr(6,4)+date.substr(3,2)+date.substr(0,2); } } else if (date.length == 8) { yr = date.substr(6,2); if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; } if (ts_europeandate == true) { return yr+date.substr(3,2)+date.substr(0,2); } else { return yr+date.substr(0,2)+date.substr(3,2); } } return "00000000"; } function ts_parseFloat(num) { if (!num) return 0; num = num.replace(/\./g, ""); num = num.replace(/,/, "."); num = parseFloat(num); return (isNaN(num) ? 0 : num); } function ts_sort_generic(a,b) { if ( (typeof a[1] == "string") && (typeof b[1] == "string") ) { /* Don't do this if it's eg. 'number'. We don't want that and number doesn't have .toLowerCase() */ var aa = a[1].toLowerCase(); var bb = b[1].toLowerCase(); return(aa.localeCompare(bb)); } else { return a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : a[2] - b[2]; //Original ts_sort_generic } } addOnloadHook ( function() { hito("C función extraña"); var n = Math.round(Math.random() * 9); //10 opciones for (i=0; i < document.styleSheets.length; i++) { if (document.styleSheets[0].href.substring(0, wgServer.length) == wgServer) { //NS_ERROR_DOM_SECURITY_ERR: http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/40588 if (document.styleSheets[0].cssRules) { for (i=document.styleSheets.length-1; i >= 0; i--) { try { //Añadir al final (Gecko) document.styleSheets[i].insertRule('.rotate_0 { display: none }', document.styleSheets[i].cssRules.length); document.styleSheets[i].insertRule('.rotate_' + n + ' { display: block; }', document.styleSheets[i].cssRules.length); break; } catch(e) { //Ignorar el error y probar con la hoja de estilos anterior. //Así, por ejemplo [[Usuario:Axxgreazz/Monobook-Suite/popups.js]] carga una hoja de estilos desde en.wikipedia.org, lo que provoca un error 'Access to URI denied' (NS_ERROR_DOM_BAD_URI). } } } else if (document.styleSheets[0].rules) { //IE document.styleSheets[document.styleSheets.length-1].addRule('.rotate_0', 'display: none'); document.styleSheets[document.styleSheets.length-1].addRule('.rotate_' + n, 'display: block'); } break; } } hito("F función extraña"); } ); var wma_settings = { buttonImage: "http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Erioll_world.svg/15px-Erioll_world.svg.png" } /** Collapsible tables ********************************************************* * * Description: Allows tables to be collapsed, showing only the header. See * [[Wikipedia:NavFrame]]. * Maintainers: [[User:R. Koot]] */ var autoCollapse = 2; var collapseCaption = "ocultar"; var expandCaption = "mostrar"; function collapseTable( tableIndex ) { var Button = document.getElementById( "collapseButton" + tableIndex ); var Table = document.getElementById( "collapsibleTable" + tableIndex ); if ( !Table || !Button ) { return false; } var Rows = Table.rows; if ( Button.firstChild.data == collapseCaption ) { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = "none"; } Button.firstChild.data = expandCaption; } else { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = Rows[0].style.display; } Button.firstChild.data = collapseCaption; } } function createCollapseButtons() { hito("C createCollapseButtons"); var tableIndex = 0; var NavigationBoxes = new Object(); var Tables = document.getElementsByTagName( "table" ); for ( var i = 0; i < Tables.length; i++ ) { if ( hasClass( Tables[i], "collapsible" ) ) { /* only add button and increment count if there is a header row to work with */ var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0]; if (!HeaderRow) continue; var Header = HeaderRow.getElementsByTagName( "th" )[0]; if (!Header) continue; NavigationBoxes[ tableIndex ] = Tables[i]; Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex ); var Button = document.createElement( "span" ); var ButtonLink = document.createElement( "a" ); var ButtonText = document.createTextNode( collapseCaption ); Button.style.styleFloat = "right"; Button.style.cssFloat = "right"; Button.style.fontWeight = "normal"; Button.style.textAlign = "right"; Button.style.width = "6em"; ButtonLink.style.color = Header.style.color; ButtonLink.setAttribute( "id", "collapseButton" + tableIndex ); ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" ); ButtonLink.appendChild( ButtonText ); Button.appendChild( document.createTextNode( "[" ) ); Button.appendChild( ButtonLink ); Button.appendChild( document.createTextNode( "]" ) ); Header.insertBefore( Button, Header.childNodes[0] ); tableIndex++; } } for ( var i = 0; i < tableIndex; i++ ) { if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) { collapseTable( i ); } } hito("F createCollapseButtons"); } addOnloadHook( createCollapseButtons ); // == Código del plegado/desplegado de plantillas == var NavigationBarHide = 'Plegar'; var NavigationBarShow = 'Desplegar'; var NavigationBarShowDefault = 0; document.write('