discourse/spec/fixtures/onebox/amazon.response

3773 lines
814 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html class="a-touch a-mobile a-js a-audio a-video a-canvas a-svg a-drag-drop a-geolocation a-history a-webworker a-autofocus a-input-placeholder a-textarea-placeholder a-local-storage a-touch a-gradients a-hires a-transform3d a-touch-scrolling a-ios a-mobile a-text-shadow a-text-stroke a-box-shadow a-border-radius a-border-image a-opacity a-transform a-transition a-ember" data-19ax5a9jf="mongoose" data-aui-build-date="3.18.2-2018-02-15" data-ember-extension="1" data-aui-version="00fd8dd141900eab878ed8d98dc8a72ba5df647b"><script type="text/javascript">window["_gaUserPrefs"] = { ioo : function() { return true; } }</script><!-- sp:feature:head-start --><head><script async="" src="https://images-na.ssl-images-amazon.com/images/G/01/AUIClients/ClientSideMetricsAUIJavascript-96ea10f95c9c40ac3d7cc81f2d76b78f0fdf178b._V2_.js" crossorigin="anonymous"></script><script>var aPageStart = (new Date()).getTime();</script><meta name="viewport" content="width=device-width, maximum-scale=1, minimum-scale=1, initial-scale=1, user-scalable=no, shrink-to-fit=no"><meta charset="utf-8">
<script type="text/javascript">var ue_t0=ue_t0||+new Date();</script><!-- sp:feature:cs-optimization -->
<meta http-equiv="x-dns-prefetch-control" content="on"><link rel="dns-prefetch" href="//images-na.ssl-images-amazon.com"><link rel="dns-prefetch" href="//m.media-amazon.com"><link rel="dns-prefetch" href="//completion.amazon.com"><script type="text/javascript">
var ue_csm = window,
ue_hob = +new Date();
(function(d){var e=d.ue=d.ue||{},f=Date.now||function(){return+new Date};e.d=function(b){return f()-(b?0:d.ue_t0)};e.stub=function(b,a){if(!b[a]){var c=[];b[a]=function(){c.push([c.slice.call(arguments),e.d(),d.ue_id])};b[a].replay=function(b){for(var a;a=c.shift();)b(a[0],a[1],a[2])};b[a].isStub=1}};e.exec=function(b,a){return function(){if(1==window.ueinit)try{return b.apply(this,arguments)}catch(c){ueLogError(c,{attribution:a||"undefined",logLevel:"WARN"})}}}})(ue_csm);
var ue_err_chan = 'jserr-rw';
(function(d,e){function h(f,b){if(!(a.ec>a.mxe)&&f){a.ter.push(f);b=b||{};var c=f.logLevel||b.logLevel;c&&c!==k&&c!==m&&c!==n&&c!==p||a.ec++;c&&c!=k||a.ecf++;b.pageURL=""+(e.location?e.location.href:"");b.logLevel=c;b.attribution=f.attribution||b.attribution;a.erl.push({ex:f,info:b})}}function l(a,b,c,e,g){d.ueLogError({m:a,f:b,l:c,c:""+e,err:g,fromOnError:1,args:arguments},g?{attribution:g.attribution,logLevel:g.logLevel}:void 0);return!1}var k="FATAL",m="ERROR",n="WARN",p="DOWNGRADED",a={ec:0,ecf:0,
pec:0,ts:0,erl:[],ter:[],mxe:50,startTimer:function(){a.ts++;setInterval(function(){d.ue&&a.pec<a.ec&&d.uex("at");a.pec=a.ec},1E4)}};l.skipTrace=1;h.skipTrace=1;h.isStub=1;d.ueLogError=h;d.ue_err=a;e.onerror=l})(ue_csm,window);
var ue_id = '7F3MGDYTH1YH8KVBSFWJ',
ue_url = '/gp/uedata',
ue_navtiming = 1,
ue_mid = 'ATVPDKIKX0DER',
ue_sid = '147-0816675-1753153',
ue_sn = 'www.amazon.com',
ue_furl = 'fls-na.amazon.com',
ue_surl = 'https://unagi-na.amazon.com/1/events/com.amazon.csm.nexusclient.prod',
ue_fcsn = 1,
ue_urt = 3,
ue_rpl_ns = 'cel-rpl',
ue_ddq = 1,
ue_fpf = '//fls-na.amazon.com/1/batch/1/OP/ATVPDKIKX0DER:147-0816675-1753153:7F3MGDYTH1YH8KVBSFWJ$uedata=s:',
ue_rsc = 0,
ue_cdt = 1,
ue_swi = 1;
function ue_viz(){(function(c,e,a){function k(b){if(c.ue.viz.length<p&&!l){var a=b.type;b=b.originalEvent;/^focus./.test(a)&&b&&(b.toElement||b.fromElement||b.relatedTarget)||(a=e[m]||("blur"==a||"focusout"==a?"hidden":"visible"),c.ue.viz.push(a+":"+(+new Date-c.ue.t0)),"visible"==a&&(ue.isl&&uex("at"),l=1))}}for(var l=0,f,g,m,n=["","webkit","o","ms","moz"],d=0,p=20,h=0;h<n.length&&!d;h++)if(a=n[h],f=(a?a+"H":"h")+"idden",d="boolean"==typeof e[f])g=a+"visibilitychange",m=(a?a+"V":"v")+"isibilityState";
k({});d&&e.addEventListener(g,k,0);c.ue&&d&&(c.ue.pageViz={event:g,propHid:f})})(ue_csm,document,window)};
(function(a,g,x){function z(a){return a&&a.replace&&a.replace(/^\s+|\s+$/g,"")}function q(a){return"undefined"===typeof a}function J(e){if(a.ue_fpf&&g.encodeURIComponent&&e){var b=new Image;e=""+a.ue_fpf+g.encodeURIComponent(e)+":"+(+new Date-a.ue_t0);a.ue.iel.push(b);b.src=e}}function D(e){if(e&&0<e.length){var b=new Image;a.ue.iel.push(b);b.src=e}}function t(e,b,c,l){var g=l||+new Date,h;a.ueam&&a.ueam(b,e,l);if(b||q(c)){if(e)for(h in l=b?f("t",b)||f("t",b,{}):a.ue.t,l[e]=g,c)c.hasOwnProperty(h)&&
f(h,b,c[h]);return g}}function f(e,b,c){var l=a.ue,f=b&&b!=l.id?l.sc[b]:l;f||(f=l.sc[b]={});"id"==e&&c&&(l.cfa2=1);return f[e]=c||f[e]}function A(e,b,c,f,g){c="on"+c;var h=b[c];"function"===typeof h?e&&(a.ue.h[e]=h):h=function(){};b[c]=g?function(a){f(a);h(a)}:function(a){h(a);f(a)};b[c]&&(b[c].isUeh=1)}function E(e,b,c){function l(b,c){var d=[b],L=0,g={},l,h;c?(d.push("m=1"),g[c]=1):g=a.ue.sc;for(h in g)if(g.hasOwnProperty(h)){var k=f("wb",h),m=f("t",h)||{},p=f("t0",h)||a.ue.t0,n;if(c||2==k){k=k?
L++:"";d.push("sc"+k+"="+h);for(n in m)3>=n.length&&!q(m[n])&&null!==m[n]&&d.push(n+k+"="+(m[n]-p));d.push("t"+k+"="+m[e]);if(f("ctb",h)||f("wb",h))l=1}}!B&&l&&d.push("ctb=1");return d.join("&")}function K(b,c){if(a.ue.b){var e=a.ue.b;a.ue.b="";h(e,b,c,1)}}function h(b,c,e,d){if(b){var f=!d||!a.ue.log,l=a.ue_err,h;if(f&&(D(b),C&&"ul"===c&&r))try{r[F+a.ue.oid]=b}catch(k){}M?J(b):a.ue.log&&(h=g.chrome&&"ul"==c,a.ue.log(b,"uedata",a.ue_svi?{n:1,img:!d&&h?1:0}:{n:1}),a.ue.ielf.push(b));l&&!l.ts&&l.startTimer();
K(c,e);C&&f&&"ld"===c&&N(F,function(a){a&&a.length&&(a+="&csmtags=was-recoverered");D(a)})}}function v(b){if(!ue.collected){var c=b.timing,e=b.navigation,d=ue.t;c&&(d.na_=c.navigationStart,d.ul_=c.unloadEventStart,d._ul=c.unloadEventEnd,d.rd_=c.redirectStart,d._rd=c.redirectEnd,d.fe_=c.fetchStart,d.lk_=c.domainLookupStart,d._lk=c.domainLookupEnd,d.co_=c.connectStart,d._co=c.connectEnd,d.sc_=c.secureConnectionStart,d.rq_=c.requestStart,d.rs_=c.responseStart,d._rs=c.responseEnd,d.dl_=c.domLoading,d.di_=
c.domInteractive,d.de_=c.domContentLoadedEventStart,d._de=c.domContentLoadedEventEnd,d._dc=c.domComplete,d.ld_=c.loadEventStart,d._ld=c.loadEventEnd,c=d.na_,b="function"!==typeof b.now||q(c)?0:new Date(c+b.now())-new Date,d.ntd=b+a.ue.t0);e&&(d.ty=e.type+a.ue.t0,d.rc=e.redirectCount+a.ue.t0);ue.collected=1}}function s(b){var c=n&&n.navigation?n.navigation.type:y,d=c&&2!=c,e=a.ue.bfini;a.ue.cfa2||(e&&1<e&&(b+="&bfform=1",d||(a.ue.isBFT=e-1)),2==c&&(b+="&bfnt=1",a.ue.isBFT=a.ue.isBFT||1),a.ue.ssw&&
a.ue.isBFT&&(q(a.ue.isNRBF)&&(c=a.ue.ssw(a.ue.oid),c.e||q(c.val)||(a.ue.isNRBF=1<c.val?0:1)),q(a.ue.isNRBF)||(b+="&nrbf="+a.ue.isNRBF)),a.ue.isBFT&&!a.ue.isNRBF&&(b+="&bft="+a.ue.isBFT));return b}if(b||q(c)){for(var m in c)c.hasOwnProperty(m)&&f(m,b,c[m]);t("pc",b,c);m=f("id",b)||a.ue.id;var d=a.ue.url+"?"+e+"&v="+a.ue.v+"&id="+m,B=f("ctb",b)||f("wb",b),n=g.performance||g.webkitPerformance,k,p;B&&(d+="&ctb="+B);1<a.ueinit&&(d+="&ic="+a.ueinit);!a.ue._fi||"at"!=e||b&&b!=m||(d+=a.ue._fi());if(!("ld"!=
e&&"ul"!=e||b&&b!=m)){if("ld"==e){try{g.onbeforeunload&&g.onbeforeunload.isUeh&&(g.onbeforeunload=null)}catch(A){}if(g.chrome)for(p=0;p<ue.ulh.length;p++)G("beforeunload",ue.ulh[p]);(p=x.ue_backdetect)&&p.ue_back&&p.ue_back.value++;a._uess&&(k=a._uess());a.ue.isl=1}ue._bf&&(d+="&bf="+ue._bf());a.ue_navtiming&&n&&n.timing&&(f("ctb",m,"1"),1==a.ue_navtiming&&t("tc",y,y,n.timing.navigationStart));n&&v(n);a.ue.t.hob=a.ue_hob;a.ue.t.hoe=a.ue_hoe;a.ue.ifr&&(d+="&ifr=1")}t(e,b,c);c="ld"==e&&b&&f("wb",b);
var w;c||b&&b!==m||O(b);c||m==a.ue.oid||P((f("t",b)||{}).tc||+f("t0",b),+f("t0",b));a.ue_mbl&&a.ue_mbl.cnt&&!c&&(d+=a.ue_mbl.cnt());c?f("wb",b,2):"ld"==e&&(u.lid=z(m));for(w in a.ue.sc)if(1==f("wb",w))break;if(c){if(a.ue.s)return;d=l(d,null)}else p=l(d,null),p!=d&&(p=s(p),a.ue.b=p),k&&(d+=k),d=l(d,b||a.ue.id);d=s(d);if(a.ue.b||c)for(w in a.ue.sc)2==f("wb",w)&&delete a.ue.sc[w];k=0;ue._rt&&(d+="&rt="+ue._rt());c||(a.ue.s=0,(k=a.ue_err)&&0<k.ec&&k.pec<k.ec&&(k.pec=k.ec,d+="&ec="+k.ec+"&ecf="+k.ecf),
k=f("ctb",b),f("t",b,{}));d&&a.ue.tag&&0<a.ue.tag().length&&(d+="&csmtags="+a.ue.tag().join("|"),a.ue.tag=a.ue.tagC());d&&a.ue.viz&&0<a.ue.viz.length&&(d+="&viz="+a.ue.viz.join("|"),a.ue.viz=[]);d&&!q(a.ue_pty)&&(d+="&pty="+a.ue_pty+"&spty="+a.ue_spty+"&pti="+a.ue_pti);d&&a.ue.tabid&&(d+="&tid="+a.ue.tabid);d&&a.ue.aftb&&(d+="&aftb=1");d&&a.ue.sbf&&(d+="&sbf=1");!a.ue._ui||b&&b!=m||(d+=a.ue._ui());a.ue.a=d;h(d,e,k,c)}}function O(a){var b=g.ue_csm_markers||{},c;for(c in b)b.hasOwnProperty(c)&&t(c,
a,y,b[c])}function v(a,b,c){c=c||g;c.addEventListener?c.addEventListener(a,b,!!window.ue_clf):c.attachEvent&&c.attachEvent("on"+a,b)}function G(a,b,c){c=c||g;c.removeEventListener?c.removeEventListener(a,b,!!window.ue_clf):c.detachEvent&&c.detachEvent("on"+a,b)}function H(){function e(){a.onUl()}function b(a){return function(){c[a]||(c[a]=1,E(a))}}var c=a.ue.r,f,q;a.onLd=b("ld");a.onLdEnd=b("ld");a.onUl=b("ul");f={stop:b("os")};g.chrome?(v("beforeunload",e),ue.ulh.push(e)):f[Q]=a.onUl;for(q in f)f.hasOwnProperty(q)&&
A(0,g,q,f[q]);a.ue_viz&&ue_viz();R&&v("readystatechange",S,x);v("load",a.onLd);t("ue")}function S(){"complete"===x.readyState&&(T?setTimeout(I,0):I())}function I(){var e;if(!(e=ue.isl)&&(e=U))a:{e=x.images||[];for(var b=0;b<e.length;b++)if(!1===e[b].complete){e=!1;break a}e=!0}if(!e)a.onUl()}function P(e,b){a.ue_mbl&&a.ue_mbl.ajax&&a.ue_mbl.ajax(e,b);a.ue.tag("ajax-transition")}function N(a,b){if(r)try{for(var c=0;c<r.length;c++){var f=r.key(c);0===f.indexOf(a)&&(b(r[f]),r.removeItem(f))}}catch(g){}}
a.ueinit=(a.ueinit||0)+1;var u={t0:g.aPageStart||a.ue_t0,id:a.ue_id,url:a.ue_url,rid:a.ue_id,a:"",b:"",h:{},r:{ld:0,oe:0,ul:0},s:1,t:{},sc:{},iel:[],ielf:[],fc_idx:{},viz:[],v:"0.200010.0",d:a.ue&&a.ue.d,log:a.ue&&a.ue.log,clog:a.ue&&a.ue.clog,onflush:a.ue&&a.ue.onflush,onunload:a.ue&&a.ue.onunload,stub:a.ue&&a.ue.stub,lr:a.ue&&a.ue.lr,exec:a.ue&&a.ue.exec,event:a.ue&&a.ue.event,onSushiUnload:a.ue&&a.ue.onSushiUnload,onSushiFlush:a.ue&&a.ue.onSushiFlush,ulh:[],cfa2:0},M=a.ue_fpf?1:0,C=1===a.ue_sspb,
s;if(s=C)a:{try{s=g.sessionStorage;break a}catch(V){}s=void 0}var r=s,F="csmpb-",R=1===a.ue_rsc||3===a.ue_rsc,T=3===a.ue_rsc,U=1===a.ue_rsc,Q="beforeunload",y;u.oid=z(u.id);u.lid=z(u.id);a.ue=u;a.ue._t0=a.ue.t0;a.ue.tagC=function(){var a={};return function(b){b&&(a[b]=1);b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b}};a.ue.tag=a.ue.tagC();a.ue.ifr=g.top!==g.self||g.frameElement?1:0;ue.attach=v;ue.detach=G;ue.reset=function(e,b){e&&(a.ue_cel&&a.ue_cel.reset(),a.ue.t0=+new Date,a.ue.rid=
e,a.ue.id=e,a.ue.fc_idx={},a.ue.viz=[])};a.uei=H;a.ueh=A;a.ues=f;a.uet=t;a.uex=E;H()})(ue_csm,window,ue_csm.document);
ue.stub(ue,"event");ue.stub(ue,"onSushiUnload");ue.stub(ue,"onSushiFlush");
ue.stub(ue,"log");ue.stub(ue,"onunload");ue.stub(ue,"onflush");
(function(b){var a=b.ue;a.cv={};a.cv.scopes={};a.count=function(c,b,d){var e={},f=a.cv;e.counter=c;e.value=b;e.t=a.d();d&&d.scope&&(f=a.cv.scopes[d.scope]=a.cv.scopes[d.scope]||{},e.scope=d.scope);if(void 0===b)return f[c];f[c]=b;c=0;d&&d.bf&&(c=1);a.clog&&0===c?a.clog(e,"csmcount",{bf:c}):a.log&&a.log(e,"csmcount",{c:1,bf:c})};a.count("baselineCounter2",1);a&&a.event&&(a.event({requestId:b.ue_id||"rid",server:b.ue_sn||"sn",obfuscatedMarketplaceId:b.ue_mid||"mid"},"csm","csm.CSMBaselineEvent.4"),
a.count("nexusBaselineCounter",1,{bf:1}))})(ue_csm);
var ue_hoe = +new Date();
</script>
<!-- 9xl60eorxh4r8d777tamp408h07nlirdye9n --><!-- sp:feature:aui-assets-configure -->
<!-- sp:feature:aui-assets-css -->
<link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/51Evq4eMXsL._RC|01-yf03D4rL.css,01gq5Ie9j3L.css,31stfprY0tL.css,01d8Fs5iBdL.css,21ZwnZnTQ7L.css,11UksSmDw-L.css,11+zKfQDbkL.css,21quTPIGBxL.css,01jkimhv0aL.css,310yHWaTVRL.css,01COiFb05sL.css,01djTkqmZSL.css,11pdOHTh95L.css,21g9AOmZB5L.css,11X2-nh0PYL.css,01h2e2BEitL.css,110Q3MAjYJL.css,11aMMTVEKqL.css,11oyQ9RIYtL.css,01vd5lqeZUL.css,31VU7Pt5U6L.css,01kPgnKe7wL.css,11mmd1QliNL.css,01Alnvtt1zL.css,01BBs40O5ZL.css_.css?AUIClients/AmazonUI#mobile.us.not-trident">
<!-- sp:feature:aui-assets-js -->
<script>
(function(g,h,L,la){function B(a){t&&t.tag&&t.tag(q(":","aui",a))}function u(a,b){t&&t.count&&t.count("aui:"+a,0===b?0:b||(t.count("aui:"+a)||0)+1)}function p(a){try{return a.test(navigator.userAgent)}catch(b){return!1}}function w(a,b,c){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c)}function q(a,b,c,e){b=b&&c?b+a+c:b||c;return e?q(a,b,e):b}function C(a,b,c){try{Object.defineProperty(a,b,{value:c,writable:!1})}catch(e){a[b]=c}return c}function M(){return setTimeout(W,
0)}function ma(a,b){var c=a.length,e=c,f=function(){e--||(N.push(b),O||(M(),O=!0))};for(f();c--;)X[a[c]]?f():(x[a[c]]=x[a[c]]||[]).push(f)}function na(a,b,c,e,f){var d=h.createElement(a?"script":"link");w(d,"error",e);f&&w(d,"load",f);if(a){d.type="text/javascript";d.async=!0;if(a=c)a=-1!==b.indexOf("images/I")||/AUIClients/.test(b);a&&d.setAttribute("crossorigin","anonymous");d.src=b}else d.rel="stylesheet",d.href=b;h.getElementsByTagName("head")[0].appendChild(d)}function Y(a,b){function c(c,e){function f(){na(b,
c,h,function(b){!D&&h?(h=!1,u("resource_retry"),f()):(u("resource_error"),a.log("Asset failed to load: "+c,D?"WARN":void 0));b&&b.stopPropagation?b.stopPropagation():g.event&&(g.event.cancelBubble=!0)},e)}if(Z[c])return!1;Z[c]=!0;u("resource_count");var h=!0;return!f()}if(b){var e=0,f=0;c.andConfirm=function(a,b){return c(a,function(){e++;b&&b.apply(this,arguments)})};c.confirm=function(){f++};c.getCsriCounters=function(){return{reqs:e,full:f}}}return c}function oa(a,b,c){for(var e={name:a,guard:function(c){return b.guardFatal(a,
c)},logError:function(c,d,e){b.logError(c,d,e,a)}},f=[],d=0;d<c.length;d++)E.hasOwnProperty(c[d])&&(f[d]=P.hasOwnProperty(c[d])?P[c[d]](E[c[d]],e):E[c[d]]);return f}function y(a,b,c,e,f){return function(d,h){function l(){var a=null;e?a=h:"function"===typeof h&&(p.start=z(),a=h.apply(g,oa(d,k,m)),p.end=z());if(b){E[d]=a;a=d;for(X[a]=!0;(x[a]||[]).length;)x[a].shift()();delete x[a]}p.done=!0}var k=f||this;"function"===typeof d&&(h=d,d=void 0);b&&(d=(d||"__NONAME__").replace(/^prv:/,""),Q.hasOwnProperty(d)&&
k.error(q(", reregistered by ",q(" by ",d+" already registered",Q[d]),k.attribution),d),Q[d]=k.attribution);for(var m=[],n=0;n<a.length;n++)m[n]=a[n].replace(/^prv:/,"");var p=aa[d||"anon"+ ++pa]={depend:m,registered:z(),namespace:k.namespace};c?l():ma(m,k.guardFatal(d,l));return{decorate:function(a){P[d]=k.guardFatal(d,a)}}}}function ba(a){return function(){var b=Array.prototype.slice.call(arguments);return{execute:y(b,!1,a,!1,this),register:y(b,!0,a,!1,this)}}}function R(a,b){return function(c,
e){e||(e=c,c=void 0);var f=this.attribution;return function(){v.push(b||{attribution:f,name:c,logLevel:a});var d=e.apply(this,arguments);v.pop();return d}}}function F(a,b){this.load={js:Y(this,!0),css:Y(this)};C(this,"namespace",b);C(this,"attribution",a)}function ca(){h.body?n.trigger("a-bodyBegin"):setTimeout(ca,20)}function A(a,b){if(b){for(var c=a.className.split(" "),e=c.length;e--;)if(c[e]===b)return;a.className+=" "+b}}function da(a,b){for(var c=a.className.split(" "),e=[],f;void 0!==(f=c.pop());)f&&
f!==b&&e.push(f);a.className=e.join(" ")}function ea(a){try{return a()}catch(b){return!1}}function G(){if(H){var a=g.innerWidth?{w:g.innerWidth,h:g.innerHeight}:{w:k.clientWidth,h:k.clientHeight};5<Math.abs(a.w-S.w)||50<a.h-S.h?(S=a,I=4,(a=l.mobile||l.tablet?450<a.w&&a.w>a.h:1250<=a.w)?A(k,"a-ws"):da(k,"a-ws")):0<I&&(I--,fa=setTimeout(G,16))}}function qa(a){(H=void 0===a?!H:!!a)&&G()}function ra(){return H}"use strict";var J=L.now=L.now||function(){return+new L},z=function(a){return a&&a.now?a.now.bind(a):
J}(g.performance);la=z();var r=g.AmazonUIPageJS||g.P;if(r&&r.when&&r.register)throw Error("A copy of P has already been loaded on this page.");var t=g.ue;B();B("aui_build_date:3.18.2-2018-02-15");var N=[],O=!1,W;W=function(){for(var a=M(),b=J();N.length;)if(N.shift()(),50<J()-b)return;clearTimeout(a);O=!1};p(/OS 6_[0-9]+ like Mac OS X/i)&&w(g,"scroll",M);var X={},x={},Z={},D=!1;w(g,"beforeunload",function(){D=!0;setTimeout(function(){D=!1},1E4)});var Q={},E={},P={},aa={},pa=0,T,v=[],ga=g.onerror;
g.onerror=function(a,b,c,e,f){f&&"object"===typeof f||(f=Error(a,b,c),f.columnNumber=e,f.stack=b||c||e?q(String.fromCharCode(92),f.message,"at "+q(":",b,c,e)):void 0);var d=v.pop()||{};f.attribution=q(":",f.attribution||d.attribution,d.name);f.logLevel=d.logLevel;f.attribution&&console&&console.log&&console.log([f.logLevel||"ERROR",a,"thrown by",f.attribution].join(" "));v=[];ga&&(d=[].slice.call(arguments),d[4]=f,ga.apply(g,d))};F.prototype={logError:function(a,b,c,e){b={message:b,logLevel:c||"ERROR",
attribution:q(":",this.attribution,e)};if(g.ueLogError)return g.ueLogError(a||b,a?b:null),!0;console&&console.error&&(console.log(b),console.error(a));return!1},error:function(a,b,c,e){a=Error(q(":",e,a,c));a.attribution=q(":",this.attribution,b);throw a;},guardError:R(),guardFatal:R("FATAL"),guardCurrent:function(a){var b=v[v.length-1];return b?R(b.logLevel,b).call(this,a):a},log:function(a,b,c){return this.logError(null,a,b,c)},declare:y([],!0,!0,!0),register:y([],!0),execute:y([]),AUI_BUILD_DATE:"3.18.2-2018-02-15",
when:ba(),now:ba(!0),trigger:function(a,b,c){var e=J();this.declare(a,{data:b,pageElapsedTime:e-(g.aPageStart||NaN),triggerTime:e});c&&c.instrument&&T.when("prv:a-logTrigger").execute(function(b){b(a)})},handleTriggers:function(){this.log("handleTriggers deprecated")},attributeErrors:function(a){return new F(a)},_namespace:function(a,b){return new F(a,b)}};var n=C(g,"AmazonUIPageJS",new F);T=n._namespace("PageJS","AmazonUI");T.declare("prv:p-debug",aa);n.declare("p-recorder-events",[]);n.declare("p-recorder-stop",
function(){});C(g,"P",n);ca();if(h.addEventListener){var ha;h.addEventListener("DOMContentLoaded",ha=function(){n.trigger("a-domready");h.removeEventListener("DOMContentLoaded",ha,!1)},!1)}var k=h.documentElement,U=function(){var a=["O","ms","Moz","Webkit"],b=h.createElement("div");return{testGradients:function(){b.style.cssText=("background-image:-webkit-gradient(linear,left top,right bottom,from(#9f9),to(white));background-image:"+a.join("linear-gradient(left top,#9f9, white);background-image:")).slice(0,
-17);return-1<b.style.backgroundImage.indexOf("gradient")},test:function(c){var e=c.charAt(0).toUpperCase()+c.substr(1);c=(a.join(e+" ")+e+" "+c).split(" ");for(e=c.length;e--;)if(""===b.style[c[e]])return!0;return!1},testTransform3d:function(){var a=!1;g.matchMedia&&(a=g.matchMedia("(-webkit-transform-3d)").matches);return a}}}(),r=k.className,ia=/(^| )a-mobile( |$)/.test(r),ja=/(^| )a-tablet( |$)/.test(r),l={audio:function(){return!!h.createElement("audio").canPlayType},video:function(){return!!h.createElement("video").canPlayType},
canvas:function(){return!!h.createElement("canvas").getContext},svg:function(){return!!h.createElementNS&&!!h.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect},offline:function(){return navigator.hasOwnProperty&&navigator.hasOwnProperty("onLine")&&navigator.onLine},dragDrop:function(){return"draggable"in h.createElement("span")},geolocation:function(){return!!navigator.geolocation},history:function(){return!(!g.history||!g.history.pushState)},webworker:function(){return!!g.Worker},
autofocus:function(){return"autofocus"in h.createElement("input")},inputPlaceholder:function(){return"placeholder"in h.createElement("input")},textareaPlaceholder:function(){return"placeholder"in h.createElement("textarea")},localStorage:function(){return"localStorage"in g&&null!==g.localStorage},orientation:function(){return"orientation"in g},touch:function(){return"ontouchend"in h},gradients:function(){return U.testGradients()},hires:function(){var a=g.devicePixelRatio&&1.5<=g.devicePixelRatio||
g.matchMedia&&g.matchMedia("(min-resolution:144dpi)").matches;u("hiRes"+(ia?"Mobile":ja?"Tablet":"Desktop"),a?1:0);return a},transform3d:function(){return U.testTransform3d()},touchScrolling:function(){return p(/Windowshop|android.([3-9]|[L-Z])|OS ([5-9]|[1-9][0-9]+)(_[0-9]{1,2})+ like Mac OS X|Chrome|Silk|Firefox|Trident.+?; Touch/i)},ios:function(){return p(/OS [1-9][0-9]*(_[0-9]*)+ like Mac OS X/i)&&!p(/trident|Edge/i)},android:function(){return p(/android.([1-9]|[L-Z])/i)&&!p(/trident|Edge/i)},
mobile:function(){return ia},tablet:function(){return ja}},m;for(m in l)l.hasOwnProperty(m)&&(l[m]=ea(l[m]));for(var V="textShadow textStroke boxShadow borderRadius borderImage opacity transform transition".split(" "),K=0;K<V.length;K++)l[V[K]]=ea(function(){return U.test(V[K])});var H=!0,fa=0,S={w:0,h:0},I=4;G();w(g,"resize",function(){clearTimeout(fa);I=4;G()});var ka={getItem:function(a){try{return g.localStorage.getItem(a)}catch(b){}},setItem:function(a,b){try{return g.localStorage.setItem(a,
b)}catch(c){}}};da(k,"a-no-js");A(k,"a-js");!p(/OS [1-8](_[0-9]*)+ like Mac OS X/i)||g.navigator.standalone||p(/safari/i)||A(k,"a-ember");r=[];for(m in l)l.hasOwnProperty(m)&&l[m]&&r.push("a-"+m.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()}));A(k,r.join(" "));k.setAttribute("data-aui-build-date","3.18.2-2018-02-15");n.register("p-detect",function(){return{capabilities:l,localStorage:l.localStorage&&ka,toggleResponsiveGrid:qa,responsiveGridEnabled:ra}});p(/UCBrowser/i)||l.localStorage&&
A(k,ka.getItem("a-font-class"));n.declare("a-event-revised-handling",!1);(m=navigator.serviceWorker)&&m.getRegistrations?(B("sw:unregister:supported"),m.getRegistrations().then(function(a){a.forEach(function(a){a.unregister().then(function(a){u("sw:unregister:success")}).catch(function(a){u("sw:unregister:failure");n.logError(a,"[AUI SW] Failed to unregister service worker:")})})})):B("sw:unregister:unsupported");n.declare("a-fix-event-off",!1);u("pagejs:pkgExecTime",z()-NaN)})(window,document,Date);
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('sp.load.js').execute(function() {
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/61ea4y7yPdL._RC|11IYhapguOL.js,61-dJ29Zw5L.js,21dmoxZTACL.js,01E8f3KV-NL.js,31fv8bqHLoL.js,31ReKJl2X6L.js,51nK0kUyg2L.js,11Mdh5CVmhL.js,01xMsWWFUQL.js,11KkQiUpBPL.js,113pP0Sfh0L.js,21auxuI+dRL.js,01PoLXBDXWL.js,61x-Yxr2raL.js,318CMPRminL.js,11SW3HEKjtL.js,01qkmZhGmAL.js,01jUS+y5YWL.js_.js?AUIClients/AmazonUI#mobile');
});
</script>
<!-- sp:feature:nav-inline-css -->
<style>.nav-sprite-v3 .nav-sprite {
background-image: url(https://images-na.ssl-images-amazon.com/images/G/01/gno/sprites/new-nav-sm-smile-sprite-global-1x_blueheaven._CB487546343_.png);
background-repeat: no-repeat;
}
.nav-spinner {
background-image: url(https://images-na.ssl-images-amazon.com/images/G/01/javascripts/lib/popover/images/snake._CB192571611_.gif);
}
</style><!-- -->
<link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/51ZJNYh%2BOuL._RC|31H9QnSNj3L.css,01+72+wCC9L.css_.css?AUIClients/NavMobileMetaAsset#mobile">
<link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/21EugTBba7L.css?AUIClients/RetailSearchAutocompleteAssets#mobile">
<!-- sp:feature:host-assets -->
<!-- htmlBeginMarker -->
<link rel="dns-prefetch" href="//images-na.ssl-images-amazon.com">
<script type="text/javascript">
var CSMReqs={af:{c:2,p:'atf'},cf:{c:2,p:'cf'}};
var DPTimestamps={mainImgRepl:{c:1}};
var setCSMReq = function(a){
a=a.toLowerCase();
var b=CSMReqs[a];
if(--b.c==0){
if(typeof b.f == 'function'){
b.f();
}
else{
if(typeof
uet=='function'){uet(a);};
if(typeof P !=
'undefined'){P.register(b.p);};
}
}
}
var setDPTimestamp = function(a, t){
var b=DPTimestamps[a];
var w = window;
if(b && --b.c===0){
if (w.ue && typeof w.ue_t0 !== 'undefined' && typeof w.ue.count==='function') {
w.ue.count(a, Date.now()-w.ue_t0);
if(t && w.ue && w.ue.tag) {w.ue.tag(t);}
}
}
}
var addlongPoleTag = function(marker,customtag){
marker=marker.toLowerCase();
var b=CSMReqs[marker];
if(b.c==0){
if(window.ue && ue.tag) {ue.tag(customtag);}
}
}
</script>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;detail-page-device-type&quot;}">{"deviceType":"mobile"}</script>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;metrics-schema&quot;}">{"widgetSchema":"dp:widget:","dimensionSchema":"dp:dims:"}</script>
<link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/01ekIXTj5kL._RC|01j62IBqyaL.css,41wvsvL+sxL.css,31QLjTiBtrL.css,31ZYydvXTIL.css,11tkAOwE6OL.css,21xItms32EL.css,11q7D6YoQCL.css,018pZJ+Ms7L.css,21t5UAtA4iL.css,21mvSipn7pL.css,41Fasit8zhL.css,21QwDiO8ycL.css,01IHzhAZ28L.css,31no24Dqj1L.css,01wBE2Z+USL.css,11xlykx3aFL.css,01D-B-OeNDL.css,21CNSKZ67ML.css,11rhPo030XL.css,11zgKVdkIJL.css,51oAYplAOyL.css,21aa6KfRqJL.css,21lDMA2J74L.css,31AXqefcH0L.css,21thLxrpr2L.css,11P7nJr8UuL.css,012dCODns-L.css,11oH9gtOgDL.css,21ZKosCj0iL.css,313bzSzzhRL.css,21-9Q-rNd0L.css,01rgQ3jqo7L.css,01XzaDG7OBL.css,21Df5N8kF4L.css,61sSErmOJTL.css,014Z+MbaRaL.css,11hxZgqF80L.css,01QUs5FVXoL.css,016xTzXJLfL.css,31LBzl8T3vL.css,21DFs8eEV-L.css,11cAYJlTEgL.css,018mGORJ7tL.css,11fvu+DzMxL.css,11iDQvZvByL.css,01ticFfm7pL.css,01lh9w-GYYL.css,31UsSdSPS1L.css,01WKGP3G+gL.css,11Mso4bvY-L.css,01LCsoCesOL.css,11kkkHiWcRL.css,010kw0xkZfL.css,21M+Dg4s3dL.css,11qL99m7IWL.css_.css?AUIClients/DetailPageMobileWebMetaAsset#mobile.us.not-trident.130884-T1.121035-T1.128615-T1.133998-T1.133996-T1.113788-C.93121-T1.126720-T1.114362-T1.119597-T1.111960-T1.103671-T2.118535-T1.107067-T2.53691-T1.118886-T1.110554-T1.123375-T1.108941-T1.123873-T1.114779-T1.120067-T1.123880-T1.123881-T1.106820-T1.121807-T1.101955-T1.111760-T1.111763-T1.108310-T1.115439-T1.56891-T1.108343-T1.108344-T1.109378-T1.83029-T1.131720-T1">
<script type="text/javascript"> (typeof uet === 'function') && uet("x3") </script><style type="text/css">
#wow-twister-spinner {
background: url("https://images-na.ssl-images-amazon.com/images/G/01/amazonui/loading/loading-4x._V1_.gif") 50% 50% no-repeat;
}
#wow-twister-loading-dim {
background: url("https://images-na.ssl-images-amazon.com/images/G/01/amazonui/loading/loading-4x._V1_.gif") center center no-repeat;
}
</style><script>
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('atf').execute(function(){
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/11Muzrhwo6L._RC|41ecatjAVfL.js,31cePTj3CrL.js,11AncM+ZunL.js,31hW3BxWLXL.js,21rOwfZB9SL.js,3118lZR+khL.js,516Cu4vSzCL.js,51Hi2VfLU+L.js,21yUMfZsKLL.js,31CyVESxcFL.js,016DBHJkIYL.js,21GuNBYH4BL.js,51WIGchpq5L.js,818Z3w8jMsL.js,21hyeuTdJ9L.js,01H0TE47EIL.js,013NxCyC-FL.js,11QIUl6VLbL.js,21jBAndZe0L.js,51YzCqyJFIL.js,0111g0cQvbL.js,01nKqcvaCIL.js,01X117Z9PgL.js,51GV9EHW+bL.js,01X5C8pWB1L.js,518iKhtj8UL.js,11sP283FW3L.js,21333KksJEL.js,31egXBuM55L.js,01RHiyjONOL.js,31I-BifbuzL.js,210S22NrxIL.js,51ryEHyLJ5L.js,314ZAgS3sJL.js,11bXLfk2j0L.js,31AnMfsNpuL.js,01q0JZaOPlL.js,116kAgu6ebL.js,31ze7I-RWjL.js,21q3UdjiveL.js,21HlHGr1+aL.js,0193uyIciNL.js,01DShqNIDKL.js,51NhK1niNZL.js,71FaatbojhL.js,01BZK417f8L.js,319kjuuQkzL.js,21mtabjvdBL.js,41yLu0U-ZDL.js,21e16+5SkdL.js,11NHZnHlFmL.js,21CbPMxfA+L.js,015J4NGaO3L.js,11B4fwZPeqL.js,21-q-ofQTaL.js,01cY00OaNgL.js,01jqyAujTwL.js,01KcbtwkAOL.js,01-XJ1YSEXL.js,113LFYzRWdL.js,01NAT+3p7KL.js,111vgqp2a0L.js,51GfggKdyCL.js,01MZJG6lH8L.js,01VtYReatCL.js,31P9rtuG-7L.js,01mL-cPJ2YL.js,01RQtSMdG+L.js,21iHrbWUPtL.js,013tU+A3QIL.js,41qfJxctTDL.js,01ryq+28pGL.js,01l3c7okxRL.js,21lP+A1Np8L.js,01qwoVEkKlL.js,011HXD1ky3L.js,011X+p22ALL.js,01k57x9vvBL.js,01RNXZDiBuL.js,01ZF+ovNflL.js,31baJE6Ao6L.js,01S8y9NkxoL.js,41IRD+TgfRL.js,11ECelPydPL.js,01tJd4+VUOL.js,51-wBjbbYrL.js,410QCZl6RQL.js,01y-5aCXJyL.js,01rg6Ce9FhL.js_.js?AUIClients/DetailPageMobileWebMetaAsset#mobile.us.130884-T1.121035-T1.128615-T1.133998-T1.133996-T1.132705-T1.93121-T1.89963-T1.126720-T1.114362-T1.71277-T1.111960-T1.112610-T1.118535-T1.107067-T2.103593-C.53691-T1.123375-T1.123873-T1.114779-T1.120067-T1.123880-T1.123881-T1.122564-T1.99301-T1.106820-T1.121807-T1.101955-T1.103391-T1.111760-T1.111763-T1.135995-T1.108310-T1.105170-T2.107686-T1.108343-T1.108344-T1.109378-T1.123718-T1.87019-T1.83029-T1.100976-T1.131720-T1');
});
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('goldboxDealDetailPage').execute(function(){
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/81pPtFtJAnL.js?AUIClients/GoldboxUDPAssets');
});
</script>
<script type="text/javascript">
P.when('atf').register('sp.load.js');
P.when('A', 'a-touch').execute(function(A, aTouch){
var $ = A.$;
A.on('a:popover:beforeSlideOut', function(){
$(document).bind('click.a-secondary-view-block', function(e){
e.preventDefault();
e.stopImmediatePropagation();
A.delay(function(){
$(document).unbind('click.a-secondary-view-block');
}, 600);
});
A.delay(function(){
$(document).unbind('click.a-secondary-view-block');
}, 2000);
});
});
</script><meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<link rel="canonical" href="https://www.amazon.com/Seven-Languages-Weeks-Programming-Programmers/dp/193435659X">
<meta name="description" content="Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers) [Bruce Tate] on Amazon.com. *FREE* shipping on qualifying offers. You should learn a programming language every year, as recommended by The Pragmatic Programmer</i>. But if one per year is good">
<meta name="title" content="Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers): Bruce Tate: 8601234653110: Amazon.com: Books">
<meta name="keywords" content="Bruce Tate,Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers),Pragmatic Bookshelf,193435659X,Software Development &amp; Engineering - General,Programming languages (Electronic computers),Programming languages.,COMPUTERS / Programming Languages / General,COMPUTERS / Software Development &amp; Engineering / General,Computer Books: General,Computers,Computers - Languages / Programming,Computing: Professional &amp; Programming,Programming &amp; scripting languages: general,Software Development,Software Engineering">
<title>Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers): Bruce Tate: 8601234653110: Amazon.com: Books</title>
<!--&&&Portal&Delimiter&&&--><!-- sp:end-feature:host-assets -->
<script type="text/javascript">
(function(e,c){function h(b,a){f.push([b,a])}function g(b,a){if(b){var c=e.head||e.getElementsByTagName("head")[0]||e.documentElement,d=e.createElement("script");d.async="async";d.src=b;d.setAttribute("crossorigin","anonymous");a&&a.onerror&&(d.onerror=a.onerror);a&&a.onload&&(d.onload=a.onload);c.insertBefore(d,c.firstChild)}}function k(){ue.uels=g;for(var b=0;b<f.length;b++){var a=f[b];g(a[0],a[1])}ue.deffered=1}var f=[];c.ue&&(ue.uels=h,c.ue.attach&&c.ue.attach("load",k))})(document,window);
(function(a){var b=a.alert;window.alert=function(){a.ueLogError&&a.ueLogError({message:"[CSM] Alert invocation detected with argument: "+arguments[0],logLevel:"WARN"});Function.prototype.apply.apply(b,[a,arguments||[]])}})(window);
(function(k,l,g){function m(a){c||(c=b[a.type].id,"undefined"===typeof a.clientX?(e=a.pageX,f=a.pageY):(e=a.clientX,f=a.clientY),2!=c||h&&(h!=e||n!=f)?(r(),d.isl&&l.setTimeout(function(){p("at",d.id)},0)):(h=e,n=f,c=0))}function r(){for(var a in b)b.hasOwnProperty(a)&&d.detach(a,m,b[a].parent)}function s(){for(var a in b)b.hasOwnProperty(a)&&d.attach(a,m,b[a].parent)}function t(){var a="";!q&&c&&(q=1,a+="&ui="+c);return a}var d=k.ue,p=k.uex,q=0,c=0,h,n,e,f,b={click:{id:1,parent:g},mousemove:{id:2,
parent:g},scroll:{id:3,parent:l},keydown:{id:4,parent:g}};d&&p&&(s(),d._ui=t)})(ue_csm,window,document);
if (window.ue && window.ue.uels) {
var cel_widgets = [ { "c":"celwidget" },{ "c":"feature" } ];
ue.uels("https://images-na.ssl-images-amazon.com/images/G/01/AUIClients/ClientSideMetricsAUIJavascript-96ea10f95c9c40ac3d7cc81f2d76b78f0fdf178b._V2_.js");
}
(function(k,c){function l(a,b){return a.filter(function(a){return a.initiatorType==b})}function f(a,c){if(b.t[a]){var g=b.t[a]-b._t0,e=c.filter(function(a){return 0!==a.responseEnd&&m(a)<g}),f=l(e,"script"),h=l(e,"link"),k=l(e,"img"),n=e.map(function(a){return a.name.split("/")[2]}).filter(function(a,b,c){return a&&c.lastIndexOf(a)==b}),q=e.filter(function(a){return a.duration<p}),s=g-Math.max.apply(null,e.map(m))<r|0;"af"==a&&(b._afjs=f.length);return a+":"+[e[d],f[d],h[d],k[d],n[d],q[d],s].join("-")}}
function m(a){return a.responseEnd-(b._t0-c.timing.navigationStart)}function n(){var a=c[h]("resource"),d=f("cf",a),g=f("af",a),a=f("ld",a);delete b._rt;b._ld=b.t.ld-b._t0;b._art&&b._art();return[d,g,a].join("_")}var p=20,r=50,d="length",b=k.ue,h="getEntriesByType";b._rre=m;b._rt=c&&c.timing&&c[h]&&n})(ue_csm,window.performance);
(function(m,d){function c(b){b="";var c=a.isBFT?"b":"s",d=""+a.oid,f=""+a.lid,g=d;d!=f&&20==f.length&&(c+="a",g+="-"+f);a.tabid&&(b=a.tabid+"+");b+=c+"-"+g;b!=e&&100>b.length&&(e=b,a.cookie?a.cookie.updateCsmHit(n,b+("|"+ +new Date),h):document.cookie="csm-hit="+b+("|"+ +new Date)+p+"; path=/")}function q(){e=0}function k(b){!0===d[a.pageViz.propHid]?e=0:!1===d[a.pageViz.propHid]&&c({type:"visible"})}var h=new Date(+new Date+6048E5),p="; expires="+h.toGMTString(),n="tb",e,a=m.ue||{},l=a.pageViz&&
a.pageViz.event&&a.pageViz.propHid;a.attach&&(a.attach("click",c),a.attach("keyup",c),l||(a.attach("focus",c),a.attach("blur",q)),l&&(a.attach(a.pageViz.event,k,d),k({})));a.aftb=1})(ue_csm,document);
ue_csm.ue.stub(ue,"impression");
(function(k,d,h){function f(a,c,b){a&&a.indexOf&&0===a.indexOf("http")&&0!==a.indexOf("https")&&l(s,c,a,b)}function g(a,c,b){a&&a.indexOf&&(location.href.split("#")[0]!=a&&null!==a&&"undefined"!==typeof a||l(t,c,a,b))}function l(a,c,b,e){m[b]||(e=u&&e?n(e):"N/A",d.ueLogError&&d.ueLogError({message:a+c+" : "+b,logLevel:v,stack:"N/A"},{attribution:e}),m[b]=1,p++)}function e(a,c){if(a&&c)for(var b=0;b<a.length;b++)try{c(a[b])}catch(d){}}function q(){return d.performance&&d.performance.getEntriesByType?
d.performance.getEntriesByType("resource"):[]}function n(a){if(a.id)return"//*[@id='"+a.id+"']";var c;c=1;var b;for(b=a.previousSibling;b;b=b.previousSibling)b.nodeName==a.nodeName&&(c+=1);b=a.nodeName;1!=c&&(b+="["+c+"]");a.parentNode&&(b=n(a.parentNode)+"/"+b);return b}function w(){var a=h.images;a&&a.length&&e(a,function(a){var b=a.getAttribute("src");f(b,"img",a);g(b,"img",a)})}function x(){var a=h.scripts;a&&a.length&&e(a,function(a){var b=a.getAttribute("src");f(b,"script",a);g(b,"script",a)})}
function y(){var a=h.styleSheets;a&&a.length&&e(a,function(a){if(a=a.ownerNode){var b=a.getAttribute("href");f(b,"style",a);g(b,"style",a)}})}function z(){if(A){var a=q();e(a,function(a){f(a.name,a.initiatorType)})}}function B(){e(q(),function(a){g(a.name,a.initiatorType)})}function r(){var a;a=d.location&&d.location.protocol?d.location.protocol:void 0;"https:"==a&&(z(),w(),x(),y(),B(),p<C&&setTimeout(r,D))}var s="[CSM] Insecure content detected ",t="[CSM] Ajax request to same page detected ",v="WARN",
m={},p=0,D=k.ue_nsip||1E3,C=5,A=1==k.ue_urt,u=!0;ue_csm.ue_disableNonSecure||(d.performance&&d.performance.setResourceTimingBufferSize&&d.performance.setResourceTimingBufferSize(300),r())})(ue_csm,window,document);
(function(d){d.ue_cel_stub||(d.ue_cel_stub=function(){var b={};return{registerModule:function(a,c){b[a]||(b[a]=c,b[a].on())},replayModule:function(a,c){b[a]&&(b[a].replay(c),b[a].off(),delete b[a])}}}())})(ue_csm);
(function(a,d,h){a.ue_mcm_stub||a.ue&&a.ue.isBF||(a.ue_mcm_stub=function(){function e(k){var b=c.d(),e=(d.body||{}).scrollWidth,l=(d.body||{}).scrollHeight,f;a.ue_cdt&&h&&"function"===typeof h.now&&k.timeStamp&&(f=h.now()-k.timeStamp,f=parseFloat(f.toFixed(2)));g.push({rawEvent:k,additionalData:{ots:b,ow:e,oh:l,odt:f}})}var c=a.ue,g=[];return{on:function(){c.attach&&c.attach("click",e,d)},off:function(){c.detach&&c.detach("click",e,d)},replay:function(a){for(var b=0;b<g.length;b++)a(g[b].rawEvent,
g[b].additionalData)}}}(),a.ue_cel_stub&&a.ue_cel_stub.registerModule("mcm",a.ue_mcm_stub))})(ue_csm,document,window.performance);
if(window.ue&&uet) { uet('bb'); }
</script><!-- sp:feature:head-close -->
<script>
window.P && P.register('bb');
if (typeof ues === 'function') {
ues('t0', 'portal-bb', new Date());
ues('ctb', 'portal-bb', 1);
}
</script>
<script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/11Muzrhwo6L._RC|41ecatjAVfL.js,31cePTj3CrL.js,11AncM+ZunL.js,31hW3BxWLXL.js,21rOwfZB9SL.js,3118lZR+khL.js,516Cu4vSzCL.js,51Hi2VfLU+L.js,21yUMfZsKLL.js,31CyVESxcFL.js,016DBHJkIYL.js,21GuNBYH4BL.js,51WIGchpq5L.js,818Z3w8jMsL.js,21hyeuTdJ9L.js,01H0TE47EIL.js,013NxCyC-FL.js,11QIUl6VLbL.js,21jBAndZe0L.js,51YzCqyJFIL.js,0111g0cQvbL.js,01nKqcvaCIL.js,01X117Z9PgL.js,51GV9EHW+bL.js,01X5C8pWB1L.js,518iKhtj8UL.js,11sP283FW3L.js,21333KksJEL.js,31egXBuM55L.js,01RHiyjONOL.js,31I-BifbuzL.js,210S22NrxIL.js,51ryEHyLJ5L.js,314ZAgS3sJL.js,11bXLfk2j0L.js,31AnMfsNpuL.js,01q0JZaOPlL.js,116kAgu6ebL.js,31ze7I-RWjL.js,21q3UdjiveL.js,21HlHGr1+aL.js,0193uyIciNL.js,01DShqNIDKL.js,51NhK1niNZL.js,71FaatbojhL.js,01BZK417f8L.js,319kjuuQkzL.js,21mtabjvdBL.js,41yLu0U-ZDL.js,21e16+5SkdL.js,11NHZnHlFmL.js,21CbPMxfA+L.js,015J4NGaO3L.js,11B4fwZPeqL.js,21-q-ofQTaL.js,01cY00OaNgL.js,01jqyAujTwL.js,01KcbtwkAOL.js,01-XJ1YSEXL.js,113LFYzRWdL.js,01NAT+3p7KL.js,111vgqp2a0L.js,51GfggKdyCL.js,01MZJG6lH8L.js,01VtYReatCL.js,31P9rtuG-7L.js,01mL-cPJ2YL.js,01RQtSMdG+L.js,21iHrbWUPtL.js,013tU+A3QIL.js,41qfJxctTDL.js,01ryq+28pGL.js,01l3c7okxRL.js,21lP+A1Np8L.js,01qwoVEkKlL.js,011HXD1ky3L.js,011X+p22ALL.js,01k57x9vvBL.js,01RNXZDiBuL.js,01ZF+ovNflL.js,31baJE6Ao6L.js,01S8y9NkxoL.js,41IRD+TgfRL.js,11ECelPydPL.js,01tJd4+VUOL.js,51-wBjbbYrL.js,410QCZl6RQL.js,01y-5aCXJyL.js,01rg6Ce9FhL.js_.js?AUIClients/DetailPageMobileWebMetaAsset#mobile.us.130884-T1.121035-T1.128615-T1.133998-T1.133996-T1.132705-T1.93121-T1.89963-T1.126720-T1.114362-T1.71277-T1.111960-T1.112610-T1.118535-T1.107067-T2.103593-C.53691-T1.123375-T1.123873-T1.114779-T1.120067-T1.123880-T1.123881-T1.122564-T1.99301-T1.106820-T1.121807-T1.101955-T1.103391-T1.111760-T1.111763-T1.135995-T1.108310-T1.105170-T2.107686-T1.108343-T1.108344-T1.109378-T1.123718-T1.87019-T1.83029-T1.100976-T1.131720-T1"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/61ea4y7yPdL._RC|11IYhapguOL.js,61-dJ29Zw5L.js,21dmoxZTACL.js,01E8f3KV-NL.js,31fv8bqHLoL.js,31ReKJl2X6L.js,51nK0kUyg2L.js,11Mdh5CVmhL.js,01xMsWWFUQL.js,11KkQiUpBPL.js,113pP0Sfh0L.js,21auxuI+dRL.js,01PoLXBDXWL.js,61x-Yxr2raL.js,318CMPRminL.js,11SW3HEKjtL.js,01qkmZhGmAL.js,01jUS+y5YWL.js_.js?AUIClients/AmazonUI#mobile"></script><script type="text/javascript" async="" crossorigin="anonymous" charset="utf-8" src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/MAsf-1.15._CB488131535_.js?csm_attribution=APE-SafeFrame"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/61BFFVGtFXL.js?AUIClients/Swiper_AUIBuild"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/G/01/AUIClients/CustomerReviewsMedleyAssets-d22f4f962f932cc6922bccca8b5b14475c306dc6._V2_.js#AUIClients/CustomerReviewsMedleyAssets.device_type-mobile.secure.weblab-DP_PROFILE_REVIEWS_GENOME_WIDGET_INTEG_112957-T1.min"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/51-hMaw7m7L._RC|01eV4Oqoy5L.js,31qKd4DgPkL.js_.js?AUIClients/NavMobileMetaAsset"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/517%2B4eJ4RGL.js?AUIClients/RetailSearchAutocompleteAssets#mobile"></script><script type="text/javascript" async="" crossorigin="anonymous" src="https://images-na.ssl-images-amazon.com/images/I/11QXqf0G81L.js?AUIClients/RetailWebsiteOverlayAUIAssets"></script><style></style></head><!-- sp:feature:start-body -->
<body class="a-m-us a-aui_51744-c a-aui_57326-c a-aui_72554-c a-aui_accessibility_49860-c a-aui_attr_validations_1_51371-c a-aui_bolt_62845-c a-aui_ux_59374-c a-aui_ux_60000-c"><div id="a-page"><script type="a-state" data-a-state="{&quot;key&quot;:&quot;a-wlab-states&quot;}">{"AUI_51744":"C","AUI_57326":"C","AUI_72554":"C","AUI_ACCESSIBILITY_49860":"C","AUI_ATTR_VALIDATIONS_1_51371":"C","AUI_BOLT_62845":"C","AUI_UX_59374":"C","AUI_UX_60000":"C"}</script><script>typeof uex === 'function' && uex('ld', 'portal-bb', {wb: 1})</script>
<!-- sp:feature:nav-inline-js -->
<!-- From remote config v3-->
<script type="text/javascript">
(function(d){document.createElement("header");function b(e){return[].slice.call(e)}function c(f,e){return{m:f,a:b(e)}}var a=function(f){var g={};g._sourceName=f;g._replay=[];g.getNow=function(i,h){return h};function e(i,h,j){i[j]=function(){g._replay.push(h.concat(c(j,arguments)))}}g.when=function(){var i=[c("when",arguments)];var h={};e(h,i,"run");e(h,i,"declare");e(h,i,"publish");e(h,i,"build");return h};e(g,[],"declare");e(g,[],"build");e(g,[],"publish");e(g,[],"importEvent");a._shims.push(g);return g};a._shims=[];if(!d.$Nav){d.$Nav=a("rcx-nav")}if(!d.$Nav.make){d.$Nav.make=a}}(window));
$Nav.importEvent('navbarJS-mobile');
$Nav.declare('img.sprite', {
'png32': 'https://images-na.ssl-images-amazon.com/images/G/01/gno/sprites/new-nav-sm-smile-sprite-global-1x_blueheaven._CB487546343_.png',
'png32-2x': 'https://images-na.ssl-images-amazon.com/images/G/01/gno/sprites/new-nav-sm-smile-sprite-global-2x_blueheaven._CB487546343_.png'
});
window._navbarSpriteUrl = 'https://images-na.ssl-images-amazon.com/images/G/01/gno/sprites/new-nav-sm-smile-sprite-global-1x_blueheaven._CB487546343_.png';
$Nav.declare('img.pixel', 'https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/transparent-pixel._CB386942464_.gif');
var nav_t_after_preload_JS = + new Date();
</script>
<img src="https://images-na.ssl-images-amazon.com/images/G/01/gno/sprites/new-nav-sm-smile-sprite-global-1x_blueheaven._CB487546343_.png" style="display:none" alt="">
<!-- -->
<script>
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('navCF').execute(function(){
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/51-hMaw7m7L._RC|01eV4Oqoy5L.js,31qKd4DgPkL.js_.js?AUIClients/NavMobileMetaAsset');
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/517%2B4eJ4RGL.js?AUIClients/RetailSearchAutocompleteAssets#mobile');
});
</script>
<!-- sp:feature:navbar -->
<!-- NAVYAAN-UPNAV -->
<style type="text/css">
#nav-mobile-airstream-stripe {
background-color: #ffffff;
text-align: center;
}
#nav-mobile-airstream-stripe-img {
width: 100%;
max-height: 80px;
}
</style>
<div id="nav-mobile-airstream-stripe">
<a id="nav-mobile-airstream-link" href="/stream/ref=nav_upnav_mobile_C_detailaw" aria-hidden="true" tabindex="-1">
<img id="nav-mobile-airstream-stripe-img" src="https://images-na.ssl-images-amazon.com/images/G/01/airstream/mobile-upnav/C/mobile_upnav_C_latest_2x._CB492140722_.jpg" alt="Beautiful things, updated daily">
</a>
</div>
<script type="text/javascript">
if(typeof(P) !== 'undefined' || typeof(window.AmazonUIPageJS) !== 'undefined') {
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('navCF').execute(function() {
var pixelRatio = window.devicePixelRatio || 1;
if ( pixelRatio > 1 ) {
document.getElementById("nav-mobile-airstream-stripe-img").src = "https://images-na.ssl-images-amazon.com/images/G/01/airstream/mobile-upnav/C/mobile_upnav_C_latest_2x._CB492140722_.jpg";
}
});
}
</script>
<!-- navmet initial definition -->
<script type="text/javascript">
if(window.navmet===undefined) {
window.navmet=[];
if (window.performance && window.performance.timing && window.ue_t0) {
var t = window.performance.timing;
var now = + new Date();
window.navmet.basic = {
'networkLatency': (t.responseStart - t.fetchStart),
'navFirstPaint': (now - t.responseStart),
'NavStart': (now - window.ue_t0)
};
}
}
</script>
<script type="text/javascript">window.navmet.tmp=+new Date();</script>
<style type="text/css">#nav-mobile-airstream-stripe img {max-width: 100%;}</style><script type="text/javascript">window.$Nav && $Nav.when('jQuery', 'searchScoping').run(function($){var hidden=$('#nav-search-form input[type=hidden]'); if(hidden.length===2 && hidden[1].value==='10329849011') {hidden[0].remove();}})</script><script type="text/javascript">var nav_t_after_ANI = + new Date();</script>
<script type="text/javascript">
window.$Nav && window.$Nav.declare("config",
{"searchISS":{"cxNoiseReductionTreatment":1,"cxNoiseReductionV2Treatment":"C","requestId":"7F3MGDYTH1YH8KVBSFWJ","isInIssXCatWeblabTreatment":0,"language":"en_US","pageType":"DetailAW","useSXISS":"","isAutoCompleteLegacyJsEnabled":0,"issRequestParamsTreatment":1,"mktID":"1","host":"completion.amazon.com/search/complete","sessionId":"147-0816675-1753153","customerId":"","aliases":"aps,amazon-custom-products,amazon-devices,amazonbasics,amazonfresh,stripbooks,popular,apparel,electronics,sporting,sports-and-fitness,outdoor-recreation,fan-shop,garden,videogames,toys-and-games,jewelry,digital-text,digital-music,prime-digital-music,watches,grocery,hpc,instant-video,handmade,handmade-jewelry,handmade-home-and-kitchen,prime-instant-video,shop-instant-video,baby-products,office-products,software,magazines,tools,automotive,misc,industrial,mi,pet-supplies,digital-music-track,digital-music-album,mobile,mobile-apps,movies-tv,music-artist,music-album,music-song,stripbooks-spanish,electronics-accessories,pantry,photo,audio-video,computers,furniture,kitchen,audible,audiobooks,beauty,shoes,arts-crafts,appliances,gift-cards,pets,outdoor,lawngarden,collectibles,replacement-parts,financial,fine-art,fashion,fashion-womens,fashion-womens-clothing,fashion-womens-jewelry,fashion-womens-shoes,fashion-womens-watches,fashion-womens-handbags,fashion-mens,fashion-mens-clothing,fashion-mens-jewelry,fashion-mens-shoes,fashion-mens-watches,fashion-girls,fashion-girls-clothing,fashion-girls-jewelry,fashion-girls-shoes,fashion-girls-watches,fashion-boys,fashion-boys-clothing,fashion-boys-jewelry,fashion-boys-shoes,fashion-boys-watches,fashion-baby,fashion-baby-boys,fashion-baby-girls,fashion-luggage,3d-printing,tradein-aps,local-services,vehicles,video-shorts,warehouse-deals,luxury-beauty,banjo-apps,black-friday,cyber-monday,alexa-skills,subscribe-with-amazon,courses,amazon-global-store,prime-wardrobe","ime":0,"autoScrollUpSearchBoxTreatment":0},"pseudoPrimeFirstBrowse":0,"searchIconAction":"footer","searchIconEvent":"nojs","navDeviceType":"mobile","mobileBlueheaven":"true","windowWidths":0}
);
</script>
<script type="text/javascript">var nav_t_after_config_declaration = + new Date();</script>
<script type="text/javascript">
window.uet && uet('ns');
</script>
<!-- navp-Vrsr3cp+2Yv15CGfa0SCeW/1kE5Q5VaVBHMAPdhYQdanhJOFvUEprNPB9FXGL2VHMkhQ789gy6M= rid-7F3MGDYTH1YH8KVBSFWJ (Thu Feb 15 06:32:08 2018) --><script type="text/javascript">window.navmet.push({key:'PreNav',end:+new Date(),begin:window.navmet.tmp});</script>
<!-- navp-Vrsr3cp+2Yv15CGfa0SCeW/1kE5Q5VaVBHMAPdhYQdanhJOFvUEprNPB9FXGL2VHMkhQ789gy6M= rid-7F3MGDYTH1YH8KVBSFWJ (Thu Feb 15 06:32:08 2018) -->
<script type="text/javascript">window.navmet.main=+new Date();</script>
<!-- NAVYAAN -->
<header class="nav-mobile nav-locale-us nav-lang-en nav-ssl nav-unrec nav-blueheaven">
<div id="navbar" role="navigation" class="nav-t-standard nav-sprite-v3">
<div id="nav-logobar">
<div class="nav-left">
<script type="text/javascript">window.navmet.tmp=+new Date();</script>
<div id="nav-logo">
<a href="/ref=navm_hdr_logo" class="nav-logo-link">
<span class="nav-sprite nav-logo-base"></span>
<span class="nav-sprite nav-logo-ext"></span>
<span class="nav-sprite nav-logo-locale"></span>
</a>
</div>
<script type="text/javascript">window.navmet.push({key:'Logo',end:+new Date(),begin:window.navmet.tmp});</script>
</div>
<div class="nav-right">
<a href="#nav-search-keywords" class="nav-a" id="nav-button-search">
<i class="nav-icon nav-icon-a11y nav-sprite">Search</i>
</a>
<a href="/gp/aw/ya/ref=navm_hdr_profile" class="nav-a" id="nav-button-avatar">
<i class="nav-icon nav-icon-a11y nav-sprite">your account</i>
</a>
<a href="/gp/aw/c/ref=navm_hdr_cart" aria-label="Cart" class="nav-a" id="nav-button-cart">
<div class="nav-cart-empty">
<i class="nav-icon nav-sprite"></i>
<span class="nav-cart-count">0</span>
</div>
</a>
</div>
</div>
<script type="text/javascript">var nav_t_after_searchbar = + new Date();</script>
</div>
</header>
<script type="text/javascript">var nav_t_after_navbar = + new Date();</script>
<script type="text/javascript">window.navmet.push({key:'NavBar',end:+new Date(),begin:window.navmet.main});</script>
<script type="text/javascript">window.navmet.tmp=+new Date();</script>
<script type="text/javascript">
(function (i) {
i.onload = function() {window.uet && uet('ne')};
i.src = window._navbarSpriteUrl;
}(new Image()));
var nav_t_end_nav = + new Date();
</script>
<script type="text/javascript">window.navmet.push({key:'PostNav',end:+new Date(),begin:window.navmet.tmp});</script>
<script type="text/javascript">window.navmet.MainEnd = new Date();</script>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;NAV:Constants&quot;}">{"aa_searchBox_in":"in","aa_all_departments":"All Departments"}</script>
<!-- sp:feature:host-atf -->
<div id="dp" class=" book_mobile ">
<div class="a-container" role="main">
<script type="text/javascript">
P.when('atf').execute(function(){
if(typeof uet === 'function'){(function(t){var w = window;w.awTags = w.awTags || {};w.awTags[t] = w.awTags[t] || (ue.tag(t) && 1)})('smart-device');uet('bb', 'udpv3auiwait', {wb: 1});};
P.when('A','jQuery','a-carousel-framework','a-popover-base','a-popover-ajax','a-state').execute(function(){
if(typeof uet === 'function'){(function(t){var w = window;w.awTags = w.awTags || {};w.awTags[t] = w.awTags[t] || (ue.tag(t) && 1)})('smart-device');uet('be', 'udpv3auiwait', {wb: 1});};
if(typeof uex === 'function'){(function(t){var w = window;w.awTags = w.awTags || {};w.awTags[t] = w.awTags[t] || (ue.tag(t) && 1)})('smart-device');uex('ld', 'udpv3auiwait', {wb: 1});};
});
});
if(typeof uet === 'function'){(function(t){var w = window;w.awTags = w.awTags || {};w.awTags[t] = w.awTags[t] || (ue.tag(t) && 1)})('smart-device');uet('bb', 'udpv3atfwait', {wb: 1});};
</script>
<script type="text/javascript">var encodedImgSrc="data:image/webp;base64,UklGRsoJAABXRUJQVlA4IL4JAADwNgCdASqnAMgAP3Gmw1UrpyQhqXc7eXguCelu3WBpKL1l9/dhVX336y+kAW7VpXNADiu/t5fLlsW7SeOjYjiJktTzfoDpE4PKtqEA/7h6dv6MdIj/cW//8PXAADD9z+4f/cP/uH+mSLhRgeIUsLbUeiAtql1eAx4KrN+ggp3/dDI/BFpFzrxsbXAVi7B4Qzb5NNAJ42l3rmkixDAmpkOef52fdgYfaEvnrim0ak7D/an97A3KzZOsV+zq2uUjDB5hq2IbatdDwbxRH9lIl3mhX0E+XrBNuv5PtjDKj0OyIh8grx6+m02XnEIBY6eHtWYy/mxLpy3wiJakQaAtwGVkQr3zwu92gzSET4TC/gfS/EFKP7drB6xnpIBKwuvRgFrV/LdzM6VzwWzYTYU393ULTpiZKmUAk0EN+7JsMvB90lQLnhE6MCS/43iSxmr5qVABtdcZlgPyoUsPM1R0KaSdvdO4Sf+OTVHws5T6d77vBIhyXSKiMjSYbp/6bt/zUZVw8qH4Op5V5xpAAZtN9sk2it4u/8AW/GktIYz0ZUJ+hXmsMHIpP7+EWvDqvhtHvJwi7qideTYU4dmONUfFH9uwAP7wKsq6KHNv+/71lq0R2S9vC3/uZbxKFxKX8pa3T46Ko+J/KQCC/8+gtP4CU3PChuaew55znO3EqsvJCuJ9mxq8GxaFnzxMxjdTPJnPaNEZbCoPeRY8YD5BafLYvM9B4ft38U3n4+d3vITeLMaoXH/s1pXPrB10SeZ/2OIUjQGphJdRhoaQEBWNkLd3bNaJ8buY8Cl0fBSQ4ZCfs7dOU03Lq+Km2G1V1BY8R2DYRLtHPcCa9ZW4KOSWEducIE6wtHuU8NNcV1shO5MolsVayIlX/M3lAuimR7VgSwUeVWtTN25rfeOXYgdSG7ytH3qqMX9IoMlCyz0DWIoaVRNcY50uXXDvil2MKT7qBNswx2HT+IgCWL9sdQ5lh0OrEe8fpwzedZ7WVaBB1wYeRL62jiKZfM6+b6+Ez8abg06akrRMn1JmmvpEVVxl1z1T7f8F5xS9t3BSd0eBoEMZt4V/OIagA4tFd/UKEtljjM2Du7+LYvmMqQrsIRLOrgHibkZ4FDWre5RkJe6GO7Ygpu3MOiMIzCMvhX8suI6BDSvrWIgxZiuurzG8liHR5fwXryyREhn/fR2YuB7ds62vOEwBlQdPaRPMudHHMzygslhm0PYtUlfeaaZm52SW9kSmDMBKHzdeHZLZxLiC47Iji4nl28KgHVEssoPO7Q9wAH1/GyC14iUyEz0k67+PJd3EfQcqMiY/JoAZaORNTrEiNhUI7IKejhw6mnc0f3z/+OOMhp4H1Zmjy6lc9qWQvp0D61FufmuPu28zaX+bP2G1wnUcIKjHt5MVOdSN1G0rA8SnzLKY5F7joeqlYS7lLlvLetHWTaKYm+F/avm8g8wy+xg8e6skE2UlKl/0c1XJVws8UC2qWn/pjO4sIwg/Jhin0N3Mn6KwApizPBEJWXK4XvPybBRW3bMzUeZc8i4xvk6R3w1Uk1WYD4NCwZ9NTek/2GHpcPQB39TKFzaq8vGfJSzSv850kveYiL3vOqMVkAC6E84ahdeJKdoS11Yny19JIF4TXrePo+v2tgnQwzaWGrvoqKtWldE5N9BqGHrT44C4lMh3T6+NSoZzru4DLBFJ4WCcjkLMQ18dpTa0VH+EEB8B00ewnXaiWP8W4txb6EdoSmV7O5okHCVv5zL8wZqH5K7bxRbGft51Xd+bcyXvhT3cQjeeGw4QzbcYI4mJxwBoCloam0gyxrwqQbl4tFAq+XVzY4e6xmvM0dSjn7fI98momKEgT9ORz1zQdSlJnK6QQ6HxSU1rG2CcKk9vdts8IE4rNQQtE4Yue0kwblw7+v+UbnUxlwMr/JtsNw9ujeY+hXycRGcW/OdTVhw/Ge1MzwTBe6UMkQoRr+Ec7z4d6kEfOlIQdlhnVYC8dx7FXmmnA8c92gh1iPg2ZrIl89pX0B5dLu/Cu5QvtVLIF/tuIX4ds7ApG8AnTv3UmCFzxCbVBhqOWLYADZ1fIPmGBuQHBjnSE78IidKuGBtMsFPxGSFFNjQzC+Fs1wJNeuhsS3A/dXzK94+R2MkeKSWHpn2supNXtZZ05tYYYHPAzTYFf3Q9ILogvAIV2C++fcmmoN8sT/U3DqavAbAZP/7eV9bXzS2jNLn0RWyJPygS35dFOcE6PBCs4LDWpqgwuD6uYCZLsUuauZY80BT3UMfy8o9QBw/9Ef6U9pXNKx4lfz2JQtri6MMkslY17eb9JfCJR2H7mElRazkRwED/i8g2YSXxh24ylRTmV34MbFe5XWrlpVPOHt0MWbaSkHX3Rr30ljdbFxEG8YFA5y1GJ/Y6ytzQX6Y/SDNFBnuf+epX3P0H5i87+hxrkAzJ+T2k4Ze6v0ErIw0de3Yle7d5dM+7bOADG5/viD5w4JrPagqoCd1387SixCPEbUbcVR9F/JVJyCAnyqNQgwdIyCPibdW5Mj7pgHRHIIZe5d5TrqstIj+elnUsp9Rz7kGFpMG9SUfDLxvWMvbfNO8E0RjKTnVubaQvbkcfldMWRGnwF7GASSMMk3pkMAuWK0gZ6WbikPz251ATBKpkG61R5Pkx4aLRix2aS1820LXPvZInccYCeg48shJK2gCvgqUMgYS18qpzECfzs2o6UV+xqKceRgkaR4lGkvlFwVS2BofjpGR6h3F9+l3BzjmUpvQSLBD9zY09vKfkmI4tIDhJPYcopK/sgXIjAlbRDfRzI6gs8OpxQZSM2i9dny8Ntf1iR6K4BxHfHi5u3I1QpVvd1nK/5ayFlVj+Ezo+C7HJsuEESD0HlzNWlBiB7eW9Y2SM0OUVZ69mki4Rrb3rNySvJ2MjegyHS3nsYKf0W94Qez+LeNTyv/VT1u7DBL5/vqG+X747g7XnOnvtA857n0rjTKr05HG883ArNUnGvK23dLfSeod/hYeD1g7fkZd6PJuV3Moy0HzyG2xWKS+U3AUNeG8ZcyUBcUKUvSfX3aGoBLWBYE8yMa38yoITV+eYHujsq1LRfpoOCmOkM/VJt2dMxmFSaZAbLQToZ5Vxnd8NdO0DDq7UKWQMOK1NcEHC7awlF3fiVL8FlF5suc5SYuudCt0es8vqCZtkoUkHM6/Zt5xe/GxvRcGvDVUKl4eyf0Rdb69KXkymXhnht1z7ZxMumIvkavkIl5EpDjpMDbgMOucvUbsO7owjqxWF/FUTMdOS4+wXEonZb05LrEYhMlwM95DBkpMgXbH9daeVWuBW175vkgikrru+IduuI5JExviQ9utx6thZ6AAA";</script><!-- MarkCF -->
<script type="text/javascript">
if(typeof uet === 'function'){uet('be', 'udpv3atfwait', {wb: 1});};
if(typeof uex === 'function'){uex('ld', 'udpv3atfwait', {wb: 1});};
</script>
<div id="ppd" class="a-row">
<div id="p2d_feature_div" data-feature-name="p2d" data-template-name="p2d" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="detailILM_feature_div" data-feature-name="detailILM" data-template-name="detailILM" class="a-section a-spacing-none feature t-prnt t-full">
<div class="a-row">
<div class="a-column a-span12">
<div style="margin: -1.2rem -1.4rem 0px; background-color: #FFFFFF;">
<div style="margin-left: auto; margin-right: auto; width: 320px;">
<a href="/gp/student/signup/info/ref=st_ILM_trialconmob/"><img alt="" src="https://images-na.ssl-images-amazon.com/images/G/01/img17/student/other/1061023_student_offtocollegestripe__ilm_640x90._CB503961461_.jpg" height="45" width="320" data-a-hires="https://images-na.ssl-images-amazon.com/images/G/01/img17/student/other/1061023_student_offtocollegestripe__ilm_640x90._CB503961461_.jpg"></a>
</div>
<hr>
</div>
</div>
</div>
</div>
<div id="pegasus_feature_div" data-feature-name="pegasus" data-template-name="pegasus" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="mobile_orderInformationGroup_feature_div" data-feature-name="mobile_orderInformationGroup" data-template-name="mobile_orderInformationGroup" class="a-section a-spacing-none feature">
</div>
<div id="dealOffer_feature_div" data-feature-name="dealOffer" data-template-name="dealOffer" class="a-section a-spacing-none feature t-prnt t-full">
<style>
.gb_box_info {border-color:#bbd3de;}
.gb_box_error {border-color:#c40000;}
.gb_box_warn {border-color:#8b6e00;}
.gb_box_success {border-color:#89cd89;}
</style>
</div>
<div id="andonCord_feature_div" data-feature-name="andonCord" data-template-name="andonCord" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="companyCompliancePolicies_feature_div" data-feature-name="companyCompliancePolicies" data-template-name="companyCompliancePolicies" class="a-section a-spacing-none feature t-prnt t-full">
<style>
.ccp-touch-link{
border-style: none;
}
.ccp-touch-link .a-icon-touch-link{
z-index: 1;
}
.a-touch-link.ccp-touch-link > .a-box-inner{
padding: 0 0 0 0;
}
.ccp-custom-messages-group-name{
padding: 20px 0 0;
}
</style>
</div>
<div id="productTitleGroupAnchor">
<div id="machineTranslation_feature_div" data-feature-name="machineTranslation" data-template-name="machineTranslation" class="a-section a-spacing-mini feature">
<style type="text/css">
#machine-translation-widget .a-size-base{
font-size: 1.4rem!important;
}
#machine-translation-widget .mt-link {
margin-left: 4px;
margin-right: 3px;
}
</style>
</div>
<div class="a-row a-spacing-none">
<div class="a-column a-span12 a-text-ellipsis">
<div id="brandByline_feature_div" class="">
</div>
<div id="byline_feature_div" class="t-prnt t-full">
<div id="byline" class="a-row a-spacing-none a-size-base feature a-text-ellipsis">
<a id="bylineContributor" class="a-size-base a-link-normal" href="/kindle-dbs/author/ref=mw_dp_a_ap?_encoding=UTF8&amp;author=Bruce%20Tate&amp;searchAlias=books&amp;asin=B001ITYIUU">Bruce Tate</a>
</div>
</div>
</div>
</div>
<div id="title_feature_div" class="a-section a-spacing-small t-prnt t-full">
<style>
.atfRedesignV2 .collapsed #expandTitleToggle {
background-image: url("https://images-na.ssl-images-amazon.com/images/G/01/burj/dp_plus-sprite-2x._CB315922441_.png");
top:1.4rem;
right: 0rem;
}
.atfRedesignV2 .expanded #expandTitleToggle{
background-image: url("https://images-na.ssl-images-amazon.com/images/G/01/burj/dp_min-sprite-2x._CB315922440_.png");
bottom: 1rem;
right: 1.6rem;
}
</style>
<div data-feature-name="title" data-template-name="title" class="a-section a-spacing-small">
<div class="a-row">
<div class="a-column a-span12">
<h1 id="title" class="a-size-medium">Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)
<span class="a-size-medium a-color-secondary a-text-normal"></span>
</h1>
</div>
</div>
</div>
</div>
<div class="a-section a-spacing-none">
<span id="bookEdition" class="a-size-base a-color-base a-text-bold">1st Edition</span>
</div>
<div class="a-section a-spacing-base">
<div class="a-row">
<span class="a-size-small a-color-secondary a-text-bold">ISBN-13:</span>
<span class="a-size-small a-color-secondary"> 978-1934356593,</span>
<span class="a-size-small a-color-secondary a-text-bold">ISBN-10:</span>
<span class="a-size-small a-color-secondary"> 193435659X</span>
</div>
</div>
<div class="a-row">
<div id="averageCustomerReviews_feature_div" data-feature-name="averageCustomerReviews" data-template-name="averageCustomerReviews" class="a-column a-span12 a-text-left feature t-prnt t-full">
<a id="acrCustomerReviewLink" class="a-link-normal" href="/gp/aw/cr/193435659X/ref=mw_dp_cr">
<i class="a-icon a-icon-star-medium a-star-medium-4"><span class="a-icon-alt">4.2 out of 5 stars</span></i>
<span class="a-size-base">(58)</span>
<span id="textReviews" style="position: absolute; left: -10000px; top: auto; width: 2px; height: 1px; overflow: hidden;">Reviews</span>
</a>
</div>
</div>
<div id="adoptedData_feature_div" data-feature-name="adoptedData" data-template-name="adoptedData" class="a-section a-spacing-none feature t-prnt t-full">
<style>
#adoptedDataContainer .campusLogo {
height: 20px;
width: 20px;
margin-right: 0.5em;
}
#adoptedDataContainer .campusName {
line-height: 20px;
}
#adoptedDataContainer .nonDecorated {
text-decoration:none;
color:black;
}
#adoptedDataContainer > div {
padding-left:0.4em !important;
}
#adoptedDataContainer .secondaryViewTrigger {
width:100%;
padding-right:1em;
padding-left:3px;
}
#adoptedDataContainer .chevron {
position:absolute;
right:0.5em;
top:50%;
margin-top:-.5em;
}
</style>
</div>
<div id="imageBlock_feature_div" data-feature-name="imageBlock" data-template-name="imageBlock" class="a-section a-spacing-none feature t-part t-full">
<div id="image-block-row" class="a-row a-spacing-medium">
<div class="a-column a-span12 a-text-center">
<style type="text/css">
</style>
<style>
.image-size-wrapper {
height:200px;
line-height:200px;
}
#image-block .a-immersive-image-wrapper{
height:200px;
}
<!--imageBlock.viewAdapter.maxHeightpx -->
</style>
<div id="image-block" data-a-carousel-options="{&quot;carouselClass&quot;:&quot;mobile&quot;,&quot;minimum_gutter_width&quot;:0,&quot;show_partial_next&quot;:false,&quot;name&quot;:&quot;image-block-carousel&quot;,&quot;circular&quot;:true}" aria-hidden="true" data-a-display-strategy="single" data-a-ajax-strategy="none" data-a-class="mobile" class="a-begin a-carousel-container a-carousel-display-single a-carousel-transition-slide a-carousel-initialized"><input autocomplete="on" type="hidden" class="a-carousel-firstvisibleitem">
<div class="a-carousel-viewport a-gesture a-gesture-horizontal" id="anonCarousel1" style="height: 200px;"><ol class="a-carousel" role="list" style="width: 828px;"><li class="a-carousel-card" role="listitem" aria-setsize="2" aria-posinset="1" aria-hidden="false" style="visibility: visible; width: 414px; margin: 0px;">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;hideHeader&quot;:true,&quot;name&quot;:&quot;immersive-view&quot;,&quot;scrollable&quot;:true}" data-a-immersive-view="true">
<a class="a-link-normal" href="#">
<div class="a-image-wrapper hide-image" data-declarativeactionname="immersive-view" data-imageblockcounter="imageBlockShownC" data-immersiveviewcounter="immersiveViewOpenedC" data-fling-container="true">
<div class="image-wrapper">
<div class="image-size-wrapper fp-image-wrapper " id="landing-image-wrapper" data-image-height="184" data-image-width="154" data-max-height="200" data-min-height="0" data-num-of-images="2" data-animate-image="0" data-image-sizes="[[333, 400], [324, 400]]" data-mainimage-large-pid="51opYcR6kVL" data-mainimage-hires-pid="">
<img alt="" src="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SY400_.jpg" data-fling-asin="193435659X" data-fling-refmarker="detail_main_image_block" data-midres-replacement="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SY200_.jpg" onload=";" class="imageLeft0 altImage" id="main-image" data-a-image-name="mainImage" height="px" width="px" data-a-hires="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SY400_.jpg"><script type="text/javascript">if(typeof encodedImgSrc != 'undefined' && encodedImgSrc != "" && document.getElementById("main-image")!=null){document.getElementById("main-image").src=encodedImgSrc;if(typeof uet === 'function') {uet('x2');}};</script>
</div>
</div>
</div>
</a>
</span>
</li><li class="a-carousel-card" role="listitem" aria-setsize="2" aria-posinset="2" aria-hidden="false" style="visibility: visible; width: 414px; margin: 0px;">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;hideHeader&quot;:true,&quot;name&quot;:&quot;immersive-view&quot;,&quot;scrollable&quot;:true}" data-a-immersive-view="true">
<a class="a-link-normal" href="#">
<div class="a-image-wrapper " data-declarativeactionname="immersive-view" data-imageblockcounter="imageBlockShownC" data-immersiveviewcounter="immersiveViewOpenedC" data-fling-container="true">
<div class="image-wrapper">
<div class="image-size-wrapper fp-image-wrapper " data-image-width="154" data-image-height="189">
<img src="https://images-na.ssl-images-amazon.com/images/I/51doNUaU7zL._SY400_.jpg" class="a-image-wrapper a-manually-loaded carousel-img-manual-load altImage" id="" alt="" data-a-image-name="altImage" data-fling-asin="193435659X" data-fling-refmarker="detail_main_image_block" data-a-image-source="https://images-na.ssl-images-amazon.com/images/I/51doNUaU7zL._SY200_.jpg" data-a-hires="https://images-na.ssl-images-amazon.com/images/I/51doNUaU7zL._SY400_.jpg">
</div>
</div>
</div>
</a>
</span>
</li></ol></div>
<span class="a-end aok-hidden"></span></div>
</div>
</div>
<div id="image-block-pagination" class="a-row small">
<div class="a-column a-span12 a-spacing-small">
<span id="loadingImages" class="a-size-small a-color-secondary" style="display: none;">
Loading Images...
</span>
<div id="image-block-pagination-dots" class="a-pagination a-text-center increaseSize" style="display: block;"><ul class="a-pagination a-dots">
<li class="a-selected"></li>
<li></li>
</ul></div>
</div>
</div>
<img alt="" src="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SY400_.jpg" aria-hidden="true" class="a-hidden">
<div class="a-popover-preload" id="a-popover-immersive-view">
<div class="a-row main_carousel">
<div class="a-column a-span12 a-text-center a-spacing-small">
<div id="immersive-back-share-icon" class="a-row a-spacing-none">
<div class="a-column a-span6">
<span class="a-declarative" data-action="a-popover-close" data-a-popover-close="{}">
<span id="immersive-image-back" class="a-button"><span class="a-button-inner"><input class="a-button-input" type="submit" aria-labelledby="immersive-image-back-announce"><span id="immersive-image-back-announce" class="a-button-text" aria-hidden="true">
<span id="immersive-image-back-text" class="a-text-bold">
Back
</span>
</span></span></span>
</span>
</div>
</div>
<div id="immersive-main" data-a-carousel-options="{&quot;carouselClass&quot;:&quot;mobile&quot;,&quot;minimum_gutter_width&quot;:0,&quot;show_partial_next&quot;:false,&quot;name&quot;:&quot;image-block-immersive-main-carousel&quot;}" data-a-display-strategy="single" data-a-ajax-strategy="none" data-a-class="mobile" class="a-begin a-carousel-container a-carousel-display-single a-carousel-transition-slide" style="height: 686px;"><input autocomplete="on" type="hidden" class="a-carousel-firstvisibleitem">
<div class="a-carousel-viewport"><ol class="a-carousel" role="list">
<li class="a-carousel-card" role="listitem" aria-setsize="2" aria-posinset="1">
<div class="image-wrapper">
<div data-action="a-immersive-image" class="a-declarative a-immersive-image a-image-wrapper"><div class="a-immersive-image-wrapper">
<div data-a-image-name="immersiveViewMainImage" alt="" class="a-image-wrapper a-lazy-loaded a-manually-loaded immersive-carousel-img-manual-load" data-a-image-source="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SY400_.jpg" data-a-hires="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SL1500_.jpg" style=""><noscript>&lt;img alt="" src="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SY400_.jpg"&gt;</noscript></div>
</div></div>
</div>
</li>
<li class="a-carousel-card" role="listitem" aria-setsize="2" aria-posinset="2">
<div class="image-wrapper">
<div data-action="a-immersive-image" class="a-declarative a-immersive-image a-image-wrapper"><div class="a-immersive-image-wrapper">
<div data-a-image-name="immersiveViewMainImage" alt="" class="a-image-wrapper a-lazy-loaded a-manually-loaded immersive-carousel-img-manual-load" data-a-image-source="https://images-na.ssl-images-amazon.com/images/I/51doNUaU7zL._SY400_.jpg" data-a-hires="https://images-na.ssl-images-amazon.com/images/I/8129aV9t7vL._SL1500_.jpg" style=""><noscript>&lt;img alt="" src="https://images-na.ssl-images-amazon.com/images/I/51doNUaU7zL._SY400_.jpg"&gt;</noscript></div>
</div></div>
</div>
</li>
</ol></div>
<span class="a-end aok-hidden"></span></div>
</div>
</div>
<div class="a-row mini_carousel">
<div class="a-column a-span12 a-text-center a-spacing-small">
<div id="immersive-mini" data-a-carousel-options="{&quot;carouselClass&quot;:&quot;mobile&quot;,&quot;minimum_gutter_width&quot;:0,&quot;show_partial_next&quot;:false,&quot;name&quot;:&quot;image-block-immersive-mini-carousel&quot;}" data-a-class="mobile" class="a-begin a-carousel-container a-carousel-display-stretchyGoodness a-carousel-transition-slide" style="height:46px;"><input autocomplete="on" type="hidden" class="a-carousel-firstvisibleitem">
<div class="a-carousel-viewport"><ol class="a-carousel" role="list">
<li class="a-carousel-card" role="listitem" aria-setsize="2" aria-posinset="1">
<div class="image-wrapper">
<div class="a-image-wrapper">
<div alt="" class="a-image-wrapper a-lazy-loaded a-manually-loaded immersive-carousel-img-manual-load" data-a-image-source="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SS63_.jpg" data-a-hires="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SS126_.jpg" style=""><noscript>&lt;img alt="" src="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SS63_.jpg"&gt;</noscript></div>
</div>
</div>
</li>
<li class="a-carousel-card" role="listitem" aria-setsize="2" aria-posinset="2">
<div class="image-wrapper">
<div class="a-image-wrapper">
<div alt="" class="a-image-wrapper a-lazy-loaded a-manually-loaded immersive-carousel-img-manual-load" data-a-image-source="https://images-na.ssl-images-amazon.com/images/I/51doNUaU7zL._SS63_.jpg" data-a-hires="https://images-na.ssl-images-amazon.com/images/I/51doNUaU7zL._SS126_.jpg" style=""><noscript>&lt;img alt="" src="https://images-na.ssl-images-amazon.com/images/I/51doNUaU7zL._SS63_.jpg"&gt;</noscript></div>
</div>
</div>
</li>
</ol></div>
<span class="a-end aok-hidden"></span></div>
</div>
</div>
<div id="zoom-changeover" class="a-changeover"><div class="a-changeover-inner"><i class="a-icon a-icon-checkmark-inverse"></i><strong class="a-size-medium">Double-tap to zoom</strong></div></div>
<script type="text/javascript">
P.when('A','atf').execute(function(A){
A.trigger('image-block-immersive-view-refresh');
});
</script>
</div>
</div>
<div id="MediaMatrix_feature_div" data-feature-name="MediaMatrix" data-template-name="MediaMatrix" class="a-section a-spacing-none feature">
<!-- MediaMatrix Mobile should be suppressed when mediaMatrixItems collection is empty or has just a single item -->
<div id="mediaMatrixContainer" cel_widget_id="mediaMatrixMobFeature" class="celwidget">
<div class="a-row a-spacing-medium">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;alternateBackground&quot;:&quot;true&quot;,&quot;name&quot;:&quot;mediaMatrix_secondary_view_div&quot;}">
<span id="mediaMatrixButton" class="a-button a-button-supplemental a-button-span12 a-button-toggle"><span class="a-button-inner"><i class="a-icon a-icon-supplemental"></i><input class="a-button-input" type="submit" aria-labelledby="mediaMatrixButton-announce"><span id="mediaMatrixButton-announce" class="a-button-text" aria-hidden="true">
Format
<strong class="dimension-label a-padding-mini">
Paperback
</strong>
</span></span></span>
<script type="text/javascript">
P.when('jQuery').execute(function($) {
$('a.mediaMatrixListItem').click(function() {
//Update selected state
$('a.mediaMatrixListItem').removeClass('a-active');
$(this).addClass('a-active');
var ue = window.ue;
if(ue && ue.count){
var mobileMediaMatrixSecViewRowClickedCounter = "mobileMediaMatrixSecViewRowClicked";
ue.count(mobileMediaMatrixSecViewRowClickedCounter, 1);
}
});
});
P.when('A').execute(function(A){
A.on("a:popover:afterShow:mediaMatrix_secondary_view_div", function(data){
var ue = window.ue;
if(ue && ue.count){
var mobileMediaMatrixSecViewOpenedCounter = "mobileMediaMatrixSecViewOpened";
ue.count(mobileMediaMatrixSecViewOpenedCounter, (ue.count(mobileMediaMatrixSecViewOpenedCounter) || 0) + 1);
}
});
});
</script>
</span>
</div>
<div class="a-popover-preload" id="a-popover-mediaMatrix_secondary_view_div">
<h2 class="a-spacing-base">
Select Format
</h2>
<div class="a-box a-vertical"><div class="a-box-inner a-padding-none"><ul class="a-unordered-list a-nostyle a-box-list a-last">
<!-- Override bucket winner in secondary-view with landingItem if they have same metabinding -->
<li class="a-align-center"><span class="a-list-item">
<a href="/gp/aw/d/B00AYQNR46/ref=tmm_kin_title_0?ie=UTF8&amp;qid=&amp;sr=" class="a-touch-link a-box a-touch-link-noborder a-touch-select mediaMatrixListItem"><div class="a-box-inner"><i class="a-icon a-icon-touch-select"></i>
<span class="a-text-bold">Kindle</span>
<span class="a-color-tertiary"></span>
<span class="a-color-price">$24.98</span>
<!-- NFCX Message-->
</div></a>
</span></li>
<!-- Override bucket winner in secondary-view with landingItem if they have same metabinding -->
<li class="a-align-center"><span class="a-list-item">
<a href="/gp/aw/d/193435659X/ref=tmm_pap_title_sr?ie=UTF8&amp;qid=&amp;sr=" class="a-touch-link a-box a-touch-link-noborder a-touch-select a-active mediaMatrixListItem"><div class="a-box-inner"><i class="a-icon a-icon-touch-select"></i>
<span class="a-text-bold">Paperback</span>
<span class="a-color-tertiary"></span>
<span class="a-color-price">$21.11</span>
<!-- NFCX Message-->
</div></a>
</span></li>
</ul></div></div>
</div>
<!-- Show the NFCX message on Mobile ebooks dp -->
</div>
</div>
<div id="newPitchPriceWrapper_feature_div" data-feature-name="newPitchPriceWrapper" data-template-name="newPitchPriceWrapper" class="a-section a-spacing-none feature t-prnt t-full">
<div class="a-section a-spacing-none">
<span class="a-size-small price-info-superscript">
$
</span>
<span class="price-large">
21
</span>
<span class="a-size-small price-info-superscript">
11
</span>
<div class="a-section a-spacing-none inlineBlock">
</div>
<div class="a-section a-spacing-none inlineBlock">
<span class="a-size-small">
<span aria-hidden="true" class="a-color-tertiary inlineBlock a-nowrap a-text-strike">$34.95</span>
<span id="listPriceLegalMessage">
</span>
<style>
#listPriceLegalMessageText {
margin-left: 4px !important;
}
#listPriceLegalMessage .a-popover-trigger:hover {
text-decoration: none !important;
}
#listPriceLegalMessage .a-icon-popover {
display: none !important;
margin-left: 0px !important;
margin-top: 6px !important;
}
</style>
</span>
</div>
<div class="a-section a-spacing-none inlineBlock">
<span class="a-size-small a-color-tertiary">
<span class="inlineBlock a-text-italic a-nowrap">Save $13.84 (40%)</span>
</span>
</div>
</div>
</div>
<div id="newOfferShippingMessage_feature_div" data-feature-name="newOfferShippingMessage" data-template-name="newOfferShippingMessage" class="a-section a-spacing-none feature t-prnt t-full">
<div class="a-section a-spacing-none a-spacing-top-micro">
<span id="ourPrice_availability" class="freePrimeShippingString">
</span>
</div>
<div class="a-section a-spacing-none">
<span class="freePrimeShippingString">
<span></span>
</span>
</div>
</div>
<div id="points_feature_div" data-feature-name="points" data-template-name="points" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="vatMessageLabel_feature_div" data-feature-name="vatMessageLabel" data-template-name="vatMessageLabel" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="preorderPriceGuarantee_feature_div" data-feature-name="preorderPriceGuarantee" data-template-name="preorderPriceGuarantee" class="a-section a-spacing-none feature t-prnt t-full">
<div class="a-section a-spacing-base">
</div>
</div>
<div id="dealOnChildItems_feature_div" data-feature-name="dealOnChildItems" data-template-name="dealOnChildItems" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="apubPrimeFirstBranding_feature_div" data-feature-name="apubPrimeFirstBranding" data-template-name="apubPrimeFirstBranding" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="apubPrimeFirstDiscount_feature_div" data-feature-name="apubPrimeFirstDiscount" data-template-name="apubPrimeFirstDiscount" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="p2d_feature_div" data-feature-name="p2d" data-template-name="p2d" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="pmpux_feature_div" data-feature-name="pmpux" data-template-name="pmpux" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="applicablePromotionList_feature_div" data-feature-name="applicablePromotionList" data-template-name="applicablePromotionList" class="a-section a-spacing-none feature t-prnt t-full">
<div id="applicable_promotion_list_sec" class="a-section">
<div id="apl_m_show_feature"></div>
<div class="a-section a-spacing-small">
<span class="a-color-success">Save an extra $1.29 at checkout.</span>
</div>
</div>
</div>
<div id="alternativeOfferEligibilityMessaging_feature_div" data-feature-name="alternativeOfferEligibilityMessaging" data-template-name="alternativeOfferEligibilityMessaging" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="newerVersion_feature_div" data-feature-name="newerVersion" data-template-name="newerVersion" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="quantity_feature_div" data-feature-name="quantity" data-template-name="quantity" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="availability_feature_div" data-feature-name="availability" data-template-name="availability" class="a-section a-spacing-none feature t-prnt t-full">
<div class="a-section a-spacing-none">
<div id="availability" class="a-section a-spacing-none">
<span class="a-size-medium a-color-success">
In Stock.
</span>
<div class="a-section a-spacing-none">
</div>
</div>
</div>
</div>
<div id="globalStoreBadgePopover_feature_div" data-feature-name="globalStoreBadgePopover" data-template-name="globalStoreBadgePopover" class="a-section a-spacing-none feature t-prnt t-full">
<div class="a-section a-spacing-none">
</div>
</div>
<div id="holidayDeliveryMessage_feature_div" data-feature-name="holidayDeliveryMessage" data-template-name="holidayDeliveryMessage" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="dpFastTrack_feature_div" data-feature-name="dpFastTrack" data-template-name="dpFastTrack" class="a-section a-spacing-none feature">
<div id="fast-track" class="a-section a-spacing-small a-spacing-top-small">
<div id="fast-track-message" class="a-section a-spacing-none">
<span class="a-text-bold">
</span>
This item ships to <b>Germany</b>. <b>Want it Monday, Feb. 19?</b> Order within <b><span id="ftCountdown" class="a-color-success a-color-available ftCountdownClass">4 hrs 42 mins</span></b> and choose <b>AmazonGlobal Priority Shipping</b> at checkout.
</div>
<input type="hidden" id="ftSelectAsin" value="193435659X">
<input type="hidden" id="ftSelectMerchant" value="ATVPDKIKX0DER">
</div>
</div>
<div id="shipsFromSoldBy_feature_div" data-feature-name="shipsFromSoldBy" data-template-name="shipsFromSoldBy" class="a-section a-spacing-none feature t-prnt t-full">
<div id="merchant-info" class="a-section a-spacing-small">
Ships from and sold by Amazon.com.
Gift-wrap available.
</div>
</div>
<div id="businessPricing_feature_div" data-feature-name="businessPricing" data-template-name="businessPricing" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="smileEligibility_feature_div" data-feature-name="smileEligibility" data-template-name="smileEligibility" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="holidayAvailabilityMessage_feature_div" data-feature-name="holidayAvailabilityMessage" data-template-name="holidayAvailabilityMessage" class="a-section a-spacing-none feature">
</div>
<div id="campusInfo_feature_div" data-feature-name="campusInfo" data-template-name="campusInfo" class="a-section a-spacing-none feature">
<style>
#campusInfoContainer .campusLogo {
height: 20px;
width: 20px;
margin-right: 0.5em;
}
#campusInfoContainer .campusName {
line-height: 20px;
}
#campusInfoContainer .nonDecorated {
text-decoration:none;
color:black;
}
#campusInfoContainer > div {
padding-left:0.4em !important;
}
#campusInfoContainer .secondaryViewTrigger {
width:100%;
padding-right:1em;
padding-left:3px;
}
#campusInfoContainer .chevron {
position:absolute;
right:0.5em;
top:50%;
margin-top:-.5em;
}
</style>
</div>
<div id="mobile_buybox_feature_div" data-feature-name="mobile_buybox" data-template-name="mobile_buybox" class="a-section a-spacing-none feature">
<div id="buybox" class="a-section a-spacing-small a-spacing-top-medium nocopypaste button-stack-unifiedLocation-top">
<div class="a-button-stack">
<div id="mobile_accordion_feature_div" data-feature-name="mobile_accordion" data-template-name="mobile_accordion" class="a-section a-spacing-none feature">
<div id="accordionRows_feature_div" data-feature-name="accordionRows" data-template-name="accordionRows" class="a-section a-spacing-none feature">
<div id="buyBoxAccordion" data-a-accordion-name="buybox-accordion" class="a-box-group a-accordion a-spacing-large" role="radiogroup">
<div id="usedAccordionRow" class="a-box accordion-row" data-a-accordion-row-name="usedAccordionRow"><div class="a-box-inner a-accordion-row-container">
<div class="a-accordion-row-a11y" role="radio" aria-checked="false" aria-expanded="false"><a aria="" data-action="a-accordion" class="a-accordion-row a-declarative accordion-header" href="#" aria-label=""><i class="a-icon a-accordion-radio a-icon-radio-inactive"></i><h5>
<div class="a-row header-text">Buy Used - Very Good</div>
<div class="a-row">
<span id="usedPrice" class="a-size-base a-color-secondary header-price a-text-normal">$17.99</span>
</div>
</h5></a></div>
<div class="a-accordion-inner accordion-row-content">
<div class="a-row a-spacing-base a-size-base a-color-secondary">
FREE Shipping on orders over $25
</div>
<div class="a-row a-spacing-base a-size-base">
<div aria-live="polite" data-a-expander-name="ubb_expander" data-a-expander-collapsed-height="59" class="a-expander-collapsed-height a-row a-expander-container a-expander-partial-collapse-container" style="max-height:59px; _height:59px">
<div aria-expanded="false" class="a-expander-content a-expander-partial-collapse-content" style="">
<span>Pages free from writing. Cover in good shape.</span>
</div>
<div class="a-expander-header a-expander-partial-collapse-header" style="opacity: 0; display: none;"><a href="javascript:void(0)" data-action="a-expander-toggle" class="a-declarative" data-a-expander-toggle="{&quot;allowLinkDefault&quot;:true, &quot;expand_prompt&quot;:&quot;See more&quot;, &quot;collapse_prompt&quot;:&quot;See less&quot;}"><i class="a-icon a-icon-extender-expand"></i><span class="a-expander-prompt">See more</span></a></div>
</div>
</div>
<div class="a-row a-spacing-base">
<span class="a-size-base">
Sold by <a href="/gp/aw/sp.html?ie=UTF8&amp;seller=A2AR4F5FDJUCZR&amp;isAmazonFulfilled=1">Mayon Collectibles</a> and fulfilled by Amazon.
</span>
</div>
<div id="accessCodeWarning" class="a-row a-spacing-top-micro">
<span class="a-size-mini a-color-tertiary">
Access codes and supplements are not guaranteed with used items.
</span>
</div>
<div id="unifiedLocation_feature_div" data-feature-name="unifiedLocation" data-template-name="unifiedLocation" class="a-section feature button-stack-unifiedLocation-bottom">
<script type="text/javascript">
P.now("LOCUX_DETALPAGE_51079_T1").execute(function(LOCUX_DETALPAGE_51079_T1) {
if (!LOCUX_DETALPAGE_51079_T1) {
P.declare("LOCUX_DETALPAGE_51079_T1", {});
}
});
</script>
<div class="a-section a-spacing-none a-spacing-top-mini">
<div id="locationUX" class="a-section button-stack-lux">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;name&quot;:&quot;LUXAddressSelector&quot;,&quot;activate&quot;:&quot;onclick&quot;}">
<img alt="" src="https://images-na.ssl-images-amazon.com/images/G/01/detail-page/icons/button_stack_Icon_location_pin_2x._CB271282142_.png" height="16px" data-a-hires="https://images-na.ssl-images-amazon.com/images/G/01/detail-page/icons/button_stack_Icon_location_pin_2x._CB271282142_.png">
<span class="button-stack-lux">
Ship to:
</span>
<a class="a-link-normal lux-location-label button-stack-lux" href="#">
Germany
</a>
</span>
</div>
<div class="a-popover-preload" id="a-popover-LUXAddressSelector">
<div id="unifiedLocationTitleNoAddress" class="a-section a-spacing-none a-text-left">
<span class="a-size-medium a-text-bold">
To see addresses, please
</span>
</div>
<div class="a-section a-spacing-mini a-spacing-top-medium">
<span id="unifiedLocationSignIn" class="a-button a-button-span12 a-button-primary"><span class="a-button-inner"><input class="a-button-input" type="submit" aria-labelledby="unifiedLocationSignIn-announce"><span id="unifiedLocationSignIn-announce" class="a-button-text" aria-hidden="true">
Sign in
</span></span></span>
</div>
<div class="a-divider a-divider-break a-spacing-top-medium"><h5>or</h5></div>
<div id="unifiedLocationAddrInputDiv" class="a-section">
<span class="a-text-bold">
Use this location:
</span>
<div class="a-row a-spacing-top-micro" role="form">
<div class="a-column a-span7" role="form">
<div class="a-input-text-wrapper a-span12"><input type="text" maxlength="5" id="unifiedLocationAddrInput" placeholder="Enter US zip"></div>
</div>
<div class="a-column a-span5 a-span-last" role="button">
<span id="unifiedLocationAddrUpdate" class="a-button a-button-span12"><span class="a-button-inner"><input class="a-button-input" type="submit" aria-labelledby="unifiedLocationAddrUpdate-announce"><span id="unifiedLocationAddrUpdate-announce" class="a-button-text" aria-hidden="true">
Update
</span></span></span>
</div>
</div>
<div id="unifiedLocationInvalidInputAlert" class="a-row a-spacing-top-small aok-hidden">
<span class="a-color-error">
Please enter a valid US zip code.
</span>
</div>
<div id="LUXInvalidZipCodeAlert" class="a-row a-spacing-top-small aok-hidden" role="alert">
<div class="a-box a-alert-inline a-alert-inline-error a-spacing-none" aria-live="assertive" role="alert"><div class="a-box-inner a-alert-container"><i class="a-icon a-icon-alert"></i><div class="a-alert-content">
Please enter a valid US zip code.
</div></div></div>
</div>
<div id="LUXMilitaryZipCodeAlert" class="a-row a-spacing-top-small aok-hidden" role="alert">
<div class="a-box a-alert-inline a-alert-inline-info a-spacing-none"><div class="a-box-inner a-alert-container"><i class="a-icon a-icon-alert"></i><div class="a-alert-content">
Shipping to a APO/FPO/DPO? Please add the address to your address book. Make sure you include the unit and box numbers (if assigned).
</div></div></div>
</div>
</div>
<div class="a-divider a-divider-break a-spacing-base a-spacing-top-base lux-country-selector-divider"><h5>or</h5></div>
<div id="unifiedLocationCountrySelectionDiv" class="a-section a-spacing-mini a-spacing-top-small">
<div class="a-row">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;name&quot;:&quot;LUXCountrySelector&quot;,&quot;activate&quot;:&quot;onclick&quot;}">
<a id="unifiedLocationCountrySelectionLink" href="#" class="a-touch-link a-box a-spacing-none a-spacing-top-micro"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>
Change country
</div></a>
</span>
</div>
</div>
</div>
<div class="a-popover-preload" id="a-popover-LUXCountrySelector">
<div id="LUXCountrySelections" class="a-section"></div>
</div>
<script type="text/javascript">
var shouldPopulateCountrySelector = true;
P.now("LOCUX_DETAILPAGE_68144_T1").execute(function(LOCUX_DETAILPAGE_68144_T1) {
if(LOCUX_DETAILPAGE_68144_T1) {
shouldPopulateCountrySelector = true;
}
});
var fullPageRefresh = false;
P.now("LOCUX_FULLPAGE_REFRESH").execute(function(LOCUX_FULLPAGE_REFRESH) {
if(LOCUX_FULLPAGE_REFRESH) {
fullPageRefresh = true;
}
});
P.now("LUXContext").execute(function(LUXContext) {
if (!LUXContext) {
P.declare("LUXContext", {
isRecognizedCustomer: false,
deviceType: "mobileWeb",
isOneClick: false,
clientPage: "DPX",
shouldPopulateCountrySelector: shouldPopulateCountrySelector,
fullPageRefresh: fullPageRefresh
});
}
});
P.when("LUXController").execute(function(LUXController) {
LUXController.init({
addressLabel : "",
addressId : "",
obfuscatedId : "",
countryCode : "DE",
zipCode : "12529",
state : "Land Berlin",
city : "Berlin",
district : "",
locationType : "IP2LOCATION"
});
});
</script>
</div>
<input type="hidden" name="addressID" value="new" id="unifiedLocationAddress" data-addnewaddress="new">
<script type="text/javascript">
P.now("LUXDPOnly").execute(function(DP) {
DP || P.declare("LUXDPOnly", {});
});
P.when("LUXDPRefreshController").execute(function(Controller) {
Controller.init({
asin : "193435659X",
merchantId : "ATVPDKIKX0DER",
deviceType : "mobile",
smid : "",
exMerchId : "",
wdg: "book_display_on_website",
oneClick : false,
addressId : "",
obfuscatedId : "",
city : "Berlin",
state : "Land Berlin",
countryCode : "DE",
zipCode : "12529",
district : "",
useTwisterRefresh : "C",
updateAddressForNon1Click : "T1",
relatedRequestId : "7F3MGDYTH1YH8KVBSFWJ"
});
});
</script>
</div>
<div class="a-row">
<div id="usedbuybox.addToCart" class="a-section">
<form id="addToCart" method="post" action="/gp/aw/c/ref=dp_uatc_mw" class="a-spacing-base">
<input type="hidden" name="a" value="193435659X" id="a">
<input type="hidden" name="o" value="add" id="o">
<input type="hidden" name="verificationSessionID" value="147-0816675-1753153" id="verificationSessionID">
<input type="hidden" name="oid" value="xAHjc5YB9iaKocBCkcupS%2B9gYXoy18Y29KKE%2FdFpGA0dGbW3HsqZZWTtYNqvzHjk2j7z4Gf2kvSN2QN1cC0COtIoowOuSp68cydsq3YTNoOFXmx4OE8LEcNfwVJntbQOLjlGjtL01GQGSbzPoKKz%2Bg%3D%3D" id="oid">
<input type="hidden" name="isUsedBuyBox" value="1" id="isUsedBuyBox">
<span class="a-button a-button-primary" id="a-autoid-0"><span class="a-button-inner"><input id="add-to-cart-button-ubb-mobile" class="a-button-input" type="submit" aria-labelledby="a-autoid-0-announce"><span class="a-button-text" aria-hidden="true" id="a-autoid-0-announce">Add to Cart</span></span></span>
</form>
</div>
</div>
</div>
</div></div>
<div id="newAccordionRow" class="a-box a-accordion-active accordion-row" data-a-accordion-row-name="newAccordionRow"><div class="a-box-inner a-accordion-row-container">
<div class="a-accordion-row-a11y" role="radio" aria-checked="true" aria-expanded="true"><a aria="" data-action="a-accordion" class="a-accordion-row a-declarative accordion-header" href="#" aria-label=""><i class="a-icon a-accordion-radio a-icon-radio-active"></i><h5>
<div class="a-row header-text">Buy New</div>
<div class="a-row">
<span id="newBuyBoxPrice" class="a-size-base a-color-price header-price a-text-normal">$21.11</span>
</div>
</h5></a></div>
<div class="a-accordion-inner accordion-row-content">
<div id="mobile_qualifiedBuybox_feature_div" data-feature-name="mobile_qualifiedBuybox" data-template-name="mobile_qualifiedBuybox" class="a-section a-spacing-none feature">
<div id="mobile_invitePlatformMessage_feature_div" data-feature-name="mobile_invitePlatformMessage" data-template-name="mobile_invitePlatformMessage" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="pwAvailabilityInclusion_feature_div" data-feature-name="pwAvailabilityInclusion" data-template-name="pwAvailabilityInclusion" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="pwFastTrackInclusion_feature_div" data-feature-name="pwFastTrackInclusion" data-template-name="pwFastTrackInclusion" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="pwShipsFromSoldByInclusion_feature_div" data-feature-name="pwShipsFromSoldByInclusion" data-template-name="pwShipsFromSoldByInclusion" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="glowContextualIngressPt_feature_div" data-feature-name="glowContextualIngressPt" data-template-name="glowContextualIngressPt" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="unifiedLocationAbove_feature_div" data-feature-name="unifiedLocationAbove" data-template-name="unifiedLocationAbove" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="unifiedLocationBelow_feature_div" data-feature-name="unifiedLocationBelow" data-template-name="unifiedLocationBelow" class="a-section a-spacing-none feature t-prnt t-full">
<div id="unifiedLocation_feature_div" data-feature-name="unifiedLocation" data-template-name="unifiedLocation" class="a-section feature button-stack-unifiedLocation-bottom">
<script type="text/javascript">
P.now("LOCUX_DETALPAGE_51079_T1").execute(function(LOCUX_DETALPAGE_51079_T1) {
if (!LOCUX_DETALPAGE_51079_T1) {
P.declare("LOCUX_DETALPAGE_51079_T1", {});
}
});
</script>
<div class="a-section a-spacing-none a-spacing-top-mini">
<div id="locationUX" class="a-section button-stack-lux">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;name&quot;:&quot;LUXAddressSelector&quot;,&quot;activate&quot;:&quot;onclick&quot;}">
<img alt="" src="https://images-na.ssl-images-amazon.com/images/G/01/detail-page/icons/button_stack_Icon_location_pin_2x._CB271282142_.png" height="16px" data-a-hires="https://images-na.ssl-images-amazon.com/images/G/01/detail-page/icons/button_stack_Icon_location_pin_2x._CB271282142_.png">
<span class="button-stack-lux">
Ship to:
</span>
<a class="a-link-normal lux-location-label button-stack-lux" href="#">
Germany
</a>
</span>
</div>
</div>
<input type="hidden" name="addressID" value="new" id="unifiedLocationAddress" data-addnewaddress="new">
<script type="text/javascript">
P.now("LUXDPOnly").execute(function(DP) {
DP || P.declare("LUXDPOnly", {});
});
P.when("LUXDPRefreshController").execute(function(Controller) {
Controller.init({
asin : "193435659X",
merchantId : "ATVPDKIKX0DER",
deviceType : "mobile",
smid : "",
exMerchId : "",
wdg: "book_display_on_website",
oneClick : false,
addressId : "",
obfuscatedId : "",
city : "Berlin",
state : "Land Berlin",
countryCode : "DE",
zipCode : "12529",
district : "",
useTwisterRefresh : "C",
updateAddressForNon1Click : "T1",
relatedRequestId : "7F3MGDYTH1YH8KVBSFWJ"
});
});
</script>
</div>
</div>
<div id="mobileQuantity_feature_div" data-feature-name="mobileQuantity" data-template-name="mobileQuantity" class="a-section a-spacing-none feature t-prnt t-full">
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;quantityState&quot;}">{"quantity":"1"}</script>
<div id="mobileQuantitySelection" class="a-section a-spacing-base button-stack-quantityButtonSpacing">
<div class="a-row a-spacing-base">
<div class="a-column a-span12 a-text-left">
<span class="a-dropdown-container a-hide-native"><label for="mobileQuantityDropDown" class="a-native-dropdown">Qty:</label><select name="quantity" autocomplete="off" id="mobileQuantityDropDown" tabindex="-1" class="a-native-dropdown">
<option value="1" selected="">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
</select><span tabindex="-1" class="a-button a-button-dropdown a-button-small" id="a-autoid-1" style="min-width: 0%;"><span class="a-button-inner"><span class="a-button-text a-declarative" data-action="a-dropdown-button" role="button" tabindex="0" aria-hidden="true" id="a-autoid-1-announce"><span class="a-dropdown-label">Qty:</span><span class="a-dropdown-prompt">1</span></span><i class="a-icon a-icon-dropdown"></i></span></span></span>
</div>
</div>
</div>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;minOrderQuantityState&quot;}">{"minOrderQuantity":"1"}</script>
</div>
<div id="businessPricing_feature_div" data-feature-name="businessPricing" data-template-name="businessPricing" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="simpleBundle_feature_div" data-feature-name="simpleBundle" data-template-name="simpleBundle" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="bbop_feature_div" data-feature-name="bbop" data-template-name="bbop" class="a-section a-spacing-none feature">
</div>
<div id="warrantyCheckBox_feature_div" data-feature-name="warrantyCheckBox" data-template-name="warrantyCheckBox" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="vasBuyBox_feature_div" data-feature-name="vasBuyBox" data-template-name="vasBuyBox" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="snsOptIn_feature_div" data-feature-name="snsOptIn" data-template-name="snsOptIn" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="inlineButtons_feature_div" data-feature-name="inlineButtons" data-template-name="inlineButtons" class="a-section a-spacing-none feature t-prnt t-full">
<form id="addToCart" method="post" action="/gp/aw/c/ref=mw_dp_buy_crt">
<input type="hidden" name="a" value="193435659X" id="a">
<input type="hidden" name="o" value="add" id="o">
<input type="hidden" name="oid" value="qpYstoUm2IWlPY1RqjQUzvk%2F4O9B7Pp7woGziNjZ%2BVuf9XauXgWmPRt4Dll7c4xoUH58XERmSulhFpGwShCxlUxvbmTV7pjNFoyT6iNzMizhROvlZUaWMQ%3D%3D" id="oid">
<input type="hidden" name="verificationSessionID" value="147-0816675-1753153" id="verificationSessionID">
<input type="hidden" name="colid" id="colid">
<input type="hidden" name="coliid" id="coliid">
<input type="hidden" name="quantity" value="1" id="quantity">
<input type="hidden" name="snsOptIn" id="snsOptIn">
<input type="hidden" name="rcxOrdFreq" id="rcxOrdFreq">
<input type="hidden" name="snsOfferListingID" id="snsOfferListingID">
<input type="hidden" name="snsMerchantID" id="snsMerchantID">
<input type="hidden" name="snsAddressId" id="snsAddressId">
<input type="hidden" name="snsMostCommonFrequency" id="snsMostCommonFrequency">
<input type="hidden" name="snsOnmlOfferId" id="snsOnmlOfferId">
<input type="hidden" name="rebateId" id="rebateId">
<div id="buybox.addToCart" class="a-section a-spacing-small">
<span class="a-button a-button-primary" id="a-autoid-2"><span class="a-button-inner"><input id="add-to-cart-button" name="submit.add-to-cart" title="Add to Shopping Cart" class="a-button-input" type="submit" aria-labelledby="a-autoid-2-announce"><span class="a-button-text a-text-center" aria-hidden="true" id="a-autoid-2-announce">
Add to Cart
</span></span></span>
</div>
</form>
</div>
<div id="digitalDashHighProminence_feature_div" data-feature-name="digitalDashHighProminence" data-template-name="digitalDashHighProminence" class="a-section a-spacing-none feature t-prnt t-full">
</div>
</div>
</div>
</div></div>
</div>
</div>
<div id="digitalDashHighProminenceAccordion_feature_div" data-feature-name="digitalDashHighProminenceAccordion" data-template-name="digitalDashHighProminenceAccordion" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="addToWishlistAccordion_feature_div" data-feature-name="addToWishlistAccordion" data-template-name="addToWishlistAccordion" class="a-section a-spacing-none feature t-prnt t-full">
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;atbr-migration-state&quot;}">{"isVmbrEnabled":true,"isMigrationActive":true,"hasBabyReg":false}</script>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;atwl&quot;}">{"hzPopover":true,"useHzForAdd":true}</script>
<div class="a-section a-spacing-large a-spacing-top-large buttonStackBTFAlpha">
<form id="addToWishlist" method="post" action="https://www.amazon.com/ap/signin?openid.return_to=https%3A%2F%2Fwww.amazon.com%2Fgp%2Faw%2Fd%2F193435659X&amp;openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.assoc_handle=usflex&amp;openid.mode=checkid_setup&amp;openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&amp;">
<div id="wishlistButtonStack" class="a-section">
<a id="add-to-wishlist-button-submit" class="a-spacing-none a-link-normal" title="submit.add-to-registry.wishlist" href="https://www.amazon.com/ap/signin?openid.return_to=https%3A%2F%2Fwww.amazon.com%2Fgp%2Faw%2Fd%2F193435659X&amp;openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.assoc_handle=usflex&amp;openid.mode=checkid_setup&amp;openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&amp;">
ADD TO LIST
</a>
</div>
</form>
<div class="a-box a-alert-inline a-alert-inline-error a-hidden a-spacing-top-small" aria-live="assertive" role="alert"><div class="a-box-inner a-alert-container"><i class="a-icon a-icon-alert"></i><div class="a-alert-content">
<div id="atwl-error-message" class="a-section a-spacing-none">
We are sorry. Amazon has encountered an error. Please try again.
</div>
</div></div></div>
</div>
<hr class="a-spacing-large a-divider-normal">
</div>
<div id="digitalDashLowProminenceAccordion_feature_div" data-feature-name="digitalDashLowProminenceAccordion" data-template-name="digitalDashLowProminenceAccordion" class="a-section a-spacing-none feature t-prnt t-full">
</div>
</div>
</div>
</div>
</div>
<div id="p2d_feature_div" data-feature-name="p2d" data-template-name="p2d" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="redirection_feature_div" data-feature-name="redirection" data-template-name="redirection" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<div id="bundle_feature_div" data-feature-name="bundle" data-template-name="bundle" class="a-section a-spacing-none feature t-prnt t-full">
</div>
<script type="text/javascript">
setCSMReq('af');setCSMReq('af');
addlongPoleTag('af','awudplphtml');
</script>
<script type="text/javascript">
(function(d,w){
var url = "https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SY400_.jpg";
var i = new Image();
i.onload = function () {
var img = d.getElementById("main-image");
if (img) {
img.src = url;
}
w.setDPTimestamp("mainImgRepl", img ? "inlineScript2" : "mainImgNotFound");
}
i.src = url;
})(document,window);
(function(d,w){
var logLatency = function(name) {
if(w.ue && w.ue.count) { w.ue.count(name, Date.now()-window.ue_t0); }
}
var altWT = "false";
var cl = d.getElementsByClassName("carousel-loader");
if (cl) {
for (var i=0; i<cl.length; i++) {
var l = d.createElement("img");
l.setAttribute("src", "https://images-na.ssl-images-amazon.com/images/G/01/amazonui/loading/loading-2x-gray._CB329354105_.gif");
l.setAttribute("class", "carousel-loader-img");
var t = d.createElement("img");
t.setAttribute("src", "https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/transparent-pixel._CB386942464_.gif");
t.setAttribute("class", "white-bg");
if (cl[i]) {
cl[i].appendChild(l);
cl[i].appendChild(t);
}
}
}
P.when('A', 'a-carousel-framework', 'jQuery').execute(function(A, f, $) {
f.createAll();
f.initializeAll();
var ds = "#image-block-pagination-dots";
f.onInit("image-block-carousel",function(p) {
logLatency("dpmob_carouselInitialized");
$('#loadingImages').hide();
$(ds).show();
selectDot(1);
});
function selectDot(index) {
var dots = $(ds+' li');
if (dots.length > 0) {
dots.removeClass('a-selected');
dots.eq(index-1).addClass('a-selected');
}
}
A.on("a:carousel:image-block-carousel:change:pageNumber", function(p) {
if (p.oldValue !== p.newValue) {
selectDot(p.newValue);
}
});
});
if(true) {
P.when('A','jQuery').execute(function(A, $) {
var ib = "#image-block .carousel-img-manual-load";
var $altImages = $(ib);
var len = altWT === "true" ? $altImages.length : 1;
for (var i=0; i<($altImages.length>0 ? len:0); i++) {
var url = $altImages[i].src || $($altImages[i]).data("a-image-source");
(function(index, imgUrl) {
if (imgUrl) {
var $altImPar = $($altImages[index]).parent();
var i = new Image();
i.onload = function() {
$altImPar.find('.carousel-loader').remove();
logLatency("dpmob_alt_image_"+(i+1)+"_ready");
};
i.src = imgUrl;
}
}(i, url));
}
altWT === "true" ? A.loadImageManually($(ib)) : A.loadImageManually($($(ib)[0]));
});
}
})(document, window);
P.when('jQuery').register('image-block-exp-weblab', function($) {
return {
getTreatment : function() {
return "T2";
},
getConditionalHiresTreatment : function() {
return "T1";
},
isEnhancedAltImageDiscoveryTreatmentTwo: function() {
return false;
},
isSlowPage : function() {
return false;
},
isImmersiveShareIconEnabledApp : function() {
return false;
},
isImmersiveShareIconEnabled : function() {
return false;
},
isCarouselFastInitEnabled : true,
carouselLoaderImage : "https://images-na.ssl-images-amazon.com/images/G/01/amazonui/loading/loading-2x-gray._CB329354105_.gif",
carouselWhiteBackground : "https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/transparent-pixel._CB386942464_.gif",
immersiveViewExpEnabled : false,
showToofanExperience : false,
enlargeImageBlockAIB : 0
};
});
P.when('jQuery').register('airy-image-block', function($) {
var shouldDetachExitFullScreen = false;
var currentIndex = 0;
var currentVideoIndex = 0;
var curContext;
var videoIndexPlayedPV = {};
var videoIndexPlayedIV = {};
var newAiryConfig = null;
var updateStateElement = $('#image-block');
return {
updateStateForAction : function($carousel, index, airyConfig) {
if (!airyConfig) {return;}
var airyInstance = airyConfig.instance;
if (airyInstance) {
airyInstance.pause();
}
currentVideoIndex = index;
curContext = airyConfig.contextName;
var $selectedCarouselItem = $carousel
.find('li.a-carousel-card')
.eq(index - 1);
var $playerContainer = $selectedCarouselItem.find('.airy-player-container');
if (!$playerContainer.length) {
return;
}
if (airyInstance) {
this._attachAndLoadMedia(airyInstance, $playerContainer);
return;
}
P.when('Airy').execute(function() {
airyInstance = this._embed($playerContainer, airyConfig.contextName);
airyConfig.embeddedCallback(airyInstance);
}.bind(this));
},
_embed : function($playerContainer, contextName) {
var $videoMetadata = $('#image-block-video-metadata');
var foresterParams = $videoMetadata.data('forester-params');
if (contextName != null) {
foresterParams.method += '.' + contextName;
}
var airyInstance;
var that = this;
var playerConfig = {
foresterMetadataParams : foresterParams,
mediaSourceInfo : $playerContainer.data('video-url'),
parentElement : $playerContainer[0],
bindings : {
screenchange : function() {
$slateImage = $('div.airy-player-container .image-size-wrapper, div.airy-player-container #airy-slate-preload');
$slateImage.css('visibility', 'visible');
$replayHint = $('div.airy-player-container .airy-replay-hint');
$replayHint.css('visibility', 'hidden');
var airyConfig = that.getNewAiryConfig();
if(airyConfig) {
airyInstance = airyConfig.instance;
if(airyInstance && !airyInstance.isFullScreen() && that.shouldDetachOnExitFullScreen()) {
that.setShouldDetachOnExitFullScreen(false);
that._detachAiryInstance(airyInstance);
that.updateStateForAction(that.getUpdateStateElement(), that.getCurrentIndex(), that.getNewAiryConfig());
}
}
},
normalscreen : function() {
if(!airyInstance && airyConfig) {
airyInstance = airyConfig.instance;
}
},
play : function() {
var inImmersive = curContext === 'ImmersiveView';
var videoMap = inImmersive ? videoIndexPlayedIV : videoIndexPlayedPV;
var metric = inImmersive ? "dpmob_videoPlayedIV" : "dpmob_videoPlayedPV";
if (!videoMap[currentVideoIndex]) {
videoMap[currentVideoIndex] = true;
if(window.ue && ue.count) { ue.count(metric); }
}
}
},
installFlashButtonText : "Install Flash Player",
installFlashPrompt : "Adobe Flash Player is required to watch this video.",
playbackErrorPrompt : "Sorry, an error has occurred while attempting video playback. Please try again later.",
videoUnsupportedPrompt : "Sorry, this video is unsupported on this browser.",
ageGate : {
deniedPrompt : "We're sorry. You are not old enough to watch this video.",
monthNames : [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
],
prompt : "This video is not intended for all audiences. What date were you born?",
submitText : "Submit",
regionCode : "na"
}
};
this._addSlateImageToPlayerConfig($playerContainer, playerConfig);
airyInstance = Airy.embed(playerConfig);
return airyInstance;
},
_attachAndLoadMedia : function(airyInstance, $playerContainer) {
if (!airyInstance) { return; }
airyInstance.attach($playerContainer[0]);
this._loadMedia(airyInstance, $playerContainer);
},
_loadMedia : function(airyInstance, $playerContainer) {
if (!airyInstance) { return; }
var videoUrl = $playerContainer.data('video-url');
if (airyInstance.getMediaSourceInfo() === videoUrl) { return; }
var loadMediaConfig = {
mediaSourceInfo : videoUrl
};
this._addSlateImageToPlayerConfig($playerContainer, loadMediaConfig);
airyInstance.loadMedia(loadMediaConfig);
},
_addSlateImageToPlayerConfig : function($playerContainer, playerConfig) {
var slateUrl = $playerContainer.data('slate-url');
var $slateImage = $playerContainer.find('.image-size-wrapper');
var slateUrlMatchesImageUrl = $slateImage.find('img').attr('src') === slateUrl;
var slateImageValue = slateUrlMatchesImageUrl ? $slateImage[0] : slateUrl;
playerConfig.slateImages = {
preloadSlate : slateImageValue
};
},
_detachAiryInstance : function(airyInstance) {
if (airyInstance && !airyInstance.isDetached() && !airyInstance.isFullScreen()) {
airyInstance.detach({isAsync : true});
}
},
setShouldDetachOnExitFullScreen : function(shouldDetach) {
shouldDetachExitFullScreen = shouldDetach;
},
shouldDetachOnExitFullScreen : function() {
return shouldDetachExitFullScreen;
},
_resizeIVCarousel : function() {
if($('#immersive-main img').length > 0){
var mainCarouselHeight = getMainCarouselHeight();
$('#immersive-main').css('height',mainCarouselHeight+'px');
$('#immersive-main ol').css('height',mainCarouselHeight+'px');
$('#immersive-main div.a-carousel-viewport').each(function(){
$(this).css('height',mainCarouselHeight+'px');
});
$('#immersive-main li.a-carousel-card').each(function(){
$(this).css('height',mainCarouselHeight+'px');
});
$('#immersive-main img').each(function(){
$(this).css('max-height',mainCarouselHeight+'px');
});
$('#immersive-main .slate-image-table img').each(function() {
$(this).css('max-height',(mainCarouselHeight - 65) + 'px');
});
}
},
getCurrentIndex : function() {
return currentIndex;
},
setCurrentIndex : function(index) {
currentIndex = index;
},
getNewAiryConfig : function() {
return newAiryConfig;
},
setNewAiryConfig : function(airyConfig) {
newAiryConfig = airyConfig
},
getUpdateStateElement : function() {
return updateStateElement;
},
setUpdateStateElement : function(element) {
updateStateElement = element;
},
imageBlockRefresh : function() {
videoIndexPlayedIV = {};
videoIndexPlayedPV = {};
}
};
});
P.when('jQuery').register("mobileIBmetricCollectionWeblab", function($) {
return {
isMobileIBmetricCollectionEnabled : false,
swipeReqCount : 0,
swipeSuccessCount : 0,
swipeCountsDiff : 0,
IVReqCount : 0,
IVSuccessCount : 0,
IVCountsDiff : 0,
onPrimaryImg : true,
logCountAndTime : function(metricName){
if(window.ue && ue.count) {
ue.count(metricName, 1);
ue.count(metricName + "Time", Date.now() - window.ue_t0);
}
},
logSpecificCount : function(metricName, metricValue){
if(window.ue && ue.count) {
ue.count(metricName, metricValue);
}
}
};
});
</script>
</div><script type="text/javascript"> var BtfTimeToParse_tctr = Date.now(); </script><!-- MarkAF -->
<div id="WrapperDivToHideBTF" style="display:block;">
<script type="text/javascript"> ue.count('BtfTimeToParse', Date.now() - BtfTimeToParse_tctr) </script> <script type="text/javascript">P.when('cf').execute(function() { ue.count('dp:widget:dpxSize:dpxBTFSize', 117);ue.count('dp:widget:dpxSize:dpxATFSize', 106);});</script>
<div id="dp-lazy-fast-track_feature_div" data-feature-name="dpFastTrack" data-template-name="dpFastTrack" class="a-section a-spacing-none feature t-prnt t-full">
<script type="text/javascript">
P.when('jQuery', 'atf').execute(function($){
$('#dpFastTrack_feature_div, .dpFastTrackPlaceholder').html($('#lazy-fast-track').html());
$('#lazy-fast-track').remove();
});
</script>
</div><div id="lazy-holidayAvailabilityMessage_feature_div" data-feature-name="holidayAvailabilityMessage" data-template-name="holidayAvailabilityMessage" class="a-section a-spacing-none feature t-prnt t-full">
<script type="text/javascript">
P.when('jQuery', 'atf').execute(function($){
$('#holidayAvailabilityMessage_feature_div').html($('#lazy-holidayAvailabilityMessage').html());
$('#lazy-holidayAvailabilityMessage').remove();
});
</script>
</div><div style="display:flex">
<div class="twister-spinner-preload" style="width:0px; height:0px"></div>
</div><div id="olp_feature_div" data-feature-name="olp" data-template-name="olp" class="a-section a-spacing-none feature t-prnt t-full">
<div id="olp" class="a-row a-spacing-medium buttonStackBTFAlpha">
<a class="a-link-normal" href="/gp/offer-listing/193435659X/ref=mw_dp_olp?ie=UTF8&amp;condition=all">
USED&nbsp;&amp;&nbsp;NEW&nbsp;(109)&nbsp;FROM&nbsp;<span class="a-color-price">$3.92</span>
</a>
</div>
</div><div id="tradeInButton_feature_div" data-feature-name="tradeInButton" data-template-name="tradeInButton" class="a-section a-spacing-none feature t-prnt t-full">
</div><div id="sellYoursHere_feature_div" data-feature-name="sellYoursHere" data-template-name="sellYoursHere" class="a-section a-spacing-none feature t-prnt t-full">
<div class="a-row">
<div class="a-column a-span12 a-spacing-none buttonStackBTFAlpha">
<a id="sellYoursHere" class="a-link-normal" href="/gp/aw/sellOnAmazonDispatcher.html/ref=udp_sdp_dispatcher?ie=UTF8&amp;ASIN=193435659X">SELL ON AMAZON
</a>
</div>
</div>
</div><div id="lazybbop_feature_div" data-feature-name="lazybbop" data-template-name="lazybbop" class="a-section a-spacing-none feature t-prnt t-full">
</div><div id="tellAFriendBox_feature_div" data-feature-name="tellAFriendBox" data-template-name="tellAFriendBox" class="a-section a-spacing-none feature t-part t-full">
<hr class="a-spacing-medium a-spacing-top-large a-divider-normal">
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;swf-1-click-page-state&quot;}">{"placementId":"awdo_t1_ONzHAb73GYHY8"}</script>
<div id="buttonStack_tell_a_friend" class="a-row a-spacing-large buttonStackBTFAlpha">
<span class="a-declarative" data-action="swf-1-click-declarative" data-swf-1-click-declarative="{&quot;siteName&quot;:&quot;email&quot;}">
<div id="email" class="a-column a-span2 a-text-left a-spacing-none buttonStackBTFAlpha">
<a id="tell-a-friend" class="a-link-normal" target="_self" rel="noopener" href="/gp/aw/social/swf/193435659X/o=WriteEmail/ref=cm_sw_em_ov_awdo_t1_ONzHAb73GYHY8?ie=UTF8&amp;placementID=awdo_t1_ONzHAb73GYHY8&amp;asin=193435659X&amp;isOneClick=1">
<div class="a-section a-text-center buttonStackShareTap">
<i id="email_icon" class="a-icon a-icon-share-email swf-share-icon" role="img" aria-label="Email"></i>
</div>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-1-click-declarative" data-swf-1-click-declarative="{&quot;siteName&quot;:&quot;facebook&quot;,&quot;refId&quot;:&quot;fa&quot;}">
<div id="facebook" class="a-column a-span2 a-text-left a-spacing-none buttonStackBTFAlpha">
<a id="tell-a-friend" class="a-link-normal" target="_blank" rel="noopener" href="/gp/redirect.html/ref=cm_sw_cl_fa_awdo_t1_ONzHAb73GYHY8?_encoding=UTF8&amp;location=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fshare%3F_encoding%3DUTF8%26display%3Dpopup%26href%3Dhttps%253A%252F%252Fwww.amazon.com%252Fdp%252F193435659X%252Fref%253Dcm_sw_r_fa_awdo_t1_ONzHAb73GYHY8%26redirect_uri%3Dhttps%253A%252F%252Fwww.amazon.com%252Fgp%252Fpdp%252Ftaf%252Ffb_post_redirect.html%252Fref%253Dcm_sw_s_fa_awdo_t1_ONzHAb73GYHY8%26app_id%3D164734381262%26hashtag%3D%2523Amazon&amp;token=E0915379AEBDF40D2C90D4882003C7011F43D80C">
<div class="a-section a-text-center buttonStackShareTap">
<i id="facebook_icon" class="a-icon a-icon-share-facebook swf-share-icon" role="img" aria-label="Facebook"></i>
</div>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-1-click-declarative" data-swf-1-click-declarative="{&quot;siteName&quot;:&quot;sms&quot;,&quot;refId&quot;:&quot;sms&quot;}">
<div id="sms" class="a-column a-span2 a-text-left a-spacing-none buttonStackBTFAlpha">
<a id="tell-a-friend" class="a-link-normal" target="_self" rel="noopener" href="sms:&amp;body=Check%20this%20out%3A%20Seven%20Languages%20in%20Seven%20Weeks%3A%20A%20Pragmatic%20Guide%20to%20Learning%20Pr...%20https%3A%2F%2Fwww.amazon.com%2Fdp%2F193435659X%2Fref%3Dcm_sw_r_sms_awdo_t1_ONzHAb73GYHY8">
<div class="a-section a-text-center buttonStackShareTap">
<i id="sms_icon" class="a-icon a-icon-share-sms swf-share-icon" role="img"></i>
</div>
</a>
</div>
</span>
<div class="a-column a-span6 a-text-left buttonStackShareTap">
<span class="a-declarative" data-action="swf-share-btn-declarative" data-swf-share-btn-declarative="{&quot;refId&quot;:&quot;sb&quot;}">
<a id="swf-share-button" class="a-link-normal buttonStackShareTap" href="#">
<span class="a-declarative" data-action="a-sheet" data-a-sheet="{&quot;name&quot;:&quot;shareSheet&quot;,&quot;preloadDomId&quot;:&quot;swf-sheet-content&quot;,&quot;closeType&quot;:&quot;icon&quot;}">
SHARE
</span>
</a>
</span>
</div>
<div id="swf_whatsapp_not_installed_alert" class="a-section" role="alert">
<div class="a-box a-alert-inline a-alert-inline-error" aria-live="assertive" role="alert"><div class="a-box-inner a-alert-container"><i class="a-icon a-icon-alert"></i><div class="a-alert-content">
It looks like WhatsApp is not installed on your phone. Please use a different way to share.
</div></div></div>
</div>
</div>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;swf-share-sheet-page-state&quot;}">{"placementId":"awdb_t1_ONzHAb73GYHY8","mailToEnabled":false}</script>
<div id="swf-sheet-content" class="a-box aok-hidden"><div class="a-box-inner">
<div class="a-row a-size-base a-color-base swf-sheet-title a-ws-row" style="height:47px;">
<span>Share this product with friends</span>
</div>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;sms&quot;,&quot;refId&quot;:&quot;sms&quot;}">
<div id="swf-sheet-sms" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_self" rel="noopener" href="sms:&amp;body=Check%20this%20out%3A%20Seven%20Languages%20in%20Seven%20Weeks%3A%20A%20Pragmatic%20Guide%20to%20Learning%20Pr...%20https%3A%2F%2Fwww.amazon.com%2Fdp%2F193435659X%2Fref%3Dcm_sw_r_sms_awdb_t1_ONzHAb73GYHY8">
<i id="swf-sms-img" class="a-icon a-icon-share-sms swf-sheet-icon" role="img"></i>
<span class="swf-network-share">Text Message</span>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;email&quot;}">
<div id="swf-sheet-email" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_self" rel="noopener" href="/gp/aw/social/swf/193435659X/o=WriteEmail/ref=cm_sw_em_ov_awdb_t1_ONzHAb73GYHY8?ie=UTF8&amp;placementID=awdb_t1_ONzHAb73GYHY8&amp;asin=193435659X&amp;isOneClick=1">
<i id="swf-email-img" class="a-icon a-icon-share-email swf-sheet-icon" role="img" aria-label="Email"></i>
<span class="swf-network-share">Email</span>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;facebook&quot;,&quot;refId&quot;:&quot;fa&quot;}">
<div id="swf-sheet-facebook" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_blank" rel="noopener" href="/gp/redirect.html/ref=cm_sw_cl_fa_awdb_t1_ONzHAb73GYHY8?_encoding=UTF8&amp;location=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fshare%3F_encoding%3DUTF8%26display%3Dpopup%26href%3Dhttps%253A%252F%252Fwww.amazon.com%252Fdp%252F193435659X%252Fref%253Dcm_sw_r_fa_awdb_t1_ONzHAb73GYHY8%26redirect_uri%3Dhttps%253A%252F%252Fwww.amazon.com%252Fgp%252Fpdp%252Ftaf%252Ffb_post_redirect.html%252Fref%253Dcm_sw_s_fa_awdb_t1_ONzHAb73GYHY8%26app_id%3D164734381262%26hashtag%3D%2523Amazon&amp;token=E0915379AEBDF40D2C90D4882003C7011F43D80C">
<i id="swf-facebook-img" class="a-icon a-icon-share-facebook swf-sheet-icon" role="img" aria-label="Facebook"></i>
<span class="swf-network-share">Facebook</span>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;twitter&quot;,&quot;refId&quot;:&quot;tw&quot;}">
<div id="swf-sheet-twitter" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_blank" rel="noopener" href="/gp/redirect.html/ref=cm_sw_cl_tw_awdb_t1_ONzHAb73GYHY8?_encoding=UTF8&amp;location=https%3A%2F%2Ftwitter.com%2Fintent%2Ftweet%3Foriginal_referer%3Dhttps%25253A%25252F%25252Fwww.amazon.com%25252Fgp%25252Faw%25252Fd%25252F193435659X%25252Fref%25253Dcm_sw_r_tw_awdb_t1_x_ONzHAb73GYHY8%26text%3DSeven%2520Languages%2520in%2520Seven%2520Weeks%253A%2520A%2520Pragmatic%2520Guide%2520to%2520Learning%2520Programming%2520Lan...%26related%3Damazondeals%252Camazonmp3%26url%3Dhttps%253A%252F%252Fwww.amazon.com%252Fdp%252F193435659X%252Fref%253Dcm_sw_r_tw_awdb_t1_x_ONzHAb73GYHY8%26via%3Damazon&amp;token=BC5273EAB1B7E571BD3622704B44890CC537FE04">
<i id="swf-twitter-img" class="a-icon a-icon-share-twitter swf-sheet-icon" role="img" aria-label="Twitter"></i>
<span class="swf-network-share">Twitter</span>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;whatsapp&quot;,&quot;refId&quot;:&quot;wa&quot;}">
<div id="swf-sheet-whatsapp" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_self" rel="noopener" href="whatsapp://send?text=Check%20this%20out%3A%20Seven%20Languages%20in%20Seven%20Weeks%3A%20A%20Pragmatic%20Guide%20to%20Learning%20Pro...%20https%3A%2F%2Fwww.amazon.com%2Fdp%2F193435659X%2Fref%3Dcm_sw_r_wa_awdb_t1_ONzHAb73GYHY8">
<i id="swf-whatsapp-img" class="a-icon a-icon-share-whatsapp swf-sheet-icon" role="img"></i>
<span class="swf-network-share">WhatsApp </span>
</a>
</div>
<div id="swf_bottom_sheet_wa_not_installed_alert" class="a-box a-alert-inline a-alert-inline-error" aria-live="assertive" role="alert"><div class="a-box-inner a-alert-container"><i class="a-icon a-icon-alert"></i><div class="a-alert-content">
It looks like WhatsApp is not installed on your phone. Please use a different way to share.
</div></div></div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;pinterest&quot;,&quot;refId&quot;:&quot;pi&quot;}">
<div id="swf-sheet-pinterest" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_blank" rel="noopener" href="/gp/redirect.html/ref=cm_sw_cl_pi_awdb_t1_ONzHAb73GYHY8?_encoding=UTF8&amp;location=https%3A%2F%2Fpinterest.com%2Fpin%2Fcreate%2Fbutton%3Furl%3Dhttps%253A%252F%252Fwww.amazon.com%252Fdp%252F193435659X%252Fref%253Dcm_sw_r_pi_awdb_t1_x_ONzHAb73GYHY8%26title%3DSeven%2520Languages%2520in%2520Seven%2520Weeks%253A%2520A%2520Pragmatic%2520Guide%2520to%2520Lear...%26description%3DSeven%2520Languages%2520in%2520Seven%2520Weeks%253A%2520A%2520Pragmatic%2520Guide%2520to%2520Lear...%2520https%253A%252F%252Fwww.amazon.com%252Fdp%252F193435659X%252Fref%253Dcm_sw_r_pi_awdb_t1_x_ONzHAb73GYHY8%26media%3Dhttps%253A%252F%252Fimages-na.ssl-images-amazon.com%252Fimages%252FI%252F51opYcR6kVL.jpg&amp;token=49402B6CEDC244163E355CFF5E75B587C25D0183">
<i id="swf-pinterest-img" class="a-icon a-icon-share-pinterest swf-sheet-icon" role="img" aria-label="Pinterest"></i>
<span class="swf-network-share">Pinterest</span>
</a>
</div>
</span>
<span class="a-declarative" data-action="swf-sheet-declarative" data-swf-sheet-declarative="{&quot;siteName&quot;:&quot;copy&quot;,&quot;refId&quot;:&quot;cp&quot;}">
<div id="swf-sheet-copy" class="a-row a-spacing-none a-color-base a-grid-vertical-align a-grid-center swf-sheet-network a-ws-row" style="height:50px;">
<a id="swf-sheet-network-link" class="a-link-normal a-box" target="_blank" rel="noopener" href="https://www.amazon.com/dp/193435659X/ref=cm_sw_r_cp_awdb_t1_ONzHAb73GYHY8">
<i id="swf-copy-img" class="a-icon a-icon-share-link swf-sheet-icon" role="img"></i>
<div class="a-section swf-copy-manual">
<span id="swf-copy-link">Copy</span><br>
<span id="swf-copy-instruction">press and hold to copy</span>
</div>
</a>
</div>
</span>
</div></div>
</div><div id="persistentWidget_feature_div" data-feature-name="persistentWidget" data-template-name="persistentWidget" class="a-section a-spacing-none feature t-prnt t-full">
<style>
.nfcx-mobile-container {
margin-left: -14px;
margin-right: -14px;
border-bottom: 1px;
padding-bottom: 14px;
border-top: 1px;
border-bottom-style: solid;
border-bottom-color: #979797;
border-top-color: #979797;
border-top-style: solid;
}
.pw-mobile-imagePosition {
margin-left: -14px;
}
</style>
</div><div id="buyOnAlexa_feature_div" data-feature-name="buyOnAlexa" data-template-name="buyOnAlexa" class="a-section a-spacing-none feature t-prnt t-full">
</div><div id="promotions_feature_div" data-feature-name="promotions" data-template-name="promotions" class="a-section a-spacing-none feature t-prnt t-full">
</div><div id="socialFabric_feature_div" data-feature-name="socialFabric" data-template-name="socialFabric" class="a-section a-spacing-none feature t-prnt t-full">
</div><div id="recommendations_feature_div" data-feature-name="recommendations" data-template-name="recommendations" class="a-section a-spacing-none feature">
</div>
<div class="aw-campaigns"></div><div class="aw-campaigns"></div><div class="aw-campaigns"><script>if (typeof uet === 'function' && typeof ues === 'function') {var scope = 'detail_mobile-hero-quick-promo_mweb';var placementId = '';ues('wb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); uet('bb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); if (placementId) {ues('wb', 'adplacements:' + placementId, {wb:1});uet('bb', 'adplacements:' + placementId, {wb:1});}}</script> <style>@media screen and (max-width:240px){ div[id$=ape_detail_mobile-hero-quick-promo_mweb_wrapper]{ width:auto !important;margin-left:auto !important;left:auto !important} div[id$=ape_detail_mobile-hero-quick-promo_mweb_text-wrapper]{ width:auto !important;margin-left:auto !important;left:auto !important}}@media screen and (orientation:landscape){ [id$=ape_detail_mobile-hero-quick-promo_mweb_wrapper]{ max-width:414px !important;margin:auto !important} [id$=ape_detail_mobile-hero-quick-promo_mweb_text-wrapper]{ max-width:414px !important;margin:auto !important}}</style> <div id="ape_detail_mobile-hero-quick-promo_mweb_wrapper" class="celwidget text/x-dacx-safeframe" style="position:relative; text-align:center; margin-left: -14px; margin-right: -14px; margin-top: 20px; height: 125px; overflow: hidden;" data-ad-details="{&quot;slot&quot; :&quot;detail_mobile-hero-quick-promo_mweb&quot;,&quot;pageType&quot;: &quot;detail&quot;,&quot;subPageType&quot;: &quot;mweb&quot;,&quot;slotName&quot; :&quot;mobile-hero-quick-promo&quot;,&quot;src&quot; : &quot;prefetchEnabled&quot;,&quot;adServer&quot; :&quot;cs&quot;,&quot;campaignId&quot; : &quot;11598&quot;,&quot;arid&quot; :&quot;d4f0ef13f48c4b3c907f7e04775cdb08&quot;, &quot;size&quot; :{&quot;width&quot; : &quot;100%&quot;,&quot;height&quot; : &quot;125px&quot;},&quot;maxAdWidth&quot;: &quot;&quot;,&quot;allowedSizes&quot; :[{&quot;width&quot;:&quot;414px&quot;,&quot;height&quot;:&quot;125px&quot;}, {&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;}],&quot;allowedDomains&quot; : [&quot;g-ecx.images-amazon.com&quot;, &quot;images-na.ssl-images-amazon.com&quot;],&quot;loadAfter&quot; : &quot;immediate&quot;,&quot;extraDelay&quot; : 0,&quot;iframeExtraStyle&quot;: &quot;width: 1px; min-width: 100%;&quot;,&quot;iframeClass&quot;: &quot;&quot;,&quot;iframeSandbox&quot;:&quot;&quot;,&quot;enablePrerenderLogic&quot;: false,&quot;adLabelWrapperId&quot;: &quot;ape_detail_mobile-hero-quick-promo_mweb_text-wrapper&quot;,&quot;adLabelId&quot;: &quot;ape_detail_mobile-hero-quick-promo_mweb_text&quot;,&quot;advTextWrapperDivStyle&quot;: &quot;position:relative; text-align:center; margin-left: -14px; margin-right: -14px; height: auto;&quot;,&quot;advertisementTextStyle&quot;: &quot;font-size: 10px; color: #555; text-align: right; margin: 0px 3px 6px 0;&quot;,&quot;advertisementTextHTMLContent&quot;: &quot;&quot;,&quot;advertisementTextHTMLContentEncoded&quot;: &quot;PGRpdiBpZD0iYXBlX2RldGFpbF9tb2JpbGUtaGVyby1xdWljay1wcm9tb19td2ViX3RleHQtd3JhcHBlciIgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlOyB0ZXh0LWFsaWduOmNlbnRlcjsgbWFyZ2luLWxlZnQ6IC0xNHB4OyBtYXJnaW4tcmlnaHQ6IC0xNHB4OyBoZWlnaHQ6IGF1dG87IiAgPjxkaXYgaWQ9ImFwZV9kZXRhaWxfbW9iaWxlLWhlcm8tcXVpY2stcHJvbW9fbXdlYl90ZXh0IiBzdHlsZT0iZm9udC1zaXplOiAxMHB4OyBjb2xvcjogIzU1NTsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbjogMHB4IDNweCA2cHggMDsiICA+QWR2ZXJ0aXNlbWVudDwvZGl2PjwvZGl2Pg==&quot;,&quot;adPixels&quot;: [],&quot;adPixelDelay&quot;: &quot;0&quot;,&quot;aaxImpPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/e/loi/imp?b=QnGzS4eeEFlFHrJWaWuD4Y0AAAFhmeE25AEAAAGQATDtYC0&quot;,&quot;aaxInstrPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/x/px/QnGzS4eeEFlFHrJWaWuD4Y0AAAFhmeE25AEAAAGQATDtYC0/&quot;,&quot;htmlContent&quot;: &quot;&quot;,&quot;htmlContentEncoded&quot;: &quot;PGRpdiBpZD0iYXBlX2RldGFpbF9tb2JpbGUtaGVyby1xdWljay1wcm9tb19td2ViX2NyZWF0aXZlV3JhcHBlciIgICA+PCFkb2N0eXBlIGh0bWw+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD1VVEYtOD48dGl0bGU+PC90aXRsZT48c3R5bGU+aHRtbHtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xpbmUtaGVpZ2h0OjEuMTU7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJX1ib2R5e21hcmdpbjowfWF7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwOm9iamVjdHN9YTphY3RpdmUsYTpob3ZlcntvdXRsaW5lLXdpZHRoOjB9aW1ne2JvcmRlci1zdHlsZTpub25lfSosOmFmdGVyLDpiZWZvcmV7Ym94LXNpemluZzpib3JkZXItYm94fWh0bWx7b3ZlcmZsb3c6aGlkZGVuO2ZvbnQtZmFtaWx5OkFyaWFsLEhlbHZldGljYSBOZXVlLEhlbHZldGljYSxzYW5zLXNlcmlmO2NvbG9yOiMxMTE7Zm9udC1zaXplOjE0cHh9YXtjb2xvcjojMDA2NmMwO3RleHQtZGVjb3JhdGlvbjpub25lfWE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtjb2xvcjojYzQ1NTAwfSNhZHstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0uYmxvY2t7ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVufS5ibG9jazplbXB0eXtkaXNwbGF5Om5vbmV9LmJsb2NrLS1qdXN0aWZ5LWNlbnRlcnstd2Via2l0LWp1c3RpZnktY29udGVudDpjZW50ZXI7LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uYmxvY2stLWp1c3RpZnktZmxleC1lbmR7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7LW1zLWZsZXgtcGFjazplbmQ7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5ibG9jay0tYWxpZ24tZmxleC1zdGFydHstd2Via2l0LWFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7LW1zLWZsZXgtYWxpZ246c3RhcnQ7LW1zLWdyaWQtcm93LWFsaWduOmZsZXgtc3RhcnQ7YWxpZ24taXRlbXM6ZmxleC1zdGFydH0uYmxvY2stLWFsaWduLWNlbnRlcnstd2Via2l0LWFsaWduLWl0ZW1zOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7LW1zLWdyaWQtcm93LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LmJsb2NrLS1hbGlnbi1mbGV4LWVuZHstd2Via2l0LWFsaWduLWl0ZW1zOmZsZXgtZW5kOy1tcy1mbGV4LWFsaWduOmVuZDstbXMtZ3JpZC1yb3ctYWxpZ246ZmxleC1lbmQ7YWxpZ24taXRlbXM6ZmxleC1lbmR9LmJsb2NrLS1kaXJlY3Rpb24tY29sdW1uey13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5ibG9jay0tYmFja2dyb3VuZCwuYmxvY2stLWJhY2tncm91bmQ+LmJsb2Nre3Bvc2l0aW9uOnJlbGF0aXZlfS5ibG9ja19fYmFja2dyb3VuZHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0uYmxvY2stLWxvY2t7LXdlYmtpdC1mbGV4LWdyb3c6MDstbXMtZmxleC1wb3NpdGl2ZTowO2ZsZXgtZ3JvdzowOy13ZWJraXQtZmxleC1zaHJpbms6MDstbXMtZmxleC1uZWdhdGl2ZTowO2ZsZXgtc2hyaW5rOjB9LmJsb2NrLS1pbmxpbmU6bm90KDplbXB0eSl7ZGlzcGxheTpibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udC1zaXplOjB9LmJsb2NrLS1pbmxpbmU6bm90KDplbXB0eSk+LmJsb2NrOm5vdCg6ZW1wdHkpe2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXNpemU6MTRweH0uaC1ub0ZsZXhib3ggLmJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktY2VudGVyPi5ibG9ja3t0ZXh0LWFsaWduOmxlZnR9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1mbGV4LWVuZHt0ZXh0LWFsaWduOnJpZ2h0fS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktZmxleC1lbmQ+LmJsb2Nre3RleHQtYWxpZ246bGVmdH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1mbGV4LXN0YXJ0Pi5ibG9ja3t2ZXJ0aWNhbC1hbGlnbjp0b3B9Lmgtbm9GbGV4Ym94IC5ibG9jay0tYWxpZ24tY2VudGVyPi5ibG9ja3t2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lmgtbm9GbGV4Ym94IC5ibG9jay0tYWxpZ24tZmxleC1lbmQ+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0uaC1ub0ZsZXhib3ggLmJsb2NrLS1kaXJlY3Rpb24tY29sdW1uPi5ibG9ja3tkaXNwbGF5OmJsb2NrfS5oLWNsb2Fre3Zpc2liaWxpdHk6aGlkZGVuIWltcG9ydGFudH0uaC1lbGxpcHNpc3tvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LmFzaW5JbWFnZXtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmFzaW5JbWFnZS0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0e2hlaWdodDphdXRvfS5hc2luSW1hZ2UtLWV4dGVuZENvbnRhaW5lckhlaWdodD4uaW1hZ2VDb250YWluZXJ7aGVpZ2h0OjEwMCV9LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9ue2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5hc2luSW1hZ2UtLXdpdGhEZXNjcmlwdGlvbj4uaW1hZ2VDb250YWluZXJ7bWFyZ2luLWJvdHRvbTo1cHh9LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uPi50ZXh0Q29udGFpbmVye21pbi1oZWlnaHQ6MTVweDt0ZXh0LWFsaWduOmNlbnRlcn0uaW1hZ2VDb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0uaW1hZ2VDb250YWluZXJfX2ltYWdle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtib3R0b206MDtyaWdodDowO21hcmdpbjphdXRvO3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5pbWFnZUNvbnRhaW5lci0tbGVmdHtkaXNwbGF5Oi13ZWJraXQtZmxleDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstd2Via2l0LWFsaWduLWl0ZW1zOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS5pbWFnZUNvbnRhaW5lci0tbGVmdD4uaW1hZ2VDb250YWluZXJfX2ltYWdle3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46MH0uaW1hZ2VDb250YWluZXItLXJpZ2h0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7bWFyZ2luOjA7bGVmdDphdXRvO2JvdHRvbTphdXRvO3RvcDphdXRvfS5pbWFnZUNvbnRhaW5lci0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0e2hlaWdodDphdXRvfS5pbWFnZUNvbnRhaW5lci0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpzdGF0aWM7bWFyZ2luOjAgYXV0b30udGV4dExpbmt7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlfS50ZXh0TGluay0tZGlzcGxheUFzVGV4dHtjb2xvcjojMTExfS50ZXh0TGluay0tZGlzcGxheUFzVGV4dDpob3Zlcntjb2xvcjojMTExO3RleHQtZGVjb3JhdGlvbjpub25lfS5za3kgLnRleHRMaW5re2ZvbnQtd2VpZ2h0OjYwMH0uc2t5IC50ZXh0TGluay0tZGlzcGxheUFzVGV4dCwuc2t5IC50ZXh0TGluay0tZGlzcGxheUFzVGV4dDpob3Zlcntjb2xvcjojMDAyZjM2fS5zdGFyUmF0aW5nX19zdGFyc3tkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTZweDt3aWR0aDo4MHB4O21hcmdpbi1yaWdodDo1cHg7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZTozNDRweCAxNXB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uc3RhclJhdGluZ19fY291bnR7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjE2cHh9LnN0YXJSYXRpbmc6aG92ZXI+LnN0YXJSYXRpbmdfX2NvdW50e3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9LnNreSAuc3RhclJhdGluZ19fY291bnR7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTNweH0ucHJpY2VCb3hfX2xpc3R7bWFyZ2luLXJpZ2h0OjRweH0ucHJpY2VCb3hfX3RheE1lc3NhZ2V7bWFyZ2luLWxlZnQ6NXB4O2ZvbnQtc2l6ZToxMXB4fS5wcmljZXtjb2xvcjojYjEyNzA0fS5wcmljZS0tbGlzdHtjb2xvcjojNTU1O3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2h9LnByaWNlLS1qdW1ib3tmb250LXNpemU6M2VtfS5wcmljZV9fanVtYm9DdXJyZW5jeSwucHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudCwucHJpY2VfX2p1bWJvSW50ZWdlckFtb3VudHt2ZXJ0aWNhbC1hbGlnbjp0b3A7Zm9udC13ZWlnaHQ6NTAwfS5wcmljZV9fanVtYm9DdXJyZW5jeSwucHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudHtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6LjRlbTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMzUlKTtmb250LXdlaWdodDo3MDB9LnByaWNlX19qdW1ib0ludGVnZXJBbW91bnR7bGV0dGVyLXNwYWNpbmc6LS41cHh9LnNreSAucHJpY2V7Y29sb3I6I2IxMjcwNH0ucHJpbWVMb2dve21hcmdpbi10b3A6MnB4fS50ZW1wbGF0ZUNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZX0udGVtcGxhdGVDb250YWluZXJfX2xpbmt7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29wYWNpdHk6MH0uY2xpY2t0aHJvdWdoTGluazpub3QoLnRlbXBsYXRlQ29udGFpbmVyX19saW5rKXtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjJ9PC9zdHlsZT48c2NyaXB0PnZhciBtb2Rlcm5penI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihvKXtpZih0W29dKXJldHVybiB0W29dLmV4cG9ydHM7dmFyIHI9dFtvXT17ZXhwb3J0czp7fSxpZDpvLGxvYWRlZDohMX07cmV0dXJuIGVbb10uY2FsbChyLmV4cG9ydHMscixyLmV4cG9ydHMsbiksci5sb2FkZWQ9ITAsci5leHBvcnRzfXZhciB0PXt9O3JldHVybiBuLm09ZSxuLmM9dCxuLnA9IiIsbigwKX0oezA6ZnVuY3Rpb24oZSxuLHQpe2UuZXhwb3J0cz10KDIwKX0sMjA6ZnVuY3Rpb24oZSxuKXsidXNlIHN0cmljdCI7dmFyIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9OyFmdW5jdGlvbihlLG4sbyl7ZnVuY3Rpb24gcihlLG4pe3JldHVybigidW5kZWZpbmVkIj09dHlwZW9mIGU/InVuZGVmaW5lZCI6dChlKSk9PT1ufWZ1bmN0aW9uIHMoKXt2YXIgZSxuLHQsbyxzLGksbDtmb3IodmFyIGYgaW4gYilpZihiLmhhc093blByb3BlcnR5KGYpKXtpZihlPVtdLG49YltmXSxuLm5hbWUmJihlLnB1c2gobi5uYW1lLnRvTG93ZXJDYXNlKCkpLG4ub3B0aW9ucyYmbi5vcHRpb25zLmFsaWFzZXMmJm4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aCkpZm9yKHQ9MDt0PG4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aDt0KyspZS5wdXNoKG4ub3B0aW9ucy5hbGlhc2VzW3RdLnRvTG93ZXJDYXNlKCkpO2ZvcihvPXIobi5mbiwiZnVuY3Rpb24iKT9uLmZuKCk6bi5mbixzPTA7czxlLmxlbmd0aDtzKyspaT1lW3NdLGw9aS5zcGxpdCgiLiIpLDE9PT1sLmxlbmd0aD93W2xbMF1dPW86KCF3W2xbMF1dfHx3W2xbMF1daW5zdGFuY2VvZiBCb29sZWFufHwod1tsWzBdXT1uZXcgQm9vbGVhbih3W2xbMF1dKSksd1tsWzBdXVtsWzFdXT1vKSxnLnB1c2goKG8/IiI6Im5vLSIpK2wuam9pbigiLSIpKX19ZnVuY3Rpb24gaShlKXt2YXIgbj1TLmNsYXNzTmFtZSx0PXcuX2NvbmZpZy5jbGFzc1ByZWZpeHx8IiI7aWYoXyYmKG49bi5iYXNlVmFsKSx3Ll9jb25maWcuZW5hYmxlSlNDbGFzcyl7dmFyIG89bmV3IFJlZ0V4cCgiKF58XFxzKSIrdCsibm8tanMoXFxzfCQpIik7bj1uLnJlcGxhY2UobywiJDEiK3QrImpzJDIiKX13Ll9jb25maWcuZW5hYmxlQ2xhc3NlcyYmKG4rPSIgIit0K2Uuam9pbigiICIrdCksXz9TLmNsYXNzTmFtZS5iYXNlVmFsPW46Uy5jbGFzc05hbWU9bil9ZnVuY3Rpb24gbChlLG4pe3JldHVybiEhfigiIitlKS5pbmRleE9mKG4pfWZ1bmN0aW9uIGYoKXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2Ygbi5jcmVhdGVFbGVtZW50P24uY3JlYXRlRWxlbWVudChhcmd1bWVudHNbMF0pOl8/bi5jcmVhdGVFbGVtZW50TlMuY2FsbChuLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsYXJndW1lbnRzWzBdKTpuLmNyZWF0ZUVsZW1lbnQuYXBwbHkobixhcmd1bWVudHMpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFthLXpdKS0oW2Etel0pL2csZnVuY3Rpb24oZSxuLHQpe3JldHVybiBuK3QudG9VcHBlckNhc2UoKX0pLnJlcGxhY2UoL14tLywiIil9ZnVuY3Rpb24gdShlLG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KG4sYXJndW1lbnRzKX19ZnVuY3Rpb24gcChlLG4sdCl7dmFyIG87Zm9yKHZhciBzIGluIGUpaWYoZVtzXWluIG4pcmV0dXJuIHQ9PT0hMT9lW3NdOihvPW5bZVtzXV0scihvLCJmdW5jdGlvbiIpP3Uobyx0fHxuKTpvKTtyZXR1cm4hMX1mdW5jdGlvbiBkKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbQS1aXSkvZyxmdW5jdGlvbihlLG4pe3JldHVybiItIituLnRvTG93ZXJDYXNlKCl9KS5yZXBsYWNlKC9ebXMtLywiLW1zLSIpfWZ1bmN0aW9uIGMoKXt2YXIgZT1uLmJvZHk7cmV0dXJuIGV8fChlPWYoXz8ic3ZnIjoiYm9keSIpLGUuZmFrZT0hMCksZX1mdW5jdGlvbiBtKGUsdCxvLHIpe3ZhciBzLGksbCxhLHU9Im1vZGVybml6ciIscD1mKCJkaXYiKSxkPWMoKTtpZihwYXJzZUludChvLDEwKSlmb3IoO28tLTspbD1mKCJkaXYiKSxsLmlkPXI/cltvXTp1KyhvKzEpLHAuYXBwZW5kQ2hpbGQobCk7cmV0dXJuIHM9Zigic3R5bGUiKSxzLnR5cGU9InRleHQvY3NzIixzLmlkPSJzIit1LChkLmZha2U/ZDpwKS5hcHBlbmRDaGlsZChzKSxkLmFwcGVuZENoaWxkKHApLHMuc3R5bGVTaGVldD9zLnN0eWxlU2hlZXQuY3NzVGV4dD1lOnMuYXBwZW5kQ2hpbGQobi5jcmVhdGVUZXh0Tm9kZShlKSkscC5pZD11LGQuZmFrZSYmKGQuc3R5bGUuYmFja2dyb3VuZD0iIixkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGE9Uy5zdHlsZS5vdmVyZmxvdyxTLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLFMuYXBwZW5kQ2hpbGQoZCkpLGk9dChwLGUpLGQuZmFrZT8oZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpLFMuc3R5bGUub3ZlcmZsb3c9YSxTLm9mZnNldEhlaWdodCk6cC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHApLCEhaX1mdW5jdGlvbiB5KG4sdCl7dmFyIHI9bi5sZW5ndGg7aWYoIkNTUyJpbiBlJiYic3VwcG9ydHMiaW4gZS5DU1Mpe2Zvcig7ci0tOylpZihlLkNTUy5zdXBwb3J0cyhkKG5bcl0pLHQpKXJldHVybiEwO3JldHVybiExfWlmKCJDU1NTdXBwb3J0c1J1bGUiaW4gZSl7Zm9yKHZhciBzPVtdO3ItLTspcy5wdXNoKCIoIitkKG5bcl0pKyI6Iit0KyIpIik7cmV0dXJuIHM9cy5qb2luKCIgb3IgIiksbSgiQHN1cHBvcnRzICgiK3MrIikgeyAjbW9kZXJuaXpyIHsgcG9zaXRpb246IGFic29sdXRlOyB9IH0iLGZ1bmN0aW9uKGUpe3JldHVybiJhYnNvbHV0ZSI9PWdldENvbXB1dGVkU3R5bGUoZSxudWxsKS5wb3NpdGlvbn0pfXJldHVybiBvfWZ1bmN0aW9uIHYoZSxuLHQscyl7ZnVuY3Rpb24gaSgpe3AmJihkZWxldGUgTi5zdHlsZSxkZWxldGUgTi5tb2RFbGVtKX1pZihzPXIocywidW5kZWZpbmVkIik/ITE6cywhcih0LCJ1bmRlZmluZWQiKSl7dmFyIHU9eShlLHQpO2lmKCFyKHUsInVuZGVmaW5lZCIpKXJldHVybiB1fWZvcih2YXIgcCxkLGMsbSx2LGg9WyJtb2Rlcm5penIiLCJ0c3BhbiIsInNhbXAiXTshTi5zdHlsZSYmaC5sZW5ndGg7KXA9ITAsTi5tb2RFbGVtPWYoaC5zaGlmdCgpKSxOLnN0eWxlPU4ubW9kRWxlbS5zdHlsZTtmb3IoYz1lLmxlbmd0aCxkPTA7Yz5kO2QrKylpZihtPWVbZF0sdj1OLnN0eWxlW21dLGwobSwiLSIpJiYobT1hKG0pKSxOLnN0eWxlW21dIT09byl7aWYoc3x8cih0LCJ1bmRlZmluZWQiKSlyZXR1cm4gaSgpLCJwZngiPT1uP206ITA7dHJ5e04uc3R5bGVbbV09dH1jYXRjaCh4KXt9aWYoTi5zdHlsZVttXSE9dilyZXR1cm4gaSgpLCJwZngiPT1uP206ITB9cmV0dXJuIGkoKSwhMX1mdW5jdGlvbiBoKGUsbix0LG8scyl7dmFyIGk9ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLGw9KGUrIiAiK1Quam9pbihpKyIgIikraSkuc3BsaXQoIiAiKTtyZXR1cm4gcihuLCJzdHJpbmciKXx8cihuLCJ1bmRlZmluZWQiKT92KGwsbixvLHMpOihsPShlKyIgIit6LmpvaW4oaSsiICIpK2kpLnNwbGl0KCIgIikscChsLG4sdCkpfWZ1bmN0aW9uIHgoZSxuLHQpe3JldHVybiBoKGUsbyxvLG4sdCl9dmFyIGc9W10sYj1bXSxDPXtfdmVyc2lvbjoiMy4zLjEiLF9jb25maWc6e2NsYXNzUHJlZml4OiIiLGVuYWJsZUNsYXNzZXM6ITAsZW5hYmxlSlNDbGFzczohMCx1c2VQcmVmaXhlczohMH0sX3E6W10sb246ZnVuY3Rpb24oZSxuKXt2YXIgdD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtuKHRbZV0pfSwwKX0sYWRkVGVzdDpmdW5jdGlvbihlLG4sdCl7Yi5wdXNoKHtuYW1lOmUsZm46bixvcHRpb25zOnR9KX0sYWRkQXN5bmNUZXN0OmZ1bmN0aW9uKGUpe2IucHVzaCh7bmFtZTpudWxsLGZuOmV9KX19LHc9ZnVuY3Rpb24oKXt9O3cucHJvdG90eXBlPUMsdz1uZXcgdzt2YXIgUz1uLmRvY3VtZW50RWxlbWVudCxfPSJzdmciPT09Uy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFA9Ik1veiBPIG1zIFdlYmtpdCIsVD1DLl9jb25maWcudXNlUHJlZml4ZXM/UC5zcGxpdCgiICIpOltdO0MuX2Nzc29tUHJlZml4ZXM9VDt2YXIgej1DLl9jb25maWcudXNlUHJlZml4ZXM/UC50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik6W107Qy5fZG9tUHJlZml4ZXM9ejt2YXIgRT17ZWxlbTpmKCJtb2Rlcm5penIiKX07dy5fcS5wdXNoKGZ1bmN0aW9uKCl7ZGVsZXRlIEUuZWxlbX0pO3ZhciBOPXtzdHlsZTpFLmVsZW0uc3R5bGV9O3cuX3EudW5zaGlmdChmdW5jdGlvbigpe2RlbGV0ZSBOLnN0eWxlfSksQy50ZXN0QWxsUHJvcHM9aCxDLnRlc3RBbGxQcm9wcz14LC8qIQoJICB7CgkgICAgIm5hbWUiOiAiRmxleGJveCIsCgkgICAgInByb3BlcnR5IjogImZsZXhib3giLAoJICAgICJjYW5pdXNlIjogImZsZXhib3giLAoJICAgICJ0YWdzIjogWyJjc3MiXSwKCSAgICAibm90ZXMiOiBbewoJICAgICAgIm5hbWUiOiAiVGhlIF9uZXdfIGZsZXhib3giLAoJICAgICAgImhyZWYiOiAiaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzMy1mbGV4Ym94IgoJICAgIH1dLAoJICAgICJ3YXJuaW5ncyI6IFsKCSAgICAgICJBIGB0cnVlYCByZXN1bHQgZm9yIHRoaXMgZGV0ZWN0IGRvZXMgbm90IGltcGx5IHRoYXQgdGhlIGBmbGV4LXdyYXBgIHByb3BlcnR5IGlzIHN1cHBvcnRlZDsgc2VlIHRoZSBgZmxleHdyYXBgIGRldGVjdC4iCgkgICAgXQoJICB9CgkgICEqLwp3LmFkZFRlc3QoImZsZXhib3giLHgoImZsZXhCYXNpcyIsIjFweCIsITApKSwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3ggKGxlZ2FjeSkiLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94bGVnYWN5IiwKCSAgICAidGFncyI6IFsiY3NzIl0sCgkgICAgInBvbHlmaWxscyI6IFsiZmxleGllIl0sCgkgICAgIm5vdGVzIjogW3sKCSAgICAgICJuYW1lIjogIlRoZSBfb2xkXyBmbGV4Ym94IiwKCSAgICAgICJocmVmIjogImh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtZmxleGJveC0yMDA5MDcyMy8iCgkgICAgfV0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94bGVnYWN5Iix4KCJib3hEaXJlY3Rpb24iLCJyZXZlcnNlIiwhMCkpLC8qIQoJICB7CgkgICAgIm5hbWUiOiAiRmxleGJveCAodHdlZW5lcikiLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94dHdlZW5lciIsCgkgICAgInRhZ3MiOiBbImNzcyJdLAoJICAgICJwb2x5ZmlsbHMiOiBbImZsZXhpZSJdLAoJICAgICJub3RlcyI6IFt7CgkgICAgICAibmFtZSI6ICJUaGUgX2luYmV0d2Vlbl8gZmxleGJveCIsCgkgICAgICAiaHJlZiI6ICJodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9XRC1jc3MzLWZsZXhib3gtMjAxMTExMjkvIgoJICAgIH1dLAoJICAgICJ3YXJuaW5ncyI6IFsiVGhpcyByZXByZXNlbnRzIGFuIG9sZCBzeW50YXgsIG5vdCB0aGUgbGF0ZXN0IHN0YW5kYXJkIHN5bnRheC4iXQoJICB9CgkgICEqLwp3LmFkZFRlc3QoImZsZXhib3h0d2VlbmVyIix4KCJmbGV4QWxpZ24iLCJlbmQiLCEwKSkscygpLGkoZyksZGVsZXRlIEMuYWRkVGVzdCxkZWxldGUgQy5hZGRBc3luY1Rlc3Q7Zm9yKHZhciBqPTA7ajx3Ll9xLmxlbmd0aDtqKyspdy5fcVtqXSgpO2UuTW9kZXJuaXpyPXd9KHdpbmRvdyxkb2N1bWVudCl9fSk7O3ZhciBQZGFDbGllbnRBUEk9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyKXtpZihuW3JdKXJldHVybiBuW3JdLmV4cG9ydHM7dmFyIGk9bltyXT17ZXhwb3J0czp7fSxpZDpyLGxvYWRlZDohMX07cmV0dXJuIGVbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsdCksaS5sb2FkZWQ9ITAsaS5leHBvcnRzfXZhciBuPXt9O3JldHVybiB0Lm09ZSx0LmM9bix0LnA9IiIsdCgwKX0oW2Z1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigxNil9LCwsLCwsZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHdpbmRvdy5ldmVudDtyZXR1cm4gbih0KX07aWYoZS5hZGRFdmVudExpc3RlbmVyKWUuYWRkRXZlbnRMaXN0ZW5lcih0LHIsITApO2Vsc2UgaWYodD0ib24iK3QsZS5hdHRhY2hFdmVudCllLmF0dGFjaEV2ZW50KHQscik7ZWxzZXt2YXIgaT1lW3RdO2VbdF09ZnVuY3Rpb24oKXtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX19LCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxhPW4oOSksdT1yKGEpLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe2lmKGkodGhpcyxlKSx0aGlzLndpbmRvdz10LndpbmRvd3x8InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdywhdGhpcy53aW5kb3d8fCF0aGlzLndpbmRvdy5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoIldpbmRvdyBhbmQvb3IgZG9jdW1lbnQgaXMgbm90IGRlZmluZWQiKTt0aGlzLmRhY3hMb2dnZXI9dC5kYWN4TG9nZ2VyfHxuZXcgdVsiZGVmYXVsdCJdKHQuYmFzZVVybCx0LmltcHJlc3Npb25JZCx0LmFkU2Vzc2lvbklkKSx0aGlzLmFpZD10LmFkSWQsdGhpcy5jaWQ9dC5jcmVhdGl2ZUlkLHRoaXMuZGFjeExvZ2dlci5sb2dJbXByZXNzaW9uKCl9cmV0dXJuIG8oZSxbe2tleToiYXR0YWNoR2xvYmFscyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLndpbmRvdy5kb2N1bWVudC5hZD17YWlkOnRoaXMuYWRJZCxjaWQ6dGhpcy5jcmVhdGl2ZUlkfSx0aGlzLndpbmRvdy5EYWN4TG9nZ2VyPXRoaXMuZGFjeExvZ2dlcn19XSksZX0oKTt0WyJkZWZhdWx0Il09Y30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0LG4pe3JldHVybiB0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBhKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gdShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPW5ldyBmWyJkZWZhdWx0Il0oZSxkKSxyPXtpOnQuZGFjeEltcHJlc3Npb25JZCxhc2k6dC5kYWN4U2Vzc2lvbklkLGNsaWNrOjF9O3JldHVybiBuLmdldFBpeGVsVXJsKHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKTt0LmdlbmVyYXRlRGFjeENsaWNrVHJhY2tlclVybD1jO3ZhciBzPW4oMTApLGY9cihzKSxkPSI0MTY3MzE2MTMiLHA9ImNsaWVudF9pbXAiLGg9InZpZXciLHY9InN3aXBlIix5PS0xLGc9MSx3PTIsbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsbixyKXtvKHRoaXMsdCk7dmFyIGk9YSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSxkKSk7cmV0dXJuIGkuaW1wcmVzc2lvbklkPW4saS5hZFNlc3Npb25JZD1yLGl9cmV0dXJuIHUodCxlKSxsKHQsW3trZXk6ImxvZ01ldHJpYyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pKHtpOnRoaXMuaW1wcmVzc2lvbklkLGFzaTp0aGlzLmFkU2Vzc2lvbklkfSxlLHR8fDEpO3RoaXMuZmlyZVBpeGVsKG4pfX0se2tleToibG9nSW1wcmVzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhwKX19LHtrZXk6ImxvZ1ZpZXdhYmlsaXR5U3VjY2VzcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLGcpfX0se2tleToibG9nQmFyZVZpZXdhYmlsaXR5U3VjY2VzcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLHcpfX0se2tleToibG9nVmlld2FiaWxpdHlGYWlsdXJlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMubG9nTWV0cmljKGgseSl9fSx7a2V5OiJsb2dTd2lwZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyh2KX19XSksdH0oZlsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09bX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89bigxMSkuZ2V0UXVlcnlTdHJpbmcsYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtyKHRoaXMsZSksdGhpcy5iYXNlVXJsPXQsdGhpcy5jaGFubmVsPW59cmV0dXJuIGkoZSxbe2tleToiZ2V0UGl4ZWxVcmwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PSI/IitlbmNvZGVVUklDb21wb25lbnQobyhlKSk7cmV0dXJuIHRoaXMuYmFzZVVybCsiL2l1Mz9kPWZvcmVzdGVyLWRpZCZleC1mY2g9Iit0aGlzLmNoYW5uZWwrIiZleC1mYXJncz0iK3QrIiZjYj0iKyhuZXcgRGF0ZSkuZ2V0VGltZSgpfX0se2tleToiZmlyZVBpeGVsIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1uZXcgSW1hZ2U7cmV0dXJuIHQuc3JjPXRoaXMuZ2V0UGl4ZWxVcmwoZSksdH19XSksZX0oKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe3ZhciBuPVtdO2Zvcih2YXIgciBpbiBlKW4ucHVzaChyKyI9IitlW3JdKTt2YXIgaT1uLmpvaW4oIiYiKTtyZXR1cm4gdD9lbmNvZGVVUklDb21wb25lbnQoaSk6aX1mdW5jdGlvbiByKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtyPm47bisrKXQoZVtuXSxuLGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmdldFF1ZXJ5U3RyaW5nPW4sdC5mb3JFYWNoPXJ9LCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiBiKGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6YihpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oOCkscz1yKGwpLGY9bigxNyksZD1yKGYpLHA9bigxOCksaD1yKHApLHY9bigxOSkseT1yKHYpLGc9big2KSx3PVsiVEVUUklTX0lOTElORV9NRVNTQUdJTkciXSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7aSh0aGlzLHQpO3ZhciBuPW8odGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zaGF6YW1Mb2dnZXI9ZS5zaGF6YW1Mb2dnZXJ8fG5ldyBkWyJkZWZhdWx0Il0oZS5iYXNlVXJsLGUpLG4uc2hhemFtTG9nZ2VyLmxvZ0ltcHJlc3Npb24oKSxuLmNyZWF0aXZlQ2xpY2tMb2dnZXI9ZS5jcmVhdGl2ZUNsaWNrTG9nZ2VyfHxuZXcgeVsiZGVmYXVsdCJdKGUuYmFzZVVybCxlLmltcHJlc3Npb25JZCksbi50ZW1wbGF0ZU5hbWU9ZS50ZW1wbGF0ZU5hbWUsbn1yZXR1cm4gYSh0LGUpLHUodCxbe2tleToiYXR0YWNoR2xvYmFscyIsdmFsdWU6ZnVuY3Rpb24oKXtjKHQucHJvdG90eXBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQucHJvdG90eXBlKSwiYXR0YWNoR2xvYmFscyIsdGhpcykuY2FsbCh0aGlzKSx0aGlzLndpbmRvdy5TaGF6YW1Mb2dnZXI9dGhpcy5zaGF6YW1Mb2dnZXIsdGhpcy53aW5kb3cuVmlld2FiaWxpdHk9aFsiZGVmYXVsdCJdfX0se2tleToidHJhY2tMb2FkTGF0ZW5jeSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuc2hhemFtTG9nZ2VyLnN0YXJ0VGltZXIoZFsiZGVmYXVsdCJdLkVWRU5UX05BTUVTLkNSRUFUSVZFX0xPQURfTEFURU5DWSksKDAsZy5hZGRMaXN0ZW5lcikodGhpcy53aW5kb3csImxvYWQiLGZ1bmN0aW9uKHQpe2Uuc2hhemFtTG9nZ2VyLmVuZFRpbWVyKGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpfSl9fSx7a2V5OiJhZGRFcnJvckxpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy53aW5kb3cub25lcnJvcj1mdW5jdGlvbih0LG4scixpLG8pe2lmKG8mJm8uc3RhY2spe3ZhciBhPXQrIiA6ICIrby5zdGFjaztlLnNoYXphbUxvZ2dlci5hZGRDb3VudChkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuVU5DQVVHSFRfRVJST1IsYS5sZW5ndGg8NTAwP2E6YS5zdWJzdHJpbmcoMCw1MDApKX1lbHNlIGUuc2hhemFtTG9nZ2VyLmFkZENvdW50KGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5VTkNBVUdIVF9FUlJPUix0KyIgOiAiK24pfX19LHtrZXk6ImFkZFZpZXdhYmlsaXR5TGlzdGVuZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj0uNSxyPTFlMyxpPS4wMSxvPTEsYT1uZXcgaFsiZGVmYXVsdCJdKGUsdGhpcy53aW5kb3cpO2EuZ2V0UGVyY2VudEluVmlldygpPD0tMT90aGlzLmRhY3hMb2dnZXIubG9nVmlld2FiaWxpdHlGYWlsdXJlKCk6KGEub25WaWV3KGksbyxmdW5jdGlvbigpe3JldHVybiB0LmRhY3hMb2dnZXIubG9nQmFyZVZpZXdhYmlsaXR5U3VjY2VzcygpfSksYS5vblZpZXcobixyLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGFjeExvZ2dlci5sb2dWaWV3YWJpbGl0eVN1Y2Nlc3MoKX0pKX19LHtrZXk6ImFkZENyZWF0aXZlQ2xpY2tMaXN0ZW5lciIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt3LmluZGV4T2YodGhpcy50ZW1wbGF0ZU5hbWUpPj0wJiYoMCxnLmFkZExpc3RlbmVyKShlLCJjbGljayIsZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3QuY3JlYXRpdmVDbGlja0xvZ2dlci5sb2dDbGljayhuLGUub2Zmc2V0V2lkdGgsZS5vZmZzZXRIZWlnaHQpfX0oZSkpfX1dKSx0fShzWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT1tfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiB5KGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6eShpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oMTApLHM9cihsKSxmPS4xLGQ9ImNsbWV0IixwPSJkYS1jeC1tZXRyaWNzIixoPVsic2hhemFtSWQiLCJ0ZW1wbGF0ZU5hbWUiLCJsb2NhbGUiLCJhZFNlcnZlciIsInRlbXBsYXRlTWFqb3JWZXJzaW9uIiwidGVtcGxhdGVNaW5vclZlcnNpb24iLCJhZElkIiwiY3JlYXRpdmVJZCIsImltcHJlc3Npb25JZCJdLHY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4pe2kodGhpcyx0KTt2YXIgcj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlLHApKTtyZXR1cm4gci5zaG91bGRGaXJlTWV0cmljcz1NYXRoLnJhbmRvbSgpPD1mLHIudGltZXJzPXt9LHIuYWRJbmZvPW4saC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixlKSl0aHJvdyBuZXcgRXJyb3IoIlNoYXphbUxvZ2dlciBtaXNzaW5nIGFkSW5mbyBwcm9wZXJ0eTogIitlKX0pLHJ9cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImZpcmVQaXhlbCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5zaG91bGRGaXJlTWV0cmljcyYmKGUuaT1lbmNvZGVVUklDb21wb25lbnQodGhpcy5hZEluZm8uaW1wcmVzc2lvbklkKSxlLmFwcD1lbmNvZGVVUklDb21wb25lbnQoZCksYyh0LnByb3RvdHlwZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSksImZpcmVQaXhlbCIsdGhpcykuY2FsbCh0aGlzLGUpKX19LHtrZXk6ImxvZ0V2ZW50Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9e307aWYobnVsbCE9ZSYmbnVsbCE9dCl7dHJ5e24mJihyLnR5cGU9biksci5lbj1lLHIuZXY9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2goaSl7ci5zdHJpbmdpZnlOb3RBdmFpbGFibGU9MX10aGlzLmZpcmVQaXhlbChyKX19fSx7a2V5OiJsb2dJbXByZXNzaW9uIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuYWRJbmZvLHQ9e3M6ZS5zaGF6YW1JZCxuOmVuY29kZVVSSUNvbXBvbmVudChlLnRlbXBsYXRlTmFtZSksbDplLmxvY2FsZSxhczplLmFkU2VydmVyLHRtanY6ZS50ZW1wbGF0ZU1ham9yVmVyc2lvbix0bW52OmUudGVtcGxhdGVNaW5vclZlcnNpb24sYWk6ZS5hZElkLGNpOmUuY3JlYXRpdmVJZCxpOmUuaW1wcmVzc2lvbklkLGltcDoxfTtuYXZpZ2F0b3ImJih0LnVhPWVuY29kZVVSSUNvbXBvbmVudChuYXZpZ2F0b3IudXNlckFnZW50KSksdGhpcy5maXJlUGl4ZWwodCl9fSx7a2V5OiJzdGFydFRpbWVyIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnRpbWVyc1tlXT1uZXcgRGF0ZX19LHtrZXk6ImVuZFRpbWVyIix2YWx1ZTpmdW5jdGlvbihlKXtpZih0aGlzLnRpbWVyc1tlXSl7dmFyIG49bmV3IERhdGUtdGhpcy50aW1lcnNbZV07dGhpcy5sb2dFdmVudChlLG4sdC5FVkVOVF9UWVBFUy5USU1FUiksZGVsZXRlIHRoaXMudGltZXJzW2VdfX19LHtrZXk6ImFkZENvdW50Iix2YWx1ZTpmdW5jdGlvbihlLG4pe249bnx8MSx0aGlzLmxvZ0V2ZW50KGUsbix0LkVWRU5UX1RZUEVTLkNPVU5URVIpfX1dKSx0fShzWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT12LHYuRVZFTlRfVFlQRVM9e1RJTUVSOiJ0aW1lciIsQ09VTlRFUjoiY291bnRlciIsSlNPTjoianNvbiJ9LHYuRVZFTlRfTkFNRVM9e0JVWV9CT1hfTE9BRF9MQVRFTkNZOiJCdXlCb3hMb2FkTGF0ZW5jeSIsQUFOX0xBVEVOQ1k6IkFhbkxhdGVuY3kiLEFBTl9FUlJPUjoiQWFuRXJyb3IiLERST1BfRE9XTl9TRUxFQ1RPUjoiRHJvcERvd25TZWxlY3RvciIsVU5DQVVHSFRfRVJST1I6IlVuY2F1Z2h0RXJyb3IiLFVOREVGSU5FRF9UUkFDS0VSX0FSRzoiVW5kZWZpbmVkVHJhY2tlckFyZyIsQ09PUkRJTkFUT1JfVFJBQ0tFUjoiQ29vcmRpbmF0b3JUcmFja2VyIixJTUFHRV9MT0FEX0xBVEVOQ1k6IkltYWdlTG9hZExhdGVuY3kiLENSRUFUSVZFX0xPQURfTEFURU5DWToiQ3JlYXRpdmVMb2FkTGF0ZW5jeSJ9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcihlLHQpe3ZhciBuPWkodCkscj1vKHQpLHU9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPWEodS50b3AsdS5ib3R0b20sbiksbD1hKHUubGVmdCx1LnJpZ2h0LHIpLHM9YypsLGY9KHUuYm90dG9tLXUudG9wKSoodS5yaWdodC11LmxlZnQpO3JldHVybiBNYXRoLm1pbigxLE1hdGgubWF4KDAscy9mKSl9ZnVuY3Rpb24gaShlKXtyZXR1cm4gZS5pbm5lckhlaWdodHx8ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fWZ1bmN0aW9uIG8oZSl7cmV0dXJuIGUuaW5uZXJXaWR0aHx8ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh9ZnVuY3Rpb24gYShlLHQsbil7dmFyIHI9MDtyZXR1cm4gcj1lPjA/bi1lOnQ+MD9NYXRoLm1pbih0LG4pOjAsTWF0aC5taW4ocix0LWUpfWZ1bmN0aW9uIHUoZSl7dmFyIHQ9bnVsbCxuPWZ1bmN0aW9uIHIoKXtlKCl8fCh0PXNldFRpbWVvdXQociwxMDApKX07cmV0dXJuIG4oKSx7Y2xlYXI6ZnVuY3Rpb24oKXt0JiZjbGVhclRpbWVvdXQodCl9fX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXtuKHRoaXMsZSksdGhpcy53aW5kb3c9cnx8d2luZG93LHRoaXMuZWxlbT10fXJldHVybiBjKGUsW3trZXk6ImdldFBlcmNlbnRJblZpZXciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRUb3BXaW5kb3coKTtpZihlKXtpZih0aGlzLndpbmRvdz09PWUpcmV0dXJuIHIodGhpcy5lbGVtLGUpO2lmKHRoaXMud2luZG93LmZyYW1lRWxlbWVudClyZXR1cm4gcih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQsZSl9ZWxzZSBpZih0aGlzLndpbmRvdy4kc2YpdHJ5e3ZhciB0PXRoaXMud2luZG93LiRzZi5leHQuaW5WaWV3UGVyY2VudGFnZSgpfHwwO3JldHVybiB0LzEwMH1jYXRjaChuKXt9cmV0dXJuLTF9fSx7a2V5OiJnZXRUb3BXaW5kb3ciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9bnVsbDt0cnl7aWYoIXRoaXMud2luZG93LnRvcC5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImNyb3NzLWRvbWFpbiBleGNlcHRpb24iKTtlPXRoaXMud2luZG93LnRvcH1jYXRjaCh0KXt9cmV0dXJuIGV9fSx7a2V5OiJvblZpZXdUaHJlc2hvbGQiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMsbz1udWxsO3JldHVybiB1KGZ1bmN0aW9uKCl7aWYoaS5nZXRQZXJjZW50SW5WaWV3KCk+PWUmJmkuZ2V0UGVyY2VudEluVmlldygpPD10KXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTtpZihudWxsPT09bylvPWE7ZWxzZSBpZihhLW8+bilyZXR1cm4gcigpLCEwfWVsc2Ugbz1udWxsfSl9fSx7a2V5OiJvblZpZXciLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vblZpZXdUaHJlc2hvbGQoZSwxLHQsbil9fSx7a2V5OiJvbkhpZGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vblZpZXdUaHJlc2hvbGQoMCxlLHQsbil9fSx7a2V5OiJnZXRWZXJ0aWNhbFBvc2l0aW9uT25QYWdlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPS0xLHQ9dGhpcy5nZXRUb3BXaW5kb3coKTtpZih0KXtpZih0aGlzLndpbmRvdz09PXQpe3ZhciBuPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ascj1pKHQpLG89dGhpcy5lbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtlPU1hdGgubWF4KE1hdGgubWluKG4vKHItbyksMSksMCl9ZWxzZSBpZih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQpe3ZhciBuPXRoaXMud2luZG93LmZyYW1lRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ascj1pKHQpLG89dGhpcy53aW5kb3cuZnJhbWVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtlPU1hdGgubWF4KE1hdGgubWluKG4vKHItbyksMSksMCl9fWVsc2UgaWYodGhpcy53aW5kb3cuJHNmKXRyeXtlPU1hdGgubWF4KE1hdGgubWluKCRzZi5leHQuZ2VvbSgpLnNlbGYudC8oJHNmLmV4dC5nZW9tKCkud2luLmgtJHNmLmV4dC5nZW9tKCkuc2VsZi5oKSwxKSwwKX1jYXRjaChhKXt9cmV0dXJuIGV9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWx9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBpKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyhlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxjPWZ1bmN0aW9uIHYoZSx0LG4pe251bGw9PT1lJiYoZT1GdW5jdGlvbi5wcm90b3R5cGUpO3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZih2b2lkIDA9PT1yKXt2YXIgaT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIG51bGw9PT1pP3ZvaWQgMDp2KGksdCxuKX1pZigidmFsdWUiaW4gcilyZXR1cm4gci52YWx1ZTt2YXIgbz1yLmdldDtpZih2b2lkIDAhPT1vKXJldHVybiBvLmNhbGwobil9LGw9bigxMCkscz1yKGwpLGY9ImRhLWN4LW1ldHJpY3MiLGQ9IkNvb3JkaW5hdGVDbGljayIscD0ianNvbiIsaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsbil7aSh0aGlzLHQpO3ZhciByPW8odGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUsZikpO3JldHVybiByLmltcHJlc3Npb25JZD1uLHJ9cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImxvZ0NsaWNrIix2YWx1ZTpmdW5jdGlvbihlLG4scil7dmFyIGk9e30sbz17Y3hjOmUucGFnZVgsY3ljOmUucGFnZVksY3B3Om4sY3BoOnJ9O2kuZW49ZCxpLnR5cGU9cCxpLmk9dGhpcy5pbXByZXNzaW9uSWQ7dHJ5e2kuZXY9ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KG8pKX1jYXRjaChhKXtpLnN0cmluZ2lmeU5vdEF2YWlsYWJsZT0xfWModC5wcm90b3R5cGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLCJmaXJlUGl4ZWwiLHRoaXMpLmNhbGwodGhpcyxpKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09aH1dKTs7d2luZG93LnBkYWdTY29wZSA9IHdpbmRvdy5wZGFnU2NvcGUgfHwge307d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkgPSBuZXcgUGRhQ2xpZW50QVBJLmRlZmF1bHQoeyJiYXNlVXJsIjoiaHR0cHM6Ly9zLmFtYXpvbi1hZHN5c3RlbS5jb20iLCJzaGF6YW1JZCI6IjEzOTQzMzQ2IiwidGVtcGxhdGVOYW1lIjoiVEVUUklTX01PQklMRV9SQVZFTiIsInRlbXBsYXRlTWFqb3JWZXJzaW9uIjoiMSIsInRlbXBsYXRlTWlub3JWZXJzaW9uIjoiOSIsImxvY2FsZSI6IlVTIiwiYWRTZXJ2ZXIiOiJjb3JuZXJzdG9uZSIsImFkSWQiOiIyMDU5MDkzNDIwNzAxIiwiY3JlYXRpdmVJZCI6IjcxMDIyMDk1NTAwMDEiLCJpbXByZXNzaW9uSWQiOiJjYk5MaDU0UVdVVWVzbFpwYTRQaGpRIiwiYWRTZXNzaW9uSWQiOiIwMTAxYjBkZDllOWVkNmU0ZDE0ZWU1OTJkMTQzMDcyYzUwNWE1M2UxZTNlNzZhNjUzYWI2NjNmYTAxMGZlYzk5MDM4NiJ9KTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS50cmFja0xvYWRMYXRlbmN5KCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYXR0YWNoR2xvYmFscygpO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLmFkZEVycm9yTGlzdGVuZXIoKTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+PGRpdiBpZD1hZD48ZGl2IGNsYXNzPSJtb2JpbGVSYXZlbiB0ZW1wbGF0ZUNvbnRhaW5lciIgZGF0YS1jcmVhdGl2ZS1pZD0iNzEwMjIwOTU1MDAwMSIgZGF0YS1hZC1pZD0iMjA1OTA5MzQyMDcwMSIgZGF0YS1yZWFjdHJvb3Q9IiIgZGF0YS1yZWFjdGlkPSIxIiBkYXRhLXJlYWN0LWNoZWNrc3VtPSItNTM1ODQzODE2Ij48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayB0ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Rbkd6UzRlZUVGbEZIckpXYVd1RDRZMEFBQUZobWVFMjVBRUFBQUdRQVREdFlDMC9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzAxMzQ2OTI4ODg/YWF4aXRrPWc3R21pUUlaSGJ3WXFVa3RhODlBRUEiIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSIyIj48L2E+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMjVweDtib3JkZXI6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojRkZGRkZGOyIgZGF0YS1yZWFjdGlkPSIzIj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9IndpZHRoOjE2MHB4O2hlaWdodDoxMDAlO3BhZGRpbmc6NXB4IDEwcHggNXB4IDEwcHg7ZmxleDowIDAgMTI1cHg7IiBkYXRhLXJlYWN0aWQ9IjQiPjxkaXYgY2xhc3M9ImFzaW5JbWFnZSIgZGF0YS1yZWFjdGlkPSI1Ij48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayBhc2luSW1hZ2UiIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5HelM0ZWVFRmxGSHJKV2FXdUQ0WTBBQUFGaG1lRTI1QUVBQUFHUUFURHRZQzAvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wMTM0NjkyODg4P2FheGl0az1nN0dtaVFJWkhid1lxVWt0YTg5QUVBIiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iNiI+PGRpdiBjbGFzcz0iaW1hZ2VDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iNyI+PGltZyBjbGFzcz0ibWVkaWFDZW50cmFsSW1hZ2UgaW1hZ2VDb250YWluZXJfX2ltYWdlIiBzcmM9Imh0dHBzOi8vbS5tZWRpYS1hbWF6b24uY29tL2ltYWdlcy9JLzUxd2RBUUtGdHFMLl9BQ19TWDE2MF8uanBnIiBhbHQ9IkxlYXJuIFB5dGhvbiAzIHRoZSBIYXJkIFdheTogQSBWZXJ5IFNpbXBsZSBJbnRyb2R1Y3Rpb24gdG8gdGhlIFRlcnJpZnlpbmdseSBCZWF1dGlmdWwgV29ybGQgb2YgQ29tcHV0ZXJzIGFuZCBDb2RlIChaZWQgU2hhdyYjeDI3O3MgSGFyZCBXYXkgU2VyaWVzKSIgZGF0YS1yZWFjdGlkPSI4Ii8+PC9kaXY+PC9hPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0id2lkdGg6MTAwJTtiYWNrZ3JvdW5kOiNGRkZGRkY7IiBkYXRhLXJlYWN0aWQ9IjkiPjxkaXYgY2xhc3M9ImJsb2NrIGJsb2NrLS1qdXN0aWZ5LWNlbnRlciBibG9jay0tZGlyZWN0aW9uLWNvbHVtbiIgc3R5bGU9IndpZHRoOjEwMCU7cGFkZGluZzowIDEwcHggMCAwOyIgZGF0YS1yZWFjdGlkPSIxMCI+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJtYXJnaW46MCAwIDVweCAwOyIgZGF0YS1yZWFjdGlkPSIxMSI+PGEgY2xhc3M9ImNsaWNrdGhyb3VnaExpbmsgdGV4dExpbmsgdGV4dExpbmstLWRpc3BsYXlBc1RleHQiIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5HelM0ZWVFRmxGSHJKV2FXdUQ0WTBBQUFGaG1lRTI1QUVBQUFHUUFURHRZQzAvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wMTM0NjkyODg4P2FheGl0az1nN0dtaVFJWkhid1lxVWt0YTg5QUVBIiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iMTIiPjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxOHB4OyIgY2xhc3M9InRleHRDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iMTMiPjxzcGFuIGNsYXNzPSJ0ZXh0Q29udGFpbmVyX190ZXh0IiBkYXRhLXJlYWN0aWQ9IjE0Ij5MZWFybiBQeXRob24gd2l0aCB0aGlzIHByb3ZlbiBtZXRob2Q8L3NwYW4+PC9kaXY+PC9hPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgMCA1cHggMDsiIGRhdGEtcmVhY3RpZD0iMTUiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIHRleHRMaW5rIiBocmVmPSJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FuR3pTNGVlRUZsRkhySldhV3VENFkwQUFBRmhtZUUyNUFFQUFBR1FBVER0WUMwL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMDEzNDY5Mjg4OD9hYXhpdGs9ZzdHbWlRSVpIYndZcVVrdGE4OUFFQSIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjE2Ij48ZGl2IHN0eWxlPSJmb250LXNpemU6MTJweDsiIGNsYXNzPSJ0ZXh0Q29udGFpbmVyIGgtZWxsaXBzaXMiIGRhdGEtcmVhY3RpZD0iMTciPjxzcGFuIGNsYXNzPSJ0ZXh0Q29udGFpbmVyX190ZXh0IiBkYXRhLXJlYWN0aWQ9IjE4Ij5MZWFybiBQeXRob24gMyB0aGUgSGFyZCBXYXk6IEEgVmVyeSBTaW1wbGUgSW50cm9kdWN0aW9uIHRvIHRoZSBUZXJyaWZ5aW5nbHkgQmVhdXRpZnVsIFdvcmxkIG9mIENvbXB1dGVycyBhbmQgQ29kZSAoWmVkIFNoYXcmI3gyNztzIEhhcmQgV2F5IFNlcmllcyk8L3NwYW4+PC9kaXY+PC9hPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgMCA0cHggMDsiIGRhdGEtcmVhY3RpZD0iMTkiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIHN0YXJSYXRpbmciIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5HelM0ZWVFRmxGSHJKV2FXdUQ0WTBBQUFGaG1lRTI1QUVBQUFHUUFURHRZQzAvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wMTM0NjkyODg4P2FheGl0az1nN0dtaVFJWkhid1lxVWt0YTg5QUVBI2N1c3RvbWVyUmV2aWV3cyIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjIwIj48ZGl2IGNsYXNzPSJtZWRpYUNlbnRyYWxJbWFnZSBzdGFyUmF0aW5nX19zdGFycyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6dXJsKCYjeDI3O2h0dHBzOi8vbS5tZWRpYS1hbWF6b24uY29tL2ltYWdlcy9HLzAxL2RhL2NyZWF0aXZlcy9hdWktbWluaS1zcHJpdGUtMjAxNS0wMi5wbmcmI3gyNzspO2JhY2tncm91bmQtcG9zaXRpb246LTE4NnB4IDA7IiBkYXRhLXJlYWN0aWQ9IjIxIj48L2Rpdj48c3BhbiBjbGFzcz0ic3RhclJhdGluZ19fY291bnQiIGRhdGEtcmVhY3RpZD0iMjIiPjM2PC9zcGFuPjwvYT48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayBibG9jay0taW5saW5lICIgc3R5bGU9IndoaXRlLXNwYWNlOm5vcm1hbDsiIGRhdGEtcmVhY3RpZD0iMjMiPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgNXB4IDAgMDsiIGRhdGEtcmVhY3RpZD0iMjQiPjxzcGFuIGNsYXNzPSJwcmljZUJveCIgZGF0YS1yZWFjdGlkPSIyNSI+PHNwYW4gY2xhc3M9InByaWNlIHByaWNlQm94X19idXkiIHN0eWxlPSJmb250LXNpemU6MTVweDsiIGRhdGEtcmVhY3RpZD0iMjYiPjxzcGFuIGNsYXNzPSJwcmljZV9fY3VycmVuY3kiIGRhdGEtcmVhY3RpZD0iMjciPiQ8L3NwYW4+PHNwYW4gY2xhc3M9InByaWNlX19hbW91bnQiIGRhdGEtcmVhY3RpZD0iMjgiPjI0LjU3PC9zcGFuPjwvc3Bhbj48IS0tIHJlYWN0LXRleHQ6IDI5IC0tPjwhLS0gL3JlYWN0LXRleHQgLS0+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZTsiIGRhdGEtcmVhY3RpZD0iMzAiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIHByaW1lTG9nbyIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9kYS9jcmVhdGl2ZXMvcHJpbWUtMngtMjAxNzA2MTQucG5nIiB3aWR0aD0iNDMiIGhlaWdodD0iMTIiIGFsdD0iUHJpbWUiIGRhdGEtcmVhY3RpZD0iMzEiLz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDEwcHggMCAxMHB4O2hlaWdodDoxMjNweDtvcGFjaXR5OjAuNjQ7ZmxleDowIDAgOXB4OyIgZGF0YS1yZWFjdGlkPSIzMiI+PGRpdiBjbGFzcz0iaW1hZ2VDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iMzMiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIGltYWdlQ29udGFpbmVyX19pbWFnZSIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9BbWF6b25CcmFuZFN0b3Jlc1BsYXRmb3JtL2JsYWNrX2Fycm93LnBuZyIgYWx0PSJHcmF5IEFycm93IiByb2xlPSJwcmVzZW50YXRpb24iIGRhdGEtcmVhY3RpZD0iMzQiLz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC0xNS4zLjIubWluLmpzIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC1kb20tMTUuMy4yLm1pbi5qcyI+PC9zY3JpcHQ+PHNjcmlwdD52YXIgTGlicmFyeT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgbz1uW3JdPXtleHBvcnRzOnt9LGlkOnIsbG9hZGVkOiExfTtyZXR1cm4gZVtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyx0KSxvLmxvYWRlZD0hMCxvLmV4cG9ydHN9dmFyIG49e307cmV0dXJuIHQubT1lLHQuYz1uLHQucD0iIix0KDApfShbZnVuY3Rpb24oZSx0LG4pe24oMSksZS5leHBvcnRzPW4oMTA0KX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24mJihPYmplY3QuYXNzaWduPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIG49T2JqZWN0KGUpLHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgbz1hcmd1bWVudHNbcl07aWYobnVsbCE9bylmb3IodmFyIGkgaW4gbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobyxpKSYmKG5baV09b1tpXSl9cmV0dXJuIG59KX0sLGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPVJlYWN0fSwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDYpLGM9cihwKSxmPW4oMjcpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucHJvcHMudXBkYXRlT25SZXNpemUmJnRoaXMubGlzdGVuRm9yUmVzaXplKCl9fSx7a2V5OiJsaXN0ZW5Gb3JSZXNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczsidW5kZWZpbmVkIiE9dHlwZW9mIFNGQ2xpZW50JiZTRkNsaWVudCYmU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/U0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KToidW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50JiZNU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/TVNGQ2xpZW50LnJlZ2lzdGVyQ3VzdG9tTWVzc2FnZUxpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uKCl7ZS5vblJlc2l6ZSgpfSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KX19LHtrZXk6Im9uUmVzaXplIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZm9yY2VVcGRhdGUoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLnJlbmRlcmluZ0NvbnRleHQsdD10aGlzLnByb3BzLnN0cnVjdHVyZSxuPXRoaXMucHJvcHMuY2xhc3NOYW1lKyh0aGlzLnByb3BzLnNreT8iIHNreSI6IiIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3RlbXBsYXRlSWQ6dGhpcy5wcm9wcy50ZW1wbGF0ZUlkLGNsYXNzTmFtZTpuLGhyZWY6ZS5hZExpbmssY2xpY2tVcmxzOmUuY2xpY2tVcmxzLGNyZWF0aXZlSWQ6ZS5jcmVhdGl2ZUlkLGFkSWQ6ZS5hZElkfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3JlbmRlcmluZ0NvbnRleHQ6ZSxibG9jazp0LGNvbXBvbmVudHNNYXA6dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6dGhpcy5wcm9wcy5kb21SZWZzfSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJ0ZW1wbGF0ZUNvbnRhaW5lciIsImJsb2NrIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZW1wbGF0ZSIsaC5wcm9wVHlwZXM9e3JlbmRlcmluZ0NvbnRleHQ6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsc3RydWN0dXJlOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsY2xhc3NOYW1lOnUuUHJvcFR5cGVzLnN0cmluZyxkb21SZWZzOnUuUHJvcFR5cGVzLm9iamVjdCx0ZW1wbGF0ZUlkOnUuUHJvcFR5cGVzLnN0cmluZyx1cGRhdGVPblJlc2l6ZTp1LlByb3BUeXBlcy5ib29sLHNreTp1LlByb3BUeXBlcy5ib29sfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPW4oMjQpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zdGF0ZT17ZmxleGJveDohMH0sbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ub2RlJiZ0aGlzLnNldFN0YXRlKHtmbGV4Ym94OmRbImRlZmF1bHQiXS5zdXBwb3J0LmZsZXhib3goKX0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0odGhpcy5wcm9wcy5jbGFzc05hbWU/dGhpcy5wcm9wcy5jbGFzc05hbWUrIiAiOiIiKSsidGVtcGxhdGVDb250YWluZXIiKyh0aGlzLnN0YXRlLmZsZXhib3g/IiI6IiBoLW5vRmxleGJveCIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxjbGFzc05hbWU6dCxpZDp0aGlzLnByb3BzLnRlbXBsYXRlSWQsImRhdGEtY3JlYXRpdmUtaWQiOnRoaXMucHJvcHMuY3JlYXRpdmVJZCwiZGF0YS1hZC1pZCI6dGhpcy5wcm9wcy5hZElkLHJlZjpmdW5jdGlvbih0KXtlLm5vZGU9dH19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJ0ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayJ9fSksdGhpcy5wcm9wcy5jaGlsZHJlbil9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bIkNsaWNrdGhyb3VnaExpbmsiXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1oLGguZGlzcGxheU5hbWU9IlRlbXBsYXRlQ29udGFpbmVyICIsaC5wcm9wVHlwZXM9e3N0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxjbGFzc05hbWU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRlbXBsYXRlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGhyZWY6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKS5pc1JlcXVpcmVkLGNyZWF0aXZlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFkSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbD1uKDMpLHA9cihsKSxjPW4oOCksZj1yKGMpLGQ9big5KSxoPXIoZCkseT1uKDEyKSxtPXIoeSksYj1uKDIzKSx2PXIoYiksZz1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGIuQ09VUE9OX1RPS0VOX01BQ1JPLCgwLHZbImRlZmF1bHQiXSkoKSl9LF89ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJoYW5kbGVPbkNsaWNrIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnByb3BzLG49dC5jbGlja1RyYWNrZXJVcmxzLHI9dC51cmwsbz10LmNhc2NhZGluZ0ludGVudCxpPXQuaXNPZmZzaXRlOygwLGZbImRlZmF1bHQiXSkobiksKDAsbVsiZGVmYXVsdCJdKShnKHIpLGksbykmJmUucHJldmVudERlZmF1bHQoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5wcm9wcyxuPXQudXJsLHI9dC5pc09mZnNpdGUsbz10LmNoaWxkcmVuLGk9dC5hbmNob3JQcm9wcyxhPW51bGw7dGhpcy5jb250ZXh0LmlzU3RhdGljSHRtbCYmdGhpcy5wcm9wcy5jbGlja1RyYWNrZXJVcmxzJiYoYT10aGlzLnByb3BzLmNsaWNrVHJhY2tlclVybHMuam9pbigifCIpKTt2YXIgdT0iY2xpY2t0aHJvdWdoTGluayIrKGkuY2xhc3NOYW1lPyIgIitpLmNsYXNzTmFtZToiIik7cmV0dXJuIHBbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJhIixzKHt9LGkse2NsYXNzTmFtZTp1LGhyZWY6ZyhuKSx0YXJnZXQ6KDAsaFsiZGVmYXVsdCJdKShuLHIpLG9uQ2xpY2s6ZnVuY3Rpb24odCl7cmV0dXJuIGUuaGFuZGxlT25DbGljayh0KX0sb25Nb3VzZURvd246ZnVuY3Rpb24oKXtyZXR1cm4gZS5mb3JjZVVwZGF0ZSgpfSwiZGF0YS1jbGlja1RyYWNrZXJVcmxzIjphLHJlbDoibm9mb2xsb3cifSksbyl9fV0pLHR9KGwuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09XyxfLmRpc3BsYXlOYW1lPSJDbGlja3Rocm91Z2hMaW5rIixfLnByb3BUeXBlcz17dXJsOmwuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNhc2NhZGluZ0ludGVudDpsLlByb3BUeXBlcy5zdHJpbmcsaXNPZmZzaXRlOmwuUHJvcFR5cGVzLmJvb2wsY2xpY2tUcmFja2VyVXJsczpsLlByb3BUeXBlcy5hcnJheU9mKGwuUHJvcFR5cGVzLnN0cmluZyksYW5jaG9yUHJvcHM6bC5Qcm9wVHlwZXMub2JqZWN0LGNoaWxkcmVuOmwuUHJvcFR5cGVzLm5vZGV9LF8uY29udGV4dFR5cGVzPXtpc1N0YXRpY0h0bWw6bC5Qcm9wVHlwZXMuYm9vbH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG89MDtlPm87bysrKXRbb109YXJndW1lbnRzW29dO2Zvcih2YXIgaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBhPXRbaV07aWYoYSlpZigic3RyaW5nIj09dHlwZW9mIGEpcihhKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpcmUgcGl4ZWw6ICInK0pTT04uc3RyaW5naWZ5KGEpKyciIGlzIG5vdCBhIHN0cmluZyEnKTtuLmFwcGx5KHRoaXMsYSl9fX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZSYmKChuZXcgSW1hZ2UpLnNyYz1lKX07dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7dmFyIG49dHx8ISgwLGFbImRlZmF1bHQiXSkoZSk7cmV0dXJuIG4/cy5JTl9ORVdfV0lORE9XOnMuSU5fU0FNRV9XSU5ET1d9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1vO3ZhciBpPW4oMTApLGE9cihpKSxzPW4oMTEpfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUpe3JldHVybiByLnRlc3QoZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1uO3ZhciByPS9eKChodHRwcz86KT9cL1wvKSguKlwuKT9hbWF6b25cLi99LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj10LklOX1NBTUVfV0lORE9XPSJfdG9wIixyPXQuSU5fTkVXX1dJTkRPVz0iX2JsYW5rIjt0WyJkZWZhdWx0Il09e0lOX05FV19XSU5ET1c6cixJTl9TQU1FX1dJTkRPVzpufX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0LG4pe2lmKCF0JiZtWyJkZWZhdWx0Il0mJkMmJnBbImRlZmF1bHQiXS5tYXNoLmlzQVVJQXZhaWxhYmxlKCkmJigwLFRbImRlZmF1bHQiXSkoZSx0KT09PVAuSU5fTkVXX1dJTkRPVylwWyJkZWZhdWx0Il0ubWFzaC5vcGVuSW5FeHRlcm5hbEJyb3dzZXIuZXhlY3V0ZSh7dXJsOmV9KTtlbHNlIGlmKCF0fHwhTXx8dlsiZGVmYXVsdCJdJiYhUyhbMiwyLDEwXSl8fF9bImRlZmF1bHQiXSYmIVMoWzUsNSwxMzVdKSl7aWYoIXR8fCFJKXJldHVybiExO2ZbImRlZmF1bHQiXS5vcGVuKGUpfWVsc2UgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcihufHxlKTtyZXR1cm4hMH1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuKDAsVFsiZGVmYXVsdCJdKShlLHQpPT09UC5JTl9TQU1FX1dJTkRPV31mdW5jdGlvbiBhKGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3JldHVybiB1WyJkZWZhdWx0Il0ub3BlbihlLCgwLFRbImRlZmF1bHQiXSkoZSx0KSl9LGE9ZnVuY3Rpb24oKXtyZXR1cm4gbyhlLHQsbil9LHM9ZnVuY3Rpb24oKXtyZXR1cm4gYSgpfHxyKCl9O3JldHVybiBpKGUsdCk/KHNldFRpbWVvdXQocyxOKSwhMCk6YSgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0WyJkZWZhdWx0Il09YTt2YXIgcz1uKDEzKSx1PXIocyksbD1uKDE0KSxwPXIobCksYz1uKDE1KSxmPXIoYyksZD1uKDE2KSxoPXIoZCkseT1uKDE3KSxtPXIoeSksYj1uKDE4KSx2PXIoYiksZz1uKDIxKSxfPXIoZyksUD1uKDExKSxrPW4oOSksVD1yKGspLHg9bigyMiksTz1yKHgpLHc9ISFwWyJkZWZhdWx0Il0sQz13JiYidW5kZWZpbmVkIiE9dHlwZW9mIHBbImRlZmF1bHQiXS5tYXNoLGo9ISFoWyJkZWZhdWx0Il0sTT1qJiYiZnVuY3Rpb24iPT10eXBlb2YgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcixFPSEhZlsiZGVmYXVsdCJdLEk9RSYmImZ1bmN0aW9uIj09dHlwZW9mIGZbImRlZmF1bHQiXS5vcGVuLFI9aiYmZnVuY3Rpb24oKXt2YXIgZT1oWyJkZWZhdWx0Il0uZ2V0U0RLVmVyc2lvbigpLm1hdGNoKC8oXGQrKVwuKFxkKykuKFxkKykkLyk7cmV0dXJuIGU/W2VbMV0sZVsyXSxlWzNdXTp2b2lkIDB9KCksUz1mdW5jdGlvbihlKXtyZXR1cm4gUiYmKDAsT1siZGVmYXVsdCJdKShSLGUpPj0wfSxOPTE1MH0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50O3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBtcmFpZCYmbXJhaWQ7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGFtYXpvbiYmYW1hem9uO3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxpPW4oMTQpLGE9cihpKSxzPWZ1bmN0aW9uKCl7aWYoIWFbImRlZmF1bHQiXSlyZXR1cm4hMTt2YXIgZT1mdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYVsiZGVmYXVsdCJdLmdldERvY3VtZW50Q29va2llKCkpLnNwbGl0KCI7IikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10LnNwbGl0KCI9Iik7biYmbi5sZW5ndGg+PTImJihlW25bMF0udHJpbSgpXT1uWzFdLnRyaW0oKSl9KSx7djovXCJhdlwiOlwiKFsuXGRdKilcIi9pLnRlc3QoZVsiYW16bi1hcHAtY3R4dCJdKX19KCk7cmV0dXJuIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOm8oZSkpP2Uudjp2b2lkIDB9KCk7dFsiZGVmYXVsdCJdPXN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L2lQaG9uZXxpUGFkfGlQb2QvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDE0KSxpPXIobyksYT1uKDIwKSxzPXIoYSksdT1pWyJkZWZhdWx0Il0mJmlbImRlZmF1bHQiXS5nZXRVc2VyQWdlbnRJbmZvKCl8fHNbImRlZmF1bHQiXSYmc1siZGVmYXVsdCJdLnVzZXJBZ2VudDt0WyJkZWZhdWx0Il09dX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3I7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L0FuZHJvaWQvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2Zvcih2YXIgbj1NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCkscj0wO24+cjtyKyspe3ZhciBvPWVbcl0saT10W3JdO2lmKG8+aSlyZXR1cm4gMTtpZihpPm8pcmV0dXJuLTF9cmV0dXJuIDB9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiJBTVMiO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBidG9hP2J0b2EoRGF0ZS5ub3coKSsoIjsiK2UpKToiIn1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW47dC5DT1VQT05fVE9LRU5fTUFDUk89IlZQQ19DU19NQUNSTyJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX12YXIgbz1uKDI1KSxpPXIobyksYT1uKDI2KSxzPXIoYSksdT0vXi4qXC9cL1teXC9dKy87ZS5leHBvcnRzPXtzdXBwb3J0OntmbGV4Ym94OmZ1bmN0aW9uKCl7cmV0dXJuIE1vZGVybml6ciYmKE1vZGVybml6ci5mbGV4Ym94fHxNb2Rlcm5penIuZmxleGJveGxlZ2FjeXx8TW9kZXJuaXpyLmZsZXhib3h0d2VlbmVyKX19LGdldDpmdW5jdGlvbihlLHQpe3JldHVybiB0LnNwbGl0KCIuIikucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5tYXRjaCgvKC4qKVxbKFxkKilcXS8pLHI9biYmblsxXSxvPW4mJm5bMl07cmV0dXJuIHImJm8/ZVtyXVtwYXJzZUludChvLDEwKV06ZVt0XX0sZSl9LGdldE1lZGlhQ2VudHJhbEltYWdlU3JjOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZTt2YXIgbz1pWyJkZWZhdWx0Il0udXJscy5NRURJQV9DRU5UUkFMX1dXLGE9ZS5yZXBsYWNlKHUsIiIpLGw9bysoMD09PWEuaW5kZXhPZigiLyIpPyIiOiIvIikrYSxwPXt9LGM9cj8yOjE7cmV0dXJuIHQuYWMmJihwLkFDPSEwKSx0LnN4JiYocC5TWD10LnN4KmMpLHQuc3kmJihwLlNZPXQuc3kqYyksdC5xbCYmKHAuUUw9dC5xbCksdC5mbSYmKHAuRk09dC5mbSksc1siZGVmYXVsdCJdLnNldFRhZ3MobCxwLFsiQUMiLCJTWCIsIlNZIiwiRk0iLCJRTCJdLG4pfX19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17dXJsczp7TUVESUFfQ0VOVFJBTF9XVzoiaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20iLE1FRElBX0NFTlRSQUxfQ046Imh0dHBzOi8vaW1hZ2VzLWNuLnNzbC1pbWFnZXMtYW1hem9uLmNvbSJ9fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtzZXRUYWdzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPS9cLl8oW15cLl0rKSg/PV9cLlx3KyQpLyxpPW8uZXhlYyhlKSxhPWk/aVsxXS5zcGxpdCgiXyIpOltdLHM9T2JqZWN0LmFzc2lnbih7fSx0KSx1PVtdO3ImJmEuZm9yRWFjaChmdW5jdGlvbihlKXtpZigiIiE9PWUpe3ZhciB0LG49ZS5zdWJzdHJpbmcoMCwyKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNbbl0/KHNbbl09PT0hMSYmKHNbbl09bnVsbCksbj1udWxsKTp0PWUuc3Vic3RyaW5nKDIsZS5sZW5ndGgpLG51bGwhPT1uJiZ1LnB1c2gobit0KX19KSxuLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9c1tlXTt0JiZ1LnB1c2goZSsodD09PSEwPyIiOnQpKX0pO3ZhciBsPS0xO3UuZm9yRWFjaChmdW5jdGlvbihlLHQpeyJDUiI9PT1lLnN1YnN0cmluZygwLDIpJiYobD10KX0pO3ZhciBwPSExO2lmKGw+PTApe3ZhciBjPXUuc3BsaWNlKGwsMSk7dS51bnNoaWZ0KGNbMF0pLHA9ITB9dmFyIGY9dS5pbmRleE9mKCJBQyIpO2lmKGY+MCl7dmFyIGQ9dS5zcGxpY2UoZiwxKTtwP3Uuc3BsaWNlKDEsMCxkWzBdKTp1LnVuc2hpZnQoZFswXSl9cmV0dXJuIHUubGVuZ3RoPjAmJihlPWEubGVuZ3RoPjA/ZS5yZXBsYWNlKG8sIi5fIit1LmpvaW4oIl8iKSk6ZS5yZXBsYWNlKC9cLig/PVx3KyQpLywiLl8iK3Uuam9pbigiXyIpKyJfLiIpKSxlfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigyNCksYz1yKHApLGY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtjbG9hazpuLmV4dHJhY3RNZXRhZGF0YShlLmJsb2NrLCJjbG9hayIpfSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNldFN0YXRlKHtjbG9hazohMX0pfX0se2tleToiZ2V0Q2xhc3NOYW1lIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJibG9jayIsdD0iIjt0aGlzLnByb3BzLmJsb2NrLmNzc0NsYXNzZXMmJih0PXRoaXMucHJvcHMuYmxvY2suY3NzQ2xhc3Nlcy5qb2luKCIgIikpLCIiIT09dCYmKGUrPSIgIit0KTt2YXIgbj10aGlzLnByb3BzLmJsb2NrLmxheW91dDtyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj1uW3RdOyJqdXN0aWZ5Q29udGVudCI9PT10JiYiZmxleC1zdGFydCIhPT1yP2UrPSIgYmxvY2stLWp1c3RpZnktIityOiJhbGlnbkl0ZW1zIj09PXQmJiJzdHJldGNoIiE9PXI/ZSs9IiBibG9jay0tYWxpZ24tIityOiJmbGV4RGlyZWN0aW9uIj09PXQmJiJyb3ciIT09ciYmKGUrPSIgYmxvY2stLWRpcmVjdGlvbi0iK3IpfSksdGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kJiZ0aGlzLnByb3BzLmJsb2NrLmJhY2tncm91bmQuaWQmJihlKz0iIGJsb2NrLS1iYWNrZ3JvdW5kIiksdGhpcy5zdGF0ZS5jbG9hayYmKGUrPSIgaC1jbG9hayIpLGV9fSx7a2V5OiJwcmV2ZW50UHJvcGVydHkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJiIiIT09dD8ianVzdGlmeUNvbnRlbnQiPT09ZXx8ImFsaWduSXRlbXMiPT09ZXx8ImZsZXhEaXJlY3Rpb24iPT09ZTohMH19LHtrZXk6ImdldEJsb2NrTGF5b3V0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnByb3BzLmJsb2NrLmxheW91dCxuPXt9O3JldHVybiB0JiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBvPXRbcl07ZS5wcmV2ZW50UHJvcGVydHkocixvKXx8KG5bcl09byl9KSxufX0se2tleToiZ2V0QmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmJsb2NrLnN0eWxlLHQ9e307cmV0dXJuIGUmJmUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLnZhbHVlOyJ1bmRlZmluZWQiIT10eXBlb2YgdFtlLm5hbWVdJiYobj10W2UubmFtZV0rIjsiK2UubmFtZSsiOiIrbiksdFtlLm5hbWVdPW59KSx0fX0se2tleToiZ2V0UHJvcFZhbHVlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiJwYXRoIj09PXQudHlwZT9jWyJkZWZhdWx0Il0uZ2V0KGUsdC52YWx1ZSk6ImNvbnN0YW50Ij09PXQudHlwZT90LnZhbHVlOm51bGx9fSx7a2V5OiJnZXRDb21wb25lbnRQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXt9O3JldHVybiBlLnByb3BzJiZlLnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7bltlLm5hbWVdPXQuZ2V0UHJvcFZhbHVlKHQucHJvcHMucmVuZGVyaW5nQ29udGV4dCxlKX0pLG59fSx7a2V5OiJleHRyYWN0TWV0YWRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKG49ZS52YWx1ZSl9KSxufX0se2tleToic2V0UmVmIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmV4dHJhY3RNZXRhZGF0YSh0aGlzLnByb3BzLmJsb2NrLCJyZWYiKTt0JiZ0aGlzLnByb3BzLmRvbVJlZnMmJih0aGlzLnByb3BzLmRvbVJlZnNbdF09ZSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImhpZGUiKSxyPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImlkIiksbz12b2lkIDAsaT12b2lkIDAsYT12b2lkIDAscz12b2lkIDAsdT12b2lkIDAscD12b2lkIDAsYz12b2lkIDA7aWYoIW4pe289dGhpcy5nZXRDbGFzc05hbWUoKTt2YXIgZj10aGlzLmdldEJsb2NrTGF5b3V0KCksZD10aGlzLmdldEJsb2NrU3R5bGUoKTtpPU9iamVjdC5hc3NpZ24oe30sZixkKSxhPVtdO3ZhciBoPXRoaXMucHJvcHMuYmxvY2suY2hpbGRyZW47aCYmaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2EucHVzaChsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCh0LHtyZW5kZXJpbmdDb250ZXh0OmUucHJvcHMucmVuZGVyaW5nQ29udGV4dCxibG9jazpuLGNvbXBvbmVudHNNYXA6ZS5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6ZS5wcm9wcy5kb21SZWZzLGtleTpuLmlkfSkpfSk7dmFyIHk9dGhpcy5wcm9wcy5ibG9jay5jb21wb25lbnQ7eSYmKHU9dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwW3kuaWRdLHM9dGhpcy5nZXRDb21wb25lbnRQcm9wcyh5KSk7dmFyIG09dGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kO20mJihjPXRoaXMucHJvcHMuY29tcG9uZW50c01hcFttLmlkXSxwPXRoaXMuZ2V0Q29tcG9uZW50UHJvcHMobSkpfXJldHVybiFuJiZsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7aWQ6cixjbGFzc05hbWU6byxzdHlsZTppLHJlZjpmdW5jdGlvbih0KXtlLnNldFJlZih0KX19LGMmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImJsb2NrX19iYWNrZ3JvdW5kIn0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoYyxwKSksYS5sZW5ndGg+MD9hOnUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHUscykpfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iQmxvY2siLGYucHJvcFR5cGVzPXtyZW5kZXJpbmdDb250ZXh0OnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGJsb2NrOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsZG9tUmVmczp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89MTk5LGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm1vZGVsPXQsdGhpcy5ibG9ja3NNYXA9e30sdGhpcy5fYnVpbGRCbG9ja3NNYXAoKX1yZXR1cm4gcihlLFt7a2V5OiJfYnVpbGRCbG9ja3NNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9W10sdD17fTtlLnB1c2godGhpcy5tb2RlbCk7Zm9yKHZhciBuPTA7ZS5sZW5ndGg+MDspe3ZhciByPWUuc2hpZnQoKSxpPXRoaXMuX2dldFJlZklkKHIpO2lmKCIiIT09aSYmKHRoaXMuYmxvY2tzTWFwW2ldPXIpLHRbci5pZF18fCh0W3IuaWRdPSEwLGU9ZS5jb25jYXQoci5jaGlsZHJlbnx8W10pKSxuKyssbj5vKWJyZWFrfX19LHtrZXk6Il9nZXRSZWZJZCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7InJlZiI9PT1lLm5hbWUmJih0PWUudmFsdWUpfSksdH19LHtrZXk6ImhpZGVCbG9jayIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiZuLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ImhpZGUiPT09ZS5uYW1lJiYoZS52YWx1ZT10KX0pfX0se2tleToiYWRkQmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuYmxvY2tzTWFwW2VdO3ImJihyLnN0eWxlPXIuc3R5bGV8fFtdLHIuc3R5bGUucHVzaCh7bmFtZTp0LHZhbHVlOm59KSl9fSx7a2V5OiJhZGRDc3NDbGFzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiYobi5jc3NDbGFzc2VzPW4uY3NzQ2xhc3Nlc3x8W10sbi5jc3NDbGFzc2VzLnB1c2godCkpfX0se2tleToiZ2V0Q29tcG9uZW50UHJvcCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXSxyPW51bGw7cmV0dXJuIG4mJm4uY29tcG9uZW50JiZuLmNvbXBvbmVudC5wcm9wcyYmbi5jb21wb25lbnQucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLm5hbWU9PT10JiYocj1lKX0pLHJ9fSx7a2V5OiJzZXRDb21wb25lbnRQcm9wIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzLmJsb2Nrc01hcFtlXTtpZihvJiZvLmNvbXBvbmVudCl7dmFyIGk9ITE7by5jb21wb25lbnQucHJvcHM9by5jb21wb25lbnQucHJvcHN8fFtdLG8uY29tcG9uZW50LnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKGUudmFsdWU9bixlLnR5cGU9cixpPSEwKX0pLGl8fG8uY29tcG9uZW50LnByb3BzLnB1c2goe25hbWU6dCx2YWx1ZTpuLHR5cGU6cn0pfX19LHtrZXk6InNldENzc0NsYXNzZXMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5ibG9ja3NNYXBbZV07biYmKG4uY3NzQ2xhc3Nlcz1uLmNzc0NsYXNzZXN8fFtdLEFycmF5LmlzQXJyYXkodCk/bi5jc3NDbGFzc2VzPXQ6bi5jc3NDbGFzc2VzLnB1c2godCkpfX1dKSxlfSgpO3RbImRlZmF1bHQiXT1pfSwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM0KSxjPXIocCksZj1uKDM1KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0LGFsaWdubWVudDp0aGlzLnByb3BzLmFsaWdubWVudCxtYXhIZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHR9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7YWRkaXRpb25hbENsYXNzOnRoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzLHBhdGg6dGhpcy5wcm9wcy5wYXRoLHdpZHRoOnRoaXMucHJvcHMud2lkdGgsaGVpZ2h0OnRoaXMucHJvcHMuaGVpZ2h0LHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxxbDp0aGlzLnByb3BzLnFsLHJldGluYTp0aGlzLnByb3BzLnJldGluYSxhYzp0aGlzLnByb3BzLmFjLGZtOnRoaXMucHJvcHMuZm0sbWVyZ2VUYWdzOnRoaXMucHJvcHMubWVyZ2VUYWdzLGFsdDp0aGlzLnByb3BzLmFsdCxzcHJpdGU6dGhpcy5wcm9wcy5zcHJpdGUscm9sZTp0aGlzLnByb3BzLnJvbGUsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pKX19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsiaW1hZ2VDb250YWluZXIiLCJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWgsaC5kaXNwbGF5TmFtZT0iTWVkaWFDZW50cmFsSW1hZ2VDb250YWluZXIiLGgucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyx3aWR0aDp1LlByb3BUeXBlcy5zdHJpbmcsaGVpZ2h0OnUuUHJvcFR5cGVzLnN0cmluZyxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHJldGluYTp1LlByb3BUeXBlcy5ib29sLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLGZtOnUuUHJvcFR5cGVzLnN0cmluZyxtZXJnZVRhZ3M6dS5Qcm9wVHlwZXMuYm9vbCxhbHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHNwcml0ZTp1LlByb3BUeXBlcy5ib29sLHJvbGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRpdGxlOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3Qsb25Mb2FkOnUuUHJvcFR5cGVzLmZ1bmMsbWF4SGVpZ2h0OnUuUHJvcFR5cGVzLm51bWJlcn0saC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJpbWFnZUNvbnRhaW5lciIrKHRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0PyIgaW1hZ2VDb250YWluZXItLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIpO3RoaXMucHJvcHMuYWxpZ25tZW50JiYiIiE9PXRoaXMucHJvcHMuYWxpZ25tZW50JiYoZSs9IiBpbWFnZUNvbnRhaW5lci0tIit0aGlzLnByb3BzLmFsaWdubWVudCk7dmFyIHQ9e307cmV0dXJuIHRoaXMucHJvcHMubWF4SGVpZ2h0JiZPYmplY3QuYXNzaWduKHQse21heEhlaWdodDp0aGlzLnByb3BzLm1heEhlaWdodH0pLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ZSxzdHlsZTp0fSxsWyJkZWZhdWx0Il0uY2xvbmVFbGVtZW50KHRoaXMucHJvcHMuY2hpbGRyZW4se2FkZGl0aW9uYWxDbGFzczoiaW1hZ2VDb250YWluZXJfX2ltYWdlIn0pKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1wLHAuZGlzcGxheU5hbWU9IkltYWdlQ29udGFpbmVyIixwLnByb3BUeXBlcz17ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyxtYXhIZWlnaHQ6dS5Qcm9wVHlwZXMubnVtYmVyfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM2KSxjPShyKHApLG4oMjQpKSxmPXIoYyksZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRJbWFnZVNyYyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGZbImRlZmF1bHQiXS5nZXRNZWRpYUNlbnRyYWxJbWFnZVNyYyhlLHthYzp0aGlzLnByb3BzLmFjLHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxmbTp0aGlzLnByb3BzLmZtLHFsOnRoaXMucHJvcHMucWx9LHRoaXMucHJvcHMubWVyZ2VUYWdzLHRoaXMucHJvcHMucmV0aW5hKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5nZXRJbWFnZVNyYyh0aGlzLnByb3BzLnBhdGgpLG49Im1lZGlhQ2VudHJhbEltYWdlIisodGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiKTtpZih0aGlzLnByb3BzLnNwcml0ZSl7dmFyIHI9T2JqZWN0LmFzc2lnbih7d2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYmFja2dyb3VuZEltYWdlOiJ1cmwoJyIrdCsiJykifSx0aGlzLnByb3BzLnN0eWxlKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTpuLHN0eWxlOnIsdGl0bGU6dGhpcy5wcm9wcy50aXRsZX0pfXJldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiaW1nIix7Y2xhc3NOYW1lOm4sc3JjOnQsd2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYWx0OnRoaXMucHJvcHMuYWx0LHJvbGU6dGhpcy5wcm9wcy5yb2xlLHRpdGxlOnRoaXMucHJvcHMudGl0bGUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxvbkxvYWQ6ZnVuY3Rpb24odCl7ZS5wcm9wcy5vbkxvYWQmJmUucHJvcHMub25Mb2FkKHQudGFyZ2V0KX19KX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9Ik1lZGlhQ2VudHJhbEltYWdlIixkLnByb3BUeXBlcz17YWRkaXRpb25hbENsYXNzOnUuUHJvcFR5cGVzLnN0cmluZyxwYXRoOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHN4OnUuUHJvcFR5cGVzLm51bWJlcixzeTp1LlByb3BUeXBlcy5udW1iZXIscmV0aW5hOnUuUHJvcFR5cGVzLmJvb2wsYWM6dS5Qcm9wVHlwZXMuYm9vbCxxbDp1LlByb3BUeXBlcy5udW1iZXIsZm06dS5Qcm9wVHlwZXMuc3RyaW5nLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGFsdDp1LlByb3BUeXBlcy5zdHJpbmcsc3ByaXRlOnUuUHJvcFR5cGVzLmJvb2wscm9sZTp1LlByb3BUeXBlcy5zdHJpbmcsdGl0bGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxvbkxvYWQ6dS5Qcm9wVHlwZXMuZnVuY30sZC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInJldGluYSBtb2R1bGVzIGV4cGVjdHMgYSBmdW5jdGlvbiBvblJldGluYVN0YXRlQ2hhbmdlIGFjY2VwdGluZyBib29sZWFuIik7aWYod2luZG93Lm1hdGNoTWVkaWEpe3ZhciB0PXdpbmRvdy5tYXRjaE1lZGlhKCIoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwobWluLXJlc29sdXRpb246IDE5MmRwaSkiKSxuPWZ1bmN0aW9uKHQpe3JldHVybiBlKHQubWF0Y2hlcyl9O3QmJm4odCksdC5hZGRMaXN0ZW5lciYmdC5hZGRMaXN0ZW5lcihuKX1lbHNlIGUod2luZG93LmRldmljZVBpeGVsUmF0aW8+MT8hMDohMSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzgpLGM9cihwKSxmPTk5OSxkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5fc2V0U3RhdGUoZSksbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTdGF0ZSh0aGlzLnByb3BzKSx0aGlzLl9oYW5kbGVUZXh0T3ZlcmZsb3coKX19LHtrZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToiY29tcG9uZW50RGlkVXBkYXRlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0idGV4dENvbnRhaW5lcl9fdGV4dCI7dCs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciBuPXtmb250U2l6ZTp0aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4fTtyZXR1cm4gT2JqZWN0LmFzc2lnbihuLHRoaXMucHJvcHMuc3R5bGUpLHRoaXMucHJvcHMudGV4dD9sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOmZ1bmN0aW9uKHQpe2Uubm9kZT10fSxzdHlsZTpuLGNsYXNzTmFtZToidGV4dENvbnRhaW5lciIrKHRoaXMuc3RhdGUudXNlQ3NzVHJ1bmNhdGlvbj8iIGgtZWxsaXBzaXMiOiIiKX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtyZWY6ZnVuY3Rpb24odCl7ZS5zcGFuPXR9LGNsYXNzTmFtZTp0LGlkOnRoaXMucHJvcHMudGV4dElkfSx0aGlzLnByb3BzLnRleHQpKTpudWxsfX0se2tleToiX3NldFN0YXRlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1PYmplY3QuYXNzaWduKHt9LGUuZm9udCk7dGhpcy5zdGF0ZT17Zm9udDp0LHVzZUNzc1RydW5jYXRpb246dC5tYXhMaW5lcz8xPT09dC5tYXhMaW5lczohMCxuZWVkc1RpdGxlQXR0cmlidXRlOiExLG9yaWdpbmFsVGV4dDplLnRleHR9fX0se2tleToiX3Nob3dUb29sdGlwIix2YWx1ZTpmdW5jdGlvbihlKXtlPygwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5hdHRyKCJ0aXRsZSIsdGhpcy5zdGF0ZS5vcmlnaW5hbFRleHQpOigwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5yZW1vdmVBdHRyKCJ0aXRsZSIpfX0se2tleToiX2hhbmRsZVRleHRPdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLm5vZGUpaWYodGhpcy5zdGF0ZS51c2VDc3NUcnVuY2F0aW9uKXt2YXIgZT0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5fc2hvd1Rvb2x0aXAoZS50ZXh0T3ZlcmZsb3coKSl9ZWxzZSB0aGlzLl90cnVuY2F0ZU11bHRpTGluZVRleHQoKX19LHtrZXk6Il90cnVuY2F0ZU11bHRpTGluZVRleHQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9Ii4uLiIsdD0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5zcGFuLmlubmVySFRNTD10aGlzLnN0YXRlLm9yaWdpbmFsVGV4dDt2YXIgbj0oMCxjWyJkZWZhdWx0Il0pKHRoaXMuc3BhbikuZGVjb2RlRW50aXRpZXMoKTt0aGlzLm5vZGUuc3R5bGUuZm9udFNpemU9dGhpcy5zdGF0ZS5mb250Lm1heEZvbnRQeCsicHgiO2Zvcih2YXIgcj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsbz10aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4LGk9ITEsYT0wO3I+dGhpcy5zdGF0ZS5mb250Lm1heExpbmVzfHx0LmNoaWxkcmVuT3ZlcmZsb3coKTspe2lmKG88PXRoaXMuc3RhdGUuZm9udC5taW5Gb250UHgpe2l8fChuKz1lLGk9ITApO3ZhciBzPW4ubGVuZ3RoO249bi5zdWJzdHIoMCxzLWUubGVuZ3RoLTEpK2UsdGhpcy5zcGFuLmlubmVySFRNTD1ufWVsc2Ugby0tLHRoaXMubm9kZS5zdHlsZS5mb250U2l6ZT1vKyJweCI7aWYocj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsYSsrLGE+ZilicmVha310aGlzLl9zaG93VG9vbHRpcChpKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9IlRleHRDb250YWluZXIiLGQucHJvcFR5cGVzPXt0ZXh0OnUuUHJvcFR5cGVzLnN0cmluZyxhZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGZvbnQ6dS5Qcm9wVHlwZXMub2JqZWN0LHRleHRJZDp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm5vZGU9dH1yZXR1cm4gcihlLFt7a2V5OiJnZXQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm5vZGVbZV19fSx7a2V5OiJmaW5kIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwodCkpfX0se2tleToicGFyZW50Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLm5vZGUucGFyZW50Tm9kZSl9fSx7a2V5OiJjaGlsZHJlbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5ub2RlLmNoaWxkcmVuKX19LHtrZXk6ImNzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm5vZGVbMF18fHRoaXMubm9kZSxyPW4uZ2V0QXR0cmlidXRlKCJzdHlsZSIpLG89cj9yLnNwbGl0KCI7IikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KCI6Iil9KTpbXSxpPXt9O28uZm9yRWFjaChmdW5jdGlvbihlKXtlWzBdJiYiIiE9PWVbMF0mJihpW2VbMF1dPWVbMV0pfSksaVtlXT10O3ZhciBhPSIiO3JldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ErPWUrIjoiK2lbZV0rIjsifSksbi5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKSx0aGlzfX0se2tleToiYXR0ciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHQ/KHRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoZSx0KSx0aGlzLm5vZGUpOnRoaXMubm9kZS5nZXRBdHRyaWJ1dGUoZSl9fSx7a2V5OiJyZW1vdmVBdHRyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ub2RlLnJlbW92ZUF0dHJpYnV0ZShlKSx0aGlzLm5vZGV9fSx7a2V5OiJvdXRlckhlaWdodCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLm5vZGUub2Zmc2V0SGVpZ2h0O3JldHVybiBlJiYodD1nZXRDb21wdXRlZFN0eWxlKHRoaXMubm9kZSksbis9cGFyc2VJbnQodC5tYXJnaW5Ub3ApK3BhcnNlSW50KHQubWFyZ2luQm90dG9tKSksbn19LHtrZXk6Im91dGVyV2lkdGgiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5ub2RlLm9mZnNldFdpZHRoO3JldHVybiBlJiYodD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5vZGUpLApuKz13aW5kb3cucGFyc2VJbnQodC5tYXJnaW5MZWZ0LDEwKSt3aW5kb3cucGFyc2VJbnQodC5tYXJnaW5SaWdodCwxMCkpLG59fSx7a2V5OiJ0ZXh0Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUudGV4dENvbnRlbnR8fHRoaXMubm9kZS5pbm5lckhUTUx8fCIifX0se2tleToiY2hpbGRyZW5PdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm91dGVyV2lkdGgoITApLG49MDtyZXR1cm4gdGhpcy5jaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24odCl7bis9bmV3IGUodCkub3V0ZXJXaWR0aCghMCl9KSwtMT50LW59fSx7a2V5OiJ0ZXh0T3ZlcmZsb3ciLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3V0ZXJXaWR0aCghMCk8dGhpcy5ub2RlLnNjcm9sbFdpZHRofX0se2tleToiZGVjb2RlRW50aXRpZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYodGhpcy5ub2RlLmlubmVySFRNTCl7dmFyIHQ9dGhpcy5ub2RlLmlubmVySFRNTDtyZXR1cm4gdD10LnJlcGxhY2UoLzxzY3JpcHRbXj5dKj4oW1xTXHNdKj8pPFwvc2NyaXB0Pi9naW0sIiIpLHQ9dC5yZXBsYWNlKC88XC8/XHcoPzpbXiInPl18IlteIl0qInwnW14nXSonKSo+L2dpbSwiIiksdD10LnJlcGxhY2UoL1x1MDBhMC9nLCIgIiksZS5pbm5lckhUTUw9dCx0PWUudGV4dENvbnRlbnR8fGUuaW5uZXJIVE1MfHwiIixlLnRleHRDb250ZW50PSIiLHR9cmV0dXJuIiJ9fV0pLGV9KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbyhlKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNyksYz1yKHApLGY9big3KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9InRleHRMaW5rIisodGhpcy5wcm9wcy5kaXNwbGF5QXNUZXh0PyIgdGV4dExpbmstLWRpc3BsYXlBc1RleHQiOiIiKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoZFsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6ZX19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7Zm9udDp0aGlzLnByb3BzLmZvbnQsdGV4dDp0aGlzLnByb3BzLnRleHQsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSx0ZXh0SWQ6dGhpcy5wcm9wcy50ZXh0SWR9KSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bInRleHRDb250YWluZXIiLCJjbGlja3Rocm91Z2hMaW5rIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZXh0TGluayIsaC5wcm9wVHlwZXM9e3RleHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpLmlzUmVxdWlyZWQsZm9udDp1LlByb3BUeXBlcy5vYmplY3QsdGV4dElkOnUuUHJvcFR5cGVzLnN0cmluZyxkaXNwbGF5QXNUZXh0OnUuUHJvcFR5cGVzLmJvb2wsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDMzKSxjPXIocCksZj1uKDcpLGQ9cihmKSxoPW4oMzcpLHk9cihoKSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0iYXNpbkltYWdlIjtyZXR1cm4gZSs9dGhpcy5wcm9wcy5leHRlbmRDb250YWluZXJIZWlnaHQ/IiBhc2luSW1hZ2UtLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIsZSs9dGhpcy5wcm9wcy5kZXNjcmlwdGlvbj8iIGFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uIjoiIixsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7ImRhdGEtYXNpbiI6dGhpcy5wcm9wcy5hc2luLGNsYXNzTmFtZTplfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3VybDp0aGlzLnByb3BzLmhyZWYsaXNPZmZzaXRlOiExLGNsaWNrVHJhY2tlclVybHM6dGhpcy5wcm9wcy5jbGlja1VybHMsYW5jaG9yUHJvcHM6e2NsYXNzTmFtZTplfX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtwYXRoOnRoaXMucHJvcHMucGF0aCxhbHQ6dGhpcy5wcm9wcy5hbHQsc3ByaXRlOnRoaXMucHJvcHMuc3ByaXRlLGV4dGVuZENvbnRhaW5lckhlaWdodDp0aGlzLnByb3BzLmV4dGVuZENvbnRhaW5lckhlaWdodCx3aWR0aDp0aGlzLnByb3BzLndpZHRoLGhlaWdodDp0aGlzLnByb3BzLmhlaWdodCxzeDp0aGlzLnByb3BzLnN4LHN5OnRoaXMucHJvcHMuc3kscWw6dGhpcy5wcm9wcy5xbCxyZXRpbmE6dGhpcy5wcm9wcy5yZXRpbmEsYWM6dGhpcy5wcm9wcy5hYyxtZXJnZVRhZ3M6dGhpcy5wcm9wcy5tZXJnZVRhZ3MsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pLHRoaXMucHJvcHMuZGVzY3JpcHRpb24mJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHlbImRlZmF1bHQiXSx7dGV4dDp0aGlzLnByb3BzLmRlc2NyaXB0aW9uLGZvbnQ6dGhpcy5wcm9wcy5kZXNjcmlwdGlvbkZvbnR9KSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lciIsImNsaWNrdGhyb3VnaExpbmsiLCJ0ZXh0Q29udGFpbmVyIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09bSxtLmRpc3BsYXlOYW1lPSJBc2luSW1hZ2UiLG0ucHJvcFR5cGVzPXtocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWx0OnUuUHJvcFR5cGVzLnN0cmluZyxzcHJpdGU6dS5Qcm9wVHlwZXMuYm9vbCxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxkZXNjcmlwdGlvbjp1LlByb3BUeXBlcy5zdHJpbmcsZGVzY3JpcHRpb25Gb250OnUuUHJvcFR5cGVzLm9iamVjdCx0aXRsZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LG9uTG9hZDp1LlByb3BUeXBlcy5mdW5jLGFzaW46dS5Qcm9wVHlwZXMuc3RyaW5nfSxtLmRlZmF1bHRQcm9wcz17YWM6ITAscmV0aW5hOiEwfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0icHJpY2UiO2UrPXRoaXMucHJvcHMuaXNKdW1ibz8iIHByaWNlLS1qdW1ibyI6IiIsZSs9dGhpcy5wcm9wcy5pc0xpc3Q/IiBwcmljZS0tbGlzdCI6IiIsZSs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciB0PSIiO2lmKHRoaXMucHJvcHMuaXNKdW1ibyl7dmFyIG49dGhpcy5wcm9wcy5wcmljZUluZm8ud2hvbGVBbW91bnQscj10aGlzLnByb3BzLnByaWNlSW5mby5kZWNpbWFsUGFydDt0PWxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOmUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0ludGVnZXJBbW91bnQifSxuKSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudCJ9LHIpKX1lbHNlIHQ9bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19hbW91bnQifSx0aGlzLnByb3BzLmFtb3VudCkpO3JldHVybiB0aGlzLnByb3BzLmhyZWYmJnRoaXMucHJvcHMuY2xpY2tVcmxzP2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJwcmljZSJ9fSx0KTp0fX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iUHJpY2UiLGYucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjdXJyZW5jeTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxpc0p1bWJvOnUuUHJvcFR5cGVzLmJvb2wscHJpY2VJbmZvOnUuUHJvcFR5cGVzLm9iamVjdCxpc0xpc3Q6dS5Qcm9wVHlwZXMuYm9vbCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3QsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNSksYz1yKHApLGY9big0MyksZD1yKGYpLGg9big3KSx5PXIoaCksbT0iL2ltYWdlcy9HLyR7bWVkaWF9L2RhL2NyZWF0aXZlcy9wcmltZS0yeC0yMDE3MDYxNC5wbmciLGI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiZ2V0UHJpbWVMb2dvUGF0aCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGRbImRlZmF1bHQiXS5jb21waWxlKG0se21lZGlhOmV9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFByaW1lTG9nb1BhdGgodGhpcy5wcm9wcy5tZWRpYSksdD1sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3BhdGg6ZSx3aWR0aDoiNDMiLGhlaWdodDoiMTIiLGFsdDoiUHJpbWUiLGFkZGl0aW9uYWxDbGFzczoicHJpbWVMb2dvIixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSk7cmV0dXJuIHRoaXMucHJvcHMuaHJlZiYmdGhpcy5wcm9wcy5jbGlja1VybHM/bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoeVsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6InByaW1lTG9nbyJ9fSx0KTp0fX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWIsYi5kaXNwbGF5TmFtZT0iUHJpbWVMb2dvIixiLnByb3BUeXBlcz17bWVkaWE6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKSxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtuKHRoaXMsZSl9cmV0dXJuIHIoZSxbe2tleToiY29tcGlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt0Lmhhc093blByb3BlcnR5KG4pJiYoZT1lLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFwkeyIrbisifSIsImciKSx0W25dKSl9KSxlfX1dKSxlfSgpO2UuZXhwb3J0cz1uZXcgb30sLCwsLCwsLCwsLCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzUpLGM9cihwKSxmPW4oNyksZD1yKGYpLGg9big0MykseT1yKGgpLG09bigzNiksYj1yKG0pLHY9big1OSksZz1uKDYxKSxfPSIvaW1hZ2VzL0cvJHttZWRpYX0vZGEvY3JlYXRpdmVzL2F1aS1taW5pLXNwcml0ZS0yMDE1LTAyLnBuZyIsUD0iL2ltYWdlcy9HLyR7bWVkaWF9L2RhL2NyZWF0aXZlcy9hdWktbWluaS1zcHJpdGUtMngtdjMucG5nIixrPXsiMS4wIjoiLTY0cHggMCIsMS41OiItMjE4cHggMCIsIjIuMCI6Ii00OHB4IDAiLDIuNToiLTIwMnB4IDAiLCIzLjAiOiItMzJweCAwIiwzLjU6Ii0xODZweCAwIiwiNC4wIjoiLTE2cHggMCIsNC41OiItMTcwcHggMCIsIjUuMCI6IjAgMCJ9LFQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtyZXRpbmE6ITF9LG59cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7KDAsYlsiZGVmYXVsdCJdKShmdW5jdGlvbih0KXtlLnNldFN0YXRlKHtyZXRpbmE6dH0pfSl9fSx7a2V5OiJnZXRTdGFyc1BhdGgiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHlbImRlZmF1bHQiXS5jb21waWxlKHQ/UDpfLHttZWRpYTplfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTdGFyc1BhdGgodGhpcy5wcm9wcy5tZWRpYSx0aGlzLnN0YXRlLnJldGluYSksdD0oMCxnLmdldFJvdW5kZWRTdGFyUmF0aW5nKSh0aGlzLnByb3BzLnJhdGluZyksbj1rW3RdLHI9e2JhY2tncm91bmRQb3NpdGlvbjpufTtyZXR1cm4gbiYmdGhpcy5wcm9wcy5jb3VudCYmdGhpcy5wcm9wcy5jb3VudD4wP2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJzdGFyUmF0aW5nIn19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7cGF0aDplLHNwcml0ZTohMCxzdHlsZTpyLGFkZGl0aW9uYWxDbGFzczoic3RhclJhdGluZ19fc3RhcnMifSksdGhpcy5wcm9wcy5jb3VudCYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InN0YXJSYXRpbmdfX2NvdW50IixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSwoMCx2LmZvcm1hdE51bWJlcikodGhpcy5wcm9wcy5jb3VudCwwLHRoaXMucHJvcHMubWFya2V0UGxhY2UpKSk6bnVsbH19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsibWVkaWFDZW50cmFsSW1hZ2UiLCJjbGlja3Rocm91Z2hMaW5rIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09VCxULmRpc3BsYXlOYW1lPSJTdGFyUmF0aW5nIixULnByb3BUeXBlcz17cmF0aW5nOnUuUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLGNvdW50OnUuUHJvcFR5cGVzLm51bWJlcixtZWRpYTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxtYXJrZXRQbGFjZTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dmFyIG89big2MCksaT1yKG8pLGE9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAsbj1hcmd1bWVudHNbMl0scj0iLiIsbz0iLCI7biYmL14oREV8RlJ8SVR8RVN8QlIpJC9pLnRlc3QobikmJihyPSIsIixvPSIuIik7dmFyIGk9MSplLGE9aS50b0ZpeGVkKHQpLHM9YS50b1N0cmluZygpLnNwbGl0KCIuIiksdT1zWzBdLGw9c1sxXSxwPXUucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZyxvKTtyZXR1cm4gbD9wK3IrbDpwfTtlLmV4cG9ydHMuZm9ybWF0TnVtYmVyPWEsZS5leHBvcnRzLmZvcm1hdEN1cnJlbmN5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1zKGUsdCk7cmV0dXJuIG49ci5pc1RyYWlsaW5nU3ltYm9sP3IubnVtYmVyKyIgIityLnN5bWJvbDpyLnN5bWJvbCtyLm51bWJlcn07dmFyIHM9ZnVuY3Rpb24odCxuKXt2YXIgcj1pWyJkZWZhdWx0Il1bbl0sbz0vXihERXxGUnxJVHxFUykkL2kudGVzdChuKSxhPSJKUCI9PT1uLHM9ci5jdXJyZW5jeSx1PWUuZXhwb3J0cy5mb3JtYXROdW1iZXIodCxhPzA6MixuKTtyZXR1cm57c3ltYm9sOnMsbnVtYmVyOnUsaXNUcmFpbGluZ1N5bWJvbDpvfX07ZS5leHBvcnRzLmdldFByaWNlT2JqZWN0PXMsZS5leHBvcnRzLmZvcm1hdERhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIixyPSIiLG89IiIsYT0iIjtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciBzPWUuc3BsaXQoIi0iKTtuPXNbMl0scj1zWzFdLG89aVsiZGVmYXVsdCJdW3RdLmxvY2FsZU1vbnRoc1tyLTFdLGE9c1swXX1lbHNlIG49ZS5nZXREYXRlKCksbz1pWyJkZWZhdWx0Il1bdF0ubG9jYWxlTW9udGhzW2UuZ2V0TW9udGgoKV0sYT1lLmdldEZ1bGxZZWFyKCk7dmFyIHU9dm9pZCAwO3N3aXRjaCh0KXtjYXNlIkZSIjpjYXNlIklUIjpjYXNlIkVTIjp1PW4rIiAiK28udG9Mb3dlckNhc2UoKSsiICIrYTticmVhaztjYXNlIkRFIjp1PW4rIi4gIitvKyIgIithO2JyZWFrO2Nhc2UiSlAiOnU9YSsi5bm0IityKyLmnIgiK24rIuaXpSI7YnJlYWs7ZGVmYXVsdDp1PW8rIiAiK24rIiwgIithfXJldHVybiB1fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtVUzp7c2VsZWN0aW9uTGFiZWw6IkVuZ2xpc2ggKFVTKSIscmVnaW9uOiJuYSIsY3VycmVuY3k6IiQiLGRvbWFpbjoiYW1hem9uLmNvbSIsbWVkaWE6IjAxIixtZXJjaGFudElkOiJBVFZQREtJS1gwREVSIixtYXJrZXRwbGFjZUlkOiJBVFZQREtJS1gwREVSIixsb2NhbGVNb250aHM6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LENBOntzZWxlY3Rpb25MYWJlbDoiRW5nbGlzaCAoQ0EpIixyZWdpb246Im5hIixjdXJyZW5jeToiQ0ROJCAiLGRvbWFpbjoiYW1hem9uLmNhIixtZWRpYToiMTUiLG1lcmNoYW50SWQ6IkEzRFdZSUs2WTlFRVFCIixtYXJrZXRwbGFjZUlkOiJBMkVVUTFXVEdDVEJHMiIsbG9jYWxlTW9udGhzOlsiSmFuIiwiRmViIiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVnIiwiU2VwdCIsIk9jdCIsIk5vdiIsIkRlYyJdfSxVSzp7c2VsZWN0aW9uTGFiZWw6IkVuZ2xpc2ggKFVLKSIscmVnaW9uOiJldSIsY3VycmVuY3k6IsKjIixkb21haW46ImFtYXpvbi5jby51ayIsbWVkaWE6IjAyIixtZXJjaGFudElkOiJBM1A1Uk9LTDVBMU9MRSIsbWFya2V0cGxhY2VJZDoiQTFGODNHOEMyQVJPN1AiLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX0sREU6e3NlbGVjdGlvbkxhYmVsOiJHZXJtYW4iLHJlZ2lvbjoiZXUiLGN1cnJlbmN5OiJFVVIgIixkb21haW46ImFtYXpvbi5kZSIsbWVkaWE6IjAzIixtZXJjaGFudElkOiJBM0pXS0FLUjhYQjdYRiIsbWFya2V0cGxhY2VJZDoiQTFQQTY3OTVVS01GUjkiLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk3DpHJ6IiwiQXByIiwiTWFpIiwiSnVuaSIsIkp1bGkiLCJBdWciLCJTZXB0IiwiT2t0IiwiTm92IiwiRGV6Il19LEZSOntzZWxlY3Rpb25MYWJlbDoiRnJlbmNoIixyZWdpb246ImV1IixjdXJyZW5jeToiRVVSICIsZG9tYWluOiJhbWF6b24uZnIiLG1lZGlhOiIwOCIsbWVyY2hhbnRJZDoiQTFYNkZLNVJESE5COTYiLG1hcmtldHBsYWNlSWQ6IkExM1YxSUIzVklZWlpIIixsb2NhbGVNb250aHM6WyJKYW4uIiwiRsOpdnIuIiwiTWFycyIsIkF2ci4iLCJNYWkiLCJKdWluIiwiSnVpbC4iLCJBb8O7dCIsIlNlcHQuIiwiT2N0LiIsIk5vdi4iLCJEw6ljLiJdfSxJVDp7c2VsZWN0aW9uTGFiZWw6Ikl0YWxpYW4iLHJlZ2lvbjoiZXUiLGN1cnJlbmN5OiJFVVIgIixkb21haW46ImFtYXpvbi5pdCIsbWVkaWE6IjI5IixtZXJjaGFudElkOiJBMTFJTDJQTldZSlU3SCIsbWFya2V0cGxhY2VJZDoiQVBKNkpSQTlORzVWNCIsbG9jYWxlTW9udGhzOlsiR2VuIiwiRmViIiwiTWFyIiwiQXByIiwiTWFnIiwiR2l1IiwiTHVnIiwiQWdvIiwiU2V0IiwiT3R0IiwiTm92IiwiRGljIl19LEVTOntzZWxlY3Rpb25MYWJlbDoiU3BhbmlzaCIscmVnaW9uOiJldSIsY3VycmVuY3k6IkVVUiAiLGRvbWFpbjoiYW1hem9uLmVzIixtZWRpYToiMzAiLG1lcmNoYW50SWQ6IkExQVQ3WVZQRkJXWEJMIixtYXJrZXRwbGFjZUlkOiJBMVJLS1VQSUhDUzlIUyIsbG9jYWxlTW9udGhzOlsiRW5lIiwiRmViIiwiTWFyIiwiQWJyIiwiTWF5IiwiSnVuIiwiSnVsIiwiQWdvIiwiU2VwIiwiT2N0IiwiTm92IiwiRGljIl19LElOOntzZWxlY3Rpb25MYWJlbDoiRW5nbGlzaCAoSU4pIixyZWdpb246ImV1IixjdXJyZW5jeToi4oK5Iixkb21haW46ImFtYXpvbi5pbiIsbWVkaWE6IjMxIixtZXJjaGFudElkOiJBVDk1SUc5T05aRDdTIixtYXJrZXRwbGFjZUlkOiJBMjFUSlJVVU40S0dWIixsb2NhbGVNb250aHM6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LEpQOntzZWxlY3Rpb25MYWJlbDoiSmFwYW5lc2UiLHJlZ2lvbjoiZmUiLGN1cnJlbmN5OiLvv6UiLGRvbWFpbjoiYW1hem9uLmNvLmpwIixtZWRpYToiMDkiLG1lcmNoYW50SWQ6IkFOMVZSUUVORlJKTjUiLG1hcmtldHBsYWNlSWQ6IkExVkMzOFQ3WVhCNTI4Iix5ZWFyVGV4dDoiw6XCucK0IixkYXlUZXh0OiLDpuKAlMKlIixtb250aFRleHQ6IsOmxZPLhiIsbG9jYWxlTW9udGhzOlsiSmFuIiwiRmViIiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVnIiwiU2VwdCIsIk9jdCIsIk5vdiIsIkRlYyJdfSxDTjp7c2VsZWN0aW9uTGFiZWw6IiIscmVnaW9uOiJjbiIsY3VycmVuY3k6IsKlICIsZG9tYWluOiJhbWF6b24uY24iLG1lZGlhOiIyOCIsbWVyY2hhbnRJZDoiQTFBSjE5UFNCNjZUR1UiLG1hcmtldHBsYWNlSWQ6IkFBSEtWMlg3QUZZTFciLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX19fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIkFyZ3VtZW50IHJhd1N0YXJSYXRpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgYSBudW1iZXIiKTtyZXR1cm4oTWF0aC5yb3VuZCgyKmUpLzIpLnRvRml4ZWQoMSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0Um91bmRlZFN0YXJSYXRpbmc9bn0sLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9big0MSksYz1yKHApLGY9ITEsZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcy50YXhNZXNzYWdlJiYiIiE9PXRoaXMucHJvcHMudGF4TWVzc2FnZTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlQm94IixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSx0aGlzLnByb3BzLmxpc3RBbW91bnQmJmYmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7YW1vdW50OnRoaXMucHJvcHMubGlzdEFtb3VudCxjdXJyZW5jeTp0aGlzLnByb3BzLmN1cnJlbmN5LGlzTGlzdDohMCxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19saXN0IixzdHlsZTp0aGlzLnByb3BzLmxpc3RQcmljZVN0eWxlfSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHthbW91bnQ6dGhpcy5wcm9wcy5idXlBbW91bnQsY3VycmVuY3k6dGhpcy5wcm9wcy5jdXJyZW5jeSxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19idXkiLHN0eWxlOnRoaXMucHJvcHMuYnV5UHJpY2VTdHlsZX0pLGUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcmljZUJveF9fdGF4TWVzc2FnZSJ9LHRoaXMucHJvcHMudGF4TWVzc2FnZSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJwcmljZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWQsZC5kaXNwbGF5TmFtZT0iUHJpY2VCb3giLGQucHJvcFR5cGVzPXtidXlBbW91bnQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsbGlzdEFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcsY3VycmVuY3k6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsdGF4TWVzc2FnZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGJ1eVByaWNlU3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGxpc3RQcmljZVN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdH19LCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9big1KSxjPXIocCksZj1uKDI4KSxkPXIoZiksaD1uKDM4KSx5PXIoaCksbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe28odGhpcyx0KTt2YXIgbj1pKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSk7cmV0dXJuIG4uc3RydWN0dXJlPW5ldyBkWyJkZWZhdWx0Il0obi5nZXRTdHJ1Y3R1cmVzKCkpLG4uaW5pdFN0cnVjdHVyZShlKSxuLmNvbXBvbmVudHNNYXA9bi5nZXRDb21wb25lbnRzTWFwKCksbi5kb21SZWZzPXt9LG4uc3RhdGU9e3Nob3dMaXN0UHJpY2U6ITB9LG59cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImluaXRTdHJ1Y3R1cmUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZm9ybWF0dGVkUHJpY2UmJiIiIT09ZS5mb3JtYXR0ZWRQcmljZSYmIWUuaXNEaWdpdGFsO3RoaXMuc3RydWN0dXJlLmhpZGVCbG9jaygicHJpY2VCb3giLCF0KTt2YXIgbj10JiZlLmlzUHJpbWU7aWYodGhpcy5zdHJ1Y3R1cmUuaGlkZUJsb2NrKCJwcmltZUxvZ28iLCFuKSwiSlAiPT09dGhpcy5wcm9wcy5tYXJrZXRQbGFjZSl7dmFyIHI9dGhpcy5zdHJ1Y3R1cmUuZ2V0Q29tcG9uZW50UHJvcCgiaGVhZGxpbmUiLCJzdHlsZSIpO3ImJihyLnZhbHVlLmZvbnRTdHlsZT0ibm9ybWFsIix0aGlzLnN0cnVjdHVyZS5zZXRDb21wb25lbnRQcm9wKCJoZWFkbGluZSIsInN0eWxlIixyLnZhbHVlLCJjb25zdGFudCIpKX1lLm1vYmlsZUhlYWRsaW5lJiZ0aGlzLnN0cnVjdHVyZS5zZXRDb21wb25lbnRQcm9wKCJoZWFkbGluZSIsInRleHQiLCJtb2JpbGVIZWFkbGluZSIsInBhdGgiKX19LHtrZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZG9tUmVmcy5wcmljaW5nJiZ0aGlzLnNldFN0YXRlKHtzaG93TGlzdFByaWNlOiEoMCx5WyJkZWZhdWx0Il0pKHRoaXMuZG9tUmVmcy5wcmljaW5nKS5jaGlsZHJlbk92ZXJmbG93KCl9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnN0YXRlLnNob3dMaXN0UHJpY2U/dGhpcy5wcm9wcy5mb3JtYXR0ZWRMaXN0UHJpY2U6bnVsbDtyZXR1cm4gdGhpcy5zdHJ1Y3R1cmUuc2V0Q29tcG9uZW50UHJvcCgicHJpY2VCb3giLCJsaXN0QW1vdW50IixlLCJjb25zdGFudCIpLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7Y2xhc3NOYW1lOiJtb2JpbGVSYXZlbiIscmVuZGVyaW5nQ29udGV4dDp0aGlzLnByb3BzLHN0cnVjdHVyZTp0aGlzLnN0cnVjdHVyZS5tb2RlbCxjb21wb25lbnRzTWFwOnRoaXMuY29tcG9uZW50c01hcCxkb21SZWZzOnRoaXMuZG9tUmVmcyx1cGRhdGVPblJlc2l6ZTohMH0pfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPW0sbS5URU1QTEFURV9JRD0ibW9iaWxlUmF2ZW4iLG0uZGlzcGxheU5hbWU9Ik1vYmlsZVJhdmVuIixtLnByb3BUeXBlcz17fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPShyKHUpLG4oMTAzKSkscD1yKGwpLGM9bigxMDUpLGY9cihjKSxkPW4oMTA2KSxoPXIoZCkseT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRTdHJ1Y3R1cmVzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybigwLGZbImRlZmF1bHQiXSkoKX19LHtrZXk6ImdldENvbXBvbmVudHNNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHQuQ09NUE9ORU5UU19NQVB9fV0pLHR9KHBbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPXkseS5DT01QT05FTlRTX01BUD1oWyJkZWZhdWx0Il0seS5kaXNwbGF5TmFtZT0iTW9iaWxlUmF2ZW5Db250cm9sIix5LnByb3BUeXBlcz17fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJue2lkOiIwIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEyNXB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjAiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsd2lkdGg6IjE2MHB4IixoZWlnaHQ6IjEwMCUiLHBhZGRpbmc6IjVweCAxMHB4IDVweCAxMHB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJhc2luSW1hZ2UiLHByb3BzOlt7bmFtZToiaHJlZiIsdmFsdWU6ImFkTGluayIsdHlwZToicGF0aCJ9LHtuYW1lOiJjbGlja1VybHMiLHZhbHVlOiJjbGlja1VybHMiLHR5cGU6InBhdGgifSx7bmFtZToicGF0aCIsdmFsdWU6ImFzaW5JbWFnZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJhbHQiLHZhbHVlOiJwcm9kdWN0VGl0bGUiLHR5cGU6InBhdGgifSx7bmFtZToic3giLHZhbHVlOjgwLHR5cGU6ImNvbnN0YW50In1dfSxzdHlsZTpbe25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgMTI1cHgifV19LHtpZDoiMC4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiY2VudGVyIixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHdpZHRoOiIxMDAlIixwYWRkaW5nOiIwIDEwcHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMC4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCAwIDVweCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJoZWFkbGluZSJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InRleHRMaW5rIixwcm9wczpbe25hbWU6ImZvbnQiLHZhbHVlOnttYXhMaW5lczoyLG1pbkZvbnRQeDoxNixtYXhGb250UHg6MTh9LHR5cGU6ImNvbnN0YW50In0se25hbWU6InRleHQiLHZhbHVlOiJoZWFkbGluZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJocmVmIix2YWx1ZToiYWRMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJkaXNwbGF5QXNUZXh0Iix2YWx1ZTohMCx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMSIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA1cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoidGV4dExpbmsiLHByb3BzOlt7bmFtZToiZm9udCIsdmFsdWU6e21heExpbmVzOjEsbWluRm9udFB4OjEyLG1heEZvbnRQeDoxMn0sdHlwZToiY29uc3RhbnQifSx7bmFtZToidGV4dCIsdmFsdWU6InByb2R1Y3RUaXRsZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJocmVmIix2YWx1ZToiYWRMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJkaXNwbGF5QXNUZXh0Iix2YWx1ZTohMSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMiIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA0cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoic3RhclJhdGluZyIscHJvcHM6W3tuYW1lOiJyYXRpbmciLHZhbHVlOiJjdXN0b21lclJldmlld1N1bW1hcnkucmF0aW5nIix0eXBlOiJwYXRoIn0se25hbWU6ImNvdW50Iix2YWx1ZToiY3VzdG9tZXJSZXZpZXdTdW1tYXJ5LmNvdW50Iix0eXBlOiJwYXRoIn0se25hbWU6ImhyZWYiLHZhbHVlOiJyZXZpZXdMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJtZWRpYSIsdmFsdWU6ImkxOG4uc2V0dGluZ3MubWVkaWEiLHR5cGU6InBhdGgifSx7bmFtZToibWFya2V0UGxhY2UiLHZhbHVlOiJtYXJrZXRQbGFjZSIsdHlwZToicGF0aCJ9XX19LHtpZDoiMC4xLjAuMyIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljaW5nIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4xLjAuMy4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCA1cHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljZUJveCJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaWNlQm94Iixwcm9wczpbe25hbWU6ImJ1eUFtb3VudCIsdmFsdWU6ImZvcm1hdHRlZFByaWNlIix0eXBlOiJwYXRoIn0se25hbWU6Imxpc3RBbW91bnQiLHZhbHVlOiJmb3JtYXR0ZWRMaXN0UHJpY2UiLHR5cGU6InBhdGgifSx7bmFtZToiY3VycmVuY3kiLHZhbHVlOiJjdXJyZW5jeVN5bWJvbCIsdHlwZToicGF0aCJ9LHtuYW1lOiJ0YXhNZXNzYWdlIix2YWx1ZToiaTE4bi50YXhNZXNzYWdlIix0eXBlOiJwYXRoIn0se25hbWU6ImJ1eVByaWNlU3R5bGUiLHZhbHVlOntmb250U2l6ZToiMTVweCJ9LHR5cGU6ImNvbnN0YW50In0se25hbWU6Imxpc3RQcmljZVN0eWxlIix2YWx1ZTp7Zm9udFNpemU6IjEzcHgifSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMy4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3cifSxtZXRhZGF0YTpbe25hbWU6InJlZiIsdmFsdWU6InByaW1lTG9nbyJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaW1lTG9nbyIscHJvcHM6W3tuYW1lOiJtZWRpYSIsdmFsdWU6ImkxOG4uc2V0dGluZ3MubWVkaWEiLHR5cGU6InBhdGgifSx7c3R5bGU6e3dpZHRoOiIyOXB4IixoZWlnaHQ6IjEzcHgifX1dfSxzdHlsZTpbe25hbWU6Im92ZXJmbG93Iix2YWx1ZToidmlzaWJsZSJ9XX1dLGNzc0NsYXNzZXM6WyJibG9jay0taW5saW5lIiwiIl0sc3R5bGU6W3tuYW1lOiJ3aGl0ZVNwYWNlIix2YWx1ZToibm9ybWFsIn1dfV19LHtpZDoiMC4xLjEiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsbWFyZ2luOiIwIDEwcHggMCAxMHB4IixoZWlnaHQ6IjEyM3B4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxzdHlsZTpbe25hbWU6Im9wYWNpdHkiLHZhbHVlOiIwLjY0In0se25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgOXB4In1dLGNvbXBvbmVudDp7aWQ6Im1lZGlhQ2VudHJhbEltYWdlQ29udGFpbmVyIixwcm9wczpbe25hbWU6InBhdGgiLHZhbHVlOiIvaW1hZ2VzL0cvMDEvQW1hem9uQnJhbmRTdG9yZXNQbGF0Zm9ybS9ibGFja19hcnJvdy5wbmciLHR5cGU6ImNvbnN0YW50In0se25hbWU6ImFsdCIsdmFsdWU6IkdyYXkgQXJyb3ciLHR5cGU6ImNvbnN0YW50In0se25hbWU6InJvbGUiLHZhbHVlOiJwcmVzZW50YXRpb24iLHR5cGU6ImNvbnN0YW50In1dfX1dLHN0eWxlOlt7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6IiNGRkZGRkYifV19XSxzdHlsZTpbe25hbWU6ImJvcmRlciIsdmFsdWU6IjFweCBzb2xpZCAjZGRkIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiIjRkZGRkZGIn1dfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX12YXIgbz1uKDQwKSxpPXIobyksYT1uKDM5KSxzPXIoYSksdT1uKDU4KSxsPXIodSkscD1uKDc4KSxjPXIocCksZj1uKDQyKSxkPXIoZiksaD1uKDMzKSx5PXIoaCk7ZS5leHBvcnRzPXthc2luSW1hZ2U6aVsiZGVmYXVsdCJdLHRleHRMaW5rOnNbImRlZmF1bHQiXSxzdGFyUmF0aW5nOmxbImRlZmF1bHQiXSxwcmljZUJveDpjWyJkZWZhdWx0Il0scHJpbWVMb2dvOmRbImRlZmF1bHQiXSxtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lcjp5WyJkZWZhdWx0Il19fV0pOzt2YXIgJGFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkJykscmVuZGVyaW5nQ29udGV4dCA9IHsibWFya2V0UGxhY2UiOiJVUyIsImFkTGluayI6Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5HelM0ZWVFRmxGSHJKV2FXdUQ0WTBBQUFGaG1lRTI1QUVBQUFHUUFURHRZQzAvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wMTM0NjkyODg4P2FheGl0az1nN0dtaVFJWkhid1lxVWt0YTg5QUVBIiwicmV2aWV3TGluayI6Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5HelM0ZWVFRmxGSHJKV2FXdUQ0WTBBQUFGaG1lRTI1QUVBQUFHUUFURHRZQzAvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wMTM0NjkyODg4P2FheGl0az1nN0dtaVFJWkhid1lxVWt0YTg5QUVBI2N1c3RvbWVyUmV2aWV3cyIsImNyZWF0aXZlSWQiOiI3MTAyMjA5NTUwMDAxIiwiYWRJZCI6IjIwNTkwOTM0MjA3MDEiLCJwcm9kdWN0VGl0bGUiOiJMZWFybiBQeXRob24gMyB0aGUgSGFyZCBXYXk6IEEgVmVyeSBTaW1wbGUgSW50cm9kdWN0aW9uIHRvIHRoZSBUZXJyaWZ5aW5nbHkgQmVhdXRpZnVsIFdvcmxkIG9mIENvbXB1dGVycyBhbmQgQ29kZSAoWmVkIFNoYXcncyBIYXJkIFdheSBTZXJpZXMpIiwiaGVhZGxpbmUiOiJMZWFybiBQeXRob24gd2l0aCB0aGlzIHByb3ZlbiBtZXRob2QiLCJhc2luSW1hZ2UiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTF3ZEFRS0Z0cUwuX0FDX1NSMTI4LDE0NV8uanBnIiwidW5zcHJpdGVkSW1hZ2UiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTE2QTM1VTNBNkwuanBnIiwiY3VzdG9tZXJSZXZpZXdTdW1tYXJ5Ijp7InJhdGluZyI6My42Mjc2NTQwNzUsImNvdW50IjozNiwiYXNpbiI6IjAxMzQ2OTI4ODgifSwiYmFkZ2VJbmZvcm1hdGlvbk1hcCI6bnVsbCwiY3VycmVuY3lTeW1ib2wiOiIkIiwiZm9ybWF0dGVkTGlzdFByaWNlIjoiMzkuOTkiLCJmb3JtYXR0ZWRQcmljZSI6IjI0LjU3IiwicHJpY2VJbmZvIjp7Indob2xlQW1vdW50IjoiMjQiLCJkZWNpbWFsUGFydCI6IjU3In0sInByaWNlRm9ybWF0dGluZ0ZsYWdzIjp7ImlzU3ltYm9sU3VwZXJzY3JpcHQiOnRydWUsInN5bWJvbFBvc2l0aW9uIjoicHJlZml4ZWQifSwicHJpY2VQZXJVbml0TWVzc2FnZSI6IiIsImlzUHJpbWUiOnRydWUsImlzRGlnaXRhbCI6ZmFsc2UsImkxOG4iOnsic2V0dGluZ3MiOnsic2VsZWN0aW9uTGFiZWwiOiJFbmdsaXNoIChVUykiLCJyZWdpb24iOiJuYSIsImN1cnJlbmN5IjoiJCIsImRvbWFpbiI6ImFtYXpvbi5jb20iLCJtZWRpYSI6IjAxIiwibWVyY2hhbnRJZCI6IkFUVlBES0lLWDBERVIiLCJtYXJrZXRwbGFjZUlkIjoiQVRWUERLSUtYMERFUiIsImxvY2FsZU1vbnRocyI6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LCJ0YXhNZXNzYWdlIjoiIiwic3BvbnNvcmVkQnkiOiJTcG9uc29yZWQgYnkiLCJzaG9wTm93IjoiU2hvcCBub3ciLCJiZXN0U2VsbGVyIjoiQmVzdCBTZWxsZXIiLCJuZXdSZWxlYXNlIjoiTmV3IFJlbGVhc2UiLCJiYWRnZUluIjoiaW4ifSwiY2xpY2tVcmxzIjpbImh0dHBzOi8vcy5hbWF6b24tYWRzeXN0ZW0uY29tL2l1Mz9kPWZvcmVzdGVyLWRpZCZleC1mY2g9NDE2NzMxNjEzJmV4LWZhcmdzPT9pJTNEY2JOTGg1NFFXVVVlc2xacGE0UGhqUSUyNmFzaSUzRCUzQTAxMDFiMGRkOWU5ZWQ2ZTRkMTRlZTU5MmQxNDMwNzJjNTA1YTUzZTFlM2U3NmE2NTNhYjY2M2ZhMDEwZmVjOTkwMzg2JTI2Y2xpY2slM0QxJmNiPTE1MTg3MDUxMjkyMzQiXSwiYnJhbmRMb2dvIjoiaW1hZ2VzL1MvYWJzLWltYWdlLXVwbG9hZC1uYS8yL2Ftcy9BVFZQREtJS1gwREVSLzM2MTJjZTM1NjUxNmUxMTIyMjUyNjg4OTczZTVhMTYwLncyNDYuaDI2OS5fQ1IwLDAsMjQ2LDI2OV9TTDI4MF9TWTgwXy5qcGciLCJicmFuZE5hbWUiOiJBZGRpc29uLVdlc2xleSBQcm9mZXNzaW9uYWwiLCJwcm9kdWN0SW1hZ2UiOnsidXJsIjoiaHR0cHM6Ly9pbWFnZXMtbmEuc3NsLWltYWdlcy1hbWF6b24uY29tL2ltYWdlcy9JLzUxNkEzNVUzQTZMLmpwZyIsImhlaWdodCI6NTAwLCJ3aWR0aCI6Mzg0fX07aWYgKCRhZCkge1JlYWN0RE9NLnJlbmRlcihSZWFjdC5jcmVhdGVFbGVtZW50KExpYnJhcnkuZGVmYXVsdCwgcmVuZGVyaW5nQ29udGV4dCksICRhZCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYWRkVmlld2FiaWxpdHlMaXN0ZW5lcigkYWQpO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLmFkZENyZWF0aXZlQ2xpY2tMaXN0ZW5lcigkYWQpO308L3NjcmlwdD48L2JvZHk+PC9odG1sPjwvZGl2Pg==&quot;,&quot;enableAdBlockerDetector&quot;: false,&quot;disableResizeFunc&quot;: true,&quot;fallbackStaticAdImgUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdClickUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdExtraStyle&quot;: &quot;&quot;,&quot;advertisementTextOnTop&quot;: false,&quot;viewabilityStandards&quot;: [{&quot;p&quot;: 0, &quot;t&quot;: 0, &quot;def&quot;: &quot;amzn&quot;}, {&quot;p&quot;: 50, &quot;t&quot;: 1, &quot;def&quot;: &quot;iab&quot;}, {&quot;p&quot;: 100, &quot;t&quot;: 0, &quot;def&quot;: &quot;groupm&quot;}],&quot;ajaxWeblabTriggerId&quot;: &quot;&quot;}" title="Advertisement" data-arid="d4f0ef13f48c4b3c907f7e04775cdb08"><div id="ape_detail_mobile-hero-quick-promo_mweb_placement" style="text-align: center; position: absolute; height: 125px; width: 100%;" aria-hidden="true"><iframe name="{&quot;slot&quot;:&quot;detail_mobile-hero-quick-promo_mweb&quot;,&quot;pageType&quot;:&quot;detail&quot;,&quot;subPageType&quot;:&quot;mweb&quot;,&quot;slotName&quot;:&quot;mobile-hero-quick-promo&quot;,&quot;src&quot;:&quot;prefetchEnabled&quot;,&quot;adServer&quot;:&quot;cs&quot;,&quot;campaignId&quot;:&quot;11598&quot;,&quot;arid&quot;:&quot;d4f0ef13f48c4b3c907f7e04775cdb08&quot;,&quot;size&quot;:{&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;},&quot;maxAdWidth&quot;:&quot;&quot;,&quot;allowedSizes&quot;:[{&quot;width&quot;:&quot;414px&quot;,&quot;height&quot;:&quot;125px&quot;},{&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;}],&quot;allowedDomains&quot;:[&quot;g-ecx.images-amazon.com&quot;,&quot;images-na.ssl-images-amazon.com&quot;,&quot;d3l3lkinz3f56t.cloudfront.net&quot;,&quot;g-ecx.images-amazon.com&quot;,&quot;z-ecx.images-amazon.com&quot;,&quot;images-na.ssl-images-amazon.com&quot;,&quot;g-ec4.images-amazon.com&quot;,&quot;images-cn.ssl-images-amazon.com&quot;],&quot;loadAfter&quot;:&quot;immediate&quot;,&quot;extraDelay&quot;:0,&quot;iframeExtraStyle&quot;:&quot;width: 1px; min-width: 100%;&quot;,&quot;iframeClass&quot;:&quot;&quot;,&quot;iframeSandbox&quot;:&quot;&quot;,&quot;enablePrerenderLogic&quot;:false,&quot;adLabelWrapperId&quot;:&quot;ape_detail_mobile-hero-quick-promo_mweb_text-wrapper&quot;,&quot;adLabelId&quot;:&quot;ape_detail_mobile-hero-quick-promo_mweb_text&quot;,&quot;advTextWrapperDivStyle&quot;:&quot;position:relative; text-align:center; margin-left: -14px; margin-right: -14px; height: auto;&quot;,&quot;advertisementTextStyle&quot;:&quot;font-size: 10px; color: #555; text-align: right; margin: 0px 3px 6px 0;&quot;,&quot;advertisementTextHTMLContent&quot;:&quot;&quot;,&quot;advertisementTextHTMLContentEncoded&quot;:&quot;PGRpdiBpZD0iYXBlX2RldGFpbF9tb2JpbGUtaGVyby1xdWljay1wcm9tb19td2ViX3RleHQtd3JhcHBlciIgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlOyB0ZXh0LWFsaWduOmNlbnRlcjsgbWFyZ2luLWxlZnQ6IC0xNHB4OyBtYXJnaW4tcmlnaHQ6IC0xNHB4OyBoZWlnaHQ6IGF1dG87IiAgPjxkaXYgaWQ9ImFwZV9kZXRhaWxfbW9iaWxlLWhlcm8tcXVpY2stcHJvbW9fbXdlYl90ZXh0IiBzdHlsZT0iZm9udC1zaXplOiAxMHB4OyBjb2xvcjogIzU1NTsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbjogMHB4IDNweCA2cHggMDsiICA+QWR2ZXJ0aXNlbWVudDwvZGl2PjwvZGl2Pg==&quot;,&quot;adPixels&quot;:[],&quot;adPixelDelay&quot;:&quot;0&quot;,&quot;aaxImpPixelUrl&quot;:&quot;https://aax-us-east.amazon-adsystem.com/e/loi/imp?b=QnGzS4eeEFlFHrJWaWuD4Y0AAAFhmeE25AEAAAGQATDtYC0&quot;,&quot;aaxInstrPixelUrl&quot;:&quot;https://aax-us-east.amazon-adsystem.com/x/px/QnGzS4eeEFlFHrJWaWuD4Y0AAAFhmeE25AEAAAGQATDtYC0/&quot;,&quot;htmlContent&quot;:&quot;&quot;,&quot;htmlContentEncoded&quot;:&quot;PGRpdiBpZD0iYXBlX2RldGFpbF9tb2JpbGUtaGVyby1xdWljay1wcm9tb19td2ViX2NyZWF0aXZlV3JhcHBlciIgICA+PCFkb2N0eXBlIGh0bWw+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD1VVEYtOD48dGl0bGU+PC90aXRsZT48c3R5bGU+aHRtbHtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xpbmUtaGVpZ2h0OjEuMTU7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJX1ib2R5e21hcmdpbjowfWF7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwOm9iamVjdHN9YTphY3RpdmUsYTpob3ZlcntvdXRsaW5lLXdpZHRoOjB9aW1ne2JvcmRlci1zdHlsZTpub25lfSosOmFmdGVyLDpiZWZvcmV7Ym94LXNpemluZzpib3JkZXItYm94fWh0bWx7b3ZlcmZsb3c6aGlkZGVuO2ZvbnQtZmFtaWx5OkFyaWFsLEhlbHZldGljYSBOZXVlLEhlbHZldGljYSxzYW5zLXNlcmlmO2NvbG9yOiMxMTE7Zm9udC1zaXplOjE0cHh9YXtjb2xvcjojMDA2NmMwO3RleHQtZGVjb3JhdGlvbjpub25lfWE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtjb2xvcjojYzQ1NTAwfSNhZHstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0uYmxvY2t7ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVufS5ibG9jazplbXB0eXtkaXNwbGF5Om5vbmV9LmJsb2NrLS1qdXN0aWZ5LWNlbnRlcnstd2Via2l0LWp1c3RpZnktY29udGVudDpjZW50ZXI7LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uYmxvY2stLWp1c3RpZnktZmxleC1lbmR7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7LW1zLWZsZXgtcGFjazplbmQ7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5ibG9jay0tYWxpZ24tZmxleC1zdGFydHstd2Via2l0LWFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7LW1zLWZsZXgtYWxpZ246c3RhcnQ7LW1zLWdyaWQtcm93LWFsaWduOmZsZXgtc3RhcnQ7YWxpZ24taXRlbXM6ZmxleC1zdGFydH0uYmxvY2stLWFsaWduLWNlbnRlcnstd2Via2l0LWFsaWduLWl0ZW1zOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7LW1zLWdyaWQtcm93LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LmJsb2NrLS1hbGlnbi1mbGV4LWVuZHstd2Via2l0LWFsaWduLWl0ZW1zOmZsZXgtZW5kOy1tcy1mbGV4LWFsaWduOmVuZDstbXMtZ3JpZC1yb3ctYWxpZ246ZmxleC1lbmQ7YWxpZ24taXRlbXM6ZmxleC1lbmR9LmJsb2NrLS1kaXJlY3Rpb24tY29sdW1uey13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5ibG9jay0tYmFja2dyb3VuZCwuYmxvY2stLWJhY2tncm91bmQ+LmJsb2Nre3Bvc2l0aW9uOnJlbGF0aXZlfS5ibG9ja19fYmFja2dyb3VuZHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0uYmxvY2stLWxvY2t7LXdlYmtpdC1mbGV4LWdyb3c6MDstbXMtZmxleC1wb3NpdGl2ZTowO2ZsZXgtZ3JvdzowOy13ZWJraXQtZmxleC1zaHJpbms6MDstbXMtZmxleC1uZWdhdGl2ZTowO2ZsZXgtc2hyaW5rOjB9LmJsb2NrLS1pbmxpbmU6bm90KDplbXB0eSl7ZGlzcGxheTpibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udC1zaXplOjB9LmJsb2NrLS1pbmxpbmU6bm90KDplbXB0eSk+LmJsb2NrOm5vdCg6ZW1wdHkpe2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXNpemU6MTRweH0uaC1ub0ZsZXhib3ggLmJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktY2VudGVyPi5ibG9ja3t0ZXh0LWFsaWduOmxlZnR9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1mbGV4LWVuZHt0ZXh0LWFsaWduOnJpZ2h0fS5oLW5vRmxleGJveCAuYmxvY2stLWp1c3RpZnktZmxleC1lbmQ+LmJsb2Nre3RleHQtYWxpZ246bGVmdH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1mbGV4LXN0YXJ0Pi5ibG9ja3t2ZXJ0aWNhbC1hbGlnbjp0b3B9Lmgtbm9GbGV4Ym94IC5ibG9jay0tYWxpZ24tY2VudGVyPi5ibG9ja3t2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lmgtbm9GbGV4Ym94IC5ibG9jay0tYWxpZ24tZmxleC1lbmQ+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0uaC1ub0ZsZXhib3ggLmJsb2NrLS1kaXJlY3Rpb24tY29sdW1uPi5ibG9ja3tkaXNwbGF5OmJsb2NrfS5oLWNsb2Fre3Zpc2liaWxpdHk6aGlkZGVuIWltcG9ydGFudH0uaC1lbGxpcHNpc3tvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LmFzaW5JbWFnZXtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmFzaW5JbWFnZS0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0e2hlaWdodDphdXRvfS5hc2luSW1hZ2UtLWV4dGVuZENvbnRhaW5lckhlaWdodD4uaW1hZ2VDb250YWluZXJ7aGVpZ2h0OjEwMCV9LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9ue2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5hc2luSW1hZ2UtLXdpdGhEZXNjcmlwdGlvbj4uaW1hZ2VDb250YWluZXJ7bWFyZ2luLWJvdHRvbTo1cHh9LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uPi50ZXh0Q29udGFpbmVye21pbi1oZWlnaHQ6MTVweDt0ZXh0LWFsaWduOmNlbnRlcn0uaW1hZ2VDb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0uaW1hZ2VDb250YWluZXJfX2ltYWdle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtib3R0b206MDtyaWdodDowO21hcmdpbjphdXRvO3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5pbWFnZUNvbnRhaW5lci0tbGVmdHtkaXNwbGF5Oi13ZWJraXQtZmxleDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstd2Via2l0LWFsaWduLWl0ZW1zOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS5pbWFnZUNvbnRhaW5lci0tbGVmdD4uaW1hZ2VDb250YWluZXJfX2ltYWdle3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46MH0uaW1hZ2VDb250YWluZXItLXJpZ2h0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7bWFyZ2luOjA7bGVmdDphdXRvO2JvdHRvbTphdXRvO3RvcDphdXRvfS5pbWFnZUNvbnRhaW5lci0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0e2hlaWdodDphdXRvfS5pbWFnZUNvbnRhaW5lci0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpzdGF0aWM7bWFyZ2luOjAgYXV0b30udGV4dExpbmt7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlfS50ZXh0TGluay0tZGlzcGxheUFzVGV4dHtjb2xvcjojMTExfS50ZXh0TGluay0tZGlzcGxheUFzVGV4dDpob3Zlcntjb2xvcjojMTExO3RleHQtZGVjb3JhdGlvbjpub25lfS5za3kgLnRleHRMaW5re2ZvbnQtd2VpZ2h0OjYwMH0uc2t5IC50ZXh0TGluay0tZGlzcGxheUFzVGV4dCwuc2t5IC50ZXh0TGluay0tZGlzcGxheUFzVGV4dDpob3Zlcntjb2xvcjojMDAyZjM2fS5zdGFyUmF0aW5nX19zdGFyc3tkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTZweDt3aWR0aDo4MHB4O21hcmdpbi1yaWdodDo1cHg7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZTozNDRweCAxNXB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uc3RhclJhdGluZ19fY291bnR7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjE2cHh9LnN0YXJSYXRpbmc6aG92ZXI+LnN0YXJSYXRpbmdfX2NvdW50e3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9LnNreSAuc3RhclJhdGluZ19fY291bnR7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTNweH0ucHJpY2VCb3hfX2xpc3R7bWFyZ2luLXJpZ2h0OjRweH0ucHJpY2VCb3hfX3RheE1lc3NhZ2V7bWFyZ2luLWxlZnQ6NXB4O2ZvbnQtc2l6ZToxMXB4fS5wcmljZXtjb2xvcjojYjEyNzA0fS5wcmljZS0tbGlzdHtjb2xvcjojNTU1O3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2h9LnByaWNlLS1qdW1ib3tmb250LXNpemU6M2VtfS5wcmljZV9fanVtYm9DdXJyZW5jeSwucHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudCwucHJpY2VfX2p1bWJvSW50ZWdlckFtb3VudHt2ZXJ0aWNhbC1hbGlnbjp0b3A7Zm9udC13ZWlnaHQ6NTAwfS5wcmljZV9fanVtYm9DdXJyZW5jeSwucHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudHtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6LjRlbTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMzUlKTtmb250LXdlaWdodDo3MDB9LnByaWNlX19qdW1ib0ludGVnZXJBbW91bnR7bGV0dGVyLXNwYWNpbmc6LS41cHh9LnNreSAucHJpY2V7Y29sb3I6I2IxMjcwNH0ucHJpbWVMb2dve21hcmdpbi10b3A6MnB4fS50ZW1wbGF0ZUNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZX0udGVtcGxhdGVDb250YWluZXJfX2xpbmt7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO29wYWNpdHk6MH0uY2xpY2t0aHJvdWdoTGluazpub3QoLnRlbXBsYXRlQ29udGFpbmVyX19saW5rKXtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjJ9PC9zdHlsZT48c2NyaXB0PnZhciBtb2Rlcm5penI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihvKXtpZih0W29dKXJldHVybiB0W29dLmV4cG9ydHM7dmFyIHI9dFtvXT17ZXhwb3J0czp7fSxpZDpvLGxvYWRlZDohMX07cmV0dXJuIGVbb10uY2FsbChyLmV4cG9ydHMscixyLmV4cG9ydHMsbiksci5sb2FkZWQ9ITAsci5leHBvcnRzfXZhciB0PXt9O3JldHVybiBuLm09ZSxuLmM9dCxuLnA9IiIsbigwKX0oezA6ZnVuY3Rpb24oZSxuLHQpe2UuZXhwb3J0cz10KDIwKX0sMjA6ZnVuY3Rpb24oZSxuKXsidXNlIHN0cmljdCI7dmFyIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9OyFmdW5jdGlvbihlLG4sbyl7ZnVuY3Rpb24gcihlLG4pe3JldHVybigidW5kZWZpbmVkIj09dHlwZW9mIGU/InVuZGVmaW5lZCI6dChlKSk9PT1ufWZ1bmN0aW9uIHMoKXt2YXIgZSxuLHQsbyxzLGksbDtmb3IodmFyIGYgaW4gYilpZihiLmhhc093blByb3BlcnR5KGYpKXtpZihlPVtdLG49YltmXSxuLm5hbWUmJihlLnB1c2gobi5uYW1lLnRvTG93ZXJDYXNlKCkpLG4ub3B0aW9ucyYmbi5vcHRpb25zLmFsaWFzZXMmJm4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aCkpZm9yKHQ9MDt0PG4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aDt0KyspZS5wdXNoKG4ub3B0aW9ucy5hbGlhc2VzW3RdLnRvTG93ZXJDYXNlKCkpO2ZvcihvPXIobi5mbiwiZnVuY3Rpb24iKT9uLmZuKCk6bi5mbixzPTA7czxlLmxlbmd0aDtzKyspaT1lW3NdLGw9aS5zcGxpdCgiLiIpLDE9PT1sLmxlbmd0aD93W2xbMF1dPW86KCF3W2xbMF1dfHx3W2xbMF1daW5zdGFuY2VvZiBCb29sZWFufHwod1tsWzBdXT1uZXcgQm9vbGVhbih3W2xbMF1dKSksd1tsWzBdXVtsWzFdXT1vKSxnLnB1c2goKG8/IiI6Im5vLSIpK2wuam9pbigiLSIpKX19ZnVuY3Rpb24gaShlKXt2YXIgbj1TLmNsYXNzTmFtZSx0PXcuX2NvbmZpZy5jbGFzc1ByZWZpeHx8IiI7aWYoXyYmKG49bi5iYXNlVmFsKSx3Ll9jb25maWcuZW5hYmxlSlNDbGFzcyl7dmFyIG89bmV3IFJlZ0V4cCgiKF58XFxzKSIrdCsibm8tanMoXFxzfCQpIik7bj1uLnJlcGxhY2UobywiJDEiK3QrImpzJDIiKX13Ll9jb25maWcuZW5hYmxlQ2xhc3NlcyYmKG4rPSIgIit0K2Uuam9pbigiICIrdCksXz9TLmNsYXNzTmFtZS5iYXNlVmFsPW46Uy5jbGFzc05hbWU9bil9ZnVuY3Rpb24gbChlLG4pe3JldHVybiEhfigiIitlKS5pbmRleE9mKG4pfWZ1bmN0aW9uIGYoKXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2Ygbi5jcmVhdGVFbGVtZW50P24uY3JlYXRlRWxlbWVudChhcmd1bWVudHNbMF0pOl8/bi5jcmVhdGVFbGVtZW50TlMuY2FsbChuLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsYXJndW1lbnRzWzBdKTpuLmNyZWF0ZUVsZW1lbnQuYXBwbHkobixhcmd1bWVudHMpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFthLXpdKS0oW2Etel0pL2csZnVuY3Rpb24oZSxuLHQpe3JldHVybiBuK3QudG9VcHBlckNhc2UoKX0pLnJlcGxhY2UoL14tLywiIil9ZnVuY3Rpb24gdShlLG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KG4sYXJndW1lbnRzKX19ZnVuY3Rpb24gcChlLG4sdCl7dmFyIG87Zm9yKHZhciBzIGluIGUpaWYoZVtzXWluIG4pcmV0dXJuIHQ9PT0hMT9lW3NdOihvPW5bZVtzXV0scihvLCJmdW5jdGlvbiIpP3Uobyx0fHxuKTpvKTtyZXR1cm4hMX1mdW5jdGlvbiBkKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbQS1aXSkvZyxmdW5jdGlvbihlLG4pe3JldHVybiItIituLnRvTG93ZXJDYXNlKCl9KS5yZXBsYWNlKC9ebXMtLywiLW1zLSIpfWZ1bmN0aW9uIGMoKXt2YXIgZT1uLmJvZHk7cmV0dXJuIGV8fChlPWYoXz8ic3ZnIjoiYm9keSIpLGUuZmFrZT0hMCksZX1mdW5jdGlvbiBtKGUsdCxvLHIpe3ZhciBzLGksbCxhLHU9Im1vZGVybml6ciIscD1mKCJkaXYiKSxkPWMoKTtpZihwYXJzZUludChvLDEwKSlmb3IoO28tLTspbD1mKCJkaXYiKSxsLmlkPXI/cltvXTp1KyhvKzEpLHAuYXBwZW5kQ2hpbGQobCk7cmV0dXJuIHM9Zigic3R5bGUiKSxzLnR5cGU9InRleHQvY3NzIixzLmlkPSJzIit1LChkLmZha2U/ZDpwKS5hcHBlbmRDaGlsZChzKSxkLmFwcGVuZENoaWxkKHApLHMuc3R5bGVTaGVldD9zLnN0eWxlU2hlZXQuY3NzVGV4dD1lOnMuYXBwZW5kQ2hpbGQobi5jcmVhdGVUZXh0Tm9kZShlKSkscC5pZD11LGQuZmFrZSYmKGQuc3R5bGUuYmFja2dyb3VuZD0iIixkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGE9Uy5zdHlsZS5vdmVyZmxvdyxTLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLFMuYXBwZW5kQ2hpbGQoZCkpLGk9dChwLGUpLGQuZmFrZT8oZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpLFMuc3R5bGUub3ZlcmZsb3c9YSxTLm9mZnNldEhlaWdodCk6cC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHApLCEhaX1mdW5jdGlvbiB5KG4sdCl7dmFyIHI9bi5sZW5ndGg7aWYoIkNTUyJpbiBlJiYic3VwcG9ydHMiaW4gZS5DU1Mpe2Zvcig7ci0tOylpZihlLkNTUy5zdXBwb3J0cyhkKG5bcl0pLHQpKXJldHVybiEwO3JldHVybiExfWlmKCJDU1NTdXBwb3J0c1J1bGUiaW4gZSl7Zm9yKHZhciBzPVtdO3ItLTspcy5wdXNoKCIoIitkKG5bcl0pKyI6Iit0KyIpIik7cmV0dXJuIHM9cy5qb2luKCIgb3IgIiksbSgiQHN1cHBvcnRzICgiK3MrIikgeyAjbW9kZXJuaXpyIHsgcG9zaXRpb246IGFic29sdXRlOyB9IH0iLGZ1bmN0aW9uKGUpe3JldHVybiJhYnNvbHV0ZSI9PWdldENvbXB1dGVkU3R5bGUoZSxudWxsKS5wb3NpdGlvbn0pfXJldHVybiBvfWZ1bmN0aW9uIHYoZSxuLHQscyl7ZnVuY3Rpb24gaSgpe3AmJihkZWxldGUgTi5zdHlsZSxkZWxldGUgTi5tb2RFbGVtKX1pZihzPXIocywidW5kZWZpbmVkIik/ITE6cywhcih0LCJ1bmRlZmluZWQiKSl7dmFyIHU9eShlLHQpO2lmKCFyKHUsInVuZGVmaW5lZCIpKXJldHVybiB1fWZvcih2YXIgcCxkLGMsbSx2LGg9WyJtb2Rlcm5penIiLCJ0c3BhbiIsInNhbXAiXTshTi5zdHlsZSYmaC5sZW5ndGg7KXA9ITAsTi5tb2RFbGVtPWYoaC5zaGlmdCgpKSxOLnN0eWxlPU4ubW9kRWxlbS5zdHlsZTtmb3IoYz1lLmxlbmd0aCxkPTA7Yz5kO2QrKylpZihtPWVbZF0sdj1OLnN0eWxlW21dLGwobSwiLSIpJiYobT1hKG0pKSxOLnN0eWxlW21dIT09byl7aWYoc3x8cih0LCJ1bmRlZmluZWQiKSlyZXR1cm4gaSgpLCJwZngiPT1uP206ITA7dHJ5e04uc3R5bGVbbV09dH1jYXRjaCh4KXt9aWYoTi5zdHlsZVttXSE9dilyZXR1cm4gaSgpLCJwZngiPT1uP206ITB9cmV0dXJuIGkoKSwhMX1mdW5jdGlvbiBoKGUsbix0LG8scyl7dmFyIGk9ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLGw9KGUrIiAiK1Quam9pbihpKyIgIikraSkuc3BsaXQoIiAiKTtyZXR1cm4gcihuLCJzdHJpbmciKXx8cihuLCJ1bmRlZmluZWQiKT92KGwsbixvLHMpOihsPShlKyIgIit6LmpvaW4oaSsiICIpK2kpLnNwbGl0KCIgIikscChsLG4sdCkpfWZ1bmN0aW9uIHgoZSxuLHQpe3JldHVybiBoKGUsbyxvLG4sdCl9dmFyIGc9W10sYj1bXSxDPXtfdmVyc2lvbjoiMy4zLjEiLF9jb25maWc6e2NsYXNzUHJlZml4OiIiLGVuYWJsZUNsYXNzZXM6ITAsZW5hYmxlSlNDbGFzczohMCx1c2VQcmVmaXhlczohMH0sX3E6W10sb246ZnVuY3Rpb24oZSxuKXt2YXIgdD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtuKHRbZV0pfSwwKX0sYWRkVGVzdDpmdW5jdGlvbihlLG4sdCl7Yi5wdXNoKHtuYW1lOmUsZm46bixvcHRpb25zOnR9KX0sYWRkQXN5bmNUZXN0OmZ1bmN0aW9uKGUpe2IucHVzaCh7bmFtZTpudWxsLGZuOmV9KX19LHc9ZnVuY3Rpb24oKXt9O3cucHJvdG90eXBlPUMsdz1uZXcgdzt2YXIgUz1uLmRvY3VtZW50RWxlbWVudCxfPSJzdmciPT09Uy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFA9Ik1veiBPIG1zIFdlYmtpdCIsVD1DLl9jb25maWcudXNlUHJlZml4ZXM/UC5zcGxpdCgiICIpOltdO0MuX2Nzc29tUHJlZml4ZXM9VDt2YXIgej1DLl9jb25maWcudXNlUHJlZml4ZXM/UC50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik6W107Qy5fZG9tUHJlZml4ZXM9ejt2YXIgRT17ZWxlbTpmKCJtb2Rlcm5penIiKX07dy5fcS5wdXNoKGZ1bmN0aW9uKCl7ZGVsZXRlIEUuZWxlbX0pO3ZhciBOPXtzdHlsZTpFLmVsZW0uc3R5bGV9O3cuX3EudW5zaGlmdChmdW5jdGlvbigpe2RlbGV0ZSBOLnN0eWxlfSksQy50ZXN0QWxsUHJvcHM9aCxDLnRlc3RBbGxQcm9wcz14LC8qIQoJICB7CgkgICAgIm5hbWUiOiAiRmxleGJveCIsCgkgICAgInByb3BlcnR5IjogImZsZXhib3giLAoJICAgICJjYW5pdXNlIjogImZsZXhib3giLAoJICAgICJ0YWdzIjogWyJjc3MiXSwKCSAgICAibm90ZXMiOiBbewoJICAgICAgIm5hbWUiOiAiVGhlIF9uZXdfIGZsZXhib3giLAoJICAgICAgImhyZWYiOiAiaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzMy1mbGV4Ym94IgoJICAgIH1dLAoJICAgICJ3YXJuaW5ncyI6IFsKCSAgICAgICJBIGB0cnVlYCByZXN1bHQgZm9yIHRoaXMgZGV0ZWN0IGRvZXMgbm90IGltcGx5IHRoYXQgdGhlIGBmbGV4LXdyYXBgIHByb3BlcnR5IGlzIHN1cHBvcnRlZDsgc2VlIHRoZSBgZmxleHdyYXBgIGRldGVjdC4iCgkgICAgXQoJICB9CgkgICEqLwp3LmFkZFRlc3QoImZsZXhib3giLHgoImZsZXhCYXNpcyIsIjFweCIsITApKSwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3ggKGxlZ2FjeSkiLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94bGVnYWN5IiwKCSAgICAidGFncyI6IFsiY3NzIl0sCgkgICAgInBvbHlmaWxscyI6IFsiZmxleGllIl0sCgkgICAgIm5vdGVzIjogW3sKCSAgICAgICJuYW1lIjogIlRoZSBfb2xkXyBmbGV4Ym94IiwKCSAgICAgICJocmVmIjogImh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtZmxleGJveC0yMDA5MDcyMy8iCgkgICAgfV0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94bGVnYWN5Iix4KCJib3hEaXJlY3Rpb24iLCJyZXZlcnNlIiwhMCkpLC8qIQoJICB7CgkgICAgIm5hbWUiOiAiRmxleGJveCAodHdlZW5lcikiLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94dHdlZW5lciIsCgkgICAgInRhZ3MiOiBbImNzcyJdLAoJICAgICJwb2x5ZmlsbHMiOiBbImZsZXhpZSJdLAoJICAgICJub3RlcyI6IFt7CgkgICAgICAibmFtZSI6ICJUaGUgX2luYmV0d2Vlbl8gZmxleGJveCIsCgkgICAgICAiaHJlZiI6ICJodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9XRC1jc3MzLWZsZXhib3gtMjAxMTExMjkvIgoJICAgIH1dLAoJICAgICJ3YXJuaW5ncyI6IFsiVGhpcyByZXByZXNlbnRzIGFuIG9sZCBzeW50YXgsIG5vdCB0aGUgbGF0ZXN0IHN0YW5kYXJkIHN5bnRheC4iXQoJICB9CgkgICEqLwp3LmFkZFRlc3QoImZsZXhib3h0d2VlbmVyIix4KCJmbGV4QWxpZ24iLCJlbmQiLCEwKSkscygpLGkoZyksZGVsZXRlIEMuYWRkVGVzdCxkZWxldGUgQy5hZGRBc3luY1Rlc3Q7Zm9yKHZhciBqPTA7ajx3Ll9xLmxlbmd0aDtqKyspdy5fcVtqXSgpO2UuTW9kZXJuaXpyPXd9KHdpbmRvdyxkb2N1bWVudCl9fSk7O3ZhciBQZGFDbGllbnRBUEk9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyKXtpZihuW3JdKXJldHVybiBuW3JdLmV4cG9ydHM7dmFyIGk9bltyXT17ZXhwb3J0czp7fSxpZDpyLGxvYWRlZDohMX07cmV0dXJuIGVbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsdCksaS5sb2FkZWQ9ITAsaS5leHBvcnRzfXZhciBuPXt9O3JldHVybiB0Lm09ZSx0LmM9bix0LnA9IiIsdCgwKX0oW2Z1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigxNil9LCwsLCwsZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHdpbmRvdy5ldmVudDtyZXR1cm4gbih0KX07aWYoZS5hZGRFdmVudExpc3RlbmVyKWUuYWRkRXZlbnRMaXN0ZW5lcih0LHIsITApO2Vsc2UgaWYodD0ib24iK3QsZS5hdHRhY2hFdmVudCllLmF0dGFjaEV2ZW50KHQscik7ZWxzZXt2YXIgaT1lW3RdO2VbdF09ZnVuY3Rpb24oKXtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX19LCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxhPW4oOSksdT1yKGEpLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe2lmKGkodGhpcyxlKSx0aGlzLndpbmRvdz10LndpbmRvd3x8InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdywhdGhpcy53aW5kb3d8fCF0aGlzLndpbmRvdy5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoIldpbmRvdyBhbmQvb3IgZG9jdW1lbnQgaXMgbm90IGRlZmluZWQiKTt0aGlzLmRhY3hMb2dnZXI9dC5kYWN4TG9nZ2VyfHxuZXcgdVsiZGVmYXVsdCJdKHQuYmFzZVVybCx0LmltcHJlc3Npb25JZCx0LmFkU2Vzc2lvbklkKSx0aGlzLmFpZD10LmFkSWQsdGhpcy5jaWQ9dC5jcmVhdGl2ZUlkLHRoaXMuZGFjeExvZ2dlci5sb2dJbXByZXNzaW9uKCl9cmV0dXJuIG8oZSxbe2tleToiYXR0YWNoR2xvYmFscyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLndpbmRvdy5kb2N1bWVudC5hZD17YWlkOnRoaXMuYWRJZCxjaWQ6dGhpcy5jcmVhdGl2ZUlkfSx0aGlzLndpbmRvdy5EYWN4TG9nZ2VyPXRoaXMuZGFjeExvZ2dlcn19XSksZX0oKTt0WyJkZWZhdWx0Il09Y30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0LG4pe3JldHVybiB0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBhKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gdShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPW5ldyBmWyJkZWZhdWx0Il0oZSxkKSxyPXtpOnQuZGFjeEltcHJlc3Npb25JZCxhc2k6dC5kYWN4U2Vzc2lvbklkLGNsaWNrOjF9O3JldHVybiBuLmdldFBpeGVsVXJsKHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKTt0LmdlbmVyYXRlRGFjeENsaWNrVHJhY2tlclVybD1jO3ZhciBzPW4oMTApLGY9cihzKSxkPSI0MTY3MzE2MTMiLHA9ImNsaWVudF9pbXAiLGg9InZpZXciLHY9InN3aXBlIix5PS0xLGc9MSx3PTIsbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsbixyKXtvKHRoaXMsdCk7dmFyIGk9YSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSxkKSk7cmV0dXJuIGkuaW1wcmVzc2lvbklkPW4saS5hZFNlc3Npb25JZD1yLGl9cmV0dXJuIHUodCxlKSxsKHQsW3trZXk6ImxvZ01ldHJpYyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pKHtpOnRoaXMuaW1wcmVzc2lvbklkLGFzaTp0aGlzLmFkU2Vzc2lvbklkfSxlLHR8fDEpO3RoaXMuZmlyZVBpeGVsKG4pfX0se2tleToibG9nSW1wcmVzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhwKX19LHtrZXk6ImxvZ1ZpZXdhYmlsaXR5U3VjY2VzcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLGcpfX0se2tleToibG9nQmFyZVZpZXdhYmlsaXR5U3VjY2VzcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLHcpfX0se2tleToibG9nVmlld2FiaWxpdHlGYWlsdXJlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMubG9nTWV0cmljKGgseSl9fSx7a2V5OiJsb2dTd2lwZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyh2KX19XSksdH0oZlsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09bX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89bigxMSkuZ2V0UXVlcnlTdHJpbmcsYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtyKHRoaXMsZSksdGhpcy5iYXNlVXJsPXQsdGhpcy5jaGFubmVsPW59cmV0dXJuIGkoZSxbe2tleToiZ2V0UGl4ZWxVcmwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PSI/IitlbmNvZGVVUklDb21wb25lbnQobyhlKSk7cmV0dXJuIHRoaXMuYmFzZVVybCsiL2l1Mz9kPWZvcmVzdGVyLWRpZCZleC1mY2g9Iit0aGlzLmNoYW5uZWwrIiZleC1mYXJncz0iK3QrIiZjYj0iKyhuZXcgRGF0ZSkuZ2V0VGltZSgpfX0se2tleToiZmlyZVBpeGVsIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1uZXcgSW1hZ2U7cmV0dXJuIHQuc3JjPXRoaXMuZ2V0UGl4ZWxVcmwoZSksdH19XSksZX0oKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe3ZhciBuPVtdO2Zvcih2YXIgciBpbiBlKW4ucHVzaChyKyI9IitlW3JdKTt2YXIgaT1uLmpvaW4oIiYiKTtyZXR1cm4gdD9lbmNvZGVVUklDb21wb25lbnQoaSk6aX1mdW5jdGlvbiByKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtyPm47bisrKXQoZVtuXSxuLGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmdldFF1ZXJ5U3RyaW5nPW4sdC5mb3JFYWNoPXJ9LCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiBiKGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6YihpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oOCkscz1yKGwpLGY9bigxNyksZD1yKGYpLHA9bigxOCksaD1yKHApLHY9bigxOSkseT1yKHYpLGc9big2KSx3PVsiVEVUUklTX0lOTElORV9NRVNTQUdJTkciXSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7aSh0aGlzLHQpO3ZhciBuPW8odGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zaGF6YW1Mb2dnZXI9ZS5zaGF6YW1Mb2dnZXJ8fG5ldyBkWyJkZWZhdWx0Il0oZS5iYXNlVXJsLGUpLG4uc2hhemFtTG9nZ2VyLmxvZ0ltcHJlc3Npb24oKSxuLmNyZWF0aXZlQ2xpY2tMb2dnZXI9ZS5jcmVhdGl2ZUNsaWNrTG9nZ2VyfHxuZXcgeVsiZGVmYXVsdCJdKGUuYmFzZVVybCxlLmltcHJlc3Npb25JZCksbi50ZW1wbGF0ZU5hbWU9ZS50ZW1wbGF0ZU5hbWUsbn1yZXR1cm4gYSh0LGUpLHUodCxbe2tleToiYXR0YWNoR2xvYmFscyIsdmFsdWU6ZnVuY3Rpb24oKXtjKHQucHJvdG90eXBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQucHJvdG90eXBlKSwiYXR0YWNoR2xvYmFscyIsdGhpcykuY2FsbCh0aGlzKSx0aGlzLndpbmRvdy5TaGF6YW1Mb2dnZXI9dGhpcy5zaGF6YW1Mb2dnZXIsdGhpcy53aW5kb3cuVmlld2FiaWxpdHk9aFsiZGVmYXVsdCJdfX0se2tleToidHJhY2tMb2FkTGF0ZW5jeSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuc2hhemFtTG9nZ2VyLnN0YXJ0VGltZXIoZFsiZGVmYXVsdCJdLkVWRU5UX05BTUVTLkNSRUFUSVZFX0xPQURfTEFURU5DWSksKDAsZy5hZGRMaXN0ZW5lcikodGhpcy53aW5kb3csImxvYWQiLGZ1bmN0aW9uKHQpe2Uuc2hhemFtTG9nZ2VyLmVuZFRpbWVyKGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpfSl9fSx7a2V5OiJhZGRFcnJvckxpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy53aW5kb3cub25lcnJvcj1mdW5jdGlvbih0LG4scixpLG8pe2lmKG8mJm8uc3RhY2spe3ZhciBhPXQrIiA6ICIrby5zdGFjaztlLnNoYXphbUxvZ2dlci5hZGRDb3VudChkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuVU5DQVVHSFRfRVJST1IsYS5sZW5ndGg8NTAwP2E6YS5zdWJzdHJpbmcoMCw1MDApKX1lbHNlIGUuc2hhemFtTG9nZ2VyLmFkZENvdW50KGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5VTkNBVUdIVF9FUlJPUix0KyIgOiAiK24pfX19LHtrZXk6ImFkZFZpZXdhYmlsaXR5TGlzdGVuZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj0uNSxyPTFlMyxpPS4wMSxvPTEsYT1uZXcgaFsiZGVmYXVsdCJdKGUsdGhpcy53aW5kb3cpO2EuZ2V0UGVyY2VudEluVmlldygpPD0tMT90aGlzLmRhY3hMb2dnZXIubG9nVmlld2FiaWxpdHlGYWlsdXJlKCk6KGEub25WaWV3KGksbyxmdW5jdGlvbigpe3JldHVybiB0LmRhY3hMb2dnZXIubG9nQmFyZVZpZXdhYmlsaXR5U3VjY2VzcygpfSksYS5vblZpZXcobixyLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGFjeExvZ2dlci5sb2dWaWV3YWJpbGl0eVN1Y2Nlc3MoKX0pKX19LHtrZXk6ImFkZENyZWF0aXZlQ2xpY2tMaXN0ZW5lciIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt3LmluZGV4T2YodGhpcy50ZW1wbGF0ZU5hbWUpPj0wJiYoMCxnLmFkZExpc3RlbmVyKShlLCJjbGljayIsZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3QuY3JlYXRpdmVDbGlja0xvZ2dlci5sb2dDbGljayhuLGUub2Zmc2V0V2lkdGgsZS5vZmZzZXRIZWlnaHQpfX0oZSkpfX1dKSx0fShzWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT1tfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiB5KGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6eShpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oMTApLHM9cihsKSxmPS4xLGQ9ImNsbWV0IixwPSJkYS1jeC1tZXRyaWNzIixoPVsic2hhemFtSWQiLCJ0ZW1wbGF0ZU5hbWUiLCJsb2NhbGUiLCJhZFNlcnZlciIsInRlbXBsYXRlTWFqb3JWZXJzaW9uIiwidGVtcGxhdGVNaW5vclZlcnNpb24iLCJhZElkIiwiY3JlYXRpdmVJZCIsImltcHJlc3Npb25JZCJdLHY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4pe2kodGhpcyx0KTt2YXIgcj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlLHApKTtyZXR1cm4gci5zaG91bGRGaXJlTWV0cmljcz1NYXRoLnJhbmRvbSgpPD1mLHIudGltZXJzPXt9LHIuYWRJbmZvPW4saC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixlKSl0aHJvdyBuZXcgRXJyb3IoIlNoYXphbUxvZ2dlciBtaXNzaW5nIGFkSW5mbyBwcm9wZXJ0eTogIitlKX0pLHJ9cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImZpcmVQaXhlbCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5zaG91bGRGaXJlTWV0cmljcyYmKGUuaT1lbmNvZGVVUklDb21wb25lbnQodGhpcy5hZEluZm8uaW1wcmVzc2lvbklkKSxlLmFwcD1lbmNvZGVVUklDb21wb25lbnQoZCksYyh0LnByb3RvdHlwZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSksImZpcmVQaXhlbCIsdGhpcykuY2FsbCh0aGlzLGUpKX19LHtrZXk6ImxvZ0V2ZW50Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9e307aWYobnVsbCE9ZSYmbnVsbCE9dCl7dHJ5e24mJihyLnR5cGU9biksci5lbj1lLHIuZXY9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2goaSl7ci5zdHJpbmdpZnlOb3RBdmFpbGFibGU9MX10aGlzLmZpcmVQaXhlbChyKX19fSx7a2V5OiJsb2dJbXByZXNzaW9uIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuYWRJbmZvLHQ9e3M6ZS5zaGF6YW1JZCxuOmVuY29kZVVSSUNvbXBvbmVudChlLnRlbXBsYXRlTmFtZSksbDplLmxvY2FsZSxhczplLmFkU2VydmVyLHRtanY6ZS50ZW1wbGF0ZU1ham9yVmVyc2lvbix0bW52OmUudGVtcGxhdGVNaW5vclZlcnNpb24sYWk6ZS5hZElkLGNpOmUuY3JlYXRpdmVJZCxpOmUuaW1wcmVzc2lvbklkLGltcDoxfTtuYXZpZ2F0b3ImJih0LnVhPWVuY29kZVVSSUNvbXBvbmVudChuYXZpZ2F0b3IudXNlckFnZW50KSksdGhpcy5maXJlUGl4ZWwodCl9fSx7a2V5OiJzdGFydFRpbWVyIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnRpbWVyc1tlXT1uZXcgRGF0ZX19LHtrZXk6ImVuZFRpbWVyIix2YWx1ZTpmdW5jdGlvbihlKXtpZih0aGlzLnRpbWVyc1tlXSl7dmFyIG49bmV3IERhdGUtdGhpcy50aW1lcnNbZV07dGhpcy5sb2dFdmVudChlLG4sdC5FVkVOVF9UWVBFUy5USU1FUiksZGVsZXRlIHRoaXMudGltZXJzW2VdfX19LHtrZXk6ImFkZENvdW50Iix2YWx1ZTpmdW5jdGlvbihlLG4pe249bnx8MSx0aGlzLmxvZ0V2ZW50KGUsbix0LkVWRU5UX1RZUEVTLkNPVU5URVIpfX1dKSx0fShzWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT12LHYuRVZFTlRfVFlQRVM9e1RJTUVSOiJ0aW1lciIsQ09VTlRFUjoiY291bnRlciIsSlNPTjoianNvbiJ9LHYuRVZFTlRfTkFNRVM9e0JVWV9CT1hfTE9BRF9MQVRFTkNZOiJCdXlCb3hMb2FkTGF0ZW5jeSIsQUFOX0xBVEVOQ1k6IkFhbkxhdGVuY3kiLEFBTl9FUlJPUjoiQWFuRXJyb3IiLERST1BfRE9XTl9TRUxFQ1RPUjoiRHJvcERvd25TZWxlY3RvciIsVU5DQVVHSFRfRVJST1I6IlVuY2F1Z2h0RXJyb3IiLFVOREVGSU5FRF9UUkFDS0VSX0FSRzoiVW5kZWZpbmVkVHJhY2tlckFyZyIsQ09PUkRJTkFUT1JfVFJBQ0tFUjoiQ29vcmRpbmF0b3JUcmFja2VyIixJTUFHRV9MT0FEX0xBVEVOQ1k6IkltYWdlTG9hZExhdGVuY3kiLENSRUFUSVZFX0xPQURfTEFURU5DWToiQ3JlYXRpdmVMb2FkTGF0ZW5jeSJ9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcihlLHQpe3ZhciBuPWkodCkscj1vKHQpLHU9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPWEodS50b3AsdS5ib3R0b20sbiksbD1hKHUubGVmdCx1LnJpZ2h0LHIpLHM9YypsLGY9KHUuYm90dG9tLXUudG9wKSoodS5yaWdodC11LmxlZnQpO3JldHVybiBNYXRoLm1pbigxLE1hdGgubWF4KDAscy9mKSl9ZnVuY3Rpb24gaShlKXtyZXR1cm4gZS5pbm5lckhlaWdodHx8ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fWZ1bmN0aW9uIG8oZSl7cmV0dXJuIGUuaW5uZXJXaWR0aHx8ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh9ZnVuY3Rpb24gYShlLHQsbil7dmFyIHI9MDtyZXR1cm4gcj1lPjA/bi1lOnQ+MD9NYXRoLm1pbih0LG4pOjAsTWF0aC5taW4ocix0LWUpfWZ1bmN0aW9uIHUoZSl7dmFyIHQ9bnVsbCxuPWZ1bmN0aW9uIHIoKXtlKCl8fCh0PXNldFRpbWVvdXQociwxMDApKX07cmV0dXJuIG4oKSx7Y2xlYXI6ZnVuY3Rpb24oKXt0JiZjbGVhclRpbWVvdXQodCl9fX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXtuKHRoaXMsZSksdGhpcy53aW5kb3c9cnx8d2luZG93LHRoaXMuZWxlbT10fXJldHVybiBjKGUsW3trZXk6ImdldFBlcmNlbnRJblZpZXciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRUb3BXaW5kb3coKTtpZihlKXtpZih0aGlzLndpbmRvdz09PWUpcmV0dXJuIHIodGhpcy5lbGVtLGUpO2lmKHRoaXMud2luZG93LmZyYW1lRWxlbWVudClyZXR1cm4gcih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQsZSl9ZWxzZSBpZih0aGlzLndpbmRvdy4kc2YpdHJ5e3ZhciB0PXRoaXMud2luZG93LiRzZi5leHQuaW5WaWV3UGVyY2VudGFnZSgpfHwwO3JldHVybiB0LzEwMH1jYXRjaChuKXt9cmV0dXJuLTF9fSx7a2V5OiJnZXRUb3BXaW5kb3ciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9bnVsbDt0cnl7aWYoIXRoaXMud2luZG93LnRvcC5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImNyb3NzLWRvbWFpbiBleGNlcHRpb24iKTtlPXRoaXMud2luZG93LnRvcH1jYXRjaCh0KXt9cmV0dXJuIGV9fSx7a2V5OiJvblZpZXdUaHJlc2hvbGQiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMsbz1udWxsO3JldHVybiB1KGZ1bmN0aW9uKCl7aWYoaS5nZXRQZXJjZW50SW5WaWV3KCk+PWUmJmkuZ2V0UGVyY2VudEluVmlldygpPD10KXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTtpZihudWxsPT09bylvPWE7ZWxzZSBpZihhLW8+bilyZXR1cm4gcigpLCEwfWVsc2Ugbz1udWxsfSl9fSx7a2V5OiJvblZpZXciLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vblZpZXdUaHJlc2hvbGQoZSwxLHQsbil9fSx7a2V5OiJvbkhpZGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vblZpZXdUaHJlc2hvbGQoMCxlLHQsbil9fSx7a2V5OiJnZXRWZXJ0aWNhbFBvc2l0aW9uT25QYWdlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPS0xLHQ9dGhpcy5nZXRUb3BXaW5kb3coKTtpZih0KXtpZih0aGlzLndpbmRvdz09PXQpe3ZhciBuPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ascj1pKHQpLG89dGhpcy5lbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtlPU1hdGgubWF4KE1hdGgubWluKG4vKHItbyksMSksMCl9ZWxzZSBpZih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQpe3ZhciBuPXRoaXMud2luZG93LmZyYW1lRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ascj1pKHQpLG89dGhpcy53aW5kb3cuZnJhbWVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtlPU1hdGgubWF4KE1hdGgubWluKG4vKHItbyksMSksMCl9fWVsc2UgaWYodGhpcy53aW5kb3cuJHNmKXRyeXtlPU1hdGgubWF4KE1hdGgubWluKCRzZi5leHQuZ2VvbSgpLnNlbGYudC8oJHNmLmV4dC5nZW9tKCkud2luLmgtJHNmLmV4dC5nZW9tKCkuc2VsZi5oKSwxKSwwKX1jYXRjaChhKXt9cmV0dXJuIGV9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWx9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBpKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyhlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxjPWZ1bmN0aW9uIHYoZSx0LG4pe251bGw9PT1lJiYoZT1GdW5jdGlvbi5wcm90b3R5cGUpO3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZih2b2lkIDA9PT1yKXt2YXIgaT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIG51bGw9PT1pP3ZvaWQgMDp2KGksdCxuKX1pZigidmFsdWUiaW4gcilyZXR1cm4gci52YWx1ZTt2YXIgbz1yLmdldDtpZih2b2lkIDAhPT1vKXJldHVybiBvLmNhbGwobil9LGw9bigxMCkscz1yKGwpLGY9ImRhLWN4LW1ldHJpY3MiLGQ9IkNvb3JkaW5hdGVDbGljayIscD0ianNvbiIsaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsbil7aSh0aGlzLHQpO3ZhciByPW8odGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUsZikpO3JldHVybiByLmltcHJlc3Npb25JZD1uLHJ9cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImxvZ0NsaWNrIix2YWx1ZTpmdW5jdGlvbihlLG4scil7dmFyIGk9e30sbz17Y3hjOmUucGFnZVgsY3ljOmUucGFnZVksY3B3Om4sY3BoOnJ9O2kuZW49ZCxpLnR5cGU9cCxpLmk9dGhpcy5pbXByZXNzaW9uSWQ7dHJ5e2kuZXY9ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KG8pKX1jYXRjaChhKXtpLnN0cmluZ2lmeU5vdEF2YWlsYWJsZT0xfWModC5wcm90b3R5cGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLCJmaXJlUGl4ZWwiLHRoaXMpLmNhbGwodGhpcyxpKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09aH1dKTs7d2luZG93LnBkYWdTY29wZSA9IHdpbmRvdy5wZGFnU2NvcGUgfHwge307d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkgPSBuZXcgUGRhQ2xpZW50QVBJLmRlZmF1bHQoeyJiYXNlVXJsIjoiaHR0cHM6Ly9zLmFtYXpvbi1hZHN5c3RlbS5jb20iLCJzaGF6YW1JZCI6IjEzOTQzMzQ2IiwidGVtcGxhdGVOYW1lIjoiVEVUUklTX01PQklMRV9SQVZFTiIsInRlbXBsYXRlTWFqb3JWZXJzaW9uIjoiMSIsInRlbXBsYXRlTWlub3JWZXJzaW9uIjoiOSIsImxvY2FsZSI6IlVTIiwiYWRTZXJ2ZXIiOiJjb3JuZXJzdG9uZSIsImFkSWQiOiIyMDU5MDkzNDIwNzAxIiwiY3JlYXRpdmVJZCI6IjcxMDIyMDk1NTAwMDEiLCJpbXByZXNzaW9uSWQiOiJjYk5MaDU0UVdVVWVzbFpwYTRQaGpRIiwiYWRTZXNzaW9uSWQiOiIwMTAxYjBkZDllOWVkNmU0ZDE0ZWU1OTJkMTQzMDcyYzUwNWE1M2UxZTNlNzZhNjUzYWI2NjNmYTAxMGZlYzk5MDM4NiJ9KTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS50cmFja0xvYWRMYXRlbmN5KCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYXR0YWNoR2xvYmFscygpO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLmFkZEVycm9yTGlzdGVuZXIoKTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+PGRpdiBpZD1hZD48ZGl2IGNsYXNzPSJtb2JpbGVSYXZlbiB0ZW1wbGF0ZUNvbnRhaW5lciIgZGF0YS1jcmVhdGl2ZS1pZD0iNzEwMjIwOTU1MDAwMSIgZGF0YS1hZC1pZD0iMjA1OTA5MzQyMDcwMSIgZGF0YS1yZWFjdHJvb3Q9IiIgZGF0YS1yZWFjdGlkPSIxIiBkYXRhLXJlYWN0LWNoZWNrc3VtPSItNTM1ODQzODE2Ij48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayB0ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Rbkd6UzRlZUVGbEZIckpXYVd1RDRZMEFBQUZobWVFMjVBRUFBQUdRQVREdFlDMC9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzAxMzQ2OTI4ODg/YWF4aXRrPWc3R21pUUlaSGJ3WXFVa3RhODlBRUEiIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSIyIj48L2E+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMjVweDtib3JkZXI6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojRkZGRkZGOyIgZGF0YS1yZWFjdGlkPSIzIj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9IndpZHRoOjE2MHB4O2hlaWdodDoxMDAlO3BhZGRpbmc6NXB4IDEwcHggNXB4IDEwcHg7ZmxleDowIDAgMTI1cHg7IiBkYXRhLXJlYWN0aWQ9IjQiPjxkaXYgY2xhc3M9ImFzaW5JbWFnZSIgZGF0YS1yZWFjdGlkPSI1Ij48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayBhc2luSW1hZ2UiIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5HelM0ZWVFRmxGSHJKV2FXdUQ0WTBBQUFGaG1lRTI1QUVBQUFHUUFURHRZQzAvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wMTM0NjkyODg4P2FheGl0az1nN0dtaVFJWkhid1lxVWt0YTg5QUVBIiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iNiI+PGRpdiBjbGFzcz0iaW1hZ2VDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iNyI+PGltZyBjbGFzcz0ibWVkaWFDZW50cmFsSW1hZ2UgaW1hZ2VDb250YWluZXJfX2ltYWdlIiBzcmM9Imh0dHBzOi8vbS5tZWRpYS1hbWF6b24uY29tL2ltYWdlcy9JLzUxd2RBUUtGdHFMLl9BQ19TWDE2MF8uanBnIiBhbHQ9IkxlYXJuIFB5dGhvbiAzIHRoZSBIYXJkIFdheTogQSBWZXJ5IFNpbXBsZSBJbnRyb2R1Y3Rpb24gdG8gdGhlIFRlcnJpZnlpbmdseSBCZWF1dGlmdWwgV29ybGQgb2YgQ29tcHV0ZXJzIGFuZCBDb2RlIChaZWQgU2hhdyYjeDI3O3MgSGFyZCBXYXkgU2VyaWVzKSIgZGF0YS1yZWFjdGlkPSI4Ii8+PC9kaXY+PC9hPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0id2lkdGg6MTAwJTtiYWNrZ3JvdW5kOiNGRkZGRkY7IiBkYXRhLXJlYWN0aWQ9IjkiPjxkaXYgY2xhc3M9ImJsb2NrIGJsb2NrLS1qdXN0aWZ5LWNlbnRlciBibG9jay0tZGlyZWN0aW9uLWNvbHVtbiIgc3R5bGU9IndpZHRoOjEwMCU7cGFkZGluZzowIDEwcHggMCAwOyIgZGF0YS1yZWFjdGlkPSIxMCI+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJtYXJnaW46MCAwIDVweCAwOyIgZGF0YS1yZWFjdGlkPSIxMSI+PGEgY2xhc3M9ImNsaWNrdGhyb3VnaExpbmsgdGV4dExpbmsgdGV4dExpbmstLWRpc3BsYXlBc1RleHQiIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5HelM0ZWVFRmxGSHJKV2FXdUQ0WTBBQUFGaG1lRTI1QUVBQUFHUUFURHRZQzAvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wMTM0NjkyODg4P2FheGl0az1nN0dtaVFJWkhid1lxVWt0YTg5QUVBIiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iMTIiPjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxOHB4OyIgY2xhc3M9InRleHRDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iMTMiPjxzcGFuIGNsYXNzPSJ0ZXh0Q29udGFpbmVyX190ZXh0IiBkYXRhLXJlYWN0aWQ9IjE0Ij5MZWFybiBQeXRob24gd2l0aCB0aGlzIHByb3ZlbiBtZXRob2Q8L3NwYW4+PC9kaXY+PC9hPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgMCA1cHggMDsiIGRhdGEtcmVhY3RpZD0iMTUiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIHRleHRMaW5rIiBocmVmPSJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FuR3pTNGVlRUZsRkhySldhV3VENFkwQUFBRmhtZUUyNUFFQUFBR1FBVER0WUMwL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMDEzNDY5Mjg4OD9hYXhpdGs9ZzdHbWlRSVpIYndZcVVrdGE4OUFFQSIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjE2Ij48ZGl2IHN0eWxlPSJmb250LXNpemU6MTJweDsiIGNsYXNzPSJ0ZXh0Q29udGFpbmVyIGgtZWxsaXBzaXMiIGRhdGEtcmVhY3RpZD0iMTciPjxzcGFuIGNsYXNzPSJ0ZXh0Q29udGFpbmVyX190ZXh0IiBkYXRhLXJlYWN0aWQ9IjE4Ij5MZWFybiBQeXRob24gMyB0aGUgSGFyZCBXYXk6IEEgVmVyeSBTaW1wbGUgSW50cm9kdWN0aW9uIHRvIHRoZSBUZXJyaWZ5aW5nbHkgQmVhdXRpZnVsIFdvcmxkIG9mIENvbXB1dGVycyBhbmQgQ29kZSAoWmVkIFNoYXcmI3gyNztzIEhhcmQgV2F5IFNlcmllcyk8L3NwYW4+PC9kaXY+PC9hPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgMCA0cHggMDsiIGRhdGEtcmVhY3RpZD0iMTkiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIHN0YXJSYXRpbmciIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5HelM0ZWVFRmxGSHJKV2FXdUQ0WTBBQUFGaG1lRTI1QUVBQUFHUUFURHRZQzAvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wMTM0NjkyODg4P2FheGl0az1nN0dtaVFJWkhid1lxVWt0YTg5QUVBI2N1c3RvbWVyUmV2aWV3cyIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjIwIj48ZGl2IGNsYXNzPSJtZWRpYUNlbnRyYWxJbWFnZSBzdGFyUmF0aW5nX19zdGFycyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6dXJsKCYjeDI3O2h0dHBzOi8vbS5tZWRpYS1hbWF6b24uY29tL2ltYWdlcy9HLzAxL2RhL2NyZWF0aXZlcy9hdWktbWluaS1zcHJpdGUtMjAxNS0wMi5wbmcmI3gyNzspO2JhY2tncm91bmQtcG9zaXRpb246LTE4NnB4IDA7IiBkYXRhLXJlYWN0aWQ9IjIxIj48L2Rpdj48c3BhbiBjbGFzcz0ic3RhclJhdGluZ19fY291bnQiIGRhdGEtcmVhY3RpZD0iMjIiPjM2PC9zcGFuPjwvYT48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayBibG9jay0taW5saW5lICIgc3R5bGU9IndoaXRlLXNwYWNlOm5vcm1hbDsiIGRhdGEtcmVhY3RpZD0iMjMiPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgNXB4IDAgMDsiIGRhdGEtcmVhY3RpZD0iMjQiPjxzcGFuIGNsYXNzPSJwcmljZUJveCIgZGF0YS1yZWFjdGlkPSIyNSI+PHNwYW4gY2xhc3M9InByaWNlIHByaWNlQm94X19idXkiIHN0eWxlPSJmb250LXNpemU6MTVweDsiIGRhdGEtcmVhY3RpZD0iMjYiPjxzcGFuIGNsYXNzPSJwcmljZV9fY3VycmVuY3kiIGRhdGEtcmVhY3RpZD0iMjciPiQ8L3NwYW4+PHNwYW4gY2xhc3M9InByaWNlX19hbW91bnQiIGRhdGEtcmVhY3RpZD0iMjgiPjI0LjU3PC9zcGFuPjwvc3Bhbj48IS0tIHJlYWN0LXRleHQ6IDI5IC0tPjwhLS0gL3JlYWN0LXRleHQgLS0+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZTsiIGRhdGEtcmVhY3RpZD0iMzAiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIHByaW1lTG9nbyIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9kYS9jcmVhdGl2ZXMvcHJpbWUtMngtMjAxNzA2MTQucG5nIiB3aWR0aD0iNDMiIGhlaWdodD0iMTIiIGFsdD0iUHJpbWUiIGRhdGEtcmVhY3RpZD0iMzEiLz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDEwcHggMCAxMHB4O2hlaWdodDoxMjNweDtvcGFjaXR5OjAuNjQ7ZmxleDowIDAgOXB4OyIgZGF0YS1yZWFjdGlkPSIzMiI+PGRpdiBjbGFzcz0iaW1hZ2VDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iMzMiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIGltYWdlQ29udGFpbmVyX19pbWFnZSIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9BbWF6b25CcmFuZFN0b3Jlc1BsYXRmb3JtL2JsYWNrX2Fycm93LnBuZyIgYWx0PSJHcmF5IEFycm93IiByb2xlPSJwcmVzZW50YXRpb24iIGRhdGEtcmVhY3RpZD0iMzQiLz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC0xNS4zLjIubWluLmpzIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC1kb20tMTUuMy4yLm1pbi5qcyI+PC9zY3JpcHQ+PHNjcmlwdD52YXIgTGlicmFyeT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgbz1uW3JdPXtleHBvcnRzOnt9LGlkOnIsbG9hZGVkOiExfTtyZXR1cm4gZVtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyx0KSxvLmxvYWRlZD0hMCxvLmV4cG9ydHN9dmFyIG49e307cmV0dXJuIHQubT1lLHQuYz1uLHQucD0iIix0KDApfShbZnVuY3Rpb24oZSx0LG4pe24oMSksZS5leHBvcnRzPW4oMTA0KX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24mJihPYmplY3QuYXNzaWduPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIG49T2JqZWN0KGUpLHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgbz1hcmd1bWVudHNbcl07aWYobnVsbCE9bylmb3IodmFyIGkgaW4gbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobyxpKSYmKG5baV09b1tpXSl9cmV0dXJuIG59KX0sLGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPVJlYWN0fSwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDYpLGM9cihwKSxmPW4oMjcpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucHJvcHMudXBkYXRlT25SZXNpemUmJnRoaXMubGlzdGVuRm9yUmVzaXplKCl9fSx7a2V5OiJsaXN0ZW5Gb3JSZXNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczsidW5kZWZpbmVkIiE9dHlwZW9mIFNGQ2xpZW50JiZTRkNsaWVudCYmU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/U0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KToidW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50JiZNU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/TVNGQ2xpZW50LnJlZ2lzdGVyQ3VzdG9tTWVzc2FnZUxpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uKCl7ZS5vblJlc2l6ZSgpfSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KX19LHtrZXk6Im9uUmVzaXplIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZm9yY2VVcGRhdGUoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLnJlbmRlcmluZ0NvbnRleHQsdD10aGlzLnByb3BzLnN0cnVjdHVyZSxuPXRoaXMucHJvcHMuY2xhc3NOYW1lKyh0aGlzLnByb3BzLnNreT8iIHNreSI6IiIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3RlbXBsYXRlSWQ6dGhpcy5wcm9wcy50ZW1wbGF0ZUlkLGNsYXNzTmFtZTpuLGhyZWY6ZS5hZExpbmssY2xpY2tVcmxzOmUuY2xpY2tVcmxzLGNyZWF0aXZlSWQ6ZS5jcmVhdGl2ZUlkLGFkSWQ6ZS5hZElkfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3JlbmRlcmluZ0NvbnRleHQ6ZSxibG9jazp0LGNvbXBvbmVudHNNYXA6dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6dGhpcy5wcm9wcy5kb21SZWZzfSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJ0ZW1wbGF0ZUNvbnRhaW5lciIsImJsb2NrIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZW1wbGF0ZSIsaC5wcm9wVHlwZXM9e3JlbmRlcmluZ0NvbnRleHQ6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsc3RydWN0dXJlOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsY2xhc3NOYW1lOnUuUHJvcFR5cGVzLnN0cmluZyxkb21SZWZzOnUuUHJvcFR5cGVzLm9iamVjdCx0ZW1wbGF0ZUlkOnUuUHJvcFR5cGVzLnN0cmluZyx1cGRhdGVPblJlc2l6ZTp1LlByb3BUeXBlcy5ib29sLHNreTp1LlByb3BUeXBlcy5ib29sfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPW4oMjQpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zdGF0ZT17ZmxleGJveDohMH0sbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ub2RlJiZ0aGlzLnNldFN0YXRlKHtmbGV4Ym94OmRbImRlZmF1bHQiXS5zdXBwb3J0LmZsZXhib3goKX0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0odGhpcy5wcm9wcy5jbGFzc05hbWU/dGhpcy5wcm9wcy5jbGFzc05hbWUrIiAiOiIiKSsidGVtcGxhdGVDb250YWluZXIiKyh0aGlzLnN0YXRlLmZsZXhib3g/IiI6IiBoLW5vRmxleGJveCIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxjbGFzc05hbWU6dCxpZDp0aGlzLnByb3BzLnRlbXBsYXRlSWQsImRhdGEtY3JlYXRpdmUtaWQiOnRoaXMucHJvcHMuY3JlYXRpdmVJZCwiZGF0YS1hZC1pZCI6dGhpcy5wcm9wcy5hZElkLHJlZjpmdW5jdGlvbih0KXtlLm5vZGU9dH19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJ0ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayJ9fSksdGhpcy5wcm9wcy5jaGlsZHJlbil9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bIkNsaWNrdGhyb3VnaExpbmsiXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1oLGguZGlzcGxheU5hbWU9IlRlbXBsYXRlQ29udGFpbmVyICIsaC5wcm9wVHlwZXM9e3N0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxjbGFzc05hbWU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRlbXBsYXRlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGhyZWY6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKS5pc1JlcXVpcmVkLGNyZWF0aXZlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFkSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbD1uKDMpLHA9cihsKSxjPW4oOCksZj1yKGMpLGQ9big5KSxoPXIoZCkseT1uKDEyKSxtPXIoeSksYj1uKDIzKSx2PXIoYiksZz1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGIuQ09VUE9OX1RPS0VOX01BQ1JPLCgwLHZbImRlZmF1bHQiXSkoKSl9LF89ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJoYW5kbGVPbkNsaWNrIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnByb3BzLG49dC5jbGlja1RyYWNrZXJVcmxzLHI9dC51cmwsbz10LmNhc2NhZGluZ0ludGVudCxpPXQuaXNPZmZzaXRlOygwLGZbImRlZmF1bHQiXSkobiksKDAsbVsiZGVmYXVsdCJdKShnKHIpLGksbykmJmUucHJldmVudERlZmF1bHQoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5wcm9wcyxuPXQudXJsLHI9dC5pc09mZnNpdGUsbz10LmNoaWxkcmVuLGk9dC5hbmNob3JQcm9wcyxhPW51bGw7dGhpcy5jb250ZXh0LmlzU3RhdGljSHRtbCYmdGhpcy5wcm9wcy5jbGlja1RyYWNrZXJVcmxzJiYoYT10aGlzLnByb3BzLmNsaWNrVHJhY2tlclVybHMuam9pbigifCIpKTt2YXIgdT0iY2xpY2t0aHJvdWdoTGluayIrKGkuY2xhc3NOYW1lPyIgIitpLmNsYXNzTmFtZToiIik7cmV0dXJuIHBbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJhIixzKHt9LGkse2NsYXNzTmFtZTp1LGhyZWY6ZyhuKSx0YXJnZXQ6KDAsaFsiZGVmYXVsdCJdKShuLHIpLG9uQ2xpY2s6ZnVuY3Rpb24odCl7cmV0dXJuIGUuaGFuZGxlT25DbGljayh0KX0sb25Nb3VzZURvd246ZnVuY3Rpb24oKXtyZXR1cm4gZS5mb3JjZVVwZGF0ZSgpfSwiZGF0YS1jbGlja1RyYWNrZXJVcmxzIjphLHJlbDoibm9mb2xsb3cifSksbyl9fV0pLHR9KGwuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09XyxfLmRpc3BsYXlOYW1lPSJDbGlja3Rocm91Z2hMaW5rIixfLnByb3BUeXBlcz17dXJsOmwuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNhc2NhZGluZ0ludGVudDpsLlByb3BUeXBlcy5zdHJpbmcsaXNPZmZzaXRlOmwuUHJvcFR5cGVzLmJvb2wsY2xpY2tUcmFja2VyVXJsczpsLlByb3BUeXBlcy5hcnJheU9mKGwuUHJvcFR5cGVzLnN0cmluZyksYW5jaG9yUHJvcHM6bC5Qcm9wVHlwZXMub2JqZWN0LGNoaWxkcmVuOmwuUHJvcFR5cGVzLm5vZGV9LF8uY29udGV4dFR5cGVzPXtpc1N0YXRpY0h0bWw6bC5Qcm9wVHlwZXMuYm9vbH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG89MDtlPm87bysrKXRbb109YXJndW1lbnRzW29dO2Zvcih2YXIgaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBhPXRbaV07aWYoYSlpZigic3RyaW5nIj09dHlwZW9mIGEpcihhKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpcmUgcGl4ZWw6ICInK0pTT04uc3RyaW5naWZ5KGEpKyciIGlzIG5vdCBhIHN0cmluZyEnKTtuLmFwcGx5KHRoaXMsYSl9fX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZSYmKChuZXcgSW1hZ2UpLnNyYz1lKX07dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7dmFyIG49dHx8ISgwLGFbImRlZmF1bHQiXSkoZSk7cmV0dXJuIG4/cy5JTl9ORVdfV0lORE9XOnMuSU5fU0FNRV9XSU5ET1d9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1vO3ZhciBpPW4oMTApLGE9cihpKSxzPW4oMTEpfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUpe3JldHVybiByLnRlc3QoZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1uO3ZhciByPS9eKChodHRwcz86KT9cL1wvKSguKlwuKT9hbWF6b25cLi99LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj10LklOX1NBTUVfV0lORE9XPSJfdG9wIixyPXQuSU5fTkVXX1dJTkRPVz0iX2JsYW5rIjt0WyJkZWZhdWx0Il09e0lOX05FV19XSU5ET1c6cixJTl9TQU1FX1dJTkRPVzpufX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0LG4pe2lmKCF0JiZtWyJkZWZhdWx0Il0mJkMmJnBbImRlZmF1bHQiXS5tYXNoLmlzQVVJQXZhaWxhYmxlKCkmJigwLFRbImRlZmF1bHQiXSkoZSx0KT09PVAuSU5fTkVXX1dJTkRPVylwWyJkZWZhdWx0Il0ubWFzaC5vcGVuSW5FeHRlcm5hbEJyb3dzZXIuZXhlY3V0ZSh7dXJsOmV9KTtlbHNlIGlmKCF0fHwhTXx8dlsiZGVmYXVsdCJdJiYhUyhbMiwyLDEwXSl8fF9bImRlZmF1bHQiXSYmIVMoWzUsNSwxMzVdKSl7aWYoIXR8fCFJKXJldHVybiExO2ZbImRlZmF1bHQiXS5vcGVuKGUpfWVsc2UgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcihufHxlKTtyZXR1cm4hMH1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuKDAsVFsiZGVmYXVsdCJdKShlLHQpPT09UC5JTl9TQU1FX1dJTkRPV31mdW5jdGlvbiBhKGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3JldHVybiB1WyJkZWZhdWx0Il0ub3BlbihlLCgwLFRbImRlZmF1bHQiXSkoZSx0KSl9LGE9ZnVuY3Rpb24oKXtyZXR1cm4gbyhlLHQsbil9LHM9ZnVuY3Rpb24oKXtyZXR1cm4gYSgpfHxyKCl9O3JldHVybiBpKGUsdCk/KHNldFRpbWVvdXQocyxOKSwhMCk6YSgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0WyJkZWZhdWx0Il09YTt2YXIgcz1uKDEzKSx1PXIocyksbD1uKDE0KSxwPXIobCksYz1uKDE1KSxmPXIoYyksZD1uKDE2KSxoPXIoZCkseT1uKDE3KSxtPXIoeSksYj1uKDE4KSx2PXIoYiksZz1uKDIxKSxfPXIoZyksUD1uKDExKSxrPW4oOSksVD1yKGspLHg9bigyMiksTz1yKHgpLHc9ISFwWyJkZWZhdWx0Il0sQz13JiYidW5kZWZpbmVkIiE9dHlwZW9mIHBbImRlZmF1bHQiXS5tYXNoLGo9ISFoWyJkZWZhdWx0Il0sTT1qJiYiZnVuY3Rpb24iPT10eXBlb2YgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcixFPSEhZlsiZGVmYXVsdCJdLEk9RSYmImZ1bmN0aW9uIj09dHlwZW9mIGZbImRlZmF1bHQiXS5vcGVuLFI9aiYmZnVuY3Rpb24oKXt2YXIgZT1oWyJkZWZhdWx0Il0uZ2V0U0RLVmVyc2lvbigpLm1hdGNoKC8oXGQrKVwuKFxkKykuKFxkKykkLyk7cmV0dXJuIGU/W2VbMV0sZVsyXSxlWzNdXTp2b2lkIDB9KCksUz1mdW5jdGlvbihlKXtyZXR1cm4gUiYmKDAsT1siZGVmYXVsdCJdKShSLGUpPj0wfSxOPTE1MH0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50O3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBtcmFpZCYmbXJhaWQ7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGFtYXpvbiYmYW1hem9uO3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxpPW4oMTQpLGE9cihpKSxzPWZ1bmN0aW9uKCl7aWYoIWFbImRlZmF1bHQiXSlyZXR1cm4hMTt2YXIgZT1mdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYVsiZGVmYXVsdCJdLmdldERvY3VtZW50Q29va2llKCkpLnNwbGl0KCI7IikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10LnNwbGl0KCI9Iik7biYmbi5sZW5ndGg+PTImJihlW25bMF0udHJpbSgpXT1uWzFdLnRyaW0oKSl9KSx7djovXCJhdlwiOlwiKFsuXGRdKilcIi9pLnRlc3QoZVsiYW16bi1hcHAtY3R4dCJdKX19KCk7cmV0dXJuIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOm8oZSkpP2Uudjp2b2lkIDB9KCk7dFsiZGVmYXVsdCJdPXN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L2lQaG9uZXxpUGFkfGlQb2QvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDE0KSxpPXIobyksYT1uKDIwKSxzPXIoYSksdT1pWyJkZWZhdWx0Il0mJmlbImRlZmF1bHQiXS5nZXRVc2VyQWdlbnRJbmZvKCl8fHNbImRlZmF1bHQiXSYmc1siZGVmYXVsdCJdLnVzZXJBZ2VudDt0WyJkZWZhdWx0Il09dX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3I7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L0FuZHJvaWQvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2Zvcih2YXIgbj1NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCkscj0wO24+cjtyKyspe3ZhciBvPWVbcl0saT10W3JdO2lmKG8+aSlyZXR1cm4gMTtpZihpPm8pcmV0dXJuLTF9cmV0dXJuIDB9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiJBTVMiO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBidG9hP2J0b2EoRGF0ZS5ub3coKSsoIjsiK2UpKToiIn1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW47dC5DT1VQT05fVE9LRU5fTUFDUk89IlZQQ19DU19NQUNSTyJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX12YXIgbz1uKDI1KSxpPXIobyksYT1uKDI2KSxzPXIoYSksdT0vXi4qXC9cL1teXC9dKy87ZS5leHBvcnRzPXtzdXBwb3J0OntmbGV4Ym94OmZ1bmN0aW9uKCl7cmV0dXJuIE1vZGVybml6ciYmKE1vZGVybml6ci5mbGV4Ym94fHxNb2Rlcm5penIuZmxleGJveGxlZ2FjeXx8TW9kZXJuaXpyLmZsZXhib3h0d2VlbmVyKX19LGdldDpmdW5jdGlvbihlLHQpe3JldHVybiB0LnNwbGl0KCIuIikucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5tYXRjaCgvKC4qKVxbKFxkKilcXS8pLHI9biYmblsxXSxvPW4mJm5bMl07cmV0dXJuIHImJm8/ZVtyXVtwYXJzZUludChvLDEwKV06ZVt0XX0sZSl9LGdldE1lZGlhQ2VudHJhbEltYWdlU3JjOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZTt2YXIgbz1pWyJkZWZhdWx0Il0udXJscy5NRURJQV9DRU5UUkFMX1dXLGE9ZS5yZXBsYWNlKHUsIiIpLGw9bysoMD09PWEuaW5kZXhPZigiLyIpPyIiOiIvIikrYSxwPXt9LGM9cj8yOjE7cmV0dXJuIHQuYWMmJihwLkFDPSEwKSx0LnN4JiYocC5TWD10LnN4KmMpLHQuc3kmJihwLlNZPXQuc3kqYyksdC5xbCYmKHAuUUw9dC5xbCksdC5mbSYmKHAuRk09dC5mbSksc1siZGVmYXVsdCJdLnNldFRhZ3MobCxwLFsiQUMiLCJTWCIsIlNZIiwiRk0iLCJRTCJdLG4pfX19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17dXJsczp7TUVESUFfQ0VOVFJBTF9XVzoiaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20iLE1FRElBX0NFTlRSQUxfQ046Imh0dHBzOi8vaW1hZ2VzLWNuLnNzbC1pbWFnZXMtYW1hem9uLmNvbSJ9fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtzZXRUYWdzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPS9cLl8oW15cLl0rKSg/PV9cLlx3KyQpLyxpPW8uZXhlYyhlKSxhPWk/aVsxXS5zcGxpdCgiXyIpOltdLHM9T2JqZWN0LmFzc2lnbih7fSx0KSx1PVtdO3ImJmEuZm9yRWFjaChmdW5jdGlvbihlKXtpZigiIiE9PWUpe3ZhciB0LG49ZS5zdWJzdHJpbmcoMCwyKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNbbl0/KHNbbl09PT0hMSYmKHNbbl09bnVsbCksbj1udWxsKTp0PWUuc3Vic3RyaW5nKDIsZS5sZW5ndGgpLG51bGwhPT1uJiZ1LnB1c2gobit0KX19KSxuLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9c1tlXTt0JiZ1LnB1c2goZSsodD09PSEwPyIiOnQpKX0pO3ZhciBsPS0xO3UuZm9yRWFjaChmdW5jdGlvbihlLHQpeyJDUiI9PT1lLnN1YnN0cmluZygwLDIpJiYobD10KX0pO3ZhciBwPSExO2lmKGw+PTApe3ZhciBjPXUuc3BsaWNlKGwsMSk7dS51bnNoaWZ0KGNbMF0pLHA9ITB9dmFyIGY9dS5pbmRleE9mKCJBQyIpO2lmKGY+MCl7dmFyIGQ9dS5zcGxpY2UoZiwxKTtwP3Uuc3BsaWNlKDEsMCxkWzBdKTp1LnVuc2hpZnQoZFswXSl9cmV0dXJuIHUubGVuZ3RoPjAmJihlPWEubGVuZ3RoPjA/ZS5yZXBsYWNlKG8sIi5fIit1LmpvaW4oIl8iKSk6ZS5yZXBsYWNlKC9cLig/PVx3KyQpLywiLl8iK3Uuam9pbigiXyIpKyJfLiIpKSxlfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigyNCksYz1yKHApLGY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtjbG9hazpuLmV4dHJhY3RNZXRhZGF0YShlLmJsb2NrLCJjbG9hayIpfSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNldFN0YXRlKHtjbG9hazohMX0pfX0se2tleToiZ2V0Q2xhc3NOYW1lIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJibG9jayIsdD0iIjt0aGlzLnByb3BzLmJsb2NrLmNzc0NsYXNzZXMmJih0PXRoaXMucHJvcHMuYmxvY2suY3NzQ2xhc3Nlcy5qb2luKCIgIikpLCIiIT09dCYmKGUrPSIgIit0KTt2YXIgbj10aGlzLnByb3BzLmJsb2NrLmxheW91dDtyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj1uW3RdOyJqdXN0aWZ5Q29udGVudCI9PT10JiYiZmxleC1zdGFydCIhPT1yP2UrPSIgYmxvY2stLWp1c3RpZnktIityOiJhbGlnbkl0ZW1zIj09PXQmJiJzdHJldGNoIiE9PXI/ZSs9IiBibG9jay0tYWxpZ24tIityOiJmbGV4RGlyZWN0aW9uIj09PXQmJiJyb3ciIT09ciYmKGUrPSIgYmxvY2stLWRpcmVjdGlvbi0iK3IpfSksdGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kJiZ0aGlzLnByb3BzLmJsb2NrLmJhY2tncm91bmQuaWQmJihlKz0iIGJsb2NrLS1iYWNrZ3JvdW5kIiksdGhpcy5zdGF0ZS5jbG9hayYmKGUrPSIgaC1jbG9hayIpLGV9fSx7a2V5OiJwcmV2ZW50UHJvcGVydHkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJiIiIT09dD8ianVzdGlmeUNvbnRlbnQiPT09ZXx8ImFsaWduSXRlbXMiPT09ZXx8ImZsZXhEaXJlY3Rpb24iPT09ZTohMH19LHtrZXk6ImdldEJsb2NrTGF5b3V0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnByb3BzLmJsb2NrLmxheW91dCxuPXt9O3JldHVybiB0JiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBvPXRbcl07ZS5wcmV2ZW50UHJvcGVydHkocixvKXx8KG5bcl09byl9KSxufX0se2tleToiZ2V0QmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmJsb2NrLnN0eWxlLHQ9e307cmV0dXJuIGUmJmUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLnZhbHVlOyJ1bmRlZmluZWQiIT10eXBlb2YgdFtlLm5hbWVdJiYobj10W2UubmFtZV0rIjsiK2UubmFtZSsiOiIrbiksdFtlLm5hbWVdPW59KSx0fX0se2tleToiZ2V0UHJvcFZhbHVlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiJwYXRoIj09PXQudHlwZT9jWyJkZWZhdWx0Il0uZ2V0KGUsdC52YWx1ZSk6ImNvbnN0YW50Ij09PXQudHlwZT90LnZhbHVlOm51bGx9fSx7a2V5OiJnZXRDb21wb25lbnRQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXt9O3JldHVybiBlLnByb3BzJiZlLnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7bltlLm5hbWVdPXQuZ2V0UHJvcFZhbHVlKHQucHJvcHMucmVuZGVyaW5nQ29udGV4dCxlKX0pLG59fSx7a2V5OiJleHRyYWN0TWV0YWRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKG49ZS52YWx1ZSl9KSxufX0se2tleToic2V0UmVmIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmV4dHJhY3RNZXRhZGF0YSh0aGlzLnByb3BzLmJsb2NrLCJyZWYiKTt0JiZ0aGlzLnByb3BzLmRvbVJlZnMmJih0aGlzLnByb3BzLmRvbVJlZnNbdF09ZSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImhpZGUiKSxyPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImlkIiksbz12b2lkIDAsaT12b2lkIDAsYT12b2lkIDAscz12b2lkIDAsdT12b2lkIDAscD12b2lkIDAsYz12b2lkIDA7aWYoIW4pe289dGhpcy5nZXRDbGFzc05hbWUoKTt2YXIgZj10aGlzLmdldEJsb2NrTGF5b3V0KCksZD10aGlzLmdldEJsb2NrU3R5bGUoKTtpPU9iamVjdC5hc3NpZ24oe30sZixkKSxhPVtdO3ZhciBoPXRoaXMucHJvcHMuYmxvY2suY2hpbGRyZW47aCYmaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2EucHVzaChsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCh0LHtyZW5kZXJpbmdDb250ZXh0OmUucHJvcHMucmVuZGVyaW5nQ29udGV4dCxibG9jazpuLGNvbXBvbmVudHNNYXA6ZS5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6ZS5wcm9wcy5kb21SZWZzLGtleTpuLmlkfSkpfSk7dmFyIHk9dGhpcy5wcm9wcy5ibG9jay5jb21wb25lbnQ7eSYmKHU9dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwW3kuaWRdLHM9dGhpcy5nZXRDb21wb25lbnRQcm9wcyh5KSk7dmFyIG09dGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kO20mJihjPXRoaXMucHJvcHMuY29tcG9uZW50c01hcFttLmlkXSxwPXRoaXMuZ2V0Q29tcG9uZW50UHJvcHMobSkpfXJldHVybiFuJiZsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7aWQ6cixjbGFzc05hbWU6byxzdHlsZTppLHJlZjpmdW5jdGlvbih0KXtlLnNldFJlZih0KX19LGMmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImJsb2NrX19iYWNrZ3JvdW5kIn0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoYyxwKSksYS5sZW5ndGg+MD9hOnUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHUscykpfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iQmxvY2siLGYucHJvcFR5cGVzPXtyZW5kZXJpbmdDb250ZXh0OnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGJsb2NrOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsZG9tUmVmczp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89MTk5LGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm1vZGVsPXQsdGhpcy5ibG9ja3NNYXA9e30sdGhpcy5fYnVpbGRCbG9ja3NNYXAoKX1yZXR1cm4gcihlLFt7a2V5OiJfYnVpbGRCbG9ja3NNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9W10sdD17fTtlLnB1c2godGhpcy5tb2RlbCk7Zm9yKHZhciBuPTA7ZS5sZW5ndGg+MDspe3ZhciByPWUuc2hpZnQoKSxpPXRoaXMuX2dldFJlZklkKHIpO2lmKCIiIT09aSYmKHRoaXMuYmxvY2tzTWFwW2ldPXIpLHRbci5pZF18fCh0W3IuaWRdPSEwLGU9ZS5jb25jYXQoci5jaGlsZHJlbnx8W10pKSxuKyssbj5vKWJyZWFrfX19LHtrZXk6Il9nZXRSZWZJZCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7InJlZiI9PT1lLm5hbWUmJih0PWUudmFsdWUpfSksdH19LHtrZXk6ImhpZGVCbG9jayIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiZuLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ImhpZGUiPT09ZS5uYW1lJiYoZS52YWx1ZT10KX0pfX0se2tleToiYWRkQmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuYmxvY2tzTWFwW2VdO3ImJihyLnN0eWxlPXIuc3R5bGV8fFtdLHIuc3R5bGUucHVzaCh7bmFtZTp0LHZhbHVlOm59KSl9fSx7a2V5OiJhZGRDc3NDbGFzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiYobi5jc3NDbGFzc2VzPW4uY3NzQ2xhc3Nlc3x8W10sbi5jc3NDbGFzc2VzLnB1c2godCkpfX0se2tleToiZ2V0Q29tcG9uZW50UHJvcCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXSxyPW51bGw7cmV0dXJuIG4mJm4uY29tcG9uZW50JiZuLmNvbXBvbmVudC5wcm9wcyYmbi5jb21wb25lbnQucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLm5hbWU9PT10JiYocj1lKX0pLHJ9fSx7a2V5OiJzZXRDb21wb25lbnRQcm9wIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzLmJsb2Nrc01hcFtlXTtpZihvJiZvLmNvbXBvbmVudCl7dmFyIGk9ITE7by5jb21wb25lbnQucHJvcHM9by5jb21wb25lbnQucHJvcHN8fFtdLG8uY29tcG9uZW50LnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKGUudmFsdWU9bixlLnR5cGU9cixpPSEwKX0pLGl8fG8uY29tcG9uZW50LnByb3BzLnB1c2goe25hbWU6dCx2YWx1ZTpuLHR5cGU6cn0pfX19LHtrZXk6InNldENzc0NsYXNzZXMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5ibG9ja3NNYXBbZV07biYmKG4uY3NzQ2xhc3Nlcz1uLmNzc0NsYXNzZXN8fFtdLEFycmF5LmlzQXJyYXkodCk/bi5jc3NDbGFzc2VzPXQ6bi5jc3NDbGFzc2VzLnB1c2godCkpfX1dKSxlfSgpO3RbImRlZmF1bHQiXT1pfSwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM0KSxjPXIocCksZj1uKDM1KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0LGFsaWdubWVudDp0aGlzLnByb3BzLmFsaWdubWVudCxtYXhIZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHR9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7YWRkaXRpb25hbENsYXNzOnRoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzLHBhdGg6dGhpcy5wcm9wcy5wYXRoLHdpZHRoOnRoaXMucHJvcHMud2lkdGgsaGVpZ2h0OnRoaXMucHJvcHMuaGVpZ2h0LHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxxbDp0aGlzLnByb3BzLnFsLHJldGluYTp0aGlzLnByb3BzLnJldGluYSxhYzp0aGlzLnByb3BzLmFjLGZtOnRoaXMucHJvcHMuZm0sbWVyZ2VUYWdzOnRoaXMucHJvcHMubWVyZ2VUYWdzLGFsdDp0aGlzLnByb3BzLmFsdCxzcHJpdGU6dGhpcy5wcm9wcy5zcHJpdGUscm9sZTp0aGlzLnByb3BzLnJvbGUsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pKX19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsiaW1hZ2VDb250YWluZXIiLCJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWgsaC5kaXNwbGF5TmFtZT0iTWVkaWFDZW50cmFsSW1hZ2VDb250YWluZXIiLGgucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyx3aWR0aDp1LlByb3BUeXBlcy5zdHJpbmcsaGVpZ2h0OnUuUHJvcFR5cGVzLnN0cmluZyxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHJldGluYTp1LlByb3BUeXBlcy5ib29sLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLGZtOnUuUHJvcFR5cGVzLnN0cmluZyxtZXJnZVRhZ3M6dS5Qcm9wVHlwZXMuYm9vbCxhbHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHNwcml0ZTp1LlByb3BUeXBlcy5ib29sLHJvbGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRpdGxlOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3Qsb25Mb2FkOnUuUHJvcFR5cGVzLmZ1bmMsbWF4SGVpZ2h0OnUuUHJvcFR5cGVzLm51bWJlcn0saC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJpbWFnZUNvbnRhaW5lciIrKHRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0PyIgaW1hZ2VDb250YWluZXItLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIpO3RoaXMucHJvcHMuYWxpZ25tZW50JiYiIiE9PXRoaXMucHJvcHMuYWxpZ25tZW50JiYoZSs9IiBpbWFnZUNvbnRhaW5lci0tIit0aGlzLnByb3BzLmFsaWdubWVudCk7dmFyIHQ9e307cmV0dXJuIHRoaXMucHJvcHMubWF4SGVpZ2h0JiZPYmplY3QuYXNzaWduKHQse21heEhlaWdodDp0aGlzLnByb3BzLm1heEhlaWdodH0pLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ZSxzdHlsZTp0fSxsWyJkZWZhdWx0Il0uY2xvbmVFbGVtZW50KHRoaXMucHJvcHMuY2hpbGRyZW4se2FkZGl0aW9uYWxDbGFzczoiaW1hZ2VDb250YWluZXJfX2ltYWdlIn0pKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1wLHAuZGlzcGxheU5hbWU9IkltYWdlQ29udGFpbmVyIixwLnByb3BUeXBlcz17ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyxtYXhIZWlnaHQ6dS5Qcm9wVHlwZXMubnVtYmVyfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM2KSxjPShyKHApLG4oMjQpKSxmPXIoYyksZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRJbWFnZVNyYyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGZbImRlZmF1bHQiXS5nZXRNZWRpYUNlbnRyYWxJbWFnZVNyYyhlLHthYzp0aGlzLnByb3BzLmFjLHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxmbTp0aGlzLnByb3BzLmZtLHFsOnRoaXMucHJvcHMucWx9LHRoaXMucHJvcHMubWVyZ2VUYWdzLHRoaXMucHJvcHMucmV0aW5hKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5nZXRJbWFnZVNyYyh0aGlzLnByb3BzLnBhdGgpLG49Im1lZGlhQ2VudHJhbEltYWdlIisodGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiKTtpZih0aGlzLnByb3BzLnNwcml0ZSl7dmFyIHI9T2JqZWN0LmFzc2lnbih7d2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYmFja2dyb3VuZEltYWdlOiJ1cmwoJyIrdCsiJykifSx0aGlzLnByb3BzLnN0eWxlKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTpuLHN0eWxlOnIsdGl0bGU6dGhpcy5wcm9wcy50aXRsZX0pfXJldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiaW1nIix7Y2xhc3NOYW1lOm4sc3JjOnQsd2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYWx0OnRoaXMucHJvcHMuYWx0LHJvbGU6dGhpcy5wcm9wcy5yb2xlLHRpdGxlOnRoaXMucHJvcHMudGl0bGUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxvbkxvYWQ6ZnVuY3Rpb24odCl7ZS5wcm9wcy5vbkxvYWQmJmUucHJvcHMub25Mb2FkKHQudGFyZ2V0KX19KX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9Ik1lZGlhQ2VudHJhbEltYWdlIixkLnByb3BUeXBlcz17YWRkaXRpb25hbENsYXNzOnUuUHJvcFR5cGVzLnN0cmluZyxwYXRoOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHN4OnUuUHJvcFR5cGVzLm51bWJlcixzeTp1LlByb3BUeXBlcy5udW1iZXIscmV0aW5hOnUuUHJvcFR5cGVzLmJvb2wsYWM6dS5Qcm9wVHlwZXMuYm9vbCxxbDp1LlByb3BUeXBlcy5udW1iZXIsZm06dS5Qcm9wVHlwZXMuc3RyaW5nLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGFsdDp1LlByb3BUeXBlcy5zdHJpbmcsc3ByaXRlOnUuUHJvcFR5cGVzLmJvb2wscm9sZTp1LlByb3BUeXBlcy5zdHJpbmcsdGl0bGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxvbkxvYWQ6dS5Qcm9wVHlwZXMuZnVuY30sZC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInJldGluYSBtb2R1bGVzIGV4cGVjdHMgYSBmdW5jdGlvbiBvblJldGluYVN0YXRlQ2hhbmdlIGFjY2VwdGluZyBib29sZWFuIik7aWYod2luZG93Lm1hdGNoTWVkaWEpe3ZhciB0PXdpbmRvdy5tYXRjaE1lZGlhKCIoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwobWluLXJlc29sdXRpb246IDE5MmRwaSkiKSxuPWZ1bmN0aW9uKHQpe3JldHVybiBlKHQubWF0Y2hlcyl9O3QmJm4odCksdC5hZGRMaXN0ZW5lciYmdC5hZGRMaXN0ZW5lcihuKX1lbHNlIGUod2luZG93LmRldmljZVBpeGVsUmF0aW8+MT8hMDohMSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzgpLGM9cihwKSxmPTk5OSxkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5fc2V0U3RhdGUoZSksbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTdGF0ZSh0aGlzLnByb3BzKSx0aGlzLl9oYW5kbGVUZXh0T3ZlcmZsb3coKX19LHtrZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToiY29tcG9uZW50RGlkVXBkYXRlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0idGV4dENvbnRhaW5lcl9fdGV4dCI7dCs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciBuPXtmb250U2l6ZTp0aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4fTtyZXR1cm4gT2JqZWN0LmFzc2lnbihuLHRoaXMucHJvcHMuc3R5bGUpLHRoaXMucHJvcHMudGV4dD9sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOmZ1bmN0aW9uKHQpe2Uubm9kZT10fSxzdHlsZTpuLGNsYXNzTmFtZToidGV4dENvbnRhaW5lciIrKHRoaXMuc3RhdGUudXNlQ3NzVHJ1bmNhdGlvbj8iIGgtZWxsaXBzaXMiOiIiKX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtyZWY6ZnVuY3Rpb24odCl7ZS5zcGFuPXR9LGNsYXNzTmFtZTp0LGlkOnRoaXMucHJvcHMudGV4dElkfSx0aGlzLnByb3BzLnRleHQpKTpudWxsfX0se2tleToiX3NldFN0YXRlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1PYmplY3QuYXNzaWduKHt9LGUuZm9udCk7dGhpcy5zdGF0ZT17Zm9udDp0LHVzZUNzc1RydW5jYXRpb246dC5tYXhMaW5lcz8xPT09dC5tYXhMaW5lczohMCxuZWVkc1RpdGxlQXR0cmlidXRlOiExLG9yaWdpbmFsVGV4dDplLnRleHR9fX0se2tleToiX3Nob3dUb29sdGlwIix2YWx1ZTpmdW5jdGlvbihlKXtlPygwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5hdHRyKCJ0aXRsZSIsdGhpcy5zdGF0ZS5vcmlnaW5hbFRleHQpOigwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5yZW1vdmVBdHRyKCJ0aXRsZSIpfX0se2tleToiX2hhbmRsZVRleHRPdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLm5vZGUpaWYodGhpcy5zdGF0ZS51c2VDc3NUcnVuY2F0aW9uKXt2YXIgZT0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5fc2hvd1Rvb2x0aXAoZS50ZXh0T3ZlcmZsb3coKSl9ZWxzZSB0aGlzLl90cnVuY2F0ZU11bHRpTGluZVRleHQoKX19LHtrZXk6Il90cnVuY2F0ZU11bHRpTGluZVRleHQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9Ii4uLiIsdD0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5zcGFuLmlubmVySFRNTD10aGlzLnN0YXRlLm9yaWdpbmFsVGV4dDt2YXIgbj0oMCxjWyJkZWZhdWx0Il0pKHRoaXMuc3BhbikuZGVjb2RlRW50aXRpZXMoKTt0aGlzLm5vZGUuc3R5bGUuZm9udFNpemU9dGhpcy5zdGF0ZS5mb250Lm1heEZvbnRQeCsicHgiO2Zvcih2YXIgcj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsbz10aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4LGk9ITEsYT0wO3I+dGhpcy5zdGF0ZS5mb250Lm1heExpbmVzfHx0LmNoaWxkcmVuT3ZlcmZsb3coKTspe2lmKG88PXRoaXMuc3RhdGUuZm9udC5taW5Gb250UHgpe2l8fChuKz1lLGk9ITApO3ZhciBzPW4ubGVuZ3RoO249bi5zdWJzdHIoMCxzLWUubGVuZ3RoLTEpK2UsdGhpcy5zcGFuLmlubmVySFRNTD1ufWVsc2Ugby0tLHRoaXMubm9kZS5zdHlsZS5mb250U2l6ZT1vKyJweCI7aWYocj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsYSsrLGE+ZilicmVha310aGlzLl9zaG93VG9vbHRpcChpKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9IlRleHRDb250YWluZXIiLGQucHJvcFR5cGVzPXt0ZXh0OnUuUHJvcFR5cGVzLnN0cmluZyxhZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGZvbnQ6dS5Qcm9wVHlwZXMub2JqZWN0LHRleHRJZDp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm5vZGU9dH1yZXR1cm4gcihlLFt7a2V5OiJnZXQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm5vZGVbZV19fSx7a2V5OiJmaW5kIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwodCkpfX0se2tleToicGFyZW50Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLm5vZGUucGFyZW50Tm9kZSl9fSx7a2V5OiJjaGlsZHJlbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5ub2RlLmNoaWxkcmVuKX19LHtrZXk6ImNzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm5vZGVbMF18fHRoaXMubm9kZSxyPW4uZ2V0QXR0cmlidXRlKCJzdHlsZSIpLG89cj9yLnNwbGl0KCI7IikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KCI6Iil9KTpbXSxpPXt9O28uZm9yRWFjaChmdW5jdGlvbihlKXtlWzBdJiYiIiE9PWVbMF0mJihpW2VbMF1dPWVbMV0pfSksaVtlXT10O3ZhciBhPSIiO3JldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ErPWUrIjoiK2lbZV0rIjsifSksbi5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKSx0aGlzfX0se2tleToiYXR0ciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHQ/KHRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoZSx0KSx0aGlzLm5vZGUpOnRoaXMubm9kZS5nZXRBdHRyaWJ1dGUoZSl9fSx7a2V5OiJyZW1vdmVBdHRyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ub2RlLnJlbW92ZUF0dHJpYnV0ZShlKSx0aGlzLm5vZGV9fSx7a2V5OiJvdXRlckhlaWdodCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLm5vZGUub2Zmc2V0SGVpZ2h0O3JldHVybiBlJiYodD1nZXRDb21wdXRlZFN0eWxlKHRoaXMubm9kZSksbis9cGFyc2VJbnQodC5tYXJnaW5Ub3ApK3BhcnNlSW50KHQubWFyZ2luQm90dG9tKSksbn19LHtrZXk6Im91dGVyV2lkdGgiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5ub2RlLm9mZnNldFdpZHRoO3JldHVybiBlJiYodD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5vZGUpLApuKz13aW5kb3cucGFyc2VJbnQodC5tYXJnaW5MZWZ0LDEwKSt3aW5kb3cucGFyc2VJbnQodC5tYXJnaW5SaWdodCwxMCkpLG59fSx7a2V5OiJ0ZXh0Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUudGV4dENvbnRlbnR8fHRoaXMubm9kZS5pbm5lckhUTUx8fCIifX0se2tleToiY2hpbGRyZW5PdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm91dGVyV2lkdGgoITApLG49MDtyZXR1cm4gdGhpcy5jaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24odCl7bis9bmV3IGUodCkub3V0ZXJXaWR0aCghMCl9KSwtMT50LW59fSx7a2V5OiJ0ZXh0T3ZlcmZsb3ciLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3V0ZXJXaWR0aCghMCk8dGhpcy5ub2RlLnNjcm9sbFdpZHRofX0se2tleToiZGVjb2RlRW50aXRpZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYodGhpcy5ub2RlLmlubmVySFRNTCl7dmFyIHQ9dGhpcy5ub2RlLmlubmVySFRNTDtyZXR1cm4gdD10LnJlcGxhY2UoLzxzY3JpcHRbXj5dKj4oW1xTXHNdKj8pPFwvc2NyaXB0Pi9naW0sIiIpLHQ9dC5yZXBsYWNlKC88XC8/XHcoPzpbXiInPl18IlteIl0qInwnW14nXSonKSo+L2dpbSwiIiksdD10LnJlcGxhY2UoL1x1MDBhMC9nLCIgIiksZS5pbm5lckhUTUw9dCx0PWUudGV4dENvbnRlbnR8fGUuaW5uZXJIVE1MfHwiIixlLnRleHRDb250ZW50PSIiLHR9cmV0dXJuIiJ9fV0pLGV9KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbyhlKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNyksYz1yKHApLGY9big3KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9InRleHRMaW5rIisodGhpcy5wcm9wcy5kaXNwbGF5QXNUZXh0PyIgdGV4dExpbmstLWRpc3BsYXlBc1RleHQiOiIiKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoZFsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6ZX19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7Zm9udDp0aGlzLnByb3BzLmZvbnQsdGV4dDp0aGlzLnByb3BzLnRleHQsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSx0ZXh0SWQ6dGhpcy5wcm9wcy50ZXh0SWR9KSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bInRleHRDb250YWluZXIiLCJjbGlja3Rocm91Z2hMaW5rIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZXh0TGluayIsaC5wcm9wVHlwZXM9e3RleHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpLmlzUmVxdWlyZWQsZm9udDp1LlByb3BUeXBlcy5vYmplY3QsdGV4dElkOnUuUHJvcFR5cGVzLnN0cmluZyxkaXNwbGF5QXNUZXh0OnUuUHJvcFR5cGVzLmJvb2wsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDMzKSxjPXIocCksZj1uKDcpLGQ9cihmKSxoPW4oMzcpLHk9cihoKSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0iYXNpbkltYWdlIjtyZXR1cm4gZSs9dGhpcy5wcm9wcy5leHRlbmRDb250YWluZXJIZWlnaHQ/IiBhc2luSW1hZ2UtLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIsZSs9dGhpcy5wcm9wcy5kZXNjcmlwdGlvbj8iIGFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uIjoiIixsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7ImRhdGEtYXNpbiI6dGhpcy5wcm9wcy5hc2luLGNsYXNzTmFtZTplfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3VybDp0aGlzLnByb3BzLmhyZWYsaXNPZmZzaXRlOiExLGNsaWNrVHJhY2tlclVybHM6dGhpcy5wcm9wcy5jbGlja1VybHMsYW5jaG9yUHJvcHM6e2NsYXNzTmFtZTplfX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtwYXRoOnRoaXMucHJvcHMucGF0aCxhbHQ6dGhpcy5wcm9wcy5hbHQsc3ByaXRlOnRoaXMucHJvcHMuc3ByaXRlLGV4dGVuZENvbnRhaW5lckhlaWdodDp0aGlzLnByb3BzLmV4dGVuZENvbnRhaW5lckhlaWdodCx3aWR0aDp0aGlzLnByb3BzLndpZHRoLGhlaWdodDp0aGlzLnByb3BzLmhlaWdodCxzeDp0aGlzLnByb3BzLnN4LHN5OnRoaXMucHJvcHMuc3kscWw6dGhpcy5wcm9wcy5xbCxyZXRpbmE6dGhpcy5wcm9wcy5yZXRpbmEsYWM6dGhpcy5wcm9wcy5hYyxtZXJnZVRhZ3M6dGhpcy5wcm9wcy5tZXJnZVRhZ3MsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pLHRoaXMucHJvcHMuZGVzY3JpcHRpb24mJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHlbImRlZmF1bHQiXSx7dGV4dDp0aGlzLnByb3BzLmRlc2NyaXB0aW9uLGZvbnQ6dGhpcy5wcm9wcy5kZXNjcmlwdGlvbkZvbnR9KSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lciIsImNsaWNrdGhyb3VnaExpbmsiLCJ0ZXh0Q29udGFpbmVyIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09bSxtLmRpc3BsYXlOYW1lPSJBc2luSW1hZ2UiLG0ucHJvcFR5cGVzPXtocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWx0OnUuUHJvcFR5cGVzLnN0cmluZyxzcHJpdGU6dS5Qcm9wVHlwZXMuYm9vbCxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxkZXNjcmlwdGlvbjp1LlByb3BUeXBlcy5zdHJpbmcsZGVzY3JpcHRpb25Gb250OnUuUHJvcFR5cGVzLm9iamVjdCx0aXRsZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LG9uTG9hZDp1LlByb3BUeXBlcy5mdW5jLGFzaW46dS5Qcm9wVHlwZXMuc3RyaW5nfSxtLmRlZmF1bHRQcm9wcz17YWM6ITAscmV0aW5hOiEwfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0icHJpY2UiO2UrPXRoaXMucHJvcHMuaXNKdW1ibz8iIHByaWNlLS1qdW1ibyI6IiIsZSs9dGhpcy5wcm9wcy5pc0xpc3Q/IiBwcmljZS0tbGlzdCI6IiIsZSs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciB0PSIiO2lmKHRoaXMucHJvcHMuaXNKdW1ibyl7dmFyIG49dGhpcy5wcm9wcy5wcmljZUluZm8ud2hvbGVBbW91bnQscj10aGlzLnByb3BzLnByaWNlSW5mby5kZWNpbWFsUGFydDt0PWxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOmUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0ludGVnZXJBbW91bnQifSxuKSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudCJ9LHIpKX1lbHNlIHQ9bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19hbW91bnQifSx0aGlzLnByb3BzLmFtb3VudCkpO3JldHVybiB0aGlzLnByb3BzLmhyZWYmJnRoaXMucHJvcHMuY2xpY2tVcmxzP2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJwcmljZSJ9fSx0KTp0fX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iUHJpY2UiLGYucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjdXJyZW5jeTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxpc0p1bWJvOnUuUHJvcFR5cGVzLmJvb2wscHJpY2VJbmZvOnUuUHJvcFR5cGVzLm9iamVjdCxpc0xpc3Q6dS5Qcm9wVHlwZXMuYm9vbCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3QsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNSksYz1yKHApLGY9big0MyksZD1yKGYpLGg9big3KSx5PXIoaCksbT0iL2ltYWdlcy9HLyR7bWVkaWF9L2RhL2NyZWF0aXZlcy9wcmltZS0yeC0yMDE3MDYxNC5wbmciLGI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiZ2V0UHJpbWVMb2dvUGF0aCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGRbImRlZmF1bHQiXS5jb21waWxlKG0se21lZGlhOmV9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFByaW1lTG9nb1BhdGgodGhpcy5wcm9wcy5tZWRpYSksdD1sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3BhdGg6ZSx3aWR0aDoiNDMiLGhlaWdodDoiMTIiLGFsdDoiUHJpbWUiLGFkZGl0aW9uYWxDbGFzczoicHJpbWVMb2dvIixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSk7cmV0dXJuIHRoaXMucHJvcHMuaHJlZiYmdGhpcy5wcm9wcy5jbGlja1VybHM/bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoeVsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6InByaW1lTG9nbyJ9fSx0KTp0fX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWIsYi5kaXNwbGF5TmFtZT0iUHJpbWVMb2dvIixiLnByb3BUeXBlcz17bWVkaWE6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKSxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtuKHRoaXMsZSl9cmV0dXJuIHIoZSxbe2tleToiY29tcGlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt0Lmhhc093blByb3BlcnR5KG4pJiYoZT1lLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFwkeyIrbisifSIsImciKSx0W25dKSl9KSxlfX1dKSxlfSgpO2UuZXhwb3J0cz1uZXcgb30sLCwsLCwsLCwsLCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzUpLGM9cihwKSxmPW4oNyksZD1yKGYpLGg9big0MykseT1yKGgpLG09bigzNiksYj1yKG0pLHY9big1OSksZz1uKDYxKSxfPSIvaW1hZ2VzL0cvJHttZWRpYX0vZGEvY3JlYXRpdmVzL2F1aS1taW5pLXNwcml0ZS0yMDE1LTAyLnBuZyIsUD0iL2ltYWdlcy9HLyR7bWVkaWF9L2RhL2NyZWF0aXZlcy9hdWktbWluaS1zcHJpdGUtMngtdjMucG5nIixrPXsiMS4wIjoiLTY0cHggMCIsMS41OiItMjE4cHggMCIsIjIuMCI6Ii00OHB4IDAiLDIuNToiLTIwMnB4IDAiLCIzLjAiOiItMzJweCAwIiwzLjU6Ii0xODZweCAwIiwiNC4wIjoiLTE2cHggMCIsNC41OiItMTcwcHggMCIsIjUuMCI6IjAgMCJ9LFQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtyZXRpbmE6ITF9LG59cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7KDAsYlsiZGVmYXVsdCJdKShmdW5jdGlvbih0KXtlLnNldFN0YXRlKHtyZXRpbmE6dH0pfSl9fSx7a2V5OiJnZXRTdGFyc1BhdGgiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHlbImRlZmF1bHQiXS5jb21waWxlKHQ/UDpfLHttZWRpYTplfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTdGFyc1BhdGgodGhpcy5wcm9wcy5tZWRpYSx0aGlzLnN0YXRlLnJldGluYSksdD0oMCxnLmdldFJvdW5kZWRTdGFyUmF0aW5nKSh0aGlzLnByb3BzLnJhdGluZyksbj1rW3RdLHI9e2JhY2tncm91bmRQb3NpdGlvbjpufTtyZXR1cm4gbiYmdGhpcy5wcm9wcy5jb3VudCYmdGhpcy5wcm9wcy5jb3VudD4wP2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJzdGFyUmF0aW5nIn19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7cGF0aDplLHNwcml0ZTohMCxzdHlsZTpyLGFkZGl0aW9uYWxDbGFzczoic3RhclJhdGluZ19fc3RhcnMifSksdGhpcy5wcm9wcy5jb3VudCYmbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InN0YXJSYXRpbmdfX2NvdW50IixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSwoMCx2LmZvcm1hdE51bWJlcikodGhpcy5wcm9wcy5jb3VudCwwLHRoaXMucHJvcHMubWFya2V0UGxhY2UpKSk6bnVsbH19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsibWVkaWFDZW50cmFsSW1hZ2UiLCJjbGlja3Rocm91Z2hMaW5rIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09VCxULmRpc3BsYXlOYW1lPSJTdGFyUmF0aW5nIixULnByb3BUeXBlcz17cmF0aW5nOnUuUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLGNvdW50OnUuUHJvcFR5cGVzLm51bWJlcixtZWRpYTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxtYXJrZXRQbGFjZTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dmFyIG89big2MCksaT1yKG8pLGE9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAsbj1hcmd1bWVudHNbMl0scj0iLiIsbz0iLCI7biYmL14oREV8RlJ8SVR8RVN8QlIpJC9pLnRlc3QobikmJihyPSIsIixvPSIuIik7dmFyIGk9MSplLGE9aS50b0ZpeGVkKHQpLHM9YS50b1N0cmluZygpLnNwbGl0KCIuIiksdT1zWzBdLGw9c1sxXSxwPXUucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZyxvKTtyZXR1cm4gbD9wK3IrbDpwfTtlLmV4cG9ydHMuZm9ybWF0TnVtYmVyPWEsZS5leHBvcnRzLmZvcm1hdEN1cnJlbmN5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1zKGUsdCk7cmV0dXJuIG49ci5pc1RyYWlsaW5nU3ltYm9sP3IubnVtYmVyKyIgIityLnN5bWJvbDpyLnN5bWJvbCtyLm51bWJlcn07dmFyIHM9ZnVuY3Rpb24odCxuKXt2YXIgcj1pWyJkZWZhdWx0Il1bbl0sbz0vXihERXxGUnxJVHxFUykkL2kudGVzdChuKSxhPSJKUCI9PT1uLHM9ci5jdXJyZW5jeSx1PWUuZXhwb3J0cy5mb3JtYXROdW1iZXIodCxhPzA6MixuKTtyZXR1cm57c3ltYm9sOnMsbnVtYmVyOnUsaXNUcmFpbGluZ1N5bWJvbDpvfX07ZS5leHBvcnRzLmdldFByaWNlT2JqZWN0PXMsZS5leHBvcnRzLmZvcm1hdERhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIixyPSIiLG89IiIsYT0iIjtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciBzPWUuc3BsaXQoIi0iKTtuPXNbMl0scj1zWzFdLG89aVsiZGVmYXVsdCJdW3RdLmxvY2FsZU1vbnRoc1tyLTFdLGE9c1swXX1lbHNlIG49ZS5nZXREYXRlKCksbz1pWyJkZWZhdWx0Il1bdF0ubG9jYWxlTW9udGhzW2UuZ2V0TW9udGgoKV0sYT1lLmdldEZ1bGxZZWFyKCk7dmFyIHU9dm9pZCAwO3N3aXRjaCh0KXtjYXNlIkZSIjpjYXNlIklUIjpjYXNlIkVTIjp1PW4rIiAiK28udG9Mb3dlckNhc2UoKSsiICIrYTticmVhaztjYXNlIkRFIjp1PW4rIi4gIitvKyIgIithO2JyZWFrO2Nhc2UiSlAiOnU9YSsi5bm0IityKyLmnIgiK24rIuaXpSI7YnJlYWs7ZGVmYXVsdDp1PW8rIiAiK24rIiwgIithfXJldHVybiB1fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtVUzp7c2VsZWN0aW9uTGFiZWw6IkVuZ2xpc2ggKFVTKSIscmVnaW9uOiJuYSIsY3VycmVuY3k6IiQiLGRvbWFpbjoiYW1hem9uLmNvbSIsbWVkaWE6IjAxIixtZXJjaGFudElkOiJBVFZQREtJS1gwREVSIixtYXJrZXRwbGFjZUlkOiJBVFZQREtJS1gwREVSIixsb2NhbGVNb250aHM6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LENBOntzZWxlY3Rpb25MYWJlbDoiRW5nbGlzaCAoQ0EpIixyZWdpb246Im5hIixjdXJyZW5jeToiQ0ROJCAiLGRvbWFpbjoiYW1hem9uLmNhIixtZWRpYToiMTUiLG1lcmNoYW50SWQ6IkEzRFdZSUs2WTlFRVFCIixtYXJrZXRwbGFjZUlkOiJBMkVVUTFXVEdDVEJHMiIsbG9jYWxlTW9udGhzOlsiSmFuIiwiRmViIiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVnIiwiU2VwdCIsIk9jdCIsIk5vdiIsIkRlYyJdfSxVSzp7c2VsZWN0aW9uTGFiZWw6IkVuZ2xpc2ggKFVLKSIscmVnaW9uOiJldSIsY3VycmVuY3k6IsKjIixkb21haW46ImFtYXpvbi5jby51ayIsbWVkaWE6IjAyIixtZXJjaGFudElkOiJBM1A1Uk9LTDVBMU9MRSIsbWFya2V0cGxhY2VJZDoiQTFGODNHOEMyQVJPN1AiLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX0sREU6e3NlbGVjdGlvbkxhYmVsOiJHZXJtYW4iLHJlZ2lvbjoiZXUiLGN1cnJlbmN5OiJFVVIgIixkb21haW46ImFtYXpvbi5kZSIsbWVkaWE6IjAzIixtZXJjaGFudElkOiJBM0pXS0FLUjhYQjdYRiIsbWFya2V0cGxhY2VJZDoiQTFQQTY3OTVVS01GUjkiLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk3DpHJ6IiwiQXByIiwiTWFpIiwiSnVuaSIsIkp1bGkiLCJBdWciLCJTZXB0IiwiT2t0IiwiTm92IiwiRGV6Il19LEZSOntzZWxlY3Rpb25MYWJlbDoiRnJlbmNoIixyZWdpb246ImV1IixjdXJyZW5jeToiRVVSICIsZG9tYWluOiJhbWF6b24uZnIiLG1lZGlhOiIwOCIsbWVyY2hhbnRJZDoiQTFYNkZLNVJESE5COTYiLG1hcmtldHBsYWNlSWQ6IkExM1YxSUIzVklZWlpIIixsb2NhbGVNb250aHM6WyJKYW4uIiwiRsOpdnIuIiwiTWFycyIsIkF2ci4iLCJNYWkiLCJKdWluIiwiSnVpbC4iLCJBb8O7dCIsIlNlcHQuIiwiT2N0LiIsIk5vdi4iLCJEw6ljLiJdfSxJVDp7c2VsZWN0aW9uTGFiZWw6Ikl0YWxpYW4iLHJlZ2lvbjoiZXUiLGN1cnJlbmN5OiJFVVIgIixkb21haW46ImFtYXpvbi5pdCIsbWVkaWE6IjI5IixtZXJjaGFudElkOiJBMTFJTDJQTldZSlU3SCIsbWFya2V0cGxhY2VJZDoiQVBKNkpSQTlORzVWNCIsbG9jYWxlTW9udGhzOlsiR2VuIiwiRmViIiwiTWFyIiwiQXByIiwiTWFnIiwiR2l1IiwiTHVnIiwiQWdvIiwiU2V0IiwiT3R0IiwiTm92IiwiRGljIl19LEVTOntzZWxlY3Rpb25MYWJlbDoiU3BhbmlzaCIscmVnaW9uOiJldSIsY3VycmVuY3k6IkVVUiAiLGRvbWFpbjoiYW1hem9uLmVzIixtZWRpYToiMzAiLG1lcmNoYW50SWQ6IkExQVQ3WVZQRkJXWEJMIixtYXJrZXRwbGFjZUlkOiJBMVJLS1VQSUhDUzlIUyIsbG9jYWxlTW9udGhzOlsiRW5lIiwiRmViIiwiTWFyIiwiQWJyIiwiTWF5IiwiSnVuIiwiSnVsIiwiQWdvIiwiU2VwIiwiT2N0IiwiTm92IiwiRGljIl19LElOOntzZWxlY3Rpb25MYWJlbDoiRW5nbGlzaCAoSU4pIixyZWdpb246ImV1IixjdXJyZW5jeToi4oK5Iixkb21haW46ImFtYXpvbi5pbiIsbWVkaWE6IjMxIixtZXJjaGFudElkOiJBVDk1SUc5T05aRDdTIixtYXJrZXRwbGFjZUlkOiJBMjFUSlJVVU40S0dWIixsb2NhbGVNb250aHM6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LEpQOntzZWxlY3Rpb25MYWJlbDoiSmFwYW5lc2UiLHJlZ2lvbjoiZmUiLGN1cnJlbmN5OiLvv6UiLGRvbWFpbjoiYW1hem9uLmNvLmpwIixtZWRpYToiMDkiLG1lcmNoYW50SWQ6IkFOMVZSUUVORlJKTjUiLG1hcmtldHBsYWNlSWQ6IkExVkMzOFQ3WVhCNTI4Iix5ZWFyVGV4dDoiw6XCucK0IixkYXlUZXh0OiLDpuKAlMKlIixtb250aFRleHQ6IsOmxZPLhiIsbG9jYWxlTW9udGhzOlsiSmFuIiwiRmViIiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVnIiwiU2VwdCIsIk9jdCIsIk5vdiIsIkRlYyJdfSxDTjp7c2VsZWN0aW9uTGFiZWw6IiIscmVnaW9uOiJjbiIsY3VycmVuY3k6IsKlICIsZG9tYWluOiJhbWF6b24uY24iLG1lZGlhOiIyOCIsbWVyY2hhbnRJZDoiQTFBSjE5UFNCNjZUR1UiLG1hcmtldHBsYWNlSWQ6IkFBSEtWMlg3QUZZTFciLGxvY2FsZU1vbnRoczpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX19fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIkFyZ3VtZW50IHJhd1N0YXJSYXRpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgYSBudW1iZXIiKTtyZXR1cm4oTWF0aC5yb3VuZCgyKmUpLzIpLnRvRml4ZWQoMSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0Um91bmRlZFN0YXJSYXRpbmc9bn0sLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9big0MSksYz1yKHApLGY9ITEsZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcy50YXhNZXNzYWdlJiYiIiE9PXRoaXMucHJvcHMudGF4TWVzc2FnZTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlQm94IixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSx0aGlzLnByb3BzLmxpc3RBbW91bnQmJmYmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7YW1vdW50OnRoaXMucHJvcHMubGlzdEFtb3VudCxjdXJyZW5jeTp0aGlzLnByb3BzLmN1cnJlbmN5LGlzTGlzdDohMCxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19saXN0IixzdHlsZTp0aGlzLnByb3BzLmxpc3RQcmljZVN0eWxlfSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHthbW91bnQ6dGhpcy5wcm9wcy5idXlBbW91bnQsY3VycmVuY3k6dGhpcy5wcm9wcy5jdXJyZW5jeSxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19idXkiLHN0eWxlOnRoaXMucHJvcHMuYnV5UHJpY2VTdHlsZX0pLGUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcmljZUJveF9fdGF4TWVzc2FnZSJ9LHRoaXMucHJvcHMudGF4TWVzc2FnZSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJwcmljZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWQsZC5kaXNwbGF5TmFtZT0iUHJpY2VCb3giLGQucHJvcFR5cGVzPXtidXlBbW91bnQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsbGlzdEFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcsY3VycmVuY3k6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsdGF4TWVzc2FnZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGJ1eVByaWNlU3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGxpc3RQcmljZVN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdH19LCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9big1KSxjPXIocCksZj1uKDI4KSxkPXIoZiksaD1uKDM4KSx5PXIoaCksbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe28odGhpcyx0KTt2YXIgbj1pKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSk7cmV0dXJuIG4uc3RydWN0dXJlPW5ldyBkWyJkZWZhdWx0Il0obi5nZXRTdHJ1Y3R1cmVzKCkpLG4uaW5pdFN0cnVjdHVyZShlKSxuLmNvbXBvbmVudHNNYXA9bi5nZXRDb21wb25lbnRzTWFwKCksbi5kb21SZWZzPXt9LG4uc3RhdGU9e3Nob3dMaXN0UHJpY2U6ITB9LG59cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImluaXRTdHJ1Y3R1cmUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZm9ybWF0dGVkUHJpY2UmJiIiIT09ZS5mb3JtYXR0ZWRQcmljZSYmIWUuaXNEaWdpdGFsO3RoaXMuc3RydWN0dXJlLmhpZGVCbG9jaygicHJpY2VCb3giLCF0KTt2YXIgbj10JiZlLmlzUHJpbWU7aWYodGhpcy5zdHJ1Y3R1cmUuaGlkZUJsb2NrKCJwcmltZUxvZ28iLCFuKSwiSlAiPT09dGhpcy5wcm9wcy5tYXJrZXRQbGFjZSl7dmFyIHI9dGhpcy5zdHJ1Y3R1cmUuZ2V0Q29tcG9uZW50UHJvcCgiaGVhZGxpbmUiLCJzdHlsZSIpO3ImJihyLnZhbHVlLmZvbnRTdHlsZT0ibm9ybWFsIix0aGlzLnN0cnVjdHVyZS5zZXRDb21wb25lbnRQcm9wKCJoZWFkbGluZSIsInN0eWxlIixyLnZhbHVlLCJjb25zdGFudCIpKX1lLm1vYmlsZUhlYWRsaW5lJiZ0aGlzLnN0cnVjdHVyZS5zZXRDb21wb25lbnRQcm9wKCJoZWFkbGluZSIsInRleHQiLCJtb2JpbGVIZWFkbGluZSIsInBhdGgiKX19LHtrZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZG9tUmVmcy5wcmljaW5nJiZ0aGlzLnNldFN0YXRlKHtzaG93TGlzdFByaWNlOiEoMCx5WyJkZWZhdWx0Il0pKHRoaXMuZG9tUmVmcy5wcmljaW5nKS5jaGlsZHJlbk92ZXJmbG93KCl9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnN0YXRlLnNob3dMaXN0UHJpY2U/dGhpcy5wcm9wcy5mb3JtYXR0ZWRMaXN0UHJpY2U6bnVsbDtyZXR1cm4gdGhpcy5zdHJ1Y3R1cmUuc2V0Q29tcG9uZW50UHJvcCgicHJpY2VCb3giLCJsaXN0QW1vdW50IixlLCJjb25zdGFudCIpLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7Y2xhc3NOYW1lOiJtb2JpbGVSYXZlbiIscmVuZGVyaW5nQ29udGV4dDp0aGlzLnByb3BzLHN0cnVjdHVyZTp0aGlzLnN0cnVjdHVyZS5tb2RlbCxjb21wb25lbnRzTWFwOnRoaXMuY29tcG9uZW50c01hcCxkb21SZWZzOnRoaXMuZG9tUmVmcyx1cGRhdGVPblJlc2l6ZTohMH0pfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPW0sbS5URU1QTEFURV9JRD0ibW9iaWxlUmF2ZW4iLG0uZGlzcGxheU5hbWU9Ik1vYmlsZVJhdmVuIixtLnByb3BUeXBlcz17fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPShyKHUpLG4oMTAzKSkscD1yKGwpLGM9bigxMDUpLGY9cihjKSxkPW4oMTA2KSxoPXIoZCkseT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRTdHJ1Y3R1cmVzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybigwLGZbImRlZmF1bHQiXSkoKX19LHtrZXk6ImdldENvbXBvbmVudHNNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHQuQ09NUE9ORU5UU19NQVB9fV0pLHR9KHBbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPXkseS5DT01QT05FTlRTX01BUD1oWyJkZWZhdWx0Il0seS5kaXNwbGF5TmFtZT0iTW9iaWxlUmF2ZW5Db250cm9sIix5LnByb3BUeXBlcz17fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJue2lkOiIwIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEyNXB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjAiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsd2lkdGg6IjE2MHB4IixoZWlnaHQ6IjEwMCUiLHBhZGRpbmc6IjVweCAxMHB4IDVweCAxMHB4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJhc2luSW1hZ2UiLHByb3BzOlt7bmFtZToiaHJlZiIsdmFsdWU6ImFkTGluayIsdHlwZToicGF0aCJ9LHtuYW1lOiJjbGlja1VybHMiLHZhbHVlOiJjbGlja1VybHMiLHR5cGU6InBhdGgifSx7bmFtZToicGF0aCIsdmFsdWU6ImFzaW5JbWFnZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJhbHQiLHZhbHVlOiJwcm9kdWN0VGl0bGUiLHR5cGU6InBhdGgifSx7bmFtZToic3giLHZhbHVlOjgwLHR5cGU6ImNvbnN0YW50In1dfSxzdHlsZTpbe25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgMTI1cHgifV19LHtpZDoiMC4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxMDAlIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiY2VudGVyIixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHdpZHRoOiIxMDAlIixwYWRkaW5nOiIwIDEwcHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjaGlsZHJlbjpbe2lkOiIwLjEuMC4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCAwIDVweCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJoZWFkbGluZSJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InRleHRMaW5rIixwcm9wczpbe25hbWU6ImZvbnQiLHZhbHVlOnttYXhMaW5lczoyLG1pbkZvbnRQeDoxNixtYXhGb250UHg6MTh9LHR5cGU6ImNvbnN0YW50In0se25hbWU6InRleHQiLHZhbHVlOiJoZWFkbGluZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJocmVmIix2YWx1ZToiYWRMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJkaXNwbGF5QXNUZXh0Iix2YWx1ZTohMCx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMSIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA1cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoidGV4dExpbmsiLHByb3BzOlt7bmFtZToiZm9udCIsdmFsdWU6e21heExpbmVzOjEsbWluRm9udFB4OjEyLG1heEZvbnRQeDoxMn0sdHlwZToiY29uc3RhbnQifSx7bmFtZToidGV4dCIsdmFsdWU6InByb2R1Y3RUaXRsZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJocmVmIix2YWx1ZToiYWRMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJkaXNwbGF5QXNUZXh0Iix2YWx1ZTohMSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMiIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA0cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoic3RhclJhdGluZyIscHJvcHM6W3tuYW1lOiJyYXRpbmciLHZhbHVlOiJjdXN0b21lclJldmlld1N1bW1hcnkucmF0aW5nIix0eXBlOiJwYXRoIn0se25hbWU6ImNvdW50Iix2YWx1ZToiY3VzdG9tZXJSZXZpZXdTdW1tYXJ5LmNvdW50Iix0eXBlOiJwYXRoIn0se25hbWU6ImhyZWYiLHZhbHVlOiJyZXZpZXdMaW5rIix0eXBlOiJwYXRoIn0se25hbWU6ImNsaWNrVXJscyIsdmFsdWU6ImNsaWNrVXJscyIsdHlwZToicGF0aCJ9LHtuYW1lOiJtZWRpYSIsdmFsdWU6ImkxOG4uc2V0dGluZ3MubWVkaWEiLHR5cGU6InBhdGgifSx7bmFtZToibWFya2V0UGxhY2UiLHZhbHVlOiJtYXJrZXRQbGFjZSIsdHlwZToicGF0aCJ9XX19LHtpZDoiMC4xLjAuMyIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljaW5nIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4xLjAuMy4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCA1cHggMCAwIn0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmljZUJveCJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaWNlQm94Iixwcm9wczpbe25hbWU6ImJ1eUFtb3VudCIsdmFsdWU6ImZvcm1hdHRlZFByaWNlIix0eXBlOiJwYXRoIn0se25hbWU6Imxpc3RBbW91bnQiLHZhbHVlOiJmb3JtYXR0ZWRMaXN0UHJpY2UiLHR5cGU6InBhdGgifSx7bmFtZToiY3VycmVuY3kiLHZhbHVlOiJjdXJyZW5jeVN5bWJvbCIsdHlwZToicGF0aCJ9LHtuYW1lOiJ0YXhNZXNzYWdlIix2YWx1ZToiaTE4bi50YXhNZXNzYWdlIix0eXBlOiJwYXRoIn0se25hbWU6ImJ1eVByaWNlU3R5bGUiLHZhbHVlOntmb250U2l6ZToiMTVweCJ9LHR5cGU6ImNvbnN0YW50In0se25hbWU6Imxpc3RQcmljZVN0eWxlIix2YWx1ZTp7Zm9udFNpemU6IjEzcHgifSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMy4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3cifSxtZXRhZGF0YTpbe25hbWU6InJlZiIsdmFsdWU6InByaW1lTG9nbyJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNvbXBvbmVudDp7aWQ6InByaW1lTG9nbyIscHJvcHM6W3tuYW1lOiJtZWRpYSIsdmFsdWU6ImkxOG4uc2V0dGluZ3MubWVkaWEiLHR5cGU6InBhdGgifSx7c3R5bGU6e3dpZHRoOiIyOXB4IixoZWlnaHQ6IjEzcHgifX1dfSxzdHlsZTpbe25hbWU6Im92ZXJmbG93Iix2YWx1ZToidmlzaWJsZSJ9XX1dLGNzc0NsYXNzZXM6WyJibG9jay0taW5saW5lIiwiIl0sc3R5bGU6W3tuYW1lOiJ3aGl0ZVNwYWNlIix2YWx1ZToibm9ybWFsIn1dfV19LHtpZDoiMC4xLjEiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyIsbWFyZ2luOiIwIDEwcHggMCAxMHB4IixoZWlnaHQ6IjEyM3B4In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiIifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxzdHlsZTpbe25hbWU6Im9wYWNpdHkiLHZhbHVlOiIwLjY0In0se25hbWU6ImZsZXgiLHZhbHVlOiIwIDAgOXB4In1dLGNvbXBvbmVudDp7aWQ6Im1lZGlhQ2VudHJhbEltYWdlQ29udGFpbmVyIixwcm9wczpbe25hbWU6InBhdGgiLHZhbHVlOiIvaW1hZ2VzL0cvMDEvQW1hem9uQnJhbmRTdG9yZXNQbGF0Zm9ybS9ibGFja19hcnJvdy5wbmciLHR5cGU6ImNvbnN0YW50In0se25hbWU6ImFsdCIsdmFsdWU6IkdyYXkgQXJyb3ciLHR5cGU6ImNvbnN0YW50In0se25hbWU6InJvbGUiLHZhbHVlOiJwcmVzZW50YXRpb24iLHR5cGU6ImNvbnN0YW50In1dfX1dLHN0eWxlOlt7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6IiNGRkZGRkYifV19XSxzdHlsZTpbe25hbWU6ImJvcmRlciIsdmFsdWU6IjFweCBzb2xpZCAjZGRkIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiIjRkZGRkZGIn1dfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX12YXIgbz1uKDQwKSxpPXIobyksYT1uKDM5KSxzPXIoYSksdT1uKDU4KSxsPXIodSkscD1uKDc4KSxjPXIocCksZj1uKDQyKSxkPXIoZiksaD1uKDMzKSx5PXIoaCk7ZS5leHBvcnRzPXthc2luSW1hZ2U6aVsiZGVmYXVsdCJdLHRleHRMaW5rOnNbImRlZmF1bHQiXSxzdGFyUmF0aW5nOmxbImRlZmF1bHQiXSxwcmljZUJveDpjWyJkZWZhdWx0Il0scHJpbWVMb2dvOmRbImRlZmF1bHQiXSxtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lcjp5WyJkZWZhdWx0Il19fV0pOzt2YXIgJGFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkJykscmVuZGVyaW5nQ29udGV4dCA9IHsibWFya2V0UGxhY2UiOiJVUyIsImFkTGluayI6Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5HelM0ZWVFRmxGSHJKV2FXdUQ0WTBBQUFGaG1lRTI1QUVBQUFHUUFURHRZQzAvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wMTM0NjkyODg4P2FheGl0az1nN0dtaVFJWkhid1lxVWt0YTg5QUVBIiwicmV2aWV3TGluayI6Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW5HelM0ZWVFRmxGSHJKV2FXdUQ0WTBBQUFGaG1lRTI1QUVBQUFHUUFURHRZQzAvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8wMTM0NjkyODg4P2FheGl0az1nN0dtaVFJWkhid1lxVWt0YTg5QUVBI2N1c3RvbWVyUmV2aWV3cyIsImNyZWF0aXZlSWQiOiI3MTAyMjA5NTUwMDAxIiwiYWRJZCI6IjIwNTkwOTM0MjA3MDEiLCJwcm9kdWN0VGl0bGUiOiJMZWFybiBQeXRob24gMyB0aGUgSGFyZCBXYXk6IEEgVmVyeSBTaW1wbGUgSW50cm9kdWN0aW9uIHRvIHRoZSBUZXJyaWZ5aW5nbHkgQmVhdXRpZnVsIFdvcmxkIG9mIENvbXB1dGVycyBhbmQgQ29kZSAoWmVkIFNoYXcncyBIYXJkIFdheSBTZXJpZXMpIiwiaGVhZGxpbmUiOiJMZWFybiBQeXRob24gd2l0aCB0aGlzIHByb3ZlbiBtZXRob2QiLCJhc2luSW1hZ2UiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTF3ZEFRS0Z0cUwuX0FDX1NSMTI4LDE0NV8uanBnIiwidW5zcHJpdGVkSW1hZ2UiOiJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTE2QTM1VTNBNkwuanBnIiwiY3VzdG9tZXJSZXZpZXdTdW1tYXJ5Ijp7InJhdGluZyI6My42Mjc2NTQwNzUsImNvdW50IjozNiwiYXNpbiI6IjAxMzQ2OTI4ODgifSwiYmFkZ2VJbmZvcm1hdGlvbk1hcCI6bnVsbCwiY3VycmVuY3lTeW1ib2wiOiIkIiwiZm9ybWF0dGVkTGlzdFByaWNlIjoiMzkuOTkiLCJmb3JtYXR0ZWRQcmljZSI6IjI0LjU3IiwicHJpY2VJbmZvIjp7Indob2xlQW1vdW50IjoiMjQiLCJkZWNpbWFsUGFydCI6IjU3In0sInByaWNlRm9ybWF0dGluZ0ZsYWdzIjp7ImlzU3ltYm9sU3VwZXJzY3JpcHQiOnRydWUsInN5bWJvbFBvc2l0aW9uIjoicHJlZml4ZWQifSwicHJpY2VQZXJVbml0TWVzc2FnZSI6IiIsImlzUHJpbWUiOnRydWUsImlzRGlnaXRhbCI6ZmFsc2UsImkxOG4iOnsic2V0dGluZ3MiOnsic2VsZWN0aW9uTGFiZWwiOiJFbmdsaXNoIChVUykiLCJyZWdpb24iOiJuYSIsImN1cnJlbmN5IjoiJCIsImRvbWFpbiI6ImFtYXpvbi5jb20iLCJtZWRpYSI6IjAxIiwibWVyY2hhbnRJZCI6IkFUVlBES0lLWDBERVIiLCJtYXJrZXRwbGFjZUlkIjoiQVRWUERLSUtYMERFUiIsImxvY2FsZU1vbnRocyI6WyJKYW4iLCJGZWIiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWciLCJTZXB0IiwiT2N0IiwiTm92IiwiRGVjIl19LCJ0YXhNZXNzYWdlIjoiIiwic3BvbnNvcmVkQnkiOiJTcG9uc29yZWQgYnkiLCJzaG9wTm93IjoiU2hvcCBub3ciLCJiZXN0U2VsbGVyIjoiQmVzdCBTZWxsZXIiLCJuZXdSZWxlYXNlIjoiTmV3IFJlbGVhc2UiLCJiYWRnZUluIjoiaW4ifSwiY2xpY2tVcmxzIjpbImh0dHBzOi8vcy5hbWF6b24tYWRzeXN0ZW0uY29tL2l1Mz9kPWZvcmVzdGVyLWRpZCZleC1mY2g9NDE2NzMxNjEzJmV4LWZhcmdzPT9pJTNEY2JOTGg1NFFXVVVlc2xacGE0UGhqUSUyNmFzaSUzRCUzQTAxMDFiMGRkOWU5ZWQ2ZTRkMTRlZTU5MmQxNDMwNzJjNTA1YTUzZTFlM2U3NmE2NTNhYjY2M2ZhMDEwZmVjOTkwMzg2JTI2Y2xpY2slM0QxJmNiPTE1MTg3MDUxMjkyMzQiXSwiYnJhbmRMb2dvIjoiaW1hZ2VzL1MvYWJzLWltYWdlLXVwbG9hZC1uYS8yL2Ftcy9BVFZQREtJS1gwREVSLzM2MTJjZTM1NjUxNmUxMTIyMjUyNjg4OTczZTVhMTYwLncyNDYuaDI2OS5fQ1IwLDAsMjQ2LDI2OV9TTDI4MF9TWTgwXy5qcGciLCJicmFuZE5hbWUiOiJBZGRpc29uLVdlc2xleSBQcm9mZXNzaW9uYWwiLCJwcm9kdWN0SW1hZ2UiOnsidXJsIjoiaHR0cHM6Ly9pbWFnZXMtbmEuc3NsLWltYWdlcy1hbWF6b24uY29tL2ltYWdlcy9JLzUxNkEzNVUzQTZMLmpwZyIsImhlaWdodCI6NTAwLCJ3aWR0aCI6Mzg0fX07aWYgKCRhZCkge1JlYWN0RE9NLnJlbmRlcihSZWFjdC5jcmVhdGVFbGVtZW50KExpYnJhcnkuZGVmYXVsdCwgcmVuZGVyaW5nQ29udGV4dCksICRhZCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYWRkVmlld2FiaWxpdHlMaXN0ZW5lcigkYWQpO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLmFkZENyZWF0aXZlQ2xpY2tMaXN0ZW5lcigkYWQpO308L3NjcmlwdD48L2JvZHk+PC9odG1sPjwvZGl2Pg==&quot;,&quot;enableAdBlockerDetector&quot;:false,&quot;disableResizeFunc&quot;:true,&quot;fallbackStaticAdImgUrl&quot;:&quot;&quot;,&quot;fallbackStaticAdClickUrl&quot;:&quot;&quot;,&quot;fallbackStaticAdExtraStyle&quot;:&quot;&quot;,&quot;advertisementTextOnTop&quot;:false,&quot;viewabilityStandards&quot;:[{&quot;p&quot;:0,&quot;t&quot;:0,&quot;def&quot;:&quot;amzn&quot;},{&quot;p&quot;:50,&quot;t&quot;:1,&quot;def&quot;:&quot;iab&quot;},{&quot;p&quot;:100,&quot;t&quot;:0,&quot;def&quot;:&quot;groupm&quot;}],&quot;ajaxWeblabTriggerId&quot;:&quot;&quot;,&quot;hostDomain&quot;:&quot;https://www.amazon.com&quot;,&quot;userAgent&quot;:&quot;Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1&quot;,&quot;userConnectionInfo&quot;:{&quot;mobileConnectionType&quot;:null,&quot;connectionType&quot;:&quot;unknown&quot;},&quot;isAUIAvailable&quot;:&quot;3.18.2-2018-02-15&quot;,&quot;cookie&quot;:&quot;x-wl-uid=1WXBZ0Gt/NIjrMrKToWzqEoShlkbJFxXqK7d7eruyBHba3bx516TjY5FSIvziQCA3Gv7b0MffkZo=; aws_lang=en; aws-target-static-id=1485170961612-541803; aws-target-data=%7B%22support%22%3A%221%22%7D; aws-ubid-main=159-7441294-4671144; s_fid=5D55736E4E81630C-2BCB156C67276537; s_ppv=0; skin=noskin; session-token=GwmX9b8ErPr+y9/X4tOnH2NlakyrEB6uH0ndiwOgxZNJpv9EDYAzzTicJ2VkazGtd0qeseZAEF59w+otDIc1tgsjaHDIM9Ap01XspZFijLZnp4ZTcVlOy46T9mnipC6w67Im+F234XhEskN4jEHIOPuWvdjG6KieF9B1qlWzyY48ryzuxbHISWDfjFuLTn78ggiBueWBLjjxz8lfGNtReOgss5mLTZOaDB+7SUFgVbom2aIFlXb26PZ1UZQ04Ri1; ubid-main=131-2393016-1049709; session-id=147-0816675-1753153; aws-target-visitor-id=1485170961617-283514.26_17; aws-mkto-trk=id%3A112-TZM-766%26token%3A_mch-aws.amazon.com-1515491028950-95143; aws-session-id=140-3318658-9277840; aws-session-id-time=2146211066l; regStatus=registered; s_sq=%5B%5BB%5D%5D; __utmv=194891197.%22Y2eilR%401E0eaUd1y4Jy478UIiZmNGbRRjXHrbQvpCaiuGPXLvdZpy4%3FkXZ79EsvP%22; __utmc=194891197; pN=7; s_pers=%20s_vnum%3D1942562894050%2526vn%253D3%7C1942562894050%3B%20s_invisit%3Dtrue%7C1517331617155%3B%20s_nr%3D1517329817167-Repeat%7C1525105817167%3B; s_sess=%20s_cc%3Dtrue%3B%20s_sq%3D%3B; appstore-devportal-locale=en_US; AMCVS_4A8581745834114C0A495E2B%40AdobeOrg=1; AMCV_4A8581745834114C0A495E2B%40AdobeOrg=-1891778711%7CMCIDTS%7C17571%7CMCMID%7C11904074407816115763545700786442573624%7CMCOPTOUT-1518131239s%7CNONE%7CMCAID%7C2D04D1058530F5A2-6000030420009E4A%7CvVersion%7C2.4.0; s_lv=1518124039358; s_cc=true; c_m=undefinedwww.google.deNatural%20Search; session-id-time=2082787201l; s_vn=1549660061459%26vn%3D6; aws-userInfo=%7B%22arn%22%3A%22arn%3Aaws%3Aiam%3A%3A672413603088%3Aroot%22%2C%22alias%22%3A%22%22%2C%22username%22%3A%22Maja%2520Komel%22%2C%22keybase%22%3A%22%22%2C%22issuer%22%3A%22https%3A%2F%2Fwww.amazon.com%2Fap%2Fsignin%22%7D; aws-session-token=\&quot;+9lzzvGeCuRd2h296LsZD8fsOUkTpImyWpsvgPeqP6CutmWSJYNaJPpgFNd+LARPtdTJSouC444Vz/2kOOuvF9e1ccFSXb+ZnGkBaHuTY1xRGvDGe8RnwwC3J1w69hhrBu4Y1iWUo75hDCoOFI+QpavGp9nOhCVlx6xYEsCN0Y8s3pp1r/MWFsfmhN5pdiyZO1Lzcoc4isZiiTZLPz0Cuu8WoxHyC7I4ldZm8oIyCgM=\&quot;; __utma=194891197.1735141489.1485170987.1517331742.1518295984.26; __utmz=194891197.1518295984.26.19.utmccn=(referral)|utmcsr=console.aws.amazon.com|utmcct=/cloud9/home|utmcmd=referral; s_dslv=1518296040762; s_nr=1518296040774-Repeat; csm-hit=s-7F3MGDYTH1YH8KVBSFWJ|1518705129103&quot;,&quot;aPageStart&quot;:1518705128898,&quot;adStartTime&quot;:1518705130301}" id="ape_detail_mobile-hero-quick-promo_mweb_iframe" src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/msf-1.15._V488131532_.html" scrolling="no" height="125px" width="100%" class="" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="true" allowfullscreen="" mozallowfullscreen="" webkitallowfullscreen="" data-arid="d4f0ef13f48c4b3c907f7e04775cdb08" style="width: 1px; min-width: 100%; display: none !important;"></iframe></div></div><script>(function(){function a(d,e){if(window.addEventListener){window.addEventListener(d,e,false);}else{if(window.attachEvent){window.attachEvent("on"+d,e);}}}function c(d,e){if(window.removeEventListener){window.removeEventListener(d,e,false);}else{if(window.detachEvent){window.detachEvent("on"+d,e);}}}var b=function(){(function(){(function(j,n){j.sfLogErrors=j.sfLogErrors||false;var o=o||function(s,r){r=r||new Error(s);if(j.ue&&typeof ue.count=="function"){ue.count("adplacements:safeFrameError",1);}if(!j.sfLogErrors){return;}if(j.ueLogError){j.ueLogError(r,{logLevel:"ERROR",attribution:"APE-safeframe",message:s+" "});}else{if(typeof console!=="undefined"&&console.error){console.error(s,r);}}};function d(){return j.innerHeight||n.documentElement.clientHeight;}function g(){return j.innerWidth||n.documentElement.clientWidth;}function e(t,r,s){if(t>0){return(s>t);}else{return(r>0);}}var f=function(){return(Date.now?Date.now():new Date().getTime());};throttle=function(s,u,y){var r,w,z;var x=null;var v=0;if(!y){y={};}var t=function(){v=y.leading===false?0:f();x=null;z=s.apply(r,w);if(!x){r=w=null;}};return function(){var B=f();if(!v&&y.leading===false){v=B;}var A=u-(B-v);r=this;w=arguments;if(A<=0||A>u){if(x){clearTimeout(x);x=null;}v=B;z=s.apply(r,w);if(!x){r=w=null;}}else{if(!x&&y.trailing!==false){x=setTimeout(t,A);}}return z;};};function l(u,w,v,r){try{var t=n.getElementById(u).getBoundingClientRect();if(e(t.top,t.bottom,d())&&e(t.left,t.right,g())){if(typeof uet=="function"){uet("bb","adplacements:viewablelatency:"+w,{wb:1});if(v){uet("bb","adplacements:viewablelatency:"+v,{wb:1});}}if(typeof uex=="function"&&j.ue&&typeof ue.count=="function"){if(j.apeViewableLatencyTrackers[r].loaded){uex("ld","adplacements:viewablelatency:"+w,{wb:1});if(v){uex("ld","adplacements:viewablelatency:"+v,{wb:1});}ue.count("adplacements:htmlviewed:loaded:"+w,1);if(v){ue.count("adplacements:htmlviewed:loaded:"+v,1);}}ue.count("adplacements:htmlviewed:"+w,1);if(v){ue.count("adplacements:htmlviewed:"+v,1);}}j.apeViewableLatencyTrackers[r].viewed=true;if(j.apeViewableLatencyTrackers[r].tracker){c("scroll",j.apeViewableLatencyTrackers[r].tracker);c("resize",j.apeViewableLatencyTrackers[r].tracker);}}}catch(s){j.apeViewableLatencyTrackers[r].valid=false;}}try{j.apeViewableLatencyTrackers=j.apeViewableLatencyTrackers||{};var q="ape_detail_mobile-hero-quick-promo_mweb_placement";var p="detail_mobile-hero-quick-promo_mweb".replace(/\_/g,":");var h="";var i="d4f0ef13f48c4b3c907f7e04775cdb08";j.apeViewableLatencyTrackers[i]=j.apeViewableLatencyTrackers[i]||{};j.apeViewableLatencyTrackers[i].valid=true;l(q,p,h,i);if(j.apeViewableLatencyTrackers[i].valid&&!j.apeViewableLatencyTrackers[i].viewed){j.apeViewableLatencyTrackers[i].tracker=throttle(function(){l(q,p,h,i);},20);a("scroll",j.apeViewableLatencyTrackers[i].tracker);a("resize",j.apeViewableLatencyTrackers[i].tracker);}}catch(k){if(j.apeViewableLatencyTrackers&&j.apeViewableLatencyTrackers.d4f0ef13f48c4b3c907f7e04775cdb08){j.apeViewableLatencyTrackers.d4f0ef13f48c4b3c907f7e04775cdb08.valid=false;}o("Error initializing viewable latency instrumentation",k);}try{j["mobile-hero-quick-promo"]={};j["mobile-hero-quick-promo"].adStartTime=(new Date()).getTime();var m=j.DAsf||j.MAsf||null;if(m){m.loadAds();}else{m=n.createElement("script");m.type="text/javascript";m.async=true;m.setAttribute("crossorigin","anonymous");m.charset="utf-8";m.src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/MAsf-1.15._CB488131535_.js?csm_attribution=APE-SafeFrame";m.onerror=function(){o("Error loading SafeFrame library");};(n.getElementsByTagName("head")[0]||n.getElementsByTagName("body")[0]).appendChild(m);}}catch(k){o("Error appending MAsf library",k);}}(window,document));})();};b();})();</script>
</div><div class="aw-campaigns"></div><div class="aw-campaigns"></div>
<div id="addOnItem_feature_div" data-feature-name="addOnItem" data-template-name="addOnItem" class="a-section a-spacing-none feature t-prnt t-full">
</div><div id="sims-fbt-primary">
<div class="a-section a-spacing-large sims-fbt-container">
<h2 class="a-spacing-mini">
Frequently bought together
</h2>
<div class="a-box-group similarities-widget sims-fbt">
<div class="a-box" style="height:100px;"><div class="a-box-inner">
<div id="sims-fbt-no-images"><span class="a-color-secondary sims-fbt-choose-items-to-buy a-hidden">Choose items to buy together.</span></div>
<ul class="a-unordered-list a-nostyle a-vertical sims-fbt-images-list">
<li class="sims-fbt-image sims-fbt-image-1"><span class="a-list-item"> <img alt="Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)" src="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._AC_UL210_SR210,210_.jpg" data-fling-asin="193435659X" data-fling-refmarker="pd_aw_fbt_14_img_1" class="a-dynamic-image a-dynamic-image-container" height="70" width="70" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._AC_UL140_SR140,140_.jpg&quot;:[140,140],&quot;https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._AC_UL70_SR70,70_.jpg&quot;:[70,70],&quot;https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._AC_UL210_SR210,210_.jpg&quot;:[210,210]}"> </span></li>
<li class="sims-fbt-image sims-fbt-image-2"><span class="a-list-item">
<a href="/gp/aw/d/1941222153/ref=pd_aw_fbt_14_img_2?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ" class="sims-fbt-image-link"><img alt="Seven More Languages in Seven Weeks: Languages That Are Shaping the Future" src="https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL210_SR210,210_.jpg" data-fling-asin="1941222153" data-fling-refmarker="pd_aw_fbt_14_img_2" class="a-dynamic-image a-dynamic-image-container" height="70" width="70" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL210_SR210,210_.jpg&quot;:[210,210],&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL140_SR140,140_.jpg&quot;:[140,140],&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL70_SR70,70_.jpg&quot;:[70,70]}"></a>
</span></li>
<li class="sims-fbt-image sims-fbt-image-3"><span class="a-list-item">
<a href="/gp/aw/d/1934356921/ref=pd_aw_fbt_14_img_3?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ" class="sims-fbt-image-link"><img alt="Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement" src="https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL210_SR210,210_.jpg" data-fling-asin="1934356921" data-fling-refmarker="pd_aw_fbt_14_img_3" class="a-dynamic-image a-dynamic-image-container" height="70" width="70" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL210_SR210,210_.jpg&quot;:[210,210],&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL140_SR140,140_.jpg&quot;:[140,140],&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL70_SR70,70_.jpg&quot;:[70,70]}"></a>
</span></li>
</ul>
</div></div>
<div id="fbt-expander-content" class="a-box a-last a-hidden"><div class="a-box-inner a-padding-none">
<ul class="a-unordered-list a-nostyle a-vertical">
<form class="sims-fbt-row-form" autocomplete="off"> <li class="sims-fbt-row-border"><span class="a-list-item">
<div class="sims-fbt-row">
<div class="sims-fbt-checkbox-div"><span class="a-declarative" data-action="fbt-checkbox-click" data-fbt-checkbox-click="{&quot;itemNum&quot;:&quot;1&quot;,&quot;offerListingID&quot;:&quot;aAN3%2BOZQtEJvoFRXyYikPQJKEdTY07uvf4lLoaq4lId9LRmUAObsrNE59FM90ysHcKuU%2FXrIFctsLn81CusntJYZ8zKGx0UZkui6Z3WTzGCM3aZbXXg7Fw%3D%3D&quot;,&quot;asin&quot;:&quot;193435659X&quot;}"><div data-a-input-name="offeringID.1" class="a-checkbox a-checkbox-fancy a-control-row a-touch-checkbox sims-fbt-checkbox"><label><input type="checkbox" name="offeringID.1" value="aAN3%2BOZQtEJvoFRXyYikPQJKEdTY07uvf4lLoaq4lId9LRmUAObsrNE59FM90ysHcKuU%2FXrIFctsLn81CusntJYZ8zKGx0UZkui6Z3WTzGCM3aZbXXg7Fw%3D%3D" checked=""><i class="a-icon a-icon-checkbox"></i><span class="a-label a-checkbox-label"></span></label></div></span></div>
<div class="sims-fbt-textbox-div sims-fbt-row-outer">
<div class="sims-fbt-item-details">
<div class="a-row sims-fbt-title">
<div class="p13n-sc-truncate p13n-sc-line-clamp-2" aria-hidden="true" data-rows="2">
<span class="sims-fbt-this-item a-text-bold">This item:</span>Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)
</div>
</div> <span class="a-color-price"><span class="p13n-sc-price">$21.11</span></span> <i class="a-icon a-icon-prime sims-fbt-prime-badge" role="img" aria-label="Prime"></i>
</div>
</div>
</div>
</span></li><li class="sims-fbt-row-border"><span class="a-list-item">
<div class="sims-fbt-row">
<div class="sims-fbt-checkbox-div"><span class="a-declarative" data-action="fbt-checkbox-click" data-fbt-checkbox-click="{&quot;itemNum&quot;:&quot;2&quot;,&quot;offerListingID&quot;:&quot;LSVHb9KAobT91TBWBSk8QuKDDfbGnWSTBk3MdiKlUMQr%2Bs9JqV5iyMtHN92rhAqxIl6%2B2tOPe3EUWvwmHDB92tcw7fS8J5F8AIo2EhERMBedXLfv8gm19Q%3D%3D&quot;,&quot;asin&quot;:&quot;1941222153&quot;}"><div data-a-input-name="offeringID.2" class="a-checkbox a-checkbox-fancy a-control-row a-touch-checkbox sims-fbt-checkbox"><label><input type="checkbox" name="offeringID.2" value="LSVHb9KAobT91TBWBSk8QuKDDfbGnWSTBk3MdiKlUMQr%2Bs9JqV5iyMtHN92rhAqxIl6%2B2tOPe3EUWvwmHDB92tcw7fS8J5F8AIo2EhERMBedXLfv8gm19Q%3D%3D" checked=""><i class="a-icon a-icon-checkbox"></i><span class="a-label a-checkbox-label"></span></label></div></span></div>
<div class="sims-fbt-row-outer">
<a href="/gp/aw/d/1941222153/ref=pd_aw_fbt_14_2?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ" class="sims-fbt-item-details sims-fbt-link-box a-touch-link">
<i class="a-icon a-icon-touch-link"></i>
<div class="a-row sims-fbt-title">
<div class="p13n-sc-truncate p13n-sc-line-clamp-2" aria-hidden="true" data-rows="2">
Seven More Languages in Seven Weeks: Languages That Are Shaping the Future
</div>
</div> <span class="a-color-price"><span class="p13n-sc-price">$28.54</span></span> <i class="a-icon a-icon-prime sims-fbt-prime-badge" role="img" aria-label="Prime"></i>
</a>
</div>
</div>
</span></li><li class="sims-fbt-row-border"><span class="a-list-item">
<div class="sims-fbt-row">
<div class="sims-fbt-checkbox-div"><span class="a-declarative" data-action="fbt-checkbox-click" data-fbt-checkbox-click="{&quot;itemNum&quot;:&quot;3&quot;,&quot;offerListingID&quot;:&quot;OG%2BFhLwOc2w1Oh%2BmdBQ7LBHZA36ZaYDqSopK68DLfx%2FvY61A35TkEBTwRwj8VsCyoo2MoRChLNSSlBjGJqWHFptlSBADIOUqFgeD8%2BAZnSPY7ebDb9dFwA%3D%3D&quot;,&quot;asin&quot;:&quot;1934356921&quot;}"><div data-a-input-name="offeringID.3" class="a-checkbox a-checkbox-fancy a-control-row a-touch-checkbox sims-fbt-checkbox"><label><input type="checkbox" name="offeringID.3" value="OG%2BFhLwOc2w1Oh%2BmdBQ7LBHZA36ZaYDqSopK68DLfx%2FvY61A35TkEBTwRwj8VsCyoo2MoRChLNSSlBjGJqWHFptlSBADIOUqFgeD8%2BAZnSPY7ebDb9dFwA%3D%3D" checked=""><i class="a-icon a-icon-checkbox"></i><span class="a-label a-checkbox-label"></span></label></div></span></div>
<div class="sims-fbt-row-outer">
<a href="/gp/aw/d/1934356921/ref=pd_aw_fbt_14_3?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ" class="sims-fbt-item-details sims-fbt-link-box a-touch-link">
<i class="a-icon a-icon-touch-link"></i>
<div class="a-row sims-fbt-title">
<div class="p13n-sc-truncate p13n-sc-line-clamp-2" aria-hidden="true" data-rows="2">
Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement
</div>
</div> <span class="a-color-price"><span class="p13n-sc-price">$26.28</span></span> <i class="a-icon a-icon-prime sims-fbt-prime-badge" role="img" aria-label="Prime"></i>
</a>
</div>
</div>
</span></li> </form>
<li class="sims-fbt-shipping-details-message-box"><span class="a-list-item"><span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;disableAnimation&quot;:0,&quot;backButtonText&quot;:&quot;Back&quot;,&quot;name&quot;:&quot;sims-fbt-shipping-details&quot;,&quot;backToTop&quot;:1,&quot;hideHeader&quot;:0}"><a href="#" class="a-touch-link a-box sims-fbt-shipping-details-message-link"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><span><div class="a-box a-alert-inline a-alert-inline-info"><div class="a-box-inner a-alert-container"><i class="a-icon a-icon-alert"></i><div class="a-alert-content"><span class="sims-fbt-info-message">Some of these items ship sooner than the others.</span></div></div></div></span></div></a></span>
</span></li><li><span class="a-list-item">
<div class="sims-fbt-price-addToCart">
<span class="sims-fbt-data" data-fbt="{&quot;addToCartText&quot;:{&quot;1&quot;:&quot;Add to Cart&quot;,&quot;3&quot;:&quot;Add all three to Cart&quot;,&quot;2&quot;:&quot;Add both to Cart&quot;},&quot;allOfferListingIDs&quot;:[&quot;aAN3%2BOZQtEJvoFRXyYikPQJKEdTY07uvf4lLoaq4lId9LRmUAObsrNE59FM90ysHcKuU%2FXrIFctsLn81CusntJYZ8zKGx0UZkui6Z3WTzGCM3aZbXXg7Fw%3D%3D&quot;,&quot;LSVHb9KAobT91TBWBSk8QuKDDfbGnWSTBk3MdiKlUMQr%2Bs9JqV5iyMtHN92rhAqxIl6%2B2tOPe3EUWvwmHDB92tcw7fS8J5F8AIo2EhERMBedXLfv8gm19Q%3D%3D&quot;,&quot;OG%2BFhLwOc2w1Oh%2BmdBQ7LBHZA36ZaYDqSopK68DLfx%2FvY61A35TkEBTwRwj8VsCyoo2MoRChLNSSlBjGJqWHFptlSBADIOUqFgeD8%2BAZnSPY7ebDb9dFwA%3D%3D&quot;],&quot;currencySymbol&quot;:&quot;<span class='p13n-sc-price'>$<span class=\&quot;sims-fbt-price-value\&quot;></span></span>&quot;,&quot;currencyCode&quot;:&quot;USD&quot;,&quot;MAPText&quot;:&quot;To see our price, add these items to your cart. <a href='/gp/help/customer/display.html/ref=pd_aw_fbt_14_map?ie=UTF8&amp;nodeId=200339100&amp;refRID=7F3MGDYTH1YH8KVBSFWJ' class='sims-fbt-map-details-link'>Details</a>&quot;,&quot;shippingDetails&quot;:{&quot;123&quot;:&quot;availabilitysome&quot;,&quot;23&quot;:&quot;availabilityone&quot;,&quot;13&quot;:&quot;availabilityone&quot;,&quot;12&quot;:&quot;availabilityone&quot;},&quot;isAmazonApp&quot;:0,&quot;itemDetails&quot;:{&quot;LSVHb9KAobT91TBWBSk8QuKDDfbGnWSTBk3MdiKlUMQr%2Bs9JqV5iyMtHN92rhAqxIl6%2B2tOPe3EUWvwmHDB92tcw7fS8J5F8AIo2EhERMBedXLfv8gm19Q%3D%3D&quot;:{&quot;asin&quot;:&quot;1941222153&quot;,&quot;isPreorder&quot;:0,&quot;price&quot;:28.54,&quot;doesMAPPolicyApply&quot;:0},&quot;OG%2BFhLwOc2w1Oh%2BmdBQ7LBHZA36ZaYDqSopK68DLfx%2FvY61A35TkEBTwRwj8VsCyoo2MoRChLNSSlBjGJqWHFptlSBADIOUqFgeD8%2BAZnSPY7ebDb9dFwA%3D%3D&quot;:{&quot;asin&quot;:&quot;1934356921&quot;,&quot;isPreorder&quot;:0,&quot;price&quot;:26.28,&quot;doesMAPPolicyApply&quot;:0},&quot;aAN3%2BOZQtEJvoFRXyYikPQJKEdTY07uvf4lLoaq4lId9LRmUAObsrNE59FM90ysHcKuU%2FXrIFctsLn81CusntJYZ8zKGx0UZkui6Z3WTzGCM3aZbXXg7Fw%3D%3D&quot;:{&quot;asin&quot;:&quot;193435659X&quot;,&quot;isPreorder&quot;:0,&quot;price&quot;:21.11,&quot;doesMAPPolicyApply&quot;:0}},&quot;preOrderText&quot;:null,&quot;fbtStrings&quot;:null}"></span>
<div class="sims-fbt-total-price"><span class="fbt-total-price-text a-color-secondary">Total price:</span><span class="a-color-price fbt-total-price-value fbt-total-price-value-currency"><span class="p13n-sc-price">$75.93</span></span></div>
<div class="sims-fbt-add-to-cart">
<form name="frequentlyBoughtTogetherAddToCart" method="post" action="/gp/add-to-cart/html/ref=pd_aw_fbt_14_crt" autocomplete="off" class="sims-fbt-cart">
<div class="sims-fbt-form-input-elements"><input type="hidden" name="o" value="add"><input type="hidden" name="verificationSessionID" value="147-0816675-1753153"><input type="hidden" name="clientName" value="SimilaritiesMobileFBT"><input type="hidden" name="offerListingID.1" value="aAN3%2BOZQtEJvoFRXyYikPQJKEdTY07uvf4lLoaq4lId9LRmUAObsrNE59FM90ysHcKuU%2FXrIFctsLn81CusntJYZ8zKGx0UZkui6Z3WTzGCM3aZbXXg7Fw%3D%3D"><input type="hidden" name="ASIN.1" value="193435659X"><input type="hidden" name="ASIN.2" value="1941222153"><input type="hidden" name="offerListingID.2" value="LSVHb9KAobT91TBWBSk8QuKDDfbGnWSTBk3MdiKlUMQr%2Bs9JqV5iyMtHN92rhAqxIl6%2B2tOPe3EUWvwmHDB92tcw7fS8J5F8AIo2EhERMBedXLfv8gm19Q%3D%3D"><input type="hidden" name="discoveredAsins.1" value="1941222153"><input type="hidden" name="ASIN.3" value="1934356921"><input type="hidden" name="offerListingID.3" value="OG%2BFhLwOc2w1Oh%2BmdBQ7LBHZA36ZaYDqSopK68DLfx%2FvY61A35TkEBTwRwj8VsCyoo2MoRChLNSSlBjGJqWHFptlSBADIOUqFgeD8%2BAZnSPY7ebDb9dFwA%3D%3D"><input type="hidden" name="discoveredAsins.2" value="1934356921"></div>
<div class="a-row a-spacing-none">
<span class="a-button a-button-primary a-button-small sims-fbt-add-to-cart" id="a-autoid-3"><span class="a-button-inner"><input class="a-button-input" type="submit" aria-labelledby="a-autoid-3-announce"><span class="a-button-text a-text-center" aria-hidden="true" id="a-autoid-3-announce">Add all three to Cart</span></span></span>
</div>
</form></div>
</div>
</span></li>
</ul>
</div></div>
<div id="fbt-expander-heading" class="a-box"><div class="a-box-inner a-padding-none">
<span class="a-declarative" data-action="fbt-expander-action" data-fbt-expander-action="{&quot;expanderID&quot;:&quot;fbt-expander&quot;}"><a href="javascript:void(0)" data-action="a-expander-toggle" class="a-expander-header a-declarative a-expander-section-header a-color-base-background a-link-section-expander a-size-medium" data-a-expander-toggle="{&quot;allowLinkDefault&quot;:true, &quot;expand_prompt&quot;:&quot;<span class='fbt-expander-heading-text'> Buy all three:<span class=&quot;a-color-price fbt-total-price-value-currency&quot;><span class='p13n-sc-price'>$75.93</span></span></span>&quot;, &quot;collapse_prompt&quot;:&quot;&quot;}"><i class="a-icon a-icon-section-expand"></i><span class="a-expander-prompt"><span class="fbt-expander-heading-text"> Buy all three:<span class="a-color-price fbt-total-price-value-currency"><span class="p13n-sc-price">$75.93</span></span></span></span></a></span>
</div></div>
</div>
<div class="a-popover-preload" id="a-popover-sims-fbt-shipping-details">
<h2 class="a-spacing-micro">Frequently bought together</h2>
<div class="sims-fbt-shipping-details">
<div class="sims-fbt-shipping-item">
<a href="/gp/aw/d/193435659X/ref=pd_aw_fbt_14_sd_1?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ" class="a-touch-link a-box a-touch-link-noborder a-spacing-small a-spacing-top-small"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><span>
<div class="sims-fbt-details-image"> <img alt="Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)" src="https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._AC_UL75_SR75,75_.jpg" class="a-dynamic-image a-dynamic-image-container" height="75" width="75" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._AC_UL225_SR225,225_.jpg&quot;:[225,225],&quot;https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._AC_UL75_SR75,75_.jpg&quot;:[75,75],&quot;https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._AC_UL150_SR150,150_.jpg&quot;:[150,150]}" data-a-manual-replacement="1"> </div>
<div class="a-row sims-fbt-shipping-title">
<div class="p13n-sc-truncate p13n-sc-line-clamp-2" aria-hidden="true" data-rows="2">
<span class="sims-fbt-this-item a-text-bold">This item:</span>Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)
</div>
<div class="a-row sims-fbt-byline">
<div class="p13n-sc-truncate p13n-sc-line-clamp-1" aria-hidden="true" data-rows="1">
by Bruce Tate
</div>
</div></div>
</span></div></a>
<div class="sims-fbt-shipping-details-price-shipping">
<span class="a-color-price"><span class="p13n-sc-price">$21.11</span></span>
<div class="a-row"><span class="a-color-secondary">Paperback</span></div>
<div class="a-row"><span class="a-size-base a-color-secondary a-text-normal">FREE Shipping on orders over <span class="p13n-sc-price">$25</span>. <a class="a-link-normal sims-fbt-details-help-link" target="AmazonHelp" rel="noopener" href="/gp/help/customer/display.html/ref=pd_aw_fbt_14_sd_sdc_1?ie=UTF8&amp;nodeId=201910870&amp;refRID=7F3MGDYTH1YH8KVBSFWJ">Details</a></span></div>
<div class="a-row"><span class="a-size-base a-color-success">In Stock.</span></div>
<div class="a-row"><span class="a-size-base a-color-secondary a-text-normal">Ships from and sold by Amazon.com.</span></div>
</div>
</div><div class="sims-fbt-shipping-item">
<a href="/gp/aw/d/1941222153/ref=pd_aw_fbt_14_sd_2?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ" class="a-touch-link a-box a-touch-link-noborder a-spacing-small a-spacing-top-small"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><span>
<div class="sims-fbt-details-image"> <img alt="Seven More Languages in Seven Weeks: Languages That Are Shaping the Future" src="https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL75_SR75,75_.jpg" class="a-dynamic-image a-dynamic-image-container" height="75" width="75" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL150_SR150,150_.jpg&quot;:[150,150],&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL75_SR75,75_.jpg&quot;:[75,75],&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL225_SR225,225_.jpg&quot;:[225,225]}" data-a-manual-replacement="1"> </div>
<div class="a-row sims-fbt-shipping-title">
<div class="p13n-sc-truncate p13n-sc-line-clamp-2" aria-hidden="true" data-rows="2">
Seven More Languages in Seven Weeks: Languages That Are Shaping the Future
</div>
<div class="a-row sims-fbt-byline">
<div class="p13n-sc-truncate p13n-sc-line-clamp-1" aria-hidden="true" data-rows="1">
by Bruce Tate
</div>
</div></div>
</span></div></a>
<div class="sims-fbt-shipping-details-price-shipping">
<span class="a-color-price"><span class="p13n-sc-price">$28.54</span></span>
<div class="a-row"><span class="a-color-secondary">Paperback</span></div>
<div class="a-row"><span class="a-size-base a-color-secondary a-text-normal"><b>FREE Shipping</b>. <a class="a-link-normal sims-fbt-details-help-link" target="AmazonHelp" rel="noopener" href="/gp/help/customer/display.html/ref=pd_aw_fbt_14_sd_sdc_2?ie=UTF8&amp;nodeId=201910870&amp;refRID=7F3MGDYTH1YH8KVBSFWJ">Details</a></span></div>
<div class="a-row"><span class="a-size-base a-color-error">Only 16 left in stock (more on the way).</span></div>
<div class="a-row"><span class="a-size-base a-color-secondary a-text-normal">Ships from and sold by Amazon.com.</span></div>
</div>
</div><div class="sims-fbt-shipping-item">
<a href="/gp/aw/d/1934356921/ref=pd_aw_fbt_14_sd_3?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ" class="a-touch-link a-box a-touch-link-noborder a-spacing-small a-spacing-top-small"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><span>
<div class="sims-fbt-details-image"> <img alt="Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement" src="https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL75_SR75,75_.jpg" class="a-dynamic-image a-dynamic-image-container" height="75" width="75" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL150_SR150,150_.jpg&quot;:[150,150],&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL225_SR225,225_.jpg&quot;:[225,225],&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL75_SR75,75_.jpg&quot;:[75,75]}" data-a-manual-replacement="1"> </div>
<div class="a-row sims-fbt-shipping-title">
<div class="p13n-sc-truncate p13n-sc-line-clamp-2" aria-hidden="true" data-rows="2">
Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement
</div>
<div class="a-row sims-fbt-byline">
<div class="p13n-sc-truncate p13n-sc-line-clamp-1" aria-hidden="true" data-rows="1">
by Eric Redmond
</div>
</div></div>
</span></div></a>
<div class="sims-fbt-shipping-details-price-shipping">
<span class="a-color-price"><span class="p13n-sc-price">$26.28</span></span>
<div class="a-row"><span class="a-color-secondary">Paperback</span></div>
<div class="a-row"><span class="a-size-base a-color-secondary a-text-normal"><b>FREE Shipping</b>. <a class="a-link-normal sims-fbt-details-help-link" target="AmazonHelp" rel="noopener" href="/gp/help/customer/display.html/ref=pd_aw_fbt_14_sd_sdc_3?ie=UTF8&amp;nodeId=201910870&amp;refRID=7F3MGDYTH1YH8KVBSFWJ">Details</a></span></div>
<div class="a-row"><span class="a-size-base a-color-error">Only 12 left in stock (more on the way).</span></div>
<div class="a-row"><span class="a-size-base a-color-secondary a-text-normal">Ships from and sold by Amazon.com.</span></div>
</div>
</div>
</div>
</div>
</div>
</div><div id="sponsoredProducts_feature_div" data-feature-name="sponsoredProducts" data-template-name="sponsoredProducts" class="a-section a-spacing-none feature">
<div class="a-row a-spacing-large"> <h2 class="a-carousel-heading">Sponsored products related to this item</h2> <div id="sp_phone_detail" data-a-carousel-options="{&quot;initialSeenAsins&quot;:&quot;\&quot;B002D657DY\&quot;,\&quot;B073X8633K\&quot;,\&quot;B01L9WVU92\&quot;,\&quot;B00YSK9T6O\&quot;,\&quot;B01NGYI9OH\&quot;,\&quot;B01NATJWGB\&quot;,\&quot;B017P2WPTO\&quot;&quot;,&quot;set_size&quot;:9,&quot;name&quot;:&quot;sp_phone_detail_carousel&quot;,&quot;show_partial_text&quot;:true,&quot;ajax&quot;:{&quot;params&quot;:{&quot;cc&quot;:7,&quot;wName&quot;:&quot;sp_phone_detail&quot;,&quot;referringSearchEngine&quot;:&quot;Amazon&quot;,&quot;start&quot;:7,&quot;ASIN&quot;:&quot;193435659X&quot;,&quot;pRID&quot;:&quot;7F3MGDYTH1YH8KVBSFWJ&quot;},&quot;url&quot;:&quot;/gp/nemo/spd/handlers/spd-shov.html&quot;},&quot;carousel_class&quot;:&quot;mobile&quot;}" data-a-display-strategy="stretchyGoodness" data-a-transition-strategy="none" data-a-class="mobile" class="a-begin a-carousel-container a-carousel-display-stretchyGoodness a-carousel-transition-none sponsored-products-detail-mobile"><input autocomplete="on" type="hidden" class="a-carousel-firstvisibleitem"> <div class="a-row a-carousel-controls a-carousel-row"><div class="a-carousel-row-inner"><div class="a-carousel-col a-carousel-center"><div class="a-carousel-viewport" sponsored-products-carousel-initialized="true"><ol class="a-carousel" role="list" style="width: 552px;"> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail_1934356433" data-asin="1934356433" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200005114391581&amp;adIndex=0" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200005114391581&amp;eventType=2&amp;adIndex=0"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=689593148697586&widgetName=sp_phone_detail&adId=200005114391581&eventType=2&adIndex=0"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="Agile Coaching" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_0?ie=UTF8&amp;adId=A103945221Y2I051H3YV9&amp;qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;url=%2Fdp%2F1934356433%2Fref%3Dsspa_mw_detail_0%3Fpsc%3D1"> <div class="a-row"> <img alt="Agile Coaching" src="https://images-na.ssl-images-amazon.com/images/I/41w1N-NpW2L._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>Agile Coaching</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">24 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$23.40</span> <span style="position: relative; top: 2px;"> <i class="a-icon a-icon-prime a-icon-small"></i> </span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail_B073X6GNJ1" data-asin="B073X6GNJ1" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200004227761221&amp;adIndex=1" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200004227761221&amp;eventType=2&amp;adIndex=1"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=689593148697586&widgetName=sp_phone_detail&adId=200004227761221&eventType=2&adIndex=1"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="The Complete Software Developer&amp;#39;s Career Guide: How to Learn Your Next Programming Language, Ace Your Programming Interview, and Land The Coding Job Of Your Dreams" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_1?ie=UTF8&amp;adId=A04568442JJIOSV8U6VL5&amp;qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;url=%2Fdp%2FB073X6GNJ1%2Fref%3Dsspa_mw_detail_1%3Fpsc%3D1"> <div class="a-row"> <img alt="The Complete Software Developer&amp;#39;s Career Guide: How to Learn Your Next Programming Language, Ace Your Programming Interview, and Land The Coding Job Of Your Dreams" src="https://images-na.ssl-images-amazon.com/images/I/51yr12gkjRL._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>The Complete Software ...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4-5"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">382 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$4.99</span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail_1680501755" data-asin="1680501755" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200005114391481&amp;adIndex=2" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200005114391481&amp;eventType=2&amp;adIndex=2"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=689593148697586&widgetName=sp_phone_detail&adId=200005114391481&eventType=2&adIndex=2"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="Manage Your Project Portfolio: Increase Your Capacity and Finish More Projects" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_2?ie=UTF8&amp;adId=A1039608JWFE452DZAOK&amp;qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;url=%2Fdp%2F1680501755%2Fref%3Dsspa_mw_detail_2%3Fpsc%3D1"> <div class="a-row"> <img alt="Manage Your Project Portfolio: Increase Your Capacity and Finish More Projects" src="https://images-na.ssl-images-amazon.com/images/I/51KjjgRtTcL._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>Manage Your Project Po...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">9 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$21.00</span> <span style="position: relative; top: 2px;"> <i class="a-icon a-icon-prime a-icon-small"></i> </span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail_1784398780" data-asin="1784398780" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200004229637371&amp;adIndex=3" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200004229637371&amp;eventType=2&amp;adIndex=3"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=689593148697586&widgetName=sp_phone_detail&adId=200004229637371&eventType=2&adIndex=3"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="Python 3 Object-oriented Programming - Second Edition: Building robust and maintainable software with object oriented design patterns in Python" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_3?ie=UTF8&amp;adId=A07435223RYI6A3XMEWJ1&amp;qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;url=%2Fdp%2F1784398780%2Fref%3Dsspa_mw_detail_3%3Fpsc%3D1"> <div class="a-row"> <img alt="Python 3 Object-oriented Programming - Second Edition: Building robust and maintainable software with object oriented design patterns in Python" src="https://images-na.ssl-images-amazon.com/images/I/51ZTj50iIyL._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>Python 3 Object-orient...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">58 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$47.49</span> <span style="position: relative; top: 2px;"> <i class="a-icon a-icon-prime a-icon-small"></i> </span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail_B01N1TTJFK" data-asin="B01N1TTJFK" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200004262089221&amp;adIndex=4" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200004262089221&amp;eventType=2&amp;adIndex=4"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=689593148697586&widgetName=sp_phone_detail&adId=200004262089221&eventType=2&adIndex=4"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="The Software Engineer&amp;#39;s Guide to Freelance Consulting: The new book that encompasses finding and maintaining clients as a software developer, tax and legal tips, and everything in between." href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_4?ie=UTF8&amp;adId=A069055337HL3J1LPNB0U&amp;qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;url=%2Fdp%2FB01N1TTJFK%2Fref%3Dsspa_mw_detail_4%3Fpsc%3D1"> <div class="a-row"> <img alt="The Software Engineer&amp;#39;s Guide to Freelance Consulting: The new book that encompasses finding and maintaining clients as a software developer, tax and legal tips, and everything in between." src="https://images-na.ssl-images-amazon.com/images/I/515jpdhtshL._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>The Software Engineer'...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4-5"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">22 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$2.99</span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail_B01N9RETLR" data-asin="B01N9RETLR" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200002619846631&amp;adIndex=5" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200002619846631&amp;eventType=2&amp;adIndex=5"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=689593148697586&widgetName=sp_phone_detail&adId=200002619846631&eventType=2&adIndex=5"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="30 Days To Your First Freelance Programming Client: Step-by-step guide to finding your first client" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_5?ie=UTF8&amp;adId=A10192581OXXQEZEQKMYE&amp;qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;url=%2Fdp%2FB01N9RETLR%2Fref%3Dsspa_mw_detail_5%3Fpsc%3D1"> <div class="a-row"> <img alt="30 Days To Your First Freelance Programming Client: Step-by-step guide to finding your first client" src="https://images-na.ssl-images-amazon.com/images/I/41p53RTFtNL._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>30 Days To Your First ...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-3"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">2 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$9.99</span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail_B017OAFR8I" data-asin="B017OAFR8I" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200002682705171&amp;adIndex=6" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;adId=200002682705171&amp;eventType=2&amp;adIndex=6"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=689593148697586&widgetName=sp_phone_detail&adId=200002682705171&eventType=2&adIndex=6"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="C# For Beginners: The tactical guidebook - Learn CSharp by coding" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_6?ie=UTF8&amp;adId=A097594332WK88PXUDLI0&amp;qualifier=1518705128&amp;id=689593148697586&amp;widgetName=sp_phone_detail&amp;url=%2Fdp%2FB017OAFR8I%2Fref%3Dsspa_mw_detail_6%3Fpsc%3D1"> <div class="a-row"> <img alt="C# For Beginners: The tactical guidebook - Learn CSharp by coding" src="https://images-na.ssl-images-amazon.com/images/I/51eImdRQv+L._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>C# For Beginners: The ...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">11 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$22.21</span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"><span class="a-spinner a-spinner-medium" style="width:122px;height:259px;"></span></li></ol></div></div></div></div> <span class="a-end aok-hidden"></span></div></div>
</div><link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/31Xp%2Bd6S31L.css?AUIClients/Swiper_AUIBuild">
<script>
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/61BFFVGtFXL.js?AUIClients/Swiper_AUIBuild');
</script>
<a></a><div id="mobile_aboutThisItemFeature_feature_div" data-feature-name="mobile_aboutThisItemFeature" data-template-name="mobile_aboutThisItemFeature" class="a-section a-spacing-none feature">
<div class="a-row a-spacing-large celwidget">
<div class="a-column a-span12">
<h2 class="a-box-title">About this item
</h2>
<div id="aboutThisItemFeature_boxGroup" class="a-box-group">
<div class="a-box feature"><div class="a-box-inner">
<div id="aplus_feature_div" data-feature-name="aplus" data-template-name="aplus" class="a-section a-spacing-none">
<h3>From the manufacturer</h3>
<div class="aplus-v2 mobile celwidget" cel_widget_id="m-aplus">
<style type="text/css">
.aplus-v2.mobile {display:inherit}
.aplus-v2.mobile .aplus-module {
min-width:inherit;
margin-bottom: 21px;
}
.aplus-v2.mobile .apm-sidemodule {width:inherit}
.aplus-v2.mobile .apm-fixed-width {width:inherit}
/* module-5 */
.aplus-v2.mobile .module-5{overflow:auto}
.aplus-v2.mobile .aplus-module-wrapper {
display: block;
}
.aplus-v2.mobile img.apm-middle-image {
vertical-align: middle;
}
.aplus-v2.mobile .apm-iconheader {
display: inline;
}
.aplus-v2.mobile .apm-tablemodule {
text-align: left;
}
.aplus-v2.mobile .apm-tablemodule-image {
background-color: #FFFFFF;
padding: 0 !important;
text-align: center;
overflow: hidden;
vertical-align: bottom;
}
.aplus-v2.mobile .apm-tablemodule-table .aplus-table-heading {
padding-bottom: 8px;
text-align: center;
}
.aplus-v2.mobile .apm-tablemodule-keyhead {
border-top: 1px solid #dddddd;
padding: 8px 14px 6px !important;
background-color: #f7f7f7;
font-weight: normal;
color: #626262;
float: none !important;
margin-right: 0;
text-align: center;
min-width: 106px;
}
.aplus-v2.mobile .apm-tablemodule-keyhead {
border-right: 1px solid #dddddd;
}
.aplus-v2.mobile .apm-tablemodule-keyvalue .aplus-table-data {
padding-top: 8px !important;
padding-left: 14px;
padding-bottom: 8px;
border-top: 1px solid #dddddd;
border-bottom: 1px solid #dddddd;
min-width: 150px;
}
.aplus-v2.mobile .apm-tablemodule-image {
background-color: #FFFFFF;
padding: 0 !important;
text-align: center;
overflow: hidden;
vertical-align: bottom;
}
.aplus-v2.mobile .apm-tablemodule-table .table-heading {
padding-bottom: 8px;
text-align: center;
}
.aplus-v2.mobile .apm-tablemodule-valuecell.selected {
background-color: #fff5ec;
}
</style>
<script>
if(P) {
P.when("a-expander").execute(function (expander) {
expander.initializeExpanders();
});
}
</script>
<script>
if(P) {
P.when("A","ready").execute(function (A) {
A.on('a:expander:aplus-module-expander:toggle:collapse', function(e) {
var $ = A.$;
var topOffset = $(e.expander.$expander[0]).offset().top;
if ($(window).scrollTop() > topOffset) {
$('html, body').animate({ scrollTop: topOffset });
}
});
});
}
</script>
<div class="celwidget aplus-module module-5" cel_widget_id="aplus-m-module-5">
<div class="aplus-module-wrapper">
<div class="apm-spacing">
<div class="apm-tablemodule">
<table class="a-normal a-align-center a-spacing-none apm-tablemodule-table">
<tbody><tr class="apm-tablemodule-imagerows">
<th class="aplus-table-heading apm-tablemodule-blankkeyhead"></th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/193435659X"><img alt="Seven Languages in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/a300f6d7-7341-4a32-bab1-b66533b350ed.jpg._CB276699932__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/1941222153"><img alt="Seven More Languages in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/e453c406-cbd6-44c9-a4e2-c10453614bc2.jpg._CB276699931__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/1934356921"><img alt="Seven Databases in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/35736e8d-2d1c-493c-a932-0525a4e5b730.jpg._CB276699926__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/1937785637"><img alt="Seven Web Frameworks in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/67654a0e-5def-427f-a386-fea3cbd594bf.jpg._CB276700139__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/1937785653"><img alt="Seven Concurrency Models in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/67da9c9b-ddc2-446b-92bb-49b96a4986ed.jpg._CB276700135__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
<th class="aplus-table-heading apm-tablemodule-image">
<a target="_blank" href="/dp/1680501488"><img alt="Seven Mobile Apps in Seven Weeks" src="https://images-na.ssl-images-amazon.com/images/G/01/aplusautomation/vendorimages/83c6fa81-f098-4b6e-9102-efbb3c59b46b.jpg._CB276700128__SR150,300_.jpg" width="121.66666666666667px"></a>
</th>
</tr>
<tr class="apm-tablemodule-imagerows">
<th class="aplus-table-heading apm-tablemodule-blankkeyhead"></th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/193435659X">Seven Languages in Seven Weeks</a>
</th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/1941222153">Seven More Languages in Seven Weeks</a>
</th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/1934356921">Seven Databases in Seven Weeks</a>
</th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/1937785637">Seven Web Frameworks in Seven Weeks</a>
</th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/1937785653">Seven Concurrency Models in Seven Weeks</a>
</th>
<th class="aplus-table-heading">
<a target="_blank" href="/dp/1680501488">Seven Mobile Apps in Seven Weeks</a>
</th>
</tr>
<tr class="apm-tablemodule-keyvalue">
<th class="aplus-table-heading apm-tablemodule-keyhead">
<span class="a-size-base a-text-normal a-color-secondary">
Subtitle
</span>
</th>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
A Pragmatic Guide to Learning Programming Languages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Languages That Are Shaping the Future
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
A Guide to Modern Databases and the NoSQL Movement
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Adventures in Better Web Apps
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
When Threads Unravel
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Native Apps, Multiple Platforms
</span>
</td>
</tr>
<tr class="apm-tablemodule-keyvalue">
<th class="aplus-table-heading apm-tablemodule-keyhead">
<span class="a-size-base a-text-normal a-color-secondary">
Content Coverage
</span>
</th>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Clojure, Haskell, Io, Prolog, Scala, Erlang, and Ruby
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Lua, Factor, Elixir, Elm, Julia, MiniKanren, and Idris
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Redis, Neo4J, CouchDB, MongoDB, HBase, Riak and Postgres
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Sinatra, CanJS, AngularJS, Ring, Webmachine, Yesod, and Immutant
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
Threads &amp; locks, functional programming, separating identity &amp; state, actors, sequential processes, data parallelism, and the lambda architecture
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
iOS, Android, Windows, RubyMotion, React Native, and Xamarin
</span>
</td>
</tr>
<tr class="apm-tablemodule-keyvalue">
<th class="aplus-table-heading apm-tablemodule-keyhead">
<span class="a-size-base a-text-normal a-color-secondary">
Pages
</span>
</th>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
328 pages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
320 pages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
354 pages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
304 pages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
300 pages
</span>
</td>
<td class="a-text-center aplus-table-data apm-tablemodule-valuecell" style="width:19rem;">
<span class="a-size-base">
360 pages
</span>
</td>
</tr>
</tbody></table>
</div>
</div>
</div>
</div>
</div>
</div>
</div></div>
<div class="a-box feature"><div class="a-box-inner">
<div id="productDescription_feature_div" data-feature-name="productDescription" data-template-name="productDescription" class="a-section a-spacing-none">
<div class="a-section">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;data&quot;:{&quot;secViewId&quot;:&quot;productDescription_secondary_view_div&quot;},&quot;name&quot;:&quot;productDescription_secondary_view_div&quot;}">
<a href="#" class="a-touch-link a-box a-touch-link-noborder"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>
<h3>
Description
</h3>
<div id="productDescription" class="a-section a-spacing-small">
<p class="a-color-base" dir="auto">
You should learn a programming language every year, as recommended by The Pragmatic Programmer. But if one per year is good, how about Seven Languages in Seven Weeks? In this book you'll get a hands-o ...
</p>
</div>
</div></a>
</span>
<script type="text/javascript">
P.when('jQuery','A', 'a-popover-base', 'a-popover-ajax').execute(function($, A, popovers, popoverAjax) {
A.on("a:popover:beforeShow:productDescription_secondary_view_div", function(data){
P.now('dpmob-sec-view-instrumentation').execute(function(secViewInstrumentation){
if(typeof secViewInstrumentation !== "undefined") {
// Record the click time before showing the secondary view.
secViewInstrumentation.recordClickTime('productDescription');
}
});
});
A.on("a:popover:afterShow:productDescription_secondary_view_div", function(data){
var featureName = 'productDescription';
P.now('dpmob-sec-view-instrumentation').execute(function(secViewInstrumentation){
if(typeof secViewInstrumentation !== "undefined") {
// Record the end time once the secondary view is shown.
secViewInstrumentation.recordEndTime(featureName);
// Post the recorded metrics
secViewInstrumentation.postMetrics(featureName);
}
});
});
});
</script>
<div class="a-popover-preload" id="a-popover-productDescription_secondary_view_div">
<h3>
Description
</h3>
<div id="productDescription_fullView">
<h3>Product description</h3>
<div class="a-section a-spacing-large">
<p>
</p><p>You should learn a programming language every year, as recommended by <i>The Pragmatic Programmer</i>. But if one per year is good, how about <i>Seven Languages in Seven Weeks</i>? In this book you'll get a hands-on tour of Clojure, Haskell, Io, Prolog, Scala, Erlang, and Ruby. Whether or not your favorite language is on that list, you'll broaden your perspective of programming by examining these languages side-by-side. You'll learn something new from each, and best of all, you'll learn how to learn a language quickly.<br><br>Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell. With <i>Seven Languages in Seven Weeks,</i> by Bruce A. Tate, you'll go beyond the syntax-and beyond the 20-minute tutorial you'll find someplace online. This book has an audacious goal: to present a meaningful exploration of seven languages within a single book. Rather than serve as a complete reference or installation guide, <i>Seven Languages</i> hits what's essential and unique about each language. Moreover, this approach will help teach you how to grok new languages.<br><br>For each language, you'll solve a nontrivial problem, using techniques that show off the language's most important features. As the book proceeds, you'll discover the strengths and weaknesses of the languages, while dissecting the process of learning languages quickly--for example, finding the typing and programming models, decision structures, and how you interact with them.<br><br>Among this group of seven, you'll explore the most critical programming models of our time. Learn the dynamic typing that makes Ruby, Python, and Perl so flexible and compelling. Understand the underlying prototype system that's at the heart of JavaScript. See how pattern matching in Prolog shaped the development of Scala and Erlang. Discover how pure functional programming in Haskell is different from the Lisp family of languages, including Clojure.<br><br>Explore the concurrency techniques that are quickly becoming the backbone of a new generation of Internet applications. Find out how to use Erlang's let-it-crash philosophy for building fault-tolerant systems. Understand the actor model that drives concurrency design in Io and Scala. Learn how Clojure uses versioning to solve some of the most difficult concurrency problems.<br><br>It's all here, all in one place. Use the concepts from one language to find creative solutions in another-or discover a language that may become one of your favorites.</p>
<p></p>
</div>
<h3>Review</h3>
<div class="a-section a-spacing-large">
<p>
</p><p>""I have been programming for 25 years in a variety of hardware and software languages. After reading Seven Languages in Seven Weeks, I am starting to understand how to evaluate languages for their objective strengths and weaknesses. More importantly, I feel as if I could pick one of them to actually get some work done.""--Chris Kappler, Senior scientist Raytheon, BBN Technologies<br><br></p>
<p>""I spent most of my time as a computer sciences student saying I didn't want to be a software developer and then became one anyway. Seven Languages in Seven Weeks expanded my way of thinking about problems and reminded me what I love about programming.""--Travis Kaspar, Software engineer, Northrop Grumman<br><br></p>
<p>""Do you want seven kick starts into learning your "language of the year"? Do you want your thinking challenged about programming in general? Look no further than this book. I personally was taken back in time to my undergraduate computer science days, coasting through my programming languages survey course. The difference is that Bruce won't let you coast through this course! This isn't a leisurely read--you'll have to work this book. I believe you'll find it both mindblowing and intensely practical at the same time.""--Matt Stine Group leader, Research Application Development, St. Jude Children's Research Hospital</p>
<p></p>
</div>
<h3>About the Author</h3>
<div class="a-section a-spacing-large">
<p>
</p><div>
<p>Bruce Tate runs RapidRed, an Austin, TX-based practice that consults on lightweight development in Ruby. Previously he worked at IBM in roles ranging from a database systems programmer to Java consultant. He left IBM to work for several startups in roles ranging from Client Solutions Director to CTO. He speaks internationally and is the author of more than ten books, including From Java to Ruby, Deploying Rails Applications, the best-selling Bitter series, Beyond Java, and the Jolt-winning Better, Faster, Lighter Java.</p>
</div>
<p></p>
</div>
</div>
</div>
</div>
</div>
</div></div>
<div class="a-box feature"><div class="a-box-inner">
<div id="featureBulletsAndDetailBullets_feature_div" data-feature-name="featureBulletsAndDetailBullets" data-template-name="featureBulletsAndDetailBullets" class="a-section a-spacing-none">
<div class="a-section">
<span class="a-declarative" data-action="a-secondary-view" data-a-secondary-view="{&quot;backButtonText&quot;:&quot;Back&quot;,&quot;data&quot;:{&quot;secViewId&quot;:&quot;featureBulletsAndDetailBullets_secondary_view_div&quot;},&quot;name&quot;:&quot;featureBulletsAndDetailBullets_secondary_view_div&quot;}">
<a href="#" class="a-touch-link a-box a-touch-link-noborder"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>
<h3>
Features &amp; details
</h3>
<div id="productDetails_feature_div" class="a-section">
<h3>
<span>Product information</span>
<span>
</span>
</h3>
<div id="productDetails_techSpec_sections" class="a-section">
<h4></h4><table id="productDetails_techSpec_section_1" class="a-keyvalue prodDetTable" role="presentation">
<tbody><tr>
<th class="a-span3 prodDetSectionEntry">
Publisher
</th>
<td class="a-span9 a-align-center prodDetSectionEntry">
Pragmatic Bookshelf
</td>
</tr>
<tr>
<th class="a-span3 prodDetSectionEntry">
Publication date
</th>
<td class="a-span9 a-align-center prodDetSectionEntry">
November 20, 2010
</td>
</tr>
<tr>
<th class="a-span3 prodDetSectionEntry">
Language
</th>
<td class="a-span9 a-align-center prodDetSectionEntry">
English
</td>
</tr>
</tbody></table>
</div>
</div>
</div></a>
</span>
<script type="text/javascript">
P.when('jQuery','A', 'a-popover-base', 'a-popover-ajax').execute(function($, A, popovers, popoverAjax) {
A.on("a:popover:beforeShow:featureBulletsAndDetailBullets_secondary_view_div", function(data){
P.now('dpmob-sec-view-instrumentation').execute(function(secViewInstrumentation){
if(typeof secViewInstrumentation !== "undefined") {
// Record the click time before showing the secondary view.
secViewInstrumentation.recordClickTime('featureBulletsAndDetailBullets');
}
});
});
A.on("a:popover:afterShow:featureBulletsAndDetailBullets_secondary_view_div", function(data){
var featureName = 'featureBulletsAndDetailBullets';
P.now('dpmob-sec-view-instrumentation').execute(function(secViewInstrumentation){
if(typeof secViewInstrumentation !== "undefined") {
// Record the end time once the secondary view is shown.
secViewInstrumentation.recordEndTime(featureName);
// Post the recorded metrics
secViewInstrumentation.postMetrics(featureName);
}
});
});
});
</script>
<div class="a-popover-preload" id="a-popover-featureBulletsAndDetailBullets_secondary_view_div">
<h1>
About this item
</h1>
<div id="productDetails_secondary_view_div" class="a-section">
<h3>
<span>Product information</span>
<span>
</span>
</h3>
<div id="productDetails_techSpec_sections" class="a-section">
<h4></h4><table id="productDetails_techSpec_section_1" class="a-keyvalue prodDetTable" role="presentation">
<tbody><tr>
<th class="a-span3 prodDetSectionEntry">
Publisher
</th>
<td class="a-span9 a-align-center prodDetSectionEntry">
Pragmatic Bookshelf
</td>
</tr>
<tr>
<th class="a-span3 prodDetSectionEntry">
Publication date
</th>
<td class="a-span9 a-align-center prodDetSectionEntry">
November 20, 2010
</td>
</tr>
<tr>
<th class="a-span3 prodDetSectionEntry">
Language
</th>
<td class="a-span9 a-align-center prodDetSectionEntry">
English
</td>
</tr>
<tr>
<th class="a-span3 prodDetSectionEntry">
Product Dimensions
</th>
<td class="a-span9 a-align-center prodDetSectionEntry">
7.5 x 1.2 x 9.2 inches
</td>
</tr>
<tr>
<th class="a-span3 prodDetSectionEntry">
Shipping Weight
</th>
<td class="a-span9 a-align-center prodDetSectionEntry">
1.5 pounds
</td>
</tr>
<tr>
<th class="a-span3 prodDetSectionEntry">
Book length
</th>
<td class="a-span9 a-align-center prodDetSectionEntry">
330
</td>
</tr>
<tr>
<th class="a-span3 prodDetSectionEntry">
ISBN-10
</th>
<td class="a-span9 a-align-center prodDetSectionEntry">
193435659X
</td>
</tr>
<tr>
<th class="a-span3 prodDetSectionEntry">
ISBN-13
</th>
<td class="a-span9 a-align-center prodDetSectionEntry">
978-1934356593
</td>
</tr>
<tr>
</tr><tr>
<th class="a-color-secondary a-size-base prodDetSectionEntry">
Best Sellers Rank
</th>
<td>
147710
</td>
</tr>
</tbody></table>
</div>
<script type="text/javascript">
P.when('A', 'ready').execute(function(A) {
var asin = "";
A.declarative('enhanced-content-open-file', 'click', function(event) {
var pageAction = event.data;
window.ue.count("ProductInfo" + pageAction, 1);
A.ajax('/gp/product/ajax-handlers/enhanced-content-popover-metrics.html', {
method: 'post',
params: {"asin": asin, "pageAction": pageAction}
});
});
});
</script>
</div>
</div>
</div>
</div>
</div></div>
<div class="a-box feature"><div class="a-box-inner">
<div id="priceLegalInfo_feature_div" data-feature-name="priceLegalInfo" data-template-name="priceLegalInfo" class="a-section a-spacing-none">
<div id="priceLegalInfo_primary_view" class="a-section">
<span class="a-text-bold">
Pricing:
</span>
<span>
Savings are based on the strikethrough price. This is either the previous Amazon price or the
</span>
<a class="a-link-normal a-nowrap" href="/gp/help/customer/display.html/ref=help_search_1-1?nodeId=201133170">List Price.</a>
<span>
</span>
</div>
</div>
</div></div>
</div>
</div>
</div>
</div><script type="text/javascript">
setCSMReq('cf');
setCSMReq('cf');
</script><div id="p13n-m-mobile-purchase-sims-feature-1" class="celwidget" cel_widget_id="mobile-purchase-sims-feature-1">
<div id="sims-purchase" class="a-section a-spacing-large sims">
<h2 class="a-size-large a-spacing-base">Customers who bought this also bought</h2>
<div data-ajax-params="{&quot;auiDeviceType&quot;:&quot;mobile&quot;,&quot;featureId&quot;:&quot;SimilaritiesMobileCarousel&quot;,&quot;reftagPrefix&quot;:&quot;pd_aw_sim_14&quot;,&quot;productDetailsTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::ProductDetails::Phone::Base&quot;,&quot;widgetTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::List::Static::Phone&quot;,&quot;faceoutTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::Product::Phone::ListFaceout&quot;}" data-ajax-url="/gp/p13n-shared/faceout-partial" data-p13n-feature-metadata="{&quot;baseAsin&quot;:&quot;193435659X&quot;}" data-p13n-feature-name="pd_aw_sim_14" data-p13n-global="{&quot;auiDeviceType&quot;:&quot;mobile&quot;,&quot;marketplaceId&quot;:&quot;ATVPDKIKX0DER&quot;,&quot;requestId&quot;:&quot;7F3MGDYTH1YH8KVBSFWJ&quot;,&quot;marketplace&quot;:&quot;US&quot;,&quot;session&quot;:&quot;147-0816675-1753153&quot;}" class="a-section a-spacing-micro p13n-sc-static-list">
<div class="a-section p13n-sc-list-cells-container">
<ul class="a-unordered-list a-nostyle a-vertical p13n-sc-list-cells">
<li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sim_14_1&quot;,&quot;asin&quot;:&quot;1941222153&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._SY200_QL15_.jpg" href="/gp/aw/d/1941222153/ref=pd_aw_sim_14_1?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=51TdacYRRuL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="Seven More Languages in Seven Weeks: Languages That Are Shaping the Future" src="https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL300_SR300,300_.jpg" data-fling-asin="1941222153" data-fling-refmarker="pd_aw_sim_14_1" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL200_SR200,200_.jpg&quot;:[200,200],&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL100_SR100,100_.jpg&quot;:[100,100],&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL300_SR300,300_.jpg&quot;:[300,300]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._SY200_QL15_.jpg" href="/gp/aw/d/1941222153/ref=pd_aw_sim_14_1?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=51TdacYRRuL" data-isdpimgcached="1">
<div class="p13n-sc-truncate p13n-sc-line-clamp-4" aria-hidden="true" data-rows="4">
Seven More Languages in Seven Weeks: Languages That Are Shaping the Future
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4"><span class="a-icon-alt">3.8 out of 5 stars</span></i>&nbsp;<span aria-label="7 reviews" class="a-size-small">7</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$28.54</span></span> <span style="position: relative; top: 2px;"><i class="a-icon a-icon-prime a-icon-small" role="img" aria-label="Prime"></i></span></div>
</a>
</div>
</div></div>
</span></li><li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sim_14_2&quot;,&quot;asin&quot;:&quot;1934356921&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._SY200_QL15_.jpg" href="/gp/aw/d/1934356921/ref=pd_aw_sim_14_2?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=5161ySEofLL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement" src="https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL300_SR300,300_.jpg" data-fling-asin="1934356921" data-fling-refmarker="pd_aw_sim_14_2" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL300_SR300,300_.jpg&quot;:[300,300],&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL100_SR100,100_.jpg&quot;:[100,100],&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL200_SR200,200_.jpg&quot;:[200,200]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._SY200_QL15_.jpg" href="/gp/aw/d/1934356921/ref=pd_aw_sim_14_2?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=5161ySEofLL" data-isdpimgcached="1">
<div class="p13n-sc-truncate p13n-sc-line-clamp-4" aria-hidden="true" data-rows="4">
Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4-5"><span class="a-icon-alt">4.4 out of 5 stars</span></i>&nbsp;<span aria-label="45 reviews" class="a-size-small">45</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$26.28</span></span> <span style="position: relative; top: 2px;"><i class="a-icon a-icon-prime a-icon-small" role="img" aria-label="Prime"></i></span></div>
</a>
</div>
</div></div>
</span></li><li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sim_14_3&quot;,&quot;asin&quot;:&quot;1937785653&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/516UDGQpmNL._SY200_QL15_.jpg" href="/gp/aw/d/1937785653/ref=pd_aw_sim_14_3?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=516UDGQpmNL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="Seven Concurrency Models in Seven Weeks: When Threads Unravel (The Pragmatic Programmers)" src="https://images-na.ssl-images-amazon.com/images/I/516UDGQpmNL._AC_UL300_SR300,300_.jpg" data-fling-asin="1937785653" data-fling-refmarker="pd_aw_sim_14_3" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/516UDGQpmNL._AC_UL300_SR300,300_.jpg&quot;:[300,300],&quot;https://images-na.ssl-images-amazon.com/images/I/516UDGQpmNL._AC_UL200_SR200,200_.jpg&quot;:[200,200],&quot;https://images-na.ssl-images-amazon.com/images/I/516UDGQpmNL._AC_UL100_SR100,100_.jpg&quot;:[100,100]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/516UDGQpmNL._SY200_QL15_.jpg" href="/gp/aw/d/1937785653/ref=pd_aw_sim_14_3?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=516UDGQpmNL" data-isdpimgcached="1">
<div class="p13n-sc-truncate p13n-sc-line-clamp-4" aria-hidden="true" data-rows="4">
Seven Concurrency Models in Seven Weeks: When Threads Unravel (The Pragmatic Programmers)
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4-5"><span class="a-icon-alt">4.3 out of 5 stars</span></i>&nbsp;<span aria-label="26 reviews" class="a-size-small">26</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$19.64</span></span> <span style="position: relative; top: 2px;"><i class="a-icon a-icon-prime a-icon-small" role="img" aria-label="Prime"></i></span></div>
</a>
</div>
</div></div>
</span></li>
</ul>
</div>
<div class="a-section p13n-sc-static-list-buttons">
<a href="/gp/p13n-mobile/overflow?ie=UTF8&amp;asins=1941222153%2C1934356921%2C1937785653%2C0124104096%2C020161622X%2C1937785637%2C0131395319%2C0136073476%2C0486478831%2C0201485672%2C0132350882%2C0201835959%2C1680501224%2C0596517742%2C1939311225%2C0201633612%2C1934356050%2C1118063333%2C1680501488%2C0262560992%2C0262510871%2C1848000693%2C0521663504%2C0992133017%2C0134190440%2C1593272839%2C0201657880%2C0735611319%2C0984782850%2C1449335586%2C0131103628%2C193435645X%2C1118907442%2C0735619670%2C0262640686%2C0802829317%2C0471137723%2C0262033844%2C1491904240%2C0137081073%2C1934356344%2C013394302X%2C1593275919%2C1118335910%2C0321934113%2C1593274351%2C1491904151%2C1449373321%2C0814474578%2C1491904194%2C0321146530%2C0131177052%2C1449394701%2C1491904224%2C1430219483%2C0134034287%2C1617292230%2C0321751043%2C0321349601%2C1118530802%2C193778553X%2C1491950358%2C1491924462%2C1491973897%2C1593275846%2C0321356683%2C168050200X%2C1435712757%2C0136042597%2C1943153191%2C1491965975%2C149192912X%2C1933988924%2C0486678709%2C1617292397%2C1617290653%2C0134494164%2C1941222595%2C1942788002%2C1937785734%2C0324782012%2C1449329276%2C0124077269%2C0470229055%2C0981531687%2C0321842685%2C0997316020%2C1491986360%2C1593272200%2C8590379868%2C059652983X%2C0470474246%2C0321127420%2C144961552X%2C0996128107%2C0071843655%2C0321999576%2C0199740445%2C0321584104%2C1430264543&amp;baseAsin=193435659X&amp;faceoutTemplateClass=PI%3A%3AP13N%3A%3AViewTemplates%3A%3AProduct%3A%3APhone%3A%3AListFaceout&amp;parentFeatureID=SimilaritiesMobileCarousel&amp;productDetailsTemplateClass=PI%3A%3AP13N%3A%3AViewTemplates%3A%3AProductDetails%3A%3APhone%3A%3ABase&amp;ref=pd_aw_sim_14_l_of&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;reftagPrefix=pd_aw_sim_14&amp;title=Customers%20who%20bought%20this%20also%20bought" class="a-touch-link a-box"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>Show all 100 items</div></a>
</div>
</div>
</div>
</div><div class="aw-campaigns"><script>if (typeof uet === 'function' && typeof ues === 'function') {var scope = 'detail_btf_detail-mWeb';var placementId = '';ues('wb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); uet('bb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); if (placementId) {ues('wb', 'adplacements:' + placementId, {wb:1});uet('bb', 'adplacements:' + placementId, {wb:1});}}</script> <style>@media screen and (max-width:240px){ div[id$=detail_btf_detail-mWeb_wrapper]{ width:auto !important;margin-left:auto !important;left:auto !important} div[id$=detail_btf_detail-mWeb_text-wrapper]{ width:auto !important;margin-left:auto !important;left:auto !important}}@media screen and (orientation:landscape){ [id$=detail_btf_detail-mWeb_wrapper]{ max-width:414px !important;margin:auto !important} [id$=detail_btf_detail-mWeb_text-wrapper]{ max-width:414px !important;margin:auto !important}}</style> <div id="ape_detail_btf_detail-mWeb_wrapper" class="celwidget text/x-dacx-safeframe" style="position:relative; text-align:center; margin-left: -14px; margin-right: -14px; margin-top: 20px; height: 125px; overflow: hidden;" data-ad-details="{&quot;slot&quot; :&quot;detail_btf_detail-mWeb&quot;,&quot;pageType&quot;: &quot;detail&quot;,&quot;subPageType&quot;: &quot;detail-mWeb&quot;,&quot;slotName&quot; :&quot;btf&quot;,&quot;src&quot; : &quot;prefetchEnabled&quot;,&quot;adServer&quot; :&quot;cs&quot;,&quot;campaignId&quot; : &quot;9044&quot;,&quot;arid&quot; :&quot;5b25a8c2cf2441d185621391dfd7c737&quot;, &quot;size&quot; :{&quot;width&quot; : &quot;100%&quot;,&quot;height&quot; : &quot;125px&quot;},&quot;maxAdWidth&quot;: &quot;&quot;,&quot;allowedSizes&quot; :[{&quot;width&quot;:&quot;414px&quot;,&quot;height&quot;:&quot;125px&quot;}, {&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;}],&quot;allowedDomains&quot; : [],&quot;loadAfter&quot; : &quot;windowOnLoad&quot;,&quot;extraDelay&quot; : 0,&quot;iframeExtraStyle&quot;: &quot;width: 1px; min-width: 100%;&quot;,&quot;iframeClass&quot;: &quot;&quot;,&quot;iframeSandbox&quot;:&quot;&quot;,&quot;enablePrerenderLogic&quot;: true,&quot;adLabelWrapperId&quot;: &quot;ape_detail_btf_detail-mWeb_text-wrapper&quot;,&quot;adLabelId&quot;: &quot;ape_detail_btf_detail-mWeb_text&quot;,&quot;advTextWrapperDivStyle&quot;: &quot;position:relative; text-align:center; margin-left: -14px; margin-right: -14px; height: auto;&quot;,&quot;advertisementTextStyle&quot;: &quot;font-size: 10px; color: #555; text-align: right; margin: 0px 3px 6px 0;&quot;,&quot;advertisementTextHTMLContent&quot;: &quot;&quot;,&quot;advertisementTextHTMLContentEncoded&quot;: &quot;PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfdGV4dC13cmFwcGVyIiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7IHRleHQtYWxpZ246Y2VudGVyOyBtYXJnaW4tbGVmdDogLTE0cHg7IG1hcmdpbi1yaWdodDogLTE0cHg7IGhlaWdodDogYXV0bzsiICA+PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfdGV4dCIgc3R5bGU9ImZvbnQtc2l6ZTogMTBweDsgY29sb3I6ICM1NTU7IHRleHQtYWxpZ246IHJpZ2h0OyBtYXJnaW46IDBweCAzcHggNnB4IDA7IiAgPkFkdmVydGlzZW1lbnQ8L2Rpdj48L2Rpdj4=&quot;,&quot;adPixels&quot;: [],&quot;adPixelDelay&quot;: &quot;0&quot;,&quot;aaxImpPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/e/loi/imp?b=Qoq2wp-ao8dWFXZV44vOU4IAAAFhmeE40gEAAAGQARt1wkc&quot;,&quot;aaxInstrPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/x/px/Qoq2wp-ao8dWFXZV44vOU4IAAAFhmeE40gEAAAGQARt1wkc/&quot;,&quot;htmlContent&quot;: &quot;&quot;,&quot;htmlContentEncoded&quot;: &quot;PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfY3JlYXRpdmVXcmFwcGVyIiAgID48IWRvY3R5cGUgaHRtbD48aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PVVURi04Pjx0aXRsZT48L3RpdGxlPjxzdHlsZT5odG1se2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MS4xNTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlfWJvZHl7bWFyZ2luOjB9YXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXA6b2JqZWN0c31hOmFjdGl2ZSxhOmhvdmVye291dGxpbmUtd2lkdGg6MH1pbWd7Ym9yZGVyLXN0eWxlOm5vbmV9Kiw6YWZ0ZXIsOmJlZm9yZXtib3gtc2l6aW5nOmJvcmRlci1ib3h9aHRtbHtvdmVyZmxvdzpoaWRkZW47Zm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNhIE5ldWUsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6IzExMTtmb250LXNpemU6MTRweH1he2NvbG9yOiMwMDY2YzA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2NvbG9yOiNjNDU1MDB9I2Fkey13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlfS5ibG9ja3tkaXNwbGF5Oi13ZWJraXQtZmxleDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW59LmJsb2NrOmVtcHR5e2Rpc3BsYXk6bm9uZX0uYmxvY2stLWp1c3RpZnktY2VudGVyey13ZWJraXQtanVzdGlmeS1jb250ZW50OmNlbnRlcjstbXMtZmxleC1wYWNrOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5ibG9jay0tanVzdGlmeS1mbGV4LWVuZHstd2Via2l0LWp1c3RpZnktY29udGVudDpmbGV4LWVuZDstbXMtZmxleC1wYWNrOmVuZDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LmJsb2NrLS1hbGlnbi1mbGV4LXN0YXJ0ey13ZWJraXQtYWxpZ24taXRlbXM6ZmxleC1zdGFydDstbXMtZmxleC1hbGlnbjpzdGFydDstbXMtZ3JpZC1yb3ctYWxpZ246ZmxleC1zdGFydDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5ibG9jay0tYWxpZ24tY2VudGVyey13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjstbXMtZ3JpZC1yb3ctYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0uYmxvY2stLWFsaWduLWZsZXgtZW5key13ZWJraXQtYWxpZ24taXRlbXM6ZmxleC1lbmQ7LW1zLWZsZXgtYWxpZ246ZW5kOy1tcy1ncmlkLXJvdy1hbGlnbjpmbGV4LWVuZDthbGlnbi1pdGVtczpmbGV4LWVuZH0uYmxvY2stLWRpcmVjdGlvbi1jb2x1bW57LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmJsb2NrLS1iYWNrZ3JvdW5kLC5ibG9jay0tYmFja2dyb3VuZD4uYmxvY2t7cG9zaXRpb246cmVsYXRpdmV9LmJsb2NrX19iYWNrZ3JvdW5ke3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5ibG9jay0tbG9ja3std2Via2l0LWZsZXgtZ3JvdzowOy1tcy1mbGV4LXBvc2l0aXZlOjA7ZmxleC1ncm93OjA7LXdlYmtpdC1mbGV4LXNocmluazowOy1tcy1mbGV4LW5lZ2F0aXZlOjA7ZmxleC1zaHJpbms6MH0uYmxvY2stLWlubGluZTpub3QoOmVtcHR5KXtkaXNwbGF5OmJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDtmb250LXNpemU6MH0uYmxvY2stLWlubGluZTpub3QoOmVtcHR5KT4uYmxvY2s6bm90KDplbXB0eSl7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtc2l6ZToxNHB4fS5oLW5vRmxleGJveCAuYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2t9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1jZW50ZXI+LmJsb2Nre3RleHQtYWxpZ246bGVmdH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1qdXN0aWZ5LWZsZXgtZW5ke3RleHQtYWxpZ246cmlnaHR9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1mbGV4LWVuZD4uYmxvY2t7dGV4dC1hbGlnbjpsZWZ0fS5oLW5vRmxleGJveCAuYmxvY2stLWFsaWduLWZsZXgtc3RhcnQ+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOnRvcH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1jZW50ZXI+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1mbGV4LWVuZD4uYmxvY2t7dmVydGljYWwtYWxpZ246Ym90dG9tfS5oLW5vRmxleGJveCAuYmxvY2stLWRpcmVjdGlvbi1jb2x1bW4+LmJsb2Nre2Rpc3BsYXk6YmxvY2t9LmgtY2xvYWt7dmlzaWJpbGl0eTpoaWRkZW4haW1wb3J0YW50fS5oLWVsbGlwc2lze292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uYXNpbkltYWdle2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uYXNpbkltYWdlLS1leHRlbmRDb250YWluZXJIZWlnaHR7aGVpZ2h0OmF1dG99LmFzaW5JbWFnZS0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0Pi5pbWFnZUNvbnRhaW5lcntoZWlnaHQ6MTAwJX0uYXNpbkltYWdlLS13aXRoRGVzY3JpcHRpb257ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uPi5pbWFnZUNvbnRhaW5lcnttYXJnaW4tYm90dG9tOjVweH0uYXNpbkltYWdlLS13aXRoRGVzY3JpcHRpb24+LnRleHRDb250YWluZXJ7bWluLWhlaWdodDoxNXB4O3RleHQtYWxpZ246Y2VudGVyfS5pbWFnZUNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2JvdHRvbTowO3JpZ2h0OjA7bWFyZ2luOmF1dG87d2lkdGg6YXV0bztoZWlnaHQ6YXV0bzttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmltYWdlQ29udGFpbmVyLS1sZWZ0e2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LmltYWdlQ29udGFpbmVyLS1sZWZ0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7cG9zaXRpb246c3RhdGljO21hcmdpbjowfS5pbWFnZUNvbnRhaW5lci0tcmlnaHQ+LmltYWdlQ29udGFpbmVyX19pbWFnZXttYXJnaW46MDtsZWZ0OmF1dG87Ym90dG9tOmF1dG87dG9wOmF1dG99LmltYWdlQ29udGFpbmVyLS1leHRlbmRDb250YWluZXJIZWlnaHR7aGVpZ2h0OmF1dG99LmltYWdlQ29udGFpbmVyLS1leHRlbmRDb250YWluZXJIZWlnaHQ+LmltYWdlQ29udGFpbmVyX19pbWFnZXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46MCBhdXRvfS50ZXh0TGlua3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9LnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0e2NvbG9yOiMxMTF9LnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0OmhvdmVye2NvbG9yOiMxMTE7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnNreSAudGV4dExpbmt7Zm9udC13ZWlnaHQ6NjAwfS5za3kgLnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0LC5za3kgLnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0OmhvdmVye2NvbG9yOiMwMDJmMzZ9LnByaWNlQm94X19saXN0e21hcmdpbi1yaWdodDo0cHh9LnByaWNlQm94X190YXhNZXNzYWdle21hcmdpbi1sZWZ0OjVweDtmb250LXNpemU6MTFweH0ucHJpY2V7Y29sb3I6I2IxMjcwNH0ucHJpY2UtLWxpc3R7Y29sb3I6IzU1NTt0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdofS5wcmljZS0tanVtYm97Zm9udC1zaXplOjNlbX0ucHJpY2VfX2p1bWJvQ3VycmVuY3ksLnByaWNlX19qdW1ib0RlY2ltYWxBbW91bnQsLnByaWNlX19qdW1ib0ludGVnZXJBbW91bnR7dmVydGljYWwtYWxpZ246dG9wO2ZvbnQtd2VpZ2h0OjUwMH0ucHJpY2VfX2p1bWJvQ3VycmVuY3ksLnByaWNlX19qdW1ib0RlY2ltYWxBbW91bnR7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOi40ZW07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgzNSUpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgzNSUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7Zm9udC13ZWlnaHQ6NzAwfS5wcmljZV9fanVtYm9JbnRlZ2VyQW1vdW50e2xldHRlci1zcGFjaW5nOi0uNXB4fS5za3kgLnByaWNle2NvbG9yOiNiMTI3MDR9LnByaW1lTG9nb3ttYXJnaW4tdG9wOjJweH0udGVtcGxhdGVDb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmV9LnRlbXBsYXRlQ29udGFpbmVyX19saW5re3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvcGFjaXR5OjB9LmNsaWNrdGhyb3VnaExpbms6bm90KC50ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayl7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfTwvc3R5bGU+PHNjcmlwdD52YXIgbW9kZXJuaXpyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4obyl7aWYodFtvXSlyZXR1cm4gdFtvXS5leHBvcnRzO3ZhciByPXRbb109e2V4cG9ydHM6e30saWQ6byxsb2FkZWQ6ITF9O3JldHVybiBlW29dLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLG4pLHIubG9hZGVkPSEwLHIuZXhwb3J0c312YXIgdD17fTtyZXR1cm4gbi5tPWUsbi5jPXQsbi5wPSIiLG4oMCl9KHswOmZ1bmN0aW9uKGUsbix0KXtlLmV4cG9ydHM9dCgyMCl9LDIwOmZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiO3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfTshZnVuY3Rpb24oZSxuLG8pe2Z1bmN0aW9uIHIoZSxuKXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOnQoZSkpPT09bn1mdW5jdGlvbiBzKCl7dmFyIGUsbix0LG8scyxpLGw7Zm9yKHZhciBmIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShmKSl7aWYoZT1bXSxuPWJbZl0sbi5uYW1lJiYoZS5wdXNoKG4ubmFtZS50b0xvd2VyQ2FzZSgpKSxuLm9wdGlvbnMmJm4ub3B0aW9ucy5hbGlhc2VzJiZuLm9wdGlvbnMuYWxpYXNlcy5sZW5ndGgpKWZvcih0PTA7dDxuLm9wdGlvbnMuYWxpYXNlcy5sZW5ndGg7dCsrKWUucHVzaChuLm9wdGlvbnMuYWxpYXNlc1t0XS50b0xvd2VyQ2FzZSgpKTtmb3Iobz1yKG4uZm4sImZ1bmN0aW9uIik/bi5mbigpOm4uZm4scz0wO3M8ZS5sZW5ndGg7cysrKWk9ZVtzXSxsPWkuc3BsaXQoIi4iKSwxPT09bC5sZW5ndGg/d1tsWzBdXT1vOighd1tsWzBdXXx8d1tsWzBdXWluc3RhbmNlb2YgQm9vbGVhbnx8KHdbbFswXV09bmV3IEJvb2xlYW4od1tsWzBdXSkpLHdbbFswXV1bbFsxXV09byksZy5wdXNoKChvPyIiOiJuby0iKStsLmpvaW4oIi0iKSl9fWZ1bmN0aW9uIGkoZSl7dmFyIG49Uy5jbGFzc05hbWUsdD13Ll9jb25maWcuY2xhc3NQcmVmaXh8fCIiO2lmKF8mJihuPW4uYmFzZVZhbCksdy5fY29uZmlnLmVuYWJsZUpTQ2xhc3Mpe3ZhciBvPW5ldyBSZWdFeHAoIihefFxccykiK3QrIm5vLWpzKFxcc3wkKSIpO249bi5yZXBsYWNlKG8sIiQxIit0KyJqcyQyIil9dy5fY29uZmlnLmVuYWJsZUNsYXNzZXMmJihuKz0iICIrdCtlLmpvaW4oIiAiK3QpLF8/Uy5jbGFzc05hbWUuYmFzZVZhbD1uOlMuY2xhc3NOYW1lPW4pfWZ1bmN0aW9uIGwoZSxuKXtyZXR1cm4hIX4oIiIrZSkuaW5kZXhPZihuKX1mdW5jdGlvbiBmKCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIG4uY3JlYXRlRWxlbWVudD9uLmNyZWF0ZUVsZW1lbnQoYXJndW1lbnRzWzBdKTpfP24uY3JlYXRlRWxlbWVudE5TLmNhbGwobiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGFyZ3VtZW50c1swXSk6bi5jcmVhdGVFbGVtZW50LmFwcGx5KG4sYXJndW1lbnRzKX1mdW5jdGlvbiBhKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbYS16XSktKFthLXpdKS9nLGZ1bmN0aW9uKGUsbix0KXtyZXR1cm4gbit0LnRvVXBwZXJDYXNlKCl9KS5yZXBsYWNlKC9eLS8sIiIpfWZ1bmN0aW9uIHUoZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShuLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHAoZSxuLHQpe3ZhciBvO2Zvcih2YXIgcyBpbiBlKWlmKGVbc11pbiBuKXJldHVybiB0PT09ITE/ZVtzXToobz1uW2Vbc11dLHIobywiZnVuY3Rpb24iKT91KG8sdHx8bik6byk7cmV0dXJuITF9ZnVuY3Rpb24gZChlKXtyZXR1cm4gZS5yZXBsYWNlKC8oW0EtWl0pL2csZnVuY3Rpb24oZSxuKXtyZXR1cm4iLSIrbi50b0xvd2VyQ2FzZSgpfSkucmVwbGFjZSgvXm1zLS8sIi1tcy0iKX1mdW5jdGlvbiBjKCl7dmFyIGU9bi5ib2R5O3JldHVybiBlfHwoZT1mKF8/InN2ZyI6ImJvZHkiKSxlLmZha2U9ITApLGV9ZnVuY3Rpb24gbShlLHQsbyxyKXt2YXIgcyxpLGwsYSx1PSJtb2Rlcm5penIiLHA9ZigiZGl2IiksZD1jKCk7aWYocGFyc2VJbnQobywxMCkpZm9yKDtvLS07KWw9ZigiZGl2IiksbC5pZD1yP3Jbb106dSsobysxKSxwLmFwcGVuZENoaWxkKGwpO3JldHVybiBzPWYoInN0eWxlIikscy50eXBlPSJ0ZXh0L2NzcyIscy5pZD0icyIrdSwoZC5mYWtlP2Q6cCkuYXBwZW5kQ2hpbGQocyksZC5hcHBlbmRDaGlsZChwKSxzLnN0eWxlU2hlZXQ/cy5zdHlsZVNoZWV0LmNzc1RleHQ9ZTpzLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoZSkpLHAuaWQ9dSxkLmZha2UmJihkLnN0eWxlLmJhY2tncm91bmQ9IiIsZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixhPVMuc3R5bGUub3ZlcmZsb3csUy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixTLmFwcGVuZENoaWxkKGQpKSxpPXQocCxlKSxkLmZha2U/KGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSxTLnN0eWxlLm92ZXJmbG93PWEsUy5vZmZzZXRIZWlnaHQpOnAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKSwhIWl9ZnVuY3Rpb24geShuLHQpe3ZhciByPW4ubGVuZ3RoO2lmKCJDU1MiaW4gZSYmInN1cHBvcnRzImluIGUuQ1NTKXtmb3IoO3ItLTspaWYoZS5DU1Muc3VwcG9ydHMoZChuW3JdKSx0KSlyZXR1cm4hMDtyZXR1cm4hMX1pZigiQ1NTU3VwcG9ydHNSdWxlImluIGUpe2Zvcih2YXIgcz1bXTtyLS07KXMucHVzaCgiKCIrZChuW3JdKSsiOiIrdCsiKSIpO3JldHVybiBzPXMuam9pbigiIG9yICIpLG0oIkBzdXBwb3J0cyAoIitzKyIpIHsgI21vZGVybml6ciB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgfSB9IixmdW5jdGlvbihlKXtyZXR1cm4iYWJzb2x1dGUiPT1nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCkucG9zaXRpb259KX1yZXR1cm4gb31mdW5jdGlvbiB2KGUsbix0LHMpe2Z1bmN0aW9uIGkoKXtwJiYoZGVsZXRlIE4uc3R5bGUsZGVsZXRlIE4ubW9kRWxlbSl9aWYocz1yKHMsInVuZGVmaW5lZCIpPyExOnMsIXIodCwidW5kZWZpbmVkIikpe3ZhciB1PXkoZSx0KTtpZighcih1LCJ1bmRlZmluZWQiKSlyZXR1cm4gdX1mb3IodmFyIHAsZCxjLG0sdixoPVsibW9kZXJuaXpyIiwidHNwYW4iLCJzYW1wIl07IU4uc3R5bGUmJmgubGVuZ3RoOylwPSEwLE4ubW9kRWxlbT1mKGguc2hpZnQoKSksTi5zdHlsZT1OLm1vZEVsZW0uc3R5bGU7Zm9yKGM9ZS5sZW5ndGgsZD0wO2M+ZDtkKyspaWYobT1lW2RdLHY9Ti5zdHlsZVttXSxsKG0sIi0iKSYmKG09YShtKSksTi5zdHlsZVttXSE9PW8pe2lmKHN8fHIodCwidW5kZWZpbmVkIikpcmV0dXJuIGkoKSwicGZ4Ij09bj9tOiEwO3RyeXtOLnN0eWxlW21dPXR9Y2F0Y2goeCl7fWlmKE4uc3R5bGVbbV0hPXYpcmV0dXJuIGkoKSwicGZ4Ij09bj9tOiEwfXJldHVybiBpKCksITF9ZnVuY3Rpb24gaChlLG4sdCxvLHMpe3ZhciBpPWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxsPShlKyIgIitULmpvaW4oaSsiICIpK2kpLnNwbGl0KCIgIik7cmV0dXJuIHIobiwic3RyaW5nIil8fHIobiwidW5kZWZpbmVkIik/dihsLG4sbyxzKToobD0oZSsiICIrei5qb2luKGkrIiAiKStpKS5zcGxpdCgiICIpLHAobCxuLHQpKX1mdW5jdGlvbiB4KGUsbix0KXtyZXR1cm4gaChlLG8sbyxuLHQpfXZhciBnPVtdLGI9W10sQz17X3ZlcnNpb246IjMuMy4xIixfY29uZmlnOntjbGFzc1ByZWZpeDoiIixlbmFibGVDbGFzc2VzOiEwLGVuYWJsZUpTQ2xhc3M6ITAsdXNlUHJlZml4ZXM6ITB9LF9xOltdLG9uOmZ1bmN0aW9uKGUsbil7dmFyIHQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bih0W2VdKX0sMCl9LGFkZFRlc3Q6ZnVuY3Rpb24oZSxuLHQpe2IucHVzaCh7bmFtZTplLGZuOm4sb3B0aW9uczp0fSl9LGFkZEFzeW5jVGVzdDpmdW5jdGlvbihlKXtiLnB1c2goe25hbWU6bnVsbCxmbjplfSl9fSx3PWZ1bmN0aW9uKCl7fTt3LnByb3RvdHlwZT1DLHc9bmV3IHc7dmFyIFM9bi5kb2N1bWVudEVsZW1lbnQsXz0ic3ZnIj09PVMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxQPSJNb3ogTyBtcyBXZWJraXQiLFQ9Qy5fY29uZmlnLnVzZVByZWZpeGVzP1Auc3BsaXQoIiAiKTpbXTtDLl9jc3NvbVByZWZpeGVzPVQ7dmFyIHo9Qy5fY29uZmlnLnVzZVByZWZpeGVzP1AudG9Mb3dlckNhc2UoKS5zcGxpdCgiICIpOltdO0MuX2RvbVByZWZpeGVzPXo7dmFyIEU9e2VsZW06ZigibW9kZXJuaXpyIil9O3cuX3EucHVzaChmdW5jdGlvbigpe2RlbGV0ZSBFLmVsZW19KTt2YXIgTj17c3R5bGU6RS5lbGVtLnN0eWxlfTt3Ll9xLnVuc2hpZnQoZnVuY3Rpb24oKXtkZWxldGUgTi5zdHlsZX0pLEMudGVzdEFsbFByb3BzPWgsQy50ZXN0QWxsUHJvcHM9eCwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3giLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94IiwKCSAgICAiY2FuaXVzZSI6ICJmbGV4Ym94IiwKCSAgICAidGFncyI6IFsiY3NzIl0sCgkgICAgIm5vdGVzIjogW3sKCSAgICAgICJuYW1lIjogIlRoZSBfbmV3XyBmbGV4Ym94IiwKCSAgICAgICJocmVmIjogImh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2NzczMtZmxleGJveCIKCSAgICB9XSwKCSAgICAid2FybmluZ3MiOiBbCgkgICAgICAiQSBgdHJ1ZWAgcmVzdWx0IGZvciB0aGlzIGRldGVjdCBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZSBgZmxleC13cmFwYCBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQ7IHNlZSB0aGUgYGZsZXh3cmFwYCBkZXRlY3QuIgoJICAgIF0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94Iix4KCJmbGV4QmFzaXMiLCIxcHgiLCEwKSksLyohCgkgIHsKCSAgICAibmFtZSI6ICJGbGV4Ym94IChsZWdhY3kpIiwKCSAgICAicHJvcGVydHkiOiAiZmxleGJveGxlZ2FjeSIsCgkgICAgInRhZ3MiOiBbImNzcyJdLAoJICAgICJwb2x5ZmlsbHMiOiBbImZsZXhpZSJdLAoJICAgICJub3RlcyI6IFt7CgkgICAgICAibmFtZSI6ICJUaGUgX29sZF8gZmxleGJveCIsCgkgICAgICAiaHJlZiI6ICJodHRwczovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLWZsZXhib3gtMjAwOTA3MjMvIgoJICAgIH1dCgkgIH0KCSAgISovCncuYWRkVGVzdCgiZmxleGJveGxlZ2FjeSIseCgiYm94RGlyZWN0aW9uIiwicmV2ZXJzZSIsITApKSwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3ggKHR3ZWVuZXIpIiwKCSAgICAicHJvcGVydHkiOiAiZmxleGJveHR3ZWVuZXIiLAoJICAgICJ0YWdzIjogWyJjc3MiXSwKCSAgICAicG9seWZpbGxzIjogWyJmbGV4aWUiXSwKCSAgICAibm90ZXMiOiBbewoJICAgICAgIm5hbWUiOiAiVGhlIF9pbmJldHdlZW5fIGZsZXhib3giLAoJICAgICAgImhyZWYiOiAiaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTEvV0QtY3NzMy1mbGV4Ym94LTIwMTExMTI5LyIKCSAgICB9XSwKCSAgICAid2FybmluZ3MiOiBbIlRoaXMgcmVwcmVzZW50cyBhbiBvbGQgc3ludGF4LCBub3QgdGhlIGxhdGVzdCBzdGFuZGFyZCBzeW50YXguIl0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94dHdlZW5lciIseCgiZmxleEFsaWduIiwiZW5kIiwhMCkpLHMoKSxpKGcpLGRlbGV0ZSBDLmFkZFRlc3QsZGVsZXRlIEMuYWRkQXN5bmNUZXN0O2Zvcih2YXIgaj0wO2o8dy5fcS5sZW5ndGg7aisrKXcuX3Fbal0oKTtlLk1vZGVybml6cj13fSh3aW5kb3csZG9jdW1lbnQpfX0pOzt2YXIgUGRhQ2xpZW50QVBJPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBpPW5bcl09e2V4cG9ydHM6e30saWQ6cixsb2FkZWQ6ITF9O3JldHVybiBlW3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLHQpLGkubG9hZGVkPSEwLGkuZXhwb3J0c312YXIgbj17fTtyZXR1cm4gdC5tPWUsdC5jPW4sdC5wPSIiLHQoMCl9KFtmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMTYpfSwsLCwsLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lfHx3aW5kb3cuZXZlbnQ7cmV0dXJuIG4odCl9O2lmKGUuYWRkRXZlbnRMaXN0ZW5lcillLmFkZEV2ZW50TGlzdGVuZXIodCxyLCEwKTtlbHNlIGlmKHQ9Im9uIit0LGUuYXR0YWNoRXZlbnQpZS5hdHRhY2hFdmVudCh0LHIpO2Vsc2V7dmFyIGk9ZVt0XTtlW3RdPWZ1bmN0aW9uKCl7ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksImZ1bmN0aW9uIj09dHlwZW9mIGkmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19fSwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYT1uKDkpLHU9cihhKSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtpZihpKHRoaXMsZSksdGhpcy53aW5kb3c9dC53aW5kb3d8fCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3csIXRoaXMud2luZG93fHwhdGhpcy53aW5kb3cuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJXaW5kb3cgYW5kL29yIGRvY3VtZW50IGlzIG5vdCBkZWZpbmVkIik7dGhpcy5kYWN4TG9nZ2VyPXQuZGFjeExvZ2dlcnx8bmV3IHVbImRlZmF1bHQiXSh0LmJhc2VVcmwsdC5pbXByZXNzaW9uSWQsdC5hZFNlc3Npb25JZCksdGhpcy5haWQ9dC5hZElkLHRoaXMuY2lkPXQuY3JlYXRpdmVJZCx0aGlzLmRhY3hMb2dnZXIubG9nSW1wcmVzc2lvbigpfXJldHVybiBvKGUsW3trZXk6ImF0dGFjaEdsb2JhbHMiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy53aW5kb3cuZG9jdW1lbnQuYWQ9e2FpZDp0aGlzLmFkSWQsY2lkOnRoaXMuY3JlYXRpdmVJZH0sdGhpcy53aW5kb3cuRGFjeExvZ2dlcj10aGlzLmRhY3hMb2dnZXJ9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBpKGUsdCxuKXtyZXR1cm4gdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gYShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIHUoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj1uZXcgZlsiZGVmYXVsdCJdKGUsZCkscj17aTp0LmRhY3hJbXByZXNzaW9uSWQsYXNpOnQuZGFjeFNlc3Npb25JZCxjbGljazoxfTtyZXR1cm4gbi5nZXRQaXhlbFVybChyKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCk7dC5nZW5lcmF0ZURhY3hDbGlja1RyYWNrZXJVcmw9Yzt2YXIgcz1uKDEwKSxmPXIocyksZD0iNDE2NzMxNjEzIixwPSJjbGllbnRfaW1wIixoPSJ2aWV3Iix2PSJzd2lwZSIseT0tMSxnPTEsdz0yLG09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4scil7byh0aGlzLHQpO3ZhciBpPWEodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUsZCkpO3JldHVybiBpLmltcHJlc3Npb25JZD1uLGkuYWRTZXNzaW9uSWQ9cixpfXJldHVybiB1KHQsZSksbCh0LFt7a2V5OiJsb2dNZXRyaWMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49aSh7aTp0aGlzLmltcHJlc3Npb25JZCxhc2k6dGhpcy5hZFNlc3Npb25JZH0sZSx0fHwxKTt0aGlzLmZpcmVQaXhlbChuKX19LHtrZXk6ImxvZ0ltcHJlc3Npb24iLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMocCl9fSx7a2V5OiJsb2dWaWV3YWJpbGl0eVN1Y2Nlc3MiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMoaCxnKX19LHtrZXk6ImxvZ0JhcmVWaWV3YWJpbGl0eVN1Y2Nlc3MiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMoaCx3KX19LHtrZXk6ImxvZ1ZpZXdhYmlsaXR5RmFpbHVyZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLHkpfX0se2tleToibG9nU3dpcGUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWModil9fV0pLHR9KGZbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPW19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxvPW4oMTEpLmdldFF1ZXJ5U3RyaW5nLGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbil7cih0aGlzLGUpLHRoaXMuYmFzZVVybD10LHRoaXMuY2hhbm5lbD1ufXJldHVybiBpKGUsW3trZXk6ImdldFBpeGVsVXJsIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0iPyIrZW5jb2RlVVJJQ29tcG9uZW50KG8oZSkpO3JldHVybiB0aGlzLmJhc2VVcmwrIi9pdTM/ZD1mb3Jlc3Rlci1kaWQmZXgtZmNoPSIrdGhpcy5jaGFubmVsKyImZXgtZmFyZ3M9Iit0KyImY2I9IisobmV3IERhdGUpLmdldFRpbWUoKX19LHtrZXk6ImZpcmVQaXhlbCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEltYWdlO3JldHVybiB0LnNyYz10aGlzLmdldFBpeGVsVXJsKGUpLHR9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWF9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0KXt2YXIgbj1bXTtmb3IodmFyIHIgaW4gZSluLnB1c2gocisiPSIrZVtyXSk7dmFyIGk9bi5qb2luKCImIik7cmV0dXJuIHQ/ZW5jb2RlVVJJQ29tcG9uZW50KGkpOml9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7cj5uO24rKyl0KGVbbl0sbixlKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5nZXRRdWVyeVN0cmluZz1uLHQuZm9yRWFjaD1yfSwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGM9ZnVuY3Rpb24gYihlLHQsbil7bnVsbD09PWUmJihlPUZ1bmN0aW9uLnByb3RvdHlwZSk7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHZvaWQgMD09PXIpe3ZhciBpPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PWk/dm9pZCAwOmIoaSx0LG4pfWlmKCJ2YWx1ZSJpbiByKXJldHVybiByLnZhbHVlO3ZhciBvPXIuZ2V0O2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8uY2FsbChuKX0sbD1uKDgpLHM9cihsKSxmPW4oMTcpLGQ9cihmKSxwPW4oMTgpLGg9cihwKSx2PW4oMTkpLHk9cih2KSxnPW4oNiksdz1bIlRFVFJJU19JTkxJTkVfTUVTU0FHSU5HIl0sbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe2kodGhpcyx0KTt2YXIgbj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSk7cmV0dXJuIG4uc2hhemFtTG9nZ2VyPWUuc2hhemFtTG9nZ2VyfHxuZXcgZFsiZGVmYXVsdCJdKGUuYmFzZVVybCxlKSxuLnNoYXphbUxvZ2dlci5sb2dJbXByZXNzaW9uKCksbi5jcmVhdGl2ZUNsaWNrTG9nZ2VyPWUuY3JlYXRpdmVDbGlja0xvZ2dlcnx8bmV3IHlbImRlZmF1bHQiXShlLmJhc2VVcmwsZS5pbXByZXNzaW9uSWQpLG4udGVtcGxhdGVOYW1lPWUudGVtcGxhdGVOYW1lLG59cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImF0dGFjaEdsb2JhbHMiLHZhbHVlOmZ1bmN0aW9uKCl7Yyh0LnByb3RvdHlwZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSksImF0dGFjaEdsb2JhbHMiLHRoaXMpLmNhbGwodGhpcyksdGhpcy53aW5kb3cuU2hhemFtTG9nZ2VyPXRoaXMuc2hhemFtTG9nZ2VyLHRoaXMud2luZG93LlZpZXdhYmlsaXR5PWhbImRlZmF1bHQiXX19LHtrZXk6InRyYWNrTG9hZExhdGVuY3kiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnNoYXphbUxvZ2dlci5zdGFydFRpbWVyKGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpLCgwLGcuYWRkTGlzdGVuZXIpKHRoaXMud2luZG93LCJsb2FkIixmdW5jdGlvbih0KXtlLnNoYXphbUxvZ2dlci5lbmRUaW1lcihkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuQ1JFQVRJVkVfTE9BRF9MQVRFTkNZKX0pfX0se2tleToiYWRkRXJyb3JMaXN0ZW5lciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMud2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24odCxuLHIsaSxvKXtpZihvJiZvLnN0YWNrKXt2YXIgYT10KyIgOiAiK28uc3RhY2s7ZS5zaGF6YW1Mb2dnZXIuYWRkQ291bnQoZFsiZGVmYXVsdCJdLkVWRU5UX05BTUVTLlVOQ0FVR0hUX0VSUk9SLGEubGVuZ3RoPDUwMD9hOmEuc3Vic3RyaW5nKDAsNTAwKSl9ZWxzZSBlLnNoYXphbUxvZ2dlci5hZGRDb3VudChkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuVU5DQVVHSFRfRVJST1IsdCsiIDogIituKX19fSx7a2V5OiJhZGRWaWV3YWJpbGl0eUxpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49LjUscj0xZTMsaT0uMDEsbz0xLGE9bmV3IGhbImRlZmF1bHQiXShlLHRoaXMud2luZG93KTthLmdldFBlcmNlbnRJblZpZXcoKTw9LTE/dGhpcy5kYWN4TG9nZ2VyLmxvZ1ZpZXdhYmlsaXR5RmFpbHVyZSgpOihhLm9uVmlldyhpLG8sZnVuY3Rpb24oKXtyZXR1cm4gdC5kYWN4TG9nZ2VyLmxvZ0JhcmVWaWV3YWJpbGl0eVN1Y2Nlc3MoKX0pLGEub25WaWV3KG4scixmdW5jdGlvbigpe3JldHVybiB0LmRhY3hMb2dnZXIubG9nVmlld2FiaWxpdHlTdWNjZXNzKCl9KSl9fSx7a2V5OiJhZGRDcmVhdGl2ZUNsaWNrTGlzdGVuZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dy5pbmRleE9mKHRoaXMudGVtcGxhdGVOYW1lKT49MCYmKDAsZy5hZGRMaXN0ZW5lcikoZSwiY2xpY2siLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXt0LmNyZWF0aXZlQ2xpY2tMb2dnZXIubG9nQ2xpY2sobixlLm9mZnNldFdpZHRoLGUub2Zmc2V0SGVpZ2h0KX19KGUpKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09bX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGM9ZnVuY3Rpb24geShlLHQsbil7bnVsbD09PWUmJihlPUZ1bmN0aW9uLnByb3RvdHlwZSk7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHZvaWQgMD09PXIpe3ZhciBpPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PWk/dm9pZCAwOnkoaSx0LG4pfWlmKCJ2YWx1ZSJpbiByKXJldHVybiByLnZhbHVlO3ZhciBvPXIuZ2V0O2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8uY2FsbChuKX0sbD1uKDEwKSxzPXIobCksZj0uMSxkPSJjbG1ldCIscD0iZGEtY3gtbWV0cmljcyIsaD1bInNoYXphbUlkIiwidGVtcGxhdGVOYW1lIiwibG9jYWxlIiwiYWRTZXJ2ZXIiLCJ0ZW1wbGF0ZU1ham9yVmVyc2lvbiIsInRlbXBsYXRlTWlub3JWZXJzaW9uIiwiYWRJZCIsImNyZWF0aXZlSWQiLCJpbXByZXNzaW9uSWQiXSx2PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSxuKXtpKHRoaXMsdCk7dmFyIHI9byh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSxwKSk7cmV0dXJuIHIuc2hvdWxkRmlyZU1ldHJpY3M9TWF0aC5yYW5kb20oKTw9ZixyLnRpbWVycz17fSxyLmFkSW5mbz1uLGguZm9yRWFjaChmdW5jdGlvbihlKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sZSkpdGhyb3cgbmV3IEVycm9yKCJTaGF6YW1Mb2dnZXIgbWlzc2luZyBhZEluZm8gcHJvcGVydHk6ICIrZSl9KSxyfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJmaXJlUGl4ZWwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuc2hvdWxkRmlyZU1ldHJpY3MmJihlLmk9ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYWRJbmZvLmltcHJlc3Npb25JZCksZS5hcHA9ZW5jb2RlVVJJQ29tcG9uZW50KGQpLGModC5wcm90b3R5cGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLCJmaXJlUGl4ZWwiLHRoaXMpLmNhbGwodGhpcyxlKSl9fSx7a2V5OiJsb2dFdmVudCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O2lmKG51bGwhPWUmJm51bGwhPXQpe3RyeXtuJiYoci50eXBlPW4pLHIuZW49ZSxyLmV2PUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKGkpe3Iuc3RyaW5naWZ5Tm90QXZhaWxhYmxlPTF9dGhpcy5maXJlUGl4ZWwocil9fX0se2tleToibG9nSW1wcmVzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFkSW5mbyx0PXtzOmUuc2hhemFtSWQsbjplbmNvZGVVUklDb21wb25lbnQoZS50ZW1wbGF0ZU5hbWUpLGw6ZS5sb2NhbGUsYXM6ZS5hZFNlcnZlcix0bWp2OmUudGVtcGxhdGVNYWpvclZlcnNpb24sdG1udjplLnRlbXBsYXRlTWlub3JWZXJzaW9uLGFpOmUuYWRJZCxjaTplLmNyZWF0aXZlSWQsaTplLmltcHJlc3Npb25JZCxpbXA6MX07bmF2aWdhdG9yJiYodC51YT1lbmNvZGVVUklDb21wb25lbnQobmF2aWdhdG9yLnVzZXJBZ2VudCkpLHRoaXMuZmlyZVBpeGVsKHQpfX0se2tleToic3RhcnRUaW1lciIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy50aW1lcnNbZV09bmV3IERhdGV9fSx7a2V5OiJlbmRUaW1lciIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy50aW1lcnNbZV0pe3ZhciBuPW5ldyBEYXRlLXRoaXMudGltZXJzW2VdO3RoaXMubG9nRXZlbnQoZSxuLHQuRVZFTlRfVFlQRVMuVElNRVIpLGRlbGV0ZSB0aGlzLnRpbWVyc1tlXX19fSx7a2V5OiJhZGRDb3VudCIsdmFsdWU6ZnVuY3Rpb24oZSxuKXtuPW58fDEsdGhpcy5sb2dFdmVudChlLG4sdC5FVkVOVF9UWVBFUy5DT1VOVEVSKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09dix2LkVWRU5UX1RZUEVTPXtUSU1FUjoidGltZXIiLENPVU5URVI6ImNvdW50ZXIiLEpTT046Impzb24ifSx2LkVWRU5UX05BTUVTPXtCVVlfQk9YX0xPQURfTEFURU5DWToiQnV5Qm94TG9hZExhdGVuY3kiLEFBTl9MQVRFTkNZOiJBYW5MYXRlbmN5IixBQU5fRVJST1I6IkFhbkVycm9yIixEUk9QX0RPV05fU0VMRUNUT1I6IkRyb3BEb3duU2VsZWN0b3IiLFVOQ0FVR0hUX0VSUk9SOiJVbmNhdWdodEVycm9yIixVTkRFRklORURfVFJBQ0tFUl9BUkc6IlVuZGVmaW5lZFRyYWNrZXJBcmciLENPT1JESU5BVE9SX1RSQUNLRVI6IkNvb3JkaW5hdG9yVHJhY2tlciIsSU1BR0VfTE9BRF9MQVRFTkNZOiJJbWFnZUxvYWRMYXRlbmN5IixDUkVBVElWRV9MT0FEX0xBVEVOQ1k6IkNyZWF0aXZlTG9hZExhdGVuY3kifX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHIoZSx0KXt2YXIgbj1pKHQpLHI9byh0KSx1PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz1hKHUudG9wLHUuYm90dG9tLG4pLGw9YSh1LmxlZnQsdS5yaWdodCxyKSxzPWMqbCxmPSh1LmJvdHRvbS11LnRvcCkqKHUucmlnaHQtdS5sZWZ0KTtyZXR1cm4gTWF0aC5taW4oMSxNYXRoLm1heCgwLHMvZikpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUuaW5uZXJIZWlnaHR8fGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodH1mdW5jdGlvbiBvKGUpe3JldHVybiBlLmlubmVyV2lkdGh8fGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRofWZ1bmN0aW9uIGEoZSx0LG4pe3ZhciByPTA7cmV0dXJuIHI9ZT4wP24tZTp0PjA/TWF0aC5taW4odCxuKTowLE1hdGgubWluKHIsdC1lKX1mdW5jdGlvbiB1KGUpe3ZhciB0PW51bGwsbj1mdW5jdGlvbiByKCl7ZSgpfHwodD1zZXRUaW1lb3V0KHIsMTAwKSl9O3JldHVybiBuKCkse2NsZWFyOmZ1bmN0aW9uKCl7dCYmY2xlYXJUaW1lb3V0KHQpfX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscil7bih0aGlzLGUpLHRoaXMud2luZG93PXJ8fHdpbmRvdyx0aGlzLmVsZW09dH1yZXR1cm4gYyhlLFt7a2V5OiJnZXRQZXJjZW50SW5WaWV3Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VG9wV2luZG93KCk7aWYoZSl7aWYodGhpcy53aW5kb3c9PT1lKXJldHVybiByKHRoaXMuZWxlbSxlKTtpZih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQpcmV0dXJuIHIodGhpcy53aW5kb3cuZnJhbWVFbGVtZW50LGUpfWVsc2UgaWYodGhpcy53aW5kb3cuJHNmKXRyeXt2YXIgdD10aGlzLndpbmRvdy4kc2YuZXh0LmluVmlld1BlcmNlbnRhZ2UoKXx8MDtyZXR1cm4gdC8xMDB9Y2F0Y2gobil7fXJldHVybi0xfX0se2tleToiZ2V0VG9wV2luZG93Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPW51bGw7dHJ5e2lmKCF0aGlzLndpbmRvdy50b3AuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJjcm9zcy1kb21haW4gZXhjZXB0aW9uIik7ZT10aGlzLndpbmRvdy50b3B9Y2F0Y2godCl7fXJldHVybiBlfX0se2tleToib25WaWV3VGhyZXNob2xkIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLG89bnVsbDtyZXR1cm4gdShmdW5jdGlvbigpe2lmKGkuZ2V0UGVyY2VudEluVmlldygpPj1lJiZpLmdldFBlcmNlbnRJblZpZXcoKTw9dCl7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7aWYobnVsbD09PW8pbz1hO2Vsc2UgaWYoYS1vPm4pcmV0dXJuIHIoKSwhMH1lbHNlIG89bnVsbH0pfX0se2tleToib25WaWV3Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub25WaWV3VGhyZXNob2xkKGUsMSx0LG4pfX0se2tleToib25IaWRlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub25WaWV3VGhyZXNob2xkKDAsZSx0LG4pfX0se2tleToiZ2V0VmVydGljYWxQb3NpdGlvbk9uUGFnZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0tMSx0PXRoaXMuZ2V0VG9wV2luZG93KCk7aWYodCl7aWYodGhpcy53aW5kb3c9PT10KXt2YXIgbj10aGlzLmVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLHI9aSh0KSxvPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7ZT1NYXRoLm1heChNYXRoLm1pbihuLyhyLW8pLDEpLDApfWVsc2UgaWYodGhpcy53aW5kb3cuZnJhbWVFbGVtZW50KXt2YXIgbj10aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLHI9aSh0KSxvPXRoaXMud2luZG93LmZyYW1lRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7ZT1NYXRoLm1heChNYXRoLm1pbihuLyhyLW8pLDEpLDApfX1lbHNlIGlmKHRoaXMud2luZG93LiRzZil0cnl7ZT1NYXRoLm1heChNYXRoLm1pbigkc2YuZXh0Lmdlb20oKS5zZWxmLnQvKCRzZi5leHQuZ2VvbSgpLndpbi5oLSRzZi5leHQuZ2VvbSgpLnNlbGYuaCksMSksMCl9Y2F0Y2goYSl7fXJldHVybiBlfX1dKSxlfSgpO3RbImRlZmF1bHQiXT1sfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiB2KGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6dihpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oMTApLHM9cihsKSxmPSJkYS1jeC1tZXRyaWNzIixkPSJDb29yZGluYXRlQ2xpY2siLHA9Impzb24iLGg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4pe2kodGhpcyx0KTt2YXIgcj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlLGYpKTtyZXR1cm4gci5pbXByZXNzaW9uSWQ9bixyfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJsb2dDbGljayIsdmFsdWU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXt9LG89e2N4YzplLnBhZ2VYLGN5YzplLnBhZ2VZLGNwdzpuLGNwaDpyfTtpLmVuPWQsaS50eXBlPXAsaS5pPXRoaXMuaW1wcmVzc2lvbklkO3RyeXtpLmV2PWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvKSl9Y2F0Y2goYSl7aS5zdHJpbmdpZnlOb3RBdmFpbGFibGU9MX1jKHQucHJvdG90eXBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQucHJvdG90eXBlKSwiZmlyZVBpeGVsIix0aGlzKS5jYWxsKHRoaXMsaSl9fV0pLHR9KHNbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPWh9XSk7O3dpbmRvdy5wZGFnU2NvcGUgPSB3aW5kb3cucGRhZ1Njb3BlIHx8IHt9O3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJID0gbmV3IFBkYUNsaWVudEFQSS5kZWZhdWx0KHsiYmFzZVVybCI6Imh0dHBzOi8vcy5hbWF6b24tYWRzeXN0ZW0uY29tIiwic2hhemFtSWQiOiI3OTI1ODUwIiwidGVtcGxhdGVOYW1lIjoiVEVUUklTX01PQklMRV9NWVNUSVFVRSIsInRlbXBsYXRlTWFqb3JWZXJzaW9uIjoiMSIsInRlbXBsYXRlTWlub3JWZXJzaW9uIjoiOCIsImxvY2FsZSI6IlVTIiwiYWRTZXJ2ZXIiOiJjb3JuZXJzdG9uZSIsImFkSWQiOiI0NTMzMDc3ODEwNzAxIiwiY3JlYXRpdmVJZCI6IjE4NDkwODExNjA3MDEiLCJpbXByZXNzaW9uSWQiOiJpcmJDbjVxangxWVZkbFhqaTg1VGdnIiwiYWRTZXNzaW9uSWQiOiIwMTAxYjBkZDllOWVkNmU0ZDE0ZWU1OTJkMTQzMDcyYzUwNWE1M2UxZTNlNzZhNjUzYWI2NjNmYTAxMGZlYzk5MDM4NiJ9KTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS50cmFja0xvYWRMYXRlbmN5KCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYXR0YWNoR2xvYmFscygpO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLmFkZEVycm9yTGlzdGVuZXIoKTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+PGRpdiBpZD1hZD48ZGl2IGNsYXNzPSJtb2JpbGVNeXN0aXF1ZSB0ZW1wbGF0ZUNvbnRhaW5lciIgZGF0YS1jcmVhdGl2ZS1pZD0iMTg0OTA4MTE2MDcwMSIgZGF0YS1hZC1pZD0iNDUzMzA3NzgxMDcwMSIgZGF0YS1yZWFjdHJvb3Q9IiIgZGF0YS1yZWFjdGlkPSIxIiBkYXRhLXJlYWN0LWNoZWNrc3VtPSI2NzU4MjM4NjQiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIHRlbXBsYXRlQ29udGFpbmVyX19saW5rIiBocmVmPSJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FvcTJ3cC1hbzhkV0ZYWlY0NHZPVTRJQUFBRmhtZUU0MGdFQUFBR1FBUnQxd2tjL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMTUwODc2NzQ4Mz9hYXhpdGs9c3NHNFdGeVhwdS5kaFhFeDEuT0c5dyIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjIiPjwvYT48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEyNXB4O2JvcmRlcjoxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNGRkZGRkY7IiBkYXRhLXJlYWN0aWQ9IjMiPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0id2lkdGg6MTYwcHg7aGVpZ2h0OjEwMCU7cGFkZGluZzo1cHggMTBweCA1cHggMTBweDtmbGV4OjAgMCAxMjVweDsiIGRhdGEtcmVhY3RpZD0iNCI+PGRpdiBjbGFzcz0iYXNpbkltYWdlIiBkYXRhLXJlYWN0aWQ9IjUiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIGFzaW5JbWFnZSIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Rb3Eyd3AtYW84ZFdGWFpWNDR2T1U0SUFBQUZobWVFNDBnRUFBQUdRQVJ0MXdrYy9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPXNzRzRXRnlYcHUuZGhYRXgxLk9HOXciIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSI2Ij48ZGl2IGNsYXNzPSJpbWFnZUNvbnRhaW5lciIgZGF0YS1yZWFjdGlkPSI3Ij48aW1nIGNsYXNzPSJtZWRpYUNlbnRyYWxJbWFnZSBpbWFnZUNvbnRhaW5lcl9faW1hZ2UiIHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTFWelNkanJpT0wuX0FDX1NYMTYwXy5qcGciIGFsdD0iTGVhcm4gUy5RLkwuIGZyb20gdGhlIGV4cGVydHMgaW4gdGhlIHByZW1pZXIgZ3VpZGUgZm9yIGJlZ2lubmVycyIgZGF0YS1yZWFjdGlkPSI4Ii8+PC9kaXY+PC9hPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0id2lkdGg6MTAwJTtiYWNrZ3JvdW5kOiNGRkZGRkY7YmFja2dyb3VuZDotd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDI1NSwyNTUsMjU1LDEpLCByZ2JhKDI1NSwyNTUsMjU1LDApIDI1JSwgcmdiYSgyNTUsMjU1LDI1NSwwKSksIC13ZWJraXQtbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpO2JhY2tncm91bmQ6LW8tbGluZWFyLWdyYWRpZW50KHJpZ2h0LCByZ2JhKDI1NSwyNTUsMjU1LDEpLCByZ2JhKDI1NSwyNTUsMjU1LDApIDI1JSwgcmdiYSgyNTUsMjU1LDI1NSwwKSksIC1vLWxpbmVhci1ncmFkaWVudCgjRkZGRkZGLCAjRUJFQkVCKTtiYWNrZ3JvdW5kOi1tb3otbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI1NSwyNTUsMjU1LDEpLCByZ2JhKDI1NSwyNTUsMjU1LDApIDI1JSwgcmdiYSgyNTUsMjU1LDI1NSwwKSksIGxpbmVhci1ncmFkaWVudCgjRkZGRkZGLCAjRUJFQkVCKTsiIGRhdGEtcmVhY3RpZD0iOSI+PGRpdiBjbGFzcz0iYmxvY2sgYmxvY2stLWp1c3RpZnktY2VudGVyIGJsb2NrLS1kaXJlY3Rpb24tY29sdW1uIiBzdHlsZT0id2lkdGg6MTAwJTtwYWRkaW5nOjAgMTBweCAwIDA7IiBkYXRhLXJlYWN0aWQ9IjEwIj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDAgNXB4IDA7IiBkYXRhLXJlYWN0aWQ9IjExIj48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayB0ZXh0TGluayB0ZXh0TGluay0tZGlzcGxheUFzVGV4dCIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Rb3Eyd3AtYW84ZFdGWFpWNDR2T1U0SUFBQUZobWVFNDBnRUFBQUdRQVJ0MXdrYy9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPXNzRzRXRnlYcHUuZGhYRXgxLk9HOXciIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSIxMiI+PGRpdiBzdHlsZT0iZm9udC1zaXplOjE4cHg7Zm9udC1zdHlsZTppdGFsaWM7Y29sb3I6IzU1NTtsaW5lLWhlaWdodDoyMHB4OyIgY2xhc3M9InRleHRDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iMTMiPjxzcGFuIGNsYXNzPSJ0ZXh0Q29udGFpbmVyX190ZXh0IiBkYXRhLXJlYWN0aWQ9IjE0Ij5Ucm91YmxlIGxldmVyYWdpbmcgeW91ciBkYXRhPzwvc3Bhbj48L2Rpdj48L2E+PC9kaXY+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJtYXJnaW46MCAwIDVweCAwOyIgZGF0YS1yZWFjdGlkPSIxNSI+PGEgY2xhc3M9ImNsaWNrdGhyb3VnaExpbmsgdGV4dExpbmsiIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW9xMndwLWFvOGRXRlhaVjQ0dk9VNElBQUFGaG1lRTQwZ0VBQUFHUUFSdDF3a2MvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8xNTA4NzY3NDgzP2FheGl0az1zc0c0V0Z5WHB1LmRoWEV4MS5PRzl3IiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iMTYiPjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OjYwMDsiIGNsYXNzPSJ0ZXh0Q29udGFpbmVyIGgtZWxsaXBzaXMiIGRhdGEtcmVhY3RpZD0iMTciPjxzcGFuIGNsYXNzPSJ0ZXh0Q29udGFpbmVyX190ZXh0IiBkYXRhLXJlYWN0aWQ9IjE4Ij5MZWFybiBTLlEuTC4gZnJvbSB0aGUgZXhwZXJ0cyBpbiB0aGUgcHJlbWllciBndWlkZSBmb3IgYmVnaW5uZXJzPC9zcGFuPjwvZGl2PjwvYT48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayBibG9jay0taW5saW5lICIgc3R5bGU9IndoaXRlLXNwYWNlOm5vcm1hbDsiIGRhdGEtcmVhY3RpZD0iMTkiPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgNXB4IDAgMDsiIGRhdGEtcmVhY3RpZD0iMjAiPjxzcGFuIGNsYXNzPSJwcmljZUJveCIgZGF0YS1yZWFjdGlkPSIyMSI+PHNwYW4gY2xhc3M9InByaWNlIHByaWNlQm94X19idXkiIHN0eWxlPSJmb250LXNpemU6MTVweDsiIGRhdGEtcmVhY3RpZD0iMjIiPjxzcGFuIGNsYXNzPSJwcmljZV9fY3VycmVuY3kiIGRhdGEtcmVhY3RpZD0iMjMiPiQ8L3NwYW4+PHNwYW4gY2xhc3M9InByaWNlX19hbW91bnQiIGRhdGEtcmVhY3RpZD0iMjQiPjE0Ljk5PC9zcGFuPjwvc3Bhbj48IS0tIHJlYWN0LXRleHQ6IDI1IC0tPjwhLS0gL3JlYWN0LXRleHQgLS0+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZTsiIGRhdGEtcmVhY3RpZD0iMjYiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIHByaW1lTG9nbyIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9kYS9jcmVhdGl2ZXMvcHJpbWUtMngtMjAxNzA2MTQucG5nIiB3aWR0aD0iNDMiIGhlaWdodD0iMTIiIGFsdD0iUHJpbWUiIGRhdGEtcmVhY3RpZD0iMjciLz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDEwcHggMCAxMHB4O2hlaWdodDoxMjNweDtvcGFjaXR5OjAuNjQ7ZmxleDowIDAgOXB4OyIgZGF0YS1yZWFjdGlkPSIyOCI+PGRpdiBjbGFzcz0iaW1hZ2VDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iMjkiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIGltYWdlQ29udGFpbmVyX19pbWFnZSIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9BbWF6b25CcmFuZFN0b3Jlc1BsYXRmb3JtL2JsYWNrX2Fycm93LnBuZyIgYWx0PSJHcmF5IEFycm93IiByb2xlPSJwcmVzZW50YXRpb24iIGRhdGEtcmVhY3RpZD0iMzAiLz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC0xNS4zLjIubWluLmpzIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC1kb20tMTUuMy4yLm1pbi5qcyI+PC9zY3JpcHQ+PHNjcmlwdD52YXIgTGlicmFyeT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgbz1uW3JdPXtleHBvcnRzOnt9LGlkOnIsbG9hZGVkOiExfTtyZXR1cm4gZVtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyx0KSxvLmxvYWRlZD0hMCxvLmV4cG9ydHN9dmFyIG49e307cmV0dXJuIHQubT1lLHQuYz1uLHQucD0iIix0KDApfShbZnVuY3Rpb24oZSx0LG4pe24oMSksZS5leHBvcnRzPW4oMTAwKX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24mJihPYmplY3QuYXNzaWduPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIG49T2JqZWN0KGUpLHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgbz1hcmd1bWVudHNbcl07aWYobnVsbCE9bylmb3IodmFyIGkgaW4gbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobyxpKSYmKG5baV09b1tpXSl9cmV0dXJuIG59KX0sLGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPVJlYWN0fSwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDYpLGM9cihwKSxmPW4oMjcpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucHJvcHMudXBkYXRlT25SZXNpemUmJnRoaXMubGlzdGVuRm9yUmVzaXplKCl9fSx7a2V5OiJsaXN0ZW5Gb3JSZXNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczsidW5kZWZpbmVkIiE9dHlwZW9mIFNGQ2xpZW50JiZTRkNsaWVudCYmU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/U0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KToidW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50JiZNU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/TVNGQ2xpZW50LnJlZ2lzdGVyQ3VzdG9tTWVzc2FnZUxpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uKCl7ZS5vblJlc2l6ZSgpfSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KX19LHtrZXk6Im9uUmVzaXplIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZm9yY2VVcGRhdGUoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLnJlbmRlcmluZ0NvbnRleHQsdD10aGlzLnByb3BzLnN0cnVjdHVyZSxuPXRoaXMucHJvcHMuY2xhc3NOYW1lKyh0aGlzLnByb3BzLnNreT8iIHNreSI6IiIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3RlbXBsYXRlSWQ6dGhpcy5wcm9wcy50ZW1wbGF0ZUlkLGNsYXNzTmFtZTpuLGhyZWY6ZS5hZExpbmssY2xpY2tVcmxzOmUuY2xpY2tVcmxzLGNyZWF0aXZlSWQ6ZS5jcmVhdGl2ZUlkLGFkSWQ6ZS5hZElkfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3JlbmRlcmluZ0NvbnRleHQ6ZSxibG9jazp0LGNvbXBvbmVudHNNYXA6dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6dGhpcy5wcm9wcy5kb21SZWZzfSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJ0ZW1wbGF0ZUNvbnRhaW5lciIsImJsb2NrIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZW1wbGF0ZSIsaC5wcm9wVHlwZXM9e3JlbmRlcmluZ0NvbnRleHQ6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsc3RydWN0dXJlOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsY2xhc3NOYW1lOnUuUHJvcFR5cGVzLnN0cmluZyxkb21SZWZzOnUuUHJvcFR5cGVzLm9iamVjdCx0ZW1wbGF0ZUlkOnUuUHJvcFR5cGVzLnN0cmluZyx1cGRhdGVPblJlc2l6ZTp1LlByb3BUeXBlcy5ib29sLHNreTp1LlByb3BUeXBlcy5ib29sfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPW4oMjQpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zdGF0ZT17ZmxleGJveDohMH0sbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ub2RlJiZ0aGlzLnNldFN0YXRlKHtmbGV4Ym94OmRbImRlZmF1bHQiXS5zdXBwb3J0LmZsZXhib3goKX0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0odGhpcy5wcm9wcy5jbGFzc05hbWU/dGhpcy5wcm9wcy5jbGFzc05hbWUrIiAiOiIiKSsidGVtcGxhdGVDb250YWluZXIiKyh0aGlzLnN0YXRlLmZsZXhib3g/IiI6IiBoLW5vRmxleGJveCIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxjbGFzc05hbWU6dCxpZDp0aGlzLnByb3BzLnRlbXBsYXRlSWQsImRhdGEtY3JlYXRpdmUtaWQiOnRoaXMucHJvcHMuY3JlYXRpdmVJZCwiZGF0YS1hZC1pZCI6dGhpcy5wcm9wcy5hZElkLHJlZjpmdW5jdGlvbih0KXtlLm5vZGU9dH19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJ0ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayJ9fSksdGhpcy5wcm9wcy5jaGlsZHJlbil9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bIkNsaWNrdGhyb3VnaExpbmsiXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1oLGguZGlzcGxheU5hbWU9IlRlbXBsYXRlQ29udGFpbmVyICIsaC5wcm9wVHlwZXM9e3N0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxjbGFzc05hbWU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRlbXBsYXRlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGhyZWY6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKS5pc1JlcXVpcmVkLGNyZWF0aXZlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFkSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbD1uKDMpLHA9cihsKSxjPW4oOCksZj1yKGMpLGQ9big5KSxoPXIoZCkseT1uKDEyKSxtPXIoeSksYj1uKDIzKSx2PXIoYiksZz1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGIuQ09VUE9OX1RPS0VOX01BQ1JPLCgwLHZbImRlZmF1bHQiXSkoKSl9LF89ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJoYW5kbGVPbkNsaWNrIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnByb3BzLG49dC5jbGlja1RyYWNrZXJVcmxzLHI9dC51cmwsbz10LmNhc2NhZGluZ0ludGVudCxpPXQuaXNPZmZzaXRlOygwLGZbImRlZmF1bHQiXSkobiksKDAsbVsiZGVmYXVsdCJdKShnKHIpLGksbykmJmUucHJldmVudERlZmF1bHQoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5wcm9wcyxuPXQudXJsLHI9dC5pc09mZnNpdGUsbz10LmNoaWxkcmVuLGk9dC5hbmNob3JQcm9wcyxhPW51bGw7dGhpcy5jb250ZXh0LmlzU3RhdGljSHRtbCYmdGhpcy5wcm9wcy5jbGlja1RyYWNrZXJVcmxzJiYoYT10aGlzLnByb3BzLmNsaWNrVHJhY2tlclVybHMuam9pbigifCIpKTt2YXIgdT0iY2xpY2t0aHJvdWdoTGluayIrKGkuY2xhc3NOYW1lPyIgIitpLmNsYXNzTmFtZToiIik7cmV0dXJuIHBbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJhIixzKHt9LGkse2NsYXNzTmFtZTp1LGhyZWY6ZyhuKSx0YXJnZXQ6KDAsaFsiZGVmYXVsdCJdKShuLHIpLG9uQ2xpY2s6ZnVuY3Rpb24odCl7cmV0dXJuIGUuaGFuZGxlT25DbGljayh0KX0sb25Nb3VzZURvd246ZnVuY3Rpb24oKXtyZXR1cm4gZS5mb3JjZVVwZGF0ZSgpfSwiZGF0YS1jbGlja1RyYWNrZXJVcmxzIjphLHJlbDoibm9mb2xsb3cifSksbyl9fV0pLHR9KGwuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09XyxfLmRpc3BsYXlOYW1lPSJDbGlja3Rocm91Z2hMaW5rIixfLnByb3BUeXBlcz17dXJsOmwuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNhc2NhZGluZ0ludGVudDpsLlByb3BUeXBlcy5zdHJpbmcsaXNPZmZzaXRlOmwuUHJvcFR5cGVzLmJvb2wsY2xpY2tUcmFja2VyVXJsczpsLlByb3BUeXBlcy5hcnJheU9mKGwuUHJvcFR5cGVzLnN0cmluZyksYW5jaG9yUHJvcHM6bC5Qcm9wVHlwZXMub2JqZWN0LGNoaWxkcmVuOmwuUHJvcFR5cGVzLm5vZGV9LF8uY29udGV4dFR5cGVzPXtpc1N0YXRpY0h0bWw6bC5Qcm9wVHlwZXMuYm9vbH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG89MDtlPm87bysrKXRbb109YXJndW1lbnRzW29dO2Zvcih2YXIgaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBhPXRbaV07aWYoYSlpZigic3RyaW5nIj09dHlwZW9mIGEpcihhKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpcmUgcGl4ZWw6ICInK0pTT04uc3RyaW5naWZ5KGEpKyciIGlzIG5vdCBhIHN0cmluZyEnKTtuLmFwcGx5KHRoaXMsYSl9fX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZSYmKChuZXcgSW1hZ2UpLnNyYz1lKX07dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7dmFyIG49dHx8ISgwLGFbImRlZmF1bHQiXSkoZSk7cmV0dXJuIG4/cy5JTl9ORVdfV0lORE9XOnMuSU5fU0FNRV9XSU5ET1d9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1vO3ZhciBpPW4oMTApLGE9cihpKSxzPW4oMTEpfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUpe3JldHVybiByLnRlc3QoZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1uO3ZhciByPS9eKChodHRwcz86KT9cL1wvKSguKlwuKT9hbWF6b25cLi99LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj10LklOX1NBTUVfV0lORE9XPSJfdG9wIixyPXQuSU5fTkVXX1dJTkRPVz0iX2JsYW5rIjt0WyJkZWZhdWx0Il09e0lOX05FV19XSU5ET1c6cixJTl9TQU1FX1dJTkRPVzpufX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0LG4pe2lmKCF0JiZtWyJkZWZhdWx0Il0mJkMmJnBbImRlZmF1bHQiXS5tYXNoLmlzQVVJQXZhaWxhYmxlKCkmJigwLFRbImRlZmF1bHQiXSkoZSx0KT09PVAuSU5fTkVXX1dJTkRPVylwWyJkZWZhdWx0Il0ubWFzaC5vcGVuSW5FeHRlcm5hbEJyb3dzZXIuZXhlY3V0ZSh7dXJsOmV9KTtlbHNlIGlmKCF0fHwhTXx8dlsiZGVmYXVsdCJdJiYhUyhbMiwyLDEwXSl8fF9bImRlZmF1bHQiXSYmIVMoWzUsNSwxMzVdKSl7aWYoIXR8fCFJKXJldHVybiExO2ZbImRlZmF1bHQiXS5vcGVuKGUpfWVsc2UgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcihufHxlKTtyZXR1cm4hMH1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuKDAsVFsiZGVmYXVsdCJdKShlLHQpPT09UC5JTl9TQU1FX1dJTkRPV31mdW5jdGlvbiBhKGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3JldHVybiB1WyJkZWZhdWx0Il0ub3BlbihlLCgwLFRbImRlZmF1bHQiXSkoZSx0KSl9LGE9ZnVuY3Rpb24oKXtyZXR1cm4gbyhlLHQsbil9LHM9ZnVuY3Rpb24oKXtyZXR1cm4gYSgpfHxyKCl9O3JldHVybiBpKGUsdCk/KHNldFRpbWVvdXQocyxSKSwhMCk6YSgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0WyJkZWZhdWx0Il09YTt2YXIgcz1uKDEzKSx1PXIocyksbD1uKDE0KSxwPXIobCksYz1uKDE1KSxmPXIoYyksZD1uKDE2KSxoPXIoZCkseT1uKDE3KSxtPXIoeSksYj1uKDE4KSx2PXIoYiksZz1uKDIxKSxfPXIoZyksUD1uKDExKSxrPW4oOSksVD1yKGspLHg9bigyMiksTz1yKHgpLHc9ISFwWyJkZWZhdWx0Il0sQz13JiYidW5kZWZpbmVkIiE9dHlwZW9mIHBbImRlZmF1bHQiXS5tYXNoLGo9ISFoWyJkZWZhdWx0Il0sTT1qJiYiZnVuY3Rpb24iPT10eXBlb2YgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcixFPSEhZlsiZGVmYXVsdCJdLEk9RSYmImZ1bmN0aW9uIj09dHlwZW9mIGZbImRlZmF1bHQiXS5vcGVuLE49aiYmZnVuY3Rpb24oKXt2YXIgZT1oWyJkZWZhdWx0Il0uZ2V0U0RLVmVyc2lvbigpLm1hdGNoKC8oXGQrKVwuKFxkKykuKFxkKykkLyk7cmV0dXJuIGU/W2VbMV0sZVsyXSxlWzNdXTp2b2lkIDB9KCksUz1mdW5jdGlvbihlKXtyZXR1cm4gTiYmKDAsT1siZGVmYXVsdCJdKShOLGUpPj0wfSxSPTE1MH0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50O3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBtcmFpZCYmbXJhaWQ7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGFtYXpvbiYmYW1hem9uO3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxpPW4oMTQpLGE9cihpKSxzPWZ1bmN0aW9uKCl7aWYoIWFbImRlZmF1bHQiXSlyZXR1cm4hMTt2YXIgZT1mdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYVsiZGVmYXVsdCJdLmdldERvY3VtZW50Q29va2llKCkpLnNwbGl0KCI7IikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10LnNwbGl0KCI9Iik7biYmbi5sZW5ndGg+PTImJihlW25bMF0udHJpbSgpXT1uWzFdLnRyaW0oKSl9KSx7djovXCJhdlwiOlwiKFsuXGRdKilcIi9pLnRlc3QoZVsiYW16bi1hcHAtY3R4dCJdKX19KCk7cmV0dXJuIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOm8oZSkpP2Uudjp2b2lkIDB9KCk7dFsiZGVmYXVsdCJdPXN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L2lQaG9uZXxpUGFkfGlQb2QvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDE0KSxpPXIobyksYT1uKDIwKSxzPXIoYSksdT1pWyJkZWZhdWx0Il0mJmlbImRlZmF1bHQiXS5nZXRVc2VyQWdlbnRJbmZvKCl8fHNbImRlZmF1bHQiXSYmc1siZGVmYXVsdCJdLnVzZXJBZ2VudDt0WyJkZWZhdWx0Il09dX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3I7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L0FuZHJvaWQvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2Zvcih2YXIgbj1NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCkscj0wO24+cjtyKyspe3ZhciBvPWVbcl0saT10W3JdO2lmKG8+aSlyZXR1cm4gMTtpZihpPm8pcmV0dXJuLTF9cmV0dXJuIDB9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiJBTVMiO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBidG9hP2J0b2EoRGF0ZS5ub3coKSsoIjsiK2UpKToiIn1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW47dC5DT1VQT05fVE9LRU5fTUFDUk89IlZQQ19DU19NQUNSTyJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX12YXIgbz1uKDI1KSxpPXIobyksYT1uKDI2KSxzPXIoYSksdT0vXi4qXC9cL1teXC9dKy87ZS5leHBvcnRzPXtzdXBwb3J0OntmbGV4Ym94OmZ1bmN0aW9uKCl7cmV0dXJuIE1vZGVybml6ciYmKE1vZGVybml6ci5mbGV4Ym94fHxNb2Rlcm5penIuZmxleGJveGxlZ2FjeXx8TW9kZXJuaXpyLmZsZXhib3h0d2VlbmVyKX19LGdldDpmdW5jdGlvbihlLHQpe3JldHVybiB0LnNwbGl0KCIuIikucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5tYXRjaCgvKC4qKVxbKFxkKilcXS8pLHI9biYmblsxXSxvPW4mJm5bMl07cmV0dXJuIHImJm8/ZVtyXVtwYXJzZUludChvLDEwKV06ZVt0XX0sZSl9LGdldE1lZGlhQ2VudHJhbEltYWdlU3JjOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZTt2YXIgbz1pWyJkZWZhdWx0Il0udXJscy5NRURJQV9DRU5UUkFMX1dXLGE9ZS5yZXBsYWNlKHUsIiIpLGw9bysoMD09PWEuaW5kZXhPZigiLyIpPyIiOiIvIikrYSxwPXt9LGM9cj8yOjE7cmV0dXJuIHQuYWMmJihwLkFDPSEwKSx0LnN4JiYocC5TWD10LnN4KmMpLHQuc3kmJihwLlNZPXQuc3kqYyksdC5xbCYmKHAuUUw9dC5xbCksdC5mbSYmKHAuRk09dC5mbSksc1siZGVmYXVsdCJdLnNldFRhZ3MobCxwLFsiQUMiLCJTWCIsIlNZIiwiRk0iLCJRTCJdLG4pfX19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17dXJsczp7TUVESUFfQ0VOVFJBTF9XVzoiaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20iLE1FRElBX0NFTlRSQUxfQ046Imh0dHBzOi8vaW1hZ2VzLWNuLnNzbC1pbWFnZXMtYW1hem9uLmNvbSJ9fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtzZXRUYWdzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPS9cLl8oW15cLl0rKSg/PV9cLlx3KyQpLyxpPW8uZXhlYyhlKSxhPWk/aVsxXS5zcGxpdCgiXyIpOltdLHM9T2JqZWN0LmFzc2lnbih7fSx0KSx1PVtdO3ImJmEuZm9yRWFjaChmdW5jdGlvbihlKXtpZigiIiE9PWUpe3ZhciB0LG49ZS5zdWJzdHJpbmcoMCwyKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNbbl0/KHNbbl09PT0hMSYmKHNbbl09bnVsbCksbj1udWxsKTp0PWUuc3Vic3RyaW5nKDIsZS5sZW5ndGgpLG51bGwhPT1uJiZ1LnB1c2gobit0KX19KSxuLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9c1tlXTt0JiZ1LnB1c2goZSsodD09PSEwPyIiOnQpKX0pO3ZhciBsPS0xO3UuZm9yRWFjaChmdW5jdGlvbihlLHQpeyJDUiI9PT1lLnN1YnN0cmluZygwLDIpJiYobD10KX0pO3ZhciBwPSExO2lmKGw+PTApe3ZhciBjPXUuc3BsaWNlKGwsMSk7dS51bnNoaWZ0KGNbMF0pLHA9ITB9dmFyIGY9dS5pbmRleE9mKCJBQyIpO2lmKGY+MCl7dmFyIGQ9dS5zcGxpY2UoZiwxKTtwP3Uuc3BsaWNlKDEsMCxkWzBdKTp1LnVuc2hpZnQoZFswXSl9cmV0dXJuIHUubGVuZ3RoPjAmJihlPWEubGVuZ3RoPjA/ZS5yZXBsYWNlKG8sIi5fIit1LmpvaW4oIl8iKSk6ZS5yZXBsYWNlKC9cLig/PVx3KyQpLywiLl8iK3Uuam9pbigiXyIpKyJfLiIpKSxlfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigyNCksYz1yKHApLGY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtjbG9hazpuLmV4dHJhY3RNZXRhZGF0YShlLmJsb2NrLCJjbG9hayIpfSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNldFN0YXRlKHtjbG9hazohMX0pfX0se2tleToiZ2V0Q2xhc3NOYW1lIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJibG9jayIsdD0iIjt0aGlzLnByb3BzLmJsb2NrLmNzc0NsYXNzZXMmJih0PXRoaXMucHJvcHMuYmxvY2suY3NzQ2xhc3Nlcy5qb2luKCIgIikpLCIiIT09dCYmKGUrPSIgIit0KTt2YXIgbj10aGlzLnByb3BzLmJsb2NrLmxheW91dDtyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj1uW3RdOyJqdXN0aWZ5Q29udGVudCI9PT10JiYiZmxleC1zdGFydCIhPT1yP2UrPSIgYmxvY2stLWp1c3RpZnktIityOiJhbGlnbkl0ZW1zIj09PXQmJiJzdHJldGNoIiE9PXI/ZSs9IiBibG9jay0tYWxpZ24tIityOiJmbGV4RGlyZWN0aW9uIj09PXQmJiJyb3ciIT09ciYmKGUrPSIgYmxvY2stLWRpcmVjdGlvbi0iK3IpfSksdGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kJiZ0aGlzLnByb3BzLmJsb2NrLmJhY2tncm91bmQuaWQmJihlKz0iIGJsb2NrLS1iYWNrZ3JvdW5kIiksdGhpcy5zdGF0ZS5jbG9hayYmKGUrPSIgaC1jbG9hayIpLGV9fSx7a2V5OiJwcmV2ZW50UHJvcGVydHkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJiIiIT09dD8ianVzdGlmeUNvbnRlbnQiPT09ZXx8ImFsaWduSXRlbXMiPT09ZXx8ImZsZXhEaXJlY3Rpb24iPT09ZTohMH19LHtrZXk6ImdldEJsb2NrTGF5b3V0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnByb3BzLmJsb2NrLmxheW91dCxuPXt9O3JldHVybiB0JiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBvPXRbcl07ZS5wcmV2ZW50UHJvcGVydHkocixvKXx8KG5bcl09byl9KSxufX0se2tleToiZ2V0QmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmJsb2NrLnN0eWxlLHQ9e307cmV0dXJuIGUmJmUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLnZhbHVlOyJ1bmRlZmluZWQiIT10eXBlb2YgdFtlLm5hbWVdJiYobj10W2UubmFtZV0rIjsiK2UubmFtZSsiOiIrbiksdFtlLm5hbWVdPW59KSx0fX0se2tleToiZ2V0UHJvcFZhbHVlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiJwYXRoIj09PXQudHlwZT9jWyJkZWZhdWx0Il0uZ2V0KGUsdC52YWx1ZSk6ImNvbnN0YW50Ij09PXQudHlwZT90LnZhbHVlOm51bGx9fSx7a2V5OiJnZXRDb21wb25lbnRQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXt9O3JldHVybiBlLnByb3BzJiZlLnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7bltlLm5hbWVdPXQuZ2V0UHJvcFZhbHVlKHQucHJvcHMucmVuZGVyaW5nQ29udGV4dCxlKX0pLG59fSx7a2V5OiJleHRyYWN0TWV0YWRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKG49ZS52YWx1ZSl9KSxufX0se2tleToic2V0UmVmIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmV4dHJhY3RNZXRhZGF0YSh0aGlzLnByb3BzLmJsb2NrLCJyZWYiKTt0JiZ0aGlzLnByb3BzLmRvbVJlZnMmJih0aGlzLnByb3BzLmRvbVJlZnNbdF09ZSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImhpZGUiKSxyPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImlkIiksbz12b2lkIDAsaT12b2lkIDAsYT12b2lkIDAscz12b2lkIDAsdT12b2lkIDAscD12b2lkIDAsYz12b2lkIDA7aWYoIW4pe289dGhpcy5nZXRDbGFzc05hbWUoKTt2YXIgZj10aGlzLmdldEJsb2NrTGF5b3V0KCksZD10aGlzLmdldEJsb2NrU3R5bGUoKTtpPU9iamVjdC5hc3NpZ24oe30sZixkKSxhPVtdO3ZhciBoPXRoaXMucHJvcHMuYmxvY2suY2hpbGRyZW47aCYmaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2EucHVzaChsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCh0LHtyZW5kZXJpbmdDb250ZXh0OmUucHJvcHMucmVuZGVyaW5nQ29udGV4dCxibG9jazpuLGNvbXBvbmVudHNNYXA6ZS5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6ZS5wcm9wcy5kb21SZWZzLGtleTpuLmlkfSkpfSk7dmFyIHk9dGhpcy5wcm9wcy5ibG9jay5jb21wb25lbnQ7eSYmKHU9dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwW3kuaWRdLHM9dGhpcy5nZXRDb21wb25lbnRQcm9wcyh5KSk7dmFyIG09dGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kO20mJihjPXRoaXMucHJvcHMuY29tcG9uZW50c01hcFttLmlkXSxwPXRoaXMuZ2V0Q29tcG9uZW50UHJvcHMobSkpfXJldHVybiFuJiZsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7aWQ6cixjbGFzc05hbWU6byxzdHlsZTppLHJlZjpmdW5jdGlvbih0KXtlLnNldFJlZih0KX19LGMmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImJsb2NrX19iYWNrZ3JvdW5kIn0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoYyxwKSksYS5sZW5ndGg+MD9hOnUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHUscykpfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iQmxvY2siLGYucHJvcFR5cGVzPXtyZW5kZXJpbmdDb250ZXh0OnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGJsb2NrOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsZG9tUmVmczp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89MTk5LGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm1vZGVsPXQsdGhpcy5ibG9ja3NNYXA9e30sdGhpcy5fYnVpbGRCbG9ja3NNYXAoKX1yZXR1cm4gcihlLFt7a2V5OiJfYnVpbGRCbG9ja3NNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9W10sdD17fTtlLnB1c2godGhpcy5tb2RlbCk7Zm9yKHZhciBuPTA7ZS5sZW5ndGg+MDspe3ZhciByPWUuc2hpZnQoKSxpPXRoaXMuX2dldFJlZklkKHIpO2lmKCIiIT09aSYmKHRoaXMuYmxvY2tzTWFwW2ldPXIpLHRbci5pZF18fCh0W3IuaWRdPSEwLGU9ZS5jb25jYXQoci5jaGlsZHJlbnx8W10pKSxuKyssbj5vKWJyZWFrfX19LHtrZXk6Il9nZXRSZWZJZCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7InJlZiI9PT1lLm5hbWUmJih0PWUudmFsdWUpfSksdH19LHtrZXk6ImhpZGVCbG9jayIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiZuLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ImhpZGUiPT09ZS5uYW1lJiYoZS52YWx1ZT10KX0pfX0se2tleToiYWRkQmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuYmxvY2tzTWFwW2VdO3ImJihyLnN0eWxlPXIuc3R5bGV8fFtdLHIuc3R5bGUucHVzaCh7bmFtZTp0LHZhbHVlOm59KSl9fSx7a2V5OiJhZGRDc3NDbGFzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiYobi5jc3NDbGFzc2VzPW4uY3NzQ2xhc3Nlc3x8W10sbi5jc3NDbGFzc2VzLnB1c2godCkpfX0se2tleToiZ2V0Q29tcG9uZW50UHJvcCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXSxyPW51bGw7cmV0dXJuIG4mJm4uY29tcG9uZW50JiZuLmNvbXBvbmVudC5wcm9wcyYmbi5jb21wb25lbnQucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLm5hbWU9PT10JiYocj1lKX0pLHJ9fSx7a2V5OiJzZXRDb21wb25lbnRQcm9wIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzLmJsb2Nrc01hcFtlXTtpZihvJiZvLmNvbXBvbmVudCl7dmFyIGk9ITE7by5jb21wb25lbnQucHJvcHM9by5jb21wb25lbnQucHJvcHN8fFtdLG8uY29tcG9uZW50LnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKGUudmFsdWU9bixlLnR5cGU9cixpPSEwKX0pLGl8fG8uY29tcG9uZW50LnByb3BzLnB1c2goe25hbWU6dCx2YWx1ZTpuLHR5cGU6cn0pfX19LHtrZXk6InNldENzc0NsYXNzZXMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5ibG9ja3NNYXBbZV07biYmKG4uY3NzQ2xhc3Nlcz1uLmNzc0NsYXNzZXN8fFtdLEFycmF5LmlzQXJyYXkodCk/bi5jc3NDbGFzc2VzPXQ6bi5jc3NDbGFzc2VzLnB1c2godCkpfX1dKSxlfSgpO3RbImRlZmF1bHQiXT1pfSwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM0KSxjPXIocCksZj1uKDM1KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0LGFsaWdubWVudDp0aGlzLnByb3BzLmFsaWdubWVudCxtYXhIZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHR9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7YWRkaXRpb25hbENsYXNzOnRoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzLHBhdGg6dGhpcy5wcm9wcy5wYXRoLHdpZHRoOnRoaXMucHJvcHMud2lkdGgsaGVpZ2h0OnRoaXMucHJvcHMuaGVpZ2h0LHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxxbDp0aGlzLnByb3BzLnFsLHJldGluYTp0aGlzLnByb3BzLnJldGluYSxhYzp0aGlzLnByb3BzLmFjLGZtOnRoaXMucHJvcHMuZm0sbWVyZ2VUYWdzOnRoaXMucHJvcHMubWVyZ2VUYWdzLGFsdDp0aGlzLnByb3BzLmFsdCxzcHJpdGU6dGhpcy5wcm9wcy5zcHJpdGUscm9sZTp0aGlzLnByb3BzLnJvbGUsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pKX19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsiaW1hZ2VDb250YWluZXIiLCJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWgsaC5kaXNwbGF5TmFtZT0iTWVkaWFDZW50cmFsSW1hZ2VDb250YWluZXIiLGgucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyx3aWR0aDp1LlByb3BUeXBlcy5zdHJpbmcsaGVpZ2h0OnUuUHJvcFR5cGVzLnN0cmluZyxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHJldGluYTp1LlByb3BUeXBlcy5ib29sLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLGZtOnUuUHJvcFR5cGVzLnN0cmluZyxtZXJnZVRhZ3M6dS5Qcm9wVHlwZXMuYm9vbCxhbHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHNwcml0ZTp1LlByb3BUeXBlcy5ib29sLHJvbGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRpdGxlOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3Qsb25Mb2FkOnUuUHJvcFR5cGVzLmZ1bmMsbWF4SGVpZ2h0OnUuUHJvcFR5cGVzLm51bWJlcn0saC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJpbWFnZUNvbnRhaW5lciIrKHRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0PyIgaW1hZ2VDb250YWluZXItLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIpO3RoaXMucHJvcHMuYWxpZ25tZW50JiYiIiE9PXRoaXMucHJvcHMuYWxpZ25tZW50JiYoZSs9IiBpbWFnZUNvbnRhaW5lci0tIit0aGlzLnByb3BzLmFsaWdubWVudCk7dmFyIHQ9e307cmV0dXJuIHRoaXMucHJvcHMubWF4SGVpZ2h0JiZPYmplY3QuYXNzaWduKHQse21heEhlaWdodDp0aGlzLnByb3BzLm1heEhlaWdodH0pLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ZSxzdHlsZTp0fSxsWyJkZWZhdWx0Il0uY2xvbmVFbGVtZW50KHRoaXMucHJvcHMuY2hpbGRyZW4se2FkZGl0aW9uYWxDbGFzczoiaW1hZ2VDb250YWluZXJfX2ltYWdlIn0pKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1wLHAuZGlzcGxheU5hbWU9IkltYWdlQ29udGFpbmVyIixwLnByb3BUeXBlcz17ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyxtYXhIZWlnaHQ6dS5Qcm9wVHlwZXMubnVtYmVyfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM2KSxjPShyKHApLG4oMjQpKSxmPXIoYyksZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRJbWFnZVNyYyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGZbImRlZmF1bHQiXS5nZXRNZWRpYUNlbnRyYWxJbWFnZVNyYyhlLHthYzp0aGlzLnByb3BzLmFjLHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxmbTp0aGlzLnByb3BzLmZtLHFsOnRoaXMucHJvcHMucWx9LHRoaXMucHJvcHMubWVyZ2VUYWdzLHRoaXMucHJvcHMucmV0aW5hKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5nZXRJbWFnZVNyYyh0aGlzLnByb3BzLnBhdGgpLG49Im1lZGlhQ2VudHJhbEltYWdlIisodGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiKTtpZih0aGlzLnByb3BzLnNwcml0ZSl7dmFyIHI9T2JqZWN0LmFzc2lnbih7d2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYmFja2dyb3VuZEltYWdlOiJ1cmwoJyIrdCsiJykifSx0aGlzLnByb3BzLnN0eWxlKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTpuLHN0eWxlOnIsdGl0bGU6dGhpcy5wcm9wcy50aXRsZX0pfXJldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiaW1nIix7Y2xhc3NOYW1lOm4sc3JjOnQsd2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYWx0OnRoaXMucHJvcHMuYWx0LHJvbGU6dGhpcy5wcm9wcy5yb2xlLHRpdGxlOnRoaXMucHJvcHMudGl0bGUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxvbkxvYWQ6ZnVuY3Rpb24odCl7ZS5wcm9wcy5vbkxvYWQmJmUucHJvcHMub25Mb2FkKHQudGFyZ2V0KX19KX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9Ik1lZGlhQ2VudHJhbEltYWdlIixkLnByb3BUeXBlcz17YWRkaXRpb25hbENsYXNzOnUuUHJvcFR5cGVzLnN0cmluZyxwYXRoOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHN4OnUuUHJvcFR5cGVzLm51bWJlcixzeTp1LlByb3BUeXBlcy5udW1iZXIscmV0aW5hOnUuUHJvcFR5cGVzLmJvb2wsYWM6dS5Qcm9wVHlwZXMuYm9vbCxxbDp1LlByb3BUeXBlcy5udW1iZXIsZm06dS5Qcm9wVHlwZXMuc3RyaW5nLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGFsdDp1LlByb3BUeXBlcy5zdHJpbmcsc3ByaXRlOnUuUHJvcFR5cGVzLmJvb2wscm9sZTp1LlByb3BUeXBlcy5zdHJpbmcsdGl0bGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxvbkxvYWQ6dS5Qcm9wVHlwZXMuZnVuY30sZC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInJldGluYSBtb2R1bGVzIGV4cGVjdHMgYSBmdW5jdGlvbiBvblJldGluYVN0YXRlQ2hhbmdlIGFjY2VwdGluZyBib29sZWFuIik7aWYod2luZG93Lm1hdGNoTWVkaWEpe3ZhciB0PXdpbmRvdy5tYXRjaE1lZGlhKCIoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwobWluLXJlc29sdXRpb246IDE5MmRwaSkiKSxuPWZ1bmN0aW9uKHQpe3JldHVybiBlKHQubWF0Y2hlcyl9O3QmJm4odCksdC5hZGRMaXN0ZW5lciYmdC5hZGRMaXN0ZW5lcihuKX1lbHNlIGUod2luZG93LmRldmljZVBpeGVsUmF0aW8+MT8hMDohMSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzgpLGM9cihwKSxmPTk5OSxkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5fc2V0U3RhdGUoZSksbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTdGF0ZSh0aGlzLnByb3BzKSx0aGlzLl9oYW5kbGVUZXh0T3ZlcmZsb3coKX19LHtrZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToiY29tcG9uZW50RGlkVXBkYXRlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0idGV4dENvbnRhaW5lcl9fdGV4dCI7dCs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciBuPXtmb250U2l6ZTp0aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4fTtyZXR1cm4gT2JqZWN0LmFzc2lnbihuLHRoaXMucHJvcHMuc3R5bGUpLHRoaXMucHJvcHMudGV4dD9sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOmZ1bmN0aW9uKHQpe2Uubm9kZT10fSxzdHlsZTpuLGNsYXNzTmFtZToidGV4dENvbnRhaW5lciIrKHRoaXMuc3RhdGUudXNlQ3NzVHJ1bmNhdGlvbj8iIGgtZWxsaXBzaXMiOiIiKX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtyZWY6ZnVuY3Rpb24odCl7ZS5zcGFuPXR9LGNsYXNzTmFtZTp0LGlkOnRoaXMucHJvcHMudGV4dElkfSx0aGlzLnByb3BzLnRleHQpKTpudWxsfX0se2tleToiX3NldFN0YXRlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1PYmplY3QuYXNzaWduKHt9LGUuZm9udCk7dGhpcy5zdGF0ZT17Zm9udDp0LHVzZUNzc1RydW5jYXRpb246dC5tYXhMaW5lcz8xPT09dC5tYXhMaW5lczohMCxuZWVkc1RpdGxlQXR0cmlidXRlOiExLG9yaWdpbmFsVGV4dDplLnRleHR9fX0se2tleToiX3Nob3dUb29sdGlwIix2YWx1ZTpmdW5jdGlvbihlKXtlPygwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5hdHRyKCJ0aXRsZSIsdGhpcy5zdGF0ZS5vcmlnaW5hbFRleHQpOigwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5yZW1vdmVBdHRyKCJ0aXRsZSIpfX0se2tleToiX2hhbmRsZVRleHRPdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLm5vZGUpaWYodGhpcy5zdGF0ZS51c2VDc3NUcnVuY2F0aW9uKXt2YXIgZT0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5fc2hvd1Rvb2x0aXAoZS50ZXh0T3ZlcmZsb3coKSl9ZWxzZSB0aGlzLl90cnVuY2F0ZU11bHRpTGluZVRleHQoKX19LHtrZXk6Il90cnVuY2F0ZU11bHRpTGluZVRleHQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9Ii4uLiIsdD0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5zcGFuLmlubmVySFRNTD10aGlzLnN0YXRlLm9yaWdpbmFsVGV4dDt2YXIgbj0oMCxjWyJkZWZhdWx0Il0pKHRoaXMuc3BhbikuZGVjb2RlRW50aXRpZXMoKTt0aGlzLm5vZGUuc3R5bGUuZm9udFNpemU9dGhpcy5zdGF0ZS5mb250Lm1heEZvbnRQeCsicHgiO2Zvcih2YXIgcj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsbz10aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4LGk9ITEsYT0wO3I+dGhpcy5zdGF0ZS5mb250Lm1heExpbmVzfHx0LmNoaWxkcmVuT3ZlcmZsb3coKTspe2lmKG88PXRoaXMuc3RhdGUuZm9udC5taW5Gb250UHgpe2l8fChuKz1lLGk9ITApO3ZhciBzPW4ubGVuZ3RoO249bi5zdWJzdHIoMCxzLWUubGVuZ3RoLTEpK2UsdGhpcy5zcGFuLmlubmVySFRNTD1ufWVsc2Ugby0tLHRoaXMubm9kZS5zdHlsZS5mb250U2l6ZT1vKyJweCI7aWYocj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsYSsrLGE+ZilicmVha310aGlzLl9zaG93VG9vbHRpcChpKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9IlRleHRDb250YWluZXIiLGQucHJvcFR5cGVzPXt0ZXh0OnUuUHJvcFR5cGVzLnN0cmluZyxhZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGZvbnQ6dS5Qcm9wVHlwZXMub2JqZWN0LHRleHRJZDp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm5vZGU9dH1yZXR1cm4gcihlLFt7a2V5OiJnZXQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm5vZGVbZV19fSx7a2V5OiJmaW5kIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwodCkpfX0se2tleToicGFyZW50Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLm5vZGUucGFyZW50Tm9kZSl9fSx7a2V5OiJjaGlsZHJlbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5ub2RlLmNoaWxkcmVuKX19LHtrZXk6ImNzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm5vZGVbMF18fHRoaXMubm9kZSxyPW4uZ2V0QXR0cmlidXRlKCJzdHlsZSIpLG89cj9yLnNwbGl0KCI7IikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KCI6Iil9KTpbXSxpPXt9O28uZm9yRWFjaChmdW5jdGlvbihlKXtlWzBdJiYiIiE9PWVbMF0mJihpW2VbMF1dPWVbMV0pfSksaVtlXT10O3ZhciBhPSIiO3JldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ErPWUrIjoiK2lbZV0rIjsifSksbi5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKSx0aGlzfX0se2tleToiYXR0ciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHQ/KHRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoZSx0KSx0aGlzLm5vZGUpOnRoaXMubm9kZS5nZXRBdHRyaWJ1dGUoZSl9fSx7a2V5OiJyZW1vdmVBdHRyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ub2RlLnJlbW92ZUF0dHJpYnV0ZShlKSx0aGlzLm5vZGV9fSx7a2V5OiJvdXRlckhlaWdodCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLm5vZGUub2Zmc2V0SGVpZ2h0O3JldHVybiBlJiYodD1nZXRDb21wdXRlZFN0eWxlKHRoaXMubm9kZSksbis9cGFyc2VJbnQodC5tYXJnaW5Ub3ApK3BhcnNlSW50KHQubWFyZ2luQm90dG9tKSksbn19LHtrZXk6Im91dGVyV2lkdGgiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5ub2RlLm9mZnNldFdpZHRoO3JldHVybiBlJiYodD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5vZGUpLApuKz13aW5kb3cucGFyc2VJbnQodC5tYXJnaW5MZWZ0LDEwKSt3aW5kb3cucGFyc2VJbnQodC5tYXJnaW5SaWdodCwxMCkpLG59fSx7a2V5OiJ0ZXh0Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUudGV4dENvbnRlbnR8fHRoaXMubm9kZS5pbm5lckhUTUx8fCIifX0se2tleToiY2hpbGRyZW5PdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm91dGVyV2lkdGgoITApLG49MDtyZXR1cm4gdGhpcy5jaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24odCl7bis9bmV3IGUodCkub3V0ZXJXaWR0aCghMCl9KSwtMT50LW59fSx7a2V5OiJ0ZXh0T3ZlcmZsb3ciLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3V0ZXJXaWR0aCghMCk8dGhpcy5ub2RlLnNjcm9sbFdpZHRofX0se2tleToiZGVjb2RlRW50aXRpZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYodGhpcy5ub2RlLmlubmVySFRNTCl7dmFyIHQ9dGhpcy5ub2RlLmlubmVySFRNTDtyZXR1cm4gdD10LnJlcGxhY2UoLzxzY3JpcHRbXj5dKj4oW1xTXHNdKj8pPFwvc2NyaXB0Pi9naW0sIiIpLHQ9dC5yZXBsYWNlKC88XC8/XHcoPzpbXiInPl18IlteIl0qInwnW14nXSonKSo+L2dpbSwiIiksdD10LnJlcGxhY2UoL1x1MDBhMC9nLCIgIiksZS5pbm5lckhUTUw9dCx0PWUudGV4dENvbnRlbnR8fGUuaW5uZXJIVE1MfHwiIixlLnRleHRDb250ZW50PSIiLHR9cmV0dXJuIiJ9fV0pLGV9KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbyhlKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNyksYz1yKHApLGY9big3KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9InRleHRMaW5rIisodGhpcy5wcm9wcy5kaXNwbGF5QXNUZXh0PyIgdGV4dExpbmstLWRpc3BsYXlBc1RleHQiOiIiKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoZFsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6ZX19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7Zm9udDp0aGlzLnByb3BzLmZvbnQsdGV4dDp0aGlzLnByb3BzLnRleHQsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSx0ZXh0SWQ6dGhpcy5wcm9wcy50ZXh0SWR9KSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bInRleHRDb250YWluZXIiLCJjbGlja3Rocm91Z2hMaW5rIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZXh0TGluayIsaC5wcm9wVHlwZXM9e3RleHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpLmlzUmVxdWlyZWQsZm9udDp1LlByb3BUeXBlcy5vYmplY3QsdGV4dElkOnUuUHJvcFR5cGVzLnN0cmluZyxkaXNwbGF5QXNUZXh0OnUuUHJvcFR5cGVzLmJvb2wsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDMzKSxjPXIocCksZj1uKDcpLGQ9cihmKSxoPW4oMzcpLHk9cihoKSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0iYXNpbkltYWdlIjtyZXR1cm4gZSs9dGhpcy5wcm9wcy5leHRlbmRDb250YWluZXJIZWlnaHQ/IiBhc2luSW1hZ2UtLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIsZSs9dGhpcy5wcm9wcy5kZXNjcmlwdGlvbj8iIGFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uIjoiIixsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7ImRhdGEtYXNpbiI6dGhpcy5wcm9wcy5hc2luLGNsYXNzTmFtZTplfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3VybDp0aGlzLnByb3BzLmhyZWYsaXNPZmZzaXRlOiExLGNsaWNrVHJhY2tlclVybHM6dGhpcy5wcm9wcy5jbGlja1VybHMsYW5jaG9yUHJvcHM6e2NsYXNzTmFtZTplfX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtwYXRoOnRoaXMucHJvcHMucGF0aCxhbHQ6dGhpcy5wcm9wcy5hbHQsc3ByaXRlOnRoaXMucHJvcHMuc3ByaXRlLGV4dGVuZENvbnRhaW5lckhlaWdodDp0aGlzLnByb3BzLmV4dGVuZENvbnRhaW5lckhlaWdodCx3aWR0aDp0aGlzLnByb3BzLndpZHRoLGhlaWdodDp0aGlzLnByb3BzLmhlaWdodCxzeDp0aGlzLnByb3BzLnN4LHN5OnRoaXMucHJvcHMuc3kscWw6dGhpcy5wcm9wcy5xbCxyZXRpbmE6dGhpcy5wcm9wcy5yZXRpbmEsYWM6dGhpcy5wcm9wcy5hYyxtZXJnZVRhZ3M6dGhpcy5wcm9wcy5tZXJnZVRhZ3MsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pLHRoaXMucHJvcHMuZGVzY3JpcHRpb24mJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHlbImRlZmF1bHQiXSx7dGV4dDp0aGlzLnByb3BzLmRlc2NyaXB0aW9uLGZvbnQ6dGhpcy5wcm9wcy5kZXNjcmlwdGlvbkZvbnR9KSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lciIsImNsaWNrdGhyb3VnaExpbmsiLCJ0ZXh0Q29udGFpbmVyIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09bSxtLmRpc3BsYXlOYW1lPSJBc2luSW1hZ2UiLG0ucHJvcFR5cGVzPXtocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWx0OnUuUHJvcFR5cGVzLnN0cmluZyxzcHJpdGU6dS5Qcm9wVHlwZXMuYm9vbCxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxkZXNjcmlwdGlvbjp1LlByb3BUeXBlcy5zdHJpbmcsZGVzY3JpcHRpb25Gb250OnUuUHJvcFR5cGVzLm9iamVjdCx0aXRsZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LG9uTG9hZDp1LlByb3BUeXBlcy5mdW5jLGFzaW46dS5Qcm9wVHlwZXMuc3RyaW5nfSxtLmRlZmF1bHRQcm9wcz17YWM6ITAscmV0aW5hOiEwfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0icHJpY2UiO2UrPXRoaXMucHJvcHMuaXNKdW1ibz8iIHByaWNlLS1qdW1ibyI6IiIsZSs9dGhpcy5wcm9wcy5pc0xpc3Q/IiBwcmljZS0tbGlzdCI6IiIsZSs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciB0PSIiO2lmKHRoaXMucHJvcHMuaXNKdW1ibyl7dmFyIG49dGhpcy5wcm9wcy5wcmljZUluZm8ud2hvbGVBbW91bnQscj10aGlzLnByb3BzLnByaWNlSW5mby5kZWNpbWFsUGFydDt0PWxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOmUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0ludGVnZXJBbW91bnQifSxuKSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudCJ9LHIpKX1lbHNlIHQ9bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19hbW91bnQifSx0aGlzLnByb3BzLmFtb3VudCkpO3JldHVybiB0aGlzLnByb3BzLmhyZWYmJnRoaXMucHJvcHMuY2xpY2tVcmxzP2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJwcmljZSJ9fSx0KTp0fX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iUHJpY2UiLGYucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjdXJyZW5jeTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxpc0p1bWJvOnUuUHJvcFR5cGVzLmJvb2wscHJpY2VJbmZvOnUuUHJvcFR5cGVzLm9iamVjdCxpc0xpc3Q6dS5Qcm9wVHlwZXMuYm9vbCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3QsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNSksYz1yKHApLGY9big0MyksZD1yKGYpLGg9big3KSx5PXIoaCksbT0iL2ltYWdlcy9HLyR7bWVkaWF9L2RhL2NyZWF0aXZlcy9wcmltZS0yeC0yMDE3MDYxNC5wbmciLGI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiZ2V0UHJpbWVMb2dvUGF0aCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGRbImRlZmF1bHQiXS5jb21waWxlKG0se21lZGlhOmV9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFByaW1lTG9nb1BhdGgodGhpcy5wcm9wcy5tZWRpYSksdD1sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3BhdGg6ZSx3aWR0aDoiNDMiLGhlaWdodDoiMTIiLGFsdDoiUHJpbWUiLGFkZGl0aW9uYWxDbGFzczoicHJpbWVMb2dvIixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSk7cmV0dXJuIHRoaXMucHJvcHMuaHJlZiYmdGhpcy5wcm9wcy5jbGlja1VybHM/bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoeVsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6InByaW1lTG9nbyJ9fSx0KTp0fX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWIsYi5kaXNwbGF5TmFtZT0iUHJpbWVMb2dvIixiLnByb3BUeXBlcz17bWVkaWE6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKSxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtuKHRoaXMsZSl9cmV0dXJuIHIoZSxbe2tleToiY29tcGlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt0Lmhhc093blByb3BlcnR5KG4pJiYoZT1lLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFwkeyIrbisifSIsImciKSx0W25dKSl9KSxlfX1dKSxlfSgpO2UuZXhwb3J0cz1uZXcgb30sLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9big0MSksYz1yKHApLGY9ITEsZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcy50YXhNZXNzYWdlJiYiIiE9PXRoaXMucHJvcHMudGF4TWVzc2FnZTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlQm94IixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSx0aGlzLnByb3BzLmxpc3RBbW91bnQmJmYmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7YW1vdW50OnRoaXMucHJvcHMubGlzdEFtb3VudCxjdXJyZW5jeTp0aGlzLnByb3BzLmN1cnJlbmN5LGlzTGlzdDohMCxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19saXN0IixzdHlsZTp0aGlzLnByb3BzLmxpc3RQcmljZVN0eWxlfSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHthbW91bnQ6dGhpcy5wcm9wcy5idXlBbW91bnQsY3VycmVuY3k6dGhpcy5wcm9wcy5jdXJyZW5jeSxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19idXkiLHN0eWxlOnRoaXMucHJvcHMuYnV5UHJpY2VTdHlsZX0pLGUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcmljZUJveF9fdGF4TWVzc2FnZSJ9LHRoaXMucHJvcHMudGF4TWVzc2FnZSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJwcmljZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWQsZC5kaXNwbGF5TmFtZT0iUHJpY2VCb3giLGQucHJvcFR5cGVzPXtidXlBbW91bnQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsbGlzdEFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcsY3VycmVuY3k6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsdGF4TWVzc2FnZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGJ1eVByaWNlU3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGxpc3RQcmljZVN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdH19LCwsLCwsLCwsLCwsLCwsLCwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDUpLGM9cihwKSxmPW4oMjgpLGQ9cihmKSxoPW4oMzgpLHk9cihoKSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zdHJ1Y3R1cmU9bmV3IGRbImRlZmF1bHQiXShuLmdldFN0cnVjdHVyZXMoKSksbi5pbml0U3RydWN0dXJlKGUpLG4uY29tcG9uZW50c01hcD1uLmdldENvbXBvbmVudHNNYXAoKSxuLmRvbVJlZnM9e30sbi5zdGF0ZT17c2hvd0xpc3RQcmljZTohMH0sbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiaW5pdFN0cnVjdHVyZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5mb3JtYXR0ZWRQcmljZSYmIiIhPT1lLmZvcm1hdHRlZFByaWNlJiYhZS5pc0RpZ2l0YWw7dGhpcy5zdHJ1Y3R1cmUuaGlkZUJsb2NrKCJwcmljZUJveCIsIXQpO3ZhciBuPXQmJmUuaXNQcmltZTtpZih0aGlzLnN0cnVjdHVyZS5oaWRlQmxvY2soInByaW1lTG9nbyIsIW4pLCJKUCI9PT10aGlzLnByb3BzLm1hcmtldFBsYWNlKXt2YXIgcj10aGlzLnN0cnVjdHVyZS5nZXRDb21wb25lbnRQcm9wKCJoZWFkbGluZSIsInN0eWxlIik7ciYmKHIudmFsdWUuZm9udFN0eWxlPSJub3JtYWwiLHRoaXMuc3RydWN0dXJlLnNldENvbXBvbmVudFByb3AoImhlYWRsaW5lIiwic3R5bGUiLHIudmFsdWUsImNvbnN0YW50IikpfWUubW9iaWxlSGVhZGxpbmUmJnRoaXMuc3RydWN0dXJlLnNldENvbXBvbmVudFByb3AoImhlYWRsaW5lIiwidGV4dCIsIm1vYmlsZUhlYWRsaW5lIiwicGF0aCIpfX0se2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5kb21SZWZzLnByaWNpbmcmJnRoaXMuc2V0U3RhdGUoe3Nob3dMaXN0UHJpY2U6ISgwLHlbImRlZmF1bHQiXSkodGhpcy5kb21SZWZzLnByaWNpbmcpLmNoaWxkcmVuT3ZlcmZsb3coKX0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuc3RhdGUuc2hvd0xpc3RQcmljZT90aGlzLnByb3BzLmZvcm1hdHRlZExpc3RQcmljZTpudWxsO3JldHVybiB0aGlzLnN0cnVjdHVyZS5zZXRDb21wb25lbnRQcm9wKCJwcmljZUJveCIsImxpc3RBbW91bnQiLGUsImNvbnN0YW50IiksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtjbGFzc05hbWU6Im1vYmlsZU15c3RpcXVlIixyZW5kZXJpbmdDb250ZXh0OnRoaXMucHJvcHMsc3RydWN0dXJlOnRoaXMuc3RydWN0dXJlLm1vZGVsLGNvbXBvbmVudHNNYXA6dGhpcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6dGhpcy5kb21SZWZzLHVwZGF0ZU9uUmVzaXplOiEwfSl9fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09bSxtLlRFTVBMQVRFX0lEPSJtb2JpbGVNeXN0aXF1ZSIsbS5kaXNwbGF5TmFtZT0iTW9iaWxlTXlzdGlxdWUiLG0ucHJvcFR5cGVzPXt9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9KHIodSksbig5OSkpLHA9cihsKSxjPW4oMTAxKSxmPXIoYyksZD1uKDEwMiksaD1yKGQpLHk9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiZ2V0U3RydWN0dXJlcyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oMCxmWyJkZWZhdWx0Il0pKCl9fSx7a2V5OiJnZXRDb21wb25lbnRzTWFwIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0LkNPTVBPTkVOVFNfTUFQfX1dKSx0fShwWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT15LHkuQ09NUE9ORU5UU19NQVA9aFsiZGVmYXVsdCJdLHkuZGlzcGxheU5hbWU9Ik1vYmlsZU15c3RpcXVlQ29udHJvbCIseS5wcm9wVHlwZXM9e319LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybntpZDoiMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93Iix3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMjVweCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxNjBweCIsaGVpZ2h0OiIxMDAlIixwYWRkaW5nOiI1cHggMTBweCA1cHggMTBweCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoiYXNpbkltYWdlIixwcm9wczpbe25hbWU6ImhyZWYiLHZhbHVlOiJhZExpbmsiLHR5cGU6InBhdGgifSx7bmFtZToiY2xpY2tVcmxzIix2YWx1ZToiY2xpY2tVcmxzIix0eXBlOiJwYXRoIn0se25hbWU6InBhdGgiLHZhbHVlOiJhc2luSW1hZ2UiLHR5cGU6InBhdGgifSx7bmFtZToiYWx0Iix2YWx1ZToicHJvZHVjdFRpdGxlIix0eXBlOiJwYXRoIn0se25hbWU6InN4Iix2YWx1ZTo4MCx0eXBlOiJjb25zdGFudCJ9XX0sc3R5bGU6W3tuYW1lOiJmbGV4Iix2YWx1ZToiMCAwIDEyNXB4In1dfSx7aWQ6IjAuMSIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93Iix3aWR0aDoiMTAwJSJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4xLjAiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoiY29sdW1uIix3aWR0aDoiMTAwJSIscGFkZGluZzoiMCAxMHB4IDAgMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4xLjAuMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA1cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiaGVhZGxpbmUifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJ0ZXh0TGluayIscHJvcHM6W3tuYW1lOiJmb250Iix2YWx1ZTp7bWF4TGluZXM6MixtaW5Gb250UHg6MTYsbWF4Rm9udFB4OjE4fSx0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJ0ZXh0Iix2YWx1ZToiaGVhZGxpbmUiLHR5cGU6InBhdGgifSx7bmFtZToiaHJlZiIsdmFsdWU6ImFkTGluayIsdHlwZToicGF0aCJ9LHtuYW1lOiJjbGlja1VybHMiLHZhbHVlOiJjbGlja1VybHMiLHR5cGU6InBhdGgifSx7bmFtZToiZGlzcGxheUFzVGV4dCIsdmFsdWU6ITAsdHlwZToiY29uc3RhbnQifSx7bmFtZToic3R5bGUiLHZhbHVlOntmb250U3R5bGU6Iml0YWxpYyIsY29sb3I6IiM1NTUiLGxpbmVIZWlnaHQ6IjIwcHgifSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMSIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA1cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoidGV4dExpbmsiLHByb3BzOlt7bmFtZToiZm9udCIsdmFsdWU6e21heExpbmVzOjEsbWluRm9udFB4OjE2LG1heEZvbnRQeDoxNixzaXplOjE2fSx0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJ0ZXh0Iix2YWx1ZToicHJvZHVjdFRpdGxlIix0eXBlOiJwYXRoIn0se25hbWU6ImhyZWYiLHZhbHVlOiJhZExpbmsiLHR5cGU6InBhdGgifSx7bmFtZToiY2xpY2tVcmxzIix2YWx1ZToiY2xpY2tVcmxzIix0eXBlOiJwYXRoIn0se25hbWU6ImRpc3BsYXlBc1RleHQiLHZhbHVlOiExLHR5cGU6ImNvbnN0YW50In0se25hbWU6InN0eWxlIix2YWx1ZTp7Zm9udFdlaWdodDoiNjAwIn0sdHlwZToiY29uc3RhbnQifV19fSx7aWQ6IjAuMS4wLjIiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToicHJpY2luZyJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNoaWxkcmVuOlt7aWQ6IjAuMS4wLjIuMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgNXB4IDAgMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToicHJpY2VCb3gifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJwcmljZUJveCIscHJvcHM6W3tuYW1lOiJidXlBbW91bnQiLHZhbHVlOiJmb3JtYXR0ZWRQcmljZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJsaXN0QW1vdW50Iix2YWx1ZToiZm9ybWF0dGVkTGlzdFByaWNlIix0eXBlOiJwYXRoIn0se25hbWU6ImN1cnJlbmN5Iix2YWx1ZToiY3VycmVuY3lTeW1ib2wiLHR5cGU6InBhdGgifSx7bmFtZToidGF4TWVzc2FnZSIsdmFsdWU6ImkxOG4udGF4TWVzc2FnZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJidXlQcmljZVN0eWxlIix2YWx1ZTp7Zm9udFNpemU6IjE1cHgifSx0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJsaXN0UHJpY2VTdHlsZSIsdmFsdWU6e2ZvbnRTaXplOiIxM3B4In0sdHlwZToiY29uc3RhbnQifV19fSx7aWQ6IjAuMS4wLjIuMSIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmltZUxvZ28ifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJwcmltZUxvZ28iLHByb3BzOlt7bmFtZToibWVkaWEiLHZhbHVlOiJpMThuLnNldHRpbmdzLm1lZGlhIix0eXBlOiJwYXRoIn0se3N0eWxlOnt3aWR0aDoiMjlweCIsaGVpZ2h0OiIxM3B4In19XX0sc3R5bGU6W3tuYW1lOiJvdmVyZmxvdyIsdmFsdWU6InZpc2libGUifV19XSxjc3NDbGFzc2VzOlsiYmxvY2stLWlubGluZSIsIiJdLHN0eWxlOlt7bmFtZToid2hpdGVTcGFjZSIsdmFsdWU6Im5vcm1hbCJ9XX1dfSx7aWQ6IjAuMS4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCAxMHB4IDAgMTBweCIsaGVpZ2h0OiIxMjNweCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sc3R5bGU6W3tuYW1lOiJvcGFjaXR5Iix2YWx1ZToiMC42NCJ9LHtuYW1lOiJmbGV4Iix2YWx1ZToiMCAwIDlweCJ9XSxjb21wb25lbnQ6e2lkOiJtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lciIscHJvcHM6W3tuYW1lOiJwYXRoIix2YWx1ZToiL2ltYWdlcy9HLzAxL0FtYXpvbkJyYW5kU3RvcmVzUGxhdGZvcm0vYmxhY2tfYXJyb3cucG5nIix0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJhbHQiLHZhbHVlOiJHcmF5IEFycm93Iix0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJyb2xlIix2YWx1ZToicHJlc2VudGF0aW9uIix0eXBlOiJjb25zdGFudCJ9XX19XSxzdHlsZTpbe25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiIjRkZGRkZGIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiItd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDI1NSwyNTUsMjU1LDEpLCByZ2JhKDI1NSwyNTUsMjU1LDApIDI1JSwgcmdiYSgyNTUsMjU1LDI1NSwwKSksIC13ZWJraXQtbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiItby1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgLW8tbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiItbW96LWxpbmVhci1ncmFkaWVudCgjRkZGRkZGLCAjRUJFQkVCKSJ9LHtuYW1lOiJiYWNrZ3JvdW5kIix2YWx1ZToibGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI1NSwyNTUsMjU1LDEpLCByZ2JhKDI1NSwyNTUsMjU1LDApIDI1JSwgcmdiYSgyNTUsMjU1LDI1NSwwKSksIGxpbmVhci1ncmFkaWVudCgjRkZGRkZGLCAjRUJFQkVCKSJ9XX1dLHN0eWxlOlt7bmFtZToiYm9yZGVyIix2YWx1ZToiMXB4IHNvbGlkICNkZGQifSx7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6IiNGRkZGRkYifV19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXZhciBvPW4oNDApLGk9cihvKSxhPW4oMzkpLHM9cihhKSx1PW4oNzgpLGw9cih1KSxwPW4oNDIpLGM9cihwKSxmPW4oMzMpLGQ9cihmKTtlLmV4cG9ydHM9e2FzaW5JbWFnZTppWyJkZWZhdWx0Il0sdGV4dExpbms6c1siZGVmYXVsdCJdLHByaWNlQm94OmxbImRlZmF1bHQiXSxwcmltZUxvZ286Y1siZGVmYXVsdCJdLG1lZGlhQ2VudHJhbEltYWdlQ29udGFpbmVyOmRbImRlZmF1bHQiXX19XSk7O3ZhciAkYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWQnKSxyZW5kZXJpbmdDb250ZXh0ID0geyJtYXJrZXRQbGFjZSI6IlVTIiwiYWRMaW5rIjoiaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Rb3Eyd3AtYW84ZFdGWFpWNDR2T1U0SUFBQUZobWVFNDBnRUFBQUdRQVJ0MXdrYy9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPXNzRzRXRnlYcHUuZGhYRXgxLk9HOXciLCJyZXZpZXdMaW5rIjoiaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Rb3Eyd3AtYW84ZFdGWFpWNDR2T1U0SUFBQUZobWVFNDBnRUFBQUdRQVJ0MXdrYy9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPXNzRzRXRnlYcHUuZGhYRXgxLk9HOXcjY3VzdG9tZXJSZXZpZXdzIiwiY3JlYXRpdmVJZCI6IjE4NDkwODExNjA3MDEiLCJhZElkIjoiNDUzMzA3NzgxMDcwMSIsInByb2R1Y3RUaXRsZSI6IkxlYXJuIFMuUS5MLiBmcm9tIHRoZSBleHBlcnRzIGluIHRoZSBwcmVtaWVyIGd1aWRlIGZvciBiZWdpbm5lcnMiLCJoZWFkbGluZSI6IlRyb3VibGUgbGV2ZXJhZ2luZyB5b3VyIGRhdGE/IiwiYXNpbkltYWdlIjoiaHR0cHM6Ly9pbWFnZXMtbmEuc3NsLWltYWdlcy1hbWF6b24uY29tL2ltYWdlcy9JLzUxVnpTZGpyaU9MLl9BQ19TUjEyOCwxNDVfLmpwZyIsInVuc3ByaXRlZEltYWdlIjoiaHR0cHM6Ly9pbWFnZXMtbmEuc3NsLWltYWdlcy1hbWF6b24uY29tL2ltYWdlcy9JLzUxa3pnVlMtLVFMLmpwZyIsImN1c3RvbWVyUmV2aWV3U3VtbWFyeSI6eyJyYXRpbmciOjQuMzAzODI1MzM1LCJjb3VudCI6MTU4LCJhc2luIjoiMTUwODc2NzQ4MyJ9LCJiYWRnZUluZm9ybWF0aW9uTWFwIjpudWxsLCJjdXJyZW5jeVN5bWJvbCI6IiQiLCJmb3JtYXR0ZWRMaXN0UHJpY2UiOiIxOC45OSIsImZvcm1hdHRlZFByaWNlIjoiMTQuOTkiLCJwcmljZUluZm8iOnsid2hvbGVBbW91bnQiOiIxNCIsImRlY2ltYWxQYXJ0IjoiOTkifSwicHJpY2VGb3JtYXR0aW5nRmxhZ3MiOnsiaXNTeW1ib2xTdXBlcnNjcmlwdCI6dHJ1ZSwic3ltYm9sUG9zaXRpb24iOiJwcmVmaXhlZCJ9LCJwcmljZVBlclVuaXRNZXNzYWdlIjoiIiwiaXNQcmltZSI6dHJ1ZSwiaXNEaWdpdGFsIjpmYWxzZSwiaTE4biI6eyJzZXR0aW5ncyI6eyJzZWxlY3Rpb25MYWJlbCI6IkVuZ2xpc2ggKFVTKSIsInJlZ2lvbiI6Im5hIiwiY3VycmVuY3kiOiIkIiwiZG9tYWluIjoiYW1hem9uLmNvbSIsIm1lZGlhIjoiMDEiLCJtZXJjaGFudElkIjoiQVRWUERLSUtYMERFUiIsIm1hcmtldHBsYWNlSWQiOiJBVFZQREtJS1gwREVSIiwibG9jYWxlTW9udGhzIjpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX0sInRheE1lc3NhZ2UiOiIiLCJzcG9uc29yZWRCeSI6IlNwb25zb3JlZCBieSIsInNob3BOb3ciOiJTaG9wIG5vdyIsImJlc3RTZWxsZXIiOiJCZXN0IFNlbGxlciIsIm5ld1JlbGVhc2UiOiJOZXcgUmVsZWFzZSIsImJhZGdlSW4iOiJpbiJ9LCJjbGlja1VybHMiOlsiaHR0cHM6Ly9zLmFtYXpvbi1hZHN5c3RlbS5jb20vaXUzP2Q9Zm9yZXN0ZXItZGlkJmV4LWZjaD00MTY3MzE2MTMmZXgtZmFyZ3M9P2klM0RpcmJDbjVxangxWVZkbFhqaTg1VGdnJTI2YXNpJTNEJTNBMDEwMWIwZGQ5ZTllZDZlNGQxNGVlNTkyZDE0MzA3MmM1MDVhNTNlMWUzZTc2YTY1M2FiNjYzZmEwMTBmZWM5OTAzODYlMjZjbGljayUzRDEmY2I9MTUxODcwNTEyOTcxOSJdLCJicmFuZExvZ28iOiJpbWFnZXMvUy9hYnMtaW1hZ2UtdXBsb2FkLW5hL2UvYW1zL0FUVlBES0lLWDBERVIvNGI2MjBmZWU0ZGU3NmE1NDRjM2FkOTNjYjEwNjhhNjkudzUwMC5oNDc0Ll9DUjEzLDAsNDc0LDQ3NF9TTDI4MF9TWTgwXy5qcGciLCJicmFuZE5hbWUiOiJDbHlkZUJhbmsgTWVkaWEgTExDIiwicHJvZHVjdEltYWdlIjp7InVybCI6Imh0dHBzOi8vaW1hZ2VzLW5hLnNzbC1pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvSS81MWt6Z1ZTLS1RTC5qcGciLCJoZWlnaHQiOjUwMCwid2lkdGgiOjQwNn19O2lmICgkYWQpIHtSZWFjdERPTS5yZW5kZXIoUmVhY3QuY3JlYXRlRWxlbWVudChMaWJyYXJ5LmRlZmF1bHQsIHJlbmRlcmluZ0NvbnRleHQpLCAkYWQpO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLmFkZFZpZXdhYmlsaXR5TGlzdGVuZXIoJGFkKTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS5hZGRDcmVhdGl2ZUNsaWNrTGlzdGVuZXIoJGFkKTt9PC9zY3JpcHQ+PC9ib2R5PjwvaHRtbD48L2Rpdj4=&quot;,&quot;enableAdBlockerDetector&quot;: true,&quot;disableResizeFunc&quot;: true,&quot;fallbackStaticAdImgUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdClickUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdExtraStyle&quot;: &quot;&quot;,&quot;advertisementTextOnTop&quot;: false,&quot;viewabilityStandards&quot;: [{&quot;p&quot;: 0, &quot;t&quot;: 0, &quot;def&quot;: &quot;amzn&quot;}, {&quot;p&quot;: 50, &quot;t&quot;: 1, &quot;def&quot;: &quot;iab&quot;}, {&quot;p&quot;: 100, &quot;t&quot;: 0, &quot;def&quot;: &quot;groupm&quot;}],&quot;ajaxWeblabTriggerId&quot;: &quot;&quot;}" title="Advertisement" data-arid="5b25a8c2cf2441d185621391dfd7c737"><div id="ape_detail_btf_detail-mWeb_placement" style="text-align: center; position: absolute; height: 125px; width: 100%;" aria-hidden="true"><iframe name="{&quot;slot&quot;:&quot;detail_btf_detail-mWeb&quot;,&quot;pageType&quot;:&quot;detail&quot;,&quot;subPageType&quot;:&quot;detail-mWeb&quot;,&quot;slotName&quot;:&quot;btf&quot;,&quot;src&quot;:&quot;prefetchEnabled&quot;,&quot;adServer&quot;:&quot;cs&quot;,&quot;campaignId&quot;:&quot;9044&quot;,&quot;arid&quot;:&quot;5b25a8c2cf2441d185621391dfd7c737&quot;,&quot;size&quot;:{&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;},&quot;maxAdWidth&quot;:&quot;&quot;,&quot;allowedSizes&quot;:[{&quot;width&quot;:&quot;414px&quot;,&quot;height&quot;:&quot;125px&quot;},{&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;125px&quot;}],&quot;allowedDomains&quot;:[&quot;d3l3lkinz3f56t.cloudfront.net&quot;,&quot;g-ecx.images-amazon.com&quot;,&quot;z-ecx.images-amazon.com&quot;,&quot;images-na.ssl-images-amazon.com&quot;,&quot;g-ec4.images-amazon.com&quot;,&quot;images-cn.ssl-images-amazon.com&quot;],&quot;loadAfter&quot;:&quot;windowOnLoad&quot;,&quot;extraDelay&quot;:0,&quot;iframeExtraStyle&quot;:&quot;width: 1px; min-width: 100%;&quot;,&quot;iframeClass&quot;:&quot;&quot;,&quot;iframeSandbox&quot;:&quot;&quot;,&quot;enablePrerenderLogic&quot;:true,&quot;adLabelWrapperId&quot;:&quot;ape_detail_btf_detail-mWeb_text-wrapper&quot;,&quot;adLabelId&quot;:&quot;ape_detail_btf_detail-mWeb_text&quot;,&quot;advTextWrapperDivStyle&quot;:&quot;position:relative; text-align:center; margin-left: -14px; margin-right: -14px; height: auto;&quot;,&quot;advertisementTextStyle&quot;:&quot;font-size: 10px; color: #555; text-align: right; margin: 0px 3px 6px 0;&quot;,&quot;advertisementTextHTMLContent&quot;:&quot;&quot;,&quot;advertisementTextHTMLContentEncoded&quot;:&quot;PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfdGV4dC13cmFwcGVyIiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7IHRleHQtYWxpZ246Y2VudGVyOyBtYXJnaW4tbGVmdDogLTE0cHg7IG1hcmdpbi1yaWdodDogLTE0cHg7IGhlaWdodDogYXV0bzsiICA+PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfdGV4dCIgc3R5bGU9ImZvbnQtc2l6ZTogMTBweDsgY29sb3I6ICM1NTU7IHRleHQtYWxpZ246IHJpZ2h0OyBtYXJnaW46IDBweCAzcHggNnB4IDA7IiAgPkFkdmVydGlzZW1lbnQ8L2Rpdj48L2Rpdj4=&quot;,&quot;adPixels&quot;:[],&quot;adPixelDelay&quot;:&quot;0&quot;,&quot;aaxImpPixelUrl&quot;:&quot;https://aax-us-east.amazon-adsystem.com/e/loi/imp?b=Qoq2wp-ao8dWFXZV44vOU4IAAAFhmeE40gEAAAGQARt1wkc&quot;,&quot;aaxInstrPixelUrl&quot;:&quot;https://aax-us-east.amazon-adsystem.com/x/px/Qoq2wp-ao8dWFXZV44vOU4IAAAFhmeE40gEAAAGQARt1wkc/&quot;,&quot;htmlContent&quot;:&quot;&quot;,&quot;htmlContentEncoded&quot;:&quot;PGRpdiBpZD0iYXBlX2RldGFpbF9idGZfZGV0YWlsLW1XZWJfY3JlYXRpdmVXcmFwcGVyIiAgID48IWRvY3R5cGUgaHRtbD48aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PVVURi04Pjx0aXRsZT48L3RpdGxlPjxzdHlsZT5odG1se2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MS4xNTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlfWJvZHl7bWFyZ2luOjB9YXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXA6b2JqZWN0c31hOmFjdGl2ZSxhOmhvdmVye291dGxpbmUtd2lkdGg6MH1pbWd7Ym9yZGVyLXN0eWxlOm5vbmV9Kiw6YWZ0ZXIsOmJlZm9yZXtib3gtc2l6aW5nOmJvcmRlci1ib3h9aHRtbHtvdmVyZmxvdzpoaWRkZW47Zm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNhIE5ldWUsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6IzExMTtmb250LXNpemU6MTRweH1he2NvbG9yOiMwMDY2YzA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2NvbG9yOiNjNDU1MDB9I2Fkey13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlfS5ibG9ja3tkaXNwbGF5Oi13ZWJraXQtZmxleDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW59LmJsb2NrOmVtcHR5e2Rpc3BsYXk6bm9uZX0uYmxvY2stLWp1c3RpZnktY2VudGVyey13ZWJraXQtanVzdGlmeS1jb250ZW50OmNlbnRlcjstbXMtZmxleC1wYWNrOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5ibG9jay0tanVzdGlmeS1mbGV4LWVuZHstd2Via2l0LWp1c3RpZnktY29udGVudDpmbGV4LWVuZDstbXMtZmxleC1wYWNrOmVuZDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LmJsb2NrLS1hbGlnbi1mbGV4LXN0YXJ0ey13ZWJraXQtYWxpZ24taXRlbXM6ZmxleC1zdGFydDstbXMtZmxleC1hbGlnbjpzdGFydDstbXMtZ3JpZC1yb3ctYWxpZ246ZmxleC1zdGFydDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5ibG9jay0tYWxpZ24tY2VudGVyey13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjstbXMtZ3JpZC1yb3ctYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0uYmxvY2stLWFsaWduLWZsZXgtZW5key13ZWJraXQtYWxpZ24taXRlbXM6ZmxleC1lbmQ7LW1zLWZsZXgtYWxpZ246ZW5kOy1tcy1ncmlkLXJvdy1hbGlnbjpmbGV4LWVuZDthbGlnbi1pdGVtczpmbGV4LWVuZH0uYmxvY2stLWRpcmVjdGlvbi1jb2x1bW57LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmJsb2NrLS1iYWNrZ3JvdW5kLC5ibG9jay0tYmFja2dyb3VuZD4uYmxvY2t7cG9zaXRpb246cmVsYXRpdmV9LmJsb2NrX19iYWNrZ3JvdW5ke3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5ibG9jay0tbG9ja3std2Via2l0LWZsZXgtZ3JvdzowOy1tcy1mbGV4LXBvc2l0aXZlOjA7ZmxleC1ncm93OjA7LXdlYmtpdC1mbGV4LXNocmluazowOy1tcy1mbGV4LW5lZ2F0aXZlOjA7ZmxleC1zaHJpbms6MH0uYmxvY2stLWlubGluZTpub3QoOmVtcHR5KXtkaXNwbGF5OmJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDtmb250LXNpemU6MH0uYmxvY2stLWlubGluZTpub3QoOmVtcHR5KT4uYmxvY2s6bm90KDplbXB0eSl7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtc2l6ZToxNHB4fS5oLW5vRmxleGJveCAuYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2t9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1jZW50ZXI+LmJsb2Nre3RleHQtYWxpZ246bGVmdH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1qdXN0aWZ5LWZsZXgtZW5ke3RleHQtYWxpZ246cmlnaHR9Lmgtbm9GbGV4Ym94IC5ibG9jay0tanVzdGlmeS1mbGV4LWVuZD4uYmxvY2t7dGV4dC1hbGlnbjpsZWZ0fS5oLW5vRmxleGJveCAuYmxvY2stLWFsaWduLWZsZXgtc3RhcnQ+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOnRvcH0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1jZW50ZXI+LmJsb2Nre3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uaC1ub0ZsZXhib3ggLmJsb2NrLS1hbGlnbi1mbGV4LWVuZD4uYmxvY2t7dmVydGljYWwtYWxpZ246Ym90dG9tfS5oLW5vRmxleGJveCAuYmxvY2stLWRpcmVjdGlvbi1jb2x1bW4+LmJsb2Nre2Rpc3BsYXk6YmxvY2t9LmgtY2xvYWt7dmlzaWJpbGl0eTpoaWRkZW4haW1wb3J0YW50fS5oLWVsbGlwc2lze292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uYXNpbkltYWdle2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uYXNpbkltYWdlLS1leHRlbmRDb250YWluZXJIZWlnaHR7aGVpZ2h0OmF1dG99LmFzaW5JbWFnZS0tZXh0ZW5kQ29udGFpbmVySGVpZ2h0Pi5pbWFnZUNvbnRhaW5lcntoZWlnaHQ6MTAwJX0uYXNpbkltYWdlLS13aXRoRGVzY3JpcHRpb257ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uPi5pbWFnZUNvbnRhaW5lcnttYXJnaW4tYm90dG9tOjVweH0uYXNpbkltYWdlLS13aXRoRGVzY3JpcHRpb24+LnRleHRDb250YWluZXJ7bWluLWhlaWdodDoxNXB4O3RleHQtYWxpZ246Y2VudGVyfS5pbWFnZUNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2JvdHRvbTowO3JpZ2h0OjA7bWFyZ2luOmF1dG87d2lkdGg6YXV0bztoZWlnaHQ6YXV0bzttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmltYWdlQ29udGFpbmVyLS1sZWZ0e2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LmltYWdlQ29udGFpbmVyLS1sZWZ0Pi5pbWFnZUNvbnRhaW5lcl9faW1hZ2V7cG9zaXRpb246c3RhdGljO21hcmdpbjowfS5pbWFnZUNvbnRhaW5lci0tcmlnaHQ+LmltYWdlQ29udGFpbmVyX19pbWFnZXttYXJnaW46MDtsZWZ0OmF1dG87Ym90dG9tOmF1dG87dG9wOmF1dG99LmltYWdlQ29udGFpbmVyLS1leHRlbmRDb250YWluZXJIZWlnaHR7aGVpZ2h0OmF1dG99LmltYWdlQ29udGFpbmVyLS1leHRlbmRDb250YWluZXJIZWlnaHQ+LmltYWdlQ29udGFpbmVyX19pbWFnZXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46MCBhdXRvfS50ZXh0TGlua3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9LnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0e2NvbG9yOiMxMTF9LnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0OmhvdmVye2NvbG9yOiMxMTE7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnNreSAudGV4dExpbmt7Zm9udC13ZWlnaHQ6NjAwfS5za3kgLnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0LC5za3kgLnRleHRMaW5rLS1kaXNwbGF5QXNUZXh0OmhvdmVye2NvbG9yOiMwMDJmMzZ9LnByaWNlQm94X19saXN0e21hcmdpbi1yaWdodDo0cHh9LnByaWNlQm94X190YXhNZXNzYWdle21hcmdpbi1sZWZ0OjVweDtmb250LXNpemU6MTFweH0ucHJpY2V7Y29sb3I6I2IxMjcwNH0ucHJpY2UtLWxpc3R7Y29sb3I6IzU1NTt0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdofS5wcmljZS0tanVtYm97Zm9udC1zaXplOjNlbX0ucHJpY2VfX2p1bWJvQ3VycmVuY3ksLnByaWNlX19qdW1ib0RlY2ltYWxBbW91bnQsLnByaWNlX19qdW1ib0ludGVnZXJBbW91bnR7dmVydGljYWwtYWxpZ246dG9wO2ZvbnQtd2VpZ2h0OjUwMH0ucHJpY2VfX2p1bWJvQ3VycmVuY3ksLnByaWNlX19qdW1ib0RlY2ltYWxBbW91bnR7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOi40ZW07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgzNSUpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgzNSUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDM1JSk7Zm9udC13ZWlnaHQ6NzAwfS5wcmljZV9fanVtYm9JbnRlZ2VyQW1vdW50e2xldHRlci1zcGFjaW5nOi0uNXB4fS5za3kgLnByaWNle2NvbG9yOiNiMTI3MDR9LnByaW1lTG9nb3ttYXJnaW4tdG9wOjJweH0udGVtcGxhdGVDb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmV9LnRlbXBsYXRlQ29udGFpbmVyX19saW5re3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvcGFjaXR5OjB9LmNsaWNrdGhyb3VnaExpbms6bm90KC50ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayl7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfTwvc3R5bGU+PHNjcmlwdD52YXIgbW9kZXJuaXpyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4obyl7aWYodFtvXSlyZXR1cm4gdFtvXS5leHBvcnRzO3ZhciByPXRbb109e2V4cG9ydHM6e30saWQ6byxsb2FkZWQ6ITF9O3JldHVybiBlW29dLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLG4pLHIubG9hZGVkPSEwLHIuZXhwb3J0c312YXIgdD17fTtyZXR1cm4gbi5tPWUsbi5jPXQsbi5wPSIiLG4oMCl9KHswOmZ1bmN0aW9uKGUsbix0KXtlLmV4cG9ydHM9dCgyMCl9LDIwOmZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiO3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfTshZnVuY3Rpb24oZSxuLG8pe2Z1bmN0aW9uIHIoZSxuKXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOnQoZSkpPT09bn1mdW5jdGlvbiBzKCl7dmFyIGUsbix0LG8scyxpLGw7Zm9yKHZhciBmIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShmKSl7aWYoZT1bXSxuPWJbZl0sbi5uYW1lJiYoZS5wdXNoKG4ubmFtZS50b0xvd2VyQ2FzZSgpKSxuLm9wdGlvbnMmJm4ub3B0aW9ucy5hbGlhc2VzJiZuLm9wdGlvbnMuYWxpYXNlcy5sZW5ndGgpKWZvcih0PTA7dDxuLm9wdGlvbnMuYWxpYXNlcy5sZW5ndGg7dCsrKWUucHVzaChuLm9wdGlvbnMuYWxpYXNlc1t0XS50b0xvd2VyQ2FzZSgpKTtmb3Iobz1yKG4uZm4sImZ1bmN0aW9uIik/bi5mbigpOm4uZm4scz0wO3M8ZS5sZW5ndGg7cysrKWk9ZVtzXSxsPWkuc3BsaXQoIi4iKSwxPT09bC5sZW5ndGg/d1tsWzBdXT1vOighd1tsWzBdXXx8d1tsWzBdXWluc3RhbmNlb2YgQm9vbGVhbnx8KHdbbFswXV09bmV3IEJvb2xlYW4od1tsWzBdXSkpLHdbbFswXV1bbFsxXV09byksZy5wdXNoKChvPyIiOiJuby0iKStsLmpvaW4oIi0iKSl9fWZ1bmN0aW9uIGkoZSl7dmFyIG49Uy5jbGFzc05hbWUsdD13Ll9jb25maWcuY2xhc3NQcmVmaXh8fCIiO2lmKF8mJihuPW4uYmFzZVZhbCksdy5fY29uZmlnLmVuYWJsZUpTQ2xhc3Mpe3ZhciBvPW5ldyBSZWdFeHAoIihefFxccykiK3QrIm5vLWpzKFxcc3wkKSIpO249bi5yZXBsYWNlKG8sIiQxIit0KyJqcyQyIil9dy5fY29uZmlnLmVuYWJsZUNsYXNzZXMmJihuKz0iICIrdCtlLmpvaW4oIiAiK3QpLF8/Uy5jbGFzc05hbWUuYmFzZVZhbD1uOlMuY2xhc3NOYW1lPW4pfWZ1bmN0aW9uIGwoZSxuKXtyZXR1cm4hIX4oIiIrZSkuaW5kZXhPZihuKX1mdW5jdGlvbiBmKCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIG4uY3JlYXRlRWxlbWVudD9uLmNyZWF0ZUVsZW1lbnQoYXJndW1lbnRzWzBdKTpfP24uY3JlYXRlRWxlbWVudE5TLmNhbGwobiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGFyZ3VtZW50c1swXSk6bi5jcmVhdGVFbGVtZW50LmFwcGx5KG4sYXJndW1lbnRzKX1mdW5jdGlvbiBhKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbYS16XSktKFthLXpdKS9nLGZ1bmN0aW9uKGUsbix0KXtyZXR1cm4gbit0LnRvVXBwZXJDYXNlKCl9KS5yZXBsYWNlKC9eLS8sIiIpfWZ1bmN0aW9uIHUoZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShuLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHAoZSxuLHQpe3ZhciBvO2Zvcih2YXIgcyBpbiBlKWlmKGVbc11pbiBuKXJldHVybiB0PT09ITE/ZVtzXToobz1uW2Vbc11dLHIobywiZnVuY3Rpb24iKT91KG8sdHx8bik6byk7cmV0dXJuITF9ZnVuY3Rpb24gZChlKXtyZXR1cm4gZS5yZXBsYWNlKC8oW0EtWl0pL2csZnVuY3Rpb24oZSxuKXtyZXR1cm4iLSIrbi50b0xvd2VyQ2FzZSgpfSkucmVwbGFjZSgvXm1zLS8sIi1tcy0iKX1mdW5jdGlvbiBjKCl7dmFyIGU9bi5ib2R5O3JldHVybiBlfHwoZT1mKF8/InN2ZyI6ImJvZHkiKSxlLmZha2U9ITApLGV9ZnVuY3Rpb24gbShlLHQsbyxyKXt2YXIgcyxpLGwsYSx1PSJtb2Rlcm5penIiLHA9ZigiZGl2IiksZD1jKCk7aWYocGFyc2VJbnQobywxMCkpZm9yKDtvLS07KWw9ZigiZGl2IiksbC5pZD1yP3Jbb106dSsobysxKSxwLmFwcGVuZENoaWxkKGwpO3JldHVybiBzPWYoInN0eWxlIikscy50eXBlPSJ0ZXh0L2NzcyIscy5pZD0icyIrdSwoZC5mYWtlP2Q6cCkuYXBwZW5kQ2hpbGQocyksZC5hcHBlbmRDaGlsZChwKSxzLnN0eWxlU2hlZXQ/cy5zdHlsZVNoZWV0LmNzc1RleHQ9ZTpzLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoZSkpLHAuaWQ9dSxkLmZha2UmJihkLnN0eWxlLmJhY2tncm91bmQ9IiIsZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixhPVMuc3R5bGUub3ZlcmZsb3csUy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixTLmFwcGVuZENoaWxkKGQpKSxpPXQocCxlKSxkLmZha2U/KGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSxTLnN0eWxlLm92ZXJmbG93PWEsUy5vZmZzZXRIZWlnaHQpOnAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKSwhIWl9ZnVuY3Rpb24geShuLHQpe3ZhciByPW4ubGVuZ3RoO2lmKCJDU1MiaW4gZSYmInN1cHBvcnRzImluIGUuQ1NTKXtmb3IoO3ItLTspaWYoZS5DU1Muc3VwcG9ydHMoZChuW3JdKSx0KSlyZXR1cm4hMDtyZXR1cm4hMX1pZigiQ1NTU3VwcG9ydHNSdWxlImluIGUpe2Zvcih2YXIgcz1bXTtyLS07KXMucHVzaCgiKCIrZChuW3JdKSsiOiIrdCsiKSIpO3JldHVybiBzPXMuam9pbigiIG9yICIpLG0oIkBzdXBwb3J0cyAoIitzKyIpIHsgI21vZGVybml6ciB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgfSB9IixmdW5jdGlvbihlKXtyZXR1cm4iYWJzb2x1dGUiPT1nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCkucG9zaXRpb259KX1yZXR1cm4gb31mdW5jdGlvbiB2KGUsbix0LHMpe2Z1bmN0aW9uIGkoKXtwJiYoZGVsZXRlIE4uc3R5bGUsZGVsZXRlIE4ubW9kRWxlbSl9aWYocz1yKHMsInVuZGVmaW5lZCIpPyExOnMsIXIodCwidW5kZWZpbmVkIikpe3ZhciB1PXkoZSx0KTtpZighcih1LCJ1bmRlZmluZWQiKSlyZXR1cm4gdX1mb3IodmFyIHAsZCxjLG0sdixoPVsibW9kZXJuaXpyIiwidHNwYW4iLCJzYW1wIl07IU4uc3R5bGUmJmgubGVuZ3RoOylwPSEwLE4ubW9kRWxlbT1mKGguc2hpZnQoKSksTi5zdHlsZT1OLm1vZEVsZW0uc3R5bGU7Zm9yKGM9ZS5sZW5ndGgsZD0wO2M+ZDtkKyspaWYobT1lW2RdLHY9Ti5zdHlsZVttXSxsKG0sIi0iKSYmKG09YShtKSksTi5zdHlsZVttXSE9PW8pe2lmKHN8fHIodCwidW5kZWZpbmVkIikpcmV0dXJuIGkoKSwicGZ4Ij09bj9tOiEwO3RyeXtOLnN0eWxlW21dPXR9Y2F0Y2goeCl7fWlmKE4uc3R5bGVbbV0hPXYpcmV0dXJuIGkoKSwicGZ4Ij09bj9tOiEwfXJldHVybiBpKCksITF9ZnVuY3Rpb24gaChlLG4sdCxvLHMpe3ZhciBpPWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxsPShlKyIgIitULmpvaW4oaSsiICIpK2kpLnNwbGl0KCIgIik7cmV0dXJuIHIobiwic3RyaW5nIil8fHIobiwidW5kZWZpbmVkIik/dihsLG4sbyxzKToobD0oZSsiICIrei5qb2luKGkrIiAiKStpKS5zcGxpdCgiICIpLHAobCxuLHQpKX1mdW5jdGlvbiB4KGUsbix0KXtyZXR1cm4gaChlLG8sbyxuLHQpfXZhciBnPVtdLGI9W10sQz17X3ZlcnNpb246IjMuMy4xIixfY29uZmlnOntjbGFzc1ByZWZpeDoiIixlbmFibGVDbGFzc2VzOiEwLGVuYWJsZUpTQ2xhc3M6ITAsdXNlUHJlZml4ZXM6ITB9LF9xOltdLG9uOmZ1bmN0aW9uKGUsbil7dmFyIHQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bih0W2VdKX0sMCl9LGFkZFRlc3Q6ZnVuY3Rpb24oZSxuLHQpe2IucHVzaCh7bmFtZTplLGZuOm4sb3B0aW9uczp0fSl9LGFkZEFzeW5jVGVzdDpmdW5jdGlvbihlKXtiLnB1c2goe25hbWU6bnVsbCxmbjplfSl9fSx3PWZ1bmN0aW9uKCl7fTt3LnByb3RvdHlwZT1DLHc9bmV3IHc7dmFyIFM9bi5kb2N1bWVudEVsZW1lbnQsXz0ic3ZnIj09PVMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxQPSJNb3ogTyBtcyBXZWJraXQiLFQ9Qy5fY29uZmlnLnVzZVByZWZpeGVzP1Auc3BsaXQoIiAiKTpbXTtDLl9jc3NvbVByZWZpeGVzPVQ7dmFyIHo9Qy5fY29uZmlnLnVzZVByZWZpeGVzP1AudG9Mb3dlckNhc2UoKS5zcGxpdCgiICIpOltdO0MuX2RvbVByZWZpeGVzPXo7dmFyIEU9e2VsZW06ZigibW9kZXJuaXpyIil9O3cuX3EucHVzaChmdW5jdGlvbigpe2RlbGV0ZSBFLmVsZW19KTt2YXIgTj17c3R5bGU6RS5lbGVtLnN0eWxlfTt3Ll9xLnVuc2hpZnQoZnVuY3Rpb24oKXtkZWxldGUgTi5zdHlsZX0pLEMudGVzdEFsbFByb3BzPWgsQy50ZXN0QWxsUHJvcHM9eCwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3giLAoJICAgICJwcm9wZXJ0eSI6ICJmbGV4Ym94IiwKCSAgICAiY2FuaXVzZSI6ICJmbGV4Ym94IiwKCSAgICAidGFncyI6IFsiY3NzIl0sCgkgICAgIm5vdGVzIjogW3sKCSAgICAgICJuYW1lIjogIlRoZSBfbmV3XyBmbGV4Ym94IiwKCSAgICAgICJocmVmIjogImh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2NzczMtZmxleGJveCIKCSAgICB9XSwKCSAgICAid2FybmluZ3MiOiBbCgkgICAgICAiQSBgdHJ1ZWAgcmVzdWx0IGZvciB0aGlzIGRldGVjdCBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZSBgZmxleC13cmFwYCBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQ7IHNlZSB0aGUgYGZsZXh3cmFwYCBkZXRlY3QuIgoJICAgIF0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94Iix4KCJmbGV4QmFzaXMiLCIxcHgiLCEwKSksLyohCgkgIHsKCSAgICAibmFtZSI6ICJGbGV4Ym94IChsZWdhY3kpIiwKCSAgICAicHJvcGVydHkiOiAiZmxleGJveGxlZ2FjeSIsCgkgICAgInRhZ3MiOiBbImNzcyJdLAoJICAgICJwb2x5ZmlsbHMiOiBbImZsZXhpZSJdLAoJICAgICJub3RlcyI6IFt7CgkgICAgICAibmFtZSI6ICJUaGUgX29sZF8gZmxleGJveCIsCgkgICAgICAiaHJlZiI6ICJodHRwczovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLWZsZXhib3gtMjAwOTA3MjMvIgoJICAgIH1dCgkgIH0KCSAgISovCncuYWRkVGVzdCgiZmxleGJveGxlZ2FjeSIseCgiYm94RGlyZWN0aW9uIiwicmV2ZXJzZSIsITApKSwvKiEKCSAgewoJICAgICJuYW1lIjogIkZsZXhib3ggKHR3ZWVuZXIpIiwKCSAgICAicHJvcGVydHkiOiAiZmxleGJveHR3ZWVuZXIiLAoJICAgICJ0YWdzIjogWyJjc3MiXSwKCSAgICAicG9seWZpbGxzIjogWyJmbGV4aWUiXSwKCSAgICAibm90ZXMiOiBbewoJICAgICAgIm5hbWUiOiAiVGhlIF9pbmJldHdlZW5fIGZsZXhib3giLAoJICAgICAgImhyZWYiOiAiaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTEvV0QtY3NzMy1mbGV4Ym94LTIwMTExMTI5LyIKCSAgICB9XSwKCSAgICAid2FybmluZ3MiOiBbIlRoaXMgcmVwcmVzZW50cyBhbiBvbGQgc3ludGF4LCBub3QgdGhlIGxhdGVzdCBzdGFuZGFyZCBzeW50YXguIl0KCSAgfQoJICAhKi8Kdy5hZGRUZXN0KCJmbGV4Ym94dHdlZW5lciIseCgiZmxleEFsaWduIiwiZW5kIiwhMCkpLHMoKSxpKGcpLGRlbGV0ZSBDLmFkZFRlc3QsZGVsZXRlIEMuYWRkQXN5bmNUZXN0O2Zvcih2YXIgaj0wO2o8dy5fcS5sZW5ndGg7aisrKXcuX3Fbal0oKTtlLk1vZGVybml6cj13fSh3aW5kb3csZG9jdW1lbnQpfX0pOzt2YXIgUGRhQ2xpZW50QVBJPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBpPW5bcl09e2V4cG9ydHM6e30saWQ6cixsb2FkZWQ6ITF9O3JldHVybiBlW3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLHQpLGkubG9hZGVkPSEwLGkuZXhwb3J0c312YXIgbj17fTtyZXR1cm4gdC5tPWUsdC5jPW4sdC5wPSIiLHQoMCl9KFtmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMTYpfSwsLCwsLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lfHx3aW5kb3cuZXZlbnQ7cmV0dXJuIG4odCl9O2lmKGUuYWRkRXZlbnRMaXN0ZW5lcillLmFkZEV2ZW50TGlzdGVuZXIodCxyLCEwKTtlbHNlIGlmKHQ9Im9uIit0LGUuYXR0YWNoRXZlbnQpZS5hdHRhY2hFdmVudCh0LHIpO2Vsc2V7dmFyIGk9ZVt0XTtlW3RdPWZ1bmN0aW9uKCl7ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksImZ1bmN0aW9uIj09dHlwZW9mIGkmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19fSwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYT1uKDkpLHU9cihhKSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtpZihpKHRoaXMsZSksdGhpcy53aW5kb3c9dC53aW5kb3d8fCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3csIXRoaXMud2luZG93fHwhdGhpcy53aW5kb3cuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJXaW5kb3cgYW5kL29yIGRvY3VtZW50IGlzIG5vdCBkZWZpbmVkIik7dGhpcy5kYWN4TG9nZ2VyPXQuZGFjeExvZ2dlcnx8bmV3IHVbImRlZmF1bHQiXSh0LmJhc2VVcmwsdC5pbXByZXNzaW9uSWQsdC5hZFNlc3Npb25JZCksdGhpcy5haWQ9dC5hZElkLHRoaXMuY2lkPXQuY3JlYXRpdmVJZCx0aGlzLmRhY3hMb2dnZXIubG9nSW1wcmVzc2lvbigpfXJldHVybiBvKGUsW3trZXk6ImF0dGFjaEdsb2JhbHMiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy53aW5kb3cuZG9jdW1lbnQuYWQ9e2FpZDp0aGlzLmFkSWQsY2lkOnRoaXMuY3JlYXRpdmVJZH0sdGhpcy53aW5kb3cuRGFjeExvZ2dlcj10aGlzLmRhY3hMb2dnZXJ9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBpKGUsdCxuKXtyZXR1cm4gdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gYShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIHUoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj1uZXcgZlsiZGVmYXVsdCJdKGUsZCkscj17aTp0LmRhY3hJbXByZXNzaW9uSWQsYXNpOnQuZGFjeFNlc3Npb25JZCxjbGljazoxfTtyZXR1cm4gbi5nZXRQaXhlbFVybChyKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCk7dC5nZW5lcmF0ZURhY3hDbGlja1RyYWNrZXJVcmw9Yzt2YXIgcz1uKDEwKSxmPXIocyksZD0iNDE2NzMxNjEzIixwPSJjbGllbnRfaW1wIixoPSJ2aWV3Iix2PSJzd2lwZSIseT0tMSxnPTEsdz0yLG09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4scil7byh0aGlzLHQpO3ZhciBpPWEodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUsZCkpO3JldHVybiBpLmltcHJlc3Npb25JZD1uLGkuYWRTZXNzaW9uSWQ9cixpfXJldHVybiB1KHQsZSksbCh0LFt7a2V5OiJsb2dNZXRyaWMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49aSh7aTp0aGlzLmltcHJlc3Npb25JZCxhc2k6dGhpcy5hZFNlc3Npb25JZH0sZSx0fHwxKTt0aGlzLmZpcmVQaXhlbChuKX19LHtrZXk6ImxvZ0ltcHJlc3Npb24iLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMocCl9fSx7a2V5OiJsb2dWaWV3YWJpbGl0eVN1Y2Nlc3MiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMoaCxnKX19LHtrZXk6ImxvZ0JhcmVWaWV3YWJpbGl0eVN1Y2Nlc3MiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWMoaCx3KX19LHtrZXk6ImxvZ1ZpZXdhYmlsaXR5RmFpbHVyZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvZ01ldHJpYyhoLHkpfX0se2tleToibG9nU3dpcGUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5sb2dNZXRyaWModil9fV0pLHR9KGZbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPW19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxvPW4oMTEpLmdldFF1ZXJ5U3RyaW5nLGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbil7cih0aGlzLGUpLHRoaXMuYmFzZVVybD10LHRoaXMuY2hhbm5lbD1ufXJldHVybiBpKGUsW3trZXk6ImdldFBpeGVsVXJsIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0iPyIrZW5jb2RlVVJJQ29tcG9uZW50KG8oZSkpO3JldHVybiB0aGlzLmJhc2VVcmwrIi9pdTM/ZD1mb3Jlc3Rlci1kaWQmZXgtZmNoPSIrdGhpcy5jaGFubmVsKyImZXgtZmFyZ3M9Iit0KyImY2I9IisobmV3IERhdGUpLmdldFRpbWUoKX19LHtrZXk6ImZpcmVQaXhlbCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEltYWdlO3JldHVybiB0LnNyYz10aGlzLmdldFBpeGVsVXJsKGUpLHR9fV0pLGV9KCk7dFsiZGVmYXVsdCJdPWF9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0KXt2YXIgbj1bXTtmb3IodmFyIHIgaW4gZSluLnB1c2gocisiPSIrZVtyXSk7dmFyIGk9bi5qb2luKCImIik7cmV0dXJuIHQ/ZW5jb2RlVVJJQ29tcG9uZW50KGkpOml9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7cj5uO24rKyl0KGVbbl0sbixlKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5nZXRRdWVyeVN0cmluZz1uLHQuZm9yRWFjaD1yfSwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGM9ZnVuY3Rpb24gYihlLHQsbil7bnVsbD09PWUmJihlPUZ1bmN0aW9uLnByb3RvdHlwZSk7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHZvaWQgMD09PXIpe3ZhciBpPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PWk/dm9pZCAwOmIoaSx0LG4pfWlmKCJ2YWx1ZSJpbiByKXJldHVybiByLnZhbHVlO3ZhciBvPXIuZ2V0O2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8uY2FsbChuKX0sbD1uKDgpLHM9cihsKSxmPW4oMTcpLGQ9cihmKSxwPW4oMTgpLGg9cihwKSx2PW4oMTkpLHk9cih2KSxnPW4oNiksdz1bIlRFVFJJU19JTkxJTkVfTUVTU0FHSU5HIl0sbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe2kodGhpcyx0KTt2YXIgbj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSk7cmV0dXJuIG4uc2hhemFtTG9nZ2VyPWUuc2hhemFtTG9nZ2VyfHxuZXcgZFsiZGVmYXVsdCJdKGUuYmFzZVVybCxlKSxuLnNoYXphbUxvZ2dlci5sb2dJbXByZXNzaW9uKCksbi5jcmVhdGl2ZUNsaWNrTG9nZ2VyPWUuY3JlYXRpdmVDbGlja0xvZ2dlcnx8bmV3IHlbImRlZmF1bHQiXShlLmJhc2VVcmwsZS5pbXByZXNzaW9uSWQpLG4udGVtcGxhdGVOYW1lPWUudGVtcGxhdGVOYW1lLG59cmV0dXJuIGEodCxlKSx1KHQsW3trZXk6ImF0dGFjaEdsb2JhbHMiLHZhbHVlOmZ1bmN0aW9uKCl7Yyh0LnByb3RvdHlwZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSksImF0dGFjaEdsb2JhbHMiLHRoaXMpLmNhbGwodGhpcyksdGhpcy53aW5kb3cuU2hhemFtTG9nZ2VyPXRoaXMuc2hhemFtTG9nZ2VyLHRoaXMud2luZG93LlZpZXdhYmlsaXR5PWhbImRlZmF1bHQiXX19LHtrZXk6InRyYWNrTG9hZExhdGVuY3kiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnNoYXphbUxvZ2dlci5zdGFydFRpbWVyKGRbImRlZmF1bHQiXS5FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpLCgwLGcuYWRkTGlzdGVuZXIpKHRoaXMud2luZG93LCJsb2FkIixmdW5jdGlvbih0KXtlLnNoYXphbUxvZ2dlci5lbmRUaW1lcihkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuQ1JFQVRJVkVfTE9BRF9MQVRFTkNZKX0pfX0se2tleToiYWRkRXJyb3JMaXN0ZW5lciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMud2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24odCxuLHIsaSxvKXtpZihvJiZvLnN0YWNrKXt2YXIgYT10KyIgOiAiK28uc3RhY2s7ZS5zaGF6YW1Mb2dnZXIuYWRkQ291bnQoZFsiZGVmYXVsdCJdLkVWRU5UX05BTUVTLlVOQ0FVR0hUX0VSUk9SLGEubGVuZ3RoPDUwMD9hOmEuc3Vic3RyaW5nKDAsNTAwKSl9ZWxzZSBlLnNoYXphbUxvZ2dlci5hZGRDb3VudChkWyJkZWZhdWx0Il0uRVZFTlRfTkFNRVMuVU5DQVVHSFRfRVJST1IsdCsiIDogIituKX19fSx7a2V5OiJhZGRWaWV3YWJpbGl0eUxpc3RlbmVyIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49LjUscj0xZTMsaT0uMDEsbz0xLGE9bmV3IGhbImRlZmF1bHQiXShlLHRoaXMud2luZG93KTthLmdldFBlcmNlbnRJblZpZXcoKTw9LTE/dGhpcy5kYWN4TG9nZ2VyLmxvZ1ZpZXdhYmlsaXR5RmFpbHVyZSgpOihhLm9uVmlldyhpLG8sZnVuY3Rpb24oKXtyZXR1cm4gdC5kYWN4TG9nZ2VyLmxvZ0JhcmVWaWV3YWJpbGl0eVN1Y2Nlc3MoKX0pLGEub25WaWV3KG4scixmdW5jdGlvbigpe3JldHVybiB0LmRhY3hMb2dnZXIubG9nVmlld2FiaWxpdHlTdWNjZXNzKCl9KSl9fSx7a2V5OiJhZGRDcmVhdGl2ZUNsaWNrTGlzdGVuZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dy5pbmRleE9mKHRoaXMudGVtcGxhdGVOYW1lKT49MCYmKDAsZy5hZGRMaXN0ZW5lcikoZSwiY2xpY2siLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXt0LmNyZWF0aXZlQ2xpY2tMb2dnZXIubG9nQ2xpY2sobixlLm9mZnNldFdpZHRoLGUub2Zmc2V0SGVpZ2h0KX19KGUpKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09bX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIGkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGM9ZnVuY3Rpb24geShlLHQsbil7bnVsbD09PWUmJihlPUZ1bmN0aW9uLnByb3RvdHlwZSk7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHZvaWQgMD09PXIpe3ZhciBpPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PWk/dm9pZCAwOnkoaSx0LG4pfWlmKCJ2YWx1ZSJpbiByKXJldHVybiByLnZhbHVlO3ZhciBvPXIuZ2V0O2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8uY2FsbChuKX0sbD1uKDEwKSxzPXIobCksZj0uMSxkPSJjbG1ldCIscD0iZGEtY3gtbWV0cmljcyIsaD1bInNoYXphbUlkIiwidGVtcGxhdGVOYW1lIiwibG9jYWxlIiwiYWRTZXJ2ZXIiLCJ0ZW1wbGF0ZU1ham9yVmVyc2lvbiIsInRlbXBsYXRlTWlub3JWZXJzaW9uIiwiYWRJZCIsImNyZWF0aXZlSWQiLCJpbXByZXNzaW9uSWQiXSx2PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSxuKXtpKHRoaXMsdCk7dmFyIHI9byh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSxwKSk7cmV0dXJuIHIuc2hvdWxkRmlyZU1ldHJpY3M9TWF0aC5yYW5kb20oKTw9ZixyLnRpbWVycz17fSxyLmFkSW5mbz1uLGguZm9yRWFjaChmdW5jdGlvbihlKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sZSkpdGhyb3cgbmV3IEVycm9yKCJTaGF6YW1Mb2dnZXIgbWlzc2luZyBhZEluZm8gcHJvcGVydHk6ICIrZSl9KSxyfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJmaXJlUGl4ZWwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuc2hvdWxkRmlyZU1ldHJpY3MmJihlLmk9ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYWRJbmZvLmltcHJlc3Npb25JZCksZS5hcHA9ZW5jb2RlVVJJQ29tcG9uZW50KGQpLGModC5wcm90b3R5cGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLCJmaXJlUGl4ZWwiLHRoaXMpLmNhbGwodGhpcyxlKSl9fSx7a2V5OiJsb2dFdmVudCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O2lmKG51bGwhPWUmJm51bGwhPXQpe3RyeXtuJiYoci50eXBlPW4pLHIuZW49ZSxyLmV2PUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKGkpe3Iuc3RyaW5naWZ5Tm90QXZhaWxhYmxlPTF9dGhpcy5maXJlUGl4ZWwocil9fX0se2tleToibG9nSW1wcmVzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFkSW5mbyx0PXtzOmUuc2hhemFtSWQsbjplbmNvZGVVUklDb21wb25lbnQoZS50ZW1wbGF0ZU5hbWUpLGw6ZS5sb2NhbGUsYXM6ZS5hZFNlcnZlcix0bWp2OmUudGVtcGxhdGVNYWpvclZlcnNpb24sdG1udjplLnRlbXBsYXRlTWlub3JWZXJzaW9uLGFpOmUuYWRJZCxjaTplLmNyZWF0aXZlSWQsaTplLmltcHJlc3Npb25JZCxpbXA6MX07bmF2aWdhdG9yJiYodC51YT1lbmNvZGVVUklDb21wb25lbnQobmF2aWdhdG9yLnVzZXJBZ2VudCkpLHRoaXMuZmlyZVBpeGVsKHQpfX0se2tleToic3RhcnRUaW1lciIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy50aW1lcnNbZV09bmV3IERhdGV9fSx7a2V5OiJlbmRUaW1lciIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy50aW1lcnNbZV0pe3ZhciBuPW5ldyBEYXRlLXRoaXMudGltZXJzW2VdO3RoaXMubG9nRXZlbnQoZSxuLHQuRVZFTlRfVFlQRVMuVElNRVIpLGRlbGV0ZSB0aGlzLnRpbWVyc1tlXX19fSx7a2V5OiJhZGRDb3VudCIsdmFsdWU6ZnVuY3Rpb24oZSxuKXtuPW58fDEsdGhpcy5sb2dFdmVudChlLG4sdC5FVkVOVF9UWVBFUy5DT1VOVEVSKX19XSksdH0oc1siZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09dix2LkVWRU5UX1RZUEVTPXtUSU1FUjoidGltZXIiLENPVU5URVI6ImNvdW50ZXIiLEpTT046Impzb24ifSx2LkVWRU5UX05BTUVTPXtCVVlfQk9YX0xPQURfTEFURU5DWToiQnV5Qm94TG9hZExhdGVuY3kiLEFBTl9MQVRFTkNZOiJBYW5MYXRlbmN5IixBQU5fRVJST1I6IkFhbkVycm9yIixEUk9QX0RPV05fU0VMRUNUT1I6IkRyb3BEb3duU2VsZWN0b3IiLFVOQ0FVR0hUX0VSUk9SOiJVbmNhdWdodEVycm9yIixVTkRFRklORURfVFJBQ0tFUl9BUkc6IlVuZGVmaW5lZFRyYWNrZXJBcmciLENPT1JESU5BVE9SX1RSQUNLRVI6IkNvb3JkaW5hdG9yVHJhY2tlciIsSU1BR0VfTE9BRF9MQVRFTkNZOiJJbWFnZUxvYWRMYXRlbmN5IixDUkVBVElWRV9MT0FEX0xBVEVOQ1k6IkNyZWF0aXZlTG9hZExhdGVuY3kifX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHIoZSx0KXt2YXIgbj1pKHQpLHI9byh0KSx1PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz1hKHUudG9wLHUuYm90dG9tLG4pLGw9YSh1LmxlZnQsdS5yaWdodCxyKSxzPWMqbCxmPSh1LmJvdHRvbS11LnRvcCkqKHUucmlnaHQtdS5sZWZ0KTtyZXR1cm4gTWF0aC5taW4oMSxNYXRoLm1heCgwLHMvZikpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUuaW5uZXJIZWlnaHR8fGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodH1mdW5jdGlvbiBvKGUpe3JldHVybiBlLmlubmVyV2lkdGh8fGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRofWZ1bmN0aW9uIGEoZSx0LG4pe3ZhciByPTA7cmV0dXJuIHI9ZT4wP24tZTp0PjA/TWF0aC5taW4odCxuKTowLE1hdGgubWluKHIsdC1lKX1mdW5jdGlvbiB1KGUpe3ZhciB0PW51bGwsbj1mdW5jdGlvbiByKCl7ZSgpfHwodD1zZXRUaW1lb3V0KHIsMTAwKSl9O3JldHVybiBuKCkse2NsZWFyOmZ1bmN0aW9uKCl7dCYmY2xlYXJUaW1lb3V0KHQpfX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscil7bih0aGlzLGUpLHRoaXMud2luZG93PXJ8fHdpbmRvdyx0aGlzLmVsZW09dH1yZXR1cm4gYyhlLFt7a2V5OiJnZXRQZXJjZW50SW5WaWV3Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VG9wV2luZG93KCk7aWYoZSl7aWYodGhpcy53aW5kb3c9PT1lKXJldHVybiByKHRoaXMuZWxlbSxlKTtpZih0aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQpcmV0dXJuIHIodGhpcy53aW5kb3cuZnJhbWVFbGVtZW50LGUpfWVsc2UgaWYodGhpcy53aW5kb3cuJHNmKXRyeXt2YXIgdD10aGlzLndpbmRvdy4kc2YuZXh0LmluVmlld1BlcmNlbnRhZ2UoKXx8MDtyZXR1cm4gdC8xMDB9Y2F0Y2gobil7fXJldHVybi0xfX0se2tleToiZ2V0VG9wV2luZG93Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPW51bGw7dHJ5e2lmKCF0aGlzLndpbmRvdy50b3AuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJjcm9zcy1kb21haW4gZXhjZXB0aW9uIik7ZT10aGlzLndpbmRvdy50b3B9Y2F0Y2godCl7fXJldHVybiBlfX0se2tleToib25WaWV3VGhyZXNob2xkIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLG89bnVsbDtyZXR1cm4gdShmdW5jdGlvbigpe2lmKGkuZ2V0UGVyY2VudEluVmlldygpPj1lJiZpLmdldFBlcmNlbnRJblZpZXcoKTw9dCl7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7aWYobnVsbD09PW8pbz1hO2Vsc2UgaWYoYS1vPm4pcmV0dXJuIHIoKSwhMH1lbHNlIG89bnVsbH0pfX0se2tleToib25WaWV3Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub25WaWV3VGhyZXNob2xkKGUsMSx0LG4pfX0se2tleToib25IaWRlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub25WaWV3VGhyZXNob2xkKDAsZSx0LG4pfX0se2tleToiZ2V0VmVydGljYWxQb3NpdGlvbk9uUGFnZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0tMSx0PXRoaXMuZ2V0VG9wV2luZG93KCk7aWYodCl7aWYodGhpcy53aW5kb3c9PT10KXt2YXIgbj10aGlzLmVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLHI9aSh0KSxvPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7ZT1NYXRoLm1heChNYXRoLm1pbihuLyhyLW8pLDEpLDApfWVsc2UgaWYodGhpcy53aW5kb3cuZnJhbWVFbGVtZW50KXt2YXIgbj10aGlzLndpbmRvdy5mcmFtZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLHI9aSh0KSxvPXRoaXMud2luZG93LmZyYW1lRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7ZT1NYXRoLm1heChNYXRoLm1pbihuLyhyLW8pLDEpLDApfX1lbHNlIGlmKHRoaXMud2luZG93LiRzZil0cnl7ZT1NYXRoLm1heChNYXRoLm1pbigkc2YuZXh0Lmdlb20oKS5zZWxmLnQvKCRzZi5leHQuZ2VvbSgpLndpbi5oLSRzZi5leHQuZ2VvbSgpLnNlbGYuaCksMSksMCl9Y2F0Y2goYSl7fXJldHVybiBlfX1dKSxlfSgpO3RbImRlZmF1bHQiXT1sfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gaShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksYz1mdW5jdGlvbiB2KGUsdCxuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYodm9pZCAwPT09cil7dmFyIGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09aT92b2lkIDA6dihpLHQsbil9aWYoInZhbHVlImluIHIpcmV0dXJuIHIudmFsdWU7dmFyIG89ci5nZXQ7aWYodm9pZCAwIT09bylyZXR1cm4gby5jYWxsKG4pfSxsPW4oMTApLHM9cihsKSxmPSJkYS1jeC1tZXRyaWNzIixkPSJDb29yZGluYXRlQ2xpY2siLHA9Impzb24iLGg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4pe2kodGhpcyx0KTt2YXIgcj1vKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlLGYpKTtyZXR1cm4gci5pbXByZXNzaW9uSWQ9bixyfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJsb2dDbGljayIsdmFsdWU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXt9LG89e2N4YzplLnBhZ2VYLGN5YzplLnBhZ2VZLGNwdzpuLGNwaDpyfTtpLmVuPWQsaS50eXBlPXAsaS5pPXRoaXMuaW1wcmVzc2lvbklkO3RyeXtpLmV2PWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvKSl9Y2F0Y2goYSl7aS5zdHJpbmdpZnlOb3RBdmFpbGFibGU9MX1jKHQucHJvdG90eXBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQucHJvdG90eXBlKSwiZmlyZVBpeGVsIix0aGlzKS5jYWxsKHRoaXMsaSl9fV0pLHR9KHNbImRlZmF1bHQiXSk7dFsiZGVmYXVsdCJdPWh9XSk7O3dpbmRvdy5wZGFnU2NvcGUgPSB3aW5kb3cucGRhZ1Njb3BlIHx8IHt9O3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJID0gbmV3IFBkYUNsaWVudEFQSS5kZWZhdWx0KHsiYmFzZVVybCI6Imh0dHBzOi8vcy5hbWF6b24tYWRzeXN0ZW0uY29tIiwic2hhemFtSWQiOiI3OTI1ODUwIiwidGVtcGxhdGVOYW1lIjoiVEVUUklTX01PQklMRV9NWVNUSVFVRSIsInRlbXBsYXRlTWFqb3JWZXJzaW9uIjoiMSIsInRlbXBsYXRlTWlub3JWZXJzaW9uIjoiOCIsImxvY2FsZSI6IlVTIiwiYWRTZXJ2ZXIiOiJjb3JuZXJzdG9uZSIsImFkSWQiOiI0NTMzMDc3ODEwNzAxIiwiY3JlYXRpdmVJZCI6IjE4NDkwODExNjA3MDEiLCJpbXByZXNzaW9uSWQiOiJpcmJDbjVxangxWVZkbFhqaTg1VGdnIiwiYWRTZXNzaW9uSWQiOiIwMTAxYjBkZDllOWVkNmU0ZDE0ZWU1OTJkMTQzMDcyYzUwNWE1M2UxZTNlNzZhNjUzYWI2NjNmYTAxMGZlYzk5MDM4NiJ9KTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS50cmFja0xvYWRMYXRlbmN5KCk7d2luZG93LnBkYWdTY29wZS5jbGllbnRBUEkuYXR0YWNoR2xvYmFscygpO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLmFkZEVycm9yTGlzdGVuZXIoKTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+PGRpdiBpZD1hZD48ZGl2IGNsYXNzPSJtb2JpbGVNeXN0aXF1ZSB0ZW1wbGF0ZUNvbnRhaW5lciIgZGF0YS1jcmVhdGl2ZS1pZD0iMTg0OTA4MTE2MDcwMSIgZGF0YS1hZC1pZD0iNDUzMzA3NzgxMDcwMSIgZGF0YS1yZWFjdHJvb3Q9IiIgZGF0YS1yZWFjdGlkPSIxIiBkYXRhLXJlYWN0LWNoZWNrc3VtPSI2NzU4MjM4NjQiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIHRlbXBsYXRlQ29udGFpbmVyX19saW5rIiBocmVmPSJodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1FvcTJ3cC1hbzhkV0ZYWlY0NHZPVTRJQUFBRmhtZUU0MGdFQUFBR1FBUnQxd2tjL2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vZHAvMTUwODc2NzQ4Mz9hYXhpdGs9c3NHNFdGeVhwdS5kaFhFeDEuT0c5dyIgdGFyZ2V0PSJfdG9wIiByZWw9Im5vZm9sbG93IiBkYXRhLXJlYWN0aWQ9IjIiPjwvYT48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEyNXB4O2JvcmRlcjoxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNGRkZGRkY7IiBkYXRhLXJlYWN0aWQ9IjMiPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0id2lkdGg6MTYwcHg7aGVpZ2h0OjEwMCU7cGFkZGluZzo1cHggMTBweCA1cHggMTBweDtmbGV4OjAgMCAxMjVweDsiIGRhdGEtcmVhY3RpZD0iNCI+PGRpdiBjbGFzcz0iYXNpbkltYWdlIiBkYXRhLXJlYWN0aWQ9IjUiPjxhIGNsYXNzPSJjbGlja3Rocm91Z2hMaW5rIGFzaW5JbWFnZSIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Rb3Eyd3AtYW84ZFdGWFpWNDR2T1U0SUFBQUZobWVFNDBnRUFBQUdRQVJ0MXdrYy9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPXNzRzRXRnlYcHUuZGhYRXgxLk9HOXciIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSI2Ij48ZGl2IGNsYXNzPSJpbWFnZUNvbnRhaW5lciIgZGF0YS1yZWFjdGlkPSI3Ij48aW1nIGNsYXNzPSJtZWRpYUNlbnRyYWxJbWFnZSBpbWFnZUNvbnRhaW5lcl9faW1hZ2UiIHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0kvNTFWelNkanJpT0wuX0FDX1NYMTYwXy5qcGciIGFsdD0iTGVhcm4gUy5RLkwuIGZyb20gdGhlIGV4cGVydHMgaW4gdGhlIHByZW1pZXIgZ3VpZGUgZm9yIGJlZ2lubmVycyIgZGF0YS1yZWFjdGlkPSI4Ii8+PC9kaXY+PC9hPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0id2lkdGg6MTAwJTtiYWNrZ3JvdW5kOiNGRkZGRkY7YmFja2dyb3VuZDotd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDI1NSwyNTUsMjU1LDEpLCByZ2JhKDI1NSwyNTUsMjU1LDApIDI1JSwgcmdiYSgyNTUsMjU1LDI1NSwwKSksIC13ZWJraXQtbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpO2JhY2tncm91bmQ6LW8tbGluZWFyLWdyYWRpZW50KHJpZ2h0LCByZ2JhKDI1NSwyNTUsMjU1LDEpLCByZ2JhKDI1NSwyNTUsMjU1LDApIDI1JSwgcmdiYSgyNTUsMjU1LDI1NSwwKSksIC1vLWxpbmVhci1ncmFkaWVudCgjRkZGRkZGLCAjRUJFQkVCKTtiYWNrZ3JvdW5kOi1tb3otbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI1NSwyNTUsMjU1LDEpLCByZ2JhKDI1NSwyNTUsMjU1LDApIDI1JSwgcmdiYSgyNTUsMjU1LDI1NSwwKSksIGxpbmVhci1ncmFkaWVudCgjRkZGRkZGLCAjRUJFQkVCKTsiIGRhdGEtcmVhY3RpZD0iOSI+PGRpdiBjbGFzcz0iYmxvY2sgYmxvY2stLWp1c3RpZnktY2VudGVyIGJsb2NrLS1kaXJlY3Rpb24tY29sdW1uIiBzdHlsZT0id2lkdGg6MTAwJTtwYWRkaW5nOjAgMTBweCAwIDA7IiBkYXRhLXJlYWN0aWQ9IjEwIj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDAgNXB4IDA7IiBkYXRhLXJlYWN0aWQ9IjExIj48YSBjbGFzcz0iY2xpY2t0aHJvdWdoTGluayB0ZXh0TGluayB0ZXh0TGluay0tZGlzcGxheUFzVGV4dCIgaHJlZj0iaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Rb3Eyd3AtYW84ZFdGWFpWNDR2T1U0SUFBQUZobWVFNDBnRUFBQUdRQVJ0MXdrYy9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPXNzRzRXRnlYcHUuZGhYRXgxLk9HOXciIHRhcmdldD0iX3RvcCIgcmVsPSJub2ZvbGxvdyIgZGF0YS1yZWFjdGlkPSIxMiI+PGRpdiBzdHlsZT0iZm9udC1zaXplOjE4cHg7Zm9udC1zdHlsZTppdGFsaWM7Y29sb3I6IzU1NTtsaW5lLWhlaWdodDoyMHB4OyIgY2xhc3M9InRleHRDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iMTMiPjxzcGFuIGNsYXNzPSJ0ZXh0Q29udGFpbmVyX190ZXh0IiBkYXRhLXJlYWN0aWQ9IjE0Ij5Ucm91YmxlIGxldmVyYWdpbmcgeW91ciBkYXRhPzwvc3Bhbj48L2Rpdj48L2E+PC9kaXY+PGRpdiBjbGFzcz0iYmxvY2siIHN0eWxlPSJtYXJnaW46MCAwIDVweCAwOyIgZGF0YS1yZWFjdGlkPSIxNSI+PGEgY2xhc3M9ImNsaWNrdGhyb3VnaExpbmsgdGV4dExpbmsiIGhyZWY9Imh0dHBzOi8vYWF4LXVzLWVhc3QuYW1hem9uLWFkc3lzdGVtLmNvbS94L2MvUW9xMndwLWFvOGRXRlhaVjQ0dk9VNElBQUFGaG1lRTQwZ0VBQUFHUUFSdDF3a2MvaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9kcC8xNTA4NzY3NDgzP2FheGl0az1zc0c0V0Z5WHB1LmRoWEV4MS5PRzl3IiB0YXJnZXQ9Il90b3AiIHJlbD0ibm9mb2xsb3ciIGRhdGEtcmVhY3RpZD0iMTYiPjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OjYwMDsiIGNsYXNzPSJ0ZXh0Q29udGFpbmVyIGgtZWxsaXBzaXMiIGRhdGEtcmVhY3RpZD0iMTciPjxzcGFuIGNsYXNzPSJ0ZXh0Q29udGFpbmVyX190ZXh0IiBkYXRhLXJlYWN0aWQ9IjE4Ij5MZWFybiBTLlEuTC4gZnJvbSB0aGUgZXhwZXJ0cyBpbiB0aGUgcHJlbWllciBndWlkZSBmb3IgYmVnaW5uZXJzPC9zcGFuPjwvZGl2PjwvYT48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayBibG9jay0taW5saW5lICIgc3R5bGU9IndoaXRlLXNwYWNlOm5vcm1hbDsiIGRhdGEtcmVhY3RpZD0iMTkiPjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luOjAgNXB4IDAgMDsiIGRhdGEtcmVhY3RpZD0iMjAiPjxzcGFuIGNsYXNzPSJwcmljZUJveCIgZGF0YS1yZWFjdGlkPSIyMSI+PHNwYW4gY2xhc3M9InByaWNlIHByaWNlQm94X19idXkiIHN0eWxlPSJmb250LXNpemU6MTVweDsiIGRhdGEtcmVhY3RpZD0iMjIiPjxzcGFuIGNsYXNzPSJwcmljZV9fY3VycmVuY3kiIGRhdGEtcmVhY3RpZD0iMjMiPiQ8L3NwYW4+PHNwYW4gY2xhc3M9InByaWNlX19hbW91bnQiIGRhdGEtcmVhY3RpZD0iMjQiPjE0Ljk5PC9zcGFuPjwvc3Bhbj48IS0tIHJlYWN0LXRleHQ6IDI1IC0tPjwhLS0gL3JlYWN0LXRleHQgLS0+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9ImJsb2NrIiBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZTsiIGRhdGEtcmVhY3RpZD0iMjYiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIHByaW1lTG9nbyIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9kYS9jcmVhdGl2ZXMvcHJpbWUtMngtMjAxNzA2MTQucG5nIiB3aWR0aD0iNDMiIGhlaWdodD0iMTIiIGFsdD0iUHJpbWUiIGRhdGEtcmVhY3RpZD0iMjciLz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbjowIDEwcHggMCAxMHB4O2hlaWdodDoxMjNweDtvcGFjaXR5OjAuNjQ7ZmxleDowIDAgOXB4OyIgZGF0YS1yZWFjdGlkPSIyOCI+PGRpdiBjbGFzcz0iaW1hZ2VDb250YWluZXIiIGRhdGEtcmVhY3RpZD0iMjkiPjxpbWcgY2xhc3M9Im1lZGlhQ2VudHJhbEltYWdlIGltYWdlQ29udGFpbmVyX19pbWFnZSIgc3JjPSJodHRwczovL20ubWVkaWEtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9BbWF6b25CcmFuZFN0b3Jlc1BsYXRmb3JtL2JsYWNrX2Fycm93LnBuZyIgYWx0PSJHcmF5IEFycm93IiByb2xlPSJwcmVzZW50YXRpb24iIGRhdGEtcmVhY3RpZD0iMzAiLz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC0xNS4zLjIubWluLmpzIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvZGFjeC9qcy9yZWFjdC1kb20tMTUuMy4yLm1pbi5qcyI+PC9zY3JpcHQ+PHNjcmlwdD52YXIgTGlicmFyeT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgbz1uW3JdPXtleHBvcnRzOnt9LGlkOnIsbG9hZGVkOiExfTtyZXR1cm4gZVtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyx0KSxvLmxvYWRlZD0hMCxvLmV4cG9ydHN9dmFyIG49e307cmV0dXJuIHQubT1lLHQuYz1uLHQucD0iIix0KDApfShbZnVuY3Rpb24oZSx0LG4pe24oMSksZS5leHBvcnRzPW4oMTAwKX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24mJihPYmplY3QuYXNzaWduPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIG49T2JqZWN0KGUpLHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgbz1hcmd1bWVudHNbcl07aWYobnVsbCE9bylmb3IodmFyIGkgaW4gbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobyxpKSYmKG5baV09b1tpXSl9cmV0dXJuIG59KX0sLGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPVJlYWN0fSwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDYpLGM9cihwKSxmPW4oMjcpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucHJvcHMudXBkYXRlT25SZXNpemUmJnRoaXMubGlzdGVuRm9yUmVzaXplKCl9fSx7a2V5OiJsaXN0ZW5Gb3JSZXNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczsidW5kZWZpbmVkIiE9dHlwZW9mIFNGQ2xpZW50JiZTRkNsaWVudCYmU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/U0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KToidW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50JiZNU0ZDbGllbnQucmVnaXN0ZXJDdXN0b21NZXNzYWdlTGlzdGVuZXI/TVNGQ2xpZW50LnJlZ2lzdGVyQ3VzdG9tTWVzc2FnZUxpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uKCl7ZS5vblJlc2l6ZSgpfSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtlLm9uUmVzaXplKCl9KX19LHtrZXk6Im9uUmVzaXplIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZm9yY2VVcGRhdGUoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLnJlbmRlcmluZ0NvbnRleHQsdD10aGlzLnByb3BzLnN0cnVjdHVyZSxuPXRoaXMucHJvcHMuY2xhc3NOYW1lKyh0aGlzLnByb3BzLnNreT8iIHNreSI6IiIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3RlbXBsYXRlSWQ6dGhpcy5wcm9wcy50ZW1wbGF0ZUlkLGNsYXNzTmFtZTpuLGhyZWY6ZS5hZExpbmssY2xpY2tVcmxzOmUuY2xpY2tVcmxzLGNyZWF0aXZlSWQ6ZS5jcmVhdGl2ZUlkLGFkSWQ6ZS5hZElkfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3JlbmRlcmluZ0NvbnRleHQ6ZSxibG9jazp0LGNvbXBvbmVudHNNYXA6dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6dGhpcy5wcm9wcy5kb21SZWZzfSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJ0ZW1wbGF0ZUNvbnRhaW5lciIsImJsb2NrIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZW1wbGF0ZSIsaC5wcm9wVHlwZXM9e3JlbmRlcmluZ0NvbnRleHQ6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsc3RydWN0dXJlOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsY2xhc3NOYW1lOnUuUHJvcFR5cGVzLnN0cmluZyxkb21SZWZzOnUuUHJvcFR5cGVzLm9iamVjdCx0ZW1wbGF0ZUlkOnUuUHJvcFR5cGVzLnN0cmluZyx1cGRhdGVPblJlc2l6ZTp1LlByb3BUeXBlcy5ib29sLHNreTp1LlByb3BUeXBlcy5ib29sfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPW4oMjQpLGQ9cihmKSxoPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zdGF0ZT17ZmxleGJveDohMH0sbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ub2RlJiZ0aGlzLnNldFN0YXRlKHtmbGV4Ym94OmRbImRlZmF1bHQiXS5zdXBwb3J0LmZsZXhib3goKX0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0odGhpcy5wcm9wcy5jbGFzc05hbWU/dGhpcy5wcm9wcy5jbGFzc05hbWUrIiAiOiIiKSsidGVtcGxhdGVDb250YWluZXIiKyh0aGlzLnN0YXRlLmZsZXhib3g/IiI6IiBoLW5vRmxleGJveCIpO3JldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxjbGFzc05hbWU6dCxpZDp0aGlzLnByb3BzLnRlbXBsYXRlSWQsImRhdGEtY3JlYXRpdmUtaWQiOnRoaXMucHJvcHMuY3JlYXRpdmVJZCwiZGF0YS1hZC1pZCI6dGhpcy5wcm9wcy5hZElkLHJlZjpmdW5jdGlvbih0KXtlLm5vZGU9dH19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJ0ZW1wbGF0ZUNvbnRhaW5lcl9fbGluayJ9fSksdGhpcy5wcm9wcy5jaGlsZHJlbil9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bIkNsaWNrdGhyb3VnaExpbmsiXX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1oLGguZGlzcGxheU5hbWU9IlRlbXBsYXRlQ29udGFpbmVyICIsaC5wcm9wVHlwZXM9e3N0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxjbGFzc05hbWU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRlbXBsYXRlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGhyZWY6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKS5pc1JlcXVpcmVkLGNyZWF0aXZlSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFkSWQ6dS5Qcm9wVHlwZXMuc3RyaW5nfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbD1uKDMpLHA9cihsKSxjPW4oOCksZj1yKGMpLGQ9big5KSxoPXIoZCkseT1uKDEyKSxtPXIoeSksYj1uKDIzKSx2PXIoYiksZz1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGIuQ09VUE9OX1RPS0VOX01BQ1JPLCgwLHZbImRlZmF1bHQiXSkoKSl9LF89ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiBhKHQsZSksdSh0LFt7a2V5OiJoYW5kbGVPbkNsaWNrIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnByb3BzLG49dC5jbGlja1RyYWNrZXJVcmxzLHI9dC51cmwsbz10LmNhc2NhZGluZ0ludGVudCxpPXQuaXNPZmZzaXRlOygwLGZbImRlZmF1bHQiXSkobiksKDAsbVsiZGVmYXVsdCJdKShnKHIpLGksbykmJmUucHJldmVudERlZmF1bHQoKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5wcm9wcyxuPXQudXJsLHI9dC5pc09mZnNpdGUsbz10LmNoaWxkcmVuLGk9dC5hbmNob3JQcm9wcyxhPW51bGw7dGhpcy5jb250ZXh0LmlzU3RhdGljSHRtbCYmdGhpcy5wcm9wcy5jbGlja1RyYWNrZXJVcmxzJiYoYT10aGlzLnByb3BzLmNsaWNrVHJhY2tlclVybHMuam9pbigifCIpKTt2YXIgdT0iY2xpY2t0aHJvdWdoTGluayIrKGkuY2xhc3NOYW1lPyIgIitpLmNsYXNzTmFtZToiIik7cmV0dXJuIHBbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJhIixzKHt9LGkse2NsYXNzTmFtZTp1LGhyZWY6ZyhuKSx0YXJnZXQ6KDAsaFsiZGVmYXVsdCJdKShuLHIpLG9uQ2xpY2s6ZnVuY3Rpb24odCl7cmV0dXJuIGUuaGFuZGxlT25DbGljayh0KX0sb25Nb3VzZURvd246ZnVuY3Rpb24oKXtyZXR1cm4gZS5mb3JjZVVwZGF0ZSgpfSwiZGF0YS1jbGlja1RyYWNrZXJVcmxzIjphLHJlbDoibm9mb2xsb3cifSksbyl9fV0pLHR9KGwuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09XyxfLmRpc3BsYXlOYW1lPSJDbGlja3Rocm91Z2hMaW5rIixfLnByb3BUeXBlcz17dXJsOmwuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLGNhc2NhZGluZ0ludGVudDpsLlByb3BUeXBlcy5zdHJpbmcsaXNPZmZzaXRlOmwuUHJvcFR5cGVzLmJvb2wsY2xpY2tUcmFja2VyVXJsczpsLlByb3BUeXBlcy5hcnJheU9mKGwuUHJvcFR5cGVzLnN0cmluZyksYW5jaG9yUHJvcHM6bC5Qcm9wVHlwZXMub2JqZWN0LGNoaWxkcmVuOmwuUHJvcFR5cGVzLm5vZGV9LF8uY29udGV4dFR5cGVzPXtpc1N0YXRpY0h0bWw6bC5Qcm9wVHlwZXMuYm9vbH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG89MDtlPm87bysrKXRbb109YXJndW1lbnRzW29dO2Zvcih2YXIgaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBhPXRbaV07aWYoYSlpZigic3RyaW5nIj09dHlwZW9mIGEpcihhKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpcmUgcGl4ZWw6ICInK0pTT04uc3RyaW5naWZ5KGEpKyciIGlzIG5vdCBhIHN0cmluZyEnKTtuLmFwcGx5KHRoaXMsYSl9fX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZSYmKChuZXcgSW1hZ2UpLnNyYz1lKX07dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7dmFyIG49dHx8ISgwLGFbImRlZmF1bHQiXSkoZSk7cmV0dXJuIG4/cy5JTl9ORVdfV0lORE9XOnMuSU5fU0FNRV9XSU5ET1d9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1vO3ZhciBpPW4oMTApLGE9cihpKSxzPW4oMTEpfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUpe3JldHVybiByLnRlc3QoZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1uO3ZhciByPS9eKChodHRwcz86KT9cL1wvKSguKlwuKT9hbWF6b25cLi99LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj10LklOX1NBTUVfV0lORE9XPSJfdG9wIixyPXQuSU5fTkVXX1dJTkRPVz0iX2JsYW5rIjt0WyJkZWZhdWx0Il09e0lOX05FV19XSU5ET1c6cixJTl9TQU1FX1dJTkRPVzpufX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0LG4pe2lmKCF0JiZtWyJkZWZhdWx0Il0mJkMmJnBbImRlZmF1bHQiXS5tYXNoLmlzQVVJQXZhaWxhYmxlKCkmJigwLFRbImRlZmF1bHQiXSkoZSx0KT09PVAuSU5fTkVXX1dJTkRPVylwWyJkZWZhdWx0Il0ubWFzaC5vcGVuSW5FeHRlcm5hbEJyb3dzZXIuZXhlY3V0ZSh7dXJsOmV9KTtlbHNlIGlmKCF0fHwhTXx8dlsiZGVmYXVsdCJdJiYhUyhbMiwyLDEwXSl8fF9bImRlZmF1bHQiXSYmIVMoWzUsNSwxMzVdKSl7aWYoIXR8fCFJKXJldHVybiExO2ZbImRlZmF1bHQiXS5vcGVuKGUpfWVsc2UgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcihufHxlKTtyZXR1cm4hMH1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuKDAsVFsiZGVmYXVsdCJdKShlLHQpPT09UC5JTl9TQU1FX1dJTkRPV31mdW5jdGlvbiBhKGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3JldHVybiB1WyJkZWZhdWx0Il0ub3BlbihlLCgwLFRbImRlZmF1bHQiXSkoZSx0KSl9LGE9ZnVuY3Rpb24oKXtyZXR1cm4gbyhlLHQsbil9LHM9ZnVuY3Rpb24oKXtyZXR1cm4gYSgpfHxyKCl9O3JldHVybiBpKGUsdCk/KHNldFRpbWVvdXQocyxSKSwhMCk6YSgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0WyJkZWZhdWx0Il09YTt2YXIgcz1uKDEzKSx1PXIocyksbD1uKDE0KSxwPXIobCksYz1uKDE1KSxmPXIoYyksZD1uKDE2KSxoPXIoZCkseT1uKDE3KSxtPXIoeSksYj1uKDE4KSx2PXIoYiksZz1uKDIxKSxfPXIoZyksUD1uKDExKSxrPW4oOSksVD1yKGspLHg9bigyMiksTz1yKHgpLHc9ISFwWyJkZWZhdWx0Il0sQz13JiYidW5kZWZpbmVkIiE9dHlwZW9mIHBbImRlZmF1bHQiXS5tYXNoLGo9ISFoWyJkZWZhdWx0Il0sTT1qJiYiZnVuY3Rpb24iPT10eXBlb2YgaFsiZGVmYXVsdCJdLm9wZW5JbkV4dGVybmFsQnJvd3NlcixFPSEhZlsiZGVmYXVsdCJdLEk9RSYmImZ1bmN0aW9uIj09dHlwZW9mIGZbImRlZmF1bHQiXS5vcGVuLE49aiYmZnVuY3Rpb24oKXt2YXIgZT1oWyJkZWZhdWx0Il0uZ2V0U0RLVmVyc2lvbigpLm1hdGNoKC8oXGQrKVwuKFxkKykuKFxkKykkLyk7cmV0dXJuIGU/W2VbMV0sZVsyXSxlWzNdXTp2b2lkIDB9KCksUz1mdW5jdGlvbihlKXtyZXR1cm4gTiYmKDAsT1siZGVmYXVsdCJdKShOLGUpPj0wfSxSPTE1MH0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50O3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBtcmFpZCYmbXJhaWQ7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGFtYXpvbiYmYW1hem9uO3RbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxpPW4oMTQpLGE9cihpKSxzPWZ1bmN0aW9uKCl7aWYoIWFbImRlZmF1bHQiXSlyZXR1cm4hMTt2YXIgZT1mdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYVsiZGVmYXVsdCJdLmdldERvY3VtZW50Q29va2llKCkpLnNwbGl0KCI7IikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10LnNwbGl0KCI9Iik7biYmbi5sZW5ndGg+PTImJihlW25bMF0udHJpbSgpXT1uWzFdLnRyaW0oKSl9KSx7djovXCJhdlwiOlwiKFsuXGRdKilcIi9pLnRlc3QoZVsiYW16bi1hcHAtY3R4dCJdKX19KCk7cmV0dXJuIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOm8oZSkpP2Uudjp2b2lkIDB9KCk7dFsiZGVmYXVsdCJdPXN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L2lQaG9uZXxpUGFkfGlQb2QvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDE0KSxpPXIobyksYT1uKDIwKSxzPXIoYSksdT1pWyJkZWZhdWx0Il0mJmlbImRlZmF1bHQiXS5nZXRVc2VyQWdlbnRJbmZvKCl8fHNbImRlZmF1bHQiXSYmc1siZGVmYXVsdCJdLnVzZXJBZ2VudDt0WyJkZWZhdWx0Il09dX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3I7dFsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxOSksaT1yKG8pLGE9L0FuZHJvaWQvLnRlc3QoaVsiZGVmYXVsdCJdKTt0WyJkZWZhdWx0Il09YX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2Zvcih2YXIgbj1NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCkscj0wO24+cjtyKyspe3ZhciBvPWVbcl0saT10W3JdO2lmKG8+aSlyZXR1cm4gMTtpZihpPm8pcmV0dXJuLTF9cmV0dXJuIDB9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRbImRlZmF1bHQiXT1ufSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiJBTVMiO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBidG9hP2J0b2EoRGF0ZS5ub3coKSsoIjsiK2UpKToiIn1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdFsiZGVmYXVsdCJdPW47dC5DT1VQT05fVE9LRU5fTUFDUk89IlZQQ19DU19NQUNSTyJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX12YXIgbz1uKDI1KSxpPXIobyksYT1uKDI2KSxzPXIoYSksdT0vXi4qXC9cL1teXC9dKy87ZS5leHBvcnRzPXtzdXBwb3J0OntmbGV4Ym94OmZ1bmN0aW9uKCl7cmV0dXJuIE1vZGVybml6ciYmKE1vZGVybml6ci5mbGV4Ym94fHxNb2Rlcm5penIuZmxleGJveGxlZ2FjeXx8TW9kZXJuaXpyLmZsZXhib3h0d2VlbmVyKX19LGdldDpmdW5jdGlvbihlLHQpe3JldHVybiB0LnNwbGl0KCIuIikucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5tYXRjaCgvKC4qKVxbKFxkKilcXS8pLHI9biYmblsxXSxvPW4mJm5bMl07cmV0dXJuIHImJm8/ZVtyXVtwYXJzZUludChvLDEwKV06ZVt0XX0sZSl9LGdldE1lZGlhQ2VudHJhbEltYWdlU3JjOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZTt2YXIgbz1pWyJkZWZhdWx0Il0udXJscy5NRURJQV9DRU5UUkFMX1dXLGE9ZS5yZXBsYWNlKHUsIiIpLGw9bysoMD09PWEuaW5kZXhPZigiLyIpPyIiOiIvIikrYSxwPXt9LGM9cj8yOjE7cmV0dXJuIHQuYWMmJihwLkFDPSEwKSx0LnN4JiYocC5TWD10LnN4KmMpLHQuc3kmJihwLlNZPXQuc3kqYyksdC5xbCYmKHAuUUw9dC5xbCksdC5mbSYmKHAuRk09dC5mbSksc1siZGVmYXVsdCJdLnNldFRhZ3MobCxwLFsiQUMiLCJTWCIsIlNZIiwiRk0iLCJRTCJdLG4pfX19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17dXJsczp7TUVESUFfQ0VOVFJBTF9XVzoiaHR0cHM6Ly9tLm1lZGlhLWFtYXpvbi5jb20iLE1FRElBX0NFTlRSQUxfQ046Imh0dHBzOi8vaW1hZ2VzLWNuLnNzbC1pbWFnZXMtYW1hem9uLmNvbSJ9fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtzZXRUYWdzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPS9cLl8oW15cLl0rKSg/PV9cLlx3KyQpLyxpPW8uZXhlYyhlKSxhPWk/aVsxXS5zcGxpdCgiXyIpOltdLHM9T2JqZWN0LmFzc2lnbih7fSx0KSx1PVtdO3ImJmEuZm9yRWFjaChmdW5jdGlvbihlKXtpZigiIiE9PWUpe3ZhciB0LG49ZS5zdWJzdHJpbmcoMCwyKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNbbl0/KHNbbl09PT0hMSYmKHNbbl09bnVsbCksbj1udWxsKTp0PWUuc3Vic3RyaW5nKDIsZS5sZW5ndGgpLG51bGwhPT1uJiZ1LnB1c2gobit0KX19KSxuLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9c1tlXTt0JiZ1LnB1c2goZSsodD09PSEwPyIiOnQpKX0pO3ZhciBsPS0xO3UuZm9yRWFjaChmdW5jdGlvbihlLHQpeyJDUiI9PT1lLnN1YnN0cmluZygwLDIpJiYobD10KX0pO3ZhciBwPSExO2lmKGw+PTApe3ZhciBjPXUuc3BsaWNlKGwsMSk7dS51bnNoaWZ0KGNbMF0pLHA9ITB9dmFyIGY9dS5pbmRleE9mKCJBQyIpO2lmKGY+MCl7dmFyIGQ9dS5zcGxpY2UoZiwxKTtwP3Uuc3BsaWNlKDEsMCxkWzBdKTp1LnVuc2hpZnQoZFswXSl9cmV0dXJuIHUubGVuZ3RoPjAmJihlPWEubGVuZ3RoPjA/ZS5yZXBsYWNlKG8sIi5fIit1LmpvaW4oIl8iKSk6ZS5yZXBsYWNlKC9cLig/PVx3KyQpLywiLl8iK3Uuam9pbigiXyIpKyJfLiIpKSxlfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigyNCksYz1yKHApLGY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCk7dmFyIG49aSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpO3JldHVybiBuLnN0YXRlPXtjbG9hazpuLmV4dHJhY3RNZXRhZGF0YShlLmJsb2NrLCJjbG9hayIpfSxufXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNldFN0YXRlKHtjbG9hazohMX0pfX0se2tleToiZ2V0Q2xhc3NOYW1lIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJibG9jayIsdD0iIjt0aGlzLnByb3BzLmJsb2NrLmNzc0NsYXNzZXMmJih0PXRoaXMucHJvcHMuYmxvY2suY3NzQ2xhc3Nlcy5qb2luKCIgIikpLCIiIT09dCYmKGUrPSIgIit0KTt2YXIgbj10aGlzLnByb3BzLmJsb2NrLmxheW91dDtyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj1uW3RdOyJqdXN0aWZ5Q29udGVudCI9PT10JiYiZmxleC1zdGFydCIhPT1yP2UrPSIgYmxvY2stLWp1c3RpZnktIityOiJhbGlnbkl0ZW1zIj09PXQmJiJzdHJldGNoIiE9PXI/ZSs9IiBibG9jay0tYWxpZ24tIityOiJmbGV4RGlyZWN0aW9uIj09PXQmJiJyb3ciIT09ciYmKGUrPSIgYmxvY2stLWRpcmVjdGlvbi0iK3IpfSksdGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kJiZ0aGlzLnByb3BzLmJsb2NrLmJhY2tncm91bmQuaWQmJihlKz0iIGJsb2NrLS1iYWNrZ3JvdW5kIiksdGhpcy5zdGF0ZS5jbG9hayYmKGUrPSIgaC1jbG9hayIpLGV9fSx7a2V5OiJwcmV2ZW50UHJvcGVydHkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJiIiIT09dD8ianVzdGlmeUNvbnRlbnQiPT09ZXx8ImFsaWduSXRlbXMiPT09ZXx8ImZsZXhEaXJlY3Rpb24iPT09ZTohMH19LHtrZXk6ImdldEJsb2NrTGF5b3V0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnByb3BzLmJsb2NrLmxheW91dCxuPXt9O3JldHVybiB0JiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBvPXRbcl07ZS5wcmV2ZW50UHJvcGVydHkocixvKXx8KG5bcl09byl9KSxufX0se2tleToiZ2V0QmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmJsb2NrLnN0eWxlLHQ9e307cmV0dXJuIGUmJmUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLnZhbHVlOyJ1bmRlZmluZWQiIT10eXBlb2YgdFtlLm5hbWVdJiYobj10W2UubmFtZV0rIjsiK2UubmFtZSsiOiIrbiksdFtlLm5hbWVdPW59KSx0fX0se2tleToiZ2V0UHJvcFZhbHVlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiJwYXRoIj09PXQudHlwZT9jWyJkZWZhdWx0Il0uZ2V0KGUsdC52YWx1ZSk6ImNvbnN0YW50Ij09PXQudHlwZT90LnZhbHVlOm51bGx9fSx7a2V5OiJnZXRDb21wb25lbnRQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXt9O3JldHVybiBlLnByb3BzJiZlLnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7bltlLm5hbWVdPXQuZ2V0UHJvcFZhbHVlKHQucHJvcHMucmVuZGVyaW5nQ29udGV4dCxlKX0pLG59fSx7a2V5OiJleHRyYWN0TWV0YWRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKG49ZS52YWx1ZSl9KSxufX0se2tleToic2V0UmVmIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmV4dHJhY3RNZXRhZGF0YSh0aGlzLnByb3BzLmJsb2NrLCJyZWYiKTt0JiZ0aGlzLnByb3BzLmRvbVJlZnMmJih0aGlzLnByb3BzLmRvbVJlZnNbdF09ZSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImhpZGUiKSxyPXRoaXMuZXh0cmFjdE1ldGFkYXRhKHRoaXMucHJvcHMuYmxvY2ssImlkIiksbz12b2lkIDAsaT12b2lkIDAsYT12b2lkIDAscz12b2lkIDAsdT12b2lkIDAscD12b2lkIDAsYz12b2lkIDA7aWYoIW4pe289dGhpcy5nZXRDbGFzc05hbWUoKTt2YXIgZj10aGlzLmdldEJsb2NrTGF5b3V0KCksZD10aGlzLmdldEJsb2NrU3R5bGUoKTtpPU9iamVjdC5hc3NpZ24oe30sZixkKSxhPVtdO3ZhciBoPXRoaXMucHJvcHMuYmxvY2suY2hpbGRyZW47aCYmaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2EucHVzaChsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCh0LHtyZW5kZXJpbmdDb250ZXh0OmUucHJvcHMucmVuZGVyaW5nQ29udGV4dCxibG9jazpuLGNvbXBvbmVudHNNYXA6ZS5wcm9wcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6ZS5wcm9wcy5kb21SZWZzLGtleTpuLmlkfSkpfSk7dmFyIHk9dGhpcy5wcm9wcy5ibG9jay5jb21wb25lbnQ7eSYmKHU9dGhpcy5wcm9wcy5jb21wb25lbnRzTWFwW3kuaWRdLHM9dGhpcy5nZXRDb21wb25lbnRQcm9wcyh5KSk7dmFyIG09dGhpcy5wcm9wcy5ibG9jay5iYWNrZ3JvdW5kO20mJihjPXRoaXMucHJvcHMuY29tcG9uZW50c01hcFttLmlkXSxwPXRoaXMuZ2V0Q29tcG9uZW50UHJvcHMobSkpfXJldHVybiFuJiZsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7aWQ6cixjbGFzc05hbWU6byxzdHlsZTppLHJlZjpmdW5jdGlvbih0KXtlLnNldFJlZih0KX19LGMmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImJsb2NrX19iYWNrZ3JvdW5kIn0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoYyxwKSksYS5sZW5ndGg+MD9hOnUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHUscykpfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iQmxvY2siLGYucHJvcFR5cGVzPXtyZW5kZXJpbmdDb250ZXh0OnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGJsb2NrOnUuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLGNvbXBvbmVudHNNYXA6dS5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsZG9tUmVmczp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89MTk5LGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm1vZGVsPXQsdGhpcy5ibG9ja3NNYXA9e30sdGhpcy5fYnVpbGRCbG9ja3NNYXAoKX1yZXR1cm4gcihlLFt7a2V5OiJfYnVpbGRCbG9ja3NNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9W10sdD17fTtlLnB1c2godGhpcy5tb2RlbCk7Zm9yKHZhciBuPTA7ZS5sZW5ndGg+MDspe3ZhciByPWUuc2hpZnQoKSxpPXRoaXMuX2dldFJlZklkKHIpO2lmKCIiIT09aSYmKHRoaXMuYmxvY2tzTWFwW2ldPXIpLHRbci5pZF18fCh0W3IuaWRdPSEwLGU9ZS5jb25jYXQoci5jaGlsZHJlbnx8W10pKSxuKyssbj5vKWJyZWFrfX19LHtrZXk6Il9nZXRSZWZJZCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dm9pZCAwO3JldHVybiBlLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7InJlZiI9PT1lLm5hbWUmJih0PWUudmFsdWUpfSksdH19LHtrZXk6ImhpZGVCbG9jayIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiZuLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSl7ImhpZGUiPT09ZS5uYW1lJiYoZS52YWx1ZT10KX0pfX0se2tleToiYWRkQmxvY2tTdHlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuYmxvY2tzTWFwW2VdO3ImJihyLnN0eWxlPXIuc3R5bGV8fFtdLHIuc3R5bGUucHVzaCh7bmFtZTp0LHZhbHVlOm59KSl9fSx7a2V5OiJhZGRDc3NDbGFzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXTtuJiYobi5jc3NDbGFzc2VzPW4uY3NzQ2xhc3Nlc3x8W10sbi5jc3NDbGFzc2VzLnB1c2godCkpfX0se2tleToiZ2V0Q29tcG9uZW50UHJvcCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJsb2Nrc01hcFtlXSxyPW51bGw7cmV0dXJuIG4mJm4uY29tcG9uZW50JiZuLmNvbXBvbmVudC5wcm9wcyYmbi5jb21wb25lbnQucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLm5hbWU9PT10JiYocj1lKX0pLHJ9fSx7a2V5OiJzZXRDb21wb25lbnRQcm9wIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzLmJsb2Nrc01hcFtlXTtpZihvJiZvLmNvbXBvbmVudCl7dmFyIGk9ITE7by5jb21wb25lbnQucHJvcHM9by5jb21wb25lbnQucHJvcHN8fFtdLG8uY29tcG9uZW50LnByb3BzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5uYW1lPT09dCYmKGUudmFsdWU9bixlLnR5cGU9cixpPSEwKX0pLGl8fG8uY29tcG9uZW50LnByb3BzLnB1c2goe25hbWU6dCx2YWx1ZTpuLHR5cGU6cn0pfX19LHtrZXk6InNldENzc0NsYXNzZXMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5ibG9ja3NNYXBbZV07biYmKG4uY3NzQ2xhc3Nlcz1uLmNzc0NsYXNzZXN8fFtdLEFycmF5LmlzQXJyYXkodCk/bi5jc3NDbGFzc2VzPXQ6bi5jc3NDbGFzc2VzLnB1c2godCkpfX1dKSxlfSgpO3RbImRlZmF1bHQiXT1pfSwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM0KSxjPXIocCksZj1uKDM1KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0LGFsaWdubWVudDp0aGlzLnByb3BzLmFsaWdubWVudCxtYXhIZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHR9LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGRbImRlZmF1bHQiXSx7YWRkaXRpb25hbENsYXNzOnRoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzLHBhdGg6dGhpcy5wcm9wcy5wYXRoLHdpZHRoOnRoaXMucHJvcHMud2lkdGgsaGVpZ2h0OnRoaXMucHJvcHMuaGVpZ2h0LHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxxbDp0aGlzLnByb3BzLnFsLHJldGluYTp0aGlzLnByb3BzLnJldGluYSxhYzp0aGlzLnByb3BzLmFjLGZtOnRoaXMucHJvcHMuZm0sbWVyZ2VUYWdzOnRoaXMucHJvcHMubWVyZ2VUYWdzLGFsdDp0aGlzLnByb3BzLmFsdCxzcHJpdGU6dGhpcy5wcm9wcy5zcHJpdGUscm9sZTp0aGlzLnByb3BzLnJvbGUsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pKX19XSxbe2tleToiZ2V0Q2hpbGRyZW5Db21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblsiaW1hZ2VDb250YWluZXIiLCJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWgsaC5kaXNwbGF5TmFtZT0iTWVkaWFDZW50cmFsSW1hZ2VDb250YWluZXIiLGgucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyx3aWR0aDp1LlByb3BUeXBlcy5zdHJpbmcsaGVpZ2h0OnUuUHJvcFR5cGVzLnN0cmluZyxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHJldGluYTp1LlByb3BUeXBlcy5ib29sLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLGZtOnUuUHJvcFR5cGVzLnN0cmluZyxtZXJnZVRhZ3M6dS5Qcm9wVHlwZXMuYm9vbCxhbHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHNwcml0ZTp1LlByb3BUeXBlcy5ib29sLHJvbGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHRpdGxlOnUuUHJvcFR5cGVzLnN0cmluZyxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3Qsb25Mb2FkOnUuUHJvcFR5cGVzLmZ1bmMsbWF4SGVpZ2h0OnUuUHJvcFR5cGVzLm51bWJlcn0saC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPSJpbWFnZUNvbnRhaW5lciIrKHRoaXMucHJvcHMuZXh0ZW5kQ29udGFpbmVySGVpZ2h0PyIgaW1hZ2VDb250YWluZXItLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIpO3RoaXMucHJvcHMuYWxpZ25tZW50JiYiIiE9PXRoaXMucHJvcHMuYWxpZ25tZW50JiYoZSs9IiBpbWFnZUNvbnRhaW5lci0tIit0aGlzLnByb3BzLmFsaWdubWVudCk7dmFyIHQ9e307cmV0dXJuIHRoaXMucHJvcHMubWF4SGVpZ2h0JiZPYmplY3QuYXNzaWduKHQse21heEhlaWdodDp0aGlzLnByb3BzLm1heEhlaWdodH0pLGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ZSxzdHlsZTp0fSxsWyJkZWZhdWx0Il0uY2xvbmVFbGVtZW50KHRoaXMucHJvcHMuY2hpbGRyZW4se2FkZGl0aW9uYWxDbGFzczoiaW1hZ2VDb250YWluZXJfX2ltYWdlIn0pKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1wLHAuZGlzcGxheU5hbWU9IkltYWdlQ29udGFpbmVyIixwLnByb3BUeXBlcz17ZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWxpZ25tZW50OnUuUHJvcFR5cGVzLnN0cmluZyxtYXhIZWlnaHQ6dS5Qcm9wVHlwZXMubnVtYmVyfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDM2KSxjPShyKHApLG4oMjQpKSxmPXIoYyksZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJnZXRJbWFnZVNyYyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGZbImRlZmF1bHQiXS5nZXRNZWRpYUNlbnRyYWxJbWFnZVNyYyhlLHthYzp0aGlzLnByb3BzLmFjLHN4OnRoaXMucHJvcHMuc3gsc3k6dGhpcy5wcm9wcy5zeSxmbTp0aGlzLnByb3BzLmZtLHFsOnRoaXMucHJvcHMucWx9LHRoaXMucHJvcHMubWVyZ2VUYWdzLHRoaXMucHJvcHMucmV0aW5hKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5nZXRJbWFnZVNyYyh0aGlzLnByb3BzLnBhdGgpLG49Im1lZGlhQ2VudHJhbEltYWdlIisodGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiKTtpZih0aGlzLnByb3BzLnNwcml0ZSl7dmFyIHI9T2JqZWN0LmFzc2lnbih7d2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYmFja2dyb3VuZEltYWdlOiJ1cmwoJyIrdCsiJykifSx0aGlzLnByb3BzLnN0eWxlKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTpuLHN0eWxlOnIsdGl0bGU6dGhpcy5wcm9wcy50aXRsZX0pfXJldHVybiBsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiaW1nIix7Y2xhc3NOYW1lOm4sc3JjOnQsd2lkdGg6dGhpcy5wcm9wcy53aWR0aCxoZWlnaHQ6dGhpcy5wcm9wcy5oZWlnaHQsYWx0OnRoaXMucHJvcHMuYWx0LHJvbGU6dGhpcy5wcm9wcy5yb2xlLHRpdGxlOnRoaXMucHJvcHMudGl0bGUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSxvbkxvYWQ6ZnVuY3Rpb24odCl7ZS5wcm9wcy5vbkxvYWQmJmUucHJvcHMub25Mb2FkKHQudGFyZ2V0KX19KX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9Ik1lZGlhQ2VudHJhbEltYWdlIixkLnByb3BUeXBlcz17YWRkaXRpb25hbENsYXNzOnUuUHJvcFR5cGVzLnN0cmluZyxwYXRoOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLHN4OnUuUHJvcFR5cGVzLm51bWJlcixzeTp1LlByb3BUeXBlcy5udW1iZXIscmV0aW5hOnUuUHJvcFR5cGVzLmJvb2wsYWM6dS5Qcm9wVHlwZXMuYm9vbCxxbDp1LlByb3BUeXBlcy5udW1iZXIsZm06dS5Qcm9wVHlwZXMuc3RyaW5nLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGFsdDp1LlByb3BUeXBlcy5zdHJpbmcsc3ByaXRlOnUuUHJvcFR5cGVzLmJvb2wscm9sZTp1LlByb3BUeXBlcy5zdHJpbmcsdGl0bGU6dS5Qcm9wVHlwZXMuc3RyaW5nLHN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdCxvbkxvYWQ6dS5Qcm9wVHlwZXMuZnVuY30sZC5kZWZhdWx0UHJvcHM9e3JldGluYTohMH19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInJldGluYSBtb2R1bGVzIGV4cGVjdHMgYSBmdW5jdGlvbiBvblJldGluYVN0YXRlQ2hhbmdlIGFjY2VwdGluZyBib29sZWFuIik7aWYod2luZG93Lm1hdGNoTWVkaWEpe3ZhciB0PXdpbmRvdy5tYXRjaE1lZGlhKCIoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwobWluLXJlc29sdXRpb246IDE5MmRwaSkiKSxuPWZ1bmN0aW9uKHQpe3JldHVybiBlKHQubWF0Y2hlcyl9O3QmJm4odCksdC5hZGRMaXN0ZW5lciYmdC5hZGRMaXN0ZW5lcihuKX1lbHNlIGUod2luZG93LmRldmljZVBpeGVsUmF0aW8+MT8hMDohMSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9cih1KSxwPW4oMzgpLGM9cihwKSxmPTk5OSxkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5fc2V0U3RhdGUoZSksbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTdGF0ZSh0aGlzLnByb3BzKSx0aGlzLl9oYW5kbGVUZXh0T3ZlcmZsb3coKX19LHtrZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToiY29tcG9uZW50RGlkVXBkYXRlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2hhbmRsZVRleHRPdmVyZmxvdygpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0idGV4dENvbnRhaW5lcl9fdGV4dCI7dCs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciBuPXtmb250U2l6ZTp0aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4fTtyZXR1cm4gT2JqZWN0LmFzc2lnbihuLHRoaXMucHJvcHMuc3R5bGUpLHRoaXMucHJvcHMudGV4dD9sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOmZ1bmN0aW9uKHQpe2Uubm9kZT10fSxzdHlsZTpuLGNsYXNzTmFtZToidGV4dENvbnRhaW5lciIrKHRoaXMuc3RhdGUudXNlQ3NzVHJ1bmNhdGlvbj8iIGgtZWxsaXBzaXMiOiIiKX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtyZWY6ZnVuY3Rpb24odCl7ZS5zcGFuPXR9LGNsYXNzTmFtZTp0LGlkOnRoaXMucHJvcHMudGV4dElkfSx0aGlzLnByb3BzLnRleHQpKTpudWxsfX0se2tleToiX3NldFN0YXRlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1PYmplY3QuYXNzaWduKHt9LGUuZm9udCk7dGhpcy5zdGF0ZT17Zm9udDp0LHVzZUNzc1RydW5jYXRpb246dC5tYXhMaW5lcz8xPT09dC5tYXhMaW5lczohMCxuZWVkc1RpdGxlQXR0cmlidXRlOiExLG9yaWdpbmFsVGV4dDplLnRleHR9fX0se2tleToiX3Nob3dUb29sdGlwIix2YWx1ZTpmdW5jdGlvbihlKXtlPygwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5hdHRyKCJ0aXRsZSIsdGhpcy5zdGF0ZS5vcmlnaW5hbFRleHQpOigwLGNbImRlZmF1bHQiXSkodGhpcy5zcGFuKS5yZW1vdmVBdHRyKCJ0aXRsZSIpfX0se2tleToiX2hhbmRsZVRleHRPdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLm5vZGUpaWYodGhpcy5zdGF0ZS51c2VDc3NUcnVuY2F0aW9uKXt2YXIgZT0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5fc2hvd1Rvb2x0aXAoZS50ZXh0T3ZlcmZsb3coKSl9ZWxzZSB0aGlzLl90cnVuY2F0ZU11bHRpTGluZVRleHQoKX19LHtrZXk6Il90cnVuY2F0ZU11bHRpTGluZVRleHQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9Ii4uLiIsdD0oMCxjWyJkZWZhdWx0Il0pKHRoaXMubm9kZSk7dGhpcy5zcGFuLmlubmVySFRNTD10aGlzLnN0YXRlLm9yaWdpbmFsVGV4dDt2YXIgbj0oMCxjWyJkZWZhdWx0Il0pKHRoaXMuc3BhbikuZGVjb2RlRW50aXRpZXMoKTt0aGlzLm5vZGUuc3R5bGUuZm9udFNpemU9dGhpcy5zdGF0ZS5mb250Lm1heEZvbnRQeCsicHgiO2Zvcih2YXIgcj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsbz10aGlzLnN0YXRlLmZvbnQubWF4Rm9udFB4LGk9ITEsYT0wO3I+dGhpcy5zdGF0ZS5mb250Lm1heExpbmVzfHx0LmNoaWxkcmVuT3ZlcmZsb3coKTspe2lmKG88PXRoaXMuc3RhdGUuZm9udC5taW5Gb250UHgpe2l8fChuKz1lLGk9ITApO3ZhciBzPW4ubGVuZ3RoO249bi5zdWJzdHIoMCxzLWUubGVuZ3RoLTEpK2UsdGhpcy5zcGFuLmlubmVySFRNTD1ufWVsc2Ugby0tLHRoaXMubm9kZS5zdHlsZS5mb250U2l6ZT1vKyJweCI7aWYocj10aGlzLnNwYW4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsYSsrLGE+ZilicmVha310aGlzLl9zaG93VG9vbHRpcChpKX19XSksdH0odS5Db21wb25lbnQpO3RbImRlZmF1bHQiXT1kLGQuZGlzcGxheU5hbWU9IlRleHRDb250YWluZXIiLGQucHJvcFR5cGVzPXt0ZXh0OnUuUHJvcFR5cGVzLnN0cmluZyxhZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGZvbnQ6dS5Qcm9wVHlwZXMub2JqZWN0LHRleHRJZDp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKSx0aGlzLm5vZGU9dH1yZXR1cm4gcihlLFt7a2V5OiJnZXQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm5vZGVbZV19fSx7a2V5OiJmaW5kIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwodCkpfX0se2tleToicGFyZW50Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLm5vZGUucGFyZW50Tm9kZSl9fSx7a2V5OiJjaGlsZHJlbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5ub2RlLmNoaWxkcmVuKX19LHtrZXk6ImNzcyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm5vZGVbMF18fHRoaXMubm9kZSxyPW4uZ2V0QXR0cmlidXRlKCJzdHlsZSIpLG89cj9yLnNwbGl0KCI7IikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KCI6Iil9KTpbXSxpPXt9O28uZm9yRWFjaChmdW5jdGlvbihlKXtlWzBdJiYiIiE9PWVbMF0mJihpW2VbMF1dPWVbMV0pfSksaVtlXT10O3ZhciBhPSIiO3JldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ErPWUrIjoiK2lbZV0rIjsifSksbi5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKSx0aGlzfX0se2tleToiYXR0ciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHQ/KHRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoZSx0KSx0aGlzLm5vZGUpOnRoaXMubm9kZS5nZXRBdHRyaWJ1dGUoZSl9fSx7a2V5OiJyZW1vdmVBdHRyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ub2RlLnJlbW92ZUF0dHJpYnV0ZShlKSx0aGlzLm5vZGV9fSx7a2V5OiJvdXRlckhlaWdodCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLm5vZGUub2Zmc2V0SGVpZ2h0O3JldHVybiBlJiYodD1nZXRDb21wdXRlZFN0eWxlKHRoaXMubm9kZSksbis9cGFyc2VJbnQodC5tYXJnaW5Ub3ApK3BhcnNlSW50KHQubWFyZ2luQm90dG9tKSksbn19LHtrZXk6Im91dGVyV2lkdGgiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5ub2RlLm9mZnNldFdpZHRoO3JldHVybiBlJiYodD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5vZGUpLApuKz13aW5kb3cucGFyc2VJbnQodC5tYXJnaW5MZWZ0LDEwKSt3aW5kb3cucGFyc2VJbnQodC5tYXJnaW5SaWdodCwxMCkpLG59fSx7a2V5OiJ0ZXh0Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUudGV4dENvbnRlbnR8fHRoaXMubm9kZS5pbm5lckhUTUx8fCIifX0se2tleToiY2hpbGRyZW5PdmVyZmxvdyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm91dGVyV2lkdGgoITApLG49MDtyZXR1cm4gdGhpcy5jaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24odCl7bis9bmV3IGUodCkub3V0ZXJXaWR0aCghMCl9KSwtMT50LW59fSx7a2V5OiJ0ZXh0T3ZlcmZsb3ciLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3V0ZXJXaWR0aCghMCk8dGhpcy5ub2RlLnNjcm9sbFdpZHRofX0se2tleToiZGVjb2RlRW50aXRpZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYodGhpcy5ub2RlLmlubmVySFRNTCl7dmFyIHQ9dGhpcy5ub2RlLmlubmVySFRNTDtyZXR1cm4gdD10LnJlcGxhY2UoLzxzY3JpcHRbXj5dKj4oW1xTXHNdKj8pPFwvc2NyaXB0Pi9naW0sIiIpLHQ9dC5yZXBsYWNlKC88XC8/XHcoPzpbXiInPl18IlteIl0qInwnW14nXSonKSo+L2dpbSwiIiksdD10LnJlcGxhY2UoL1x1MDBhMC9nLCIgIiksZS5pbm5lckhUTUw9dCx0PWUudGV4dENvbnRlbnR8fGUuaW5uZXJIVE1MfHwiIixlLnRleHRDb250ZW50PSIiLHR9cmV0dXJuIiJ9fV0pLGV9KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbyhlKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNyksYz1yKHApLGY9big3KSxkPXIoZiksaD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9InRleHRMaW5rIisodGhpcy5wcm9wcy5kaXNwbGF5QXNUZXh0PyIgdGV4dExpbmstLWRpc3BsYXlBc1RleHQiOiIiKTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoZFsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6ZX19LGxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7Zm9udDp0aGlzLnByb3BzLmZvbnQsdGV4dDp0aGlzLnByb3BzLnRleHQsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZSx0ZXh0SWQ6dGhpcy5wcm9wcy50ZXh0SWR9KSl9fV0sW3trZXk6ImdldENoaWxkcmVuQ29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bInRleHRDb250YWluZXIiLCJjbGlja3Rocm91Z2hMaW5rIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09aCxoLmRpc3BsYXlOYW1lPSJUZXh0TGluayIsaC5wcm9wVHlwZXM9e3RleHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjbGlja1VybHM6dS5Qcm9wVHlwZXMuYXJyYXlPZih1LlByb3BUeXBlcy5zdHJpbmcpLmlzUmVxdWlyZWQsZm9udDp1LlByb3BUeXBlcy5vYmplY3QsdGV4dElkOnUuUHJvcFR5cGVzLnN0cmluZyxkaXNwbGF5QXNUZXh0OnUuUHJvcFR5cGVzLmJvb2wsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDMzKSxjPXIocCksZj1uKDcpLGQ9cihmKSxoPW4oMzcpLHk9cihoKSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0iYXNpbkltYWdlIjtyZXR1cm4gZSs9dGhpcy5wcm9wcy5leHRlbmRDb250YWluZXJIZWlnaHQ/IiBhc2luSW1hZ2UtLWV4dGVuZENvbnRhaW5lckhlaWdodCI6IiIsZSs9dGhpcy5wcm9wcy5kZXNjcmlwdGlvbj8iIGFzaW5JbWFnZS0td2l0aERlc2NyaXB0aW9uIjoiIixsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgiZGl2Iix7ImRhdGEtYXNpbiI6dGhpcy5wcm9wcy5hc2luLGNsYXNzTmFtZTplfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChkWyJkZWZhdWx0Il0se3VybDp0aGlzLnByb3BzLmhyZWYsaXNPZmZzaXRlOiExLGNsaWNrVHJhY2tlclVybHM6dGhpcy5wcm9wcy5jbGlja1VybHMsYW5jaG9yUHJvcHM6e2NsYXNzTmFtZTplfX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtwYXRoOnRoaXMucHJvcHMucGF0aCxhbHQ6dGhpcy5wcm9wcy5hbHQsc3ByaXRlOnRoaXMucHJvcHMuc3ByaXRlLGV4dGVuZENvbnRhaW5lckhlaWdodDp0aGlzLnByb3BzLmV4dGVuZENvbnRhaW5lckhlaWdodCx3aWR0aDp0aGlzLnByb3BzLndpZHRoLGhlaWdodDp0aGlzLnByb3BzLmhlaWdodCxzeDp0aGlzLnByb3BzLnN4LHN5OnRoaXMucHJvcHMuc3kscWw6dGhpcy5wcm9wcy5xbCxyZXRpbmE6dGhpcy5wcm9wcy5yZXRpbmEsYWM6dGhpcy5wcm9wcy5hYyxtZXJnZVRhZ3M6dGhpcy5wcm9wcy5tZXJnZVRhZ3MsdGl0bGU6dGhpcy5wcm9wcy50aXRsZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlLG9uTG9hZDp0aGlzLnByb3BzLm9uTG9hZH0pLHRoaXMucHJvcHMuZGVzY3JpcHRpb24mJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KHlbImRlZmF1bHQiXSx7dGV4dDp0aGlzLnByb3BzLmRlc2NyaXB0aW9uLGZvbnQ6dGhpcy5wcm9wcy5kZXNjcmlwdGlvbkZvbnR9KSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lciIsImNsaWNrdGhyb3VnaExpbmsiLCJ0ZXh0Q29udGFpbmVyIl19fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09bSxtLmRpc3BsYXlOYW1lPSJBc2luSW1hZ2UiLG0ucHJvcFR5cGVzPXtocmVmOnUuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLHBhdGg6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsZXh0ZW5kQ29udGFpbmVySGVpZ2h0OnUuUHJvcFR5cGVzLmJvb2wsYWx0OnUuUHJvcFR5cGVzLnN0cmluZyxzcHJpdGU6dS5Qcm9wVHlwZXMuYm9vbCxzeDp1LlByb3BUeXBlcy5udW1iZXIsc3k6dS5Qcm9wVHlwZXMubnVtYmVyLHdpZHRoOnUuUHJvcFR5cGVzLnN0cmluZyxoZWlnaHQ6dS5Qcm9wVHlwZXMuc3RyaW5nLGFjOnUuUHJvcFR5cGVzLmJvb2wscWw6dS5Qcm9wVHlwZXMubnVtYmVyLG1lcmdlVGFnczp1LlByb3BUeXBlcy5ib29sLGNsaWNrVXJsczp1LlByb3BUeXBlcy5hcnJheU9mKHUuUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxkZXNjcmlwdGlvbjp1LlByb3BUeXBlcy5zdHJpbmcsZGVzY3JpcHRpb25Gb250OnUuUHJvcFR5cGVzLm9iamVjdCx0aXRsZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LG9uTG9hZDp1LlByb3BUeXBlcy5mdW5jLGFzaW46dS5Qcm9wVHlwZXMuc3RyaW5nfSxtLmRlZmF1bHRQcm9wcz17YWM6ITAscmV0aW5hOiEwfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDcpLGM9cihwKSxmPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG8odGhpcyx0KSxpKHRoaXMsKHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwodGhpcyxlKSl9cmV0dXJuIGEodCxlKSxzKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0icHJpY2UiO2UrPXRoaXMucHJvcHMuaXNKdW1ibz8iIHByaWNlLS1qdW1ibyI6IiIsZSs9dGhpcy5wcm9wcy5pc0xpc3Q/IiBwcmljZS0tbGlzdCI6IiIsZSs9dGhpcy5wcm9wcy5hZGRpdGlvbmFsQ2xhc3M/IiAiK3RoaXMucHJvcHMuYWRkaXRpb25hbENsYXNzOiIiO3ZhciB0PSIiO2lmKHRoaXMucHJvcHMuaXNKdW1ibyl7dmFyIG49dGhpcy5wcm9wcy5wcmljZUluZm8ud2hvbGVBbW91bnQscj10aGlzLnByb3BzLnByaWNlSW5mby5kZWNpbWFsUGFydDt0PWxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOmUsc3R5bGU6dGhpcy5wcm9wcy5zdHlsZX0sbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19qdW1ib0ludGVnZXJBbW91bnQifSxuKSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2p1bWJvRGVjaW1hbEFtb3VudCJ9LHIpKX1lbHNlIHQ9bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ZSxzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSxsWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJpY2VfX2N1cnJlbmN5In0sdGhpcy5wcm9wcy5jdXJyZW5jeSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlX19hbW91bnQifSx0aGlzLnByb3BzLmFtb3VudCkpO3JldHVybiB0aGlzLnByb3BzLmhyZWYmJnRoaXMucHJvcHMuY2xpY2tVcmxzP2xbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7dXJsOnRoaXMucHJvcHMuaHJlZixpc09mZnNpdGU6ITEsY2xpY2tUcmFja2VyVXJsczp0aGlzLnByb3BzLmNsaWNrVXJscyxhbmNob3JQcm9wczp7Y2xhc3NOYW1lOiJwcmljZSJ9fSx0KTp0fX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWYsZi5kaXNwbGF5TmFtZT0iUHJpY2UiLGYucHJvcFR5cGVzPXthZGRpdGlvbmFsQ2xhc3M6dS5Qcm9wVHlwZXMuc3RyaW5nLGFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxjdXJyZW5jeTp1LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxpc0p1bWJvOnUuUHJvcFR5cGVzLmJvb2wscHJpY2VJbmZvOnUuUHJvcFR5cGVzLm9iamVjdCxpc0xpc3Q6dS5Qcm9wVHlwZXMuYm9vbCxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3QsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9bigzNSksYz1yKHApLGY9big0MyksZD1yKGYpLGg9big3KSx5PXIoaCksbT0iL2ltYWdlcy9HLyR7bWVkaWF9L2RhL2NyZWF0aXZlcy9wcmltZS0yeC0yMDE3MDYxNC5wbmciLGI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiZ2V0UHJpbWVMb2dvUGF0aCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGRbImRlZmF1bHQiXS5jb21waWxlKG0se21lZGlhOmV9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFByaW1lTG9nb1BhdGgodGhpcy5wcm9wcy5tZWRpYSksdD1sWyJkZWZhdWx0Il0uY3JlYXRlRWxlbWVudChjWyJkZWZhdWx0Il0se3BhdGg6ZSx3aWR0aDoiNDMiLGhlaWdodDoiMTIiLGFsdDoiUHJpbWUiLGFkZGl0aW9uYWxDbGFzczoicHJpbWVMb2dvIixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSk7cmV0dXJuIHRoaXMucHJvcHMuaHJlZiYmdGhpcy5wcm9wcy5jbGlja1VybHM/bFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoeVsiZGVmYXVsdCJdLHt1cmw6dGhpcy5wcm9wcy5ocmVmLGlzT2Zmc2l0ZTohMSxjbGlja1RyYWNrZXJVcmxzOnRoaXMucHJvcHMuY2xpY2tVcmxzLGFuY2hvclByb3BzOntjbGFzc05hbWU6InByaW1lTG9nbyJ9fSx0KTp0fX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJtZWRpYUNlbnRyYWxJbWFnZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWIsYi5kaXNwbGF5TmFtZT0iUHJpbWVMb2dvIixiLnByb3BUeXBlcz17bWVkaWE6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsaHJlZjp1LlByb3BUeXBlcy5zdHJpbmcsY2xpY2tVcmxzOnUuUHJvcFR5cGVzLmFycmF5T2YodS5Qcm9wVHlwZXMuc3RyaW5nKSxzdHlsZTp1LlByb3BUeXBlcy5vYmplY3R9fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtuKHRoaXMsZSl9cmV0dXJuIHIoZSxbe2tleToiY29tcGlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt0Lmhhc093blByb3BlcnR5KG4pJiYoZT1lLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFwkeyIrbisifSIsImciKSx0W25dKSl9KSxlfX1dKSxlfSgpO2UuZXhwb3J0cz1uZXcgb30sLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIGEoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSx1PW4oMyksbD1yKHUpLHA9big0MSksYz1yKHApLGY9ITEsZD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBvKHRoaXMsdCksaSh0aGlzLCh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsKHRoaXMsZSkpfXJldHVybiBhKHQsZSkscyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcy50YXhNZXNzYWdlJiYiIiE9PXRoaXMucHJvcHMudGF4TWVzc2FnZTtyZXR1cm4gbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByaWNlQm94IixzdHlsZTp0aGlzLnByb3BzLnN0eWxlfSx0aGlzLnByb3BzLmxpc3RBbW91bnQmJmYmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KGNbImRlZmF1bHQiXSx7YW1vdW50OnRoaXMucHJvcHMubGlzdEFtb3VudCxjdXJyZW5jeTp0aGlzLnByb3BzLmN1cnJlbmN5LGlzTGlzdDohMCxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19saXN0IixzdHlsZTp0aGlzLnByb3BzLmxpc3RQcmljZVN0eWxlfSksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHthbW91bnQ6dGhpcy5wcm9wcy5idXlBbW91bnQsY3VycmVuY3k6dGhpcy5wcm9wcy5jdXJyZW5jeSxhZGRpdGlvbmFsQ2xhc3M6InByaWNlQm94X19idXkiLHN0eWxlOnRoaXMucHJvcHMuYnV5UHJpY2VTdHlsZX0pLGUmJmxbImRlZmF1bHQiXS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcmljZUJveF9fdGF4TWVzc2FnZSJ9LHRoaXMucHJvcHMudGF4TWVzc2FnZSkpfX1dLFt7a2V5OiJnZXRDaGlsZHJlbkNvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuWyJwcmljZSJdfX1dKSx0fSh1LkNvbXBvbmVudCk7dFsiZGVmYXVsdCJdPWQsZC5kaXNwbGF5TmFtZT0iUHJpY2VCb3giLGQucHJvcFR5cGVzPXtidXlBbW91bnQ6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsbGlzdEFtb3VudDp1LlByb3BUeXBlcy5zdHJpbmcsY3VycmVuY3k6dS5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsdGF4TWVzc2FnZTp1LlByb3BUeXBlcy5zdHJpbmcsc3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGJ1eVByaWNlU3R5bGU6dS5Qcm9wVHlwZXMub2JqZWN0LGxpc3RQcmljZVN0eWxlOnUuUHJvcFR5cGVzLm9iamVjdH19LCwsLCwsLCwsLCwsLCwsLCwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gYShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLHU9bigzKSxsPXIodSkscD1uKDUpLGM9cihwKSxmPW4oMjgpLGQ9cihmKSxoPW4oMzgpLHk9cihoKSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpO3ZhciBuPWkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKTtyZXR1cm4gbi5zdHJ1Y3R1cmU9bmV3IGRbImRlZmF1bHQiXShuLmdldFN0cnVjdHVyZXMoKSksbi5pbml0U3RydWN0dXJlKGUpLG4uY29tcG9uZW50c01hcD1uLmdldENvbXBvbmVudHNNYXAoKSxuLmRvbVJlZnM9e30sbi5zdGF0ZT17c2hvd0xpc3RQcmljZTohMH0sbn1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiaW5pdFN0cnVjdHVyZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5mb3JtYXR0ZWRQcmljZSYmIiIhPT1lLmZvcm1hdHRlZFByaWNlJiYhZS5pc0RpZ2l0YWw7dGhpcy5zdHJ1Y3R1cmUuaGlkZUJsb2NrKCJwcmljZUJveCIsIXQpO3ZhciBuPXQmJmUuaXNQcmltZTtpZih0aGlzLnN0cnVjdHVyZS5oaWRlQmxvY2soInByaW1lTG9nbyIsIW4pLCJKUCI9PT10aGlzLnByb3BzLm1hcmtldFBsYWNlKXt2YXIgcj10aGlzLnN0cnVjdHVyZS5nZXRDb21wb25lbnRQcm9wKCJoZWFkbGluZSIsInN0eWxlIik7ciYmKHIudmFsdWUuZm9udFN0eWxlPSJub3JtYWwiLHRoaXMuc3RydWN0dXJlLnNldENvbXBvbmVudFByb3AoImhlYWRsaW5lIiwic3R5bGUiLHIudmFsdWUsImNvbnN0YW50IikpfWUubW9iaWxlSGVhZGxpbmUmJnRoaXMuc3RydWN0dXJlLnNldENvbXBvbmVudFByb3AoImhlYWRsaW5lIiwidGV4dCIsIm1vYmlsZUhlYWRsaW5lIiwicGF0aCIpfX0se2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5kb21SZWZzLnByaWNpbmcmJnRoaXMuc2V0U3RhdGUoe3Nob3dMaXN0UHJpY2U6ISgwLHlbImRlZmF1bHQiXSkodGhpcy5kb21SZWZzLnByaWNpbmcpLmNoaWxkcmVuT3ZlcmZsb3coKX0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuc3RhdGUuc2hvd0xpc3RQcmljZT90aGlzLnByb3BzLmZvcm1hdHRlZExpc3RQcmljZTpudWxsO3JldHVybiB0aGlzLnN0cnVjdHVyZS5zZXRDb21wb25lbnRQcm9wKCJwcmljZUJveCIsImxpc3RBbW91bnQiLGUsImNvbnN0YW50IiksbFsiZGVmYXVsdCJdLmNyZWF0ZUVsZW1lbnQoY1siZGVmYXVsdCJdLHtjbGFzc05hbWU6Im1vYmlsZU15c3RpcXVlIixyZW5kZXJpbmdDb250ZXh0OnRoaXMucHJvcHMsc3RydWN0dXJlOnRoaXMuc3RydWN0dXJlLm1vZGVsLGNvbXBvbmVudHNNYXA6dGhpcy5jb21wb25lbnRzTWFwLGRvbVJlZnM6dGhpcy5kb21SZWZzLHVwZGF0ZU9uUmVzaXplOiEwfSl9fV0pLHR9KHUuQ29tcG9uZW50KTt0WyJkZWZhdWx0Il09bSxtLlRFTVBMQVRFX0lEPSJtb2JpbGVNeXN0aXF1ZSIsbS5kaXNwbGF5TmFtZT0iTW9iaWxlTXlzdGlxdWUiLG0ucHJvcFR5cGVzPXt9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiBhKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksdT1uKDMpLGw9KHIodSksbig5OSkpLHA9cihsKSxjPW4oMTAxKSxmPXIoYyksZD1uKDEwMiksaD1yKGQpLHk9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbyh0aGlzLHQpLGkodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbCh0aGlzLGUpKX1yZXR1cm4gYSh0LGUpLHModCxbe2tleToiZ2V0U3RydWN0dXJlcyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oMCxmWyJkZWZhdWx0Il0pKCl9fSx7a2V5OiJnZXRDb21wb25lbnRzTWFwIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0LkNPTVBPTkVOVFNfTUFQfX1dKSx0fShwWyJkZWZhdWx0Il0pO3RbImRlZmF1bHQiXT15LHkuQ09NUE9ORU5UU19NQVA9aFsiZGVmYXVsdCJdLHkuZGlzcGxheU5hbWU9Ik1vYmlsZU15c3RpcXVlQ29udHJvbCIseS5wcm9wVHlwZXM9e319LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybntpZDoiMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93Iix3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMjVweCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4wIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLHdpZHRoOiIxNjBweCIsaGVpZ2h0OiIxMDAlIixwYWRkaW5nOiI1cHggMTBweCA1cHggMTBweCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoiYXNpbkltYWdlIixwcm9wczpbe25hbWU6ImhyZWYiLHZhbHVlOiJhZExpbmsiLHR5cGU6InBhdGgifSx7bmFtZToiY2xpY2tVcmxzIix2YWx1ZToiY2xpY2tVcmxzIix0eXBlOiJwYXRoIn0se25hbWU6InBhdGgiLHZhbHVlOiJhc2luSW1hZ2UiLHR5cGU6InBhdGgifSx7bmFtZToiYWx0Iix2YWx1ZToicHJvZHVjdFRpdGxlIix0eXBlOiJwYXRoIn0se25hbWU6InN4Iix2YWx1ZTo4MCx0eXBlOiJjb25zdGFudCJ9XX0sc3R5bGU6W3tuYW1lOiJmbGV4Iix2YWx1ZToiMCAwIDEyNXB4In1dfSx7aWQ6IjAuMSIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93Iix3aWR0aDoiMTAwJSJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4xLjAiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoiY29sdW1uIix3aWR0aDoiMTAwJSIscGFkZGluZzoiMCAxMHB4IDAgMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY2hpbGRyZW46W3tpZDoiMC4xLjAuMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA1cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiaGVhZGxpbmUifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJ0ZXh0TGluayIscHJvcHM6W3tuYW1lOiJmb250Iix2YWx1ZTp7bWF4TGluZXM6MixtaW5Gb250UHg6MTYsbWF4Rm9udFB4OjE4fSx0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJ0ZXh0Iix2YWx1ZToiaGVhZGxpbmUiLHR5cGU6InBhdGgifSx7bmFtZToiaHJlZiIsdmFsdWU6ImFkTGluayIsdHlwZToicGF0aCJ9LHtuYW1lOiJjbGlja1VybHMiLHZhbHVlOiJjbGlja1VybHMiLHR5cGU6InBhdGgifSx7bmFtZToiZGlzcGxheUFzVGV4dCIsdmFsdWU6ITAsdHlwZToiY29uc3RhbnQifSx7bmFtZToic3R5bGUiLHZhbHVlOntmb250U3R5bGU6Iml0YWxpYyIsY29sb3I6IiM1NTUiLGxpbmVIZWlnaHQ6IjIwcHgifSx0eXBlOiJjb25zdGFudCJ9XX19LHtpZDoiMC4xLjAuMSIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgMCA1cHggMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sY29tcG9uZW50OntpZDoidGV4dExpbmsiLHByb3BzOlt7bmFtZToiZm9udCIsdmFsdWU6e21heExpbmVzOjEsbWluRm9udFB4OjE2LG1heEZvbnRQeDoxNixzaXplOjE2fSx0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJ0ZXh0Iix2YWx1ZToicHJvZHVjdFRpdGxlIix0eXBlOiJwYXRoIn0se25hbWU6ImhyZWYiLHZhbHVlOiJhZExpbmsiLHR5cGU6InBhdGgifSx7bmFtZToiY2xpY2tVcmxzIix2YWx1ZToiY2xpY2tVcmxzIix0eXBlOiJwYXRoIn0se25hbWU6ImRpc3BsYXlBc1RleHQiLHZhbHVlOiExLHR5cGU6ImNvbnN0YW50In0se25hbWU6InN0eWxlIix2YWx1ZTp7Zm9udFdlaWdodDoiNjAwIn0sdHlwZToiY29uc3RhbnQifV19fSx7aWQ6IjAuMS4wLjIiLGxheW91dDp7anVzdGlmeUNvbnRlbnQ6ImZsZXgtc3RhcnQiLGFsaWduSXRlbXM6InN0cmV0Y2giLGZsZXhEaXJlY3Rpb246InJvdyJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToicHJpY2luZyJ9LHtuYW1lOiJjbG9hayIsdmFsdWU6ITF9LHtuYW1lOiJoaWRlIix2YWx1ZTohMX1dLGNoaWxkcmVuOlt7aWQ6IjAuMS4wLjIuMCIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93IixtYXJnaW46IjAgNXB4IDAgMCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToicHJpY2VCb3gifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJwcmljZUJveCIscHJvcHM6W3tuYW1lOiJidXlBbW91bnQiLHZhbHVlOiJmb3JtYXR0ZWRQcmljZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJsaXN0QW1vdW50Iix2YWx1ZToiZm9ybWF0dGVkTGlzdFByaWNlIix0eXBlOiJwYXRoIn0se25hbWU6ImN1cnJlbmN5Iix2YWx1ZToiY3VycmVuY3lTeW1ib2wiLHR5cGU6InBhdGgifSx7bmFtZToidGF4TWVzc2FnZSIsdmFsdWU6ImkxOG4udGF4TWVzc2FnZSIsdHlwZToicGF0aCJ9LHtuYW1lOiJidXlQcmljZVN0eWxlIix2YWx1ZTp7Zm9udFNpemU6IjE1cHgifSx0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJsaXN0UHJpY2VTdHlsZSIsdmFsdWU6e2ZvbnRTaXplOiIxM3B4In0sdHlwZToiY29uc3RhbnQifV19fSx7aWQ6IjAuMS4wLjIuMSIsbGF5b3V0OntqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoic3RyZXRjaCIsZmxleERpcmVjdGlvbjoicm93In0sbWV0YWRhdGE6W3tuYW1lOiJyZWYiLHZhbHVlOiJwcmltZUxvZ28ifSx7bmFtZToiY2xvYWsiLHZhbHVlOiExfSx7bmFtZToiaGlkZSIsdmFsdWU6ITF9XSxjb21wb25lbnQ6e2lkOiJwcmltZUxvZ28iLHByb3BzOlt7bmFtZToibWVkaWEiLHZhbHVlOiJpMThuLnNldHRpbmdzLm1lZGlhIix0eXBlOiJwYXRoIn0se3N0eWxlOnt3aWR0aDoiMjlweCIsaGVpZ2h0OiIxM3B4In19XX0sc3R5bGU6W3tuYW1lOiJvdmVyZmxvdyIsdmFsdWU6InZpc2libGUifV19XSxjc3NDbGFzc2VzOlsiYmxvY2stLWlubGluZSIsIiJdLHN0eWxlOlt7bmFtZToid2hpdGVTcGFjZSIsdmFsdWU6Im5vcm1hbCJ9XX1dfSx7aWQ6IjAuMS4xIixsYXlvdXQ6e2p1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJzdHJldGNoIixmbGV4RGlyZWN0aW9uOiJyb3ciLG1hcmdpbjoiMCAxMHB4IDAgMTBweCIsaGVpZ2h0OiIxMjNweCJ9LG1ldGFkYXRhOlt7bmFtZToicmVmIix2YWx1ZToiIn0se25hbWU6ImNsb2FrIix2YWx1ZTohMX0se25hbWU6ImhpZGUiLHZhbHVlOiExfV0sc3R5bGU6W3tuYW1lOiJvcGFjaXR5Iix2YWx1ZToiMC42NCJ9LHtuYW1lOiJmbGV4Iix2YWx1ZToiMCAwIDlweCJ9XSxjb21wb25lbnQ6e2lkOiJtZWRpYUNlbnRyYWxJbWFnZUNvbnRhaW5lciIscHJvcHM6W3tuYW1lOiJwYXRoIix2YWx1ZToiL2ltYWdlcy9HLzAxL0FtYXpvbkJyYW5kU3RvcmVzUGxhdGZvcm0vYmxhY2tfYXJyb3cucG5nIix0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJhbHQiLHZhbHVlOiJHcmF5IEFycm93Iix0eXBlOiJjb25zdGFudCJ9LHtuYW1lOiJyb2xlIix2YWx1ZToicHJlc2VudGF0aW9uIix0eXBlOiJjb25zdGFudCJ9XX19XSxzdHlsZTpbe25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiIjRkZGRkZGIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiItd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDI1NSwyNTUsMjU1LDEpLCByZ2JhKDI1NSwyNTUsMjU1LDApIDI1JSwgcmdiYSgyNTUsMjU1LDI1NSwwKSksIC13ZWJraXQtbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiItby1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMjU1LDI1NSwyNTUsMSksIHJnYmEoMjU1LDI1NSwyNTUsMCkgMjUlLCByZ2JhKDI1NSwyNTUsMjU1LDApKSwgLW8tbGluZWFyLWdyYWRpZW50KCNGRkZGRkYsICNFQkVCRUIpIn0se25hbWU6ImJhY2tncm91bmQiLHZhbHVlOiItbW96LWxpbmVhci1ncmFkaWVudCgjRkZGRkZGLCAjRUJFQkVCKSJ9LHtuYW1lOiJiYWNrZ3JvdW5kIix2YWx1ZToibGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI1NSwyNTUsMjU1LDEpLCByZ2JhKDI1NSwyNTUsMjU1LDApIDI1JSwgcmdiYSgyNTUsMjU1LDI1NSwwKSksIGxpbmVhci1ncmFkaWVudCgjRkZGRkZGLCAjRUJFQkVCKSJ9XX1dLHN0eWxlOlt7bmFtZToiYm9yZGVyIix2YWx1ZToiMXB4IHNvbGlkICNkZGQifSx7bmFtZToiYmFja2dyb3VuZCIsdmFsdWU6IiNGRkZGRkYifV19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXZhciBvPW4oNDApLGk9cihvKSxhPW4oMzkpLHM9cihhKSx1PW4oNzgpLGw9cih1KSxwPW4oNDIpLGM9cihwKSxmPW4oMzMpLGQ9cihmKTtlLmV4cG9ydHM9e2FzaW5JbWFnZTppWyJkZWZhdWx0Il0sdGV4dExpbms6c1siZGVmYXVsdCJdLHByaWNlQm94OmxbImRlZmF1bHQiXSxwcmltZUxvZ286Y1siZGVmYXVsdCJdLG1lZGlhQ2VudHJhbEltYWdlQ29udGFpbmVyOmRbImRlZmF1bHQiXX19XSk7O3ZhciAkYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWQnKSxyZW5kZXJpbmdDb250ZXh0ID0geyJtYXJrZXRQbGFjZSI6IlVTIiwiYWRMaW5rIjoiaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Rb3Eyd3AtYW84ZFdGWFpWNDR2T1U0SUFBQUZobWVFNDBnRUFBQUdRQVJ0MXdrYy9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPXNzRzRXRnlYcHUuZGhYRXgxLk9HOXciLCJyZXZpZXdMaW5rIjoiaHR0cHM6Ly9hYXgtdXMtZWFzdC5hbWF6b24tYWRzeXN0ZW0uY29tL3gvYy9Rb3Eyd3AtYW84ZFdGWFpWNDR2T1U0SUFBQUZobWVFNDBnRUFBQUdRQVJ0MXdrYy9odHRwczovL3d3dy5hbWF6b24uY29tL2RwLzE1MDg3Njc0ODM/YWF4aXRrPXNzRzRXRnlYcHUuZGhYRXgxLk9HOXcjY3VzdG9tZXJSZXZpZXdzIiwiY3JlYXRpdmVJZCI6IjE4NDkwODExNjA3MDEiLCJhZElkIjoiNDUzMzA3NzgxMDcwMSIsInByb2R1Y3RUaXRsZSI6IkxlYXJuIFMuUS5MLiBmcm9tIHRoZSBleHBlcnRzIGluIHRoZSBwcmVtaWVyIGd1aWRlIGZvciBiZWdpbm5lcnMiLCJoZWFkbGluZSI6IlRyb3VibGUgbGV2ZXJhZ2luZyB5b3VyIGRhdGE/IiwiYXNpbkltYWdlIjoiaHR0cHM6Ly9pbWFnZXMtbmEuc3NsLWltYWdlcy1hbWF6b24uY29tL2ltYWdlcy9JLzUxVnpTZGpyaU9MLl9BQ19TUjEyOCwxNDVfLmpwZyIsInVuc3ByaXRlZEltYWdlIjoiaHR0cHM6Ly9pbWFnZXMtbmEuc3NsLWltYWdlcy1hbWF6b24uY29tL2ltYWdlcy9JLzUxa3pnVlMtLVFMLmpwZyIsImN1c3RvbWVyUmV2aWV3U3VtbWFyeSI6eyJyYXRpbmciOjQuMzAzODI1MzM1LCJjb3VudCI6MTU4LCJhc2luIjoiMTUwODc2NzQ4MyJ9LCJiYWRnZUluZm9ybWF0aW9uTWFwIjpudWxsLCJjdXJyZW5jeVN5bWJvbCI6IiQiLCJmb3JtYXR0ZWRMaXN0UHJpY2UiOiIxOC45OSIsImZvcm1hdHRlZFByaWNlIjoiMTQuOTkiLCJwcmljZUluZm8iOnsid2hvbGVBbW91bnQiOiIxNCIsImRlY2ltYWxQYXJ0IjoiOTkifSwicHJpY2VGb3JtYXR0aW5nRmxhZ3MiOnsiaXNTeW1ib2xTdXBlcnNjcmlwdCI6dHJ1ZSwic3ltYm9sUG9zaXRpb24iOiJwcmVmaXhlZCJ9LCJwcmljZVBlclVuaXRNZXNzYWdlIjoiIiwiaXNQcmltZSI6dHJ1ZSwiaXNEaWdpdGFsIjpmYWxzZSwiaTE4biI6eyJzZXR0aW5ncyI6eyJzZWxlY3Rpb25MYWJlbCI6IkVuZ2xpc2ggKFVTKSIsInJlZ2lvbiI6Im5hIiwiY3VycmVuY3kiOiIkIiwiZG9tYWluIjoiYW1hem9uLmNvbSIsIm1lZGlhIjoiMDEiLCJtZXJjaGFudElkIjoiQVRWUERLSUtYMERFUiIsIm1hcmtldHBsYWNlSWQiOiJBVFZQREtJS1gwREVSIiwibG9jYWxlTW9udGhzIjpbIkphbiIsIkZlYiIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1ZyIsIlNlcHQiLCJPY3QiLCJOb3YiLCJEZWMiXX0sInRheE1lc3NhZ2UiOiIiLCJzcG9uc29yZWRCeSI6IlNwb25zb3JlZCBieSIsInNob3BOb3ciOiJTaG9wIG5vdyIsImJlc3RTZWxsZXIiOiJCZXN0IFNlbGxlciIsIm5ld1JlbGVhc2UiOiJOZXcgUmVsZWFzZSIsImJhZGdlSW4iOiJpbiJ9LCJjbGlja1VybHMiOlsiaHR0cHM6Ly9zLmFtYXpvbi1hZHN5c3RlbS5jb20vaXUzP2Q9Zm9yZXN0ZXItZGlkJmV4LWZjaD00MTY3MzE2MTMmZXgtZmFyZ3M9P2klM0RpcmJDbjVxangxWVZkbFhqaTg1VGdnJTI2YXNpJTNEJTNBMDEwMWIwZGQ5ZTllZDZlNGQxNGVlNTkyZDE0MzA3MmM1MDVhNTNlMWUzZTc2YTY1M2FiNjYzZmEwMTBmZWM5OTAzODYlMjZjbGljayUzRDEmY2I9MTUxODcwNTEyOTcxOSJdLCJicmFuZExvZ28iOiJpbWFnZXMvUy9hYnMtaW1hZ2UtdXBsb2FkLW5hL2UvYW1zL0FUVlBES0lLWDBERVIvNGI2MjBmZWU0ZGU3NmE1NDRjM2FkOTNjYjEwNjhhNjkudzUwMC5oNDc0Ll9DUjEzLDAsNDc0LDQ3NF9TTDI4MF9TWTgwXy5qcGciLCJicmFuZE5hbWUiOiJDbHlkZUJhbmsgTWVkaWEgTExDIiwicHJvZHVjdEltYWdlIjp7InVybCI6Imh0dHBzOi8vaW1hZ2VzLW5hLnNzbC1pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvSS81MWt6Z1ZTLS1RTC5qcGciLCJoZWlnaHQiOjUwMCwid2lkdGgiOjQwNn19O2lmICgkYWQpIHtSZWFjdERPTS5yZW5kZXIoUmVhY3QuY3JlYXRlRWxlbWVudChMaWJyYXJ5LmRlZmF1bHQsIHJlbmRlcmluZ0NvbnRleHQpLCAkYWQpO3dpbmRvdy5wZGFnU2NvcGUuY2xpZW50QVBJLmFkZFZpZXdhYmlsaXR5TGlzdGVuZXIoJGFkKTt3aW5kb3cucGRhZ1Njb3BlLmNsaWVudEFQSS5hZGRDcmVhdGl2ZUNsaWNrTGlzdGVuZXIoJGFkKTt9PC9zY3JpcHQ+PC9ib2R5PjwvaHRtbD48L2Rpdj4=&quot;,&quot;enableAdBlockerDetector&quot;:true,&quot;disableResizeFunc&quot;:true,&quot;fallbackStaticAdImgUrl&quot;:&quot;&quot;,&quot;fallbackStaticAdClickUrl&quot;:&quot;&quot;,&quot;fallbackStaticAdExtraStyle&quot;:&quot;&quot;,&quot;advertisementTextOnTop&quot;:false,&quot;viewabilityStandards&quot;:[{&quot;p&quot;:0,&quot;t&quot;:0,&quot;def&quot;:&quot;amzn&quot;},{&quot;p&quot;:50,&quot;t&quot;:1,&quot;def&quot;:&quot;iab&quot;},{&quot;p&quot;:100,&quot;t&quot;:0,&quot;def&quot;:&quot;groupm&quot;}],&quot;ajaxWeblabTriggerId&quot;:&quot;&quot;,&quot;hostDomain&quot;:&quot;https://www.amazon.com&quot;,&quot;userAgent&quot;:&quot;Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1&quot;,&quot;userConnectionInfo&quot;:{&quot;mobileConnectionType&quot;:null,&quot;connectionType&quot;:&quot;unknown&quot;},&quot;isAUIAvailable&quot;:&quot;3.18.2-2018-02-15&quot;,&quot;cookie&quot;:&quot;x-wl-uid=1WXBZ0Gt/NIjrMrKToWzqEoShlkbJFxXqK7d7eruyBHba3bx516TjY5FSIvziQCA3Gv7b0MffkZo=; aws_lang=en; aws-target-static-id=1485170961612-541803; aws-target-data=%7B%22support%22%3A%221%22%7D; aws-ubid-main=159-7441294-4671144; s_fid=5D55736E4E81630C-2BCB156C67276537; s_ppv=0; skin=noskin; session-token=GwmX9b8ErPr+y9/X4tOnH2NlakyrEB6uH0ndiwOgxZNJpv9EDYAzzTicJ2VkazGtd0qeseZAEF59w+otDIc1tgsjaHDIM9Ap01XspZFijLZnp4ZTcVlOy46T9mnipC6w67Im+F234XhEskN4jEHIOPuWvdjG6KieF9B1qlWzyY48ryzuxbHISWDfjFuLTn78ggiBueWBLjjxz8lfGNtReOgss5mLTZOaDB+7SUFgVbom2aIFlXb26PZ1UZQ04Ri1; ubid-main=131-2393016-1049709; session-id=147-0816675-1753153; aws-target-visitor-id=1485170961617-283514.26_17; aws-mkto-trk=id%3A112-TZM-766%26token%3A_mch-aws.amazon.com-1515491028950-95143; aws-session-id=140-3318658-9277840; aws-session-id-time=2146211066l; regStatus=registered; s_sq=%5B%5BB%5D%5D; __utmv=194891197.%22Y2eilR%401E0eaUd1y4Jy478UIiZmNGbRRjXHrbQvpCaiuGPXLvdZpy4%3FkXZ79EsvP%22; __utmc=194891197; pN=7; s_pers=%20s_vnum%3D1942562894050%2526vn%253D3%7C1942562894050%3B%20s_invisit%3Dtrue%7C1517331617155%3B%20s_nr%3D1517329817167-Repeat%7C1525105817167%3B; s_sess=%20s_cc%3Dtrue%3B%20s_sq%3D%3B; appstore-devportal-locale=en_US; AMCVS_4A8581745834114C0A495E2B%40AdobeOrg=1; AMCV_4A8581745834114C0A495E2B%40AdobeOrg=-1891778711%7CMCIDTS%7C17571%7CMCMID%7C11904074407816115763545700786442573624%7CMCOPTOUT-1518131239s%7CNONE%7CMCAID%7C2D04D1058530F5A2-6000030420009E4A%7CvVersion%7C2.4.0; s_lv=1518124039358; s_cc=true; c_m=undefinedwww.google.deNatural%20Search; session-id-time=2082787201l; s_vn=1549660061459%26vn%3D6; aws-userInfo=%7B%22arn%22%3A%22arn%3Aaws%3Aiam%3A%3A672413603088%3Aroot%22%2C%22alias%22%3A%22%22%2C%22username%22%3A%22Maja%2520Komel%22%2C%22keybase%22%3A%22%22%2C%22issuer%22%3A%22https%3A%2F%2Fwww.amazon.com%2Fap%2Fsignin%22%7D; aws-session-token=\&quot;+9lzzvGeCuRd2h296LsZD8fsOUkTpImyWpsvgPeqP6CutmWSJYNaJPpgFNd+LARPtdTJSouC444Vz/2kOOuvF9e1ccFSXb+ZnGkBaHuTY1xRGvDGe8RnwwC3J1w69hhrBu4Y1iWUo75hDCoOFI+QpavGp9nOhCVlx6xYEsCN0Y8s3pp1r/MWFsfmhN5pdiyZO1Lzcoc4isZiiTZLPz0Cuu8WoxHyC7I4ldZm8oIyCgM=\&quot;; __utma=194891197.1735141489.1485170987.1517331742.1518295984.26; __utmz=194891197.1518295984.26.19.utmccn=(referral)|utmcsr=console.aws.amazon.com|utmcct=/cloud9/home|utmcmd=referral; s_dslv=1518296040762; s_nr=1518296040774-Repeat; csm-hit=s-7F3MGDYTH1YH8KVBSFWJ|1518705129103&quot;,&quot;aPageStart&quot;:1518705128898,&quot;adStartTime&quot;:1518705131052}" id="ape_detail_btf_detail-mWeb_iframe" src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/msf-1.15._V488131532_.html" scrolling="no" height="125px" width="100%" class="" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="true" allowfullscreen="" mozallowfullscreen="" webkitallowfullscreen="" data-arid="5b25a8c2cf2441d185621391dfd7c737" style="width: 1px; min-width: 100%; display: none !important;"></iframe></div></div><script>(function(){function a(d,e){if(window.addEventListener){window.addEventListener(d,e,false);}else{if(window.attachEvent){window.attachEvent("on"+d,e);}}}function c(d,e){if(window.removeEventListener){window.removeEventListener(d,e,false);}else{if(window.detachEvent){window.detachEvent("on"+d,e);}}}var b=function(){(function(){(function(j,n){j.sfLogErrors=j.sfLogErrors||false;var o=o||function(s,r){r=r||new Error(s);if(j.ue&&typeof ue.count=="function"){ue.count("adplacements:safeFrameError",1);}if(!j.sfLogErrors){return;}if(j.ueLogError){j.ueLogError(r,{logLevel:"ERROR",attribution:"APE-safeframe",message:s+" "});}else{if(typeof console!=="undefined"&&console.error){console.error(s,r);}}};function d(){return j.innerHeight||n.documentElement.clientHeight;}function g(){return j.innerWidth||n.documentElement.clientWidth;}function e(t,r,s){if(t>0){return(s>t);}else{return(r>0);}}var f=function(){return(Date.now?Date.now():new Date().getTime());};throttle=function(s,u,y){var r,w,z;var x=null;var v=0;if(!y){y={};}var t=function(){v=y.leading===false?0:f();x=null;z=s.apply(r,w);if(!x){r=w=null;}};return function(){var B=f();if(!v&&y.leading===false){v=B;}var A=u-(B-v);r=this;w=arguments;if(A<=0||A>u){if(x){clearTimeout(x);x=null;}v=B;z=s.apply(r,w);if(!x){r=w=null;}}else{if(!x&&y.trailing!==false){x=setTimeout(t,A);}}return z;};};function l(u,w,v,r){try{var t=n.getElementById(u).getBoundingClientRect();if(e(t.top,t.bottom,d())&&e(t.left,t.right,g())){if(typeof uet=="function"){uet("bb","adplacements:viewablelatency:"+w,{wb:1});if(v){uet("bb","adplacements:viewablelatency:"+v,{wb:1});}}if(typeof uex=="function"&&j.ue&&typeof ue.count=="function"){if(j.apeViewableLatencyTrackers[r].loaded){uex("ld","adplacements:viewablelatency:"+w,{wb:1});if(v){uex("ld","adplacements:viewablelatency:"+v,{wb:1});}ue.count("adplacements:htmlviewed:loaded:"+w,1);if(v){ue.count("adplacements:htmlviewed:loaded:"+v,1);}}ue.count("adplacements:htmlviewed:"+w,1);if(v){ue.count("adplacements:htmlviewed:"+v,1);}}j.apeViewableLatencyTrackers[r].viewed=true;if(j.apeViewableLatencyTrackers[r].tracker){c("scroll",j.apeViewableLatencyTrackers[r].tracker);c("resize",j.apeViewableLatencyTrackers[r].tracker);}}}catch(s){j.apeViewableLatencyTrackers[r].valid=false;}}try{j.apeViewableLatencyTrackers=j.apeViewableLatencyTrackers||{};var q="ape_detail_btf_detail-mWeb_placement";var p="detail_btf_detail-mWeb".replace(/\_/g,":");var h="";var i="5b25a8c2cf2441d185621391dfd7c737";j.apeViewableLatencyTrackers[i]=j.apeViewableLatencyTrackers[i]||{};j.apeViewableLatencyTrackers[i].valid=true;l(q,p,h,i);if(j.apeViewableLatencyTrackers[i].valid&&!j.apeViewableLatencyTrackers[i].viewed){j.apeViewableLatencyTrackers[i].tracker=throttle(function(){l(q,p,h,i);},20);a("scroll",j.apeViewableLatencyTrackers[i].tracker);a("resize",j.apeViewableLatencyTrackers[i].tracker);}}catch(k){if(j.apeViewableLatencyTrackers&&j.apeViewableLatencyTrackers["5b25a8c2cf2441d185621391dfd7c737"]){j.apeViewableLatencyTrackers["5b25a8c2cf2441d185621391dfd7c737"].valid=false;}o("Error initializing viewable latency instrumentation",k);}try{j.btf={};j.btf.adStartTime=(new Date()).getTime();var m=j.DAsf||j.MAsf||null;if(m){m.loadAds();}else{m=n.createElement("script");m.type="text/javascript";m.async=true;m.setAttribute("crossorigin","anonymous");m.charset="utf-8";m.src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/MAsf-1.15._CB488131535_.js?csm_attribution=APE-SafeFrame";m.onerror=function(){o("Error loading SafeFrame library");};(n.getElementsByTagName("head")[0]||n.getElementsByTagName("body")[0]).appendChild(m);}}catch(k){o("Error appending MAsf library",k);}}(window,document));})();};b();})();</script>
</div>
<a></a>
<script>
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/G/01/AUIClients/CustomerReviewsMedleyAssets-d22f4f962f932cc6922bccca8b5b14475c306dc6._V2_.js#AUIClients/CustomerReviewsMedleyAssets.device_type-mobile.secure.weblab-DP_PROFILE_REVIEWS_GENOME_WIDGET_INTEG_112957-T1.min');
</script>
<div id="aw-udpv3-customer-reviews_feature_div" data-hook="reviews-mobile-widget" class="a-section a-spacing-large customerReviewsMobileFeature"><div class="a-row a-spacing-small"><h2 data-hook="reviews-mobile-title" class="a-spacing-micro customerReviewsTitle">Customer Reviews</h2><div class="a-box-group"><div class="a-box"><div class="a-box-inner"><a href="/gp/aw/reviews/193435659X/ref=cm_cr_dp_mb_top?ie=UTF8" data-hook="reviews-summary-mobile" class="a-touch-link a-box a-touch-link-noborder a-first reviewsSummary"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row"><span data-hook="total-review-count" class="a-size-medium totalReviewCount a-text-bold">58 customer reviews</span></div><div class="a-icon-row a-spacing-micro"><i data-hook="average-stars-rating-anywhere" class="a-icon a-icon-star a-star-4 averageStarRating"><span class="a-icon-alt">4.2 out of 5 stars</span></i><span data-hook="average-stars-rating-text" class="a-text-beside-button averageStarRatingText">4.2 out of 5 stars</span></div></div></a>
<hr class="a-divider-text">
<div id="cm_cr_skyfall" class="a-section celwidget">
<div class="a-row a-spacing-small">
<div class="a-column a-span8">
<span class="a-size-medium a-text-bold">
Rated by customers interested in
</span>
</div>
<div class="a-column a-span4 a-text-right a-span-last">
<span class="a-declarative" data-action="a-modal" data-a-modal="{&quot;name&quot;:&quot;skyfallWhatsThis&quot;,&quot;activate&quot;:&quot;onclick&quot;,&quot;header&quot;:&quot;What's this?&quot;,&quot;inlineContent&quot;:&quot;\u201cRated by customers interested in\u201d shows how the customers interested in a specific topic rated this product. Customers\u2019 interests are determined by Amazon based on the customers\u2019 past purchases.&quot;}"><a href="javascript:void(0)" class="a-popover-trigger a-declarative"><span data-hook="cm_cr_skyfall_medley_whatisthis" class="a-size-mini">What's this?</span><i class="a-icon a-icon-popover"></i></a></span>
</div>
</div>
<div aria-live="polite" data-a-expander-name="clique-ratings-read-more" data-a-expander-collapsed-height="120" class="a-expander-collapsed-height a-row a-expander-container a-spacing-base a-expander-partial-collapse-container" style="max-height: none; height: 120px;">
<div aria-expanded="false" class="a-expander-content a-expander-partial-collapse-content" style="padding-bottom: 20px;">
<div class="a-section a-spacing-small">
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_ttl" class="a-row a-spacing-none">
<span data-hook="cm_cr_skyfall_medley_group" class="a-text-bold">
Software Engineering Books
</span>
</div>
</span>
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_sr" class="a-row">
<i class="a-icon a-icon-star a-star-4 averageStarRating"><span class="a-icon-alt">4.0 out of 5 stars</span></i>
<span class="a-text-beside-button averageStarRatingText">
4.0 out of 5 stars
</span>
</div>
</span>
</div>
<div class="a-section a-spacing-small">
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_ttl" class="a-row a-spacing-none">
<span data-hook="cm_cr_skyfall_medley_group" class="a-text-bold">
Languages
</span>
</div>
</span>
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_sr" class="a-row">
<i class="a-icon a-icon-star a-star-4 averageStarRating"><span class="a-icon-alt">4.0 out of 5 stars</span></i>
<span class="a-text-beside-button averageStarRatingText">
4.0 out of 5 stars
</span>
</div>
</span>
</div>
<div class="a-section a-spacing-small">
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_ttl" class="a-row a-spacing-none">
<span data-hook="cm_cr_skyfall_medley_group" class="a-text-bold">
Computer Books
</span>
</div>
</span>
<span class="a-declarative" data-action="reviews:skyfall-clique-click" data-reviews:skyfall-clique-click="{}">
<div data-reftag="cm_cr_dp_mb_sky_sr" class="a-row">
<i class="a-icon a-icon-star a-star-4 averageStarRating"><span class="a-icon-alt">4.2 out of 5 stars</span></i>
<span class="a-text-beside-button averageStarRatingText">
4.2 out of 5 stars
</span>
</div>
</span>
</div>
</div>
<div class="a-expander-header a-expander-partial-collapse-header" style="opacity: 1; display: block;"><div class="a-expander-content-fade"></div><a href="javascript:void(0)" data-action="a-expander-toggle" class="a-declarative" data-a-expander-toggle="{&quot;allowLinkDefault&quot;:true, &quot;expand_prompt&quot;:&quot;Read more&quot;, &quot;collapse_prompt&quot;:&quot;Read less&quot;}"><i class="a-icon a-icon-extender-expand"></i><span class="a-expander-prompt">Read more</span></a></div>
</div>
<div class="a-section feedback-section">
<div class="a-row a-spacing-base is-feature-helpful-row">
<div class="a-column a-span6">
<span class="a-size-base">
Is this feature helpful?
</span>
</div>
<div class="a-column a-span3">
<span class="a-declarative" data-action="reviews:skyfall-feedback-click" data-reviews:skyfall-feedback-click="{}">
<span class="a-button a-button-beside-text a-button-small cr-feedback-helpful-yes" id="a-autoid-4"><span class="a-button-inner"><input data-reftag="cm_cr_dp_mb_hlp_yes" class="a-button-input" type="submit" aria-labelledby="a-autoid-4-announce"><span class="a-button-text a-text-center" aria-hidden="true" id="a-autoid-4-announce">
Yes
</span></span></span>
</span>
</div>
<div class="a-column a-span3 a-span-last">
<span class="a-declarative" data-action="reviews:skyfall-feedback-click" data-reviews:skyfall-feedback-click="{}">
<span class="a-button a-button-beside-text a-button-small cr-feedback-helpful-no" id="a-autoid-5"><span class="a-button-inner"><input data-reftag="cm_cr_dp_mb_hlp_no" class="a-button-input" type="submit" aria-labelledby="a-autoid-5-announce"><span class="a-button-text a-text-center" aria-hidden="true" id="a-autoid-5-announce">
No
</span></span></span>
</span>
</div>
</div>
<div class="a-section aok-hidden more-feedback-section">
<div class="a-box a-alert-inline a-alert-inline-success"><div class="a-box-inner a-alert-container"><i class="a-icon a-icon-alert"></i><div class="a-alert-content">
<span class="a-size-base a-color-success">
Thank you for your feedback.
</span>
</div></div></div>
</div>
</div>
</div>
</div></div><div class="a-box mostHelpfulReviewsFeature"><div class="a-box-inner">
<span data-cr-weblab-trigger-on-scroll="{&quot;metricName&quot;:&quot;dp-scroll-down-to-reviews-widget-mobile&quot;,&quot;prefix&quot;:&quot;&quot;}"></span>
<h3 class="a-spacing-small mostHelpfulReviewsTitle">Top reviews</h3><div id="cm-cr-dp-aw-review-list" class="a-row a-spacing-medium celwidget"><style>
.reviewText, .reviewByLine {
word-wrap: break-word;
}
a.enthusiast-badge, a.enthusiast-badge:visited, a.enthusiast-badge:link
{
color: #538000; /*GREEN*/
text-decoration: none;
}
</style>
<div class="a-row"><a href="/gp/profile/amzn1.account.AGS3JT27HFELWIDRJAPU42DCENZA/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">David J. Anderson</span></div></a></div><div id="R29YSPVB4QPPPZ" class="a-section a-spacing-medium"><div id="customer_review-R29YSPVB4QPPPZ" class="a-section celwidget"><a href="/gp/aw/review/193435659X/R29YSPVB4QPPPZ/ref=cm_cr_dp_mb_rvw_1?ie=UTF8&amp;cursor=1" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-4 review-rating aok-align-center"><span class="a-icon-alt">4.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">Seven Languages in Seven Weeks gives us a good overview of seven interesting languages. The book doesn't delve into the languages to the extent that I wish it did, but it...</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AEWS7OTWH2JXSMKN445H3OWOUIVA/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">SemioticLabyrinth</span></div></a></div><div id="R2SPV2IY5ASBK5" class="a-section a-spacing-medium"><div id="customer_review-R2SPV2IY5ASBK5" class="a-section celwidget"><a href="/gp/aw/review/193435659X/R2SPV2IY5ASBK5/ref=cm_cr_dp_mb_rvw_2?ie=UTF8&amp;cursor=2" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-5 review-rating aok-align-center"><span class="a-icon-alt">5.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">This has been one of my favorite programming books. I haven't worked through all of it, but I did enjoy playing with the Io language. I love how he compares the languages to...</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AEZSSCKQIMN3SNYMJPRQ53MN4MQQ/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">Yun-Peng Wang</span></div></a></div><div id="R3PTNRE4693B2O" class="a-section a-spacing-medium"><div id="customer_review-R3PTNRE4693B2O" class="a-section celwidget"><a href="/gp/aw/review/193435659X/R3PTNRE4693B2O/ref=cm_cr_dp_mb_rvw_3?ie=UTF8&amp;cursor=3" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-3 review-rating aok-align-center"><span class="a-icon-alt">3.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">There is one movie for each chapter and I think the idea of the author is to make readers fun. However, I think the real fun comes from what is covered in this book.<br>I...</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AHF6FQ3DCLZDV4SGIEERNP33QAPA/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/I/41aPGL4tEML._CR0,5.0,272,272_SX48_.jpg"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/I/41aPGL4tEML._CR0,5.0,272,272_SX48_.jpg"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">Mark Livingstone</span></div></a></div><div id="R3BEMLU7G94UF9" class="a-section a-spacing-medium"><div id="customer_review-R3BEMLU7G94UF9" class="a-section celwidget"><a href="/gp/aw/review/193435659X/R3BEMLU7G94UF9/ref=cm_cr_dp_mb_rvw_4?ie=UTF8&amp;cursor=4" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-4 review-rating aok-align-center"><span class="a-icon-alt">4.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">While I have been programming for many years, there are any languages I still have not tried. Reading this book gave me some idea of where these various languages fit in the...</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AFNMMUTDULUFBU2NZT3TQILISGTA/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/I/51OSYUvAyRL._CR62,0,375,375_SX48_.jpg"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/I/51OSYUvAyRL._CR62,0,375,375_SX48_.jpg"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">Amazon Customer</span></div></a></div><div id="R2RAZ7N2CGN3P0" class="a-section a-spacing-medium"><div id="customer_review-R2RAZ7N2CGN3P0" class="a-section celwidget"><a href="/gp/aw/review/193435659X/R2RAZ7N2CGN3P0/ref=cm_cr_dp_mb_rvw_5?ie=UTF8&amp;cursor=5" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-4 review-rating aok-align-center"><span class="a-icon-alt">4.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">I believe this book is already outdated because some of the languages are dead or dying. Still, enjoyable for programmers or anyone wanted to learn more about programming.</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AECB4IDRQCNNEJD4RLUSHZCVEZ4Q/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">Amazon Customer</span></div></a></div><div id="R2RZ76QHNR9MBI" class="a-section a-spacing-medium"><div id="customer_review-R2RZ76QHNR9MBI" class="a-section celwidget"><a href="/gp/aw/review/193435659X/R2RZ76QHNR9MBI/ref=cm_cr_dp_mb_rvw_6?ie=UTF8&amp;cursor=6" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-4 review-rating aok-align-center"><span class="a-icon-alt">4.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">Great for beginners and new students. Easy to read and comprehend intros to several language fundamentals.</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AFHXLFOQAHV5LEQBTMXBJT74QA7A/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/I/41aB5H2yZ+L._CR0,0,392,392_SX48_.jpg"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/I/41aB5H2yZ+L._CR0,0,392,392_SX48_.jpg"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">R. Friesel Jr.</span></div></a></div><div id="R1RN6XSRMI652W" class="a-section a-spacing-medium"><div id="customer_review-R1RN6XSRMI652W" class="a-section celwidget"><a href="/gp/aw/review/193435659X/R1RN6XSRMI652W/ref=cm_cr_dp_mb_rvw_7?ie=UTF8&amp;cursor=7" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-3 review-rating aok-align-center"><span class="a-icon-alt">3.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">I like the idea of this book more than the book itself. Granted, Tate took on a daunting task: how do you introduce seven divergent languages with seven divergent styles and...</span></div></a></div></div><div class="a-row"><a href="/gp/profile/amzn1.account.AGXFA7AR75DEVGWH653QKCL3ILPA/ref=cm_cr_dp_mb_gw_tr?ie=UTF8" class="a-profile" data-a-size="small"><div aria-hidden="true" class="a-profile-avatar-wrapper"><div class="a-profile-avatar"><img src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/grey-pixel.gif" class="a-lazy-loaded" data-src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"><noscript>&lt;img src="https://images-na.ssl-images-amazon.com/images/S/amazon-avatars/default._CR0,0,1024,1024_SX48_.png"&gt;</noscript></div></div><div class="a-profile-content"><span class="a-profile-name">Scott Piper</span></div></a></div><div id="R2A1V60RUTRFGS" class="a-section a-spacing-medium"><div id="customer_review-R2A1V60RUTRFGS" class="a-section celwidget"><a href="/gp/aw/review/193435659X/R2A1V60RUTRFGS/ref=cm_cr_dp_mb_rvw_8?ie=UTF8&amp;cursor=8" class="a-touch-link a-box a-touch-link-noborder a-spacing-none review"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i><div class="a-row a-spacing-none a-grid-vertical-align a-grid-center"><i class="a-icon a-icon-star-small a-star-small-5 review-rating aok-align-center"><span class="a-icon-alt">5.0 out of 5 stars</span></i><span class="a-letter-space"></span><span data-hook="msrp-avp-badge-linkless" class="a-size-mini a-color-state a-text-bold">Verified Purchase</span></div><span class="a-size-base reviewText">I find this book to be a lot like "Programming Collective Intelligence" in that it introduces you to new concepts for even experienced developers. You're expected to know a...</span></div></a></div></div></div></div></div><a href="/gp/aw/reviews/193435659X/ref=cm_cr_dp_mb_show_all_btm?ie=UTF8" data-hook="see-all-reviews-link-mobile" class="a-touch-link a-box seeMostRecentReviews a-text-bold"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>See all 58 reviews</div></a></div></div><span class="a-button a-button-supplemental writeReviewButton" id="a-autoid-6"><span class="a-button-inner"><i class="a-icon a-icon-supplemental"></i><a href="/review/create-review/ref=cm_cr_dp_mb_wr_but?ie=UTF8&amp;channel=awUDPv3&amp;asin=193435659X" data-hook="mobley-write-review" class="a-button-text" role="button" id="a-autoid-6-announce">Write a review</a></span></span></div>
<div id="sponsoredProducts2_feature_div" data-feature-name="sponsoredProducts2" data-template-name="sponsoredProducts2" class="a-section a-spacing-none feature">
<div class="a-row a-spacing-large"> <h2 class="a-carousel-heading">Sponsored products related to this item</h2> <div id="sp_phone_detail2" data-a-carousel-options="{&quot;initialSeenAsins&quot;:&quot;\&quot;B0725B8B5F\&quot;,\&quot;B01MQYCGRX\&quot;,\&quot;B071NFL1M7\&quot;,\&quot;B01N3CZ7WC\&quot;,\&quot;B01M0FRJX0\&quot;,\&quot;B073X8633K\&quot;,\&quot;B002D657DY\&quot;&quot;,&quot;set_size&quot;:51,&quot;name&quot;:&quot;sp_phone_detail2_carousel&quot;,&quot;show_partial_text&quot;:true,&quot;ajax&quot;:{&quot;params&quot;:{&quot;cc&quot;:7,&quot;wName&quot;:&quot;sp_phone_detail2&quot;,&quot;referringSearchEngine&quot;:&quot;Amazon&quot;,&quot;start&quot;:7,&quot;ASIN&quot;:&quot;193435659X&quot;,&quot;pRID&quot;:&quot;7F3MGDYTH1YH8KVBSFWJ&quot;},&quot;url&quot;:&quot;/gp/nemo/spd/handlers/spd-shov.html&quot;},&quot;carousel_class&quot;:&quot;mobile&quot;}" data-a-display-strategy="stretchyGoodness" data-a-transition-strategy="none" data-a-class="mobile" class="a-begin a-carousel-container a-carousel-display-stretchyGoodness a-carousel-transition-none sponsored-products-detail-mobile"><input autocomplete="on" type="hidden" class="a-carousel-firstvisibleitem"> <div class="a-row a-carousel-controls a-carousel-row"><div class="a-carousel-row-inner"><div class="a-carousel-col a-carousel-center"><div class="a-carousel-viewport" sponsored-products-carousel-initialized="true"><ol class="a-carousel" role="list" style="width: 552px;"> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail2_1787281396" data-asin="1787281396" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200004724846471&amp;adIndex=0" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200004724846471&amp;eventType=2&amp;adIndex=0"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=7216113329471279&widgetName=sp_phone_detail2&adId=200004724846471&eventType=2&adIndex=0"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="Learning Functional Programming in Go: Change the way you approach your applications using functional programming in Go" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_0?ie=UTF8&amp;adId=A0511890LKYGAMB1GTN3&amp;qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;url=%2Fdp%2F1787281396%2Fref%3Dsspa_mw_detail_0%3Fpsc%3D1"> <div class="a-row"> <img alt="Learning Functional Programming in Go: Change the way you approach your applications using functional programming in Go" src="https://images-na.ssl-images-amazon.com/images/I/41bBN4V5jdL._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>Learning Functional Pr...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4-5"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">3 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$44.99</span> <span style="position: relative; top: 2px;"> <i class="a-icon a-icon-prime a-icon-small"></i> </span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail2_1787120422" data-asin="1787120422" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200004566661371&amp;adIndex=1" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200004566661371&amp;eventType=2&amp;adIndex=1"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=7216113329471279&widgetName=sp_phone_detail2&adId=200004566661371&eventType=2&adIndex=1"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="Learning RxJava" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_1?ie=UTF8&amp;adId=A013506725THEMCR2TL86&amp;qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;url=%2Fdp%2F1787120422%2Fref%3Dsspa_mw_detail_1%3Fpsc%3D1"> <div class="a-row"> <img alt="Learning RxJava" src="https://images-na.ssl-images-amazon.com/images/I/51uxj0OLNoL._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>Learning RxJava</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-5"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">3 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$44.99</span> <span style="position: relative; top: 2px;"> <i class="a-icon a-icon-prime a-icon-small"></i> </span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail2_1783980281" data-asin="1783980281" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200004564841371&amp;adIndex=2" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200004564841371&amp;eventType=2&amp;adIndex=2"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=7216113329471279&widgetName=sp_phone_detail2&adId=200004564841371&eventType=2&adIndex=2"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="Machine Learning for OpenCV: Intelligent image processing with Python" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_2?ie=UTF8&amp;adId=A0947487OIFIBYXH3UW4&amp;qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;url=%2Fdp%2F1783980281%2Fref%3Dsspa_mw_detail_2%3Fpsc%3D1"> <div class="a-row"> <img alt="Machine Learning for OpenCV: Intelligent image processing with Python" src="https://images-na.ssl-images-amazon.com/images/I/41CKBKW8y4L._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>Machine Learning for O...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-5"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">6 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$33.31</span> <span style="position: relative; top: 2px;"> <i class="a-icon a-icon-prime a-icon-small"></i> </span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail2_0997316020" data-asin="0997316020" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200003679605631&amp;adIndex=3" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200003679605631&amp;eventType=2&amp;adIndex=3"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=7216113329471279&widgetName=sp_phone_detail2&adId=200003679605631&eventType=2&adIndex=3"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="Computer Science Distilled: Learn the Art of Solving Computational Problems" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_3?ie=UTF8&amp;adId=A017464834EHVSYTE4TQ9&amp;qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;url=%2Fdp%2F0997316020%2Fref%3Dsspa_mw_detail_3%3Fpsc%3D1"> <div class="a-row"> <img alt="Computer Science Distilled: Learn the Art of Solving Computational Problems" src="https://images-na.ssl-images-amazon.com/images/I/51lr5T3UQ8L._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>Computer Science Disti...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4-5"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">51 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$22.50</span> <span style="position: relative; top: 2px;"> <i class="a-icon a-icon-prime a-icon-small"></i> </span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail2_1786341840" data-asin="1786341840" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200004835874941&amp;adIndex=4" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200004835874941&amp;eventType=2&amp;adIndex=4"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=7216113329471279&widgetName=sp_phone_detail2&adId=200004835874941&eventType=2&adIndex=4"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="The Power of Computational Thinking: Games, Magic and Puzzles to Help You Become a Computational Thinker" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_4?ie=UTF8&amp;adId=A040141325P22Z2JO914Z&amp;qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;url=%2Fdp%2F1786341840%2Fref%3Dsspa_mw_detail_4%3Fpsc%3D1"> <div class="a-row"> <img alt="The Power of Computational Thinking: Games, Magic and Puzzles to Help You Become a Computational Thinker" src="https://images-na.ssl-images-amazon.com/images/I/51eHlN0VuWL._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>The Power of Computati...</span> </div> <div class="a-row"> <span class="a-color-price">$22.79</span> <span style="position: relative; top: 2px;"> <i class="a-icon a-icon-prime a-icon-small"></i> </span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail2_B073X6GNJ1" data-asin="B073X6GNJ1" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200006013938421&amp;adIndex=5" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200006013938421&amp;eventType=2&amp;adIndex=5"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=7216113329471279&widgetName=sp_phone_detail2&adId=200006013938421&eventType=2&adIndex=5"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="The Complete Software Developer&amp;#39;s Career Guide: How to Learn Your Next Programming Language, Ace Your Programming Interview, and Land The Coding Job Of Your Dreams" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_5?ie=UTF8&amp;adId=A09195103AA3JYVRZFKVC&amp;qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;url=%2Fdp%2FB073X6GNJ1%2Fref%3Dsspa_mw_detail_5%3Fpsc%3D1"> <div class="a-row"> <img alt="The Complete Software Developer&amp;#39;s Career Guide: How to Learn Your Next Programming Language, Ace Your Programming Interview, and Land The Coding Job Of Your Dreams" src="https://images-na.ssl-images-amazon.com/images/I/51yr12gkjRL._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>The Complete Software ...</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4-5"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">382 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$4.99</span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"> <div id="sp_phone_detail2_1934356433" data-asin="1934356433" data-viewpixelurl="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200005114391581&amp;adIndex=6" class="a-section"> <noscript> &lt;img alt="" src="/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;adId=200005114391581&amp;eventType=2&amp;adIndex=6"&gt; </noscript> <script> P.when('AmazonClicks').execute(function(AC) { AC.loadImagePixel("/gp/sponsored-products/logging/log-action.html?qualifier=1518705128&id=7216113329471279&widgetName=sp_phone_detail2&adId=200005114391581&eventType=2&adIndex=6"); }); </script> <a class="a-link-normal" target="_top" rel="noopener" title="Agile Coaching" href="https://www.amazon.com/gp/slredirect/picassoRedirect.html/ref=sspa_mw_detail_6?ie=UTF8&amp;adId=A103945221Y2I051H3YV9&amp;qualifier=1518705128&amp;id=7216113329471279&amp;widgetName=sp_phone_detail2&amp;url=%2Fdp%2F1934356433%2Fref%3Dsspa_mw_detail_6%3Fpsc%3D1"> <div class="a-row"> <img alt="Agile Coaching" src="https://images-na.ssl-images-amazon.com/images/I/41w1N-NpW2L._AC_SS500_.jpg" height="115px" width="115px"> </div> <div class="a-row"> <span>Agile Coaching</span> </div> <div class="a-row"> <i class="a-icon a-icon-star a-star-4"></i> </div> <div class="a-row"> <span class="a-size-small a-color-secondary">24 reviews</span> </div> <div class="a-row"> <span class="a-color-price">$23.40</span> <span style="position: relative; top: 2px;"> <i class="a-icon a-icon-prime a-icon-small"></i> </span> </div> </a> </div> </li> <li class="a-carousel-card" style="height:259px; width:122px;" role="listitem"><span class="a-spinner a-spinner-medium" style="width:122px;height:259px;"></span></li></ol></div></div></div></div> <span class="a-end aok-hidden"></span></div></div>
</div>
<div class="aw-campaigns"></div><div class="aw-campaigns"></div><div id="p13n-m-mobile-session-sims-feature-2" class="celwidget" cel_widget_id="mobile-session-sims-feature-2">
<div id="sims-session" class="a-section a-spacing-large sims">
<h2 class="a-size-large a-spacing-base">Customers who viewed this also viewed</h2>
<div data-ajax-params="{&quot;auiDeviceType&quot;:&quot;mobile&quot;,&quot;featureId&quot;:&quot;SimilaritiesMobileCarousel&quot;,&quot;reftagPrefix&quot;:&quot;pd_aw_sbs_14&quot;,&quot;productDetailsTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::ProductDetails::Phone::Base&quot;,&quot;widgetTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::List::Static::Phone&quot;,&quot;faceoutTemplateClass&quot;:&quot;PI::P13N::ViewTemplates::Product::Phone::ListFaceout&quot;}" data-ajax-url="/gp/p13n-shared/faceout-partial" data-p13n-feature-metadata="{&quot;baseAsin&quot;:&quot;193435659X&quot;}" data-p13n-feature-name="pd_aw_sbs_14" data-p13n-global="{&quot;auiDeviceType&quot;:&quot;mobile&quot;,&quot;marketplaceId&quot;:&quot;ATVPDKIKX0DER&quot;,&quot;requestId&quot;:&quot;7F3MGDYTH1YH8KVBSFWJ&quot;,&quot;marketplace&quot;:&quot;US&quot;,&quot;session&quot;:&quot;147-0816675-1753153&quot;}" class="a-section a-spacing-micro p13n-sc-static-list">
<div class="a-section p13n-sc-list-cells-container">
<ul class="a-unordered-list a-nostyle a-vertical p13n-sc-list-cells">
<li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sbs_14_1&quot;,&quot;asin&quot;:&quot;1934356921&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._SY200_QL15_.jpg" href="/gp/aw/d/1934356921/ref=pd_aw_sbs_14_1?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=5161ySEofLL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement" src="https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL300_SR300,300_.jpg" data-fling-asin="1934356921" data-fling-refmarker="pd_aw_sbs_14_1" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL300_SR300,300_.jpg&quot;:[300,300],&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL100_SR100,100_.jpg&quot;:[100,100],&quot;https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._AC_UL200_SR200,200_.jpg&quot;:[200,200]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/5161ySEofLL._SY200_QL15_.jpg" href="/gp/aw/d/1934356921/ref=pd_aw_sbs_14_1?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=5161ySEofLL" data-isdpimgcached="1">
<div class="p13n-sc-truncate p13n-sc-line-clamp-4" aria-hidden="true" data-rows="4">
Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4-5"><span class="a-icon-alt">4.4 out of 5 stars</span></i>&nbsp;<span aria-label="45 reviews" class="a-size-small">45</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$26.28</span></span> <span style="position: relative; top: 2px;"><i class="a-icon a-icon-prime a-icon-small" role="img" aria-label="Prime"></i></span></div>
</a>
</div>
</div></div>
</span></li><li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sbs_14_2&quot;,&quot;asin&quot;:&quot;020161622X&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/41BKx1AxQWL._SY200_QL15_.jpg" href="/gp/aw/d/020161622X/ref=pd_aw_sbs_14_2?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=41BKx1AxQWL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="The Pragmatic Programmer: From Journeyman to Master" src="https://images-na.ssl-images-amazon.com/images/I/41BKx1AxQWL._AC_UL300_SR300,300_.jpg" data-fling-asin="020161622X" data-fling-refmarker="pd_aw_sbs_14_2" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/41BKx1AxQWL._AC_UL200_SR200,200_.jpg&quot;:[200,200],&quot;https://images-na.ssl-images-amazon.com/images/I/41BKx1AxQWL._AC_UL100_SR100,100_.jpg&quot;:[100,100],&quot;https://images-na.ssl-images-amazon.com/images/I/41BKx1AxQWL._AC_UL300_SR300,300_.jpg&quot;:[300,300]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/41BKx1AxQWL._SY200_QL15_.jpg" href="/gp/aw/d/020161622X/ref=pd_aw_sbs_14_2?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=41BKx1AxQWL" data-isdpimgcached="1">
<div class="p13n-sc-truncate p13n-sc-line-clamp-4" aria-hidden="true" data-rows="4">
The Pragmatic Programmer: From Journeyman to Master
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4-5"><span class="a-icon-alt">4.5 out of 5 stars</span></i>&nbsp;<span aria-label="358 reviews" class="a-size-small">358</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$22.76</span></span> <span style="position: relative; top: 2px;"><i class="a-icon a-icon-prime a-icon-small" role="img" aria-label="Prime"></i></span></div>
</a>
</div>
</div></div>
</span></li><li data-fling-container="true" class="a-spacing-medium p13n-sc-list-item"><span class="a-list-item">
<div data-p13n-asin-metadata="{&quot;ref&quot;:&quot;pd_aw_sbs_14_3&quot;,&quot;asin&quot;:&quot;1941222153&quot;}" class="a-fixed-left-grid p13n-asin"><div class="a-fixed-left-grid-inner" style="padding-left:11.2rem">
<div class="a-fixed-left-grid-col a-col-left" style="width:11.2rem;margin-left:-11.2rem;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._SY200_QL15_.jpg" href="/gp/aw/d/1941222153/ref=pd_aw_sbs_14_3?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=51TdacYRRuL" data-isdpimgcached="1">
<div class="p13n-sc-list-image-container"> <img alt="Seven More Languages in Seven Weeks: Languages That Are Shaping the Future" src="https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL300_SR300,300_.jpg" data-fling-asin="1941222153" data-fling-refmarker="pd_aw_sbs_14_3" class="a-dynamic-image p13n-sc-dynamic-image" height="100" width="100" data-a-dynamic-image="{&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL200_SR200,200_.jpg&quot;:[200,200],&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL100_SR100,100_.jpg&quot;:[100,100],&quot;https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._AC_UL300_SR300,300_.jpg&quot;:[300,300]}"> </div>
</a>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<a class="a-link-normal dpLanImgCacheUrl" data-dplanimgcachedurl="https://images-na.ssl-images-amazon.com/images/I/51TdacYRRuL._SY200_QL15_.jpg" href="/gp/aw/d/1941222153/ref=pd_aw_sbs_14_3?ie=UTF8&amp;psc=1&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;dpPl=1&amp;dpID=51TdacYRRuL" data-isdpimgcached="1">
<div class="p13n-sc-truncate p13n-sc-line-clamp-4" aria-hidden="true" data-rows="4">
Seven More Languages in Seven Weeks: Languages That Are Shaping the Future
</div>
<div class="a-icon-row a-spacing-none">
<div class="a-row"><span class="a-color-secondary"><i class="a-icon a-icon-star a-star-4"><span class="a-icon-alt">3.8 out of 5 stars</span></i>&nbsp;<span aria-label="7 reviews" class="a-size-small">7</span></span></div>
</div>
<div class="a-row"><span class="a-size-base a-color-price"><span class="p13n-sc-price">$28.54</span></span> <span style="position: relative; top: 2px;"><i class="a-icon a-icon-prime a-icon-small" role="img" aria-label="Prime"></i></span></div>
</a>
</div>
</div></div>
</span></li>
</ul>
</div>
<div class="a-section p13n-sc-static-list-buttons">
<a href="/gp/p13n-mobile/overflow?ie=UTF8&amp;asins=1934356921%2C020161622X%2C1941222153%2C1937785653%2C0124104096%2C1937785637%2C1680502530%2C0735619670%2C0262510871%2C0132350882%2C0596007124%2C0201733862%2C0321125215%2C0321356683%2C0201633612%2C1680501488%2C0596517742%2C1617292397%2C0735611319%2C1849967202%2C1118008189%2C0262033844%2C1593275846%2C0131103628%2C9332518661%2C032157351X%2C0201485672%2C0999081411%2C013394302X%2C0596514980%2C193435645X%2C1680501224%2C0137081073%2C0321127420%2C1449373321%2C0596516177%2C1617292230%2C1934356050%2C1617290890%2C0201835959%2C1491924462%2C1491950293%2C0262062186%2C0321334876%2C1430219483%2C0262560992%2C812656217X%2C1491903996%2C0201896834%2C0143120530%2C0134190440%2C0999685902%2C1593272839%2C0996193308%2C193398869X%2C0134494164%2C0321349601%2C1484224027%2C168050200X%2C0123745144&amp;baseAsin=193435659X&amp;faceoutTemplateClass=PI%3A%3AP13N%3A%3AViewTemplates%3A%3AProduct%3A%3APhone%3A%3AListFaceout&amp;parentFeatureID=SimilaritiesMobileCarousel&amp;productDetailsTemplateClass=PI%3A%3AP13N%3A%3AViewTemplates%3A%3AProductDetails%3A%3APhone%3A%3ABase&amp;ref=pd_aw_sbs_14_l_of&amp;refRID=7F3MGDYTH1YH8KVBSFWJ&amp;reftagPrefix=pd_aw_sbs_14&amp;title=Customers%20who%20viewed%20this%20also%20viewed" class="a-touch-link a-box"><div class="a-box-inner"><i class="a-icon a-icon-touch-link"></i>Show all 60 items</div></a>
</div>
</div>
</div>
</div><div class="aw-campaigns"><script>if (typeof uet === 'function' && typeof ues === 'function') {var scope = 'detail_encore_detail-mWeb';var placementId = '';ues('wb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); uet('bb', 'adplacements:' + scope.replace(/\_/g, ':'), {wb:1}); if (placementId) {ues('wb', 'adplacements:' + placementId, {wb:1});uet('bb', 'adplacements:' + placementId, {wb:1});}}</script> <style>@media screen and (orientation:portrait){div[id$=ape_detail_encore_detail-mWeb_wrapper]{margin-left: -14px; margin-right: -14px; height: 132vw;} div[id$=ape_detail_encore_detail-mWeb_placement]{width: 100% !important; height: 100% !important;} [id$=ape_detail_encore_detail-mWeb_iframe]{width: 1px !important; min-width: 100% !important; height: 1px !important; min-height: 100% !important;border-top: 1px solid #ddd;}} @media screen and (orientation:landscape){ div[id$=ape_detail_encore_detail-mWeb_wrapper]{margin-left: -7px; margin-right: -7px; height: 54vw;} div[id$=ape_detail_encore_detail-mWeb_placement]{width: 100% !important; height: 100% !important;} [id$=ape_detail_encore_detail-mWeb_iframe]{width: 1px !important; min-width: 100% !important; height: 1px !important; min-height: 100% !important;}}</style> <div id="ape_detail_encore_detail-mWeb_wrapper" class="celwidget text/x-dacx-safeframe" data-ad-details="{&quot;slot&quot; :&quot;detail_encore_detail-mWeb&quot;,&quot;pageType&quot;: &quot;detail&quot;,&quot;subPageType&quot;: &quot;detail-mWeb&quot;,&quot;slotName&quot; :&quot;encore&quot;,&quot;src&quot; : &quot;prefetchEnabled&quot;,&quot;adServer&quot; :&quot;cs&quot;,&quot;campaignId&quot; : &quot;11605&quot;,&quot;arid&quot; :&quot;04e6f18d030340afa4fe9976258ba006&quot;, &quot;size&quot; :{&quot;width&quot; : &quot;300px&quot;,&quot;height&quot; : &quot;250px&quot;},&quot;maxAdWidth&quot;: &quot;&quot;,&quot;allowedSizes&quot; :[],&quot;allowedDomains&quot; : [],&quot;loadAfter&quot; : &quot;900px&quot;,&quot;extraDelay&quot; : 0,&quot;iframeExtraStyle&quot;: &quot;&quot;,&quot;iframeClass&quot;: &quot;&quot;,&quot;iframeSandbox&quot;:&quot;&quot;,&quot;enablePrerenderLogic&quot;: false,&quot;adLabelWrapperId&quot;: &quot;ape_detail_encore_detail-mWeb_text-wrapper&quot;,&quot;adLabelId&quot;: &quot;ape_detail_encore_detail-mWeb_text&quot;,&quot;advTextWrapperDivStyle&quot;: &quot;position:relative; text-align:center; margin-left: -14px; margin-right: -14px; height: auto;&quot;,&quot;advertisementTextStyle&quot;: &quot;font-size: 10px; color: #555; text-align: center; margin: 0px 3px 6px 0;&quot;,&quot;advertisementTextHTMLContent&quot;: &quot;&quot;,&quot;advertisementTextHTMLContentEncoded&quot;: &quot;PGRpdiBpZD0iYXBlX2RldGFpbF9lbmNvcmVfZGV0YWlsLW1XZWJfdGV4dC13cmFwcGVyIiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7IHRleHQtYWxpZ246Y2VudGVyOyBtYXJnaW4tbGVmdDogLTE0cHg7IG1hcmdpbi1yaWdodDogLTE0cHg7IGhlaWdodDogYXV0bzsiICA+PGRpdiBpZD0iYXBlX2RldGFpbF9lbmNvcmVfZGV0YWlsLW1XZWJfdGV4dCIgc3R5bGU9ImZvbnQtc2l6ZTogMTBweDsgY29sb3I6ICM1NTU7IHRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luOiAwcHggM3B4IDZweCAwOyIgID5BZHZlcnRpc2VtZW50PC9kaXY+PC9kaXY+&quot;,&quot;adPixels&quot;: [],&quot;adPixelDelay&quot;: &quot;0&quot;,&quot;aaxImpPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/e/xsp/imp?b=Qv8DFZELO05zj4i2U5KY9coAAAFhmeE5lwEAAAGQAfaJ93w&quot;,&quot;aaxInstrPixelUrl&quot;: &quot;https://aax-us-east.amazon-adsystem.com/x/px/Qv8DFZELO05zj4i2U5KY9coAAAFhmeE5lwEAAAGQAfaJ93w/&quot;,&quot;htmlContent&quot;: &quot;&quot;,&quot;htmlContentEncoded&quot;: &quot;IDxzdHlsZT5AbWVkaWEgc2NyZWVuIGFuZCAob3JpZW50YXRpb246cG9ydHJhaXQpe2RpdltpZCQ9YXBlX2RldGFpbF9lbmNvcmVfZGV0YWlsLW1XZWJfY3JlYXRpdmVXcmFwcGVyXXt3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDt9IFtpZCQ9bW9iaWxlLWFkcy1saW5rXXt3aWR0aDogMTc1JSAhaW1wb3J0YW50OyBtYXJnaW46IC0yMS41JSAtMzcuNSUgLTIxLjUlIC0zNy41JTt9fSBAbWVkaWEgc2NyZWVuIGFuZCAob3JpZW50YXRpb246bGFuZHNjYXBlKXtkaXZbaWQkPWFwZV9kZXRhaWxfZW5jb3JlX2RldGFpbC1tV2ViX2NyZWF0aXZlV3JhcHBlcl17d2lkdGg6IDEwMCUgIWltcG9ydGFudDsgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7fSBbaWQkPW1vYmlsZS1hZHMtbGlua117d2lkdGg6IDEwMCUgIWltcG9ydGFudDsgbWFyZ2luOiAtMjIuNSUgMCAtMjIuNSUgMDt9fTwvc3R5bGU+IDxkaXYgaWQ9ImFwZV9kZXRhaWxfZW5jb3JlX2RldGFpbC1tV2ViX2NyZWF0aXZlV3JhcHBlciIgICA+DQo8aGVhZD48c3R5bGU+LmFje2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjE4cHg7aGVpZ2h0OjE0cHg7ei1pbmRleDo5O3RvcDowO3JpZ2h0OjA7YmFja2dyb3VuZDp1cmwoaHR0cHM6Ly9pbWFnZXMtbmEuc3NsLWltYWdlcy1hbWF6b24uY29tL2ltYWdlcy9HLzAxL2RhL2FkY2hvaWNlcy9hYy10b3ByaWdodC1zcHJpdGUucG5nKX0jdnBjLWxvZ297cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJSAxMDAlO2hlaWdodDoxNXB4O3dpZHRoOjEwMCU7Ym90dG9tOjE2cHg7bGVmdDowO2Rpc3BsYXk6bm9uZX0uaGlkZXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fSNtb2JpbGUtYWRzLWFke2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0jbW9iaWxlLWFkcy1saW5re3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbn0jbW9iaWxlLWFkLWltYWdle3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG99PC9zdHlsZT48L2hlYWQ+PGJvZHkgc3R5bGU9Im1hcmdpbjowcHg7cGFkZGluZzowcHg7dGV4dC1hbGlnbjpjZW50ZXI7b3ZlcmZsb3c6aGlkZGVuOyI+PGRpdiBpZD0ibW9iaWxlLWFkcy1hZCI+PGEgaWQ9Im1vYmlsZS1hZHMtbGluayI+PGltZyBpZD0ibW9iaWxlLWFkLWltYWdlIj48L2E+PC9kaXY+PHNjcmlwdCBpZD0iaWZyYW1lX3NjcmlwdCIgdHlwZT0idGV4dC9wbGFpbiI+ZG9jdW1lbnQuYWQ9e2FpZDoiMzIyMzg2NTg5MDAwMSIsY2lkOiIzMjk4NzI2NTYwMjAxIix3OjI1NjAsaDoyNTYwLHRlbXBsYXRlOiJJbWFnZSAtIG1vYmlsZSBPJmFtcDtPLTEuNTQyIn0sd2luZG93LmFhblJlc3BvbnNlPXthZElkOmRvY3VtZW50LmFkLmFpZCxjcmVhdGl2ZUlkOmRvY3VtZW50LmFkLmNpZCxhZE5ldHdvcms6InBkYSIsc2hhemFtU3RhZ2U6InByb2QiLHNoYXphbUlkOiIxMTk4NDgzMSJ9O3RyeXtwYXJlbnQmJnBhcmVudC5hZF91dGlscyYmcGFyZW50LmFkX3V0aWxzLmV4cGFuZF9hZChmcmFtZUVsZW1lbnQpfWNhdGNoKGUpe31zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKCl7dmFyIGU9LjA1LHQ9ImNsbWV0IixuPWZ1bmN0aW9uKGksYSxyLG8sYyxzKXt0aGlzLnNhbXBsaW5nUmF0ZT1jfHxlLHRoaXMuc2hvdWxkRmlyZU1ldHJpY3M9TWF0aC5yYW5kb20oKTw9dGhpcy5zYW1wbGluZ1JhdGUsdGhpcy5jaGFubmVsTmFtZT1pLHRoaXMuaW1wcmVzc2lvbklkPWF8fG4uZ2VuZXJhdGVVVUlEKCksdGhpcy5zdGFnZT1yfHwicHJvZCIsdGhpcy5yZWdpb249b3x8Im5hIix0aGlzLmtpbmVzaXNBcHBJZD1zfHx0LHRoaXMubG9nX2VuZHBvaW50PW4uZ2VuZXJhdGVVcmwodGhpcy5zdGFnZSx0aGlzLnJlZ2lvbil9O3JldHVybiBuLmdlbmVyYXRlVVVJRD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gTWF0aC5mbG9vcig2NTUzNiooMStNYXRoLnJhbmRvbSgpKSkudG9TdHJpbmcoMTYpLnN1YnN0cigxLDQpfXJldHVybiBlKCkrZSgpK2UoKStlKCkrZSgpK2UoKStlKCkrZSgpfSxuLmdlbmVyYXRlVXJsPWZ1bmN0aW9uKGUsdCl7dmFyIG49IiIsaT0iIjt0PSJqcCI9PXQ/ImZlIjp0LHQ9dC50b0xvd2VyQ2FzZSgpO3ZhciBhPSJuYSI9PXQ/IiI6Ii0iK3Qscj1mdW5jdGlvbihlKXt2YXIgdD0oYT8iYWF4IjoicyIpK2ErZSxuPWE/Ii9zIjoiIjtyZXR1cm4gdCsiLmFtYXpvbi1hZHN5c3RlbS5jb20iK259O3N3aXRjaChlKXtjYXNlInByb2QiOmNhc2UicHJvZGxhYnMiOm49IkFOWSIsaT1yKCIiKTticmVhaztjYXNlImJldGEiOmNhc2UiZ2FtbWEiOm49Imh0dHA6IixpPXIoIm5hIj09dD8iLXByZXByb2QiOiItZ2FtbWEiKTticmVhaztjYXNlImxvY2FsIjpkZWZhdWx0Om49Imh0dHA6IixpPXIoIm5hIj09dD8iLXByZXByb2QiOiItZ2FtbWEiKX12YXIgbz0oIkFOWSI9PT1uP2xvY2F0aW9uLnByb3RvY29sOm4pKyIvLyIraTtyZXR1cm4gb30sbi5lYWNoPWZ1bmN0aW9uKGUsdCl7aWYoZSYmdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQpaWYoZS5sZW5ndGgpZm9yKHZhciBuPTAsaT1lLmxlbmd0aDtpPm47bisrKXQobixlW25dKTtlbHNlIGZvcih2YXIgYSBpbiBlKXQoYSxlW2FdKX0sbi5nZXRRdWVyeVN0cmluZz1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIGk9ImJvb2xlYW4iPT10eXBlb2YgdC5lc2NhcGU/dC5lc2NhcGU6ITAsYT1bXTtuLmVhY2goZSxmdW5jdGlvbihlLHQpeyJ1bmRlZmluZWQiIT10eXBlb2YgdCYmKHQ9dC5jb25zdHJ1Y3Rvcj09PUFycmF5P3Quam9pbigiLCIpOnQsaSYmKHQ9ZW5jb2RlVVJJQ29tcG9uZW50KHQpKSxhLnB1c2goW2UsdF0uam9pbigiPSIpKSl9KTt2YXIgcj1hLmpvaW4oIiYiKTtyZXR1cm4gcn0sbi5wcm90b3R5cGUuZ2VuZXJhdGVQaXhlbFVybD1mdW5jdGlvbihlKXt2YXIgdD17fTtlPWV8fHt9LGUuaT1lbmNvZGVVUklDb21wb25lbnQodGhpcy5pbXByZXNzaW9uSWQpLGUuYXBwPWVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmtpbmVzaXNBcHBJZCk7dmFyIGk9e307cmV0dXJuIGkuZD0iZm9yZXN0ZXItZGlkIixpWyJleC1mY2giXT10aGlzLmNoYW5uZWxOYW1lLGlbImV4LWZhcmdzIl09Ij8iK2VuY29kZVVSSUNvbXBvbmVudChuLmdldFF1ZXJ5U3RyaW5nKGUpKSxpLmNiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHQuZXNjYXBlPSExLHRoaXMubG9nX2VuZHBvaW50KyIvaXVpMz8iK24uZ2V0UXVlcnlTdHJpbmcoaSx0KX0sbi5wcm90b3R5cGUuc2VuZFBpeGVsPWZ1bmN0aW9uKGUpe2lmKHRoaXMuc2hvdWxkRmlyZU1ldHJpY3Mpe3ZhciB0PW5ldyBJbWFnZTtyZXR1cm4gdC5zcmM9dGhpcy5nZW5lcmF0ZVBpeGVsVXJsKGUpLHR9fSxuLnByb3RvdHlwZS5sb2dJbXByZXNzaW9uPWZ1bmN0aW9uKGUpe251bGwhPXRoaXMuY2hhbm5lbE5hbWUmJihlPWV8fHt9LGUuaW1wPTEsdGhpcy5zZW5kUGl4ZWwoZSkpfSxuLnByb3RvdHlwZS5sb2dFdmVudD1mdW5jdGlvbihlLHQsbil7aWYobnVsbCE9dGhpcy5jaGFubmVsTmFtZSl7dmFyIGk9e307aWYobnVsbCE9ZSYmbnVsbCE9dCl7dHJ5e24mJihpLnR5cGU9bik7dmFyIGE9SlNPTi5zdHJpbmdpZnkodCk7aS5lbj1lLGkuZXY9YX1jYXRjaChyKXtpLnN0cmluZ2lmeU5vdEF2YWlsYWJsZT0xfXRoaXMuc2VuZFBpeGVsKGkpfX19LG4ucHJvdG90eXBlLnNldEltcHJlc3Npb25JZD1mdW5jdGlvbihlKXt0aGlzLmltcHJlc3Npb25JZD1lfSxufSgpLG49LjA1LGk9ImRhLWN4LW1ldHJpY3MiLGE9ZnVuY3Rpb24ocixvLGMscyl7dmFyIGM9Y3x8bixvPW98fGk7dC5jYWxsKHRoaXMsbyxyLCJwcm9kIiwibmEiLGMscyk7dmFyIGw9dGhpczt0aGlzLnRpbWVycz17fSxhLmFkZExpc3RlbmVyKGUsImVycm9yIixmdW5jdGlvbihlKXtpZihlLmVycm9yJiZlLmVycm9yLnN0YWNrKXt2YXIgdD1lLm1lc3NhZ2UrIiA6ICIrZS5lcnJvci5zdGFjaztsLmFkZENvdW50KGEuTE9HX0VWRU5UX05BTUVTLlVOQ0FVR0hUX0VSUk9SLHQubGVuZ3RoPDUwMD90OnQuc3Vic3RyaW5nKDAsNTAwKSl9ZWxzZSBsLmFkZENvdW50KGEuTE9HX0VWRU5UX05BTUVTLlVOQ0FVR0hUX0VSUk9SLGUubWVzc2FnZSl9KX07cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5jcmVhdGUmJihPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlPWUsbmV3IHR9KSxhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSxhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hLGEuRVZFTlRfVFlQRVM9e1RJTUVSOiJ0aW1lciIsQ09VTlRFUjoiY291bnRlciIsSlNPTjoianNvbiJ9LGEuTE9HX0VWRU5UX05BTUVTPXtCVVlfQk9YX0xPQURfTEFURU5DWToiQnV5Qm94TG9hZExhdGVuY3kiLEFBTl9MQVRFTkNZOiJBYW5MYXRlbmN5IixBQU5fRVJST1I6IkFhbkVycm9yIixEUk9QX0RPV05fU0VMRUNUT1I6IkRyb3BEb3duU2VsZWN0b3IiLFVOQ0FVR0hUX0VSUk9SOiJVbmNhdWdodEVycm9yIixVTkRFRklORURfVFJBQ0tFUl9BUkc6IlVuZGVmaW5lZFRyYWNrZXJBcmciLENPT1JESU5BVE9SX1RSQUNLRVI6IkNvb3JkaW5hdG9yVHJhY2tlciIsSU1BR0VfTE9BRF9MQVRFTkNZOiJJbWFnZUxvYWRMYXRlbmN5IixDUkVBVElWRV9MT0FEX0xBVEVOQ1k6IkNyZWF0aXZlTG9hZExhdGVuY3kifSxhLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHQsbixpKXt2YXIgYT1mdW5jdGlvbih0KXtyZXR1cm4gdD10fHxlLmV2ZW50LGkodCl9O3QuYWRkRXZlbnRMaXN0ZW5lcj90LmFkZEV2ZW50TGlzdGVuZXIobixhLCEwKToobj0ib24iK24sdC5hdHRhY2hFdmVudD90LmF0dGFjaEV2ZW50KG4sYSk6dFtuXT1hKX0sYS5wcm90b3R5cGUubG9nSW1wcmVzc2lvbj1mdW5jdGlvbihlKXtzd2l0Y2goZT1lfHx7fSxlLnM9ZS5zaGF6YW1JZHx8IjExOTg0ODMxIixlLm49ZS50ZW1wbGF0ZU5hbWV8fCJJbWFnZSAtIG1vYmlsZSBPJk8iLGUubD1lLmxvY2FsZXx8IlVTIixlLmFzPWUuYWRTZXJ2ZXJ8fCJjb3JuZXJzdG9uZSIsZS50bWp2PWUudGVtcGxhdGVNYWpvclZlcnNpb258fCIxIixlLnRtbnY9ZS50ZW1wbGF0ZU1pbm9yVmVyc2lvbnx8IjU0MiIsZS5hcyl7Y2FzZSJkb3VibGVjbGljayI6ZS5haT1lLmFkSWR8fCIlZWFpZCEiLGUuY2k9ZS5jcmVhdGl2ZUlkfHwiJWVjaWQhIjticmVhaztjYXNlImNvcm5lcnN0b25lIjplLmFpPWUuYWRJZHx8IjMyMjM4NjU4OTAwMDEiLGUuY2k9ZS5jcmVhdGl2ZUlkfHwiMzI5ODcyNjU2MDIwMSI7YnJlYWs7Y2FzZSJwcmV2aWV3IjpjYXNlIkFkTGFiIjplLmFpPWUuYWRJZHx8IkFEX0lEIixlLmNpPWUuY3JlYXRpdmVJZHx8IkNSRUFUSVZFX0lEIjticmVhaztjYXNlIm1lZGlhY2VudHJhbCI6ZS5haT1lLmFkSWR8fHNwSW5mby5haWQsZS5jaT1lLmNyZWF0aXZlSWR8fHNwSW5mby5jaWQ7YnJlYWs7ZGVmYXVsdDplLmFpPWUuYWRJZHx8Ii0tIyNBRF9JRCMjLS0iLGUuY2k9ZS5jcmVhdGl2ZUlkfHwiLS0jI0NSRUFUSVZFX0lEIyMtLSJ9ZS51YT1uYXZpZ2F0b3IudXNlckFnZW50LHQucHJvdG90eXBlLmxvZ0ltcHJlc3Npb24uY2FsbCh0aGlzLGUpfSxhLnByb3RvdHlwZS5zdGFydFRpbWVyPWZ1bmN0aW9uKGUpe3RoaXMudGltZXJzW2VdPW5ldyBEYXRlfSxhLnByb3RvdHlwZS5lbmRUaW1lcj1mdW5jdGlvbihlKXtudWxsIT10aGlzLnRpbWVyc1tlXSYmKHRoaXMudGltZXJzW2VdPW5ldyBEYXRlLXRoaXMudGltZXJzW2VdLHRoaXMubG9nRXZlbnQoZSx0aGlzLnRpbWVyc1tlXSxhLkVWRU5UX1RZUEVTLlRJTUVSKSx0aGlzLnRpbWVyc1tlXT1udWxsKX0sYS5wcm90b3R5cGUuYWRkQ291bnQ9ZnVuY3Rpb24oZSx0KXt0PXR8fDEsdGhpcy5sb2dFdmVudChlLHQsYS5FVkVOVF9UWVBFUy5DT1VOVEVSKX0sYX0oKSxhPWZ1bmN0aW9uKCl7dmFyIHQ9e30saT0vXC5hbWF6b25cLmNvbSg6LiopPyQvLGE9InVuZGVmaW5lZCIhPXR5cGVvZiBJU18zUCYmSVNfM1B8fCExLHI9ITEsYz0hMTtpZighYSl7dmFyIHM9ZTt0cnl7Zm9yKDtzIT1zLnBhcmVudDspe2lmKCFzLnBhcmVudC5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImNyb3NzLWRvbWFpbiBleGNlcHRpb24iKTtzPXMucGFyZW50fX1jYXRjaChsKXt9dHJ5e3I9InVuZGVmaW5lZCI9PXR5cGVvZiBNU0ZDbGllbnQ/cy5TRkNsaWVudD9zLlNGQ2xpZW50LmlzT25BbWF6b24oKTppLnRlc3Qocy5sb2NhdGlvbi5ob3N0KTohMH1jYXRjaChsKXt9bm90T25BZFN5c3RlbVBhdHRlcm49L14oPyFhbWF6b24tYWRzeXN0ZW1cLmFtYXpvblwuY29tKDouKik/JCkvO3RyeXtyPXImJm5vdE9uQWRTeXN0ZW1QYXR0ZXJuLnRlc3Qobi5sb2NhdGlvbi5ob3N0KX1jYXRjaChsKXt9ZS5pc05hdGl2ZVJlYWN0UGxhY2VtZW50JiYocj0hMCl9cmV0dXJuIGM9IWEmJiFyLGZ1bmN0aW9uKCl7dmFyIHQ9ITEsbj0zZTM7ZS5hZENob2ljZXNUYXBwZWQ9ZnVuY3Rpb24oaSl7ZnVuY3Rpb24gYSgpe3Q9ITAsaS5zdHlsZS53aWR0aD0iNzZweCIsaS5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb249Ii0xOXB4IDAiLHNldFRpbWVvdXQocixuKX1mdW5jdGlvbiByKCl7dD0hMSxpLnN0eWxlLndpZHRoPSIxOHB4IixpLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbj0iMCAwIn1pZih0KXtpZigidW5kZWZpbmVkIj09dHlwZW9mIG1yYWlkKWUudG9wLmxvY2F0aW9uPSJodHRwczovL3d3dy5hbWF6b24uY29tL2dwL2F3L2FhcC8/dmlldz13ZWJ2aWV3JmNySWQ9MzI5ODcyNjU2MDIwMSI7ZWxzZXt2YXIgbz0iaHR0cHM6Ly9zLmFtYXpvbi1hZHN5c3RlbS5jb20vZ3AvYXcvYWFwL2FwcD9hZElkPUEzX2c2NWVobkRpc2thbU1rTVB0a2Y4JmFwcElkPSZjcklkPTMyOTg3MjY1NjAyMDEiO28rPSImYz1VUyIudG9Mb3dlckNhc2UoKSxtcmFpZC5vcGVuKG8pfXIoKX1lbHNlIGEoKTtyZXR1cm4hMX19KCksdC5nZXRMb2dvVXJsPWZ1bmN0aW9uKCl7cmV0dXJuIG8uZ2V0TWVkaWFVcmwoKSsiIn0sdC5pc09uQW1hem9uPWZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHQuaXNPblRoaXJkUGFydHk9ZnVuY3Rpb24oKXtyZXR1cm4gYX0sdC5pc09uU3Vic2lkaWFyeT1mdW5jdGlvbigpe3JldHVybiBjfSx0fSgpLHI9ZnVuY3Rpb24oKXt2YXIgdCxuLGkscixvPXt9LGM9ZnVuY3Rpb24oZSxhLG8sYyl7dD1lLG49YSxpPW8scj1jfTtjKCIzMjIzODY1ODkwMDAxIiwiMzI5ODcyNjU2MDIwMSIsJyR7cmVxdWVzdC5hcmlkfScsInBkYSIpO3ZhciBzPSExLGw9dm9pZCAwLHU9ITEsZD0hMSxmPSIiO3JldHVybiBzPSJ1bmRlZmluZWQiIT10eXBlb2YgbXJhaWQsZD0iMDI0MDI4MzI3OGE5NGUzNmFkNTY2MDU3ZjA5YjFmYjEiPT09Zix1PWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PWUudG9wLm5hdmlnYXRvci51c2VyQWdlbnQsbj10Lm1hdGNoKC9pUGFkL2kpLGk9dC5tYXRjaCgvQW5kcm9pZC9pKSYmIXQubWF0Y2goL21vYmlsZS9pKX1jYXRjaChhKXt9cmV0dXJuIG58fGl9KCksby5nZXRBZElkPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG8uZ2V0Q3JlYXRpdmVJZD1mdW5jdGlvbigpe3JldHVybiBufSxvLmdldEltcHJlc3Npb25JZD1mdW5jdGlvbigpe3JldHVybiBpfSxvLmdldEFkU2VydmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHJ9LG8uZ2V0M3BDbGlja1RyYWNrZXI9ZnVuY3Rpb24oKXtyZXR1cm4iIn0sby5pc0FtYW49ZnVuY3Rpb24oKXt2YXIgZT1hLmlzT25UaGlyZFBhcnR5KCksdD1hLmlzT25TdWJzaWRpYXJ5KCk7cmV0dXJuIGV8fHR9LG8uaXNNcmFpZEF2YWlsYWJsZT1mdW5jdGlvbigpe3JldHVybiBzfSxvLmlzTVNob3BOYXRpdmVBcHA9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sby5pc01hc2hBdmFpbGFibGU9ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGwmJihsPSJ1bmRlZmluZWQiIT10eXBlb2YgYW1hem9uJiYidW5kZWZpbmVkIiE9dHlwZW9mIGFtYXpvbi5tYXNoKSxsfSxvLmlzVGFibGV0PWZ1bmN0aW9uKCl7cmV0dXJuIHV9LG8uaXNNb2JpbGU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sb30oKSxvPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT17fSxhPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUmVnRXhwKCIoXFxzfF4pIitlKyIoXFxzfCQpIil9O2kuRE9fTk9USElORz1mdW5jdGlvbigpe30saS5pc1NlY3VyZT1mdW5jdGlvbigpe3JldHVybi9zLy50ZXN0KGxvY2F0aW9uLnByb3RvY29sKX0saS5mb3JFYWNoPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAsaT1lLmxlbmd0aDtpPm47bisrKXQoZVtuXSxuLGUpfSxpLmdldEVsZW1lbnRCeUlkPWZ1bmN0aW9uKGUpe3JldHVybiB0LmdldEVsZW1lbnRCeUlkKGUpfSxpLmluSWZyYW1lPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLnNlbGYhPT1lLnRvcH1jYXRjaCh0KXtyZXR1cm4hMH19LGkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1mdW5jdGlvbihlKXtpZih0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKTtpZih0LnF1ZXJ5U2VsZWN0b3JBbGwpcmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbCgiLiIrZSk7aWYodC5ldmFsdWF0ZSl7Zm9yKHZhciBuLGk9Ii4vLypbY29udGFpbnMoY29uY2F0KCcgJywgQGNsYXNzLCAnICcpLCAnICIrZSsiICcpXSIscj10LmV2YWx1YXRlKGksdCxudWxsLDAsbnVsbCksbz1bXTtuPXIuaXRlcmF0ZU5leHQoKTspby5wdXNoKG4pO3JldHVybiBvfWZvcih2YXIgcj10LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksaT1hKGUpLG89W10sbj0wO248ci5sZW5ndGg7bisrKWkudGVzdChyW25dLmNsYXNzTmFtZSkmJm8ucHVzaChyW25dKTtyZXR1cm4gb30saS5nZXRRdWVyeVN0cmluZz1mdW5jdGlvbihlLHQpe3ZhciBuPVtdO2Zvcih2YXIgaSBpbiBlKW4ucHVzaChpKyI9IitlW2ldKTt2YXIgYT1uLmpvaW4oIiYiKTtyZXR1cm4gdD9lbmNvZGVVUklDb21wb25lbnQoYSk6YX0saS5zZXRCYWNrZ3JvdW5kSW1hZ2U9ZnVuY3Rpb24oZSx0KXtlLnN0eWxlLmJhY2tncm91bmRJbWFnZT0idXJsKCIrdCsiKSJ9LGkuc2V0SHJlZj1mdW5jdGlvbihlLHQsbil7ZS5ocmVmPXQsZS50YXJnZXQ9bj8iX2JsYW5rIjoiX3RvcCJ9LGkuaGFzQ2xhc3M9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jbGFzc05hbWUubWF0Y2goYSh0KSl9LGkuYWRkQ2xhc3M9ZnVuY3Rpb24oZSx0KXtpLmhhc0NsYXNzKGUsdCl8fChlLmNsYXNzTmFtZSs9IiAiK3QpfSxpLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jbGFzc05hbWUuc3BsaXQoIiAiKSxpPW4uaW5kZXhPZih0KTstMSE9PWkmJihuLnNwbGljZShpLDEpLGUuY2xhc3NOYW1lPW4uam9pbigiICIpKX0saS5zaG93PWZ1bmN0aW9uKGUpe2kucmVtb3ZlQ2xhc3MoZSwiaGlkZSIpfSxpLmhpZGU9ZnVuY3Rpb24oZSl7aS5hZGRDbGFzcyhlLCJoaWRlIil9LGkudHJpbT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9eXHMrfFxzKyQvLCIiKX0saS5pc1NoYXphbVByZXZpZXc9ZnVuY3Rpb24oKXtyZXR1cm4hMX0saS5mYWRlRWxlbWVudD1mdW5jdGlvbihlLHQsbixhKXtlLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiO3ZhciByPW5ldyBEYXRlO2E9YXx8MzAwO3ZhciBvPWZ1bmN0aW9uKCl7dmFyIGM9TWF0aC5taW4oKG5ldyBEYXRlLXIpL2EsMSk7dHx8KGM9MS1jKSxpLnNldE9wYWNpdHkoZSxjKSx0JiYxPmN8fCF0JiZjPjA/c2V0VGltZW91dChvLDI1KTooZS5zdHlsZS5maWx0ZXI9IiIsImZ1bmN0aW9uIj09dHlwZW9mIG4mJm4oKSl9O28oKX0saS5zZXRPcGFjaXR5PWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zdHlsZTtuLmRpc3BsYXk9ImJsb2NrIixuLm9wYWNpdHk9bi5tb3pPcGFjaXR5PXQsbi5maWx0ZXI9ImFscGhhKG9wYWNpdHk9IisxMDAqdCsiKSJ9LGkuaGV4VG9DaGFyPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnRvU3RyaW5nKCksbj0iIixpPTA7aTx0Lmxlbmd0aDtpKz0yKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQodC5zdWJzdHIoaSwyKSwxNikpO3JldHVybiBufSxpLnJlcGxhY2VMaW5lQnJlYWtzPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBSZWdFeHAoaS5oZXhUb0NoYXIoIjVjNmUiKSwiZyIpO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9lLnJlcGxhY2UodCwiPGJyLz4iKTp2b2lkIDB9LGkuY2FsbEFhbj1mdW5jdGlvbihuLGEscil7dmFyIG89ImRhQWFuQ2FsbGJhY2siO24uSlNPTkNhbGxCYWNrPW87dmFyIGM9MCxzPTIsbD0xNTAwLHU9ITE7InVuZGVmaW5lZCIhPXR5cGVvZiBDbGllbnRNZXRyaWNzJiZDbGllbnRNZXRyaWNzLnN0YXJ0VGltZXIoQ2xpZW50TWV0cmljcy5ldmVudHMuQUFOX1RJTUUpLGVbb109ZnVuY3Rpb24odCl7dT0hMCxyPWVbb109aS5ET19OT1RISU5HLCJ1bmRlZmluZWQiIT10eXBlb2YgQ2xpZW50TWV0cmljcyYmKENsaWVudE1ldHJpY3MuZW5kVGltZXIoQ2xpZW50TWV0cmljcy5ldmVudHMuQUFOX1RJTUUpLENsaWVudE1ldHJpY3MubG9nRXZlbnQoQ2xpZW50TWV0cmljcy5ldmVudHMuTlVNX0FBTl9DQUxMUyxjKSksYSh0KX07dmFyIGQ9ZnVuY3Rpb24oKXtpZighdSYmcz5jKXt2YXIgZT10LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uuc3JjPSJodHRwczovL2Nkbi1kLmFtYXpvbi1hZHN5c3RlbS5jb20vYWFuL3VzPyIraS5nZXRRdWVyeVN0cmluZyhuKSx0LmJvZHkuYXBwZW5kQ2hpbGQoZSksYysrLHNldFRpbWVvdXQoZCxsKX1lbHNlIHV8fCJmdW5jdGlvbiIhPXR5cGVvZiByfHwocigpLCJ1bmRlZmluZWQiIT10eXBlb2YgQ2xpZW50TWV0cmljcyYmKENsaWVudE1ldHJpY3MuYWRkTWV0cmljKENsaWVudE1ldHJpY3MuZXZlbnRzLkZJTkFMX1NUQVRFLCJhYW5GYWlsIiksQ2xpZW50TWV0cmljcy5hZGRNZXRyaWMoQ2xpZW50TWV0cmljcy5ldmVudHMuTlVNX0FBTl9DQUxMUyxjKSxDbGllbnRNZXRyaWNzLmZsdXNoTWV0cmljcygpKSl9O2QoKX07aS5nZXRUcmFja2VyPWZ1bmN0aW9uKHQsbixpKXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIFVybFV0aWxzJiYoZS5VcmxVdGlscz17aGFzUmVmVGFnOmZ1bmN0aW9uKGUpe3JldHVybi9bXC8mP11ccypyZWZfPz1bXiYjP1wvOl0qLy50ZXN0KGUpfSxpc0FtYXpvblVyaTpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL15bYS16QS1aXVthLXpBLVowLTkrLi1dKjpcL1wvLywiIiksbj10LnNwbGl0KC9bXC8/IzpdLykuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiAwIT1lLmxlbmd0aH0pO3JldHVybiBuWzBdPy9hbWF6b25bLl0oW2EtekEtWl0rJHxbYS16QS1aXSsuW2EtekEtWl0rJCkvLnRlc3QoblswXSk6ITF9LGluamVjdFF1ZXJ5U3RyaW5nUGFyYW06ZnVuY3Rpb24oZSx0LG4pe2lmKCF0fHwhbilyZXR1cm4gZTt2YXIgaT0iPyIrdCsiPSIrbixhPWUuaW5kZXhPZigiIyIpLHI9ZS5pbmRleE9mKCI/Iiksbz1hPj0wLGM9cj49MDtpZihvJiZjJiYoYz1hPnIpLCFjJiYhbylyZXR1cm4gZStpO3ZhciBzPWM/Ij8iOiIjIixsPWUuc3BsaXQocyksdT1sLnNsaWNlKDEpLmpvaW4ocyk7YyYmKHM9IiYiKTt2YXIgZD1sWzBdK2k7cmV0dXJuIHUmJihkKz1zK3UpLGR9LGluamVjdEFhcFJlZlRhZzpmdW5jdGlvbihlKXt2YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIElTXzNQJiZJU18zUCxuPSIiO3JldHVybiBlJiZuJiZ0JiZ0aGlzLmlzQW1hem9uVXJpKGUpJiYhdGhpcy5oYXNSZWZUYWcoZSk/dGhpcy5pbmplY3RRdWVyeVN0cmluZ1BhcmFtKGUsInJlZiIsbik6ZX0sZ2V0Q291cG9uVG9rZW46ZnVuY3Rpb24oKXtyZXR1cm4gYnRvYSgobmV3IERhdGUpLmdldFRpbWUoKSsiO0FNRyIpfSxnZXRDb3Vwb25Ub2tlbk1hY3JvOmZ1bmN0aW9uKCl7cmV0dXJuIlZQQ19DU19UT0tFTl9NQUNSTyJ9fSksbj1VcmxVdGlscy5pbmplY3RBYXBSZWZUYWcobil9LGkuYXR0YWNoQXN5bmNBYXhUcmFja2VyPWZ1bmN0aW9uKGUpe30saS5zZXRUcmFja2VySHJlZj1mdW5jdGlvbihlLHQsbixhLHIpe2kuc2V0SHJlZihlLGkuZ2V0VHJhY2tlcih0LG4sciksYSl9LGkuYWRkQXN5bmNUcmFja2luZz1mdW5jdGlvbihlLHQsbil7InN0cmluZyIhPXR5cGVvZiB0JiYodD1yLmdldDNwQ2xpY2tUcmFja2VyKCkpLERBRFMuQW5hbHl0aWNzLnRyYWNrM1BDbGlja0FzeW5jKGUsdCxuKX0saS5nZXRBc2lucz1mdW5jdGlvbigpe3JldHVybltbXV1bMF18fFtdfSxpLmdldE1lZGlhVXJsPWZ1bmN0aW9uKGUpe3ZhciB0PSJodHRwczovL2ltYWdlcy1uYS5zc2wtaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0cvMDEvIjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJih0Kz1lKSx0fTt2YXIgYz0iJCIscz0iLiIsbD0iLCI7aS5mb3JtYXRDdXJyZW5jeT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9KDEqZSkudG9GaXhlZCgyKSxuPWMrdC5yZXBsYWNlKCIuIixzKTtuIT10Oyl0PW4sbj10LnJlcGxhY2UoLyhcZCkoXGR7M31cRCkvLCIkMSIrbCsiJDIiKTtyZXR1cm4gbn0saS50cnVuY2F0ZVRleHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpLGE9ZS5pbm5lckhUTUwscj1hO2lmKHQub2Zmc2V0SGVpZ2h0Pm4pZm9yKDt0Lm9mZnNldEhlaWdodD5uOyl7dmFyIG89dC5vZmZzZXRIZWlnaHQ7aWYoaT1hLnJlcGxhY2UoL1xzK1xTK1xzKiQvLCIiKSxpLmxlbmd0aD09YS5sZW5ndGgpYnJlYWs7YT1pLGUuaW5uZXJIVE1MPWErIi4uLiIsdC5vZmZzZXRIZWlnaHQ8byYmKHI9ZS5pbm5lckhUTUwpfXJldHVybiBlLmlubmVySFRNTD1yLHQub2Zmc2V0SGVpZ2h0PD1ufSxpLmlzVmFsaWRBc2luPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYvXlx3ezEwfSQvLnRlc3QoZSk/ITA6ITF9LGkuZ2V0QXRjTGluaz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1lKyJncC9wcm9kdWN0LWFkcy9zaGFyZWQvdXRpbGl0eS9hZGQtdG8tY2FydC5odG1sPyIsYT17aWU6IlVURjgifSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBvPXRbcl0sYz1yPyIuIityOiIiO2FbInRva2VuIitjXT1vLnRva2VuLGFbInRpbWUiK2NdPW8udGltZSxhWyJtZXJjaGFudElkIitjXT1vLm1lcmNoYW50SWQsYVsiYXNpbiIrY109by5hc2luLGFbInByb2dyYW0iK2NdPSJkYWRzIixhWyJhZFByaWNlIitjXT1vLmJ1eWluZ1ByaWNlLnRvRml4ZWQoMil9cmV0dXJuIG4rPWkuZ2V0UXVlcnlTdHJpbmcoYSl9LGkuYmluZEV2ZW50PWZ1bmN0aW9uKG4saSxhKXtpZihuKXt2YXIgcj1mdW5jdGlvbih0KXtpZih0PXR8fGUuZXZlbnQsdC5wcmV2ZW50RGVmYXVsdD10LnByZXZlbnREZWZhdWx0fHxmdW5jdGlvbigpe3QucmV0dXJuVmFsdWU9ITF9LHQudGFyZ2V0PXQudGFyZ2V0fHx0LnNyY0VsZW1lbnQsdC5zdG9wUHJvcGFnYXRpb249dC5zdG9wUHJvcGFnYXRpb258fGZ1bmN0aW9uKCl7dC5jYW5jZWxCdWJibGU9ITB9LCF0LndoaWNoKXt2YXIgbj10LmJ1dHRvbjsxIT09biYmKG49Mj09PW4/Mzo0PT09bj8yOjEpLHQud2hpY2g9bn1yZXR1cm4gdC54fHwodC54PXQuY2xpZW50WCksdC55fHwodC55PXQuY2xpZW50WSksYSh0KX07aWYobj09PWUmJiJjb21wbGV0ZSI9PXQucmVhZHlTdGF0ZSlyZXR1cm4gYSgpO24uYWRkRXZlbnRMaXN0ZW5lcj9uLmFkZEV2ZW50TGlzdGVuZXIoaSxyLCEwKTooaT0ib24iK2ksbi5hdHRhY2hFdmVudD9uLmF0dGFjaEV2ZW50KGkscik6bltpXT1yKX19LGkua2V5cz1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3Ioa2V5IGluIGUpa2V5Lmhhc093blByb3BlcnR5LmNhbGwoZSxrZXkpJiZ0LnB1c2goa2V5KTtyZXR1cm4gdH0saS5nZXRUTEQ9ZnVuY3Rpb24oZSl7dmFyIHQ9e3VzOiJjb20iLHVrOiJjby51ayIsZnI6ImZyIixkZToiZGUiLGl0OiJpdCJ9O3JldHVybiB0W2UudG9Mb3dlckNhc2UoKV19LGkuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihlW25dPT09dClyZXR1cm4hMDtyZXR1cm4hMX07dmFyIHU9L2FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2kuaXNBbmRyb2lkRGV2aWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHV9O3ZhciBkPS9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpLmlzSW9zRGV2aWNlPWZ1bmN0aW9uKCl7cmV0dXJuIGR9LGkubW9iaWxlPWZ1bmN0aW9uKCl7dmFyIGU7ZT0idW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudD9NU0ZDbGllbnQuZ2V0VXNlckFnZW50SW5mbygpOm5hdmlnYXRvci51c2VyQWdlbnQ7dmFyIG4saSxhLHIsbz0vQW5kcm9pZCg/OiB8XC8pKFsuXGRdKikvaSxjPS9PUyAoW19cZF0qKSAvaSxzPS9cImF2XCI6XCIoWy5cZF0qKVwiL2k7cmV0dXJue2lzQW5kcm9pZE9zT2xkZXJUaGFuOmZ1bmN0aW9uKHQpe3ZhciBpPWYodCwiLiIpO3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgbiYmKG49ZS5tYXRjaChvKSxudWxsIT09biYmKG49ZihuWzFdLCIuIikpKSxuP3AobixpKTohMX0saXNJb3NPbGRlclRoYW46ZnVuY3Rpb24odCl7dmFyIG49Zih0LCIuIik7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBpJiYoaT1lLm1hdGNoKGMpLG51bGwhPT1pJiYoaT1mKGlbMV0sIl8iKSkpLGk/cChpLG4pOiExfSxpc0FwcE9sZGVyVGhhbjpmdW5jdGlvbihlKXt2YXIgbj1mKGUsIi4iKTtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEmJihhPWRlY29kZVVSSUNvbXBvbmVudCh0LmNvb2tpZSkubWF0Y2gocyksbnVsbCE9PWEmJihhPWYoYVsxXSwiLiIpKSksYT9wKGEsbik6ITF9LGdldEtpbmRsZUdlbjpmdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgciYmKHI9L0tpbmRsZSBGaXJlfEtGT1R8S0ZUVHxLRkpXL2kudGVzdChlKT81Oi9LRlNPfEtGVEh8S0ZBUC9pLnRlc3QoZSk/NjovS0ZBUnxLRkFTfEtGU0F8S0ZTVC9pLnRlc3QoZSk/NzovS0ZGT3xLRlRCfEtGTUUvaS50ZXN0KGUpPzg6MCkscn0sb25Nc2hvcDpmdW5jdGlvbigpe3JldHVybiBzLnRlc3QoZGVjb2RlVVJJQ29tcG9uZW50KHQuY29va2llKSl9fX0oKTt2YXIgZj1mdW5jdGlvbihlLHQpe3Q9dHx8Ii4iO2Zvcih2YXIgbj1lLnNwbGl0KHQpLGk9MDtpPG4ubGVuZ3RoO2krKyluW2ldPXBhcnNlSW50KG5baV0sMTApfHwwO3JldHVybiBufSxwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbMF08dFswXXx8ZVswXT09dFswXSYmZVsxXTx0WzFdfHxlWzBdPT10WzBdJiZlWzFdPT10WzFdJiZlWzJdPHRbMl19O3JldHVybiBpLmlzQ2FzY2FkaW5nSW50ZW50PWZ1bmN0aW9uKGUpe3JldHVybiAwPT1lLmluZGV4T2YoImFtYXpvbm1vYmlsZTovL2ludGVudD9pbnRlbnQ9Iil9LGkuaXNLaW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4vS2luZGxlIEZpcmV8S0ZPVHxLRlRUfEtGSld8S0ZTT3xLRlRIfEtGQVB8S0ZBUnxLRkFTfEtGU0F8S0ZTVHxLRkZPfEtGVEJ8S0ZNRS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9LGkuZG9lc1NES1N1cHBvcnRPcGVuSW5FeHRlcm5hbEJyb3dzZXI9ZnVuY3Rpb24oKXt0cnl7dmFyIGU9YW1hem9uLmdldFNES1ZlcnNpb24oKX1jYXRjaCh0KXtyZXR1cm4hMX1pZihvLmlzQW5kcm9pZERldmljZSgpKXt2YXIgbj1mKGUsIi4iKTtyZXR1cm4gblswXT41fHw1PT1uWzBdJiZuWzFdPjV8fDU9PW5bMF0mJjU9PW5bMV0mJm5bMl0+PTEzNX12YXIgaT1lLnNwbGl0KCItIilbMl0sbj1mKGksIi4iKTtyZXR1cm4gblswXT4yfHwyPT1uWzBdJiZuWzFdPjJ8fDI9PW5bMF0mJjI9PW5bMV0mJm5bMl0+PTEwfSxpfShlLHQpLGM9ZnVuY3Rpb24oKXt2YXIgdD17fTt0LmdldERldGFpbFBhZ2VVcmw9ZnVuY3Rpb24oZSl7dmFyIHQ9Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vZ3AvYXcvZC8iK2U7cmV0dXJuIHIuaXNNYXNoQXZhaWxhYmxlKCk/dD0iP2FwcC1hY3Rpb249ZGV0YWlsJmFzaW49IitlOnIuaXNNU2hvcE5hdGl2ZUFwcCgpJiYodD0iYW1hem9ubW9iaWxlOi8vc2hvcHBpbmc/Y2xpY2tzdHJlYW0tdGFnPWFkcyZhcHAtYWN0aW9uPWRldGFpbCZhc2luPSIrZSksci5pc0FtYW4oKSYmKHQ9bihhKCksdCkpLHR9LHQuZ2V0TW9iaWxlTmF2aWdhdGlvbj1mdW5jdGlvbigpe3JldHVybiByLmlzTWFzaEF2YWlsYWJsZSgpP2Z1bmN0aW9uKGUpe1Aud2hlbigibWFzaCIpLmV4ZWN1dGUoZnVuY3Rpb24odCl7dC5uYXZpZ2F0ZSh7dXJsOmV9KX0pfTpyLmlzTXJhaWRBdmFpbGFibGUoKSYmIXIuaXNNU2hvcE5hdGl2ZUFwcCgpP2Z1bmN0aW9uKGUpeyJ1bmRlZmluZWQiIT10eXBlb2YgYW1hem9uJiZvLmRvZXNTREtTdXBwb3J0T3BlbkluRXh0ZXJuYWxCcm93c2VyKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhbWF6b24ub3BlbkluRXh0ZXJuYWxCcm93c2VyP2FtYXpvbi5vcGVuSW5FeHRlcm5hbEJyb3dzZXIoZSk6bXJhaWQub3BlbihlKX06ZnVuY3Rpb24odCl7ZS5vcGVuKHQsIl90b3AiKX19O3QuZ2V0Q291cG9uUGFnZVVybD1mdW5jdGlvbih0LGMpe3ZhciBzPWkoKSxsPSJodHRwczovL3d3dy5hbWF6b24uY29tL2dwL2F3L2NvdXBvbi9jLyIrdCsiLyIrcztyZXR1cm4gYyYmKGwrPSI/IitvLmdldFF1ZXJ5U3RyaW5nKHtyZWRpcmVjdEFTSU46Y30pKSwidW5kZWZpbmVkIj09dHlwZW9mIFVybFV0aWxzJiYoZS5VcmxVdGlscz17aGFzUmVmVGFnOmZ1bmN0aW9uKGUpe3JldHVybi9bXC8mP11ccypyZWZfPz1bXiYjP1wvOl0qLy50ZXN0KGUpfSxpc0FtYXpvblVyaTpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL15bYS16QS1aXVthLXpBLVowLTkrLi1dKjpcL1wvLywiIiksbj10LnNwbGl0KC9bXC8/IzpdLykuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiAwIT1lLmxlbmd0aH0pO3JldHVybiBuWzBdPy9hbWF6b25bLl0oW2EtekEtWl0rJHxbYS16QS1aXSsuW2EtekEtWl0rJCkvLnRlc3QoblswXSk6ITF9LGluamVjdFF1ZXJ5U3RyaW5nUGFyYW06ZnVuY3Rpb24oZSx0LG4pe2lmKCF0fHwhbilyZXR1cm4gZTt2YXIgaT0iPyIrdCsiPSIrbixhPWUuaW5kZXhPZigiIyIpLHI9ZS5pbmRleE9mKCI/Iiksbz1hPj0wLGM9cj49MDtpZihvJiZjJiYoYz1hPnIpLCFjJiYhbylyZXR1cm4gZStpO3ZhciBzPWM/Ij8iOiIjIixsPWUuc3BsaXQocyksdT1sLnNsaWNlKDEpLmpvaW4ocyk7YyYmKHM9IiYiKTt2YXIgZD1sWzBdK2k7cmV0dXJuIHUmJihkKz1zK3UpLGR9LGluamVjdEFhcFJlZlRhZzpmdW5jdGlvbihlKXt2YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIElTXzNQJiZJU18zUCxuPSIiO3JldHVybiBlJiZuJiZ0JiZ0aGlzLmlzQW1hem9uVXJpKGUpJiYhdGhpcy5oYXNSZWZUYWcoZSk/dGhpcy5pbmplY3RRdWVyeVN0cmluZ1BhcmFtKGUsInJlZiIsbik6ZX0sZ2V0Q291cG9uVG9rZW46ZnVuY3Rpb24oKXtyZXR1cm4gYnRvYSgobmV3IERhdGUpLmdldFRpbWUoKSsiO0FNRyIpfSxnZXRDb3Vwb25Ub2tlbk1hY3JvOmZ1bmN0aW9uKCl7cmV0dXJuIlZQQ19DU19UT0tFTl9NQUNSTyJ9fSksImZ1bmN0aW9uIj09dHlwZW9mIGUuYnRvYSYmKGw9VXJsVXRpbHMuaW5qZWN0UXVlcnlTdHJpbmdQYXJhbShsLCJ2cGNfY3MiLFVybFV0aWxzLmdldENvdXBvblRva2VuTWFjcm8oKSkpLHIuaXNBbWFuKCkmJihsPW4oYSgpLGwpKSxyLmlzTVNob3BOYXRpdmVBcHAoKT8iYW1hem9ubW9iaWxlOi8vc2hvcHBpbmc/Y2xpY2tzdHJlYW0tdGFnPWFkcyZhcHAtYWN0aW9uPXdlYnZpZXcmdXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwpOmx9O3ZhciBuPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuaW5kZXhPZigiPyIpPi0xP3QrIiYiK2U6dCsiPyIrZX0saT1mdW5jdGlvbigpe3ZhciBlPSJyZWY9YW1nX21vYmlsZV8iLHQ9Il8yNTYweDI1NjAvIjtyZXR1cm4gci5pc01hc2hBdmFpbGFibGUoKT9lKyJtb2JpbGUtd2ViIit0OmUrKHIuaXNNU2hvcE5hdGl2ZUFwcCgpPyJzaG9wcGluZyI6IkFNQU4iKSt0fSxhPWZ1bmN0aW9uKCl7cmV0dXJuImFheGl0az16SzJzQ0plNno3ZS4tLms1QU1MaDlBIn07cmV0dXJuIHQuYWRkQWF4SW1wcmVzc2lvblRva2VuVG9Vcmw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pbmRleE9mKCI/Iiksbj1lLmluZGV4T2YoIiMiKSxpPS0xPT09dD8iPyI6IiYiLHI9LTE9PT1uP2UubGVuZ3RoOm47cmV0dXJuIGUuc3Vic3RyaW5nKDAscikraSthKCkrZS5zdWJzdHJpbmcocil9LHQuaXNJbnRlcm5hbFVybD1mdW5jdGlvbihlKXtpZihlKXt2YXIgdD0vXigoPzpodHRwcz86KVwvXC8pPyhbXHdcLVwuXSsoPzo6WzAtOV0rKT8pXC8/KC4qKSQvLG49ZS5tYXRjaCh0KSxpPW5bMl07cmV0dXJuL1wuYW1hem9uXC5jb20oOi4qKT8kLy50ZXN0KGkpfXJldHVybiExfSx0fSgpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXt9ZnVuY3Rpb24gYShuLGksYSl7dmFyIHI9ZnVuY3Rpb24odCl7aWYodD10fHxlLmV2ZW50LHQucHJldmVudERlZmF1bHQ9dC5wcmV2ZW50RGVmYXVsdHx8ZnVuY3Rpb24oKXt0LnJldHVyblZhbHVlPSExfSx0LnRhcmdldD10LnRhcmdldHx8dC5zcmNFbGVtZW50LHQuc3RvcFByb3BhZ2F0aW9uPXQuc3RvcFByb3BhZ2F0aW9ufHxmdW5jdGlvbigpe3QuY2FuY2VsQnViYmxlPSEwfSwhdC53aGljaCl7dmFyIG49dC5idXR0b247MSE9PW4mJihuPTI9PT1uPzM6ND09PW4/MjoxKSx0LndoaWNoPW59cmV0dXJuIHQueD10Lnh8fHQuY2xpZW50WCx0Lnk9dC55fHx0LmNsaWVudFksYSh0KX07cmV0dXJuIG49PT1lJiYiY29tcGxldGUiPT10LnJlYWR5U3RhdGU/YSgpOnZvaWQobi5hZGRFdmVudExpc3RlbmVyP24uYWRkRXZlbnRMaXN0ZW5lcihpLHIsITApOihpPSJvbiIraSxuLmF0dGFjaEV2ZW50P24uYXR0YWNoRXZlbnQoaSxyKTpuW2ldPXIpKX1mdW5jdGlvbiByKHQscixvKXtmdW5jdGlvbiBzKGUpe3ZhciB0PWUubm9kZU5hbWV8fGUudGFnTmFtZTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5ocmVmJiYvXmEkL2kudGVzdCh0KX1mdW5jdGlvbiBsKGUpe3JldHVybiAxPT09ZS53aGljaH1mdW5jdGlvbiB1KGUpe2lmKHMoZS50YXJnZXQpJiZsKGUpKXtlLnByZXZlbnREZWZhdWx0KCk7dmFyIHQ9bmV3IEltYWdlO3Quc3JjPXJ9fWZ1bmN0aW9uIGQoZSl7dmFyIGk9dDtpZihsaW5rVGFyZ2V0PWkudGFyZ2V0LGwoZSkmJnMoaSkmJi9fc2VsZnxfdG9wL2dpLnRlc3QobGlua1RhcmdldCkpe2UucHJldmVudERlZmF1bHQoKTt2YXIgYT1pLmhyZWY7ImZ1bmN0aW9uIj09dHlwZW9mIGMubWFzaE5hdmlnYXRpb25PdmVycmlkZSYmKGE9Yy5tYXNoTmF2aWdhdGlvbk92ZXJyaWRlLHA9ZnVuY3Rpb24oZSl7ZSgpfSksc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlO3RyeXtlPW4ubG9jYXRpb24scChhLGkudGFyZ2V0KX1jYXRjaCh0KXtwKGEsIl9ibGFuayIpfX0sZil9fWlmKCF0fHwhcilyZXR1cm4gaSgiRXJyb3I6IEVpdGhlciBlbGVtZW50IG9yIGNsaWNrVHJhY2tlclVybCBub3QgcHJvdmlkZWQgdG8gdHJhY2szUENsaWNrQXN5bmMgbWV0aG9kIik7bz1vfHx7fTt2YXIgZj1vLmNsaWNrVHJhY2tlclRpbWVvdXR8fDE1MCxwPW8ubmF2aWdhdGV8fGUub3BlbixtPSJ1bmRlZmluZWQiPT10eXBlb2Ygby5kZWxheUNsaWNrfHxvLmRlbGF5Q2xpY2s9PT0hMDthKHQsIm1vdXNlZG93biIsdSksbSYmYSh0LCJjbGljayIsZCl9ZS5BRF9ERUJVRz0hMCxlLkRBRFM9ZS5EQURTfHx7fSxEQURTLkFuYWx5dGljcz17dHJhY2szUENsaWNrQXN5bmM6cn19KCk7dmFyIHM9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiExO3ZhciB0PS0xIT1lLmluZGV4T2YoIi5hbWF6b24uIikmJi0xIT1lLmluZGV4T2YoImlkPW1vYmlsZXNwb3RsaWdodCIpJiYtMSE9ZS5pbmRleE9mKCJjYW1wYWlnbj0iKSxuPS9cYmFtYXpvblwuW2Etel0rKFwuW2Etel0rKT9cL2dwXC9hZGxwXC9tb2JpbGVzcG90bGlnaHQvLnRlc3QoZSk7cmV0dXJuIHR8fG59LGw9ZnVuY3Rpb24oZSxuKXt2YXIgaT1mdW5jdGlvbihlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIG1yYWlkJiZtcmFpZCYmImZ1bmN0aW9uIj09dHlwZW9mIG1yYWlkLm9wZW4pbXJhaWQub3BlbihlKTtlbHNle3ZhciBuPXQuY3JlYXRlRWxlbWVudCgiYSIpO24uaHJlZj1lLG4udGFyZ2V0PSJfdG9wIixuLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBpPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGE9aVtpLmxlbmd0aC0xXS5wYXJlbnROb2RlO2EuYXBwZW5kQ2hpbGQobik7dmFyIHI9dC5jcmVhdGVFdmVudCgiTW91c2VFdmVudCIpO3IuaW5pdEV2ZW50KCJjbGljayIsITAsITApLG4uZGlzcGF0Y2hFdmVudChyKX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYW1hem9uKWlmKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQW5kcm9pZCIpPi0xfHxuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoImFuZHJvaWQiKT4tMSkidW5kZWZpbmVkIiE9dHlwZW9mIGFtYXpvbi5vcGVuSW5FeHRlcm5hbEJyb3dzZXI/YW1hem9uLm9wZW5JbkV4dGVybmFsQnJvd3NlcihlKTppKGUpO2Vsc2UgdHJ5e3ZhciBhPWFtYXpvbi5nZXRTREtWZXJzaW9uKCkscj1hLnNwbGl0KCItIilbMl0sbz1yLnNwbGl0KCIuIik7KG9bMF0+Mnx8Mj09b1swXSYmb1sxXT4yfHwyPT1vWzBdJiYyPT1vWzFdJiZvWzJdPj0xMCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgYW1hem9uLm9wZW5JbkV4dGVybmFsQnJvd3Nlcj9hbWF6b24ub3BlbkluRXh0ZXJuYWxCcm93c2VyKGUpOmkoZSl9Y2F0Y2goYyl7aShlKX1lbHNle2lmKG4pcmV0dXJuIGkobik7aShlKX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgTVNGQ2xpZW50KXt2YXIgdT1NU0ZDbGllbnQuZ2V0UGxhY2VtZW50SW5mbygpLGQ9dS5zbG90TmFtZSxmPXUucGFnZVR5cGUscD11LnN1YlBhZ2VUeXBlLG09bXx8e307bS5jcmVhdGl2ZUlkPSIzMjk4NzI2NTYwMjAxIixtLmFkSWQ9IjMyMjM4NjU4OTAwMDEiLG0uaW1hZ2VVcmw9IiIsbS5hY3Rpb25UeXBlPSIiLG0uYWN0aW9uSW5mbz0iIixtLnBhZ2VUeXBlPWYsbS5zdWJQYWdlVHlwZT1wLG0uc2xvdE5hbWU9ZCxNU0ZDbGllbnQuc2VuZEFkSW5mbyhtKX12YXIgZz1vLmdldEVsZW1lbnRCeUlkKCJ2cGMtYWFwSW5mbyIpLHY9by5nZXRFbGVtZW50QnlJZCgibW9iaWxlLWFkcy1saW5rIiksaD1vLmdldEVsZW1lbnRCeUlkKCJtb2JpbGUtYWRzLWFkIikseT1vLmdldEVsZW1lbnRCeUlkKCJtb2JpbGUtYWQtaW1hZ2UiKSxBPW5ldyBpO0EubG9nSW1wcmVzc2lvbigpLEEuc3RhcnRUaW1lcihpLkxPR19FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpLGkuYWRkTGlzdGVuZXIoeSwibG9hZCIsZnVuY3Rpb24oKXtBLmVuZFRpbWVyKGkuTE9HX0VWRU5UX05BTUVTLklNQUdFX0xPQURfTEFURU5DWSksQS5lbmRUaW1lcihpLkxPR19FVkVOVF9OQU1FUy5DUkVBVElWRV9MT0FEX0xBVEVOQ1kpfSksbmF2aWdhdGlvblVybD0iaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9iP25vZGU9MjIzODE5MjAxMSZyZWY9aG91c2VhZHMwMS0yMCIsbmF2aWdhdGlvblVybD1uYXZpZ2F0aW9uVXJsLnJlcGxhY2UoL15odHRwOlwvXC93d3cuYW1hem9uLi9pLCJodHRwczovL3d3dy5hbWF6b24uIiksdi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGwobmF2aWdhdGlvblVybCksdC50cmFja0NsaWNrKCksXygpLCExfTt2YXIgVD0ic2hhemFtL2djLWJkYXktaG91c2UtMjU2MHgyNTYwLVl4UXJ2Ll9WNTEyMzUxOTA5Xy5qcGciO2tub3duVG9CZU9uVGhpcmRQYXJ0eT0hMTt2YXIgST1mdW5jdGlvbihpKXt2YXIgYT0vXigoPzpodHRwcz86KVwvXC8pPyhbXHdcLVwuXSsoPzo6WzAtOV0rKT8pXC8/KC4qKSQvLHI9ITE7dHJ5e3ZhciBsPWkubWF0Y2goYSksdT1sWzJdO3I9L1wuYW1hem9uXC5jb20oOi4qKT8kLy50ZXN0KHUpfWNhdGNoKGQpe31yPyhzKGkpP3YuaHJlZj1pKyImYWRJZD0zMjIzODY1ODkwMDAxJmNyZWF0aXZlSWQ9MzI5ODcyNjU2MDIwMSZleC1hYXhpdGs9eksyc0NKZTZ6N2UuLS5rNUFNTGg5QSI6di5ocmVmPWksdi5vbmNsaWNrPWZ1bmN0aW9uKGUpe2lmKHQudHJhY2tDbGljaygpLF8oKSwidW5kZWZpbmVkIiE9dHlwZW9mIE1TRkNsaWVudCYmTVNGQ2xpZW50Lm1hc2guaXNBVUlBdmFpbGFibGUoKSl7dmFyIG49TVNGQ2xpZW50LmdldFBsYWNlbWVudEluZm8oKS5zdWJQYWdlVHlwZTtpZigvLiptc2hvcC4qfGlQYWR8S2luZGxlLip8QW5kcm9pZHxkZWFscy1BbmRyb2lkfGRlYWxzLWlvcy9pLnRlc3QobikmJi9wcmltZW5vdy9pLnRlc3QodSkpdHJ5e01TRkNsaWVudC5tYXNoLm9wZW5JbkV4dGVybmFsQnJvd3Nlci5leGVjdXRlKHt1cmw6aX0pLGUucHJldmVudERlZmF1bHQoKX1jYXRjaChhKXt9fX0sdi50YXJnZXQ9Il90b3AiKToodi5ocmVmPSJqYXZhc2NyaXB0OjsiLHYub25jbGljaz1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgTVNGQ2xpZW50KWlmKE1TRkNsaWVudC5tYXNoLmlzQVVJQXZhaWxhYmxlKCkpe3ZhciBhPU1TRkNsaWVudC5nZXRQbGFjZW1lbnRJbmZvKCkuc3ViUGFnZVR5cGU7Ly4qbXNob3AuKnxpUGFkfEtpbmRsZS4qfEFuZHJvaWR8ZGVhbHMtQW5kcm9pZHxkZWFscy1pb3MvaS50ZXN0KGEpP28ubW9iaWxlLmlzSW9zT2xkZXJUaGFuKCI5LjAuMCIpP01TRkNsaWVudC5tYXNoLnNob3dBZHNCcm93c2VyLmV4ZWN1dGUoe3RhcmdldFVSTDppfSk6TVNGQ2xpZW50Lm1hc2gub3BlbkluRXh0ZXJuYWxCcm93c2VyLmV4ZWN1dGUoe3VybDppfSk6bi5sb2NhdGlvbj1pfWVsc2UgaWYoTVNGQ2xpZW50LmlzT25BbWF6b24oKSluLmxvY2F0aW9uPWk7ZWxzZXt2YXIgcj1lO3RyeXtlLnRvcCYmKHI9ZS50b3ApfWNhdGNoKHMpe31yLmxvY2F0aW9uPWl9ZWxzZXt0cnl7ZS5QPWUuUHx8bi5QfWNhdGNoKGwpe31pZigidW5kZWZpbmVkIiE9dHlwZW9mIGUuUClvLm1vYmlsZS5vbk1zaG9wKCk/by5tb2JpbGUuaXNJb3NPbGRlclRoYW4oIjkuMC4wIik/UC53aGVuKCJtYXNoIikuZXhlY3V0ZShmdW5jdGlvbihlKXtlLnNob3dBZHNCcm93c2VyKHt0YXJnZXRVUkw6aSxmYWlsQ2FsbGJhY2s6ZnVuY3Rpb24oKXtlLm9wZW5JbkV4dGVybmFsQnJvd3Nlcih7dXJsOml9KX19KX0pOlAud2hlbigibWFzaCIpLmV4ZWN1dGUoZnVuY3Rpb24oZSl7ZS5vcGVuSW5FeHRlcm5hbEJyb3dzZXIoe3VybDppfSl9KTpuLndpbmRvdy5sb2NhdGlvbj1pO2Vsc2UgaWYoZS5pc05hdGl2ZVJlYWN0UGxhY2VtZW50KWUubG9jYXRpb249aTtlbHNlIGlmKGMuaXNJbnRlcm5hbFVybChlLmxvY2F0aW9uLmhyZWYpKWUubG9jYXRpb249Ii8/YXBwLWFjdGlvbj1leHRlcm5hbCZ1cmw9IitlbmNvZGVVUklDb21wb25lbnQoaSk7ZWxzZXt2YXIgcj1lO3RyeXtlLnRvcCYmKHI9ZS50b3ApfWNhdGNoKHMpe31yLmxvY2F0aW9uPWl9fXJldHVybiB0LnRyYWNrQ2xpY2soKSxfKCksITF9KX07aWYocyhuYXZpZ2F0aW9uVXJsKSYmKG5hdmlnYXRpb25VcmwrPSImYWRJZD0zMjIzODY1ODkwMDAxJmNyZWF0aXZlSWQ9MzI5ODcyNjU2MDIwMSZleC1hYXhpdGs9eksyc0NKZTZ6N2UuLS5rNUFNTGg5QSIsKG8ubW9iaWxlLmlzQW5kcm9pZE9zT2xkZXJUaGFuKCI0LjMuMCIpfHxvLm1vYmlsZS5pc0lvc09sZGVyVGhhbigiNy4wLjAiKXx8by5tb2JpbGUuZ2V0S2luZGxlR2VuKCkmJm8ubW9iaWxlLmdldEtpbmRsZUdlbigpPDcpJiYobmF2aWdhdGlvblVybD1uYXZpZ2F0aW9uVXJsLFQ9VCkpLEkobmF2aWdhdGlvblVybCksQS5zdGFydFRpbWVyKGkuTE9HX0VWRU5UX05BTUVTLklNQUdFX0xPQURfTEFURU5DWSksInVuZGVmaW5lZCIhPXR5cGVvZiBNU0ZDbGllbnQmJi8uKmRldGFpbC4qL2kudGVzdChNU0ZDbGllbnQuZ2V0UGxhY2VtZW50SW5mbygpLnBhZ2VUeXBlKSYmLy4qZW5jb3JlLiovaS50ZXN0KE1TRkNsaWVudC5nZXRQbGFjZW1lbnRJbmZvKCkuc2xvdE5hbWUpJiYoVD1ULnJlcGxhY2UoIi5qcGciLC8uKl9cLmpwZy4qLy50ZXN0KFQpPyJTTDEyODBfLmpwZyI6Il9TTDEyODBfLmpwZyIpKSxUKXt2YXIgRT0iaHR0cHM6Ly9pbWFnZXMtbmEuc3NsLWltYWdlcy1hbWF6b24uY29tL2ltYWdlcy9HLzAxLyIrVDt5LnNyYz1FLHYuc3R5bGUuZGlzcGxheT0iYmxvY2sifWcmJmtub3duVG9CZU9uVGhpcmRQYXJ0eSYmby5zaG93KGcpO3ZhciBDO2tub3duVG9CZU9uVGhpcmRQYXJ0eSYmKG8uYWRkQ2xhc3MoaCwiYWFwIiksdi50YXJnZXQ9Il9ibGFuayIpLEMmJm8uc2V0SHJlZihnLCJodHRwczovL3d3dy5hbWF6b24uY29tL2FkcHJlZnMiLCEwKTt2YXIgXz1mdW5jdGlvbigpe30sUz1mdW5jdGlvbihlLG4pe3ZhciBpPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYoIWkpe3ZhciBhPXQuY3JlYXRlRWxlbWVudCgiaW1nIik7YS5zZXRBdHRyaWJ1dGUoInNyYyIsbiksYS5zZXRBdHRyaWJ1dGUoImlkIixlKSxhLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQuYm9keS5hcHBlbmRDaGlsZChhKX19O3QudHJhY2tDbGljaz1mdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lJiZudWxsPT10P1MoImNsaWNrLWltcHJlc3Npb24iLCdodHRwczovL2FheC11cy1lYXN0LmFtYXpvbi1hZHN5c3RlbS5jb20veC9jL1F2OERGWkVMTzA1emo0aTJVNUtZOWNvQUFBRmhtZUU1bHdFQUFBR1FBZmFKOTN3L2h0dHBzOi8vaW1hZ2VzLW5hLnNzbC1pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvRy8wMS9tb2JpbGUvYmxhbmtfcGl4ZWwuX1YxMzc4NzUwNzZfLmdpZicpOlMoZSx0KSwhMX07dmFyIE89IkFOWSIsdz0icy5hbWF6b24tYWRzeXN0ZW0uY29tIjsoIkFOWSI9PT1PP2xvY2F0aW9uLnByb3RvY29sOk8pKyIvLyIrdysiL2NsaWNrIn0od2luZG93LGRvY3VtZW50LHBhcmVudCl9LDApOzwvc2NyaXB0PjxhIGlkPSJ2cGMtbG9nbyI+PC9hPjxhIGlkPSJ2cGMtYWFwSW5mbyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJoaWRlIGFjIiBocmVmPSJodHRwczovL3d3dy5hbWF6b24uY29tL2FkcHJlZnMvcmVmPWNzX2FhcF8zMjk4NzI2NTYwMjAxIj48L2E+PHNjcmlwdD5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZXZhbChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaWZyYW1lX3NjcmlwdCIpLmlubmVySFRNTCl9LDApOzwvc2NyaXB0PjwvYm9keT4KDQoNCg0KICANCjwhLS0gY3JlYXRpdmVNb2REYXRlID0gMTUwOTY3MDY0ODAwMCAtLT48L2Rpdj4=&quot;,&quot;enableAdBlockerDetector&quot;: false,&quot;disableResizeFunc&quot;: true,&quot;fallbackStaticAdImgUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdClickUrl&quot;: &quot;&quot;,&quot;fallbackStaticAdExtraStyle&quot;: &quot;&quot;,&quot;advertisementTextOnTop&quot;: true,&quot;viewabilityStandards&quot;: [{&quot;p&quot;: 0, &quot;t&quot;: 0, &quot;def&quot;: &quot;amzn&quot;}, {&quot;p&quot;: 50, &quot;t&quot;: 1, &quot;def&quot;: &quot;iab&quot;}, {&quot;p&quot;: 100, &quot;t&quot;: 0, &quot;def&quot;: &quot;groupm&quot;}],&quot;ajaxWeblabTriggerId&quot;: &quot;&quot;}" title="Advertisement" data-arid="04e6f18d030340afa4fe9976258ba006"><div id="ape_detail_encore_detail-mWeb_placement" aria-hidden="true"></div></div><script>(function(){function a(d,e){if(window.addEventListener){window.addEventListener(d,e,false);}else{if(window.attachEvent){window.attachEvent("on"+d,e);}}}function c(d,e){if(window.removeEventListener){window.removeEventListener(d,e,false);}else{if(window.detachEvent){window.detachEvent("on"+d,e);}}}var b=function(){(function(){(function(j,n){j.sfLogErrors=j.sfLogErrors||false;var o=o||function(s,r){r=r||new Error(s);if(j.ue&&typeof ue.count=="function"){ue.count("adplacements:safeFrameError",1);}if(!j.sfLogErrors){return;}if(j.ueLogError){j.ueLogError(r,{logLevel:"ERROR",attribution:"APE-safeframe",message:s+" "});}else{if(typeof console!=="undefined"&&console.error){console.error(s,r);}}};function d(){return j.innerHeight||n.documentElement.clientHeight;}function g(){return j.innerWidth||n.documentElement.clientWidth;}function e(t,r,s){if(t>0){return(s>t);}else{return(r>0);}}var f=function(){return(Date.now?Date.now():new Date().getTime());};throttle=function(s,u,y){var r,w,z;var x=null;var v=0;if(!y){y={};}var t=function(){v=y.leading===false?0:f();x=null;z=s.apply(r,w);if(!x){r=w=null;}};return function(){var B=f();if(!v&&y.leading===false){v=B;}var A=u-(B-v);r=this;w=arguments;if(A<=0||A>u){if(x){clearTimeout(x);x=null;}v=B;z=s.apply(r,w);if(!x){r=w=null;}}else{if(!x&&y.trailing!==false){x=setTimeout(t,A);}}return z;};};function l(u,w,v,r){try{var t=n.getElementById(u).getBoundingClientRect();if(e(t.top,t.bottom,d())&&e(t.left,t.right,g())){if(typeof uet=="function"){uet("bb","adplacements:viewablelatency:"+w,{wb:1});if(v){uet("bb","adplacements:viewablelatency:"+v,{wb:1});}}if(typeof uex=="function"&&j.ue&&typeof ue.count=="function"){if(j.apeViewableLatencyTrackers[r].loaded){uex("ld","adplacements:viewablelatency:"+w,{wb:1});if(v){uex("ld","adplacements:viewablelatency:"+v,{wb:1});}ue.count("adplacements:htmlviewed:loaded:"+w,1);if(v){ue.count("adplacements:htmlviewed:loaded:"+v,1);}}ue.count("adplacements:htmlviewed:"+w,1);if(v){ue.count("adplacements:htmlviewed:"+v,1);}}j.apeViewableLatencyTrackers[r].viewed=true;if(j.apeViewableLatencyTrackers[r].tracker){c("scroll",j.apeViewableLatencyTrackers[r].tracker);c("resize",j.apeViewableLatencyTrackers[r].tracker);}}}catch(s){j.apeViewableLatencyTrackers[r].valid=false;}}try{j.apeViewableLatencyTrackers=j.apeViewableLatencyTrackers||{};var q="ape_detail_encore_detail-mWeb_placement";var p="detail_encore_detail-mWeb".replace(/\_/g,":");var h="";var i="04e6f18d030340afa4fe9976258ba006";j.apeViewableLatencyTrackers[i]=j.apeViewableLatencyTrackers[i]||{};j.apeViewableLatencyTrackers[i].valid=true;l(q,p,h,i);if(j.apeViewableLatencyTrackers[i].valid&&!j.apeViewableLatencyTrackers[i].viewed){j.apeViewableLatencyTrackers[i].tracker=throttle(function(){l(q,p,h,i);},20);a("scroll",j.apeViewableLatencyTrackers[i].tracker);a("resize",j.apeViewableLatencyTrackers[i].tracker);}}catch(k){if(j.apeViewableLatencyTrackers&&j.apeViewableLatencyTrackers["04e6f18d030340afa4fe9976258ba006"]){j.apeViewableLatencyTrackers["04e6f18d030340afa4fe9976258ba006"].valid=false;}o("Error initializing viewable latency instrumentation",k);}try{j.encore={};j.encore.adStartTime=(new Date()).getTime();var m=j.DAsf||j.MAsf||null;if(m){m.loadAds();}else{m=n.createElement("script");m.type="text/javascript";m.async=true;m.setAttribute("crossorigin","anonymous");m.charset="utf-8";m.src="https://images-na.ssl-images-amazon.com/images/G/01/ape/sf/mobile/MAsf-1.15._CB488131535_.js?csm_attribution=APE-SafeFrame";m.onerror=function(){o("Error loading SafeFrame library");};(n.getElementsByTagName("head")[0]||n.getElementsByTagName("body")[0]).appendChild(m);}}catch(k){o("Error appending MAsf library",k);}}(window,document));})();};b();})();</script>
</div>
</div>
</div>
<div id="WrapperDivToHideFooter" style="display: block;">
<script type="text/javascript">
'use strict';
(function () {
function install() {
var searchIconLink = document.getElementById('search-icon-link');
if (searchIconLink) {
searchIconLink.onclick = function(e) {
var refStartPos = this.href.lastIndexOf('#');
if (refStartPos > 0 && refStartPos < this.href.length - 1) {
var searchBox = document.getElementById(this.href.substring(refStartPos + 1));
if (searchBox) {
searchBox.focus();
e.preventDefault();
}
}
};
}
}
if (document.readyState === "complete") { install(); }
else { window.addEventListener('load', install); }
}());
</script>
<script type="text/javascript">
if(typeof performance!= "undefined" && typeof performance.getEntries != "undefined") {
var dpmaName = "DetailPageMobileWebMetaAsset";
if(dpmaName) {
for(i = 0 ; i < performance.getEntries().length; i++) {
var name = performance.getEntries()[i].name;
var res = name.match(/\.css\?AUIClients\/DetailPageMobileWebMetaAsset/);
var dpEntry = performance.getEntries()[i];
if(res && dpEntry.initiatorType && dpEntry.initiatorType == "link") {
var dpmaDuration = dpEntry.duration;
ue.count("dpma.duration", dpmaDuration);
if(dpmaDuration < 50) {
ue.tag("dpmaCached");
} else {
ue.tag("dpmaNotCached");
}
ue.count("dpma.startTime", dpEntry.startTime);
break;
}
}
}
for(i = 0 ; i < performance.getEntries().length ; i++){
var name = performance.getEntries()[i].name ;
var res = name.match(/\.css\?AUIClients\/AmazonUI/g);
var initiatorType = performance.getEntries()[i].initiatorType;
if(res && initiatorType && initiatorType == "link"){
var duration = performance.getEntries()[i].duration ;
ue.count("aui.duration", duration);
ue.count("aui.startTime", performance.getEntries()[i].startTime);
if(duration < 50){ csmTag = "auiCached";}
else{ csmTag = "auiNotCached";}
if(window.ue && ue.tag) { ue.tag(csmTag);}
break;
}
}
}
</script>
</div>
<!--&&&Portal&Delimiter&&&--><!-- sp:end-feature:host-atf -->
<!-- sp:feature:nav-btf -->
<!-- btf pilu -->
<script type="text/javascript">
var component = 'navCF';
try {
(window.AmazonUIPageJS ? AmazonUIPageJS : P).register(component);
}
catch(e) {
var error = e.message.toLowerCase();
var alreadyRegisteredMsg = component + ' already registered';
if (error.indexOf(alreadyRegisteredMsg.toLowerCase()) === -1) {
throw(e);
}
}
</script>
<!--NAVYAAN-HEADER-DATA-->
<!--NAVYAAN-HEADER-DATA-END-->
<script type="text/javascript">
window.$Nav && $Nav.when('$').run('searchScoping', function($) {
$('#nav-search-keywords-data').attr('data-implicit-alias', 'aps' );
});
</script>
<form style="display: none;">
<input type="hidden" id="rwol-display-called" value="1">
</form>
<script type="a-state" data-a-state="{&quot;key&quot;:&quot;rw-dynamic-modal-bootstrap&quot;}">{"origSessionId":"147-0816675-1753153","subPageType":null,"pageType":"DetailAW","ASIN":"193435659X","path":"/Seven-Languages-Weeks-Programming-Programmers/dp/193435659X","isAUI":"1"}</script>
<script>
(window.AmazonUIPageJS ? AmazonUIPageJS : P).when('navCF').execute(function(){
(window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/11QXqf0G81L.js?AUIClients/RetailWebsiteOverlayAUIAssets');
});
</script>
<!-- btf tilu -->
<!-- sp:feature:host-btf -->
<script type="text/javascript"> P.when('atf').execute(function() { document.getElementById('WrapperDivToHideFooter').style.display = 'block';}) </script>
</div>
<!-- htmlEndMarker -->
<!-- whfh-CsJEHnPXMi7JZkC8OYNpK2rzeAecrcoHkyIAiI5ONpNkHsR0WmR4kzJ62BoxgOz/ rid-7F3MGDYTH1YH8KVBSFWJ -->
<!-- sp:end-feature:host-btf -->
<!-- sp:feature:aui-preload -->
<!-- sp:feature:nav-footer -->
<!-- footer pilu -->
<footer class="nav-mobile nav-locale-us nav-lang-en nav-ftr-batmobile">
<div id="nav-ftr" class="nav-t-standard nav-sprite-v3">
<a id="nav-ftr-gototop" class="nav-a" href="#top"><i class="nav-icon"></i><b class="nav-b">Top of page</b></a>
<div id="search-ac-init-data" data-aliases="" data-ime="" data-mkt="" data-src="">
</div>
<div id="nav-search-keywords-data" data-implicit-alias="aps">
</div>
<div class="nav-searchbar-wrapper">
<form class="nav-searchbar" action="/gp/aw/s/ref=is_s" method="get" role="search" id="nav-search-form" accept-charset="utf-8">
<div class="nav-right">
<div class="nav-search-submit">
<input type="submit" class="nav-input" value="Go" aria-label="Go">
<i class="nav-icon nav-sprite"></i>
</div>
</div>
<div class="nav-fill" dir="auto">
<div class="nav-search-field">
<input type="text" class="nav-input" placeholder="Search" aria-label="Type search keywords" data-aria-clear-label="Clear search keywords" name="k" autocomplete="off" autocorrect="off" autocapitalize="off" dir="auto" value="" id="nav-search-keywords">
<a class="nav-icon nav-sprite nav-search-clear" tabindex="0" href="javascript:;" aria-label="Clear search keywords"></a></div>
</div>
</form>
</div>
<ul id="nav-ftr-links" class="nav-ftr-links-two-column"><li class="nav-li nav-li-right"><a class="nav-a" href="/gp/aw/c/ref=navm_ftr_cart"><span class="nav-ftr-text">Cart (<b class="nav-b nav-cart-count">0</b>)</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li nav-li-right"><a class="nav-a" href="/gp/aw/ls/ref=navm_ftr_wl"><span class="nav-ftr-text">Your Lists</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li nav-li-right"><a class="nav-a" href="/gcx/Gifts-for-Adults/gfhz/ref=navm_ftr_gf"><span class="nav-ftr-text">Find a Gift</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li nav-li-right"><a class="nav-a" href="/gp/aw/ybh/ref=navm_ftr_ybh"><span class="nav-ftr-text">Browsing History</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li nav-li-right aok-offscreen nav-hidden"><a class="nav-a" href="/gp/aw/contact-us/c2c/phone?ie=UTF8&amp;c2cId=f67f2578-98fb-4abd-a85d-ec8e1918eaca" aria-label="Click to call our Disability Customer Support line, or reach us directly at 1-888-283-1678 "><span class="nav-ftr-text">Disability Customer Support</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li nav-li-right"><a class="nav-a" href="/gp/anywhere/site-view.html/ref=navm_ftr_fullsite?ie=UTF8&amp;force-full-site=1&amp;opt=desktop&amp;url=http%3A%2F%2Fwww.amazon.com%2Fref%3Dnavm_ftr_fullsite"><span class="nav-ftr-text">Amazon.com Full Site</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/ref=navm_ftr_home"><span class="nav-ftr-text">Amazon.com</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/gp/aw/ya/or/ref=navm_ftr_yo"><span class="nav-ftr-text">Your Orders</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/b/ref=navm_ftr_reg_gc?ie=UTF8&amp;node=13245981011"><span class="nav-ftr-text">Gift Cards &amp; Registry</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/gp/aw/ya/ref=navm_ftr_ya"><span class="nav-ftr-text">Your Account</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/gp/aw/contact-us/ref=navm_ftr_cu"><span class="nav-ftr-text">Customer Service</span><i class="nav-icon nav-sprite"></i></a></li><li class="nav-li"><a class="nav-a" href="/gp/help/customer/display.html/ref=navm_ftr_help?ie=UTF8&amp;id=help"><span class="nav-ftr-text">Help</span><i class="nav-icon nav-sprite"></i></a></li></ul>
<div class="icp-container-mobile">
<style type="text/css">
#icp-touch-link-language { display: none; }
</style>
<a href="/gp/customer-preferences/select-language/ref=footer_lang?ie=UTF8&amp;preferencesReturnUrl=%2FSeven-Languages-Weeks-Programming-Programmers%2Fdp%2F193435659X%2Fref%3Dpd_bxgy_14_img_2%3F_encoding%3DUTF8%26pd_rd_i%3D193435659X%26pd_rd_r%3DWSNXYSXXFG53ETVDPB1H%26pd_rd_w%3DH6Ec1%26pd_rd_wg%3DVIcc7%26psc%3D1%26refRID%3DWSNXYSXXFG53ETVDPB1H" class="icp-touch-link-2" id="icp-touch-link-language">
<div class="icp-nav-globe-img-2 icp-mobile-globe-2"></div><span class="icp-color-base">English</span><span class="nav-arrow icp-up-down-arrow"></span>
</a>
<style type="text/css">
#icp-touch-link-country { display: none; }
</style>
<a href="/gp/navigation-country/select-country/ref=?ie=UTF8&amp;preferencesReturnUrl=%2FSeven-Languages-Weeks-Programming-Programmers%2Fdp%2F193435659X%2Fref%3Dpd_bxgy_14_img_2%3F_encoding%3DUTF8%26pd_rd_i%3D193435659X%26pd_rd_r%3DWSNXYSXXFG53ETVDPB1H%26pd_rd_w%3DH6Ec1%26pd_rd_wg%3DVIcc7%26psc%3D1%26refRID%3DWSNXYSXXFG53ETVDPB1H" class="icp-touch-link-2" id="icp-touch-link-country">
<span class="icp-flag-3 icp-flag-3-us"></span><span class="icp-color-base">United States</span>
</a>
</div>
<div id="nav-ftr-auth">
Already a customer?<a href="https://www.amazon.com/ap/signin?_encoding=UTF8&amp;openid.assoc_handle=usamazon&amp;openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&amp;openid.mode=checkid_setup&amp;openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&amp;openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&amp;openid.pape.max_auth_age=0&amp;openid.return_to=https%3A%2F%2Fwww.amazon.com%2FSeven-Languages-Weeks-Programming-Programmers%2Fdp%2F193435659X%2Fref%3Dpd_bxgy_14_img_2%3F_encoding%3DUTF8%26pc_redir%3DT1%26pd_rd_i%3D193435659X%26pd_rd_r%3DWSNXYSXXFG53ETVDPB1H%26pd_rd_w%3DH6Ec1%26pd_rd_wg%3DVIcc7%26psc%3D1%26refRID%3DWSNXYSXXFG53ETVDPB1H%26ref_%3Dpd_bxgy_14_img_2" class="nav-a">Sign In</a></div>
<ul class="nav-ftr-horiz "><li class="nav-li "><a href="/gp/aw/help/ref=navm_ftr_cou?ie=UTF8&amp;id=cou" class="nav-a">Conditions of Use</a></li><li class="nav-li "><a href="/gp/aw/help/ref=navm_ftr_mpa?ie=UTF8&amp;id=mpa" class="nav-a">Privacy Notice</a></li><li class="nav-li "><a href="/gp/aw/help/ref=navm_ftr_iba?ie=UTF8&amp;id=201308670" class="nav-a">Interest-Based Ads</a></li></ul>
<div id="nav-ftr-copyright">© 1996-2018, Amazon.com, Inc. or its affiliates</div>
</div>
</footer>
<!-- whfh-qrC79k737IdJlRZQhayitoojg9xianXzkPf2p5tIEsm92JYxficH8sFlTFSzZPKITRb2PBQIn0o= rid-7F3MGDYTH1YH8KVBSFWJ -->
<div id="sis_pixel_r2" aria-hidden="true" style="height:1px; position: absolute; left: -1000000px; top: -1000000px;"><iframe id="DAsis" src="//s.amazon-adsystem.com/iu3?d=amazon.com&amp;slot=navFooter&amp;a2=0101b0dd9e9ed6e4d14ee592d143072c505a53e1e3e76a653ab663fa010fec990386&amp;old_oo=0&amp;cb=1518705128411" width="1" height="1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="display: none !important;"></iframe></div><script>(function(a,b){a.attachEvent?a.attachEvent("onload",b):a.addEventListener&&a.addEventListener("load",b,!1)})(window,function(){setTimeout(function(){var el=document.getElementById("sis_pixel_r2");el&&(el.innerHTML='<iframe id="DAsis" src="//s.amazon-adsystem.com/iu3?d=amazon.com&slot=navFooter&a2=0101b0dd9e9ed6e4d14ee592d143072c505a53e1e3e76a653ab663fa010fec990386&old_oo=0&cb=1518705128411" width="1" height="1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>')},300)});</script><!-- footer tilu -->
<div id="be" style="display:none;visibility:hidden;"><form name="ue_backdetect" action="get"><input type="hidden" name="ue_back" value="2"></form>
<script type="text/javascript">
var ue_mbl=ue_csm.ue.exec(function(e,a){function l(f){b=f||{};a.AMZNPerformance=b;b.transition=b.transition||{};b.timing=b.timing||{};e.ue.exec(m,"csm-android-check")()&&b.tags instanceof Array&&(f=-1!=b.tags.indexOf("usesAppStartTime")||b.transition.type?!b.transition.type&&-1<b.tags.indexOf("usesAppStartTime")?"warm-start":void 0:"view-transition",f&&(b.transition.type=f));"reload"===c._nt&&e.ue_orct||"intrapage-transition"===c._nt?a.performance&&performance.timing&&performance.timing.navigationStart?
b.timing.transitionStart=a.performance.timing.navigationStart:delete b.timing.transitionStart:"undefined"===typeof c._nt&&a.performance&&performance.timing&&performance.timing.navigationStart&&a.history&&"function"===typeof a.History&&"object"===typeof a.history&&history.length&&1!=history.length&&(b.timing.transitionStart=a.performance.timing.navigationStart);f=b.transition;var d;d=c._nt?c._nt:void 0;f.subType=d;a.ue&&a.ue.tag&&a.ue.tag("has-AMZNPerformance");c.isl&&a.uex&&uex("at","csm-timing");
n()}function p(b){a.ue&&a.ue.count&&a.ue.count("csm-cordova-plugin-failed",1)}function m(){return a.webclient&&"function"===typeof a.webclient.getRealClickTime?a.cordova&&a.cordova.platformId&&"ios"==a.cordova.platformId?!1:!0:!1}function n(){try{P.register("AMZNPerformance",function(){return b})}catch(a){}}function h(){if(!b)return"";ue_mbl.cnt=null;for(var a=b.timing,d=b.transition,a=["mts",k(a.transitionStart),"mps",k(a.processStart),"mtt",d.type,"mtst",d.subType,"mtlt",d.launchType],d="",c=0;c<
a.length;c+=2){var e=a[c],g=a[c+1];"undefined"!==typeof g&&(d+="&"+e+"="+g)}return d}function k(a){if("undefined"!==typeof a&&"undefined"!==typeof g)return a-g}function q(a,c){b&&(g=c,b.timing.transitionStart=a,b.transition.type="view-transition",b.transition.subType="ajax-transition",b.transition.launchType="normal",ue_mbl.cnt=h)}var c=e.ue||{},g=e.ue_t0,b;if(a.P&&a.P.when&&a.P.register)return a.P.when("CSMPlugin").execute(function(a){a.buildAMZNPerformance&&a.buildAMZNPerformance({successCallback:l,
failCallback:p})}),{cnt:h,ajax:q}},"mobile-timing")(ue_csm,window);
(function(d){d._uess=function(){var a="";screen&&screen.width&&screen.height&&(a+="&sw="+screen.width+"&sh="+screen.height);var b=function(a){var b=document.documentElement["client"+a];return"CSS1Compat"===document.compatMode&&b||document.body["client"+a]||b},c=b("Width"),b=b("Height");c&&b&&(a+="&vw="+c+"&vh="+b);return a}})(ue_csm);
(function(a){var b=document.ue_backdetect;b&&b.ue_back&&a.ue&&(a.ue.bfini=b.ue_back.value);a.uet&&a.uet("be");a.onLdEnd&&(window.addEventListener?window.addEventListener("load",a.onLdEnd,!1):window.attachEvent&&window.attachEvent("onload",a.onLdEnd));a.ueh&&a.ueh(0,window,"load",a.onLd,1);a.ue&&a.ue.tag&&(a.ue_furl&&a.ue_furl.split?(b=a.ue_furl.split("."))&&b[0]&&a.ue.tag(b[0]):a.ue.tag("nofls"))})(ue_csm);
(function(g,h){function d(a,d){var b={};if(!e||!f)try{var c=h.sessionStorage;c?a&&("undefined"!==typeof d?c.setItem(a,d):b.val=c.getItem(a)):f=1}catch(g){e=1}e&&(b.e=1);return b}var b=g.ue||{},a="",f,e,c,a=d("csmtid");f?a="NA":a.e?a="ET":(a=a.val,a||(a=b.oid||"NI",d("csmtid",a)),c=d(b.oid),c.e||(c.val=c.val||0,d(b.oid,c.val+1)),b.ssw=d);b.tabid=a})(ue_csm,window);
ue_csm.ue.exec(function(e,f){var a=e.ue||{},b=a._wlo,d;if(a.ssw){d=a.ssw("CSM_previousURL").val;var c=f.location,b=b?b:c&&c.href?c.href.split("#")[0]:void 0;c=(b||"")===a.ssw("CSM_previousURL").val;!c&&b&&a.ssw("CSM_previousURL",b);d=c?"reload":d?"intrapage-transition":"first-view"}else d="unknown";a._nt=d},"NavTypeModule")(ue_csm,window);
(function(b,c){var a=c.images;a&&a.length&&b.ue.count("totalImages",a.length)})(ue_csm,document);
(function(b){function c(){var d=[];a.log&&a.log.isStub&&a.log.replay(function(a){e(d,a)});a.clog&&a.clog.isStub&&a.clog.replay(function(a){e(d,a)});d.length&&(a._flhs+=1,n(d),p(d))}function g(){a.log&&a.log.isStub&&(a.onflush&&a.onflush.replay&&a.onflush.replay(function(a){a[0]()}),a.onunload&&a.onunload.replay&&a.onunload.replay(function(a){a[0]()}),c())}function e(d,b){var c=b[1],f=b[0],e={};a._lpn[c]=(a._lpn[c]||0)+1;e[c]=f;d.push(e)}function n(b){q&&(a._lpn.csm=(a._lpn.csm||0)+1,b.push({csm:{k:"chk",
f:a._flhs,l:a._lpn,s:"inln"}}))}function p(a){if(h)a=k(a),b.navigator.sendBeacon(l,a);else{a=k(a);var c=new b[f];c.open("POST",l,!0);c.setRequestHeader&&c.setRequestHeader("Content-type","text/plain");c.send(a)}}function k(a){return JSON.stringify({rid:b.ue_id,sid:b.ue_sid,mid:b.ue_mid,mkt:b.ue_mkt,sn:b.ue_sn,reqs:a})}var f="XMLHttpRequest",q=1===b.ue_ddq,a=b.ue,r=b[f]&&"withCredentials"in new b[f],h=b.navigator&&b.navigator.sendBeacon,l="//"+b.ue_furl+"/1/batch/1/OE/",m=b.ue_fci_ft||5E3;a&&(r||h)&&
(a._flhs=a._flhs||0,a._lpn=a._lpn||{},a.attach&&(a.attach("beforeunload",g),a.attach("pagehide",g)),m&&b.setTimeout(c,m),a._ffci=c)})(window);
ue_csm.ue._rtn = 1;
(function(e,f){function h(a){a=a.split("?")[0]||a;a=a.replace("http://","").replace("https://","").replace("resource://","").replace("res://","").replace("undefined://","").replace("chrome://","").replace(/\*/g,"").replace(/!/g,"").replace(/~/g,"");var b=a.split("/");a=a.substr(a.lastIndexOf("/")+1);b.splice(-1);b=b.map(function(a){c[a]||(c[a]=(k++).toString(36));return c[a]});b.push(a);return b.join("!")}function l(){return f.getEntriesByType("resource").filter(function(a){return d._rre(a)<d._ld}).sort(function(a,
b){return a.responseEnd-b.responseEnd}).splice(0,m).map(function(a){var b=[],c;for(c in a)g[c]&&a[c]&&b.push(g[c]+Math.max(a[c]|0,-1).toString(36));b.push("i"+a.initiatorType);(1==d._rtn&&d._afjs>n||2==d._rtn)&&b.push("n"+h(a.name));return b.join("_")}).join("*")}function p(){var a="pm",b;for(b in c)c.hasOwnProperty(b)&&(a+="*"+c[b]+"_"+b);return a}function q(){d.log({k:"rtiming",value:l()+"~"+p()},"csm")}if(f&&f.getEntriesByType&&Array.prototype.map&&Array.prototype.filter&&e.ue&&e.ue.log){var g=
{connectStart:"c",connectEnd:"C",domainLookupStart:"d",domainLookupEnd:"D",duration:"z",encodedBodySize:"e",decodedBodySize:"E",fetchStart:"f",redirectStart:"r",redirectEnd:"R",requestStart:"q",responseStart:"s",responseEnd:"S",startTime:"a",transferSize:"t"},d=e.ue,c={},k=1,n=20,m=200;d&&d._rre&&(d._art=function(){d._ld&&window.setTimeout(q,0)})}})(ue_csm||{},window.performance);
(function(c,d){var b=c.ue,a=d.navigator;b&&b.tag&&a&&(a=a.connection||a.mozConnection||a.webkitConnection)&&a.type&&b.tag("netInfo:"+a.type)})(ue_csm,window);
(function(c,d){function h(a,b){for(var c=[],d=0;d<a.length;d++){var e=a[d],f=b.encode(e);if(e[k]){var g=b.metaSep,e=e[k],l=b.metaPairSep,h=[],m=void 0;for(m in e)e.hasOwnProperty(m)&&h.push(m+"="+e[m]);e=h.join(l);f+=g+e}c.push(f)}return c.join(b.resourceSep)}function s(a){var b=a[k]=a[k]||{};b[t]||(b[t]=c.ue_mid);b[u]||(b[u]=c.ue_sid);b[f]||(b[f]=c.ue_id);b.csm=1;a="//"+c.ue_furl+"/1/"+a[v]+"/1/OP/"+a[w]+"/"+a[x]+"/"+h([a],y);if(n)try{n.call(d[p],a)}catch(g){c.ue.sbf=1,(new Image).src=a}else(new Image).src=
a}function q(){g&&g.isStub&&g.replay(function(a,b,c){a=a[0];b=a[k]=a[k]||{};b[f]=b[f]||c;s(a)});l.impression=s;g=null}if(!(1<c.ueinit)){var k="metadata",x="impressionType",v="foresterChannel",w="programGroup",t="marketplaceId",u="session",f="requestId",p="navigator",l=c.ue||{},n=d[p]&&d[p].sendBeacon,r=function(a,b,c,d){return{encode:d,resourceSep:a,metaSep:b,metaPairSep:c}},y=r("","?","&",function(a){return h(a.impressionData,z)}),z=r("/",":",",",function(a){return a.featureName+":"+h(a.resources,
A)}),A=r(",","@","|",function(a){return a.id}),g=l.impression;n?q():(l.attach("load",q),l.attach("beforeunload",q));try{d.P&&d.P.register&&d.P.register("impression-client",function(){})}catch(B){c.ueLogError(B,{logLevel:"WARN"})}}})(ue_csm,window);
var ue_pty = "DetailAW";
var ue_spty = "Glance";
var ue_pti = "193435659X";
var ue_adb = 4;
var ue_adb_rtla = 1;
ue_csm.ue.exec(function(w,a){function q(){if(d&&f){var a;a:{try{a=d.getItem(g);break a}catch(c){}a=void 0}if(a)return b=a,!0}return!1}function r(){b=h;k();if(f)try{d.setItem(g,b)}catch(a){}}function s(){b=1===a.ue_adb_chk?l:h;k();if(f)try{d.setItem(g,b)}catch(c){}}function m(){a.ue_adb_rtla&&c&&0<c.ec&&!1===n&&(c.elh=null,ueLogError({m:"Hit Info",fromOnError:1},{logLevel:"INFO",adb:b}),n=!0)}function k(){e.tag(b);e.isl&&a.uex&&uex("at",b);p&&p.updateCsmHit("adb",b);c&&0<c.ec?m():a.ue_adb_rtla&&c&&
(c.elh=m)}function t(){return b}if(a.ue_adb){var e=a.ue,h="adblk_yes",l="adblk_no",b="adblk_unk",d;a:{try{d=a.localStorage;break a}catch(x){}d=void 0}var g="csm:adb",c=a.ue_err,p=e.cookie,f=void 0!==a.localStorage,u=0.98<Math.random(),n=!1,v=q();u||!v?e.uels("https://m.media-amazon.com/images/G/01/csm/showads.v2.js",{onerror:r,onload:s}):k();a.ue_isAdb=t;a.ue_isAdb.unk="adblk_unk";a.ue_isAdb.no=l;a.ue_isAdb.yes=h}},"adb")(document,window);
(function(a,b){a.ue_cel||(a.ue_cel=function(){function k(a,c){c?c.r=v:c={r:v,c:1};c.clog&&h.clog?h.clog(a,c.ns||e,c):c.glog&&h.glog?h.glog(a,c.ns||e,c):h.log(a,c.ns||e,c)}function m(){var a=d.length;if(0<a){for(var c=[],b=0;b<a;b++){var g=d[b].api;g.ready()?(g.on({ts:h.d,ns:e}),f.push(d[b]),k({k:"mso",n:d[b].name,t:h.d()})):c.push(d[b])}d=c}}function g(){if(!g.executed){for(var a=0;a<f.length;a++)f[a].api.off&&f[a].api.off({ts:h.d,ns:e});q();k({k:"eod",t0:h.t0,t:h.d()},{c:1,il:1});g.executed=1;for(a=
0;a<f.length;a++)d.push(f[a]);f=[];clearTimeout(w);clearTimeout(r)}}function q(a){k({k:"hrt",t:h.d()},{c:1,il:1,n:a});B=Math.min(c,u*B);x()}function x(){clearTimeout(r);r=setTimeout(function(){q(!0)},B)}function t(){g.executed||q()}var u=1.5,c=b.ue_cel_max_hrt||3E4,d=[],f=[],e=a.ue_cel_ns||"cel",w,r,h=a.ue,n=a.uet,s=a.uex,v=h.rid,B=b.ue_cel_hrt_int||3E3,p=function(){var a=b.performance,c=h.ssw&&h.ssw(h.oid)||{},c="undefined"===typeof c.val||"1"!==c.val;return a&&a.navigation&&2===a.navigation.type&&
c}(),l=b.requestAnimationFrame||function(a){a()};if(p)k({k:"bft",t:h.d()});else{"function"==typeof n&&n("bb","csmCELLSframework",{wb:1});setTimeout(m,0);h.onunload(g);if(h.onflush)h.onflush(t);w=setTimeout(g,6E5);x();"function"==typeof s&&s("ld","csmCELLSframework",{wb:1});return{registerModule:function(a,c){d.push({name:a,api:c});k({k:"mrg",n:a,t:h.d()});m()},reset:function(a){k({k:"rst",t0:h.t0,t:h.d()});d=d.concat(f);f=[];for(var c=d.length,b=0;b<c;b++)d[b].api.off(),d[b].api.reset();v=a||h.rid;
m();clearTimeout(w);w=setTimeout(g,6E5);g.executed=0},timeout:function(a,c){return b.setTimeout(function(){l(function(){g.executed||a()})},c)},log:k,off:g}}}())})(ue_csm,window);
(function(a,b,k){a.ue_pdm||!a.ue_cel||ue.isBF||(a.ue_pdm=function(){function m(){var c={w:e.width,aw:e.availWidth,h:e.height,ah:e.availHeight,cd:e.colorDepth,pd:e.pixelDepth},b=k.body||{},d=k.documentElement||{},b={w:Math.max(b.scrollWidth||0,b.offsetWidth||0,d.clientWidth||0,d.scrollWidth||0,d.offsetWidth||0),h:Math.max(b.scrollHeight||0,b.offsetHeight||0,d.clientHeight||0,d.scrollHeight||0,d.offsetHeight||0)};n&&n.w==c.w&&n.h==c.h&&n.aw==c.aw&&n.ah==c.ah&&n.pd==c.pd&&n.cd==c.cd||(n=c,n.t=r(),n.k=
"sci",l(n));s&&s.w==b.w&&s.h==b.h||(s=b,s.t=r(),s.k="doi",l(s));w=a.ue_cel.timeout(m,h);B+=1}function g(){c("ebl","default",!1)}function q(){c("efo","default",!0)}function x(){c("ebl","app",!1)}function t(){c("efo","app",!0)}function u(){b.setTimeout(function(){k[J]?c("ebl","pageviz",!1):c("efo","pageviz",!0)},0)}function c(a,c,b){v!==b&&l({k:a,t:r(),s:c},{ff:!0===b?0:1});v=b}function d(){p.attach&&(y&&p.attach(D,u,k),C&&P.when("mash").execute(function(a){a&&a.addEventListener&&(a.addEventListener("appPause",
x),a.addEventListener("appResume",t))}),p.attach("blur",g,b),p.attach("focus",q,b))}function f(){p.detach&&(y&&p.detach(D,u,k),C&&P.when("mash").execute(function(a){a&&a.removeEventListener&&(a.removeEventListener("appPause",x),a.removeEventListener("appResume",t))}),p.detach("blur",g,b),p.detach("focus",q,b))}var e,w,r,h,n,s,v=null,B=0,p=a.ue,l=a.ue_cel.log,A=a.uet,z=a.uex,y=!!p.pageViz,D=y&&p.pageViz.event,J=y&&p.pageViz.propHid,C=b.P&&b.P.when;"function"==typeof A&&A("bb","csmCELLSpdm",{wb:1});
return{on:function(a){h=a.timespan||500;r=a.ts;e=b.screen;d();a=b.location;l({k:"pmd",o:a.origin,p:a.pathname,t:r()});m();"function"==typeof z&&z("ld","csmCELLSpdm",{wb:1})},off:function(a){clearTimeout(w);f();p.count&&p.count("cel.PDM.TotalExecutions",B)},ready:function(){return k.body&&a.ue_cel&&a.ue_cel.log},reset:function(){n=s=null}}}(),a.ue_cel&&a.ue_cel.registerModule("page module",a.ue_pdm))})(ue_csm,window,document);
(function(a,b){a.ue_vpm||!a.ue_cel||ue.isBF||(a.ue_vpm=function(){function k(){var a=t(),d={w:b.innerWidth,h:b.innerHeight,x:b.pageXOffset,y:b.pageYOffset};g&&g.w==d.w&&g.h==d.h&&g.x==d.x&&g.y==d.y||(d.t=a,d.k="vpi",g=d,f(g,{clog:1}));q=0;u=t()-a;c+=1}function m(){q||(q=a.ue_cel.timeout(k,x))}var g,q,x,t,u=0,c=0,d=a.ue,f=a.ue_cel.log,e=a.uet,w=a.uex,r=d.attach,h=d.detach;"function"==typeof e&&e("bb","csmCELLSvpm",{wb:1});return{on:function(a){t=a.ts;x=a.timespan||100;k();r&&(r("scroll",m),r("resize",
m));"function"==typeof w&&w("ld","csmCELLSvpm",{wb:1})},off:function(a){clearTimeout(q);h&&(h("scroll",m),h("resize",m));d.count&&(d.count("cel.VPI.TotalExecutions",c),d.count("cel.VPI.TotalExecutionTime",u),d.count("cel.VPI.AverageExecutionTime",u/c))},ready:function(){return a.ue_cel&&a.ue_cel.log},reset:function(){g=void 0},getVpi:function(){return g}}}(),a.ue_cel&&a.ue_cel.registerModule("viewport module",a.ue_vpm))})(ue_csm,window);
(function(a,b,k){if(!a.ue_fem&&a.ue_cel){var m=a.ue||{};!m.isBF&&!a.ue_fem&&k.querySelector&&b.getComputedStyle&&[].forEach&&(a.ue_fem=function(){function g(a,c){return a>c?3>a-c:3>c-a}function q(a,c){var d=b.pageXOffset,e=b.pageYOffset,f;a:{try{if(a){var h=a.getBoundingClientRect();f={x:h.left+d|0,y:h.top+e|0,w:h.width|0,h:h.height|0,d:(0===a.offsetWidth&&0===a.offsetHeight)|0}}else f=void 0;break a}catch(k){}f=void 0}if(f&&!a.cel_b)a.cel_b=f,p({n:a.cel_n,w:a.cel_b.w,h:a.cel_b.h,d:a.cel_b.d,x:a.cel_b.x,
y:a.cel_b.y,t:c,k:"ewi",cl:a.className},{clog:1});else{if(d=f)d=a.cel_b,e=f,d=e.d===d.d&&1===e.d?!1:!(g(d.x,e.x)&&g(d.y,e.y)&&g(d.w,e.w)&&g(d.h,e.h)&&d.d===e.d);d&&(a.cel_b=f,p({n:a.cel_n,w:a.cel_b.w,h:a.cel_b.h,d:a.cel_b.d,x:a.cel_b.x,y:a.cel_b.y,t:c,k:"ewi"},{clog:1}))}}function x(a,d){var b;b=a.c?k.getElementsByClassName(a.c):a.id?[k.getElementById(a.id)]:k.querySelectorAll(a.s);a.w=[];for(widgetIndex=0;widgetIndex<b.length;widgetIndex++){var e=b[widgetIndex];e&&(e.cel_n||(e.cel_n=e.getAttribute("cel_widget_id")||
(a.id_gen||B)(e,widgetIndex)||e.id),a.w.push(e),c(M,e,d))}}function t(a,c){l.contains(a)||p({n:a.cel_n,t:c,k:"ewd"},{clog:1})}function u(a){F.length&&ue_cel.timeout(function(){if(n){for(var c=N(),d=!1;N()-c<h&&!d;){for(d=O;0<d--&&0<F.length;){var b=F.shift();Q[b.type](b.elem,b.time)}d=0===F.length}R++;u(a)}},0)}function c(a,c,d){F.push({type:a,elem:c,time:d})}function d(a,d){for(var b=0;b<v.length;b++)for(var e=v[b].w||[],f=0;f<e.length;f++)c(a,e[f],d)}function f(){H||(H=a.ue_cel.timeout(function(){H=
null;var a=s();d(T,a);for(var b=0;b<v.length;b++)c(U,v[b],a);u(a)},r))}function e(){H||K||(K=a.ue_cel.timeout(function(){K=null;var a=s();d(M,a);u(a)},r))}function w(){return z&&y&&l&&l.contains&&l.getBoundingClientRect&&s}var r=50,h=4.5,n=!1,s,v=[],B=function(){},p=a.ue_cel.log,l,A,z,y,D=b.MutationObserver||b.WebKitMutationObserver||b.MozMutationObserver,J=!!D,C,E,L="DOMAttrModified",G="DOMNodeInserted",I="DOMNodeRemoved",K,H,F=[],R=0,O=null,T="removedWidget",U="updateWidgets",M="processWidget",
Q,S=b.performance||{},N=S.now&&function(){return S.now()}||function(){return Date.now()};"function"==typeof uet&&uet("bb","csmCELLSfem",{wb:1});return{on:function(c){function b(){if(w()){Q={removedWidget:t,updateWidgets:x,processWidget:q};if(J){var a={attributes:!0,subtree:!0};C=new D(e);E=new D(f);C.observe(l,a);E.observe(l,{childList:!0,subtree:!0});E.observe(A,a)}else z.call(l,L,e),z.call(l,G,f),z.call(l,I,f),z.call(A,G,e),z.call(A,I,e);f()}}l=k.body;A=k.head;z=l.addEventListener;y=l.removeEventListener;
s=c.ts;v=a.cel_widgets||[];O=c.bs||5;m.deffered?b():m.attach&&m.attach("load",b);"function"==typeof uex&&uex("ld","csmCELLSfem",{wb:1});n=!0},off:function(){w()&&(E&&(E.disconnect(),E=null),C&&(C.disconnect(),C=null),y.call(l,L,e),y.call(l,G,f),y.call(l,I,f),y.call(A,G,e),y.call(A,I,e));m.count&&m.count("cel.widgets.batchesProcessed",R);n=!1},ready:function(){return a.ue_cel&&a.ue_cel.log},reset:function(){v=a.cel_widgets||[]}}}(),a.ue_cel&&a.ue_fem&&a.ue_cel.registerModule("features module",a.ue_fem))}})(ue_csm,
window,document);
(function(a,b,k){a.ue_mcm||!a.ue_cel||a.ue.isBF||(a.ue_mcm=function(){function m(a){try{if(a.id)return"//*[@id='"+a.id+"']";var b,f=1,e;for(e=a.previousSibling;e;e=e.previousSibling)e.nodeName==a.nodeName&&(f+=1);b=f;var g=a.nodeName;1!=b&&(g+="["+b+"]");a.parentNode&&(g=m(a.parentNode)+"/"+g);return g}catch(k){return"DETACHED"}}function g(c,d){var f=c.srcElement||c.target||{},e={k:q,w:(d||{}).ow||(b.body||{}).scrollWidth,h:(d||{}).oh||(b.body||{}).scrollHeight,t:(d||{}).ots||x(),x:c.pageX,y:c.pageY,
p:m(f),n:f.nodeName};a.ue_cdt&&k&&"function"===typeof k.now&&c.timeStamp&&(e.dt=(d||{}).odt||k.now()-c.timeStamp,e.dt=parseFloat(e.dt.toFixed(2)));c.button&&(e.b=c.button);f.href&&(e.r=f.href);f.id&&(e.i=f.id);f.className&&f.className.split&&(e.c=f.className.split(/\s+/));u(e,{c:1})}var q="mcm",x,t=a.ue,u=a.ue_cel.log;return{on:function(c){x=c.ts;a.ue_cel_stub&&a.ue_cel_stub.replayModule(q,g);t.attach&&t.attach("click",g,b)},off:function(a){t.detach&&t.detach("click",g,b)},ready:function(){return a.ue_cel&&
a.ue_cel.log},reset:function(){}}}(),a.ue_cel&&a.ue_cel.registerModule("mouse click module",a.ue_mcm))})(ue_csm,document,window.performance);
ue_csm.ue_cmr = 1;
ue_csm.ue_unrt = 750;
(function(d,c,t){function p(a){try{if(a.id)return"//*[@id='"+a.id+"']";var d,c=1,g;for(g=a.previousSibling;g;g=g.previousSibling)g.nodeName===a.nodeName&&(c+=1);d=c;var b=a.nodeName;1!==d&&(b+="["+d+"]");a.parentNode&&(b=p(a.parentNode)+"/"+b);return b}catch(e){return"DETACHED"}}function u(a){l=!0;var f=h=d.ue.d(),k;d.ue_cdt&&m&&"function"===typeof m.now&&a.timeStamp&&(k=m.now()-a.timeStamp,k=parseFloat(k.toFixed(2)));q=c.setTimeout(function(){var c=k,b=a.srcElement||a.target||{},e={k:v,t:f,x:a.pageX,
y:a.pageY,p:p(b),n:b.nodeName};d.ue_cdt&&c&&(e.dt=c);a.button&&(e.b=a.button);b.type&&(e.ty=b.type);b.href&&(e.r=b.href);b.id&&(e.i=b.id);b.className&&b.className.split&&(e.c=b.className.split(/\s+/));d.ue.log(e,r)},w)}function x(a){n=!0;f=d.ue.d();l&&n&&(d.ue_cmr&&f&&h&&d.ue.log({k:y,t:h,m:Math.abs(f-h)},r),s(),n=!1,f=0)}function s(){l=!1;h=0;c.clearTimeout(q)}if(c.MutationObserver&&c.addEventListener&&d&&d.ue_unrt){var w=d.ue_unrt,r="cel",v="unr_mcm",y="res_mcm",m=c.performance,l=!1,h=0,q=0,n=!1,
f=0;c.addEventListener&&(c.addEventListener("mousedown",u,!0),c.addEventListener("beforeunload",s,!0));(new MutationObserver(x)).observe(t,{childList:!0,attributes:!0,characterData:!0,subtree:!0})}})(ue_csm,window,document);
ue_csm.ue.exec(function(g,f){f.ue_err=f.ue_err||{};var e="";f.ue_err.addContextInfo=function(a){if(!a.logLevel||"FATAL"===a.logLevel)if(e=g.getElementsByTagName("html")[0].innerHTML){var b=e.indexOf("var ue_t0=ue_t0||+new Date();");if(-1!=b){var b=e.substr(0,b).split("\n"),d=Math.max(b.length-5-1,0),b=b.slice(d,b.length-1);a.fcsmln=b.length+1;a.cinfo=a.cinfo||{};for(var c=0;c<b.length;c++)a.cinfo[d+c+1+""]=b[c]}b=e.split("\n");a.cinfo=a.cinfo||{};if(!(a.f||void 0===a.l||a.l in a.cinfo))for(c=+a.l-
1,d=Math.max(c-2,0),c=Math.min(c+2,b.length-1);d<=c;d++)a.cinfo[d+1+""]=b[d]}}},"fatals-context")(document,window);
ue_csm.ue.exec(function(c,a){function g(a){a.run(function(e){d.tag("csm-feature-"+a.name+":"+e);d.isl&&c.uex("at")})}if(a.addEventListener)for(var d=c.ue||{},f=[{name:"touch-enabled",run:function(b){var e=function(){a.removeEventListener("touchstart",c,!0);a.removeEventListener("mousemove",d,!0)},c=function(){b("true");e()},d=function(){b("false");e()};a.addEventListener("touchstart",c,!0);a.addEventListener("mousemove",d,!0)}}],b=0;b<f.length;b++)g(f[b])},"csm-features")(ue_csm,window);
ue_csm.ue.exec(function(c){var d=[];c=c.ue;c.attach("load",function(){for(var b=500,a=0;a<d.length;a++)"function"===typeof d[a].handler&&(b+=500,setTimeout(d[a].handler,b))});c.guardrails={register:function(b,a){d.push({name:b,handler:a})}}},"guardrails")(window);
/* ◬ */
</script>
</div>
<noscript>
&lt;img height="1" width="1" style='display:none;visibility:hidden;' src='//fls-na.amazon.com/1/batch/1/OP/ATVPDKIKX0DER:147-0816675-1753153:7F3MGDYTH1YH8KVBSFWJ$uedata=s:%2Fgp%2Fuedata%3Fnoscript%26id%3D7F3MGDYTH1YH8KVBSFWJ:0' alt=""/&gt;
</noscript>
</div>
<!-- _
.__(.)< (MEOW)
\___)
~~~~~~~~~~~~~~~~~~-->
<!-- sp:eh:nxKRlIdYKbZTu5lRgm/ao4BcGM7Iw8+IqddnyDkK9WYnLVVlyyAn6L00i1xB0PUnYJtgXqul4sBCr/DGwkCUzRPl+mhStGuy257u104z7Q8XEryL -->
</div><div id="a-white"></div><div id="vas-twister-loading" style="top: 225px; left: 0px; height: 736px; display: none;"><div id="vas-twister-spinner"></div></div><div id="a-popover-root" style="z-index:-1;position:absolute;"></div><script type="text/html" id="a9-suggestion-template"><div id='<#= suggestionId #>'class='suggest_row a9_suggestion'><div class='suggest_link2 isRTL' dir='auto'><span> <b><#= bprefix #></b><#= prefix #><b><#= suffix #></span></b></div></div></script><script type="text/html" id="suggestions-template"><div id='suggestions-template'><div id='suggestions2' class=''><# if (typeof suggestions !== 'undefined') { for(var i=0; i < suggestions.length; i++){ var displayString = suggestions[i].display; #><#= displayString #> <# } } #> </div> </div></script><script type="text/html" id="a9xc-suggestion-template"><div id='<#= suggestionId #>' class='suggest_row cross_category_suggestion'><div class='suggest_link isRTL' dir='auto'> <span> <#= bprefix #><b><#= prefix #></b><#= suffix #> </span><span class='suggestion_search_scope'><#= storeText #> </span></div><div class='suggest_delete suggest_builder'></div></div></script></body></html>