From f3893c2500dfe0580958428e8e417c1bc07bd3e5 Mon Sep 17 00:00:00 2001 From: "xiaozhe.ma" Date: Fri, 12 Jul 2024 19:17:06 +0900 Subject: [PATCH] =?UTF-8?q?Conflict=E8=A7=A3=E6=B1=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/Temp/alc_runtime.js | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/Temp/alc_runtime.js b/backend/Temp/alc_runtime.js index 0a38c0d..25e8eb9 100644 --- a/backend/Temp/alc_runtime.js +++ b/backend/Temp/alc_runtime.js @@ -97,4 +97,3 @@ var Bn=Object.defineProperty;var Vn=(n,e,t)=>e in n?Bn(n,e,{enumerable:!0,config
`;r.append(o)}Modal.getOrCreateInstance(t.get()[0]).show()});F(this,"showResult",(e,t)=>{const r=$(`#alcLookupModal .modal-body #app${e.id}`),o=`
${e.name}
更新件数:${t}件
`;r.html(o)});this.name="ルックアップ更新",this.actionProps=[],this.props={},this.register()}async process(e,t,r){this.actionProps=e.actionProps,this.props={...e.ActionValue,condition:JSON.parse(e.ActionValue.condition)};let o={canNext:!0,result:""};try{const s=this.props.lookupField.fields.filter(h=>h.lookup&&h.lookup.relatedApp.app===String(kintone.app.getId()));if(!s||s.length===0)throw new Error(`ルックアップの設定は不正です。${this.props.lookupField.fields[0].label} `);const l=this.props.lookupField.fields[0],f=t.record[l.lookup.relatedKeyField].value,g=await this.getUpdateRecords(l,f);if(g.length===0)return o;const d=this.convertForLookup(g,l,f);console.log("updateRecords",d),this.showSpinnerModel(this.props.lookupField.app),await this.updateLookupTarget(d),this.showResult(this.props.lookupField.app,d.length)}catch(s){console.error("ルックアップ更新中例外が発生しました。",s),s instanceof Error?t.error=s.message:t.error="ルックアップ更新中例外が発生しました。",o.canNext=!1}return console.log("autoLookupProps",this.props),o}register(){actionAddins[this.name]=this}}new AutoLookUpAction;class ActionProcess{constructor(e,t,r){F(this,"eventId");F(this,"flow");F(this,"event");F(this,"context");this.eventId=e,this.flow=t,this.event=r,this.context={record:this.event.record,variables:{}}}async exec(){const e=this.flow.getRoot();if(e===void 0||e.nextNodeIds.size===0)return;let t=e.nextNodeIds.get("");if(t===void 0)return;let r=this.flow.findNodeById(t),o={canNext:!0};for(;r!==void 0&&o.canNext;){const s=actionAddins[r.name];s!==void 0&&(o=await s.process(r,this.event,this.context));let l="";if(r.outputPoints&&r.outputPoints.length>1&&(l=o.result||""),t=r.nextNodeIds.get(l),t===void 0)return;r=this.flow.findNodeById(t)}}}class ActionProperty{constructor(e,t,r,o,s){F(this,"component");F(this,"props");this.component=e,this.props={name:t,displayName:r,placeholder:o,modelValue:s}}static defaultProperty(){return new ActionProperty("InputText","displayName","表示名","表示を入力してください","")}}class ActionNode{constructor({id:e,name:t,title:r,inputPoint:o,outputPoints:s,actionProps:l}){F(this,"id");F(this,"name");F(this,"inputPoint");F(this,"outputPoints");F(this,"actionProps");F(this,"prevNodeId");F(this,"nextNodeIds");this.id=e,this.name=t,this.inputPoint=o,this.outputPoints=s;const f=ActionProperty.defaultProperty();f.props.modelValue=r,this.actionProps=l,this.nextNodeIds=new Map}get title(){const e=this.actionProps.find(t=>t.props.name==="displayName");return e==null?void 0:e.props.modelValue}get subTitle(){return this.name}get isRoot(){return!1}get ActionValue(){const e={};return this.actionProps.forEach(t=>{e[t.props.name]=t.props.modelValue}),e}}class RootAction{constructor({id:e,name:t,title:r,subTitle:o}){F(this,"id");F(this,"name");F(this,"title");F(this,"subTitle");F(this,"inputPoint");F(this,"outputPoints");F(this,"isRoot");F(this,"actionProps");F(this,"ActionValue");F(this,"prevNodeId");F(this,"nextNodeIds");this.id=e,this.name=t,this.title=r,this.subTitle=o,this.inputPoint="",this.outputPoints=[],this.isRoot=!0,this.actionProps=[],this.ActionValue={},this.nextNodeIds=new Map}}class ActionFlow{constructor(e){F(this,"id");F(this,"actionNodes");e instanceof Array?this.actionNodes=e:this.actionNodes=[e],this.id=""}findNodeById(e){return this.actionNodes.find(t=>t.id===e)}toJSON(){return{id:this.id,actionNodes:this.actionNodes.map(e=>{const{nextNodeIds:t,...r}=e;return{...r,nextNodeIds:Array.from(t.entries())}})}}getRoot(){return this.actionNodes.find(e=>e.isRoot)}static fromJSON(e){const t=JSON.parse(e),r=t.actionNodes.map(s=>{const l=s.isRoot?new RootAction(s):new ActionNode(s);return l.nextNodeIds=new Map(Object.entries(s.nextNodeIds)),l.prevNodeId=s.prevNodeId,l.id=s.id,l}),o=new ActionFlow(r);return o.id=t.id,o}}$(function(){const n=f=>f.filter(g=>g.includes(".change.")),e=f=>f.filter(g=>g.includes(".customButtonClick.")),t=f=>f.filter(g=>!g.includes(".customButtonClick.")&&!g.includes(".change.")),r=Object.keys(alcflow),o=n(r),s=e(r),l=t(r);l.length>0&&kintone.events.on(l,async f=>{const g=alcflow[f.type],d=ActionFlow.fromJSON(g.content);return d!==void 0&&await new ActionProcess(f.type,d,f).exec(),f}),o.length>0&&kintone.events.on(o,f=>{const g=alcflow[f.type],d=ActionFlow.fromJSON(g.content);return d!==void 0&&new ActionProcess(f.type,d,f).exec(),f}),s.length>0&&s.forEach(f=>{$(document).on(f,async()=>{const g=kintone.app.record.get(),d=alcflow[f],h=ActionFlow.fromJSON(d.content);h!==void 0&&await new ActionProcess(f,h,g).exec();const y=g.record;kintone.app.record.set({record:y})})})}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxjX3J1bnRpbWUuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanMiLCIuLi9zcmMvYWN0aW9ucy9pbmRleC50cyIsIi4uL3NyYy9hY3Rpb25zL211c3QtaW5wdXQudHMiLCIuLi9zcmMvdXRpbC9mb3JtYXQudHMiLCIuLi9zcmMvYWN0aW9ucy9hdXRvLW51bWJlcmluZy50cyIsIi4uL3NyYy90eXBlcy9Db25kaXRpb25zLnRzIiwiLi4vc3JjL2FjdGlvbnMvZmllbGQtc2hvd24udHMiLCIuLi9zcmMvYWN0aW9ucy9lcnJvci1zaG93LnRzIiwiLi4vc3JjL2FjdGlvbnMvYnV0dG9uLWFkZC50cyIsIi4uL3NyYy9hY3Rpb25zL2NvbmRpdGlvbi1hY3Rpb24udHMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvcGxhdGZvcm0vaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvcGxhdGZvcm0vVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL21pbWUvTWltZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9taW1lL3R5cGVzL3N0YW5kYXJkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL21pbWUvbGl0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9wbGF0Zm9ybS9icm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL3VybC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9jbGllbnQvQmFzZUNsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9jbGllbnQvQnVsa1JlcXVlc3RDbGllbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvY2xpZW50L0FwcENsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9lcnJvci9LaW50b25lQWJvcnRTZWFyY2hFcnJvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9lcnJvci9LaW50b25lQWxsUmVjb3Jkc0Vycm9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2Vycm9yL0tpbnRvbmVSZXN0QVBJRXJyb3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvZXJyb3IvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvY2xpZW50L1JlY29yZENsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9jbGllbnQvU3BhY2VDbGllbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvZm9ybS1kYXRhL2xpYi9icm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2NsaWVudC9GaWxlQ2xpZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2F4aW9zL2Rpc3QvYnJvd3Nlci9heGlvcy5janMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvaHR0cC9BeGlvc0NsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9odHRwL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvZXZhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvcmFuZ2UuanMiLCIuLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3JlZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvc3ludGF4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy90eXBlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy91cmkuanMiLCIuLi9ub2RlX21vZHVsZXMvaGFzLXN5bWJvbHMvc2hhbXMuanMiLCIuLi9ub2RlX21vZHVsZXMvaGFzLXN5bWJvbHMvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvaGFzLXByb3RvL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW1wbGVtZW50YXRpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXNvd24vaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvZ2V0LWludHJpbnNpYy9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9lcy1kZWZpbmUtcHJvcGVydHkvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvZ29wZC9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9kZWZpbmUtZGF0YS1wcm9wZXJ0eS9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXMtcHJvcGVydHktZGVzY3JpcHRvcnMvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvc2V0LWZ1bmN0aW9uLWxlbmd0aC9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kL2NhbGxCb3VuZC5qcyIsIi4uL19fdml0ZS1icm93c2VyLWV4dGVybmFsIiwiLi4vbm9kZV9tb2R1bGVzL29iamVjdC1pbnNwZWN0L2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9xcy9saWIvZm9ybWF0cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9xcy9saWIvdXRpbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvcXMvbGliL3N0cmluZ2lmeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9xcy9saWIvcGFyc2UuanMiLCIuLi9ub2RlX21vZHVsZXMvcXMvbGliL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2pzLWJhc2U2NC9iYXNlNjQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL0tpbnRvbmVSZXNwb25zZUhhbmRsZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvS2ludG9uZVJlc3RBUElDbGllbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvaW5kZXguYnJvd3Nlci5qcyIsIi4uL3NyYy90eXBlcy9GaWVsZExheW91dC50cyIsIi4uL3NyYy91dGlsL2FnZ3JlZ2F0ZXMudHMiLCIuLi9zcmMvYWN0aW9ucy9kYXRhLXByb2Nlc3NpbmcudHMiLCIuLi9zcmMvYWN0aW9ucy9kYXRhLXVwZGF0ZS50cyIsIi4uL3NyYy9hY3Rpb25zL2N1cnJlbnQtZmllbGQtZ2V0LnRzIiwiLi4vc3JjL2FjdGlvbnMvcmVndWxhci1jaGVjay50cyIsIi4uL3NyYy9hY3Rpb25zL21haWwtY2hlY2sudHMiLCIuLi9zcmMvYWN0aW9ucy9jb3VudGVyLWNoZWNrLnRzIiwiLi4vc3JjL2FjdGlvbnMvZGF0ZXRpbWUtZ2V0dGVyLnRzIiwiLi4vc3JjL2FjdGlvbnMvaW5zZXJ0LXZhbHVlLnRzIiwiLi4vc3JjL2FjdGlvbnMvdmFsdWUtZ2V0dGVyLnRzIiwiLi4vc3JjL2FjdGlvbnMvc3RyaW5nLWpvaW4udHMiLCIuLi9zcmMvYWN0aW9ucy92YWxpZGF0aW9uLWZ1bGx3aWR0aC50cyIsIi4uL3NyYy9hY3Rpb25zL3ZhbGlkYXRpb24taGFsZndpZHRoLnRzIiwiLi4vc3JjL2FjdGlvbnMvbG9naW4tdXNlci1nZXR0ZXIudHMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvZG9tL2RhdGEuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvZGlzdC9kb20vZXZlbnQtaGFuZGxlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvZGlzdC9kb20vbWFuaXB1bGF0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9jb25maWcuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvYmFzZS1jb21wb25lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvZG9tL3NlbGVjdG9yLWVuZ2luZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvZGlzdC91dGlsL2JhY2tkcm9wLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcyIsIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvZGlzdC91dGlsL2ZvY3VzdHJhcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvZGlzdC91dGlsL3Njcm9sbGJhci5qcyIsIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvZGlzdC9tb2RhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZW51bXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXROb2RlTmFtZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2luc3RhbmNlT2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcHBseVN0eWxlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWF0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdXNlckFnZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNMYXlvdXRWaWV3cG9ydC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1RhYmxlRWxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFBhcmVudE5vZGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvd2l0aGluLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldFZhcmlhdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFZpZXdwb3J0UmVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50UmVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzU2Nyb2xsUGFyZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0U2Nyb2xsUGFyZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvaGlkZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL29mZnNldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEFsdEF4aXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVTY3JvbGwuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9vcmRlck1vZGlmaWVycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGVib3VuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlQnlOYW1lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9jcmVhdGVQb3BwZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3BvcHBlci1saXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9wb3BwZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2Rpc3QvanMvYm9vdHN0cmFwLmVzbS5qcyIsIi4uL3NyYy9hY3Rpb25zL2F1dG8tbG9va3VwLnRzIiwiLi4vc3JjL3R5cGVzL2FjdGlvbi1wcm9jZXNzLnRzIiwiLi4vc3JjL3R5cGVzL0FjdGlvblR5cGVzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My43LjFcbiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMjMtMDgtMjhUMTM6MzdaXG4gKi9cbiggZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblxuXHRpZiAoIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YFxuXHRcdC8vIGlzIHByZXNlbnQsIGV4ZWN1dGUgdGhlIGZhY3RvcnkgYW5kIGdldCBqUXVlcnkuXG5cdFx0Ly8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBoYXZlIGEgYHdpbmRvd2Agd2l0aCBhIGBkb2N1bWVudGBcblx0XHQvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy5cblx0XHQvLyBUaGlzIGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0aGUgY3JlYXRpb24gb2YgYSByZWFsIGB3aW5kb3dgLlxuXHRcdC8vIGUuZy4gdmFyIGpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIikod2luZG93KTtcblx0XHQvLyBTZWUgdGlja2V0IHRyYWMtMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0gKSggdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjFcbi8vIHRocm93IGV4Y2VwdGlvbnMgd2hlbiBub24tc3RyaWN0IGNvZGUgKGUuZy4sIEFTUC5ORVQgNC41KSBhY2Nlc3NlcyBzdHJpY3QgbW9kZVxuLy8gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgKHRyYWMtMTMzMzUpLiBCdXQgYXMgb2YgalF1ZXJ5IDMuMCAoMjAxNiksIHN0cmljdCBtb2RlIHNob3VsZCBiZSBjb21tb25cbi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLlxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnIgPSBbXTtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuXG52YXIgc2xpY2UgPSBhcnIuc2xpY2U7XG5cbnZhciBmbGF0ID0gYXJyLmZsYXQgPyBmdW5jdGlvbiggYXJyYXkgKSB7XG5cdHJldHVybiBhcnIuZmxhdC5jYWxsKCBhcnJheSApO1xufSA6IGZ1bmN0aW9uKCBhcnJheSApIHtcblx0cmV0dXJuIGFyci5jb25jYXQuYXBwbHkoIFtdLCBhcnJheSApO1xufTtcblxuXG52YXIgcHVzaCA9IGFyci5wdXNoO1xuXG52YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mO1xuXG52YXIgY2xhc3MydHlwZSA9IHt9O1xuXG52YXIgdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xuXG52YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGZuVG9TdHJpbmcgPSBoYXNPd24udG9TdHJpbmc7XG5cbnZhciBPYmplY3RGdW5jdGlvblN0cmluZyA9IGZuVG9TdHJpbmcuY2FsbCggT2JqZWN0ICk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gaXNGdW5jdGlvbiggb2JqICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9NTcsIEZpcmVmb3ggPD01MlxuXHRcdC8vIEluIHNvbWUgYnJvd3NlcnMsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50c1xuXHRcdC8vIChpLmUuLCBgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib2JqZWN0XCIgKSA9PT0gXCJmdW5jdGlvblwiYCkuXG5cdFx0Ly8gV2UgZG9uJ3Qgd2FudCB0byBjbGFzc2lmeSAqYW55KiBET00gbm9kZSBhcyBhIGZ1bmN0aW9uLlxuXHRcdC8vIFN1cHBvcnQ6IFF0V2ViIDw9My44LjUsIFdlYktpdCA8PTUzNC4zNCwgd2todG1sdG9wZGYgdG9vbCA8PTAuMTIuNVxuXHRcdC8vIFBsdXMgZm9yIG9sZCBXZWJLaXQsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCBjb2xsZWN0aW9uc1xuXHRcdC8vIChlLmcuLCBgdHlwZW9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZGl2XCIpID09PSBcImZ1bmN0aW9uXCJgKS4gKGdoLTQ3NTYpXG5cdFx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2Ygb2JqLm5vZGVUeXBlICE9PSBcIm51bWJlclwiICYmXG5cdFx0XHR0eXBlb2Ygb2JqLml0ZW0gIT09IFwiZnVuY3Rpb25cIjtcblx0fTtcblxuXG52YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH07XG5cblxudmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG5cblxuXHR2YXIgcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyA9IHtcblx0XHR0eXBlOiB0cnVlLFxuXHRcdHNyYzogdHJ1ZSxcblx0XHRub25jZTogdHJ1ZSxcblx0XHRub01vZHVsZTogdHJ1ZVxuXHR9O1xuXG5cdGZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIG5vZGUsIGRvYyApIHtcblx0XHRkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7XG5cblx0XHR2YXIgaSwgdmFsLFxuXHRcdFx0c2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIFwic2NyaXB0XCIgKTtcblxuXHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRpZiAoIG5vZGUgKSB7XG5cdFx0XHRmb3IgKCBpIGluIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA2NCssIEVkZ2UgMTgrXG5cdFx0XHRcdC8vIFNvbWUgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgXCJub25jZVwiIHByb3BlcnR5IG9uIHNjcmlwdHMuXG5cdFx0XHRcdC8vIE9uIHRoZSBvdGhlciBoYW5kLCBqdXN0IHVzaW5nIGBnZXRBdHRyaWJ1dGVgIGlzIG5vdCBlbm91Z2ggYXNcblx0XHRcdFx0Ly8gdGhlIGBub25jZWAgYXR0cmlidXRlIGlzIHJlc2V0IHRvIGFuIGVtcHR5IHN0cmluZyB3aGVuZXZlciBpdFxuXHRcdFx0XHQvLyBiZWNvbWVzIGJyb3dzaW5nLWNvbnRleHQgY29ubmVjdGVkLlxuXHRcdFx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9odG1sL2lzc3Vlcy8yMzY5XG5cdFx0XHRcdC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNub25jZS1hdHRyaWJ1dGVzXG5cdFx0XHRcdC8vIFRoZSBgbm9kZS5nZXRBdHRyaWJ1dGVgIGNoZWNrIHdhcyBhZGRlZCBmb3IgdGhlIHNha2Ugb2Zcblx0XHRcdFx0Ly8gYGpRdWVyeS5nbG9iYWxFdmFsYCBzbyB0aGF0IGl0IGNhbiBmYWtlIGEgbm9uY2UtY29udGFpbmluZyBub2RlXG5cdFx0XHRcdC8vIHZpYSBhbiBvYmplY3QuXG5cdFx0XHRcdHZhbCA9IG5vZGVbIGkgXSB8fCBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSggaSApO1xuXHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKCBpLCB2YWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRkb2MuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdH1cblxuXG5mdW5jdGlvbiB0b1R5cGUoIG9iaiApIHtcblx0aWYgKCBvYmogPT0gbnVsbCApIHtcblx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD0yLjMgb25seSAoZnVuY3Rpb25pc2ggUmVnRXhwKVxuXHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdGNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwoIG9iaiApIF0gfHwgXCJvYmplY3RcIiA6XG5cdFx0dHlwZW9mIG9iajtcbn1cbi8qIGdsb2JhbCBTeW1ib2wgKi9cbi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsXG4vLyB1bmd1YXJkZWQgaW4gYW5vdGhlciBwbGFjZSwgaXQgc2VlbXMgc2FmZXIgdG8gZGVmaW5lIGdsb2JhbCBvbmx5IGZvciB0aGlzIG1vZHVsZVxuXG5cblxudmFyIHZlcnNpb24gPSBcIjMuNy4xXCIsXG5cblx0cmh0bWxTdWZmaXggPSAvSFRNTCQvaSxcblxuXHQvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeVxuXHRqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cblx0XHQvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCdcblx0XHQvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKVxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7XG5cdH07XG5cbmpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7XG5cblx0Ly8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZFxuXHRqcXVlcnk6IHZlcnNpb24sXG5cblx0Y29uc3RydWN0b3I6IGpRdWVyeSxcblxuXHQvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDBcblx0bGVuZ3RoOiAwLFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUlxuXHQvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheVxuXHRnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7XG5cblx0XHQvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBpbiBhIGNsZWFuIGFycmF5XG5cdFx0aWYgKCBudW0gPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldFxuXHRcdHJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdO1xuXHR9LFxuXG5cdC8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2tcblx0Ly8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpXG5cdHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkge1xuXG5cdFx0Ly8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXRcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7XG5cblx0XHQvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKVxuXHRcdHJldC5wcmV2T2JqZWN0ID0gdGhpcztcblxuXHRcdC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LlxuXHRlYWNoOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjayApO1xuXHR9LFxuXG5cdG1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdHNsaWNlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApO1xuXHR9LFxuXG5cdGZpcnN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggMCApO1xuXHR9LFxuXG5cdGxhc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAtMSApO1xuXHR9LFxuXG5cdGV2ZW46IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LmdyZXAoIHRoaXMsIGZ1bmN0aW9uKCBfZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiAoIGkgKyAxICkgJSAyO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdG9kZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkuZ3JlcCggdGhpcywgZnVuY3Rpb24oIF9lbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGkgJSAyO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdGVxOiBmdW5jdGlvbiggaSApIHtcblx0XHR2YXIgbGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRqID0gK2kgKyAoIGkgPCAwID8gbGVuIDogMCApO1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggaiA+PSAwICYmIGogPCBsZW4gPyBbIHRoaXNbIGogXSBdIDogW10gKTtcblx0fSxcblxuXHRlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpO1xuXHR9LFxuXG5cdC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cblx0Ly8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuXG5cdHB1c2g6IHB1c2gsXG5cdHNvcnQ6IGFyci5zb3J0LFxuXHRzcGxpY2U6IGFyci5zcGxpY2Vcbn07XG5cbmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG5cdHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSxcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSxcblx0XHRpID0gMSxcblx0XHRsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuXHRcdGRlZXAgPSBmYWxzZTtcblxuXHQvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uXG5cdGlmICggdHlwZW9mIHRhcmdldCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0ZGVlcCA9IHRhcmdldDtcblxuXHRcdC8vIFNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIGkgXSB8fCB7fTtcblx0XHRpKys7XG5cdH1cblxuXHQvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSlcblx0aWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSBcIm9iamVjdFwiICYmICFpc0Z1bmN0aW9uKCB0YXJnZXQgKSApIHtcblx0XHR0YXJnZXQgPSB7fTtcblx0fVxuXG5cdC8vIEV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZFxuXHRpZiAoIGkgPT09IGxlbmd0aCApIHtcblx0XHR0YXJnZXQgPSB0aGlzO1xuXHRcdGktLTtcblx0fVxuXG5cdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXG5cdFx0Ly8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlc1xuXHRcdGlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkge1xuXG5cdFx0XHQvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG5cdFx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRcdGNvcHkgPSBvcHRpb25zWyBuYW1lIF07XG5cblx0XHRcdFx0Ly8gUHJldmVudCBPYmplY3QucHJvdG90eXBlIHBvbGx1dGlvblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggbmFtZSA9PT0gXCJfX3Byb3RvX19cIiB8fCB0YXJnZXQgPT09IGNvcHkgKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0aWYgKCBkZWVwICYmIGNvcHkgJiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29weSApIHx8XG5cdFx0XHRcdFx0KCBjb3B5SXNBcnJheSA9IEFycmF5LmlzQXJyYXkoIGNvcHkgKSApICkgKSB7XG5cdFx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XG5cblx0XHRcdFx0XHQvLyBFbnN1cmUgcHJvcGVyIHR5cGUgZm9yIHRoZSBzb3VyY2UgdmFsdWVcblx0XHRcdFx0XHRpZiAoIGNvcHlJc0FycmF5ICYmICFBcnJheS5pc0FycmF5KCBzcmMgKSApIHtcblx0XHRcdFx0XHRcdGNsb25lID0gW107XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggIWNvcHlJc0FycmF5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggc3JjICkgKSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHt9O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIHByb3RvLCBDdG9yO1xuXG5cdFx0Ly8gRGV0ZWN0IG9idmlvdXMgbmVnYXRpdmVzXG5cdFx0Ly8gVXNlIHRvU3RyaW5nIGluc3RlYWQgb2YgalF1ZXJ5LnR5cGUgdG8gY2F0Y2ggaG9zdCBvYmplY3RzXG5cdFx0aWYgKCAhb2JqIHx8IHRvU3RyaW5nLmNhbGwoIG9iaiApICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHByb3RvID0gZ2V0UHJvdG8oIG9iaiApO1xuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIG5vIHByb3RvdHlwZSAoZS5nLiwgYE9iamVjdC5jcmVhdGUoIG51bGwgKWApIGFyZSBwbGFpblxuXHRcdGlmICggIXByb3RvICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb25cblx0XHRDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCBcImNvbnN0cnVjdG9yXCIgKSAmJiBwcm90by5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBmblRvU3RyaW5nLmNhbGwoIEN0b3IgKSA9PT0gT2JqZWN0RnVuY3Rpb25TdHJpbmc7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgbmFtZTtcblxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBwcm92aWRlZCBjb250ZXh0OyBmYWxscyBiYWNrIHRvIHRoZSBnbG9iYWwgb25lXG5cdC8vIGlmIG5vdCBzcGVjaWZpZWQuXG5cdGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlLCBvcHRpb25zLCBkb2MgKSB7XG5cdFx0RE9NRXZhbCggY29kZSwgeyBub25jZTogb3B0aW9ucyAmJiBvcHRpb25zLm5vbmNlIH0sIGRvYyApO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblxuXHQvLyBSZXRyaWV2ZSB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXNcblx0dGV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5vZGUsXG5cdFx0XHRyZXQgPSBcIlwiLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHRpZiAoICFub2RlVHlwZSApIHtcblxuXHRcdFx0Ly8gSWYgbm8gbm9kZVR5cGUsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXlcblx0XHRcdHdoaWxlICggKCBub2RlID0gZWxlbVsgaSsrIF0gKSApIHtcblxuXHRcdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0XHRyZXQgKz0galF1ZXJ5LnRleHQoIG5vZGUgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS50ZXh0Q29udGVudDtcblx0XHR9XG5cdFx0aWYgKCBub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRvY3VtZW50RWxlbWVudC50ZXh0Q29udGVudDtcblx0XHR9XG5cdFx0aWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVWYWx1ZTtcblx0XHR9XG5cblx0XHQvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXNcblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7XG5cdFx0dmFyIHJldCA9IHJlc3VsdHMgfHwgW107XG5cblx0XHRpZiAoIGFyciAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBpc0FycmF5TGlrZSggT2JqZWN0KCBhcnIgKSApICkge1xuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHJldCxcblx0XHRcdFx0XHR0eXBlb2YgYXJyID09PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdGlzWE1MRG9jOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZXNwYWNlID0gZWxlbSAmJiBlbGVtLm5hbWVzcGFjZVVSSSxcblx0XHRcdGRvY0VsZW0gPSBlbGVtICYmICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKS5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHQvLyBBc3N1bWUgSFRNTCB3aGVuIGRvY3VtZW50RWxlbWVudCBkb2Vzbid0IHlldCBleGlzdCwgc3VjaCBhcyBpbnNpZGVcblx0XHQvLyBkb2N1bWVudCBmcmFnbWVudHMuXG5cdFx0cmV0dXJuICFyaHRtbFN1ZmZpeC50ZXN0KCBuYW1lc3BhY2UgfHwgZG9jRWxlbSAmJiBkb2NFbGVtLm5vZGVOYW1lIHx8IFwiSFRNTFwiICk7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0bWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkge1xuXHRcdHZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCxcblx0XHRcdGogPSAwLFxuXHRcdFx0aSA9IGZpcnN0Lmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07XG5cdFx0fVxuXG5cdFx0Zmlyc3QubGVuZ3RoID0gaTtcblxuXHRcdHJldHVybiBmaXJzdDtcblx0fSxcblxuXHRncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnZlcnQgKSB7XG5cdFx0dmFyIGNhbGxiYWNrSW52ZXJzZSxcblx0XHRcdG1hdGNoZXMgPSBbXSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoLFxuXHRcdFx0Y2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0O1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtc1xuXHRcdC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uXG5cdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRjYWxsYmFja0ludmVyc2UgPSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTtcblx0XHRcdGlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHtcblx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBlbGVtc1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH0sXG5cblx0Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgYXJnICkge1xuXHRcdHZhciBsZW5ndGgsIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRyZXQgPSBbXTtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpciBuZXcgdmFsdWVzXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggZWxlbXMgKSApIHtcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsXG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gZWxlbXMgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0XHRyZXR1cm4gZmxhdCggcmV0ICk7XG5cdH0sXG5cblx0Ly8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzXG5cdGd1aWQ6IDEsXG5cblx0Ly8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyXG5cdC8vIHByb3BlcnRpZXMgdG8gaXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuXG5cdHN1cHBvcnQ6IHN1cHBvcnRcbn0gKTtcblxuaWYgKCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cdGpRdWVyeS5mblsgU3ltYm9sLml0ZXJhdG9yIF0gPSBhcnJbIFN5bWJvbC5pdGVyYXRvciBdO1xufVxuXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcbmpRdWVyeS5lYWNoKCBcIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sXCIuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblx0XHRjbGFzczJ0eXBlWyBcIltvYmplY3QgXCIgKyBuYW1lICsgXCJdXCIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0fSApO1xuXG5mdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcilcblx0Ly8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1KVxuXHQvLyBoYXNPd24gaXNuJ3QgdXNlZCBoZXJlIGR1ZSB0byBmYWxzZSBuZWdhdGl2ZXNcblx0Ly8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRVxuXHR2YXIgbGVuZ3RoID0gISFvYmogJiYgXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCxcblx0XHR0eXBlID0gdG9UeXBlKCBvYmogKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIG9iaiApIHx8IGlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG5cblxuZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7XG5cblx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbn1cbnZhciBwb3AgPSBhcnIucG9wO1xuXG5cbnZhciBzb3J0ID0gYXJyLnNvcnQ7XG5cblxudmFyIHNwbGljZSA9IGFyci5zcGxpY2U7XG5cblxudmFyIHdoaXRlc3BhY2UgPSBcIltcXFxceDIwXFxcXHRcXFxcclxcXFxuXFxcXGZdXCI7XG5cblxudmFyIHJ0cmltQ1NTID0gbmV3IFJlZ0V4cChcblx0XCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIrfCgoPzpefFteXFxcXFxcXFxdKSg/OlxcXFxcXFxcLikqKVwiICsgd2hpdGVzcGFjZSArIFwiKyRcIixcblx0XCJnXCJcbik7XG5cblxuXG5cbi8vIE5vdGU6IGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcbmpRdWVyeS5jb250YWlucyA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHR2YXIgYnVwID0gYiAmJiBiLnBhcmVudE5vZGU7XG5cblx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErXG5cdFx0Ly8gSUUgZG9lc24ndCBoYXZlIGBjb250YWluc2Agb24gU1ZHLlxuXHRcdGEuY29udGFpbnMgP1xuXHRcdFx0YS5jb250YWlucyggYnVwICkgOlxuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2XG5cdCkgKTtcbn07XG5cblxuXG5cbi8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uXG4vLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXNcbnZhciByY3NzZXNjYXBlID0gLyhbXFwwLVxceDFmXFx4N2ZdfF4tP1xcZCl8Xi0kfFteXFx4ODAtXFx1RkZGRlxcdy1dL2c7XG5cbmZ1bmN0aW9uIGZjc3Nlc2NhcGUoIGNoLCBhc0NvZGVQb2ludCApIHtcblx0aWYgKCBhc0NvZGVQb2ludCApIHtcblxuXHRcdC8vIFUrMDAwMCBOVUxMIGJlY29tZXMgVStGRkZEIFJFUExBQ0VNRU5UIENIQVJBQ1RFUlxuXHRcdGlmICggY2ggPT09IFwiXFwwXCIgKSB7XG5cdFx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHNcblx0XHRyZXR1cm4gY2guc2xpY2UoIDAsIC0xICkgKyBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArIFwiIFwiO1xuXHR9XG5cblx0Ly8gT3RoZXIgcG90ZW50aWFsbHktc3BlY2lhbCBBU0NJSSBjaGFyYWN0ZXJzIGdldCBiYWNrc2xhc2gtZXNjYXBlZFxuXHRyZXR1cm4gXCJcXFxcXCIgKyBjaDtcbn1cblxualF1ZXJ5LmVzY2FwZVNlbGVjdG9yID0gZnVuY3Rpb24oIHNlbCApIHtcblx0cmV0dXJuICggc2VsICsgXCJcIiApLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcbn07XG5cblxuXG5cbnZhciBwcmVmZXJyZWREb2MgPSBkb2N1bWVudCxcblx0cHVzaE5hdGl2ZSA9IHB1c2g7XG5cbiggZnVuY3Rpb24oKSB7XG5cbnZhciBpLFxuXHRFeHByLFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblx0cHVzaCA9IHB1c2hOYXRpdmUsXG5cblx0Ly8gTG9jYWwgZG9jdW1lbnQgdmFyc1xuXHRkb2N1bWVudCxcblx0ZG9jdW1lbnRFbGVtZW50LFxuXHRkb2N1bWVudElzSFRNTCxcblx0cmJ1Z2d5UVNBLFxuXHRtYXRjaGVzLFxuXG5cdC8vIEluc3RhbmNlLXNwZWNpZmljIGRhdGFcblx0ZXhwYW5kbyA9IGpRdWVyeS5leHBhbmRvLFxuXHRkaXJydW5zID0gMCxcblx0ZG9uZSA9IDAsXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHR0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0Y29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdG5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHtcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gMDtcblx0fSxcblxuXHRib29sZWFucyA9IFwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfFwiICtcblx0XHRcImxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixcblxuXHQvLyBSZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1zeW50YXgtMy8jaWRlbnQtdG9rZW4tZGlhZ3JhbVxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXFtcXFxcZGEtZkEtRl17MSw2fVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XCI/fFxcXFxcXFxcW15cXFxcclxcXFxuXFxcXGZdfFtcXFxcdy1dfFteXFwwLVxcXFx4N2ZdKStcIixcblxuXHQvLyBBdHRyaWJ1dGUgc2VsZWN0b3JzOiBodHRwczovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgaWRlbnRpZmllciArIFwiKSg/OlwiICsgd2hpdGVzcGFjZSArXG5cblx0XHQvLyBPcGVyYXRvciAoY2FwdHVyZSAyKVxuXHRcdFwiKihbKl4kfCF+XT89KVwiICsgd2hpdGVzcGFjZSArXG5cblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgK1xuXHRcdHdoaXRlc3BhY2UgKyBcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXG5cdFx0Ly8gVG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIG5lZWRpbmcgdG9rZW5pemUgaW4gdGhlIHByZUZpbHRlciwgcHJlZmVyIGFyZ3VtZW50czpcblx0XHQvLyAxLiBxdW90ZWQgKGNhcHR1cmUgMzsgY2FwdHVyZSA0IG9yIGNhcHR1cmUgNSlcblx0XHRcIignKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCIpfFwiICtcblxuXHRcdC8vIDIuIHNpbXBsZSAoY2FwdHVyZSA2KVxuXHRcdFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiICsgYXR0cmlidXRlcyArIFwiKSopfFwiICtcblxuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXG5cdHJjb21tYSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKixcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRybGVhZGluZ0NvbWJpbmF0b3IgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooWz4rfl18XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgK1xuXHRcdHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyZGVzY2VuZCA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcInw+XCIgKSxcblxuXHRycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLFxuXHRyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgaWRlbnRpZmllciArIFwiJFwiICksXG5cblx0bWF0Y2hFeHByID0ge1xuXHRcdElEOiBuZXcgUmVnRXhwKCBcIl4jKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0Q0xBU1M6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0VEFHOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBpZGVudGlmaWVyICsgXCJ8WypdKVwiICksXG5cdFx0QVRUUjogbmV3IFJlZ0V4cCggXCJeXCIgKyBhdHRyaWJ1dGVzICksXG5cdFx0UFNFVURPOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRDSElMRDogbmV3IFJlZ0V4cChcblx0XHRcdFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArXG5cdFx0XHRcdHdoaXRlc3BhY2UgKyBcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiICsgd2hpdGVzcGFjZSArIFwiKig/OihbKy1dfClcIiArXG5cdFx0XHRcdHdoaXRlc3BhY2UgKyBcIiooXFxcXGQrKXwpKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfClcIiwgXCJpXCIgKSxcblx0XHRib29sOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXG5cdFx0Ly8gRm9yIHVzZSBpbiBsaWJyYXJpZXMgaW1wbGVtZW50aW5nIC5pcygpXG5cdFx0Ly8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGluZyBpbiBgc2VsZWN0YFxuXHRcdG5lZWRzQ29udGV4dDogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfCkoPz1bXi1dfCQpXCIsIFwiaVwiIClcblx0fSxcblxuXHRyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmhlYWRlciA9IC9eaFxcZCQvaSxcblxuXHQvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnNcblx0cnF1aWNrRXhwciA9IC9eKD86IyhbXFx3LV0rKXwoXFx3Kyl8XFwuKFtcXHctXSspKSQvLFxuXG5cdHJzaWJsaW5nID0gL1srfl0vLFxuXG5cdC8vIENTUyBlc2NhcGVzXG5cdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFxbXFxcXGRhLWZBLUZdezEsNn1cIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiP3xcXFxcXFxcXChbXlxcXFxyXFxcXG5cXFxcZl0pXCIsIFwiZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBlc2NhcGUsIG5vbkhleCApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZS5zbGljZSggMSApIC0gMHgxMDAwMDtcblxuXHRcdGlmICggbm9uSGV4ICkge1xuXG5cdFx0XHQvLyBTdHJpcCB0aGUgYmFja3NsYXNoIHByZWZpeCBmcm9tIGEgbm9uLWhleCBlc2NhcGUgc2VxdWVuY2Vcblx0XHRcdHJldHVybiBub25IZXg7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSBhIGhleGFkZWNpbWFsIGVzY2FwZSBzZXF1ZW5jZSB3aXRoIHRoZSBlbmNvZGVkIFVuaWNvZGUgY29kZSBwb2ludFxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTErXG5cdFx0Ly8gRm9yIHZhbHVlcyBvdXRzaWRlIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUgKEJNUCksIG1hbnVhbGx5IGNvbnN0cnVjdCBhXG5cdFx0Ly8gc3Vycm9nYXRlIHBhaXJcblx0XHRyZXR1cm4gaGlnaCA8IDAgP1xuXHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCArIDB4MTAwMDAgKSA6XG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzOyBzZWUgYHNldERvY3VtZW50YC5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxMiAtIDE4K1xuXHQvLyBSZW1vdmluZyB0aGUgZnVuY3Rpb24gd3JhcHBlciBjYXVzZXMgYSBcIlBlcm1pc3Npb24gRGVuaWVkXCJcblx0Ly8gZXJyb3IgaW4gSUUvRWRnZS5cblx0dW5sb2FkSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXHRcdHNldERvY3VtZW50KCk7XG5cdH0sXG5cblx0aW5EaXNhYmxlZEZpZWxkc2V0ID0gYWRkQ29tYmluYXRvcihcblx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlICYmIG5vZGVOYW1lKCBlbGVtLCBcImZpZWxkc2V0XCIgKTtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG4vLyBBY2Nlc3NpbmcgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBjYW4gdGhyb3cgdW5leHBlY3RlZGx5XG4vLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTMzOTNcbmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXHR9IGNhdGNoICggZXJyICkgeyB9XG59XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdCggYXJyID0gc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMgKSApLFxuXHRcdHByZWZlcnJlZERvYy5jaGlsZE5vZGVzXG5cdCk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblx0YXJyWyBwcmVmZXJyZWREb2MuY2hpbGROb2Rlcy5sZW5ndGggXS5ub2RlVHlwZTtcbn0gY2F0Y2ggKCBlICkge1xuXHRwdXNoID0ge1xuXHRcdGFwcGx5OiBmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoTmF0aXZlLmFwcGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoIGVscyApICk7XG5cdFx0fSxcblx0XHRjYWxsOiBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdFx0cHVzaE5hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSApO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gZmluZCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBtLCBpLCBlbGVtLCBuaWQsIG1hdGNoLCBncm91cHMsIG5ld1NlbGVjdG9yLFxuXHRcdG5ld0NvbnRleHQgPSBjb250ZXh0ICYmIGNvbnRleHQub3duZXJEb2N1bWVudCxcblxuXHRcdC8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnRcblx0XHRub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dFxuXHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiB8fCAhc2VsZWN0b3IgfHxcblx0XHRub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSAmJiBub2RlVHlwZSAhPT0gMTEgKSB7XG5cblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgKGFzIG9wcG9zZWQgdG8gZmlsdGVycykgaW4gSFRNTCBkb2N1bWVudHNcblx0aWYgKCAhc2VlZCApIHtcblx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmICggbWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkgKSApIHtcblxuXHRcdFx0XHQvLyBJRCBzZWxlY3RvclxuXHRcdFx0XHRpZiAoICggbSA9IG1hdGNoWyAxIF0gKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHVzaC5jYWxsKCByZXN1bHRzLCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKCBlbGVtID0gbmV3Q29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApICkgJiZcblx0XHRcdFx0XHRcdFx0ZmluZC5jb250YWlucyggY29udGV4dCwgZWxlbSApICYmXG5cdFx0XHRcdFx0XHRcdGVsZW0uaWQgPT09IG0gKSB7XG5cblx0XHRcdFx0XHRcdFx0cHVzaC5jYWxsKCByZXN1bHRzLCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUeXBlIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWyAyIF0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoICggbSA9IG1hdGNoWyAzIF0gKSAmJiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtICkgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUYWtlIGFkdmFudGFnZSBvZiBxdWVyeVNlbGVjdG9yQWxsXG5cdFx0XHRpZiAoICFub25uYXRpdmVTZWxlY3RvckNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF0gJiZcblx0XHRcdFx0KCAhcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdG5ld1NlbGVjdG9yID0gc2VsZWN0b3I7XG5cdFx0XHRcdG5ld0NvbnRleHQgPSBjb250ZXh0O1xuXG5cdFx0XHRcdC8vIHFTQSBjb25zaWRlcnMgZWxlbWVudHMgb3V0c2lkZSBhIHNjb3Bpbmcgcm9vdCB3aGVuIGV2YWx1YXRpbmcgY2hpbGQgb3Jcblx0XHRcdFx0Ly8gZGVzY2VuZGFudCBjb21iaW5hdG9ycywgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudC5cblx0XHRcdFx0Ly8gSW4gc3VjaCBjYXNlcywgd2Ugd29yayBhcm91bmQgdGhlIGJlaGF2aW9yIGJ5IHByZWZpeGluZyBldmVyeSBzZWxlY3RvciBpbiB0aGVcblx0XHRcdFx0Ly8gbGlzdCB3aXRoIGFuIElEIHNlbGVjdG9yIHJlZmVyZW5jaW5nIHRoZSBzY29wZSBjb250ZXh0LlxuXHRcdFx0XHQvLyBUaGUgdGVjaG5pcXVlIGhhcyB0byBiZSB1c2VkIGFzIHdlbGwgd2hlbiBhIGxlYWRpbmcgY29tYmluYXRvciBpcyB1c2VkXG5cdFx0XHRcdC8vIGFzIHN1Y2ggc2VsZWN0b3JzIGFyZSBub3QgcmVjb2duaXplZCBieSBxdWVyeVNlbGVjdG9yQWxsLlxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB0ZWNobmlxdWUuXG5cdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHQoIHJkZXNjZW5kLnRlc3QoIHNlbGVjdG9yICkgfHwgcmxlYWRpbmdDb21iaW5hdG9yLnRlc3QoIHNlbGVjdG9yICkgKSApIHtcblxuXHRcdFx0XHRcdC8vIEV4cGFuZCBjb250ZXh0IGZvciBzaWJsaW5nIHNlbGVjdG9yc1xuXHRcdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fFxuXHRcdFx0XHRcdFx0Y29udGV4dDtcblxuXHRcdFx0XHRcdC8vIFdlIGNhbiB1c2UgOnNjb3BlIGluc3RlYWQgb2YgdGhlIElEIGhhY2sgaWYgdGhlIGJyb3dzZXJcblx0XHRcdFx0XHQvLyBzdXBwb3J0cyBpdCAmIGlmIHdlJ3JlIG5vdCBjaGFuZ2luZyB0aGUgY29udGV4dC5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuXG5cdFx0XHRcdFx0Ly8gc3RyaWN0LWNvbXBhcmluZyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0XHRcdGlmICggbmV3Q29udGV4dCAhPSBjb250ZXh0IHx8ICFzdXBwb3J0LnNjb3BlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBDYXB0dXJlIHRoZSBjb250ZXh0IElELCBzZXR0aW5nIGl0IGZpcnN0IGlmIG5lY2Vzc2FyeVxuXHRcdFx0XHRcdFx0aWYgKCAoIG5pZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCBcImlkXCIgKSApICkge1xuXHRcdFx0XHRcdFx0XHRuaWQgPSBqUXVlcnkuZXNjYXBlU2VsZWN0b3IoIG5pZCApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKCBuaWQgPSBleHBhbmRvICkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmVmaXggZXZlcnkgc2VsZWN0b3IgaW4gdGhlIGxpc3Rcblx0XHRcdFx0XHRncm91cHMgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHRcdFx0XHRpID0gZ3JvdXBzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGdyb3Vwc1sgaSBdID0gKCBuaWQgPyBcIiNcIiArIG5pZCA6IFwiOnNjb3BlXCIgKSArIFwiIFwiICtcblx0XHRcdFx0XHRcdFx0dG9TZWxlY3RvciggZ3JvdXBzWyBpIF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bmV3U2VsZWN0b3IgPSBncm91cHMuam9pbiggXCIsXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cyxcblx0XHRcdFx0XHRcdG5ld0NvbnRleHQucXVlcnlTZWxlY3RvckFsbCggbmV3U2VsZWN0b3IgKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH0gY2F0Y2ggKCBxc2FFcnJvciApIHtcblx0XHRcdFx0XHRub25uYXRpdmVTZWxlY3RvckNhY2hlKCBzZWxlY3RvciwgdHJ1ZSApO1xuXHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdGlmICggbmlkID09PSBleHBhbmRvICkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoIFwiaWRcIiApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEFsbCBvdGhlcnNcblx0cmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW1DU1MsIFwiJDFcIiApLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oc3RyaW5nLCBvYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoXG4gKlx0cHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aClcbiAqXHRkZWxldGluZyB0aGUgb2xkZXN0IGVudHJ5XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKCkge1xuXHR2YXIga2V5cyA9IFtdO1xuXG5cdGZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkge1xuXG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzXG5cdFx0Ly8gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9pc3N1ZXMvMTU3KVxuXHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKyBcIiBcIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHtcblxuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXG5cdFx0XHRkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdO1xuXHRcdH1cblx0XHRyZXR1cm4gKCBjYWNoZVsga2V5ICsgXCIgXCIgXSA9IHZhbHVlICk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgalF1ZXJ5IHNlbGVjdG9yIG1vZHVsZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIG1hcmtcbiAqL1xuZnVuY3Rpb24gbWFya0Z1bmN0aW9uKCBmbiApIHtcblx0Zm5bIGV4cGFuZG8gXSA9IHRydWU7XG5cdHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGVsZW1lbnQgYW5kIHJldHVybnMgYSBib29sZWFuIHJlc3VsdFxuICovXG5mdW5jdGlvbiBhc3NlcnQoIGZuICkge1xuXHR2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImZpZWxkc2V0XCIgKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBlbCApO1xuXHR9IGNhdGNoICggZSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZmluYWxseSB7XG5cblx0XHQvLyBSZW1vdmUgZnJvbSBpdHMgcGFyZW50IGJ5IGRlZmF1bHRcblx0XHRpZiAoIGVsLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApO1xuXHRcdH1cblxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZWwgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gbm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiAoIG5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSB8fCBub2RlTmFtZSggZWxlbSwgXCJidXR0b25cIiApICkgJiZcblx0XHRcdGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIDplbmFibGVkLzpkaXNhYmxlZFxuICogQHBhcmFtIHtCb29sZWFufSBkaXNhYmxlZCB0cnVlIGZvciA6ZGlzYWJsZWQ7IGZhbHNlIGZvciA6ZW5hYmxlZFxuICovXG5mdW5jdGlvbiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZGlzYWJsZWQgKSB7XG5cblx0Ly8gS25vd24gOmRpc2FibGVkIGZhbHNlIHBvc2l0aXZlczogZmllbGRzZXRbZGlzYWJsZWRdID4gbGVnZW5kOm50aC1vZi10eXBlKG4rMikgOmNhbi1kaXNhYmxlXG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE9ubHkgY2VydGFpbiBlbGVtZW50cyBjYW4gbWF0Y2ggOmVuYWJsZWQgb3IgOmRpc2FibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZW5hYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWRpc2FibGVkXG5cdFx0aWYgKCBcImZvcm1cIiBpbiBlbGVtICkge1xuXG5cdFx0XHQvLyBDaGVjayBmb3IgaW5oZXJpdGVkIGRpc2FibGVkbmVzcyBvbiByZWxldmFudCBub24tZGlzYWJsZWQgZWxlbWVudHM6XG5cdFx0XHQvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NhdGVnb3J5LWxpc3RlZFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtZmUtZGlzYWJsZWRcblx0XHRcdC8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXBcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LW9wdGlvbi1kaXNhYmxlZFxuXHRcdFx0Ly8gQWxsIHN1Y2ggZWxlbWVudHMgaGF2ZSBhIFwiZm9ybVwiIHByb3BlcnR5LlxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgJiYgZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Ly8gT3B0aW9uIGVsZW1lbnRzIGRlZmVyIHRvIGEgcGFyZW50IG9wdGdyb3VwIGlmIHByZXNlbnRcblx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDYgLSAxMStcblx0XHRcdFx0Ly8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnNcblx0XHRcdFx0cmV0dXJuIGVsZW0uaXNEaXNhYmxlZCA9PT0gZGlzYWJsZWQgfHxcblxuXHRcdFx0XHRcdC8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5XG5cdFx0XHRcdFx0ZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdGluRGlzYWJsZWRGaWVsZHNldCggZWxlbSApID09PSBkaXNhYmxlZDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXG5cdFx0Ly8gVHJ5IHRvIHdpbm5vdyBvdXQgZWxlbWVudHMgdGhhdCBjYW4ndCBiZSBkaXNhYmxlZCBiZWZvcmUgdHJ1c3RpbmcgdGhlIGRpc2FibGVkIHByb3BlcnR5LlxuXHRcdC8vIFNvbWUgdmljdGltcyBnZXQgY2F1Z2h0IGluIG91ciBuZXQgKGxhYmVsLCBsZWdlbmQsIG1lbnUsIHRyYWNrKSwgYnV0IGl0IHNob3VsZG4ndFxuXHRcdC8vIGV2ZW4gZXhpc3Qgb24gdGhlbSwgbGV0IGFsb25lIGhhdmUgYSBib29sZWFuIHZhbHVlLlxuXHRcdH0gZWxzZSBpZiAoIFwibGFiZWxcIiBpbiBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdH1cblxuXHRcdC8vIFJlbWFpbmluZyBlbGVtZW50cyBhcmUgbmVpdGhlciA6ZW5hYmxlZCBub3IgOmRpc2FibGVkXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgcG9zaXRpb25hbHNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZuICkge1xuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHR2YXIgaixcblx0XHRcdFx0bWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSxcblx0XHRcdFx0aSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7XG5cblx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlc1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggc2VlZFsgKCBqID0gbWF0Y2hJbmRleGVzWyBpIF0gKSBdICkge1xuXHRcdFx0XHRcdHNlZWRbIGogXSA9ICEoIG1hdGNoZXNbIGogXSA9IHNlZWRbIGogXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9ICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBqUXVlcnkgc2VsZWN0b3IgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLyoqXG4gKiBTZXRzIGRvY3VtZW50LXJlbGF0ZWQgdmFyaWFibGVzIG9uY2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtub2RlXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5mdW5jdGlvbiBzZXREb2N1bWVudCggbm9kZSApIHtcblx0dmFyIHN1YldpbmRvdyxcblx0XHRkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7XG5cblx0Ly8gUmV0dXJuIGVhcmx5IGlmIGRvYyBpcyBpbnZhbGlkIG9yIGFscmVhZHkgc2VsZWN0ZWRcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCBkb2MgPT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdGRvY3VtZW50SXNIVE1MID0gIWpRdWVyeS5pc1hNTERvYyggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBpT1MgNyBvbmx5LCBJRSA5IC0gMTErXG5cdC8vIE9sZGVyIGJyb3dzZXJzIGRpZG4ndCBzdXBwb3J0IHVucHJlZml4ZWQgYG1hdGNoZXNgLlxuXHRtYXRjaGVzID0gZG9jdW1lbnRFbGVtZW50Lm1hdGNoZXMgfHxcblx0XHRkb2N1bWVudEVsZW1lbnQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jdW1lbnRFbGVtZW50Lm1zTWF0Y2hlc1NlbGVjdG9yO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCtcblx0Ly8gQWNjZXNzaW5nIGlmcmFtZSBkb2N1bWVudHMgYWZ0ZXIgdW5sb2FkIHRocm93cyBcInBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3JzXG5cdC8vIChzZWUgdHJhYy0xMzkzNikuXG5cdC8vIExpbWl0IHRoZSBmaXggdG8gSUUgJiBFZGdlIExlZ2FjeTsgZGVzcGl0ZSBFZGdlIDE1KyBpbXBsZW1lbnRpbmcgYG1hdGNoZXNgLFxuXHQvLyBhbGwgSUUgOSsgYW5kIEVkZ2UgTGVnYWN5IHZlcnNpb25zIGltcGxlbWVudCBgbXNNYXRjaGVzU2VsZWN0b3JgIGFzIHdlbGwuXG5cdGlmICggZG9jdW1lbnRFbGVtZW50Lm1zTWF0Y2hlc1NlbGVjdG9yICYmXG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdHByZWZlcnJlZERvYyAhPSBkb2N1bWVudCAmJlxuXHRcdCggc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcgKSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDEyIC0gMTgrXG5cdFx0c3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwidW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBqUXVlcnkuZXhwYW5kbztcblx0XHRyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8XG5cdFx0XHQhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIGpRdWVyeS5leHBhbmRvICkubGVuZ3RoO1xuXHR9ICk7XG5cblx0Ly8gU3VwcG9ydDogSUUgOSBvbmx5XG5cdC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvclxuXHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlLlxuXHRzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0cmV0dXJuIG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cdH0gKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDEyIC0gMTgrXG5cdC8vIElFL0VkZ2UgZG9uJ3Qgc3VwcG9ydCB0aGUgOnNjb3BlIHBzZXVkby1jbGFzcy5cblx0c3VwcG9ydC5zY29wZSA9IGFzc2VydCggZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiOnNjb3BlXCIgKTtcblx0fSApO1xuXG5cdC8vIFN1cHBvcnQ6IENocm9tZSAxMDUgLSAxMTEgb25seSwgU2FmYXJpIDE1LjQgLSAxNi4zIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHRoZSBgOmhhcygpYCBhcmd1bWVudCBpcyBwYXJzZWQgdW5mb3JnaXZpbmdseS5cblx0Ly8gV2UgaW5jbHVkZSBgKmAgaW4gdGhlIHRlc3QgdG8gZGV0ZWN0IGJ1Z2d5IGltcGxlbWVudGF0aW9ucyB0aGF0IGFyZVxuXHQvLyBfc2VsZWN0aXZlbHlfIGZvcmdpdmluZyAoc3BlY2lmaWNhbGx5IHdoZW4gdGhlIGxpc3QgaW5jbHVkZXMgYXQgbGVhc3Rcblx0Ly8gb25lIHZhbGlkIHNlbGVjdG9yKS5cblx0Ly8gTm90ZSB0aGF0IHdlIHRyZWF0IGNvbXBsZXRlIGxhY2sgb2Ygc3VwcG9ydCBmb3IgYDpoYXMoKWAgYXMgaWYgaXQgd2VyZVxuXHQvLyBzcGVjLWNvbXBsaWFudCBzdXBwb3J0LCB3aGljaCBpcyBmaW5lIGJlY2F1c2UgdXNlIG9mIGA6aGFzKClgIGluIHN1Y2hcblx0Ly8gZW52aXJvbm1lbnRzIHdpbGwgZmFpbCBpbiB0aGUgcVNBIHBhdGggYW5kIGZhbGwgYmFjayB0byBqUXVlcnkgdHJhdmVyc2FsXG5cdC8vIGFueXdheS5cblx0c3VwcG9ydC5jc3NIYXMgPSBhc3NlcnQoIGZ1bmN0aW9uKCkge1xuXHRcdHRyeSB7XG5cdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBcIjpoYXMoKiw6anFmYWtlKVwiICk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH0gKTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBcImlkXCIgKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZC5JRCA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblx0XHRcdFx0cmV0dXJuIGVsZW0gPyBbIGVsZW0gXSA6IFtdO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0RXhwci5maWx0ZXIuSUQgPSAgZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggXCJpZFwiICk7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHlcblx0XHQvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0XG5cdFx0RXhwci5maW5kLklEID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIG5vZGUsIGksIGVsZW1zLFxuXHRcdFx0XHRcdGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXG5cdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdC8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlXG5cdFx0XHRcdFx0bm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0aWYgKCBub2RlICYmIG5vZGUudmFsdWUgPT09IGlkICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZVxuXHRcdFx0XHRcdGVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTtcblx0XHRcdFx0XHRpID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1zWyBpKysgXSApICkge1xuXHRcdFx0XHRcdFx0bm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBbIGVsZW0gXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8vIFRhZ1xuXHRFeHByLmZpbmQuVEFHID0gZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0Ly8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROXG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdH1cblx0fTtcblxuXHQvLyBDbGFzc1xuXHRFeHByLmZpbmQuQ0xBU1MgPSBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkge1xuXHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApO1xuXHRcdH1cblx0fTtcblxuXHQvKiBRU0EvbWF0Y2hlc1NlbGVjdG9yXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0XG5cblx0cmJ1Z2d5UVNBID0gW107XG5cblx0Ly8gQnVpbGQgUVNBIHJlZ2V4XG5cdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0YXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cblx0XHR2YXIgaW5wdXQ7XG5cblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID1cblx0XHRcdFwiPGEgaWQ9J1wiICsgZXhwYW5kbyArIFwiJyBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPlwiICtcblx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgZGlzYWJsZWQ9J2Rpc2FibGVkJz5cIiArXG5cdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHQvLyBTdXBwb3J0OiBpT1MgPD03IC0gOCBvbmx5XG5cdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseSBpbiBzb21lIFhNTCBkb2N1bWVudHNcblx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIltzZWxlY3RlZF1cIiApLmxlbmd0aCApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86dmFsdWV8XCIgKyBib29sZWFucyArIFwiKVwiICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogaU9TIDw9NyAtIDggb25seVxuXHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJ+PVwiICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogaU9TIDggb25seVxuXHRcdC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzY4NTFcblx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJhI1wiICsgZXhwYW5kbyArIFwiKypcIiApLmxlbmd0aCApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIi4jLitbK35dXCIgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0xMDUrLCBGaXJlZm94IDw9MTA0KywgU2FmYXJpIDw9MTUuNCtcblx0XHQvLyBJbiBzb21lIG9mIHRoZSBkb2N1bWVudCBraW5kcywgdGhlc2Ugc2VsZWN0b3JzIHdvdWxkbid0IHdvcmsgbmF0aXZlbHkuXG5cdFx0Ly8gVGhpcyBpcyBwcm9iYWJseSBPSyBidXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdlIHdhbnQgdG8gbWFpbnRhaW5cblx0XHQvLyBoYW5kbGluZyB0aGVtIHRocm91Z2ggalF1ZXJ5IHRyYXZlcnNhbCBpbiBqUXVlcnkgMy54LlxuXHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiOmNoZWNrZWRcIiApLmxlbmd0aCApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjpjaGVja2VkXCIgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHQvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnRcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRcdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwiaGlkZGVuXCIgKTtcblx0XHRlbC5hcHBlbmRDaGlsZCggaW5wdXQgKS5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcIkRcIiApO1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExK1xuXHRcdC8vIElFJ3MgOmRpc2FibGVkIHNlbGVjdG9yIGRvZXMgbm90IHBpY2sgdXAgdGhlIGNoaWxkcmVuIG9mIGRpc2FibGVkIGZpZWxkc2V0c1xuXHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTEwNSssIEZpcmVmb3ggPD0xMDQrLCBTYWZhcmkgPD0xNS40K1xuXHRcdC8vIEluIHNvbWUgb2YgdGhlIGRvY3VtZW50IGtpbmRzLCB0aGVzZSBzZWxlY3RvcnMgd291bGRuJ3Qgd29yayBuYXRpdmVseS5cblx0XHQvLyBUaGlzIGlzIHByb2JhYmx5IE9LIGJ1dCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2Ugd2FudCB0byBtYWludGFpblxuXHRcdC8vIGhhbmRsaW5nIHRoZW0gdGhyb3VnaCBqUXVlcnkgdHJhdmVyc2FsIGluIGpRdWVyeSAzLnguXG5cdFx0ZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBlbCApLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiOmRpc2FibGVkXCIgKS5sZW5ndGggIT09IDIgKSB7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaCggXCI6ZW5hYmxlZFwiLCBcIjpkaXNhYmxlZFwiICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE1IC0gMTgrXG5cdFx0Ly8gSUUgMTEvRWRnZSBkb24ndCBmaW5kIGVsZW1lbnRzIG9uIGEgYFtuYW1lPScnXWAgcXVlcnkgaW4gc29tZSBjYXNlcy5cblx0XHQvLyBBZGRpbmcgYSB0ZW1wb3JhcnkgYXR0cmlidXRlIHRvIHRoZSBkb2N1bWVudCBiZWZvcmUgdGhlIHNlbGVjdGlvbiB3b3Jrc1xuXHRcdC8vIGFyb3VuZCB0aGUgaXNzdWUuXG5cdFx0Ly8gSW50ZXJlc3RpbmdseSwgSUUgMTAgJiBvbGRlciBkb24ndCBzZWVtIHRvIGhhdmUgdGhlIGlzc3VlLlxuXHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJcIiApO1xuXHRcdGVsLmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW25hbWU9JyddXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIio9XCIgK1xuXHRcdFx0XHR3aGl0ZXNwYWNlICsgXCIqKD86Jyd8XFxcIlxcXCIpXCIgKTtcblx0XHR9XG5cdH0gKTtcblxuXHRpZiAoICFzdXBwb3J0LmNzc0hhcyApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IENocm9tZSAxMDUgLSAxMTArLCBTYWZhcmkgMTUuNCAtIDE2LjMrXG5cdFx0Ly8gT3VyIHJlZ3VsYXIgYHRyeS1jYXRjaGAgbWVjaGFuaXNtIGZhaWxzIHRvIGRldGVjdCBuYXRpdmVseS11bnN1cHBvcnRlZFxuXHRcdC8vIHBzZXVkby1jbGFzc2VzIGluc2lkZSBgOmhhcygpYCAoc3VjaCBhcyBgOmhhcyg6Y29udGFpbnMoXCJGb29cIikpYClcblx0XHQvLyBpbiBicm93c2VycyB0aGF0IHBhcnNlIHRoZSBgOmhhcygpYCBhcmd1bWVudCBhcyBhIGZvcmdpdmluZyBzZWxlY3RvciBsaXN0LlxuXHRcdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9zZWxlY3RvcnMvI3JlbGF0aW9uYWwgbm93IHJlcXVpcmVzIHRoZSBhcmd1bWVudFxuXHRcdC8vIHRvIGJlIHBhcnNlZCB1bmZvcmdpdmluZ2x5LCBidXQgYnJvd3NlcnMgaGF2ZSBub3QgeWV0IGZ1bGx5IGFkanVzdGVkLlxuXHRcdHJidWdneVFTQS5wdXNoKCBcIjpoYXNcIiApO1xuXHR9XG5cblx0cmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbiggXCJ8XCIgKSApO1xuXG5cdC8qIFNvcnRpbmdcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmdcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdGNvbXBhcmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBhICkgPT0gKCBiLm93bmVyRG9jdW1lbnQgfHwgYiApID9cblx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBrbm93IHRoZXkgYXJlIGRpc2Nvbm5lY3RlZFxuXHRcdFx0MTtcblxuXHRcdC8vIERpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdGlmICggY29tcGFyZSAmIDEgfHxcblx0XHRcdCggIXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9PT0gY29tcGFyZSApICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRpZiAoIGEgPT09IGRvY3VtZW50IHx8IGEub3duZXJEb2N1bWVudCA9PSBwcmVmZXJyZWREb2MgJiZcblx0XHRcdFx0ZmluZC5jb250YWlucyggcHJlZmVycmVkRG9jLCBhICkgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdGlmICggYiA9PT0gZG9jdW1lbnQgfHwgYi5vd25lckRvY3VtZW50ID09IHByZWZlcnJlZERvYyAmJlxuXHRcdFx0XHRmaW5kLmNvbnRhaW5zKCBwcmVmZXJyZWREb2MsIGIgKSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1haW50YWluIG9yaWdpbmFsIG9yZGVyXG5cdFx0XHRyZXR1cm4gc29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mLmNhbGwoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZi5jYWxsKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29tcGFyZSAmIDQgPyAtMSA6IDE7XG5cdH07XG5cblx0cmV0dXJuIGRvY3VtZW50O1xufVxuXG5maW5kLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7XG5cdHJldHVybiBmaW5kKCBleHByLCBudWxsLCBudWxsLCBlbGVtZW50cyApO1xufTtcblxuZmluZC5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblxuXHRpZiAoIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IW5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xuXG5cdFx0XHQvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0XHRpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8XG5cblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSggZXhwciwgdHJ1ZSApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmaW5kKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuZmluZC5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkge1xuXG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHR9XG5cdHJldHVybiBqUXVlcnkuY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblxuZmluZC5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHR2YXIgZm4gPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUudG9Mb3dlckNhc2UoKSBdLFxuXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSB0cmFjLTEzODA3KVxuXHRcdHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID9cblx0XHRcdGZuKCBlbGVtLCBuYW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6XG5cdFx0XHR1bmRlZmluZWQ7XG5cblx0aWYgKCB2YWwgIT09IHVuZGVmaW5lZCApIHtcblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG59O1xuXG5maW5kLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cbmpRdWVyeS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdC8vXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjArXG5cdC8vIFRlc3RpbmcgZm9yIGRldGVjdGluZyBkdXBsaWNhdGVzIGlzIHVucHJlZGljdGFibGUgc28gaW5zdGVhZCBhc3N1bWUgd2UgY2FuJ3Rcblx0Ly8gZGVwZW5kIG9uIGR1cGxpY2F0ZSBkZXRlY3Rpb24gaW4gYWxsIGJyb3dzZXJzIHdpdGhvdXQgYSBzdGFibGUgc29ydC5cblx0aGFzRHVwbGljYXRlID0gIXN1cHBvcnQuc29ydFN0YWJsZTtcblx0c29ydElucHV0ID0gIXN1cHBvcnQuc29ydFN0YWJsZSAmJiBzbGljZS5jYWxsKCByZXN1bHRzLCAwICk7XG5cdHNvcnQuY2FsbCggcmVzdWx0cywgc29ydE9yZGVyICk7XG5cblx0aWYgKCBoYXNEdXBsaWNhdGUgKSB7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSByZXN1bHRzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRzcGxpY2UuY2FsbCggcmVzdWx0cywgZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG5qUXVlcnkuZm4udW5pcXVlU29ydCA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWVTb3J0KCBzbGljZS5hcHBseSggdGhpcyApICkgKTtcbn07XG5cbkV4cHIgPSBqUXVlcnkuZXhwciA9IHtcblxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcblx0Y2FjaGVMZW5ndGg6IDUwLFxuXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxuXG5cdG1hdGNoOiBtYXRjaEV4cHIsXG5cblx0YXR0ckhhbmRsZToge30sXG5cblx0ZmluZDoge30sXG5cblx0cmVsYXRpdmU6IHtcblx0XHRcIj5cIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcblx0XHRcIitcIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCJ+XCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiIH1cblx0fSxcblxuXHRwcmVGaWx0ZXI6IHtcblx0XHRBVFRSOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsgMSBdID0gbWF0Y2hbIDEgXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHQvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZFxuXHRcdFx0bWF0Y2hbIDMgXSA9ICggbWF0Y2hbIDMgXSB8fCBtYXRjaFsgNCBdIHx8IG1hdGNoWyA1IF0gfHwgXCJcIiApXG5cdFx0XHRcdC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHRpZiAoIG1hdGNoWyAyIF0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbIDMgXSA9IFwiIFwiICsgbWF0Y2hbIDMgXSArIFwiIFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcblx0XHR9LFxuXG5cdFx0Q0hJTEQ6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblxuXHRcdFx0LyogbWF0Y2hlcyBmcm9tIG1hdGNoRXhwcltcIkNISUxEXCJdXG5cdFx0XHRcdDEgdHlwZSAob25seXxudGh8Li4uKVxuXHRcdFx0XHQyIHdoYXQgKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdDMgYXJndW1lbnQgKGV2ZW58b2RkfFxcZCp8XFxkKm4oWystXVxcZCspP3wuLi4pXG5cdFx0XHRcdDQgeG4tY29tcG9uZW50IG9mIHhuK3kgYXJndW1lbnQgKFsrLV0/XFxkKm58KVxuXHRcdFx0XHQ1IHNpZ24gb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDYgeCBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NyBzaWduIG9mIHktY29tcG9uZW50XG5cdFx0XHRcdDggeSBvZiB5LWNvbXBvbmVudFxuXHRcdFx0Ki9cblx0XHRcdG1hdGNoWyAxIF0gPSBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbIDEgXS5zbGljZSggMCwgMyApID09PSBcIm50aFwiICkge1xuXG5cdFx0XHRcdC8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50XG5cdFx0XHRcdGlmICggIW1hdGNoWyAzIF0gKSB7XG5cdFx0XHRcdFx0ZmluZC5lcnJvciggbWF0Y2hbIDAgXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbIDQgXSA9ICsoIG1hdGNoWyA0IF0gP1xuXHRcdFx0XHRcdG1hdGNoWyA1IF0gKyAoIG1hdGNoWyA2IF0gfHwgMSApIDpcblx0XHRcdFx0XHQyICogKCBtYXRjaFsgMyBdID09PSBcImV2ZW5cIiB8fCBtYXRjaFsgMyBdID09PSBcIm9kZFwiIClcblx0XHRcdFx0KTtcblx0XHRcdFx0bWF0Y2hbIDUgXSA9ICsoICggbWF0Y2hbIDcgXSArIG1hdGNoWyA4IF0gKSB8fCBtYXRjaFsgMyBdID09PSBcIm9kZFwiICk7XG5cblx0XHRcdC8vIG90aGVyIHR5cGVzIHByb2hpYml0IGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbIDMgXSApIHtcblx0XHRcdFx0ZmluZC5lcnJvciggbWF0Y2hbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fSxcblxuXHRcdFBTRVVETzogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbIDYgXSAmJiBtYXRjaFsgMiBdO1xuXG5cdFx0XHRpZiAoIG1hdGNoRXhwci5DSElMRC50ZXN0KCBtYXRjaFsgMCBdICkgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pc1xuXHRcdFx0aWYgKCBtYXRjaFsgMyBdICkge1xuXHRcdFx0XHRtYXRjaFsgMiBdID0gbWF0Y2hbIDQgXSB8fCBtYXRjaFsgNSBdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblxuXHRcdFx0XHQvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KVxuXHRcdFx0XHQoIGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApICkgJiZcblxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KCBleGNlc3MgPSB1bnF1b3RlZC5pbmRleE9mKCBcIilcIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGggKSApIHtcblxuXHRcdFx0XHQvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleFxuXHRcdFx0XHRtYXRjaFsgMCBdID0gbWF0Y2hbIDAgXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWyAyIF0gPSB1bnF1b3RlZC5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHVybiBvbmx5IGNhcHR1cmVzIG5lZWRlZCBieSB0aGUgcHNldWRvIGZpbHRlciBtZXRob2QgKHR5cGUgYW5kIGFyZ3VtZW50KVxuXHRcdFx0cmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7XG5cdFx0fVxuXHR9LFxuXG5cdGZpbHRlcjoge1xuXG5cdFx0VEFHOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHtcblx0XHRcdHZhciBleHBlY3RlZE5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBub2RlTmFtZSggZWxlbSwgZXhwZWN0ZWROb2RlTmFtZSApO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRDTEFTUzogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHtcblx0XHRcdHZhciBwYXR0ZXJuID0gY2xhc3NDYWNoZVsgY2xhc3NOYW1lICsgXCIgXCIgXTtcblxuXHRcdFx0cmV0dXJuIHBhdHRlcm4gfHxcblx0XHRcdFx0KCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArXG5cdFx0XHRcdFx0XCIoXCIgKyB3aGl0ZXNwYWNlICsgXCJ8JClcIiApICkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KFxuXHRcdFx0XHRcdFx0dHlwZW9mIGVsZW0uY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsZW0uY2xhc3NOYW1lIHx8XG5cdFx0XHRcdFx0XHRcdHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBcImNsYXNzXCIgKSB8fFxuXHRcdFx0XHRcdFx0XHRcIlwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSApO1xuXHRcdH0sXG5cblx0XHRBVFRSOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHRcdFx0aWYgKCByZXN1bHQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiIT1cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoICFvcGVyYXRvciApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdCArPSBcIlwiO1xuXG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwiPVwiICkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQgPT09IGNoZWNrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwiIT1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0ICE9PSBjaGVjaztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIG9wZXJhdG9yID09PSBcIl49XCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID09PSAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwiKj1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIG9wZXJhdG9yID09PSBcIiQ9XCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0aCApID09PSBjaGVjaztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIG9wZXJhdG9yID09PSBcIn49XCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuICggXCIgXCIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsIFwiIFwiICkgKyBcIiBcIiApXG5cdFx0XHRcdFx0XHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwifD1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQuc2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyBcIi1cIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdENISUxEOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgX2FyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIF9jb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKCBub2RlID0gbm9kZVsgZGlyIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZU5hbWUoIG5vZGUsIG5hbWUgKSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdC8vIFJldmVyc2UgZGlyZWN0aW9uIGZvciA6b25seS0qIChpZiB3ZSBoYXZlbid0IHlldCBkb25lIHNvKVxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0ID0gZGlyID0gdHlwZSA9PT0gXCJvbmx5XCIgJiYgIXN0YXJ0ICYmIFwibmV4dFNpYmxpbmdcIjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0c3RhcnQgPSBbIGZvcndhcmQgPyBwYXJlbnQuZmlyc3RDaGlsZCA6IHBhcmVudC5sYXN0Q2hpbGQgXTtcblxuXHRcdFx0XHRcdFx0Ly8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGBcblx0XHRcdFx0XHRcdGlmICggZm9yd2FyZCAmJiB1c2VDYWNoZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXhcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IHBhcmVudFsgZXhwYW5kbyBdIHx8ICggcGFyZW50WyBleHBhbmRvIF0gPSB7fSApO1xuXHRcdFx0XHRcdFx0XHRjYWNoZSA9IG91dGVyQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHQoIGRpZmYgPSBub2RlSW5kZXggPSAwICkgfHwgc3RhcnQucG9wKCkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFdoZW4gZm91bmQsIGNhY2hlIGluZGV4ZXMgb24gYHBhcmVudGAgYW5kIGJyZWFrXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLm5vZGVUeXBlID09PSAxICYmICsrZGlmZiAmJiBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKCBlbGVtWyBleHBhbmRvIF0gPSB7fSApO1xuXHRcdFx0XHRcdFx0XHRcdGNhY2hlID0gb3V0ZXJDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKCBub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KCBkaWZmID0gbm9kZUluZGV4ID0gMCApIHx8IHN0YXJ0LnBvcCgpICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlTmFtZSggbm9kZSwgbmFtZSApIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsrZGlmZiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBlbmNvdW50ZXJlZCBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KCBub2RlWyBleHBhbmRvIF0gPSB7fSApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplXG5cdFx0XHRcdFx0XHRkaWZmIC09IGxhc3Q7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFBTRVVETzogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cblx0XHRcdC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdGZpbmQuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xuXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XG5cdFx0XHQvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvblxuXHRcdFx0Ly8ganVzdCBhcyBqUXVlcnkgZG9lc1xuXHRcdFx0aWYgKCBmblsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRyZXR1cm4gZm4oIGFyZ3VtZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlc1xuXHRcdFx0aWYgKCBmbi5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcblx0XHRcdFx0cmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRcdFx0bWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdFx0XHRcdHZhciBpZHgsXG5cdFx0XHRcdFx0XHRcdG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSxcblx0XHRcdFx0XHRcdFx0aSA9IG1hdGNoZWQubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlkeCA9IGluZGV4T2YuY2FsbCggc2VlZCwgbWF0Y2hlZFsgaSBdICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkWyBpIF0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cblx0XHQvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3Ncblx0XHRub3Q6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXG5cdFx0XHQvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZVxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcblx0XHRcdC8vIHNwYWNlcyBhcyBjb21iaW5hdG9yc1xuXHRcdFx0dmFyIGlucHV0ID0gW10sXG5cdFx0XHRcdHJlc3VsdHMgPSBbXSxcblx0XHRcdFx0bWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltQ1NTLCBcIiQxXCIgKSApO1xuXG5cdFx0XHRyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID9cblx0XHRcdFx0bWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKCBlbGVtID0gdW5tYXRjaGVkWyBpIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaSBdID0gISggbWF0Y2hlc1sgaSBdID0gZWxlbSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApIDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIF9jb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0bWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApO1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3Qga2VlcCB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdC8vIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvaXNzdWVzLzI5OSlcblx0XHRcdFx0XHRpbnB1dFsgMCBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSApLFxuXG5cdFx0aGFzOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGZpbmQoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDtcblx0XHRcdH07XG5cdFx0fSApLFxuXG5cdFx0Y29udGFpbnM6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGpRdWVyeS50ZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcblx0XHRcdH07XG5cdFx0fSApLFxuXG5cdFx0Ly8gXCJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yXG5cdFx0Ly8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWVcblx0XHQvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLFxuXHRcdC8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgXCItXCIuXG5cdFx0Ly8gVGhlIG1hdGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuXG5cdFx0Ly8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS5cIlxuXHRcdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0bGFuZzogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHtcblxuXHRcdFx0Ly8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclxuXHRcdFx0aWYgKCAhcmlkZW50aWZpZXIudGVzdCggbGFuZyB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdGZpbmQuZXJyb3IoIFwidW5zdXBwb3J0ZWQgbGFuZzogXCIgKyBsYW5nICk7XG5cdFx0XHR9XG5cdFx0XHRsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBlbGVtTGFuZztcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGlmICggKCBlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID9cblx0XHRcdFx0XHRcdGVsZW0ubGFuZyA6XG5cdFx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggXCJ4bWw6bGFuZ1wiICkgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoIFwibGFuZ1wiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0ZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcgKyBcIi1cIiApID09PSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSB3aGlsZSAoICggZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSApICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHQvLyBNaXNjZWxsYW5lb3VzXG5cdFx0dGFyZ2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRyb290OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudEVsZW1lbnQ7XG5cdFx0fSxcblxuXHRcdGZvY3VzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmXG5cdFx0XHRcdGRvY3VtZW50Lmhhc0ZvY3VzKCkgJiZcblx0XHRcdFx0ISEoIGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXggKTtcblx0XHR9LFxuXG5cdFx0Ly8gQm9vbGVhbiBwcm9wZXJ0aWVzXG5cdFx0ZW5hYmxlZDogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksXG5cdFx0ZGlzYWJsZWQ6IGNyZWF0ZURpc2FibGVkUHNldWRvKCB0cnVlICksXG5cblx0XHRjaGVja2VkOiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0Ly8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdHJldHVybiAoIG5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSAmJiAhIWVsZW0uY2hlY2tlZCApIHx8XG5cdFx0XHRcdCggbm9kZU5hbWUoIGVsZW0sIFwib3B0aW9uXCIgKSAmJiAhIWVsZW0uc2VsZWN0ZWQgKTtcblx0XHR9LFxuXG5cdFx0c2VsZWN0ZWQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTExK1xuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG5cdFx0XHQvLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gdHJlYXQgdGhlIGRlZmF1bHQgb3B0aW9uIGFzXG5cdFx0XHQvLyBzZWxlY3RlZCB3aGVuIGluIGFuIG9wdGdyb3VwLlxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBDb250ZW50c1xuXHRcdGVtcHR5OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXG5cdFx0XHQvLyA6ZW1wdHkgaXMgbmVnYXRlZCBieSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5IHJlZjogNSksXG5cdFx0XHQvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKVxuXHRcdFx0Ly8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zLmVtcHR5KCBlbGVtICk7XG5cdFx0fSxcblxuXHRcdC8vIEVsZW1lbnQvaW5wdXQgdHlwZXNcblx0XHRoZWFkZXI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRpbnB1dDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdGJ1dHRvbjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICYmIGVsZW0udHlwZSA9PT0gXCJidXR0b25cIiB8fFxuXHRcdFx0XHRub2RlTmFtZSggZWxlbSwgXCJidXR0b25cIiApO1xuXHRcdH0sXG5cblx0XHR0ZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIG5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSAmJiBlbGVtLnR5cGUgPT09IFwidGV4dFwiICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDEwIG9ubHlcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhclxuXHRcdFx0XHQvLyB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSApID09IG51bGwgfHxcblx0XHRcdFx0XHRhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRmaXJzdDogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSApLFxuXG5cdFx0bGFzdDogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIF9tYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHJldHVybiBbIGxlbmd0aCAtIDEgXTtcblx0XHR9ICksXG5cblx0XHRlcTogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIF9tYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07XG5cdFx0fSApLFxuXG5cdFx0ZXZlbjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKSxcblxuXHRcdG9kZDogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKSxcblxuXHRcdGx0OiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGk7XG5cblx0XHRcdGlmICggYXJndW1lbnQgPCAwICkge1xuXHRcdFx0XHRpID0gYXJndW1lbnQgKyBsZW5ndGg7XG5cdFx0XHR9IGVsc2UgaWYgKCBhcmd1bWVudCA+IGxlbmd0aCApIHtcblx0XHRcdFx0aSA9IGxlbmd0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGkgPSBhcmd1bWVudDtcblx0XHRcdH1cblxuXHRcdFx0Zm9yICggOyAtLWkgPj0gMDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKSxcblxuXHRcdGd0OiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyArK2kgPCBsZW5ndGg7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9IClcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zLm50aCA9IEV4cHIucHNldWRvcy5lcTtcblxuLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3NcbmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUlucHV0UHNldWRvKCBpICk7XG59XG5mb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApO1xufVxuXG4vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnNcbmZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fVxuc2V0RmlsdGVycy5wcm90b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7XG5FeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpO1xuXG5mdW5jdGlvbiB0b2tlbml6ZSggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8ICggbWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSApICkge1xuXHRcdFx0aWYgKCBtYXRjaCApIHtcblxuXHRcdFx0XHQvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZFxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFsgMCBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICggdG9rZW5zID0gW10gKSApO1xuXHRcdH1cblxuXHRcdG1hdGNoZWQgPSBmYWxzZTtcblxuXHRcdC8vIENvbWJpbmF0b3JzXG5cdFx0aWYgKCAoIG1hdGNoID0gcmxlYWRpbmdDb21iaW5hdG9yLmV4ZWMoIHNvRmFyICkgKSApIHtcblx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0dG9rZW5zLnB1c2goIHtcblx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cblx0XHRcdFx0Ly8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlXG5cdFx0XHRcdHR5cGU6IG1hdGNoWyAwIF0ucmVwbGFjZSggcnRyaW1DU1MsIFwiIFwiIClcblx0XHRcdH0gKTtcblx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmlsdGVyc1xuXHRcdGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7XG5cdFx0XHRpZiAoICggbWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApICkgJiYgKCAhcHJlRmlsdGVyc1sgdHlwZSBdIHx8XG5cdFx0XHRcdCggbWF0Y2ggPSBwcmVGaWx0ZXJzWyB0eXBlIF0oIG1hdGNoICkgKSApICkge1xuXHRcdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goIHtcblx0XHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRcdG1hdGNoZXM6IG1hdGNoXG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0aWYgKCBwYXJzZU9ubHkgKSB7XG5cdFx0cmV0dXJuIHNvRmFyLmxlbmd0aDtcblx0fVxuXG5cdHJldHVybiBzb0ZhciA/XG5cdFx0ZmluZC5lcnJvciggc2VsZWN0b3IgKSA6XG5cblx0XHQvLyBDYWNoZSB0aGUgdG9rZW5zXG5cdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59XG5cbmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0c2VsZWN0b3IgPSBcIlwiO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRzZWxlY3RvciArPSB0b2tlbnNbIGkgXS52YWx1ZTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7XG5cdHZhciBkaXIgPSBjb21iaW5hdG9yLmRpcixcblx0XHRza2lwID0gY29tYmluYXRvci5uZXh0LFxuXHRcdGtleSA9IHNraXAgfHwgZGlyLFxuXHRcdGNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGtleSA9PT0gXCJwYXJlbnROb2RlXCIsXG5cdFx0ZG9uZU5hbWUgPSBkb25lKys7XG5cblx0cmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgP1xuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSA6XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGFsbCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudHNcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIG9sZENhY2hlLCBvdXRlckNhY2hlLFxuXHRcdFx0XHRuZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTtcblxuXHRcdFx0Ly8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gY29tYmluYXRvciBjYWNoaW5nXG5cdFx0XHRpZiAoIHhtbCApIHtcblx0XHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gZWxlbVsgZXhwYW5kbyBdIHx8ICggZWxlbVsgZXhwYW5kbyBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBza2lwICYmIG5vZGVOYW1lKCBlbGVtLCBza2lwICkgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0gPSBlbGVtWyBkaXIgXSB8fCBlbGVtO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggKCBvbGRDYWNoZSA9IG91dGVyQ2FjaGVbIGtleSBdICkgJiZcblx0XHRcdFx0XHRcdFx0b2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKCBuZXdDYWNoZVsgMiBdID0gb2xkQ2FjaGVbIDIgXSApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBSZXVzZSBuZXdjYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nXG5cdFx0XHRcdFx0XHRcdGlmICggKCBuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1sgaSBdKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gOlxuXHRcdG1hdGNoZXJzWyAwIF07XG59XG5cbmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0ZmluZCggc2VsZWN0b3IsIGNvbnRleHRzWyBpIF0sIHJlc3VsdHMgKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHtcblx0dmFyIGVsZW0sXG5cdFx0bmV3VW5tYXRjaGVkID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bGVuID0gdW5tYXRjaGVkLmxlbmd0aCxcblx0XHRtYXBwZWQgPSBtYXAgIT0gbnVsbDtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoICggZWxlbSA9IHVubWF0Y2hlZFsgaSBdICkgKSB7XG5cdFx0XHRpZiAoICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0bmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0aWYgKCBtYXBwZWQgKSB7XG5cdFx0XHRcdFx0bWFwLnB1c2goIGkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBuZXdVbm1hdGNoZWQ7XG59XG5cbmZ1bmN0aW9uIHNldE1hdGNoZXIoIHByZUZpbHRlciwgc2VsZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApIHtcblx0aWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTtcblx0fVxuXHRpZiAoIHBvc3RGaW5kZXIgJiYgIXBvc3RGaW5kZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmluZGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICk7XG5cdH1cblx0cmV0dXJuIG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSwgbWF0Y2hlck91dCxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fFxuXHRcdFx0XHRtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIixcblx0XHRcdFx0XHRjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250ZXh0LCBbXSApLFxuXG5cdFx0XHQvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb25cblx0XHRcdG1hdGNoZXJJbiA9IHByZUZpbHRlciAmJiAoIHNlZWQgfHwgIXNlbGVjdG9yICkgP1xuXHRcdFx0XHRjb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6XG5cdFx0XHRcdGVsZW1zO1xuXG5cdFx0aWYgKCBtYXRjaGVyICkge1xuXG5cdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlclxuXHRcdFx0Ly8gb3IgcHJlZXhpc3RpbmcgcmVzdWx0cyxcblx0XHRcdG1hdGNoZXJPdXQgPSBwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0Ly8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFtdIDpcblxuXHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0cmVzdWx0cztcblxuXHRcdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRcdG1hdGNoZXIoIG1hdGNoZXJJbiwgbWF0Y2hlck91dCwgY29udGV4dCwgeG1sICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBtYXRjaGVySW47XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcG9zdEZpbHRlclxuXHRcdGlmICggcG9zdEZpbHRlciApIHtcblx0XHRcdHRlbXAgPSBjb25kZW5zZSggbWF0Y2hlck91dCwgcG9zdE1hcCApO1xuXHRcdFx0cG9zdEZpbHRlciggdGVtcCwgW10sIGNvbnRleHQsIHhtbCApO1xuXG5cdFx0XHQvLyBVbi1tYXRjaCBmYWlsaW5nIGVsZW1lbnRzIGJ5IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0Y2hlckluXG5cdFx0XHRpID0gdGVtcC5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAoIGVsZW0gPSB0ZW1wWyBpIF0gKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwWyBpIF0gXSA9ICEoIG1hdGNoZXJJblsgcG9zdE1hcFsgaSBdIF0gPSBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cblx0XHRcdFx0XHQvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHNcblx0XHRcdFx0XHR0ZW1wID0gW107XG5cdFx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSBtYXRjaGVyT3V0WyBpIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaFxuXHRcdFx0XHRcdFx0XHR0ZW1wLnB1c2goICggbWF0Y2hlckluWyBpIF0gPSBlbGVtICkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKCBtYXRjaGVyT3V0ID0gW10gKSwgdGVtcCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBNb3ZlIG1hdGNoZWQgZWxlbWVudHMgZnJvbSBzZWVkIHRvIHJlc3VsdHMgdG8ga2VlcCB0aGVtIHN5bmNocm9uaXplZFxuXHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdGlmICggKCBlbGVtID0gbWF0Y2hlck91dFsgaSBdICkgJiZcblx0XHRcdFx0XHRcdCggdGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mLmNhbGwoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFsgaSBdICkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFsgdGVtcCBdID0gISggcmVzdWx0c1sgdGVtcCBdID0gZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHtcblx0dmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaixcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdGxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1sgMCBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIFwiIFwiIF0sXG5cdFx0aSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLFxuXG5cdFx0Ly8gVGhlIGZvdW5kYXRpb25hbCBtYXRjaGVyIGVuc3VyZXMgdGhhdCBlbGVtZW50cyBhcmUgcmVhY2hhYmxlIGZyb20gdG9wLWxldmVsIGNvbnRleHQocylcblx0XHRtYXRjaENvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBjaGVja0NvbnRleHQ7XG5cdFx0fSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLFxuXHRcdG1hdGNoQW55Q29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHR2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoIGNoZWNrQ29udGV4dCA9IGNvbnRleHQgKS5ub2RlVHlwZSA/XG5cdFx0XHRcdFx0bWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6XG5cdFx0XHRcdFx0bWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApO1xuXG5cdFx0XHQvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudFxuXHRcdFx0Ly8gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9pc3N1ZXMvMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKCBtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyBpIF0udHlwZSBdICkgKSB7XG5cdFx0XHRtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvciggZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksIG1hdGNoZXIgKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1sgaSBdLnR5cGUgXS5hcHBseSggbnVsbCwgdG9rZW5zWyBpIF0ubWF0Y2hlcyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlclxuXHRcdFx0aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyBqIF0udHlwZSBdICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBzZXRNYXRjaGVyKFxuXHRcdFx0XHRcdGkgPiAxICYmIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLFxuXHRcdFx0XHRcdGkgPiAxICYmIHRvU2VsZWN0b3IoXG5cblx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgXG5cdFx0XHRcdFx0XHR0b2tlbnMuc2xpY2UoIDAsIGkgLSAxIClcblx0XHRcdFx0XHRcdFx0LmNvbmNhdCggeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0gKVxuXHRcdFx0XHRcdCkucmVwbGFjZSggcnRyaW1DU1MsIFwiJDFcIiApLFxuXHRcdFx0XHRcdG1hdGNoZXIsXG5cdFx0XHRcdFx0aSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKCB0b2tlbnMgPSB0b2tlbnMuc2xpY2UoIGogKSApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cblx0XHRcdFx0Ly8gV2UgbXVzdCBhbHdheXMgaGF2ZSBlaXRoZXIgc2VlZCBlbGVtZW50cyBvciBvdXRlcm1vc3QgY29udGV4dFxuXHRcdFx0XHRlbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZC5UQUcoIFwiKlwiLCBvdXRlcm1vc3QgKSxcblxuXHRcdFx0XHQvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlclxuXHRcdFx0XHRkaXJydW5zVW5pcXVlID0gKCBkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSApLFxuXHRcdFx0XHRsZW4gPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09IGRvY3VtZW50IHx8IGNvbnRleHQgfHwgb3V0ZXJtb3N0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgZWxlbWVudHMgcGFzc2luZyBlbGVtZW50TWF0Y2hlcnMgZGlyZWN0bHkgdG8gcmVzdWx0c1xuXHRcdFx0Ly8gU3VwcG9ydDogaU9TIDw9NyAtIDkgb25seVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nXG5cdFx0XHQvLyBlbGVtZW50cyBieSBpZC4gKHNlZSB0cmFjLTE0MTQyKVxuXHRcdFx0Zm9yICggOyBpICE9PSBsZW4gJiYgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHtcblx0XHRcdFx0XHRqID0gMDtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT0gZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHRcdFx0XHRcdFx0eG1sID0gIWRvY3VtZW50SXNIVE1MO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR3aGlsZSAoICggbWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1sgaisrIF0gKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHB1c2guY2FsbCggcmVzdWx0cywgZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzXG5cdFx0XHRcdGlmICggYnlTZXQgKSB7XG5cblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtICkgKSB7XG5cdFx0XHRcdFx0XHRtYXRjaGVkQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90XG5cdFx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdFx0dW5tYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gbWFrZXMgdGhlIGxhdHRlciBub25uZWdhdGl2ZS5cblx0XHRcdG1hdGNoZWRDb3VudCArPSBpO1xuXG5cdFx0XHQvLyBBcHBseSBzZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVudHNcblx0XHRcdC8vIE5PVEU6IFRoaXMgY2FuIGJlIHNraXBwZWQgaWYgdGhlcmUgYXJlIG5vIHVubWF0Y2hlZCBlbGVtZW50cyAoaS5lLiwgYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZVxuXHRcdFx0Ly8gbm8gZWxlbWVudCBtYXRjaGVycyBhbmQgbm8gc2VlZC5cblx0XHRcdC8vIEluY3JlbWVudGluZyBhbiBpbml0aWFsbHktc3RyaW5nIFwiMFwiIGBpYCBhbGxvd3MgYGlgIHRvIHJlbWFpbiBhIHN0cmluZyBvbmx5IGluIHRoYXRcblx0XHRcdC8vIGNhc2UsIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgXCIwMFwiIGBtYXRjaGVkQ291bnRgIHRoYXQgZGlmZmVycyBmcm9tIGBpYCBidXQgaXMgYWxzb1xuXHRcdFx0Ly8gbnVtZXJpY2FsbHkgemVyby5cblx0XHRcdGlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkge1xuXHRcdFx0XHRqID0gMDtcblx0XHRcdFx0d2hpbGUgKCAoIG1hdGNoZXIgPSBzZXRNYXRjaGVyc1sgaisrIF0gKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXG5cdFx0XHRcdFx0Ly8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZ1xuXHRcdFx0XHRcdGlmICggbWF0Y2hlZENvdW50ID4gMCApIHtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoICEoIHVubWF0Y2hlZFsgaSBdIHx8IHNldE1hdGNoZWRbIGkgXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHNldE1hdGNoZWRbIGkgXSA9IHBvcC5jYWxsKCByZXN1bHRzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlc1xuXHRcdFx0XHRcdHNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0c1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7XG5cblx0XHRcdFx0Ly8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nXG5cdFx0XHRcdGlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdCggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnNcblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bm1hdGNoZWQ7XG5cdFx0fTtcblxuXHRyZXR1cm4gYnlTZXQgP1xuXHRcdG1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOlxuXHRcdHN1cGVyTWF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cblx0XHQvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnRcblx0XHRpZiAoICFtYXRjaCApIHtcblx0XHRcdG1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0fVxuXHRcdGkgPSBtYXRjaC5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRjYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbIGkgXSApO1xuXHRcdFx0aWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0c2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FjaGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZSggc2VsZWN0b3IsXG5cdFx0XHRtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSApO1xuXG5cdFx0Ly8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uXG5cdFx0Y2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdH1cblx0cmV0dXJuIGNhY2hlZDtcbn1cblxuLyoqXG4gKiBBIGxvdy1sZXZlbCBzZWxlY3Rpb24gZnVuY3Rpb24gdGhhdCB3b3JrcyB3aXRoIGpRdWVyeSdzIGNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uIGJ1aWx0IHdpdGggalF1ZXJ5IHNlbGVjdG9yIGNvbXBpbGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gY29udGV4dFxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdXG4gKiBAcGFyYW0ge0FycmF5fSBbc2VlZF0gQSBzZXQgb2YgZWxlbWVudHMgdG8gbWF0Y2ggYWdhaW5zdFxuICovXG5mdW5jdGlvbiBzZWxlY3QoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgaSwgdG9rZW5zLCB0b2tlbiwgdHlwZSwgZmluZCxcblx0XHRjb21waWxlZCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICYmIHNlbGVjdG9yLFxuXHRcdG1hdGNoID0gIXNlZWQgJiYgdG9rZW5pemUoICggc2VsZWN0b3IgPSBjb21waWxlZC5zZWxlY3RvciB8fCBzZWxlY3RvciApICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbIDAgXSA9IG1hdGNoWyAwIF0uc2xpY2UoIDAgKTtcblx0XHRpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICggdG9rZW4gPSB0b2tlbnNbIDAgXSApLnR5cGUgPT09IFwiSURcIiAmJlxuXHRcdFx0XHRjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1MICYmIEV4cHIucmVsYXRpdmVbIHRva2Vuc1sgMSBdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kLklEKFxuXHRcdFx0XHR0b2tlbi5tYXRjaGVzWyAwIF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0Y29udGV4dFxuXHRcdFx0KSB8fCBbXSApWyAwIF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1sgaSBdO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICggdHlwZSA9IHRva2VuLnR5cGUgKSBdICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggKCBmaW5kID0gRXhwci5maW5kWyB0eXBlIF0gKSApIHtcblxuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoIHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbIDAgXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1sgMCBdLnR5cGUgKSAmJlxuXHRcdFx0XHRcdFx0dGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0XHRcdFx0KSApICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0IWNvbnRleHQgfHwgcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCAtIDQuMStcbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KCBcIlwiICkuc29ydCggc29ydE9yZGVyICkuam9pbiggXCJcIiApID09PSBleHBhbmRvO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgLSA0LjErXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cblx0Ly8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpXG5cdHJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJmaWVsZHNldFwiICkgKSAmIDE7XG59ICk7XG5cbmpRdWVyeS5maW5kID0gZmluZDtcblxuLy8gRGVwcmVjYXRlZFxualF1ZXJ5LmV4cHJbIFwiOlwiIF0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xualF1ZXJ5LnVuaXF1ZSA9IGpRdWVyeS51bmlxdWVTb3J0O1xuXG4vLyBUaGVzZSBoYXZlIGFsd2F5cyBiZWVuIHByaXZhdGUsIGJ1dCB0aGV5IHVzZWQgdG8gYmUgZG9jdW1lbnRlZCBhcyBwYXJ0IG9mXG4vLyBTaXp6bGUgc28gbGV0J3MgbWFpbnRhaW4gdGhlbSBmb3Igbm93IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbmZpbmQuY29tcGlsZSA9IGNvbXBpbGU7XG5maW5kLnNlbGVjdCA9IHNlbGVjdDtcbmZpbmQuc2V0RG9jdW1lbnQgPSBzZXREb2N1bWVudDtcbmZpbmQudG9rZW5pemUgPSB0b2tlbml6ZTtcblxuZmluZC5lc2NhcGUgPSBqUXVlcnkuZXNjYXBlU2VsZWN0b3I7XG5maW5kLmdldFRleHQgPSBqUXVlcnkudGV4dDtcbmZpbmQuaXNYTUwgPSBqUXVlcnkuaXNYTUxEb2M7XG5maW5kLnNlbGVjdG9ycyA9IGpRdWVyeS5leHByO1xuZmluZC5zdXBwb3J0ID0galF1ZXJ5LnN1cHBvcnQ7XG5maW5kLnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlU29ydDtcblxuXHQvKiBlc2xpbnQtZW5hYmxlICovXG5cbn0gKSgpO1xuXG5cbnZhciBkaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHtcblx0dmFyIG1hdGNoZWQgPSBbXSxcblx0XHR0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7XG5cblx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7XG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0aWYgKCB0cnVuY2F0ZSAmJiBqUXVlcnkoIGVsZW0gKS5pcyggdW50aWwgKSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRtYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBzaWJsaW5ncyA9IGZ1bmN0aW9uKCBuLCBlbGVtICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdO1xuXG5cdGZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7XG5cdFx0aWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7XG5cdFx0XHRtYXRjaGVkLnB1c2goIG4gKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHJuZWVkc0NvbnRleHQgPSBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7XG5cbnZhciByc2luZ2xlVGFnID0gKCAvXjwoW2Etel1bXlxcL1xcMD46XFx4MjBcXHRcXHJcXG5cXGZdKilbXFx4MjBcXHRcXHJcXG5cXGZdKlxcLz8+KD86PFxcL1xcMT58KSQvaSApO1xuXG5cblxuLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3RcbmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkge1xuXHRpZiAoIGlzRnVuY3Rpb24oIHF1YWxpZmllciApICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIFNpbmdsZSBlbGVtZW50XG5cdGlmICggcXVhbGlmaWVyLm5vZGVUeXBlICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICggZWxlbSA9PT0gcXVhbGlmaWVyICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBBcnJheWxpa2Ugb2YgZWxlbWVudHMgKGpRdWVyeSwgYXJndW1lbnRzLCBBcnJheSlcblx0aWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBGaWx0ZXJlZCBkaXJlY3RseSBmb3IgYm90aCBzaW1wbGUgYW5kIGNvbXBsZXggc2VsZWN0b3JzXG5cdHJldHVybiBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzLCBub3QgKTtcbn1cblxualF1ZXJ5LmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkge1xuXHR2YXIgZWxlbSA9IGVsZW1zWyAwIF07XG5cblx0aWYgKCBub3QgKSB7XG5cdFx0ZXhwciA9IFwiOm5vdChcIiArIGV4cHIgKyBcIilcIjtcblx0fVxuXG5cdGlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzKCBleHByLCBqUXVlcnkuZ3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxO1xuXHR9ICkgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBpLCByZXQsXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdHNlbGYgPSB0aGlzO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApICk7XG5cdFx0fVxuXG5cdFx0cmV0ID0gdGhpcy5wdXNoU3RhY2soIFtdICk7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIHJldCApIDogcmV0O1xuXHR9LFxuXHRmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIGZhbHNlICkgKTtcblx0fSxcblx0bm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTtcblx0fSxcblx0aXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gISF3aW5ub3coXG5cdFx0XHR0aGlzLFxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0XG5cdFx0XHQvLyBzbyAkKFwicDpmaXJzdFwiKS5pcyhcInA6bGFzdFwiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gXCJwXCIuXG5cdFx0XHR0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID9cblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0c2VsZWN0b3IgfHwgW10sXG5cdFx0XHRmYWxzZVxuXHRcdCkubGVuZ3RoO1xuXHR9XG59ICk7XG5cblxuLy8gSW5pdGlhbGl6ZSBhIGpRdWVyeSBvYmplY3RcblxuXG4vLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudClcbnZhciByb290alF1ZXJ5LFxuXG5cdC8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzXG5cdC8vIFByaW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoICh0cmFjLTk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICh0cmFjLTExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPClcblx0Ly8gU2hvcnRjdXQgc2ltcGxlICNpZCBjYXNlIGZvciBzcGVlZFxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKykpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5XG5cdFx0Ly8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKVxuXHRcdHJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7XG5cblx0XHQvLyBIYW5kbGUgSFRNTCBzdHJpbmdzXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRpZiAoIHNlbGVjdG9yWyAwIF0gPT09IFwiPFwiICYmXG5cdFx0XHRcdHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09IFwiPlwiICYmXG5cdFx0XHRcdHNlbGVjdG9yLmxlbmd0aCA+PSAzICkge1xuXG5cdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrXG5cdFx0XHRcdG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZFxuXHRcdFx0aWYgKCBtYXRjaCAmJiAoIG1hdGNoWyAxIF0gfHwgIWNvbnRleHQgKSApIHtcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcblx0XHRcdFx0aWYgKCBtYXRjaFsgMSBdICkge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDtcblxuXHRcdFx0XHRcdC8vIE9wdGlvbiB0byBydW4gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsbHkgbGV0IHRoZSBlcnJvciBiZSB0aHJvd24gaWYgcGFyc2VIVE1MIGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKFxuXHRcdFx0XHRcdFx0bWF0Y2hbIDEgXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsgMSBdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsgMiBdICk7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzWyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxuXHRcdFx0fSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGNvbnRleHQgfHwgcm9vdCApLmZpbmQoIHNlbGVjdG9yICk7XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KVxuXHRcdFx0Ly8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHQvLyBIQU5ETEU6ICQoRE9NRWxlbWVudClcblx0XHR9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHtcblx0XHRcdHRoaXNbIDAgXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiByb290LnJlYWR5ICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyb290LnJlYWR5KCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcblx0XHRcdGwgPSB0YXJnZXRzLmxlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHRhcmdldHMgPSB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiICYmIGpRdWVyeSggc2VsZWN0b3JzICk7XG5cblx0XHQvLyBQb3NpdGlvbmFsIHNlbGVjdG9ycyBuZXZlciBtYXRjaCwgc2luY2UgdGhlcmUncyBubyBfc2VsZWN0aW9uXyBjb250ZXh0XG5cdFx0aWYgKCAhcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSApIHtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zm9yICggY3VyID0gdGhpc1sgaSBdOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHRcdC8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50c1xuXHRcdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID9cblx0XHRcdFx0XHRcdHRhcmdldHMuaW5kZXgoIGN1ciApID4gLTEgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBqUXVlcnkjZmluZFxuXHRcdFx0XHRcdFx0Y3VyLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlU29ydChcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLmdldCgpLCBqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/XG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApXG5cdFx0KTtcblx0fVxufSApO1xuXG5mdW5jdGlvbiBzaWJsaW5nKCBjdXIsIGRpciApIHtcblx0d2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCgge1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgX2ksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIF9pLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIF9pLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRpZiAoIGVsZW0uY29udGVudERvY3VtZW50ICE9IG51bGwgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErXG5cdFx0XHQvLyA8b2JqZWN0PiBlbGVtZW50cyB3aXRoIG5vIGBkYXRhYCBhdHRyaWJ1dGUgaGFzIGFuIG9iamVjdFxuXHRcdFx0Ly8gYGNvbnRlbnREb2N1bWVudGAgd2l0aCBhIGBudWxsYCBwcm90b3R5cGUuXG5cdFx0XHRnZXRQcm90byggZWxlbS5jb250ZW50RG9jdW1lbnQgKSApIHtcblxuXHRcdFx0cmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50O1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seVxuXHRcdC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdFxuXHRcdC8vIGRvbid0IHN1cHBvcnQgaXQuXG5cdFx0aWYgKCBub2RlTmFtZSggZWxlbSwgXCJ0ZW1wbGF0ZVwiICkgKSB7XG5cdFx0XHRlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApO1xuXHR9XG59LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApO1xuXG5cdFx0aWYgKCBuYW1lLnNsaWNlKCAtNSApICE9PSBcIlVudGlsXCIgKSB7XG5cdFx0XHRzZWxlY3RvciA9IHVudGlsO1xuXHRcdH1cblxuXHRcdGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0bWF0Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldmVyc2Ugb3JkZXIgZm9yIHBhcmVudHMqIGFuZCBwcmV2LWRlcml2YXRpdmVzXG5cdFx0XHRpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQucmV2ZXJzZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApO1xuXHR9O1xufSApO1xudmFyIHJub3RodG1sd2hpdGUgPSAoIC9bXlxceDIwXFx0XFxyXFxuXFxmXSsvZyApO1xuXG5cblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXNcbmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cdHZhciBvYmplY3QgPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7XG5cdFx0b2JqZWN0WyBmbGFnIF0gPSB0cnVlO1xuXHR9ICk7XG5cdHJldHVybiBvYmplY3Q7XG59XG5cbi8qXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAqXG4gKlx0b3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvd1xuICpcdFx0XHR0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0XG4gKlxuICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmVcbiAqIFwiZmlyZWRcIiBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBQb3NzaWJsZSBvcHRpb25zOlxuICpcbiAqXHRvbmNlOlx0XHRcdHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0bWVtb3J5Olx0XHRcdHdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWRcbiAqXHRcdFx0XHRcdGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0IFwibWVtb3JpemVkXCJcbiAqXHRcdFx0XHRcdHZhbHVlcyAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHR1bmlxdWU6XHRcdFx0d2lsbCBlbnN1cmUgYSBjYWxsYmFjayBjYW4gb25seSBiZSBhZGRlZCBvbmNlIChubyBkdXBsaWNhdGUgaW4gdGhlIGxpc3QpXG4gKlxuICpcdHN0b3BPbkZhbHNlOlx0aW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlXG4gKlxuICovXG5qUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0Ly8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZFxuXHQvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpXG5cdG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0Y3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIDpcblx0XHRqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApO1xuXG5cdHZhciAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nXG5cdFx0ZmlyaW5nLFxuXG5cdFx0Ly8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHNcblx0XHRtZW1vcnksXG5cblx0XHQvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCB3YXMgYWxyZWFkeSBmaXJlZFxuXHRcdGZpcmVkLFxuXG5cdFx0Ly8gRmxhZyB0byBwcmV2ZW50IGZpcmluZ1xuXHRcdGxvY2tlZCxcblxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XG5cdFx0bGlzdCA9IFtdLFxuXG5cdFx0Ly8gUXVldWUgb2YgZXhlY3V0aW9uIGRhdGEgZm9yIHJlcGVhdGFibGUgbGlzdHNcblx0XHRxdWV1ZSA9IFtdLFxuXG5cdFx0Ly8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgYWRkL3JlbW92ZSBhcyBuZWVkZWQpXG5cdFx0ZmlyaW5nSW5kZXggPSAtMSxcblxuXHRcdC8vIEZpcmUgY2FsbGJhY2tzXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbmZvcmNlIHNpbmdsZS1maXJpbmdcblx0XHRcdGxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7XG5cblx0XHRcdC8vIEV4ZWN1dGUgY2FsbGJhY2tzIGZvciBhbGwgcGVuZGluZyBleGVjdXRpb25zLFxuXHRcdFx0Ly8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlc1xuXHRcdFx0ZmlyZWQgPSBmaXJpbmcgPSB0cnVlO1xuXHRcdFx0Zm9yICggOyBxdWV1ZS5sZW5ndGg7IGZpcmluZ0luZGV4ID0gLTEgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRcdHdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0Ly8gUnVuIGNhbGxiYWNrIGFuZCBjaGVjayBmb3IgZWFybHkgdGVybWluYXRpb25cblx0XHRcdFx0XHRpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIG1lbW9yeVsgMCBdLCBtZW1vcnlbIDEgXSApID09PSBmYWxzZSAmJlxuXHRcdFx0XHRcdFx0b3B0aW9ucy5zdG9wT25GYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSnVtcCB0byBlbmQgYW5kIGZvcmdldCB0aGUgZGF0YSBzbyAuYWRkIGRvZXNuJ3QgcmUtZmlyZVxuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aDtcblx0XHRcdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3JnZXQgdGhlIGRhdGEgaWYgd2UncmUgZG9uZSB3aXRoIGl0XG5cdFx0XHRpZiAoICFvcHRpb25zLm1lbW9yeSApIHtcblx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGZpcmluZyA9IGZhbHNlO1xuXG5cdFx0XHQvLyBDbGVhbiB1cCBpZiB3ZSdyZSBkb25lIGZpcmluZyBmb3IgZ29vZFxuXHRcdFx0aWYgKCBsb2NrZWQgKSB7XG5cblx0XHRcdFx0Ly8gS2VlcCBhbiBlbXB0eSBsaXN0IGlmIHdlIGhhdmUgZGF0YSBmb3IgZnV0dXJlIGFkZCBjYWxsc1xuXHRcdFx0XHRpZiAoIG1lbW9yeSApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCB0aGlzIG9iamVjdCBpcyBzcGVudFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxpc3QgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0XG5cdFx0c2VsZiA9IHtcblxuXHRcdFx0Ly8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdFxuXHRcdFx0YWRkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmdcblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBtZW1vcnkgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQoIGZ1bmN0aW9uIGFkZCggYXJncyApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0LnB1c2goIGFyZyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEluc3BlY3QgcmVjdXJzaXZlbHlcblx0XHRcdFx0XHRcdFx0XHRhZGQoIGFyZyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0fSApKCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdFxuXHRcdFx0cmVtb3ZlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHR2YXIgaW5kZXg7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRsaXN0LnNwbGljZSggaW5kZXgsIDEgKTtcblxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGZpcmluZyBpbmRleGVzXG5cdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkge1xuXHRcdFx0XHRcdFx0XHRmaXJpbmdJbmRleC0tO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxpc3QuXG5cdFx0XHQvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC5cblx0XHRcdGhhczogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRyZXR1cm4gZm4gP1xuXHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOlxuXHRcdFx0XHRcdGxpc3QubGVuZ3RoID4gMDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3Rcblx0XHRcdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmUgYW5kIC5hZGRcblx0XHRcdC8vIEFib3J0IGFueSBjdXJyZW50L3BlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0Ly8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzXG5cdFx0XHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGRpc2FibGVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFsaXN0O1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZVxuXHRcdFx0Ly8gQWxzbyBkaXNhYmxlIC5hZGQgdW5sZXNzIHdlIGhhdmUgbWVtb3J5IChzaW5jZSBpdCB3b3VsZCBoYXZlIG5vIGVmZmVjdClcblx0XHRcdC8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdGxvY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRpZiAoICFtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRsb2NrZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFsb2NrZWQ7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzXG5cdFx0XHRmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7XG5cdFx0XHRcdGlmICggIWxvY2tlZCApIHtcblx0XHRcdFx0XHRhcmdzID0gYXJncyB8fCBbXTtcblx0XHRcdFx0XHRhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdO1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGFyZ3MgKTtcblx0XHRcdFx0XHRpZiAoICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHNcblx0XHRcdGZpcmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2Vcblx0XHRcdGZpcmVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhZmlyZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRyZXR1cm4gc2VsZjtcbn07XG5cblxuZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7XG5cdHJldHVybiB2O1xufVxuZnVuY3Rpb24gVGhyb3dlciggZXggKSB7XG5cdHRocm93IGV4O1xufVxuXG5mdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkge1xuXHR2YXIgbWV0aG9kO1xuXG5cdHRyeSB7XG5cblx0XHQvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yXG5cdFx0aWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlICkuZG9uZSggcmVzb2x2ZSApLmZhaWwoIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgdGhlbmFibGVzXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS50aGVuICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7XG5cblx0XHQvLyBPdGhlciBub24tdGhlbmFibGVzXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOlxuXHRcdFx0Ly8gKiBmYWxzZTogWyB2YWx1ZSBdLnNsaWNlKCAwICkgPT4gcmVzb2x2ZSggdmFsdWUgKVxuXHRcdFx0Ly8gKiB0cnVlOiBbIHZhbHVlIF0uc2xpY2UoIDEgKSA9PiByZXNvbHZlKClcblx0XHRcdHJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTtcblx0XHR9XG5cblx0Ly8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zXG5cdC8vIFNpbmNlIGpRdWVyeS53aGVuIGRvZXNuJ3QgdW53cmFwIHRoZW5hYmxlcywgd2UgY2FuIHNraXAgdGhlIGV4dHJhIGNoZWNrcyBhcHBlYXJpbmcgaW5cblx0Ly8gRGVmZXJyZWQjdGhlbiB0byBjb25kaXRpb25hbGx5IHN1cHByZXNzIHJlamVjdGlvbi5cblx0fSBjYXRjaCAoIHZhbHVlICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgb25seVxuXHRcdC8vIFN0cmljdCBtb2RlIGZ1bmN0aW9ucyBpbnZva2VkIHdpdGhvdXQgLmNhbGwvLmFwcGx5IGdldCBnbG9iYWwtb2JqZWN0IGNvbnRleHRcblx0XHRyZWplY3QuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdICk7XG5cdH1cbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHtcblx0XHR2YXIgdHVwbGVzID0gW1xuXG5cdFx0XHRcdC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsXG5cdFx0XHRcdC8vIC4uLiAudGhlbiBoYW5kbGVycywgYXJndW1lbnQgaW5kZXgsIFtmaW5hbCBzdGF0ZV1cblx0XHRcdFx0WyBcIm5vdGlmeVwiLCBcInByb2dyZXNzXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksIDIgXSxcblx0XHRcdFx0WyBcInJlc29sdmVcIiwgXCJkb25lXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAwLCBcInJlc29sdmVkXCIgXSxcblx0XHRcdFx0WyBcInJlamVjdFwiLCBcImZhaWxcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDEsIFwicmVqZWN0ZWRcIiBdXG5cdFx0XHRdLFxuXHRcdFx0c3RhdGUgPSBcInBlbmRpbmdcIixcblx0XHRcdHByb21pc2UgPSB7XG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwiY2F0Y2hcIjogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRcdHJldHVybiBwcm9taXNlLnRoZW4oIG51bGwsIGZuICk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7XG5cdFx0XHRcdFx0dmFyIGZucyA9IGFyZ3VtZW50cztcblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBfaSwgdHVwbGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpXG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGlzRnVuY3Rpb24oIGZuc1sgdHVwbGVbIDQgXSBdICkgJiYgZm5zWyB0dXBsZVsgNCBdIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQucHJvZ3Jlc3MoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIubm90aWZ5IH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmRvbmUoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVzb2x2ZSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KVxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBpc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBvblByb2dyZXNzICkge1xuXHRcdFx0XHRcdHZhciBtYXhEZXB0aCA9IDA7XG5cdFx0XHRcdFx0ZnVuY3Rpb24gcmVzb2x2ZSggZGVwdGgsIGRlZmVycmVkLCBoYW5kbGVyLCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGhhdCA9IHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQsIHRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4zXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01OVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoIDwgbWF4RGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjFcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkID09PSBkZWZlcnJlZC5wcm9taXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoIFwiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uXCIgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbnMgMi4zLjMuMSwgMy41XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNzVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFJldHJpZXZlIGB0aGVuYCBvbmx5IG9uY2Vcblx0XHRcdFx0XHRcdFx0XHRcdHRoZW4gPSByZXR1cm5lZCAmJlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjaGVjayBvYmplY3RzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZW5hYmlsaXR5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggdHlwZW9mIHJldHVybmVkID09PSBcIm9iamVjdFwiIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJldHVybmVkID09PSBcImZ1bmN0aW9uXCIgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC50aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYSByZXR1cm5lZCB0aGVuYWJsZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gTm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGFsc28gaG9vayBpbnRvIHByb2dyZXNzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgZGlzcmVnYXJkIG9sZGVyIHJlc29sdXRpb24gdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWF4RGVwdGgrKztcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhbGwgb3RoZXIgcmV0dXJuZWQgdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyByZXR1cm5lZCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUHJvY2VzcyB0aGUgdmFsdWUocylcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmYXVsdCBwcm9jZXNzIGlzIHJlc29sdmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBub3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgY2F0Y2ggYW5kIHJlamVjdCBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcyA9IHNwZWNpYWwgP1xuXHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rKCBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLmVycm9yICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjQuMVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTYxXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIHBvc3QtcmVzb2x1dGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCArIDEgPj0gbWF4RGVwdGggKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyBlIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjFcblx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTdcblx0XHRcdFx0XHRcdFx0Ly8gUmUtcmVzb2x2ZSBwcm9taXNlcyBpbW1lZGlhdGVseSB0byBkb2RnZSBmYWxzZSByZWplY3Rpb24gZnJvbVxuXHRcdFx0XHRcdFx0XHQvLyBzdWJzZXF1ZW50IGVycm9yc1xuXHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIGVycm9yLCBpbiBjYXNlIG9mIGV4Y2VwdGlvblxuXHRcdFx0XHRcdFx0XHRcdC8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luY1xuXHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmdldEVycm9ySG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MuZXJyb3IgPSBqUXVlcnkuRGVmZXJyZWQuZ2V0RXJyb3JIb29rKCk7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgZGVwcmVjYXRlZCBhbGlhcyBvZiB0aGUgYWJvdmUuIFdoaWxlIHRoZSBuYW1lIHN1Z2dlc3RzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gcmV0dXJuaW5nIHRoZSBzdGFjaywgbm90IGFuIGVycm9yIGluc3RhbmNlLCBqUXVlcnkganVzdCBwYXNzZXNcblx0XHRcdFx0XHRcdFx0XHQvLyBpdCBkaXJlY3RseSB0byBgY29uc29sZS53YXJuYCBzbyBib3RoIHdpbGwgd29yazsgYW4gaW5zdGFuY2Vcblx0XHRcdFx0XHRcdFx0XHQvLyBqdXN0IGJldHRlciBjb29wZXJhdGVzIHdpdGggc291cmNlIG1hcHMuXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MuZXJyb3IgPSBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBwcm9jZXNzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXG5cdFx0XHRcdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uUHJvZ3Jlc3MgKSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRvblByb2dyZXNzIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLm5vdGlmeVdpdGhcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMSBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRvbkZ1bGZpbGxlZCA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHQvLyByZWplY3RlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDIgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uUmVqZWN0ZWQgKSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRvblJlamVjdGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdFRocm93ZXJcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9ICkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEdldCBhIHByb21pc2UgZm9yIHRoaXMgZGVmZXJyZWRcblx0XHRcdFx0Ly8gSWYgb2JqIGlzIHByb3ZpZGVkLCB0aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQgdG8gdGhlIG9iamVjdFxuXHRcdFx0XHRwcm9taXNlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdFx0XHRcdHJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlZmVycmVkID0ge307XG5cblx0XHQvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0dmFyIGxpc3QgPSB0dXBsZVsgMiBdLFxuXHRcdFx0XHRzdGF0ZVN0cmluZyA9IHR1cGxlWyA1IF07XG5cblx0XHRcdC8vIHByb21pc2UucHJvZ3Jlc3MgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5kb25lID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkXG5cdFx0XHRwcm9taXNlWyB0dXBsZVsgMSBdIF0gPSBsaXN0LmFkZDtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXG5cdFx0XHRpZiAoIHN0YXRlU3RyaW5nICkge1xuXHRcdFx0XHRsaXN0LmFkZChcblx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlc29sdmVkXCIgKGkuZS4sIGZ1bGZpbGxlZClcblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZWplY3RlZFwiXG5cdFx0XHRcdFx0XHRzdGF0ZSA9IHN0YXRlU3RyaW5nO1xuXHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHQvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyByZWplY3RlZF9oYW5kbGVycy5kaXNhYmxlXG5cdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmRpc2FibGVcblx0XHRcdFx0XHR0dXBsZXNbIDMgLSBpIF1bIDMgXS5kaXNhYmxlLFxuXG5cdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfY2FsbGJhY2tzLmxvY2tcblx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMiBdLmxvY2ssXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrXG5cdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDMgXS5sb2NrXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmZpcmVcblx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlXG5cdFx0XHQvLyByZWplY3RlZF9oYW5kbGVycy5maXJlXG5cdFx0XHRsaXN0LmFkZCggdHVwbGVbIDMgXS5maXJlICk7XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeSA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5ub3RpZnlXaXRoKC4uLikgfVxuXHRcdFx0Ly8gZGVmZXJyZWQucmVzb2x2ZSA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZXNvbHZlV2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfVxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oIHRoaXMgPT09IGRlZmVycmVkID8gdW5kZWZpbmVkIDogdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fTtcblxuXHRcdFx0Ly8gZGVmZXJyZWQubm90aWZ5V2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmVXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0Ly8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSA9IGxpc3QuZmlyZVdpdGg7XG5cdFx0fSApO1xuXG5cdFx0Ly8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlXG5cdFx0cHJvbWlzZS5wcm9taXNlKCBkZWZlcnJlZCApO1xuXG5cdFx0Ly8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueVxuXHRcdGlmICggZnVuYyApIHtcblx0XHRcdGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGRvbmUhXG5cdFx0cmV0dXJuIGRlZmVycmVkO1xuXHR9LFxuXG5cdC8vIERlZmVycmVkIGhlbHBlclxuXHR3aGVuOiBmdW5jdGlvbiggc2luZ2xlVmFsdWUgKSB7XG5cdFx0dmFyXG5cblx0XHRcdC8vIGNvdW50IG9mIHVuY29tcGxldGVkIHN1Ym9yZGluYXRlc1xuXHRcdFx0cmVtYWluaW5nID0gYXJndW1lbnRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gY291bnQgb2YgdW5wcm9jZXNzZWQgYXJndW1lbnRzXG5cdFx0XHRpID0gcmVtYWluaW5nLFxuXG5cdFx0XHQvLyBzdWJvcmRpbmF0ZSBmdWxmaWxsbWVudCBkYXRhXG5cdFx0XHRyZXNvbHZlQ29udGV4dHMgPSBBcnJheSggaSApLFxuXHRcdFx0cmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxuXG5cdFx0XHQvLyB0aGUgcHJpbWFyeSBEZWZlcnJlZFxuXHRcdFx0cHJpbWFyeSA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXG5cdFx0XHQvLyBzdWJvcmRpbmF0ZSBjYWxsYmFjayBmYWN0b3J5XG5cdFx0XHR1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZUNvbnRleHRzWyBpIF0gPSB0aGlzO1xuXHRcdFx0XHRcdHJlc29sdmVWYWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7XG5cdFx0XHRcdFx0XHRwcmltYXJ5LnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0Ly8gU2luZ2xlLSBhbmQgZW1wdHkgYXJndW1lbnRzIGFyZSBhZG9wdGVkIGxpa2UgUHJvbWlzZS5yZXNvbHZlXG5cdFx0aWYgKCByZW1haW5pbmcgPD0gMSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHNpbmdsZVZhbHVlLCBwcmltYXJ5LmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIHByaW1hcnkucmVqZWN0LFxuXHRcdFx0XHQhcmVtYWluaW5nICk7XG5cblx0XHRcdC8vIFVzZSAudGhlbigpIHRvIHVud3JhcCBzZWNvbmRhcnkgdGhlbmFibGVzIChjZi4gZ2gtMzAwMClcblx0XHRcdGlmICggcHJpbWFyeS5zdGF0ZSgpID09PSBcInBlbmRpbmdcIiB8fFxuXHRcdFx0XHRpc0Z1bmN0aW9uKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgcmVzb2x2ZVZhbHVlc1sgaSBdLnRoZW4gKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gcHJpbWFyeS50aGVuKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBhZ2dyZWdhdGVkIGxpa2UgUHJvbWlzZS5hbGwgYXJyYXkgZWxlbWVudHNcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBwcmltYXJ5LnJlamVjdCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcmltYXJ5LnByb21pc2UoKTtcblx0fVxufSApO1xuXG5cbi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LFxuLy8gd2FybiBhYm91dCB0aGVtIEFTQVAgcmF0aGVyIHRoYW4gc3dhbGxvd2luZyB0aGVtIGJ5IGRlZmF1bHQuXG52YXIgcmVycm9yTmFtZXMgPSAvXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztcblxuLy8gSWYgYGpRdWVyeS5EZWZlcnJlZC5nZXRFcnJvckhvb2tgIGlzIGRlZmluZWQsIGBhc3luY0Vycm9yYCBpcyBhbiBlcnJvclxuLy8gY2FwdHVyZWQgYmVmb3JlIHRoZSBhc3luYyBiYXJyaWVyIHRvIGdldCB0aGUgb3JpZ2luYWwgZXJyb3IgY2F1c2Vcbi8vIHdoaWNoIG1heSBvdGhlcndpc2UgYmUgaGlkZGVuLlxualF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sgPSBmdW5jdGlvbiggZXJyb3IsIGFzeW5jRXJyb3IgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgOCAtIDkgb25seVxuXHQvLyBDb25zb2xlIGV4aXN0cyB3aGVuIGRldiB0b29scyBhcmUgb3Blbiwgd2hpY2ggY2FuIGhhcHBlbiBhdCBhbnkgdGltZVxuXHRpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLndhcm4gJiYgZXJyb3IgJiYgcmVycm9yTmFtZXMudGVzdCggZXJyb3IubmFtZSApICkge1xuXHRcdHdpbmRvdy5jb25zb2xlLndhcm4oIFwialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogXCIgKyBlcnJvci5tZXNzYWdlLFxuXHRcdFx0ZXJyb3Iuc3RhY2ssIGFzeW5jRXJyb3IgKTtcblx0fVxufTtcblxuXG5cblxualF1ZXJ5LnJlYWR5RXhjZXB0aW9uID0gZnVuY3Rpb24oIGVycm9yICkge1xuXHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0dGhyb3cgZXJyb3I7XG5cdH0gKTtcbn07XG5cblxuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cblx0cmVhZHlMaXN0XG5cdFx0LnRoZW4oIGZuIClcblxuXHRcdC8vIFdyYXAgalF1ZXJ5LnJlYWR5RXhjZXB0aW9uIGluIGEgZnVuY3Rpb24gc28gdGhhdCB0aGUgbG9va3VwXG5cdFx0Ly8gaGFwcGVucyBhdCB0aGUgdGltZSBvZiBlcnJvciBoYW5kbGluZyBpbnN0ZWFkIG9mIGNhbGxiYWNrXG5cdFx0Ly8gcmVnaXN0cmF0aW9uLlxuXHRcdC5jYXRjaCggZnVuY3Rpb24oIGVycm9yICkge1xuXHRcdFx0alF1ZXJ5LnJlYWR5RXhjZXB0aW9uKCBlcnJvciApO1xuXHRcdH0gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlIHRyYWMtNjc4MVxuXHRyZWFkeVdhaXQ6IDEsXG5cblx0Ly8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeVxuXHRyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7XG5cblx0XHQvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5XG5cdFx0aWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmVtZW1iZXIgdGhhdCB0aGUgRE9NIGlzIHJlYWR5XG5cdFx0alF1ZXJ5LmlzUmVhZHkgPSB0cnVlO1xuXG5cdFx0Ly8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmVcblx0XHRpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlXG5cdFx0cmVhZHlMaXN0LnJlc29sdmVXaXRoKCBkb2N1bWVudCwgWyBqUXVlcnkgXSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5yZWFkeS50aGVuID0gcmVhZHlMaXN0LnRoZW47XG5cbi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kXG5mdW5jdGlvbiBjb21wbGV0ZWQoKSB7XG5cdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBjb21wbGV0ZWQgKTtcblx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQgKTtcblx0alF1ZXJ5LnJlYWR5KCk7XG59XG5cbi8vIENhdGNoIGNhc2VzIHdoZXJlICQoZG9jdW1lbnQpLnJlYWR5KCkgaXMgY2FsbGVkXG4vLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC5cbi8vIFN1cHBvcnQ6IElFIDw9OSAtIDEwIG9ubHlcbi8vIE9sZGVyIElFIHNvbWV0aW1lcyBzaWduYWxzIFwiaW50ZXJhY3RpdmVcIiB0b28gc29vblxuaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgfHxcblx0KCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSBcImxvYWRpbmdcIiAmJiAhZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICkgKSB7XG5cblx0Ly8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTtcblxufSBlbHNlIHtcblxuXHQvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrXG5cdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBjb21wbGV0ZWQgKTtcblxuXHQvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29ya1xuXHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xufVxuXG5cblxuXG4vLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb25cbi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvblxudmFyIGFjY2VzcyA9IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGVsZW1zLmxlbmd0aCxcblx0XHRidWxrID0ga2V5ID09IG51bGw7XG5cblx0Ly8gU2V0cyBtYW55IHZhbHVlc1xuXHRpZiAoIHRvVHlwZSgga2V5ICkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblx0XHRmb3IgKCBpIGluIGtleSApIHtcblx0XHRcdGFjY2VzcyggZWxlbXMsIGZuLCBpLCBrZXlbIGkgXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApO1xuXHRcdH1cblxuXHQvLyBTZXRzIG9uZSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cblx0XHRpZiAoICFpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmF3ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGJ1bGsgKSB7XG5cblx0XHRcdC8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldFxuXHRcdFx0aWYgKCByYXcgKSB7XG5cdFx0XHRcdGZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApO1xuXHRcdFx0XHRmbiA9IG51bGw7XG5cblx0XHRcdC8vIC4uLmV4Y2VwdCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvbiB2YWx1ZXNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ1bGsgPSBmbjtcblx0XHRcdFx0Zm4gPSBmdW5jdGlvbiggZWxlbSwgX2tleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbihcblx0XHRcdFx0XHRlbGVtc1sgaSBdLCBrZXksIHJhdyA/XG5cdFx0XHRcdFx0XHR2YWx1ZSA6XG5cdFx0XHRcdFx0XHR2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggY2hhaW5hYmxlICkge1xuXHRcdHJldHVybiBlbGVtcztcblx0fVxuXG5cdC8vIEdldHNcblx0aWYgKCBidWxrICkge1xuXHRcdHJldHVybiBmbi5jYWxsKCBlbGVtcyApO1xuXHR9XG5cblx0cmV0dXJuIGxlbiA/IGZuKCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcblxuXG4vLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmdcbnZhciBybXNQcmVmaXggPSAvXi1tcy0vLFxuXHRyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7XG5cbi8vIFVzZWQgYnkgY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKVxuZnVuY3Rpb24gZmNhbWVsQ2FzZSggX2FsbCwgbGV0dGVyICkge1xuXHRyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXNcbi8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcbi8vIE1pY3Jvc29mdCBmb3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICh0cmFjLTk1NzIpXG5mdW5jdGlvbiBjYW1lbENhc2UoIHN0cmluZyApIHtcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG59XG52YXIgYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0cmV0dXJuIG93bmVyLm5vZGVUeXBlID09PSAxIHx8IG93bmVyLm5vZGVUeXBlID09PSA5IHx8ICEoICtvd25lci5ub2RlVHlwZSApO1xufTtcblxuXG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0dGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrO1xufVxuXG5EYXRhLnVpZCA9IDE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXG5cdGNhY2hlOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGVcblx0XHR2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHZhbHVlID0ge307XG5cblx0XHRcdC8vIFdlIGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJzLFxuXHRcdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSB0cmFjLTgzMzUuXG5cdFx0XHQvLyBBbHdheXMgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC5cblx0XHRcdGlmICggYWNjZXB0RGF0YSggb3duZXIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3RyaW5naWZ5LWVkIG9yIGxvb3BlZCBvdmVyXG5cdFx0XHRcdC8vIHVzZSBwbGFpbiBhc3NpZ25tZW50XG5cdFx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5XG5cdFx0XHRcdC8vIGNvbmZpZ3VyYWJsZSBtdXN0IGJlIHRydWUgdG8gYWxsb3cgdGhlIHByb3BlcnR5IHRvIGJlXG5cdFx0XHRcdC8vIGRlbGV0ZWQgd2hlbiBkYXRhIGlzIHJlbW92ZWRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHtcblx0XHRcdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblx0c2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkge1xuXHRcdHZhciBwcm9wLFxuXHRcdFx0Y2FjaGUgPSB0aGlzLmNhY2hlKCBvd25lciApO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJnc1xuXHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Y2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3Rcblx0XHRcdGZvciAoIHByb3AgaW4gZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZTtcblx0fSxcblx0Z2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcy5jYWNoZSggb3duZXIgKSA6XG5cblx0XHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTtcblx0fSxcblx0YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBJbiBjYXNlcyB3aGVyZSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkXG5cdFx0Ly8gICAyLiBBIHN0cmluZyBrZXkgd2FzIHNwZWNpZmllZCwgYnV0IG5vIHZhbHVlIHByb3ZpZGVkXG5cdFx0Ly9cblx0XHQvLyBUYWtlIHRoZSBcInJlYWRcIiBwYXRoIGFuZCBhbGxvdyB0aGUgZ2V0IG1ldGhvZCB0byBkZXRlcm1pbmVcblx0XHQvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIFRoZSBlbnRpcmUgY2FjaGUgb2JqZWN0XG5cdFx0Ly8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleVxuXHRcdC8vXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmdldCggb3duZXIsIGtleSApO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gdGhlIGtleSBpcyBub3QgYSBzdHJpbmcsIG9yIGJvdGggYSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly8gYXJlIHNwZWNpZmllZCwgc2V0IG9yIGV4dGVuZCAoZXhpc3Rpbmcgb2JqZWN0cykgd2l0aCBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzXG5cdFx0Ly8gICAyLiBBIGtleSBhbmQgdmFsdWVcblx0XHQvL1xuXHRcdHRoaXMuc2V0KCBvd25lciwga2V5LCB2YWx1ZSApO1xuXG5cdFx0Ly8gU2luY2UgdGhlIFwic2V0XCIgcGF0aCBjYW4gaGF2ZSB0d28gcG9zc2libGUgZW50cnkgcG9pbnRzXG5cdFx0Ly8gcmV0dXJuIHRoZSBleHBlY3RlZCBkYXRhIGJhc2VkIG9uIHdoaWNoIHBhdGggd2FzIHRha2VuWypdXG5cdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtleTtcblx0fSxcblx0cmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHR2YXIgaSxcblx0XHRcdGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0aWYgKCBjYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgga2V5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGtleSApICkge1xuXG5cdFx0XHRcdC8vIElmIGtleSBpcyBhbiBhcnJheSBvZiBrZXlzLi4uXG5cdFx0XHRcdC8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LlxuXHRcdFx0XHRrZXkgPSBrZXkubWFwKCBjYW1lbENhc2UgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGtleSA9IGNhbWVsQ2FzZSgga2V5ICk7XG5cblx0XHRcdFx0Ly8gSWYgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0cywgdXNlIGl0LlxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIGNyZWF0ZSBhbiBhcnJheSBieSBtYXRjaGluZyBub24td2hpdGVzcGFjZVxuXHRcdFx0XHRrZXkgPSBrZXkgaW4gY2FjaGUgP1xuXHRcdFx0XHRcdFsga2V5IF0gOlxuXHRcdFx0XHRcdCgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTtcblx0XHRcdH1cblxuXHRcdFx0aSA9IGtleS5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRkZWxldGUgY2FjaGVbIGtleVsgaSBdIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NVxuXHRcdFx0Ly8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXNcblx0XHRcdC8vIGZyb20gRE9NIG5vZGVzLCBzbyBzZXQgdG8gdW5kZWZpbmVkIGluc3RlYWRcblx0XHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM3ODYwNyAoYnVnIHJlc3RyaWN0ZWQpXG5cdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aGFzRGF0YTogZnVuY3Rpb24oIG93bmVyICkge1xuXHRcdHZhciBjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRyZXR1cm4gY2FjaGUgIT09IHVuZGVmaW5lZCAmJiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICk7XG5cdH1cbn07XG52YXIgZGF0YVByaXYgPSBuZXcgRGF0YSgpO1xuXG52YXIgZGF0YVVzZXIgPSBuZXcgRGF0YSgpO1xuXG5cblxuLy9cdEltcGxlbWVudGF0aW9uIFN1bW1hcnlcbi8vXG4vL1x0MS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaFxuLy9cdDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZVxuLy9cdFx0cGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLlxuLy9cdDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgXCJwcml2YXRlXCIgYW5kIFwidXNlclwiIGRhdGEuXG4vL1x0NC4gX05ldmVyXyBleHBvc2UgXCJwcml2YXRlXCIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKVxuLy9cdDUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKVxuLy9cdDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNFxuXG52YXIgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFxuXHRybXVsdGlEYXNoID0gL1tBLVpdL2c7XG5cbmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7XG5cdGlmICggZGF0YSA9PT0gXCJ0cnVlXCIgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAoIGRhdGEgPT09IFwiZmFsc2VcIiApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpZiAoIGRhdGEgPT09IFwibnVsbFwiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmdcblx0aWYgKCBkYXRhID09PSArZGF0YSArIFwiXCIgKSB7XG5cdFx0cmV0dXJuICtkYXRhO1xuXHR9XG5cblx0aWYgKCByYnJhY2UudGVzdCggZGF0YSApICkge1xuXHRcdHJldHVybiBKU09OLnBhcnNlKCBkYXRhICk7XG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHtcblx0dmFyIG5hbWU7XG5cblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxuXHQvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGVcblx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRuYW1lID0gXCJkYXRhLVwiICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsIFwiLSQmXCIgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBnZXREYXRhKCBkYXRhICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlclxuXHRcdFx0ZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmhhc0RhdGEoIGVsZW0gKSB8fCBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICk7XG5cdH0sXG5cblx0ZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFVc2VyLnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9LFxuXG5cdC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkXG5cdC8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLlxuXHRfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdF9yZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBpLCBuYW1lLCBkYXRhLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBHZXRzIGFsbCB2YWx1ZXNcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSApO1xuXG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhZGF0YVByaXYuZ2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiICkgKSB7XG5cdFx0XHRcdFx0aSA9IGF0dHJzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0XHRcdFx0Ly8gVGhlIGF0dHJzIGVsZW1lbnRzIGNhbiBiZSBudWxsICh0cmFjLTE0ODk0KVxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyc1sgaSBdICkge1xuXHRcdFx0XHRcdFx0XHRuYW1lID0gYXR0cnNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5hbWUuaW5kZXhPZiggXCJkYXRhLVwiICkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH1cblxuXHRcdC8vIFNldHMgbXVsdGlwbGUgdmFsdWVzXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5ICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGRhdGE7XG5cblx0XHRcdC8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5XG5cdFx0XHQvLyAoYW5kIHRoZXJlZm9yZSBoYXMgYW4gZWxlbWVudCBhcHBlYXJzIGF0IHRoaXNbIDAgXSkgYW5kIHRoZVxuXHRcdFx0Ly8gYHZhbHVlYCBwYXJhbWV0ZXIgd2FzIG5vdCB1bmRlZmluZWQuIEFuIGVtcHR5IGpRdWVyeSBvYmplY3Rcblx0XHRcdC8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGxcblx0XHRcdC8vIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBhdHRlbXB0IHRvIHJlYWQgYSBkYXRhIGNhY2hlIGlzIG1hZGUuXG5cdFx0XHRpZiAoIGVsZW0gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlXG5cdFx0XHRcdC8vIFRoZSBrZXkgd2lsbCBhbHdheXMgYmUgY2FtZWxDYXNlZCBpbiBEYXRhXG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gXCJkaXNjb3ZlclwiIHRoZSBkYXRhIGluXG5cdFx0XHRcdC8vIEhUTUw1IGN1c3RvbSBkYXRhLSogYXR0cnNcblx0XHRcdFx0ZGF0YSA9IGRhdGFBdHRyKCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSB0cmllZCByZWFsbHkgaGFyZCwgYnV0IHRoZSBkYXRhIGRvZXNuJ3QgZXhpc3QuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHRoZSBkYXRhLi4uXG5cdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIFdlIGFsd2F5cyBzdG9yZSB0aGUgY2FtZWxDYXNlZCBrZXlcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXksIHZhbHVlICk7XG5cdFx0XHR9ICk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxLCBudWxsLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGRhdGFVc2VyLnJlbW92ZSggdGhpcywga2V5ICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHF1ZXVlO1xuXG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0dHlwZSA9ICggdHlwZSB8fCBcImZ4XCIgKSArIFwicXVldWVcIjtcblx0XHRcdHF1ZXVlID0gZGF0YVByaXYuZ2V0KCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXBcblx0XHRcdGlmICggZGF0YSApIHtcblx0XHRcdFx0aWYgKCAhcXVldWUgfHwgQXJyYXkuaXNBcnJheSggZGF0YSApICkge1xuXHRcdFx0XHRcdHF1ZXVlID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KCBkYXRhICkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBkYXRhICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBxdWV1ZSB8fCBbXTtcblx0XHR9XG5cdH0sXG5cblx0ZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksXG5cdFx0XHRzdGFydExlbmd0aCA9IHF1ZXVlLmxlbmd0aCxcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKSxcblx0XHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksXG5cdFx0XHRuZXh0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbFxuXHRcdGlmICggZm4gPT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0c3RhcnRMZW5ndGgtLTtcblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXG5cdFx0XHQvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nXG5cdFx0XHQvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiApIHtcblx0XHRcdFx0cXVldWUudW5zaGlmdCggXCJpbnByb2dyZXNzXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvblxuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRmbi5jYWxsKCBlbGVtLCBuZXh0LCBob29rcyApO1xuXHRcdH1cblxuXHRcdGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkge1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBOb3QgcHVibGljIC0gZ2VuZXJhdGUgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJuIHRoZSBjdXJyZW50IG9uZVxuXHRfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dmFyIGtleSA9IHR5cGUgKyBcInF1ZXVlSG9va3NcIjtcblx0XHRyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwge1xuXHRcdFx0ZW1wdHk6IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLmFkZCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgWyB0eXBlICsgXCJxdWV1ZVwiLCBrZXkgXSApO1xuXHRcdFx0fSApXG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBzZXR0ZXIgPSAyO1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGRhdGEgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IFwiZnhcIjtcblx0XHRcdHNldHRlci0tO1xuXHRcdH1cblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbIDAgXSwgdHlwZSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcyA6XG5cdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTtcblxuXHRcdFx0XHQvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZVxuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiAmJiBxdWV1ZVsgMCBdICE9PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdH0sXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHR9ICk7XG5cdH0sXG5cdGNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0fSxcblxuXHQvLyBHZXQgYSBwcm9taXNlIHJlc29sdmVkIHdoZW4gcXVldWVzIG9mIGEgY2VydGFpbiB0eXBlXG5cdC8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KVxuXHRwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkge1xuXHRcdHZhciB0bXAsXG5cdFx0XHRjb3VudCA9IDEsXG5cdFx0XHRkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0ZWxlbWVudHMgPSB0aGlzLFxuXHRcdFx0aSA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0cmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICEoIC0tY291bnQgKSApIHtcblx0XHRcdFx0XHRkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG9iaiA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArIFwicXVldWVIb29rc1wiICk7XG5cdFx0XHRpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7XG5cdFx0XHRcdGNvdW50Kys7XG5cdFx0XHRcdHRtcC5lbXB0eS5hZGQoIHJlc29sdmUgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzb2x2ZSgpO1xuXHRcdHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTtcblx0fVxufSApO1xudmFyIHBudW0gPSAoIC9bKy1dPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdWystXT9cXGQrfCkvICkuc291cmNlO1xuXG52YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoIFwiXig/OihbKy1dKT18KShcIiArIHBudW0gKyBcIikoW2EteiVdKikkXCIsIFwiaVwiICk7XG5cblxudmFyIGNzc0V4cGFuZCA9IFsgXCJUb3BcIiwgXCJSaWdodFwiLCBcIkJvdHRvbVwiLCBcIkxlZnRcIiBdO1xuXG52YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cblxuXHR2YXIgaXNBdHRhY2hlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cdFx0fSxcblx0XHRjb21wb3NlZCA9IHsgY29tcG9zZWQ6IHRydWUgfTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDEyIC0gMTgrLCBpT1MgMTAuMCAtIDEwLjIgb25seVxuXHQvLyBDaGVjayBhdHRhY2htZW50IGFjcm9zcyBzaGFkb3cgRE9NIGJvdW5kYXJpZXMgd2hlbiBwb3NzaWJsZSAoZ2gtMzUwNClcblx0Ly8gU3VwcG9ydDogaU9TIDEwLjAtMTAuMiBvbmx5XG5cdC8vIEVhcmx5IGlPUyAxMCB2ZXJzaW9ucyBzdXBwb3J0IGBhdHRhY2hTaGFkb3dgIGJ1dCBub3QgYGdldFJvb3ROb2RlYCxcblx0Ly8gbGVhZGluZyB0byBlcnJvcnMuIFdlIG5lZWQgdG8gY2hlY2sgZm9yIGBnZXRSb290Tm9kZWAuXG5cdGlmICggZG9jdW1lbnRFbGVtZW50LmdldFJvb3ROb2RlICkge1xuXHRcdGlzQXR0YWNoZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Um9vdE5vZGUoIGNvbXBvc2VkICkgPT09IGVsZW0ub3duZXJEb2N1bWVudDtcblx0XHR9O1xuXHR9XG52YXIgaXNIaWRkZW5XaXRoaW5UcmVlID0gZnVuY3Rpb24oIGVsZW0sIGVsICkge1xuXG5cdFx0Ly8gaXNIaWRkZW5XaXRoaW5UcmVlIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247XG5cdFx0Ly8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdpbGwgYmUgc2Vjb25kIGFyZ3VtZW50XG5cdFx0ZWxlbSA9IGVsIHx8IGVsZW07XG5cblx0XHQvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbFxuXHRcdHJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8XG5cdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwiXCIgJiZcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlLCBjaGVjayBjb21wdXRlZCBzdHlsZVxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTQzIC0gNDVcblx0XHRcdC8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpc1xuXHRcdFx0Ly8gaW4gdGhlIGRvY3VtZW50LlxuXHRcdFx0aXNBdHRhY2hlZCggZWxlbSApICYmXG5cblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiO1xuXHR9O1xuXG5cblxuZnVuY3Rpb24gYWRqdXN0Q1NTKCBlbGVtLCBwcm9wLCB2YWx1ZVBhcnRzLCB0d2VlbiApIHtcblx0dmFyIGFkanVzdGVkLCBzY2FsZSxcblx0XHRtYXhJdGVyYXRpb25zID0gMjAsXG5cdFx0Y3VycmVudFZhbHVlID0gdHdlZW4gP1xuXHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5jdXIoKTtcblx0XHRcdH0gOlxuXHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wLCBcIlwiICk7XG5cdFx0XHR9LFxuXHRcdGluaXRpYWwgPSBjdXJyZW50VmFsdWUoKSxcblx0XHR1bml0ID0gdmFsdWVQYXJ0cyAmJiB2YWx1ZVBhcnRzWyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICksXG5cblx0XHQvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlc1xuXHRcdGluaXRpYWxJblVuaXQgPSBlbGVtLm5vZGVUeXBlICYmXG5cdFx0XHQoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSBcInB4XCIgJiYgK2luaXRpYWwgKSAmJlxuXHRcdFx0cmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTtcblxuXHRpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTU0XG5cdFx0Ly8gSGFsdmUgdGhlIGl0ZXJhdGlvbiB0YXJnZXQgdmFsdWUgdG8gcHJldmVudCBpbnRlcmZlcmVuY2UgZnJvbSBDU1MgdXBwZXIgYm91bmRzIChnaC0yMTQ0KVxuXHRcdGluaXRpYWwgPSBpbml0aWFsIC8gMjtcblxuXHRcdC8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3Ncblx0XHR1bml0ID0gdW5pdCB8fCBpbml0aWFsSW5Vbml0WyAzIF07XG5cblx0XHQvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludFxuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxO1xuXG5cdFx0d2hpbGUgKCBtYXhJdGVyYXRpb25zLS0gKSB7XG5cblx0XHRcdC8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuXG5cdFx0XHQvLyBGaW5pc2ggaWYgdGhlIHNjYWxlIGVxdWFscyBvciBjcm9zc2VzIDEgKG1ha2luZyB0aGUgb2xkKm5ldyBwcm9kdWN0IG5vbi1wb3NpdGl2ZSkuXG5cdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cdFx0XHRpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHtcblx0XHRcdFx0bWF4SXRlcmF0aW9ucyA9IDA7XG5cdFx0XHR9XG5cdFx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAvIHNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyO1xuXHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhlIHR3ZWVuIHByb3BlcnRpZXMgbGF0ZXIgb25cblx0XHR2YWx1ZVBhcnRzID0gdmFsdWVQYXJ0cyB8fCBbXTtcblx0fVxuXG5cdGlmICggdmFsdWVQYXJ0cyApIHtcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDtcblxuXHRcdC8vIEFwcGx5IHJlbGF0aXZlIG9mZnNldCAoKz0vLT0pIGlmIHNwZWNpZmllZFxuXHRcdGFkanVzdGVkID0gdmFsdWVQYXJ0c1sgMSBdID9cblx0XHRcdGluaXRpYWxJblVuaXQgKyAoIHZhbHVlUGFydHNbIDEgXSArIDEgKSAqIHZhbHVlUGFydHNbIDIgXSA6XG5cdFx0XHQrdmFsdWVQYXJ0c1sgMiBdO1xuXHRcdGlmICggdHdlZW4gKSB7XG5cdFx0XHR0d2Vlbi51bml0ID0gdW5pdDtcblx0XHRcdHR3ZWVuLnN0YXJ0ID0gaW5pdGlhbEluVW5pdDtcblx0XHRcdHR3ZWVuLmVuZCA9IGFkanVzdGVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYWRqdXN0ZWQ7XG59XG5cblxudmFyIGRlZmF1bHREaXNwbGF5TWFwID0ge307XG5cbmZ1bmN0aW9uIGdldERlZmF1bHREaXNwbGF5KCBlbGVtICkge1xuXHR2YXIgdGVtcCxcblx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsXG5cdFx0bm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLFxuXHRcdGRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTtcblxuXHRpZiAoIGRpc3BsYXkgKSB7XG5cdFx0cmV0dXJuIGRpc3BsYXk7XG5cdH1cblxuXHR0ZW1wID0gZG9jLmJvZHkuYXBwZW5kQ2hpbGQoIGRvYy5jcmVhdGVFbGVtZW50KCBub2RlTmFtZSApICk7XG5cdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCB0ZW1wLCBcImRpc3BsYXlcIiApO1xuXG5cdHRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApO1xuXG5cdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0ZGlzcGxheSA9IFwiYmxvY2tcIjtcblx0fVxuXHRkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7XG5cblx0cmV0dXJuIGRpc3BsYXk7XG59XG5cbmZ1bmN0aW9uIHNob3dIaWRlKCBlbGVtZW50cywgc2hvdyApIHtcblx0dmFyIGRpc3BsYXksIGVsZW0sXG5cdFx0dmFsdWVzID0gW10sXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcblxuXHQvLyBEZXRlcm1pbmUgbmV3IGRpc3BsYXkgdmFsdWUgZm9yIGVsZW1lbnRzIHRoYXQgbmVlZCB0byBjaGFuZ2Vcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7XG5cdFx0aWYgKCBzaG93ICkge1xuXG5cdFx0XHQvLyBTaW5jZSB3ZSBmb3JjZSB2aXNpYmlsaXR5IHVwb24gY2FzY2FkZS1oaWRkZW4gZWxlbWVudHMsIGFuIGltbWVkaWF0ZSAoYW5kIHNsb3cpXG5cdFx0XHQvLyBjaGVjayBpcyByZXF1aXJlZCBpbiB0aGlzIGZpcnN0IGxvb3AgdW5sZXNzIHdlIGhhdmUgYSBub25lbXB0eSBkaXNwbGF5IHZhbHVlIChlaXRoZXJcblx0XHRcdC8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZClcblx0XHRcdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJkaXNwbGF5XCIgKSB8fCBudWxsO1xuXHRcdFx0XHRpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7XG5cdFx0XHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwiXCIgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICkgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGdldERlZmF1bHREaXNwbGF5KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggZGlzcGxheSAhPT0gXCJub25lXCIgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IFwibm9uZVwiO1xuXG5cdFx0XHRcdC8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmdcblx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImRpc3BsYXlcIiwgZGlzcGxheSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcCB0byBhdm9pZCBjb25zdGFudCByZWZsb3dcblx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkge1xuXHRcdFx0ZWxlbWVudHNbIGluZGV4IF0uc3R5bGUuZGlzcGxheSA9IHZhbHVlc1sgaW5kZXggXTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudHM7XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzLCB0cnVlICk7XG5cdH0sXG5cdGhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcyApO1xuXHR9LFxuXHR0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSApIHtcblx0XHRpZiAoIHR5cGVvZiBzdGF0ZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGUgPyB0aGlzLnNob3coKSA6IHRoaXMuaGlkZSgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuc2hvdygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxufSApO1xudmFyIHJjaGVja2FibGVUeXBlID0gKCAvXig/OmNoZWNrYm94fHJhZGlvKSQvaSApO1xuXG52YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaSApO1xuXG52YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcXC8oPzpqYXZhfGVjbWEpc2NyaXB0L2kgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICh0cmFjLTExMjE3KVxuXHQvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpXG5cdC8vIGBuYW1lYCBhbmQgYHR5cGVgIG11c3QgdXNlIC5zZXRBdHRyaWJ1dGUgZm9yIFdXQSAodHJhYy0xNDkwMSlcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJyYWRpb1wiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwidFwiICk7XG5cblx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seVxuXHQvLyBPbGRlciBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcblx0c3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZFxuXHRkaXYuaW5uZXJIVE1MID0gXCI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+XCI7XG5cdHN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdC8vIElFIDw9OSByZXBsYWNlcyA8b3B0aW9uPiB0YWdzIHdpdGggdGhlaXIgY29udGVudHMgd2hlbiBpbnNlcnRlZCBvdXRzaWRlIG9mXG5cdC8vIHRoZSBzZWxlY3QgZWxlbWVudC5cblx0ZGl2LmlubmVySFRNTCA9IFwiPG9wdGlvbj48L29wdGlvbj5cIjtcblx0c3VwcG9ydC5vcHRpb24gPSAhIWRpdi5sYXN0Q2hpbGQ7XG59ICkoKTtcblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAodHJhYy0xMzIwMClcbnZhciB3cmFwTWFwID0ge1xuXG5cdC8vIFhIVE1MIHBhcnNlcnMgZG8gbm90IG1hZ2ljYWxseSBpbnNlcnQgZWxlbWVudHMgaW4gdGhlXG5cdC8vIHNhbWUgd2F5IHRoYXQgdGFnIHNvdXAgcGFyc2VycyBkby4gU28gd2UgY2Fubm90IHNob3J0ZW5cblx0Ly8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLlxuXHR0aGVhZDogWyAxLCBcIjx0YWJsZT5cIiwgXCI8L3RhYmxlPlwiIF0sXG5cdGNvbDogWyAyLCBcIjx0YWJsZT48Y29sZ3JvdXA+XCIsIFwiPC9jb2xncm91cD48L3RhYmxlPlwiIF0sXG5cdHRyOiBbIDIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCIgXSxcblx0dGQ6IFsgMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXG5cdF9kZWZhdWx0OiBbIDAsIFwiXCIsIFwiXCIgXVxufTtcblxud3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcbndyYXBNYXAudGggPSB3cmFwTWFwLnRkO1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuaWYgKCAhc3VwcG9ydC5vcHRpb24gKSB7XG5cdHdyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbiA9IFsgMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCIgXTtcbn1cblxuXG5mdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdC8vIFVzZSB0eXBlb2YgdG8gYXZvaWQgemVyby1hcmd1bWVudCBtZXRob2QgaW52b2NhdGlvbiBvbiBob3N0IG9iamVjdHMgKHRyYWMtMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0ZWxlbXNbIGkgXSxcblx0XHRcdFwiZ2xvYmFsRXZhbFwiLFxuXHRcdFx0IXJlZkVsZW1lbnRzIHx8IGRhdGFQcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuXG52YXIgcmh0bWwgPSAvPHwmIz9cXHcrOy87XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgYXR0YWNoZWQsIGosXG5cdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCB0b1R5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICh0cmFjLTEyMzkyKVxuXHRcdFx0XHR0bXAudGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJlbW92ZSB3cmFwcGVyIGZyb20gZnJhZ21lbnRcblx0ZnJhZ21lbnQudGV4dENvbnRlbnQgPSBcIlwiO1xuXG5cdGkgPSAwO1xuXHR3aGlsZSAoICggZWxlbSA9IG5vZGVzWyBpKysgXSApICkge1xuXG5cdFx0Ly8gU2tpcCBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBjb250ZXh0IGNvbGxlY3Rpb24gKHRyYWMtNDA4Nylcblx0XHRpZiAoIHNlbGVjdGlvbiAmJiBqUXVlcnkuaW5BcnJheSggZWxlbSwgc2VsZWN0aW9uICkgPiAtMSApIHtcblx0XHRcdGlmICggaWdub3JlZCApIHtcblx0XHRcdFx0aWdub3JlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRhdHRhY2hlZCA9IGlzQXR0YWNoZWQoIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggYXR0YWNoZWQgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbnZhciBydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIE9ubHkgYXR0YWNoIGV2ZW50cyB0byBvYmplY3RzIHRoYXQgYWNjZXB0IGRhdGFcblx0XHRpZiAoICFhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZVxuXHRcdC8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KVxuXHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGRvY3VtZW50RWxlbWVudCwgc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0gT2JqZWN0LmNyZWF0ZSggbnVsbCApO1xuXHRcdH1cblx0XHRpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7XG5cdFx0XHRldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0aW9uKCBlICkge1xuXG5cdFx0XHRcdC8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kXG5cdFx0XHRcdC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWRcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIgJiYgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlID9cblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guYXBwbHkoIGVsZW0sIGFyZ3VtZW50cyApIDogdW5kZWZpbmVkO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVyc1xuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZVxuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnNcblx0XHRcdGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0b3JpZ1R5cGU6IG9yaWdUeXBlLFxuXHRcdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0XHRoYW5kbGVyOiBoYW5kbGVyLFxuXHRcdFx0XHRndWlkOiBoYW5kbGVyLmd1aWQsXG5cdFx0XHRcdHNlbGVjdG9yOiBzZWxlY3Rvcixcblx0XHRcdFx0bmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSxcblx0XHRcdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiIClcblx0XHRcdH0sIGhhbmRsZU9iakluICk7XG5cblx0XHRcdC8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0XG5cdFx0XHRpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHtcblx0XHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdO1xuXHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDtcblxuXHRcdFx0XHQvLyBPbmx5IHVzZSBhZGRFdmVudExpc3RlbmVyIGlmIHRoZSBzcGVjaWFsIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2Vcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC5zZXR1cCB8fFxuXHRcdFx0XHRcdHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzcGVjaWFsLmFkZCApIHtcblx0XHRcdFx0c3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cblx0XHRcdFx0aWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdCwgZGVsZWdhdGVzIGluIGZyb250XG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBldmVyIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvblxuXHRcdFx0alF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTtcblx0XHR9XG5cblx0fSxcblxuXHQvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnRcblx0cmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHtcblxuXHRcdHZhciBqLCBvcmlnQ291bnQsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHRpZiAoICFlbGVtRGF0YSB8fCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTtcblx0XHRcdHRtcCA9IHRtcFsgMiBdICYmXG5cdFx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApO1xuXG5cdFx0XHQvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzXG5cdFx0XHRvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07XG5cblx0XHRcdFx0aWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJlxuXHRcdFx0XHRcdCggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmXG5cdFx0XHRcdFx0KCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxuXHRcdFx0XHRcdCggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHxcblx0XHRcdFx0XHRcdHNlbGVjdG9yID09PSBcIioqXCIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7XG5cdFx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7XG5cblx0XHRcdFx0XHRpZiAoIGhhbmRsZU9iai5zZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzcGVjaWFsLnJlbW92ZSApIHtcblx0XHRcdFx0XHRcdHNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0XG5cdFx0XHQvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycylcblx0XHRcdGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRcdGlmICggIXNwZWNpYWwudGVhcmRvd24gfHxcblx0XHRcdFx0XHRzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZXZlbnRzWyB0eXBlIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIGRhdGEgYW5kIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcblx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblx0XHR9XG5cdH0sXG5cblx0ZGlzcGF0Y2g6IGZ1bmN0aW9uKCBuYXRpdmVFdmVudCApIHtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwgaGFuZGxlclF1ZXVlLFxuXHRcdFx0YXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLFxuXG5cdFx0XHQvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3Rcblx0XHRcdGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKSxcblxuXHRcdFx0aGFuZGxlcnMgPSAoXG5cdFx0XHRcdGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IE9iamVjdC5jcmVhdGUoIG51bGwgKVxuXHRcdFx0KVsgZXZlbnQudHlwZSBdIHx8IFtdLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307XG5cblx0XHQvLyBVc2UgdGhlIGZpeC1lZCBqUXVlcnkuRXZlbnQgcmF0aGVyIHRoYW4gdGhlIChyZWFkLW9ubHkpIG5hdGl2ZSBldmVudFxuXHRcdGFyZ3NbIDAgXSA9IGV2ZW50O1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTtcblx0XHR9XG5cblx0XHRldmVudC5kZWxlZ2F0ZVRhcmdldCA9IHRoaXM7XG5cblx0XHQvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkXG5cdFx0aWYgKCBzcGVjaWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwucHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGhhbmRsZXJzXG5cdFx0aGFuZGxlclF1ZXVlID0galF1ZXJ5LmV2ZW50LmhhbmRsZXJzLmNhbGwoIHRoaXMsIGV2ZW50LCBoYW5kbGVycyApO1xuXG5cdFx0Ly8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXNcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggbWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XG5cblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiZcblx0XHRcdFx0IWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGV2ZW50IGlzIG5hbWVzcGFjZWQsIHRoZW4gZWFjaCBoYW5kbGVyIGlzIG9ubHkgaW52b2tlZCBpZiBpdCBpc1xuXHRcdFx0XHQvLyBzcGVjaWFsbHkgdW5pdmVyc2FsIG9yIGl0cyBuYW1lc3BhY2VzIGFyZSBhIHN1cGVyc2V0IG9mIHRoZSBldmVudCdzLlxuXHRcdFx0XHRpZiAoICFldmVudC5ybmFtZXNwYWNlIHx8IGhhbmRsZU9iai5uYW1lc3BhY2UgPT09IGZhbHNlIHx8XG5cdFx0XHRcdFx0ZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIGhhbmRsZU9iaiwgc2VsLCBtYXRjaGVkSGFuZGxlcnMsIG1hdGNoZWRTZWxlY3RvcnMsXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTlcblx0XHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICh0cmFjLTEzMTgwKVxuXHRcdFx0Y3VyLm5vZGVUeXBlICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MlxuXHRcdFx0Ly8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnQtdHlwZS1jbGlja1xuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0Ly8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgXCJjbGlja3NcIiBvZiByYWRpbyBpbnB1dHMsIHdoaWNoIGNhbiBoYXZlIGBidXR0b25gIC0xIChnaC0yMzQzKVxuXHRcdFx0ISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGV2ZW50LmJ1dHRvbiA+PSAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAodHJhYy0xMzIwOClcblx0XHRcdFx0Ly8gRG9uJ3QgcHJvY2VzcyBjbGlja3Mgb24gZGlzYWJsZWQgZWxlbWVudHMgKHRyYWMtNjkxMSwgdHJhYy04MTY1LCB0cmFjLTExMzgyLCB0cmFjLTExNzY0KVxuXHRcdFx0XHRpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiAhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlZEhhbmRsZXJzID0gW107XG5cdFx0XHRcdFx0bWF0Y2hlZFNlbGVjdG9ycyA9IHt9O1xuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0Ly8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKHRyYWMtMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlZEhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZWRIYW5kbGVycyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGN1ciA9IHRoaXM7XG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHRhZGRQcm9wOiBmdW5jdGlvbiggbmFtZSwgaG9vayApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGpRdWVyeS5FdmVudC5wcm90b3R5cGUsIG5hbWUsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogaXNGdW5jdGlvbiggaG9vayApID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gaG9vayggdGhpcy5vcmlnaW5hbEV2ZW50ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IDpcblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50WyBuYW1lIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCBuYW1lLCB7XG5cdFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0Zml4OiBmdW5jdGlvbiggb3JpZ2luYWxFdmVudCApIHtcblx0XHRyZXR1cm4gb3JpZ2luYWxFdmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRvcmlnaW5hbEV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTtcblx0fSxcblxuXHRzcGVjaWFsOiB7XG5cdFx0bG9hZDoge1xuXG5cdFx0XHQvLyBQcmV2ZW50IHRyaWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkXG5cdFx0XHRub0J1YmJsZTogdHJ1ZVxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gVXRpbGl6ZSBuYXRpdmUgZXZlbnQgdG8gZW5zdXJlIGNvcnJlY3Qgc3RhdGUgZm9yIGNoZWNrYWJsZSBpbnB1dHNcblx0XHRcdHNldHVwOiBmdW5jdGlvbiggZGF0YSApIHtcblxuXHRcdFx0XHQvLyBGb3IgbXV0dWFsIGNvbXByZXNzaWJpbGl0eSB3aXRoIF9kZWZhdWx0LCByZXBsYWNlIGB0aGlzYCBhY2Nlc3Mgd2l0aCBhIGxvY2FsIHZhci5cblx0XHRcdFx0Ly8gYHx8IGRhdGFgIGlzIGRlYWQgY29kZSBtZWFudCBvbmx5IHRvIHByZXNlcnZlIHRoZSB2YXJpYWJsZSB0aHJvdWdoIG1pbmlmaWNhdGlvbi5cblx0XHRcdFx0dmFyIGVsID0gdGhpcyB8fCBkYXRhO1xuXG5cdFx0XHRcdC8vIENsYWltIHRoZSBmaXJzdCBoYW5kbGVyXG5cdFx0XHRcdGlmICggcmNoZWNrYWJsZVR5cGUudGVzdCggZWwudHlwZSApICYmXG5cdFx0XHRcdFx0ZWwuY2xpY2sgJiYgbm9kZU5hbWUoIGVsLCBcImlucHV0XCIgKSApIHtcblxuXHRcdFx0XHRcdC8vIGRhdGFQcml2LnNldCggZWwsIFwiY2xpY2tcIiwgLi4uIClcblx0XHRcdFx0XHRsZXZlcmFnZU5hdGl2ZSggZWwsIFwiY2xpY2tcIiwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBwcm9jZXNzaW5nIGluIHRoZSBjYWxsZXJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSxcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCBkYXRhICkge1xuXG5cdFx0XHRcdC8vIEZvciBtdXR1YWwgY29tcHJlc3NpYmlsaXR5IHdpdGggX2RlZmF1bHQsIHJlcGxhY2UgYHRoaXNgIGFjY2VzcyB3aXRoIGEgbG9jYWwgdmFyLlxuXHRcdFx0XHQvLyBgfHwgZGF0YWAgaXMgZGVhZCBjb2RlIG1lYW50IG9ubHkgdG8gcHJlc2VydmUgdGhlIHZhcmlhYmxlIHRocm91Z2ggbWluaWZpY2F0aW9uLlxuXHRcdFx0XHR2YXIgZWwgPSB0aGlzIHx8IGRhdGE7XG5cblx0XHRcdFx0Ly8gRm9yY2Ugc2V0dXAgYmVmb3JlIHRyaWdnZXJpbmcgYSBjbGlja1xuXHRcdFx0XHRpZiAoIHJjaGVja2FibGVUeXBlLnRlc3QoIGVsLnR5cGUgKSAmJlxuXHRcdFx0XHRcdGVsLmNsaWNrICYmIG5vZGVOYW1lKCBlbCwgXCJpbnB1dFwiICkgKSB7XG5cblx0XHRcdFx0XHRsZXZlcmFnZU5hdGl2ZSggZWwsIFwiY2xpY2tcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmV0dXJuIG5vbi1mYWxzZSB0byBhbGxvdyBub3JtYWwgZXZlbnQtcGF0aCBwcm9wYWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBzdXBwcmVzcyBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3Ncblx0XHRcdC8vIEFsc28gcHJldmVudCBpdCBpZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGEgbGV2ZXJhZ2VkIG5hdGl2ZS1ldmVudCBzdGFja1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblx0XHRcdFx0cmV0dXJuIHJjaGVja2FibGVUeXBlLnRlc3QoIHRhcmdldC50eXBlICkgJiZcblx0XHRcdFx0XHR0YXJnZXQuY2xpY2sgJiYgbm9kZU5hbWUoIHRhcmdldCwgXCJpbnB1dFwiICkgJiZcblx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRhcmdldCwgXCJjbGlja1wiICkgfHxcblx0XHRcdFx0XHRub2RlTmFtZSggdGFyZ2V0LCBcImFcIiApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRiZWZvcmV1bmxvYWQ6IHtcblx0XHRcdHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggMjArXG5cdFx0XHRcdC8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC5cblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgIT09IHVuZGVmaW5lZCAmJiBldmVudC5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbi8vIEVuc3VyZSB0aGUgcHJlc2VuY2Ugb2YgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBoYW5kbGVzIG1hbnVhbGx5LXRyaWdnZXJlZFxuLy8gc3ludGhldGljIGV2ZW50cyBieSBpbnRlcnJ1cHRpbmcgcHJvZ3Jlc3MgdW50aWwgcmVpbnZva2VkIGluIHJlc3BvbnNlIHRvXG4vLyAqbmF0aXZlKiBldmVudHMgdGhhdCBpdCBmaXJlcyBkaXJlY3RseSwgZW5zdXJpbmcgdGhhdCBzdGF0ZSBjaGFuZ2VzIGhhdmVcbi8vIGFscmVhZHkgb2NjdXJyZWQgYmVmb3JlIG90aGVyIGxpc3RlbmVycyBhcmUgaW52b2tlZC5cbmZ1bmN0aW9uIGxldmVyYWdlTmF0aXZlKCBlbCwgdHlwZSwgaXNTZXR1cCApIHtcblxuXHQvLyBNaXNzaW5nIGBpc1NldHVwYCBpbmRpY2F0ZXMgYSB0cmlnZ2VyIGNhbGwsIHdoaWNoIG11c3QgZm9yY2Ugc2V0dXAgdGhyb3VnaCBqUXVlcnkuZXZlbnQuYWRkXG5cdGlmICggIWlzU2V0dXAgKSB7XG5cdFx0aWYgKCBkYXRhUHJpdi5nZXQoIGVsLCB0eXBlICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGVsLCB0eXBlLCByZXR1cm5UcnVlICk7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFJlZ2lzdGVyIHRoZSBjb250cm9sbGVyIGFzIGEgc3BlY2lhbCB1bml2ZXJzYWwgaGFuZGxlciBmb3IgYWxsIGV2ZW50IG5hbWVzcGFjZXNcblx0ZGF0YVByaXYuc2V0KCBlbCwgdHlwZSwgZmFsc2UgKTtcblx0alF1ZXJ5LmV2ZW50LmFkZCggZWwsIHR5cGUsIHtcblx0XHRuYW1lc3BhY2U6IGZhbHNlLFxuXHRcdGhhbmRsZXI6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXN1bHQsXG5cdFx0XHRcdHNhdmVkID0gZGF0YVByaXYuZ2V0KCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdGlmICggKCBldmVudC5pc1RyaWdnZXIgJiAxICkgJiYgdGhpc1sgdHlwZSBdICkge1xuXG5cdFx0XHRcdC8vIEludGVycnVwdCBwcm9jZXNzaW5nIG9mIHRoZSBvdXRlciBzeW50aGV0aWMgLnRyaWdnZXIoKWVkIGV2ZW50XG5cdFx0XHRcdGlmICggIXNhdmVkICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgYXJndW1lbnRzIGZvciB1c2Ugd2hlbiBoYW5kbGluZyB0aGUgaW5uZXIgbmF0aXZlIGV2ZW50XG5cdFx0XHRcdFx0Ly8gVGhlcmUgd2lsbCBhbHdheXMgYmUgYXQgbGVhc3Qgb25lIGFyZ3VtZW50IChhbiBldmVudCBvYmplY3QpLCBzbyB0aGlzIGFycmF5XG5cdFx0XHRcdFx0Ly8gd2lsbCBub3QgYmUgY29uZnVzZWQgd2l0aCBhIGxlZnRvdmVyIGNhcHR1cmUgb2JqZWN0LlxuXHRcdFx0XHRcdHNhdmVkID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCB0eXBlLCBzYXZlZCApO1xuXG5cdFx0XHRcdFx0Ly8gVHJpZ2dlciB0aGUgbmF0aXZlIGV2ZW50IGFuZCBjYXB0dXJlIGl0cyByZXN1bHRcblx0XHRcdFx0XHR0aGlzWyB0eXBlIF0oKTtcblx0XHRcdFx0XHRyZXN1bHQgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIHR5cGUsIGZhbHNlICk7XG5cblx0XHRcdFx0XHRpZiAoIHNhdmVkICE9PSByZXN1bHQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIENhbmNlbCB0aGUgb3V0ZXIgc3ludGhldGljIGV2ZW50XG5cdFx0XHRcdFx0XHRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHRoaXMgaXMgYW4gaW5uZXIgc3ludGhldGljIGV2ZW50IGZvciBhbiBldmVudCB3aXRoIGEgYnViYmxpbmcgc3Vycm9nYXRlXG5cdFx0XHRcdC8vIChmb2N1cyBvciBibHVyKSwgYXNzdW1lIHRoYXQgdGhlIHN1cnJvZ2F0ZSBhbHJlYWR5IHByb3BhZ2F0ZWQgZnJvbSB0cmlnZ2VyaW5nXG5cdFx0XHRcdC8vIHRoZSBuYXRpdmUgZXZlbnQgYW5kIHByZXZlbnQgdGhhdCBmcm9tIGhhcHBlbmluZyBhZ2FpbiBoZXJlLlxuXHRcdFx0XHQvLyBUaGlzIHRlY2huaWNhbGx5IGdldHMgdGhlIG9yZGVyaW5nIHdyb25nIHcuci50LiB0byBgLnRyaWdnZXIoKWAgKGluIHdoaWNoIHRoZVxuXHRcdFx0XHQvLyBidWJibGluZyBzdXJyb2dhdGUgcHJvcGFnYXRlcyAqYWZ0ZXIqIHRoZSBub24tYnViYmxpbmcgYmFzZSksIGJ1dCB0aGF0IHNlZW1zXG5cdFx0XHRcdC8vIGxlc3MgYmFkIHRoYW4gZHVwbGljYXRpb24uXG5cdFx0XHRcdH0gZWxzZSBpZiAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fSApLmRlbGVnYXRlVHlwZSApIHtcblx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgbmF0aXZlIGV2ZW50IHRyaWdnZXJlZCBhYm92ZSwgZXZlcnl0aGluZyBpcyBub3cgaW4gb3JkZXJcblx0XHRcdC8vIEZpcmUgYW4gaW5uZXIgc3ludGhldGljIGV2ZW50IHdpdGggdGhlIG9yaWdpbmFsIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggc2F2ZWQgKSB7XG5cblx0XHRcdFx0Ly8gLi4uYW5kIGNhcHR1cmUgdGhlIHJlc3VsdFxuXHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIHR5cGUsIGpRdWVyeS5ldmVudC50cmlnZ2VyKFxuXHRcdFx0XHRcdHNhdmVkWyAwIF0sXG5cdFx0XHRcdFx0c2F2ZWQuc2xpY2UoIDEgKSxcblx0XHRcdFx0XHR0aGlzXG5cdFx0XHRcdCkgKTtcblxuXHRcdFx0XHQvLyBBYm9ydCBoYW5kbGluZyBvZiB0aGUgbmF0aXZlIGV2ZW50IGJ5IGFsbCBqUXVlcnkgaGFuZGxlcnMgd2hpbGUgYWxsb3dpbmdcblx0XHRcdFx0Ly8gbmF0aXZlIGhhbmRsZXJzIG9uIHRoZSBzYW1lIGVsZW1lbnQgdG8gcnVuLiBPbiB0YXJnZXQsIHRoaXMgaXMgYWNoaWV2ZWRcblx0XHRcdFx0Ly8gYnkgc3RvcHBpbmcgaW1tZWRpYXRlIHByb3BhZ2F0aW9uIGp1c3Qgb24gdGhlIGpRdWVyeSBldmVudC4gSG93ZXZlcixcblx0XHRcdFx0Ly8gdGhlIG5hdGl2ZSBldmVudCBpcyByZS13cmFwcGVkIGJ5IGEgalF1ZXJ5IG9uZSBvbiBlYWNoIGxldmVsIG9mIHRoZVxuXHRcdFx0XHQvLyBwcm9wYWdhdGlvbiBzbyB0aGUgb25seSB3YXkgdG8gc3RvcCBpdCBmb3IgalF1ZXJ5IGlzIHRvIHN0b3AgaXQgZm9yXG5cdFx0XHRcdC8vIGV2ZXJ5b25lIHZpYSBuYXRpdmUgYHN0b3BQcm9wYWdhdGlvbigpYC4gVGhpcyBpcyBub3QgYSBwcm9ibGVtIGZvclxuXHRcdFx0XHQvLyBmb2N1cy9ibHVyIHdoaWNoIGRvbid0IGJ1YmJsZSwgYnV0IGl0IGRvZXMgYWxzbyBzdG9wIGNsaWNrIG9uIGNoZWNrYm94ZXNcblx0XHRcdFx0Ly8gYW5kIHJhZGlvcy4gV2UgYWNjZXB0IHRoaXMgbGltaXRhdGlvbi5cblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH0gKTtcbn1cblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICh0cmFjLTUwNCwgdHJhYy0xMzE0Mylcblx0XHR0aGlzLnRhcmdldCA9ICggc3JjLnRhcmdldCAmJiBzcmMudGFyZ2V0Lm5vZGVUeXBlID09PSAzICkgP1xuXHRcdFx0c3JjLnRhcmdldC5wYXJlbnROb2RlIDpcblx0XHRcdHNyYy50YXJnZXQ7XG5cblx0XHR0aGlzLmN1cnJlbnRUYXJnZXQgPSBzcmMuY3VycmVudFRhcmdldDtcblx0XHR0aGlzLnJlbGF0ZWRUYXJnZXQgPSBzcmMucmVsYXRlZFRhcmdldDtcblxuXHQvLyBFdmVudCB0eXBlXG5cdH0gZWxzZSB7XG5cdFx0dGhpcy50eXBlID0gc3JjO1xuXHR9XG5cblx0Ly8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVydGllcyBvbnRvIHRoZSBldmVudCBvYmplY3Rcblx0aWYgKCBwcm9wcyApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aGlzLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcblx0dGhpcy50aW1lU3RhbXAgPSBzcmMgJiYgc3JjLnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xuXG5cdC8vIE1hcmsgaXQgYXMgZml4ZWRcblx0dGhpc1sgalF1ZXJ5LmV4cGFuZG8gXSA9IHRydWU7XG59O1xuXG4vLyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmdcbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBqUXVlcnkuRXZlbnQsXG5cdGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cdGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc1NpbXVsYXRlZDogZmFsc2UsXG5cblx0cHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fSxcblx0c3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcblx0fVxufTtcblxuLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHNcbmpRdWVyeS5lYWNoKCB7XG5cdGFsdEtleTogdHJ1ZSxcblx0YnViYmxlczogdHJ1ZSxcblx0Y2FuY2VsYWJsZTogdHJ1ZSxcblx0Y2hhbmdlZFRvdWNoZXM6IHRydWUsXG5cdGN0cmxLZXk6IHRydWUsXG5cdGRldGFpbDogdHJ1ZSxcblx0ZXZlbnRQaGFzZTogdHJ1ZSxcblx0bWV0YUtleTogdHJ1ZSxcblx0cGFnZVg6IHRydWUsXG5cdHBhZ2VZOiB0cnVlLFxuXHRzaGlmdEtleTogdHJ1ZSxcblx0dmlldzogdHJ1ZSxcblx0XCJjaGFyXCI6IHRydWUsXG5cdGNvZGU6IHRydWUsXG5cdGNoYXJDb2RlOiB0cnVlLFxuXHRrZXk6IHRydWUsXG5cdGtleUNvZGU6IHRydWUsXG5cdGJ1dHRvbjogdHJ1ZSxcblx0YnV0dG9uczogdHJ1ZSxcblx0Y2xpZW50WDogdHJ1ZSxcblx0Y2xpZW50WTogdHJ1ZSxcblx0b2Zmc2V0WDogdHJ1ZSxcblx0b2Zmc2V0WTogdHJ1ZSxcblx0cG9pbnRlcklkOiB0cnVlLFxuXHRwb2ludGVyVHlwZTogdHJ1ZSxcblx0c2NyZWVuWDogdHJ1ZSxcblx0c2NyZWVuWTogdHJ1ZSxcblx0dGFyZ2V0VG91Y2hlczogdHJ1ZSxcblx0dG9FbGVtZW50OiB0cnVlLFxuXHR0b3VjaGVzOiB0cnVlLFxuXHR3aGljaDogdHJ1ZVxufSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTtcblxualF1ZXJ5LmVhY2goIHsgZm9jdXM6IFwiZm9jdXNpblwiLCBibHVyOiBcImZvY3Vzb3V0XCIgfSwgZnVuY3Rpb24oIHR5cGUsIGRlbGVnYXRlVHlwZSApIHtcblxuXHRmdW5jdGlvbiBmb2N1c01hcHBlZEhhbmRsZXIoIG5hdGl2ZUV2ZW50ICkge1xuXHRcdGlmICggZG9jdW1lbnQuZG9jdW1lbnRNb2RlICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMStcblx0XHRcdC8vIEF0dGFjaCBhIHNpbmdsZSBmb2N1c2luL2ZvY3Vzb3V0IGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHNcblx0XHRcdC8vIGZvY3VzL2JsdXIuIFRoaXMgaXMgYmVjYXVzZSB0aGUgZm9ybWVyIGFyZSBzeW5jaHJvbm91cyBpbiBJRSB3aGlsZSB0aGUgbGF0dGVyXG5cdFx0XHQvLyBhcmUgYXN5bmMuIEluIG90aGVyIGJyb3dzZXJzLCBhbGwgdGhvc2UgaGFuZGxlcnMgYXJlIGludm9rZWQgc3luY2hyb25vdXNseS5cblxuXHRcdFx0Ly8gYGhhbmRsZWAgZnJvbSBwcml2YXRlIGRhdGEgd291bGQgYWxyZWFkeSB3cmFwIHRoZSBldmVudCwgYnV0IHdlIG5lZWRcblx0XHRcdC8vIHRvIGNoYW5nZSB0aGUgYHR5cGVgIGhlcmUuXG5cdFx0XHR2YXIgaGFuZGxlID0gZGF0YVByaXYuZ2V0KCB0aGlzLCBcImhhbmRsZVwiICksXG5cdFx0XHRcdGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKTtcblx0XHRcdGV2ZW50LnR5cGUgPSBuYXRpdmVFdmVudC50eXBlID09PSBcImZvY3VzaW5cIiA/IFwiZm9jdXNcIiA6IFwiYmx1clwiO1xuXHRcdFx0ZXZlbnQuaXNTaW11bGF0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBGaXJzdCwgaGFuZGxlIGZvY3VzaW4vZm9jdXNvdXRcblx0XHRcdGhhbmRsZSggbmF0aXZlRXZlbnQgKTtcblxuXHRcdFx0Ly8gLi4udGhlbiwgaGFuZGxlIGZvY3VzL2JsdXJcblx0XHRcdC8vXG5cdFx0XHQvLyBmb2N1cy9ibHVyIGRvbid0IGJ1YmJsZSB3aGlsZSBmb2N1c2luL2ZvY3Vzb3V0IGRvOyBzaW11bGF0ZSB0aGUgZm9ybWVyIGJ5IG9ubHlcblx0XHRcdC8vIGludm9raW5nIHRoZSBoYW5kbGVyIGF0IHRoZSBsb3dlciBsZXZlbC5cblx0XHRcdGlmICggZXZlbnQudGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0ICkge1xuXG5cdFx0XHRcdC8vIFRoZSBzZXR1cCBwYXJ0IGNhbGxzIGBsZXZlcmFnZU5hdGl2ZWAsIHdoaWNoLCBpbiB0dXJuLCBjYWxsc1xuXHRcdFx0XHQvLyBgalF1ZXJ5LmV2ZW50LmFkZGAsIHNvIGV2ZW50IGhhbmRsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIHNldFxuXHRcdFx0XHQvLyBieSB0aGlzIHBvaW50LlxuXHRcdFx0XHRoYW5kbGUoIGV2ZW50ICk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRm9yIG5vbi1JRSBicm93c2VycywgYXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudFxuXHRcdFx0Ly8gd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0LlxuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBkZWxlZ2F0ZVR5cGUsIG5hdGl2ZUV2ZW50LnRhcmdldCxcblx0XHRcdFx0alF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKSApO1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gPSB7XG5cblx0XHQvLyBVdGlsaXplIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3Rcblx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdHZhciBhdHRhY2hlcztcblxuXHRcdFx0Ly8gQ2xhaW0gdGhlIGZpcnN0IGhhbmRsZXJcblx0XHRcdC8vIGRhdGFQcml2LnNldCggdGhpcywgXCJmb2N1c1wiLCAuLi4gKVxuXHRcdFx0Ly8gZGF0YVByaXYuc2V0KCB0aGlzLCBcImJsdXJcIiwgLi4uIClcblx0XHRcdGxldmVyYWdlTmF0aXZlKCB0aGlzLCB0eXBlLCB0cnVlICk7XG5cblx0XHRcdGlmICggZG9jdW1lbnQuZG9jdW1lbnRNb2RlICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMStcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBzYW1lIG5hdGl2ZSBoYW5kbGVyIGZvciBmb2N1c2luICYgZm9jdXMgKGFuZCBmb2N1c291dCAmIGJsdXIpXG5cdFx0XHRcdC8vIHNvIHdlIG5lZWQgdG8gY29vcmRpbmF0ZSBzZXR1cCAmIHRlYXJkb3duIHBhcnRzIGJldHdlZW4gdGhvc2UgZXZlbnRzLlxuXHRcdFx0XHQvLyBVc2UgYGRlbGVnYXRlVHlwZWAgYXMgdGhlIGtleSBhcyBgdHlwZWAgaXMgYWxyZWFkeSB1c2VkIGJ5IGBsZXZlcmFnZU5hdGl2ZWAuXG5cdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuZ2V0KCB0aGlzLCBkZWxlZ2F0ZVR5cGUgKTtcblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0dGhpcy5hZGRFdmVudExpc3RlbmVyKCBkZWxlZ2F0ZVR5cGUsIGZvY3VzTWFwcGVkSGFuZGxlciApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgZGVsZWdhdGVUeXBlLCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBwcm9jZXNzaW5nIGluIHRoZSBjYWxsZXJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEZvcmNlIHNldHVwIGJlZm9yZSB0cmlnZ2VyXG5cdFx0XHRsZXZlcmFnZU5hdGl2ZSggdGhpcywgdHlwZSApO1xuXG5cdFx0XHQvLyBSZXR1cm4gbm9uLWZhbHNlIHRvIGFsbG93IG5vcm1hbCBldmVudC1wYXRoIHByb3BhZ2F0aW9uXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGF0dGFjaGVzO1xuXG5cdFx0XHRpZiAoIGRvY3VtZW50LmRvY3VtZW50TW9kZSApIHtcblx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIGRlbGVnYXRlVHlwZSApIC0gMTtcblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCBkZWxlZ2F0ZVR5cGUsIGZvY3VzTWFwcGVkSGFuZGxlciApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggdGhpcywgZGVsZWdhdGVUeXBlICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBkZWxlZ2F0ZVR5cGUsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHN0YW5kYXJkIHRlYXJkb3duIHNob3VsZCBiZSBhcHBsaWVkXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gU3VwcHJlc3MgbmF0aXZlIGZvY3VzIG9yIGJsdXIgaWYgd2UncmUgY3VycmVudGx5IGluc2lkZVxuXHRcdC8vIGEgbGV2ZXJhZ2VkIG5hdGl2ZS1ldmVudCBzdGFja1xuXHRcdF9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRyZXR1cm4gZGF0YVByaXYuZ2V0KCBldmVudC50YXJnZXQsIHR5cGUgKTtcblx0XHR9LFxuXG5cdFx0ZGVsZWdhdGVUeXBlOiBkZWxlZ2F0ZVR5cGVcblx0fTtcblxuXHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDRcblx0Ly8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50c1xuXHQvLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuXHQvL1xuXHQvLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjFcblx0Ly8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG5cdC8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlclxuXHQvLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1N1xuXHQvL1xuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErXG5cdC8vIFRvIHByZXNlcnZlIHJlbGF0aXZlIGZvY3VzaW4vZm9jdXMgJiBmb2N1c291dC9ibHVyIGV2ZW50IG9yZGVyIGd1YXJhbnRlZWQgb24gdGhlIDMueCBicmFuY2gsXG5cdC8vIGF0dGFjaCBhIHNpbmdsZSBoYW5kbGVyIGZvciBib3RoIGV2ZW50cyBpbiBJRS5cblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGRlbGVnYXRlVHlwZSBdID0ge1xuXHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gSGFuZGxlOiByZWd1bGFyIG5vZGVzICh2aWEgYHRoaXMub3duZXJEb2N1bWVudGApLCB3aW5kb3dcblx0XHRcdC8vICh2aWEgYHRoaXMuZG9jdW1lbnRgKSAmIGRvY3VtZW50ICh2aWEgYHRoaXNgKS5cblx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcy5kb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRkYXRhSG9sZGVyID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlID8gdGhpcyA6IGRvYyxcblx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5nZXQoIGRhdGFIb2xkZXIsIGRlbGVnYXRlVHlwZSApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErXG5cdFx0XHQvLyBXZSB1c2UgdGhlIHNhbWUgbmF0aXZlIGhhbmRsZXIgZm9yIGZvY3VzaW4gJiBmb2N1cyAoYW5kIGZvY3Vzb3V0ICYgYmx1cilcblx0XHRcdC8vIHNvIHdlIG5lZWQgdG8gY29vcmRpbmF0ZSBzZXR1cCAmIHRlYXJkb3duIHBhcnRzIGJldHdlZW4gdGhvc2UgZXZlbnRzLlxuXHRcdFx0Ly8gVXNlIGBkZWxlZ2F0ZVR5cGVgIGFzIHRoZSBrZXkgYXMgYHR5cGVgIGlzIGFscmVhZHkgdXNlZCBieSBgbGV2ZXJhZ2VOYXRpdmVgLlxuXHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdGlmICggZG9jdW1lbnQuZG9jdW1lbnRNb2RlICkge1xuXHRcdFx0XHRcdHRoaXMuYWRkRXZlbnRMaXN0ZW5lciggZGVsZWdhdGVUeXBlLCBmb2N1c01hcHBlZEhhbmRsZXIgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZm9jdXNNYXBwZWRIYW5kbGVyLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGRhdGFQcml2LnNldCggZGF0YUhvbGRlciwgZGVsZWdhdGVUeXBlLCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHR9LFxuXHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcy5kb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRkYXRhSG9sZGVyID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlID8gdGhpcyA6IGRvYyxcblx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5nZXQoIGRhdGFIb2xkZXIsIGRlbGVnYXRlVHlwZSApIC0gMTtcblxuXHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdGlmICggZG9jdW1lbnQuZG9jdW1lbnRNb2RlICkge1xuXHRcdFx0XHRcdHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggZGVsZWdhdGVUeXBlLCBmb2N1c01hcHBlZEhhbmRsZXIgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgZm9jdXNNYXBwZWRIYW5kbGVyLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBkYXRhSG9sZGVyLCBkZWxlZ2F0ZVR5cGUgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFQcml2LnNldCggZGF0YUhvbGRlciwgZGVsZWdhdGVUeXBlLCBhdHRhY2hlcyApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn0gKTtcblxuLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzXG4vLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LlxuLy8gRG8gdGhlIHNhbWUgZm9yIHBvaW50ZXJlbnRlci9wb2ludGVybGVhdmUgYW5kIHBvaW50ZXJvdmVyL3BvaW50ZXJvdXRcbi8vXG4vLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5XG4vLyBTYWZhcmkgc2VuZHMgbW91c2VlbnRlciB0b28gb2Z0ZW47IHNlZTpcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ3MDI1OFxuLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS5cbmpRdWVyeS5lYWNoKCB7XG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXG5cdG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIixcblx0cG9pbnRlcmVudGVyOiBcInBvaW50ZXJvdmVyXCIsXG5cdHBvaW50ZXJsZWF2ZTogXCJwb2ludGVyb3V0XCJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7XG5cdFx0ZGVsZWdhdGVUeXBlOiBmaXgsXG5cdFx0YmluZFR5cGU6IGZpeCxcblxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJldCxcblx0XHRcdFx0dGFyZ2V0ID0gdGhpcyxcblx0XHRcdFx0cmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajtcblxuXHRcdFx0Ly8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cblx0XHRcdC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG5cdFx0XHRpZiAoICFyZWxhdGVkIHx8ICggcmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwgcmVsYXRlZCApICkgKSB7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7XG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGZpeDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0b246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHRvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cblx0XHRcdC8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnRcblx0XHRcdGhhbmRsZU9iaiA9IHR5cGVzLmhhbmRsZU9iajtcblx0XHRcdGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoXG5cdFx0XHRcdGhhbmRsZU9iai5uYW1lc3BhY2UgP1xuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG52YXJcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTEwIC0gMTEsIEVkZ2UgMTIgLSAxMyBvbmx5XG5cdC8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuXG5cdC8vIFNlZSBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzE3MzY1MTIvXG5cdHJub0lubmVyaHRtbCA9IC88c2NyaXB0fDxzdHlsZXw8bGluay9pLFxuXG5cdC8vIGNoZWNrZWQ9XCJjaGVja2VkXCIgb3IgY2hlY2tlZFxuXHRyY2hlY2tlZCA9IC9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksXG5cblx0cmNsZWFuU2NyaXB0ID0gL15cXHMqPCFcXFtDREFUQVxcW3xcXF1cXF0+XFxzKiQvZztcblxuLy8gUHJlZmVyIGEgdGJvZHkgb3ZlciBpdHMgcGFyZW50IHRhYmxlIGZvciBjb250YWluaW5nIG5ldyByb3dzXG5mdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7XG5cdGlmICggbm9kZU5hbWUoIGVsZW0sIFwidGFibGVcIiApICYmXG5cdFx0bm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgXCJ0clwiICkgKSB7XG5cblx0XHRyZXR1cm4galF1ZXJ5KCBlbGVtICkuY2hpbGRyZW4oIFwidGJvZHlcIiApWyAwIF0gfHwgZWxlbTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG4vLyBSZXBsYWNlL3Jlc3RvcmUgdGhlIHR5cGUgYXR0cmlidXRlIG9mIHNjcmlwdCBlbGVtZW50cyBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uXG5mdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkge1xuXHRlbGVtLnR5cGUgPSAoIGVsZW0uZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApICE9PSBudWxsICkgKyBcIi9cIiArIGVsZW0udHlwZTtcblx0cmV0dXJuIGVsZW07XG59XG5mdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkge1xuXHRpZiAoICggZWxlbS50eXBlIHx8IFwiXCIgKS5zbGljZSggMCwgNSApID09PSBcInRydWUvXCIgKSB7XG5cdFx0ZWxlbS50eXBlID0gZWxlbS50eXBlLnNsaWNlKCA1ICk7XG5cdH0gZWxzZSB7XG5cdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIFwidHlwZVwiICk7XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHtcblx0dmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCB1ZGF0YU9sZCwgdWRhdGFDdXIsIGV2ZW50cztcblxuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gMS4gQ29weSBwcml2YXRlIGRhdGE6IGV2ZW50cywgaGFuZGxlcnMsIGV0Yy5cblx0aWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHRwZGF0YU9sZCA9IGRhdGFQcml2LmdldCggc3JjICk7XG5cdFx0ZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzO1xuXG5cdFx0aWYgKCBldmVudHMgKSB7XG5cdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRlc3QsIFwiaGFuZGxlIGV2ZW50c1wiICk7XG5cblx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyAyLiBDb3B5IHVzZXIgZGF0YVxuXHRpZiAoIGRhdGFVc2VyLmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHVkYXRhT2xkID0gZGF0YVVzZXIuYWNjZXNzKCBzcmMgKTtcblx0XHR1ZGF0YUN1ciA9IGpRdWVyeS5leHRlbmQoIHt9LCB1ZGF0YU9sZCApO1xuXG5cdFx0ZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApO1xuXHR9XG59XG5cbi8vIEZpeCBJRSBidWdzLCBzZWUgc3VwcG9ydCB0ZXN0c1xuZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHtcblx0dmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdC8vIEZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uLlxuXHRpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHtcblx0XHRkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDtcblxuXHQvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9uc1xuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgKSB7XG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRvbU1hbmlwKCBjb2xsZWN0aW9uLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApIHtcblxuXHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdGFyZ3MgPSBmbGF0KCBhcmdzICk7XG5cblx0dmFyIGZyYWdtZW50LCBmaXJzdCwgc2NyaXB0cywgaGFzU2NyaXB0cywgbm9kZSwgZG9jLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBjb2xsZWN0aW9uLmxlbmd0aCxcblx0XHRpTm9DbG9uZSA9IGwgLSAxLFxuXHRcdHZhbHVlID0gYXJnc1sgMCBdLFxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0Ly8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0XG5cdGlmICggdmFsdWVJc0Z1bmN0aW9uIHx8XG5cdFx0XHQoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkgKSApIHtcblx0XHRyZXR1cm4gY29sbGVjdGlvbi5lYWNoKCBmdW5jdGlvbiggaW5kZXggKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7XG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0YXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7XG5cdFx0XHR9XG5cdFx0XHRkb21NYW5pcCggc2VsZiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKTtcblx0XHR9ICk7XG5cdH1cblxuXHRpZiAoIGwgKSB7XG5cdFx0ZnJhZ21lbnQgPSBidWlsZEZyYWdtZW50KCBhcmdzLCBjb2xsZWN0aW9uWyAwIF0ub3duZXJEb2N1bWVudCwgZmFsc2UsIGNvbGxlY3Rpb24sIGlnbm9yZWQgKTtcblx0XHRmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG5cblx0XHRpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0ZnJhZ21lbnQgPSBmaXJzdDtcblx0XHR9XG5cblx0XHQvLyBSZXF1aXJlIGVpdGhlciBuZXcgY29udGVudCBvciBhbiBpbnRlcmVzdCBpbiBpZ25vcmVkIGVsZW1lbnRzIHRvIGludm9rZSB0aGUgY2FsbGJhY2tcblx0XHRpZiAoIGZpcnN0IHx8IGlnbm9yZWQgKSB7XG5cdFx0XHRzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwgXCJzY3JpcHRcIiApLCBkaXNhYmxlU2NyaXB0ICk7XG5cdFx0XHRoYXNTY3JpcHRzID0gc2NyaXB0cy5sZW5ndGg7XG5cblx0XHRcdC8vIFVzZSB0aGUgb3JpZ2luYWwgZnJhZ21lbnQgZm9yIHRoZSBsYXN0IGl0ZW1cblx0XHRcdC8vIGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVuZCB1cFxuXHRcdFx0Ly8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKHRyYWMtODA3MCkuXG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdG5vZGUgPSBmcmFnbWVudDtcblxuXHRcdFx0XHRpZiAoIGkgIT09IGlOb0Nsb25lICkge1xuXHRcdFx0XHRcdG5vZGUgPSBqUXVlcnkuY2xvbmUoIG5vZGUsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb25cblx0XHRcdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGNvbGxlY3Rpb25bIGkgXSwgbm9kZSwgaSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cdFx0XHRcdGRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRcdFx0Ly8gUmUtZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgJiYgKCBub2RlLnR5cGUgfHwgXCJcIiApLnRvTG93ZXJDYXNlKCkgICE9PSBcIm1vZHVsZVwiICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICYmICFub2RlLm5vTW9kdWxlICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMsIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5vbmNlOiBub2RlLm5vbmNlIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCBcIm5vbmNlXCIgKVxuXHRcdFx0XHRcdFx0XHRcdH0sIGRvYyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFVud3JhcCBhIENEQVRBIHNlY3Rpb24gY29udGFpbmluZyBzY3JpcHQgY29udGVudHMuIFRoaXMgc2hvdWxkbid0IGJlXG5cdFx0XHRcdFx0XHRcdC8vIG5lZWRlZCBhcyBpbiBYTUwgZG9jdW1lbnRzIHRoZXkncmUgYWxyZWFkeSBub3QgdmlzaWJsZSB3aGVuXG5cdFx0XHRcdFx0XHRcdC8vIGluc3BlY3RpbmcgZWxlbWVudCBjb250ZW50cyBhbmQgaW4gSFRNTCBkb2N1bWVudHMgdGhleSBoYXZlIG5vXG5cdFx0XHRcdFx0XHRcdC8vIG1lYW5pbmcgYnV0IHdlJ3JlIHByZXNlcnZpbmcgdGhhdCBsb2dpYyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgd2lsbCBiZSByZW1vdmVkIGNvbXBsZXRlbHkgaW4gNC4wLiBTZWUgZ2gtNDkwNC5cblx0XHRcdFx0XHRcdFx0RE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSwgbm9kZSwgZG9jICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBpc0F0dGFjaGVkKCBub2RlICkgKSB7XG5cdFx0XHRcdHNldEdsb2JhbEV2YWwoIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHR9XG5cdFx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRodG1sUHJlZmlsdGVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRyZXR1cm4gaHRtbDtcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLFxuXHRcdFx0Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLFxuXHRcdFx0aW5QYWdlID0gaXNBdHRhY2hlZCggZWxlbSApO1xuXG5cdFx0Ly8gRml4IElFIGNsb25pbmcgaXNzdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCAmJiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAmJlxuXHRcdFx0XHQhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIFdlIGVzY2hldyBqUXVlcnkjZmluZCBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOlxuXHRcdFx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMlxuXHRcdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApO1xuXHRcdFx0c3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGZpeElucHV0KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmVcblx0XHRpZiAoIGRhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRpZiAoIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0XHRzcmNFbGVtZW50cyA9IHNyY0VsZW1lbnRzIHx8IGdldEFsbCggZWxlbSApO1xuXHRcdFx0XHRkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSwgXCJzY3JpcHRcIiApO1xuXHRcdGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0QWxsKCBlbGVtLCBcInNjcmlwdFwiICkgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXRcblx0XHRyZXR1cm4gY2xvbmU7XG5cdH0sXG5cblx0Y2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cdFx0dmFyIGRhdGEsIGVsZW0sIHR5cGUsXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWwsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHtcblx0XHRcdGlmICggYWNjZXB0RGF0YSggZWxlbSApICkge1xuXHRcdFx0XHRpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkge1xuXHRcdFx0XHRcdGlmICggZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZFxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdICkge1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yICk7XG5cdH0sXG5cblx0dGV4dDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnRleHQoIHRoaXMgKSA6XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdGFwcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0LmFwcGVuZENoaWxkKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHByZXBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGJlZm9yZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YWZ0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSB0aGlzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gUHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXNcblx0XHRcdFx0ZWxlbS50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzO1xuXHRcdGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50cztcblxuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApO1xuXHRcdH0gKTtcblx0fSxcblxuXHRodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNlZSBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0IGFuZCBqdXN0IHVzZSBpbm5lckhUTUxcblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJlxuXHRcdFx0XHQhd3JhcE1hcFsgKCBydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7XG5cblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuaHRtbFByZWZpbHRlciggdmFsdWUgKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF0gfHwge307XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblx0XHRcdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtID0gMDtcblxuXHRcdFx0XHQvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2Rcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7XG5cdFx0XHR9XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRyZXBsYWNlV2l0aDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlnbm9yZWQgPSBbXTtcblxuXHRcdC8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIG5vbi1pZ25vcmVkIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudFxuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG5cblx0XHRcdGlmICggalF1ZXJ5LmluQXJyYXkoIHRoaXMsIGlnbm9yZWQgKSA8IDAgKSB7XG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggdGhpcyApICk7XG5cdFx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRcdHBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gRm9yY2UgY2FsbGJhY2sgaW52b2NhdGlvblxuXHRcdH0sIGlnbm9yZWQgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCgge1xuXHRhcHBlbmRUbzogXCJhcHBlbmRcIixcblx0cHJlcGVuZFRvOiBcInByZXBlbmRcIixcblx0aW5zZXJ0QmVmb3JlOiBcImJlZm9yZVwiLFxuXHRpbnNlcnRBZnRlcjogXCJhZnRlclwiLFxuXHRyZXBsYWNlQWxsOiBcInJlcGxhY2VXaXRoXCJcbn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGVsZW1zLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksXG5cdFx0XHRsYXN0ID0gaW5zZXJ0Lmxlbmd0aCAtIDEsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgaSA8PSBsYXN0OyBpKysgKSB7XG5cdFx0XHRlbGVtcyA9IGkgPT09IGxhc3QgPyB0aGlzIDogdGhpcy5jbG9uZSggdHJ1ZSApO1xuXHRcdFx0alF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdC8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApO1xuXHR9O1xufSApO1xudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgcmN1c3RvbVByb3AgPSAvXi0tLztcblxuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAodHJhYy0xNTA5OCwgdHJhYy0xNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suY2FsbCggZWxlbSApO1xuXG5cdC8vIFJldmVydCB0aGUgb2xkIHZhbHVlc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufTtcblxuXG52YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oIFwifFwiICksIFwiaVwiICk7XG5cblxuXG4oIGZ1bmN0aW9uKCkge1xuXG5cdC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdSZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dFxuXHQvLyBzbyB0aGV5J3JlIGV4ZWN1dGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSB0aGUgc2Vjb25kIGNvbXB1dGF0aW9uLlxuXHRmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHtcblxuXHRcdC8vIFRoaXMgaXMgYSBzaW5nbGV0b24sIHdlIG5lZWQgdG8gZXhlY3V0ZSBpdCBvbmx5IG9uY2Vcblx0XHRpZiAoICFkaXYgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDtcIiArXG5cdFx0XHRcIm1hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MFwiO1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO1wiICtcblx0XHRcdFwibWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDtcIiArXG5cdFx0XHRcIndpZHRoOjYwJTt0b3A6MSVcIjtcblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApLmFwcGVuZENoaWxkKCBkaXYgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0XG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyO1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seSwgU2FmYXJpIDw9OS4xIC0gMTAuMSwgaU9TIDw9Ny4wIC0gOS4zXG5cdFx0Ly8gU29tZSBzdHlsZXMgY29tZSBiYWNrIHdpdGggcGVyY2VudGFnZSB2YWx1ZXMsIGV2ZW4gdGhvdWdoIHRoZXkgc2hvdWxkbid0XG5cdFx0ZGl2LnN0eWxlLnJpZ2h0ID0gXCI2MCVcIjtcblx0XHRwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHRcdC8vIERldGVjdCBtaXNyZXBvcnRpbmcgb2YgY29udGVudCBkaW1lbnNpb25zIGZvciBib3gtc2l6aW5nOmJvcmRlci1ib3ggZWxlbWVudHNcblx0XHRib3hTaXppbmdSZWxpYWJsZVZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUud2lkdGggKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHQvLyBEZXRlY3Qgb3ZlcmZsb3c6c2Nyb2xsIHNjcmV3aW5lc3MgKGdoLTM2OTkpXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9NjRcblx0XHQvLyBEb24ndCBnZXQgdHJpY2tlZCB3aGVuIHpvb20gYWZmZWN0cyBvZmZzZXRXaWR0aCAoZ2gtNDAyOSlcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c2Nyb2xsYm94U2l6ZVZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2Lm9mZnNldFdpZHRoIC8gMyApID09PSAxMjtcblxuXHRcdGRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHQvLyBOdWxsaWZ5IHRoZSBkaXYgc28gaXQgd291bGRuJ3QgYmUgc3RvcmVkIGluIHRoZSBtZW1vcnkgYW5kXG5cdFx0Ly8gaXQgd2lsbCBhbHNvIGJlIGEgc2lnbiB0aGF0IGNoZWNrcyBhbHJlYWR5IHBlcmZvcm1lZFxuXHRcdGRpdiA9IG51bGw7XG5cdH1cblxuXHRmdW5jdGlvbiByb3VuZFBpeGVsTWVhc3VyZXMoIG1lYXN1cmUgKSB7XG5cdFx0cmV0dXJuIE1hdGgucm91bmQoIHBhcnNlRmxvYXQoIG1lYXN1cmUgKSApO1xuXHR9XG5cblx0dmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCxcblx0XHRyZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCwgcmVsaWFibGVNYXJnaW5MZWZ0VmFsLFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0Ly8gRmluaXNoIGVhcmx5IGluIGxpbWl0ZWQgKG5vbi1icm93c2VyKSBlbnZpcm9ubWVudHNcblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKHRyYWMtODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHtcblx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxCb3hTdHlsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbEJveFN0eWxlc1ZhbDtcblx0XHR9LFxuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH0sXG5cdFx0c2Nyb2xsYm94U2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHNjcm9sbGJveFNpemVWYWw7XG5cdFx0fSxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTUgLSAxOCtcblx0XHQvLyBJRS9FZGdlIG1pc3JlcG9ydCBgZ2V0Q29tcHV0ZWRTdHlsZWAgb2YgdGFibGUgcm93cyB3aXRoIHdpZHRoL2hlaWdodFxuXHRcdC8vIHNldCBpbiBDU1Mgd2hpbGUgYG9mZnNldCpgIHByb3BlcnRpZXMgcmVwb3J0IGNvcnJlY3QgdmFsdWVzLlxuXHRcdC8vIEJlaGF2aW9yIGluIElFIDkgaXMgbW9yZSBzdWJ0bGUgdGhhbiBpbiBuZXdlciB2ZXJzaW9ucyAmIGl0IHBhc3Nlc1xuXHRcdC8vIHNvbWUgdmVyc2lvbnMgb2YgdGhpcyB0ZXN0OyBtYWtlIHN1cmUgbm90IHRvIG1ha2UgaXQgcGFzcyB0aGVyZSFcblx0XHQvL1xuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggNzArXG5cdFx0Ly8gT25seSBGaXJlZm94IGluY2x1ZGVzIGJvcmRlciB3aWR0aHNcblx0XHQvLyBpbiBjb21wdXRlZCBkaW1lbnNpb25zLiAoZ2gtNDUyOSlcblx0XHRyZWxpYWJsZVRyRGltZW5zaW9uczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdGFibGUsIHRyLCB0ckNoaWxkLCB0clN0eWxlO1xuXHRcdFx0aWYgKCByZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwidGFibGVcIiApO1xuXHRcdFx0XHR0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwidHJcIiApO1xuXHRcdFx0XHR0ckNoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdFx0XHRcdHRhYmxlLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7Ym9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlXCI7XG5cdFx0XHRcdHRyLnN0eWxlLmNzc1RleHQgPSBcImJveC1zaXppbmc6Y29udGVudC1ib3g7Ym9yZGVyOjFweCBzb2xpZFwiO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA4Nitcblx0XHRcdFx0Ly8gSGVpZ2h0IHNldCB0aHJvdWdoIGNzc1RleHQgZG9lcyBub3QgZ2V0IGFwcGxpZWQuXG5cdFx0XHRcdC8vIENvbXB1dGVkIGhlaWdodCB0aGVuIGNvbWVzIGJhY2sgYXMgMC5cblx0XHRcdFx0dHIuc3R5bGUuaGVpZ2h0ID0gXCIxcHhcIjtcblx0XHRcdFx0dHJDaGlsZC5zdHlsZS5oZWlnaHQgPSBcIjlweFwiO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgOCBDaHJvbWUgODYrXG5cdFx0XHRcdC8vIEluIG91ciBib2R5QmFja2dyb3VuZC5odG1sIGlmcmFtZSxcblx0XHRcdFx0Ly8gZGlzcGxheSBmb3IgYWxsIGRpdiBlbGVtZW50cyBpcyBzZXQgdG8gXCJpbmxpbmVcIixcblx0XHRcdFx0Ly8gd2hpY2ggY2F1c2VzIGEgcHJvYmxlbSBvbmx5IGluIEFuZHJvaWQgOCBDaHJvbWUgODYuXG5cdFx0XHRcdC8vIEVuc3VyaW5nIHRoZSBkaXYgaXMgYGRpc3BsYXk6IGJsb2NrYFxuXHRcdFx0XHQvLyBnZXRzIGFyb3VuZCB0aGlzIGlzc3VlLlxuXHRcdFx0XHR0ckNoaWxkLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG5cblx0XHRcdFx0ZG9jdW1lbnRFbGVtZW50XG5cdFx0XHRcdFx0LmFwcGVuZENoaWxkKCB0YWJsZSApXG5cdFx0XHRcdFx0LmFwcGVuZENoaWxkKCB0ciApXG5cdFx0XHRcdFx0LmFwcGVuZENoaWxkKCB0ckNoaWxkICk7XG5cblx0XHRcdFx0dHJTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCB0ciApO1xuXHRcdFx0XHRyZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCA9ICggcGFyc2VJbnQoIHRyU3R5bGUuaGVpZ2h0LCAxMCApICtcblx0XHRcdFx0XHRwYXJzZUludCggdHJTdHlsZS5ib3JkZXJUb3BXaWR0aCwgMTAgKSArXG5cdFx0XHRcdFx0cGFyc2VJbnQoIHRyU3R5bGUuYm9yZGVyQm90dG9tV2lkdGgsIDEwICkgKSA9PT0gdHIub2Zmc2V0SGVpZ2h0O1xuXG5cdFx0XHRcdGRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCggdGFibGUgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZWxpYWJsZVRyRGltZW5zaW9uc1ZhbDtcblx0XHR9XG5cdH0gKTtcbn0gKSgpO1xuXG5cbmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7XG5cdHZhciB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRoLCByZXQsXG5cdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApLFxuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA1MStcblx0XHQvLyBSZXRyaWV2aW5nIHN0eWxlIGJlZm9yZSBjb21wdXRlZCBzb21laG93XG5cdFx0Ly8gZml4ZXMgYW4gaXNzdWUgd2l0aCBnZXR0aW5nIHdyb25nIHZhbHVlc1xuXHRcdC8vIG9uIGRldGFjaGVkIGVsZW1lbnRzXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBuZWVkZWQgZm9yOlxuXHQvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksIHRyYWMtMTI1MzcpXG5cdC8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKGdoLTMxNDQpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMStcblx0XHQvLyBJRSBvbmx5IHN1cHBvcnRzIGBcImZsb2F0XCJgIGluIGBnZXRQcm9wZXJ0eVZhbHVlYDsgaW4gY29tcHV0ZWQgc3R5bGVzXG5cdFx0Ly8gaXQncyBvbmx5IGF2YWlsYWJsZSBhcyBgXCJjc3NGbG9hdFwiYC4gV2Ugbm8gbG9uZ2VyIG1vZGlmeSBwcm9wZXJ0aWVzXG5cdFx0Ly8gc2VudCB0byBgLmNzcygpYCBhcGFydCBmcm9tIGNhbWVsQ2FzaW5nLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGJvdGguXG5cdFx0Ly8gTm9ybWFsbHksIHRoaXMgd291bGQgY3JlYXRlIGRpZmZlcmVuY2UgaW4gYmVoYXZpb3I6IGlmXG5cdFx0Ly8gYGdldFByb3BlcnR5VmFsdWVgIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgdmFsdWUgcmV0dXJuZWRcblx0XHQvLyBieSBgLmNzcygpYCB3b3VsZCBiZSBgdW5kZWZpbmVkYC4gVGhpcyBpcyB1c3VhbGx5IHRoZSBjYXNlIGZvclxuXHRcdC8vIGRpc2Nvbm5lY3RlZCBlbGVtZW50cy4gSG93ZXZlciwgaW4gSUUgZXZlbiBkaXNjb25uZWN0ZWQgZWxlbWVudHNcblx0XHQvLyB3aXRoIG5vIHN0eWxlcyByZXR1cm4gYFwibm9uZVwiYCBmb3IgYGdldFByb3BlcnR5VmFsdWUoIFwiZmxvYXRcIiApYFxuXHRcdHJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdO1xuXG5cdFx0aWYgKCBpc0N1c3RvbVByb3AgJiYgcmV0ICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDEwNSssIENocm9tZSA8PTEwNStcblx0XHRcdC8vIFNwZWMgcmVxdWlyZXMgdHJpbW1pbmcgd2hpdGVzcGFjZSBmb3IgY3VzdG9tIHByb3BlcnRpZXMgKGdoLTQ5MjYpLlxuXHRcdFx0Ly8gRmlyZWZveCBvbmx5IHRyaW1zIGxlYWRpbmcgd2hpdGVzcGFjZS4gQ2hyb21lIGp1c3QgY29sbGFwc2VzXG5cdFx0XHQvLyBib3RoIGxlYWRpbmcgJiB0cmFpbGluZyB3aGl0ZXNwYWNlIHRvIGEgc2luZ2xlIHNwYWNlLlxuXHRcdFx0Ly9cblx0XHRcdC8vIEZhbGwgYmFjayB0byBgdW5kZWZpbmVkYCBpZiBlbXB0eSBzdHJpbmcgcmV0dXJuZWQuXG5cdFx0XHQvLyBUaGlzIGNvbGxhcHNlcyBhIG1pc3NpbmcgZGVmaW5pdGlvbiB3aXRoIHByb3BlcnR5IGRlZmluZWRcblx0XHRcdC8vIGFuZCBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIGJ1dCB0aGVyZSdzIG5vIHN0YW5kYXJkIEFQSVxuXHRcdFx0Ly8gYWxsb3dpbmcgdXMgdG8gZGlmZmVyZW50aWF0ZSB0aGVtIHdpdGhvdXQgYSBwZXJmb3JtYW5jZSBwZW5hbHR5XG5cdFx0XHQvLyBhbmQgcmV0dXJuaW5nIGB1bmRlZmluZWRgIGFsaWducyB3aXRoIG9sZGVyIGpRdWVyeS5cblx0XHRcdC8vXG5cdFx0XHQvLyBydHJpbUNTUyB0cmVhdHMgVSswMDBEIENBUlJJQUdFIFJFVFVSTiBhbmQgVSswMDBDIEZPUk0gRkVFRFxuXHRcdFx0Ly8gYXMgd2hpdGVzcGFjZSB3aGlsZSBDU1MgZG9lcyBub3QsIGJ1dCB0aGlzIGlzIG5vdCBhIHByb2JsZW1cblx0XHRcdC8vIGJlY2F1c2UgQ1NTIHByZXByb2Nlc3NpbmcgcmVwbGFjZXMgdGhlbSB3aXRoIFUrMDAwQSBMSU5FIEZFRURcblx0XHRcdC8vICh3aGljaCAqaXMqIENTUyB3aGl0ZXNwYWNlKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1zeW50YXgtMy8jaW5wdXQtcHJlcHJvY2Vzc2luZ1xuXHRcdFx0cmV0ID0gcmV0LnJlcGxhY2UoIHJ0cmltQ1NTLCBcIiQxXCIgKSB8fCB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWlzQXR0YWNoZWQoIGVsZW0gKSApIHtcblx0XHRcdHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuXHRcdGlmICggIXN1cHBvcnQucGl4ZWxCb3hTdHlsZXMoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcmJveFN0eWxlLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblxuXHRcdFx0XHQvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWVcblx0XHRcdFx0Ly8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRkZWxldGUgdGhpcy5nZXQ7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uXG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldCA9IGhvb2tGbiApLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxudmFyIGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk1velwiLCBcIm1zXCIgXSxcblx0ZW1wdHlTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKS5zdHlsZSxcblx0dmVuZG9yUHJvcHMgPSB7fTtcblxuLy8gUmV0dXJuIGEgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5IG9yIHVuZGVmaW5lZFxuZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB7XG5cblx0Ly8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lc1xuXHR2YXIgY2FwTmFtZSA9IG5hbWVbIDAgXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSggMSApLFxuXHRcdGkgPSBjc3NQcmVmaXhlcy5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0bmFtZSA9IGNzc1ByZWZpeGVzWyBpIF0gKyBjYXBOYW1lO1xuXHRcdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdFx0cmV0dXJuIG5hbWU7XG5cdFx0fVxuXHR9XG59XG5cbi8vIFJldHVybiBhIHBvdGVudGlhbGx5LW1hcHBlZCBqUXVlcnkuY3NzUHJvcHMgb3IgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5XG5mdW5jdGlvbiBmaW5hbFByb3BOYW1lKCBuYW1lICkge1xuXHR2YXIgZmluYWwgPSBqUXVlcnkuY3NzUHJvcHNbIG5hbWUgXSB8fCB2ZW5kb3JQcm9wc1sgbmFtZSBdO1xuXG5cdGlmICggZmluYWwgKSB7XG5cdFx0cmV0dXJuIGZpbmFsO1xuXHR9XG5cdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdHJldHVybiBuYW1lO1xuXHR9XG5cdHJldHVybiB2ZW5kb3JQcm9wc1sgbmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB8fCBuYW1lO1xufVxuXG5cbnZhclxuXG5cdC8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGVcblx0Ly8gZXhjZXB0IFwidGFibGVcIiwgXCJ0YWJsZS1jZWxsXCIsIG9yIFwidGFibGUtY2FwdGlvblwiXG5cdC8vIFNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheVxuXHRyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9O1xuXG5mdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggX2VsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHtcblxuXHQvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFsdWVzIGhhdmUgYWxyZWFkeSBiZWVuXG5cdC8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludFxuXHR2YXIgbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKTtcblx0cmV0dXJuIG1hdGNoZXMgP1xuXG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7XG5cdHZhciBpID0gZGltZW5zaW9uID09PSBcIndpZHRoXCIgPyAxIDogMCxcblx0XHRleHRyYSA9IDAsXG5cdFx0ZGVsdGEgPSAwLFxuXHRcdG1hcmdpbkRlbHRhID0gMDtcblxuXHQvLyBBZGp1c3RtZW50IG1heSBub3QgYmUgbmVjZXNzYXJ5XG5cdGlmICggYm94ID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cblx0XHQvLyBCb3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW5cblx0XHQvLyBDb3VudCBtYXJnaW4gZGVsdGEgc2VwYXJhdGVseSB0byBvbmx5IGFkZCBpdCBhZnRlciBzY3JvbGwgZ3V0dGVyIGFkanVzdG1lbnQuXG5cdFx0Ly8gVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBuZWdhdGl2ZSBtYXJnaW5zIHdvcmsgd2l0aCBgb3V0ZXJIZWlnaHQoIHRydWUgKWAgKGdoLTM5ODIpLlxuXHRcdGlmICggYm94ID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0bWFyZ2luRGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgYm94ICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBjb250ZW50LWJveCwgd2UncmUgc2Vla2luZyBcInBhZGRpbmdcIiBvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCJcblx0XHRpZiAoICFpc0JvcmRlckJveCApIHtcblxuXHRcdFx0Ly8gQWRkIHBhZGRpbmdcblx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBGb3IgXCJib3JkZXJcIiBvciBcIm1hcmdpblwiLCBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgXCJjb250ZW50XCIgb3Jcblx0XHQvLyBcInBhZGRpbmdcIiBvciBcIm1hcmdpblwiXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRm9yIFwiY29udGVudFwiLCBzdWJ0cmFjdCBwYWRkaW5nXG5cdFx0XHRpZiAoIGJveCA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIgb3IgXCJwYWRkaW5nXCIsIHN1YnRyYWN0IGJvcmRlclxuXHRcdFx0aWYgKCBib3ggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWxcblx0aWYgKCAhaXNCb3JkZXJCb3ggJiYgY29tcHV0ZWRWYWwgPj0gMCApIHtcblxuXHRcdC8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXJcblx0XHQvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duXG5cdFx0ZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbChcblx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRjb21wdXRlZFZhbCAtXG5cdFx0XHRkZWx0YSAtXG5cdFx0XHRleHRyYSAtXG5cdFx0XHQwLjVcblxuXHRcdC8vIElmIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyB1bmtub3duLCB0aGVuIHdlIGNhbid0IGRldGVybWluZSBjb250ZW50LWJveCBzY3JvbGwgZ3V0dGVyXG5cdFx0Ly8gVXNlIGFuIGV4cGxpY2l0IHplcm8gdG8gYXZvaWQgTmFOIChnaC0zOTY0KVxuXHRcdCkgKSB8fCAwO1xuXHR9XG5cblx0cmV0dXJuIGRlbHRhICsgbWFyZ2luRGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cblx0XHQvLyBUbyBhdm9pZCBmb3JjaW5nIGEgcmVmbG93LCBvbmx5IGZldGNoIGJveFNpemluZyBpZiB3ZSBuZWVkIGl0IChnaC00MzIyKS5cblx0XHQvLyBGYWtlIGNvbnRlbnQtYm94IHVudGlsIHdlIGtub3cgaXQncyBuZWVkZWQgdG8ga25vdyB0aGUgdHJ1ZSB2YWx1ZS5cblx0XHRib3hTaXppbmdOZWVkZWQgPSAhc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IGV4dHJhLFxuXHRcdGlzQm9yZGVyQm94ID0gYm94U2l6aW5nTmVlZGVkICYmXG5cdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCxcblxuXHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSxcblx0XHRvZmZzZXRQcm9wID0gXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKTtcblxuXHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0Ly8gUmV0dXJuIGEgY29uZm91bmRpbmcgbm9uLXBpeGVsIHZhbHVlIG9yIGZlaWduIGlnbm9yYW5jZSwgYXMgYXBwcm9wcmlhdGUuXG5cdGlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkge1xuXHRcdGlmICggIWV4dHJhICkge1xuXHRcdFx0cmV0dXJuIHZhbDtcblx0XHR9XG5cdFx0dmFsID0gXCJhdXRvXCI7XG5cdH1cblxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIFVzZSBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgZm9yIHdoZW4gYm94IHNpemluZyBpcyB1bnJlbGlhYmxlLlxuXHQvLyBJbiB0aG9zZSBjYXNlcywgdGhlIGNvbXB1dGVkIHZhbHVlIGNhbiBiZSB0cnVzdGVkIHRvIGJlIGJvcmRlci1ib3guXG5cdGlmICggKCAhc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpICYmIGlzQm9yZGVyQm94IHx8XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMCAtIDExKywgRWRnZSAxNSAtIDE4K1xuXHRcdC8vIElFL0VkZ2UgbWlzcmVwb3J0IGBnZXRDb21wdXRlZFN0eWxlYCBvZiB0YWJsZSByb3dzIHdpdGggd2lkdGgvaGVpZ2h0XG5cdFx0Ly8gc2V0IGluIENTUyB3aGlsZSBgb2Zmc2V0KmAgcHJvcGVydGllcyByZXBvcnQgY29ycmVjdCB2YWx1ZXMuXG5cdFx0Ly8gSW50ZXJlc3RpbmdseSwgaW4gc29tZSBjYXNlcyBJRSA5IGRvZXNuJ3Qgc3VmZmVyIGZyb20gdGhpcyBpc3N1ZS5cblx0XHQhc3VwcG9ydC5yZWxpYWJsZVRyRGltZW5zaW9ucygpICYmIG5vZGVOYW1lKCBlbGVtLCBcInRyXCIgKSB8fFxuXG5cdFx0Ly8gRmFsbCBiYWNrIHRvIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCB3aGVuIHZhbHVlIGlzIFwiYXV0b1wiXG5cdFx0Ly8gVGhpcyBoYXBwZW5zIGZvciBpbmxpbmUgZWxlbWVudHMgd2l0aCBubyBleHBsaWNpdCBzZXR0aW5nIChnaC0zNTcxKVxuXHRcdHZhbCA9PT0gXCJhdXRvXCIgfHxcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seVxuXHRcdC8vIEFsc28gdXNlIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBmb3IgbWlzcmVwb3J0ZWQgaW5saW5lIGRpbWVuc2lvbnMgKGdoLTM2MDIpXG5cdFx0IXBhcnNlRmxvYXQoIHZhbCApICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiaW5saW5lXCIgKSAmJlxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIHZpc2libGUgJiBjb25uZWN0ZWRcblx0XHRlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICkge1xuXG5cdFx0aXNCb3JkZXJCb3ggPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiO1xuXG5cdFx0Ly8gV2hlcmUgYXZhaWxhYmxlLCBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgYXBwcm94aW1hdGUgYm9yZGVyIGJveCBkaW1lbnNpb25zLlxuXHRcdC8vIFdoZXJlIG5vdCBhdmFpbGFibGUgKGUuZy4sIFNWRyksIGFzc3VtZSB1bnJlbGlhYmxlIGJveC1zaXppbmcgYW5kIGludGVycHJldCB0aGVcblx0XHQvLyByZXRyaWV2ZWQgdmFsdWUgYXMgYSBjb250ZW50IGJveCBkaW1lbnNpb24uXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IG9mZnNldFByb3AgaW4gZWxlbTtcblx0XHRpZiAoIHZhbHVlSXNCb3JkZXJCb3ggKSB7XG5cdFx0XHR2YWwgPSBlbGVtWyBvZmZzZXRQcm9wIF07XG5cdFx0fVxuXHR9XG5cblx0Ly8gTm9ybWFsaXplIFwiXCIgYW5kIGF1dG9cblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsXG5cdHJldHVybiAoIHZhbCArXG5cdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0ZWxlbSxcblx0XHRcdGRpbWVuc2lvbixcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXMsXG5cblx0XHRcdC8vIFByb3ZpZGUgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc2l6ZSB0byByZXF1ZXN0IHNjcm9sbCBndXR0ZXIgY2FsY3VsYXRpb24gKGdoLTM1ODkpXG5cdFx0XHR2YWxcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuXHRcdGFzcGVjdFJhdGlvOiB0cnVlLFxuXHRcdGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG5cdFx0Y29sdW1uQ291bnQ6IHRydWUsXG5cdFx0ZmxleEdyb3c6IHRydWUsXG5cdFx0ZmxleFNocmluazogdHJ1ZSxcblx0XHRmb250V2VpZ2h0OiB0cnVlLFxuXHRcdGdyaWRBcmVhOiB0cnVlLFxuXHRcdGdyaWRDb2x1bW46IHRydWUsXG5cdFx0Z3JpZENvbHVtbkVuZDogdHJ1ZSxcblx0XHRncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG5cdFx0Z3JpZFJvdzogdHJ1ZSxcblx0XHRncmlkUm93RW5kOiB0cnVlLFxuXHRcdGdyaWRSb3dTdGFydDogdHJ1ZSxcblx0XHRsaW5lSGVpZ2h0OiB0cnVlLFxuXHRcdG9wYWNpdHk6IHRydWUsXG5cdFx0b3JkZXI6IHRydWUsXG5cdFx0b3JwaGFuczogdHJ1ZSxcblx0XHRzY2FsZTogdHJ1ZSxcblx0XHR3aWRvd3M6IHRydWUsXG5cdFx0ekluZGV4OiB0cnVlLFxuXHRcdHpvb206IHRydWUsXG5cblx0XHQvLyBTVkctcmVsYXRlZFxuXHRcdGZpbGxPcGFjaXR5OiB0cnVlLFxuXHRcdGZsb29kT3BhY2l0eTogdHJ1ZSxcblx0XHRzdG9wT3BhY2l0eTogdHJ1ZSxcblx0XHRzdHJva2VNaXRlcmxpbWl0OiB0cnVlLFxuXHRcdHN0cm9rZU9wYWNpdHk6IHRydWVcblx0fSxcblxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXG5cdC8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWVcblx0Y3NzUHJvcHM6IHt9LFxuXG5cdC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xuXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApLFxuXHRcdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eVxuXHRcdC8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC5cblx0XHRpZiAoICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRuYW1lID0gZmluYWxQcm9wTmFtZSggb3JpZ05hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKHRyYWMtNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnIHRyYWMtOTIzN1xuXHRcdFx0XHR0eXBlID0gXCJudW1iZXJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICh0cmFjLTcxMTYpXG5cdFx0XHRpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCB0aGUgdW5pdCAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0Ly8gVGhlIGlzQ3VzdG9tUHJvcCBjaGVjayBjYW4gYmUgcmVtb3ZlZCBpbiBqUXVlcnkgNC4wIHdoZW4gd2Ugb25seSBhdXRvLWFwcGVuZFxuXHRcdFx0Ly8gXCJweFwiIHRvIGEgZmV3IGhhcmRjb2RlZCB2YWx1ZXMuXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0XHRzdHlsZS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybiBzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggX2ksIGRpbWVuc2lvbiApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBkaW1lbnNpb24gXSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdC8vIENlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbVxuXHRcdFx0XHQvLyBidXQgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdFxuXHRcdFx0XHRyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKSAmJlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrXG5cdFx0XHRcdFx0Ly8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm9cblx0XHRcdFx0XHQvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLlxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHRcdFx0XHRcdC8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGVcblx0XHRcdFx0XHQvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuXG5cdFx0XHRcdFx0KCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID9cblx0XHRcdFx0XHRzd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHRnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcblx0XHRcdHZhciBtYXRjaGVzLFxuXHRcdFx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblxuXHRcdFx0XHQvLyBPbmx5IHJlYWQgc3R5bGVzLnBvc2l0aW9uIGlmIHRoZSB0ZXN0IGhhcyBhIGNoYW5jZSB0byBmYWlsXG5cdFx0XHRcdC8vIHRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3cuXG5cdFx0XHRcdHNjcm9sbGJveFNpemVCdWdneSA9ICFzdXBwb3J0LnNjcm9sbGJveFNpemUoKSAmJlxuXHRcdFx0XHRcdHN0eWxlcy5wb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiLFxuXG5cdFx0XHRcdC8vIFRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3csIG9ubHkgZmV0Y2ggYm94U2l6aW5nIGlmIHdlIG5lZWQgaXQgKGdoLTM5OTEpXG5cdFx0XHRcdGJveFNpemluZ05lZWRlZCA9IHNjcm9sbGJveFNpemVCdWdneSB8fCBleHRyYSxcblx0XHRcdFx0aXNCb3JkZXJCb3ggPSBib3hTaXppbmdOZWVkZWQgJiZcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdFx0XHRzdWJ0cmFjdCA9IGV4dHJhID9cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdFx0ZGltZW5zaW9uLFxuXHRcdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0XHRpc0JvcmRlckJveCxcblx0XHRcdFx0XHRcdHN0eWxlc1xuXHRcdFx0XHRcdCkgOlxuXHRcdFx0XHRcdDA7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZFxuXHRcdFx0Ly8gZmFraW5nIGEgY29udGVudC1ib3ggdG8gZ2V0IGJvcmRlciBhbmQgcGFkZGluZyAoZ2gtMzY5OSlcblx0XHRcdGlmICggaXNCb3JkZXJCb3ggJiYgc2Nyb2xsYm94U2l6ZUJ1Z2d5ICkge1xuXHRcdFx0XHRzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoXG5cdFx0XHRcdFx0ZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdIC1cblx0XHRcdFx0XHRwYXJzZUZsb2F0KCBzdHlsZXNbIGRpbWVuc2lvbiBdICkgLVxuXHRcdFx0XHRcdGJveE1vZGVsQWRqdXN0bWVudCggZWxlbSwgZGltZW5zaW9uLCBcImJvcmRlclwiLCBmYWxzZSwgc3R5bGVzICkgLVxuXHRcdFx0XHRcdDAuNVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZFxuXHRcdFx0aWYgKCBzdWJ0cmFjdCAmJiAoIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJlxuXHRcdFx0XHQoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSAhPT0gXCJweFwiICkge1xuXG5cdFx0XHRcdGVsZW0uc3R5bGVbIGRpbWVuc2lvbiBdID0gdmFsdWU7XG5cdFx0XHRcdHZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuY3NzSG9va3MubWFyZ2luTGVmdCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpbkxlZnQsXG5cdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0cmV0dXJuICggcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiApICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC1cblx0XHRcdFx0XHRzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXHRcdFx0XHRcdH0gKVxuXHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS5zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggcHJlZml4ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gfHxcblx0XHRcdFx0XHR0d2Vlbi5lbGVtLnN0eWxlWyBmaW5hbFByb3BOYW1lKCB0d2Vlbi5wcm9wICkgXSAhPSBudWxsICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIFBhbmljIGJhc2VkIGFwcHJvYWNoIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4uZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmVhc2luZyA9IHtcblx0bGluZWFyOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gcDtcblx0fSxcblx0c3dpbmc6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgKSAvIDI7XG5cdH0sXG5cdF9kZWZhdWx0OiBcInN3aW5nXCJcbn07XG5cbmpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0O1xuXG4vLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludFxualF1ZXJ5LmZ4LnN0ZXAgPSB7fTtcblxuXG5cblxudmFyXG5cdGZ4Tm93LCBpblByb2dyZXNzLFxuXHRyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxcblx0cnJ1biA9IC9xdWV1ZUhvb2tzJC87XG5cbmZ1bmN0aW9uIHNjaGVkdWxlKCkge1xuXHRpZiAoIGluUHJvZ3Jlc3MgKSB7XG5cdFx0aWYgKCBkb2N1bWVudC5oaWRkZW4gPT09IGZhbHNlICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKSB7XG5cdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBzY2hlZHVsZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApO1xuXHRcdH1cblxuXHRcdGpRdWVyeS5meC50aWNrKCk7XG5cdH1cbn1cblxuLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseVxuZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRmeE5vdyA9IHVuZGVmaW5lZDtcblx0fSApO1xuXHRyZXR1cm4gKCBmeE5vdyA9IERhdGUubm93KCkgKTtcbn1cblxuLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb25cbmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7XG5cdHZhciB3aGljaCxcblx0XHRpID0gMCxcblx0XHRhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07XG5cblx0Ly8gSWYgd2UgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLFxuXHQvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxuXHRpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDtcblx0Zm9yICggOyBpIDwgNDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkge1xuXHRcdHdoaWNoID0gY3NzRXhwYW5kWyBpIF07XG5cdFx0YXR0cnNbIFwibWFyZ2luXCIgKyB3aGljaCBdID0gYXR0cnNbIFwicGFkZGluZ1wiICsgd2hpY2ggXSA9IHR5cGU7XG5cdH1cblxuXHRpZiAoIGluY2x1ZGVXaWR0aCApIHtcblx0XHRhdHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlO1xuXHR9XG5cblx0cmV0dXJuIGF0dHJzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHtcblx0dmFyIHR3ZWVuLFxuXHRcdGNvbGxlY3Rpb24gPSAoIEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCBBbmltYXRpb24udHdlZW5lcnNbIFwiKlwiIF0gKSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHtcblxuXHRcdFx0Ly8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHlcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XG5cdHZhciBwcm9wLCB2YWx1ZSwgdG9nZ2xlLCBob29rcywgb2xkZmlyZSwgcHJvcFR3ZWVuLCByZXN0b3JlRGlzcGxheSwgZGlzcGxheSxcblx0XHRpc0JveCA9IFwid2lkdGhcIiBpbiBwcm9wcyB8fCBcImhlaWdodFwiIGluIHByb3BzLFxuXHRcdGFuaW0gPSB0aGlzLFxuXHRcdG9yaWcgPSB7fSxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXG5cdFx0aGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSxcblx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJmeHNob3dcIiApO1xuXG5cdC8vIFF1ZXVlLXNraXBwaW5nIGFuaW1hdGlvbnMgaGlqYWNrIHRoZSBmeCBob29rc1xuXHRpZiAoICFvcHRzLnF1ZXVlICkge1xuXHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCBcImZ4XCIgKTtcblx0XHRpZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7XG5cdFx0XHRob29rcy51bnF1ZXVlZCA9IDA7XG5cdFx0XHRvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhaG9va3MudW5xdWV1ZWQgKSB7XG5cdFx0XHRcdFx0b2xkZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRob29rcy51bnF1ZXVlZCsrO1xuXG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbnN1cmUgdGhlIGNvbXBsZXRlIGhhbmRsZXIgaXMgY2FsbGVkIGJlZm9yZSB0aGlzIGNvbXBsZXRlc1xuXHRcdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRob29rcy51bnF1ZXVlZC0tO1xuXHRcdFx0XHRpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sIFwiZnhcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBEZXRlY3Qgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0Zm9yICggcHJvcCBpbiBwcm9wcyApIHtcblx0XHR2YWx1ZSA9IHByb3BzWyBwcm9wIF07XG5cdFx0aWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkge1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBwcm9wIF07XG5cdFx0XHR0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09IFwidG9nZ2xlXCI7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/IFwiaGlkZVwiIDogXCJzaG93XCIgKSApIHtcblxuXHRcdFx0XHQvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgXCJzaG93XCIgYW5kXG5cdFx0XHRcdC8vIHRoZXJlIGlzIHN0aWxsIGRhdGEgZnJvbSBhIHN0b3BwZWQgc2hvdy9oaWRlXG5cdFx0XHRcdGlmICggdmFsdWUgPT09IFwic2hvd1wiICYmIGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSB0cnVlO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBhbGwgb3RoZXIgbm8tb3Agc2hvdy9oaWRlIGRhdGFcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBCYWlsIG91dCBpZiB0aGlzIGlzIGEgbm8tb3AgbGlrZSAuaGlkZSgpLmhpZGUoKVxuXHRwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7XG5cdGlmICggIXByb3BUd2VlbiAmJiBqUXVlcnkuaXNFbXB0eU9iamVjdCggb3JpZyApICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFJlc3RyaWN0IFwib3ZlcmZsb3dcIiBhbmQgXCJkaXNwbGF5XCIgc3R5bGVzIGR1cmluZyBib3ggYW5pbWF0aW9uc1xuXHRpZiAoIGlzQm94ICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdCBpbmZlciB0aGUgc2hvcnRoYW5kXG5cdFx0Ly8gZnJvbSBpZGVudGljYWxseS12YWx1ZWQgb3ZlcmZsb3dYIGFuZCBvdmVyZmxvd1kgYW5kIEVkZ2UganVzdCBtaXJyb3JzXG5cdFx0Ly8gdGhlIG92ZXJmbG93WCB2YWx1ZSB0aGVyZS5cblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcblxuXHRcdC8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZVxuXHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTtcblx0XHRpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7XG5cdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHR9XG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdGlmICggcmVzdG9yZURpc3BsYXkgKSB7XG5cdFx0XHRcdGRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gR2V0IG5vbmVtcHR5IHZhbHVlKHMpIGJ5IHRlbXBvcmFyaWx5IGZvcmNpbmcgdmlzaWJpbGl0eVxuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdFx0cmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7XG5cdFx0XHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBbmltYXRlIGlubGluZSBlbGVtZW50cyBhcyBpbmxpbmUtYmxvY2tcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwiaW5saW5lXCIgfHwgZGlzcGxheSA9PT0gXCJpbmxpbmUtYmxvY2tcIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcImZsb2F0XCIgKSA9PT0gXCJub25lXCIgKSB7XG5cblx0XHRcdFx0Ly8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZSBhdCB0aGUgZW5kIG9mIHB1cmUgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0XHRcdFx0aWYgKCAhcHJvcFR3ZWVuICkge1xuXHRcdFx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRzdHlsZS5kaXNwbGF5ID0gcmVzdG9yZURpc3BsYXk7XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdGRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5O1xuXHRcdFx0XHRcdFx0cmVzdG9yZURpc3BsYXkgPSBkaXNwbGF5ID09PSBcIm5vbmVcIiA/IFwiXCIgOiBkaXNwbGF5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRzdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XG5cdFx0c3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdHN0eWxlLm92ZXJmbG93ID0gb3B0cy5vdmVyZmxvd1sgMCBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVyZmxvd1sgMiBdO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRwcm9wVHdlZW4gPSBmYWxzZTtcblx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXG5cdFx0Ly8gR2VuZXJhbCBzaG93L2hpZGUgc2V0dXAgZm9yIHRoaXMgZWxlbWVudCBhbmltYXRpb25cblx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRpZiAoIGRhdGFTaG93ICkge1xuXHRcdFx0XHRpZiAoIFwiaGlkZGVuXCIgaW4gZGF0YVNob3cgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgXCJmeHNob3dcIiwgeyBkaXNwbGF5OiByZXN0b3JlRGlzcGxheSB9ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0b3JlIGhpZGRlbi92aXNpYmxlIGZvciB0b2dnbGUgc28gYC5zdG9wKCkudG9nZ2xlKClgIFwicmV2ZXJzZXNcIlxuXHRcdFx0aWYgKCB0b2dnbGUgKSB7XG5cdFx0XHRcdGRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNob3cgZWxlbWVudHMgYmVmb3JlIGFuaW1hdGluZyB0aGVtXG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0c2hvd0hpZGUoIFsgZWxlbSBdLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqL1xuXG5cdFx0XHRhbmltLmRvbmUoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAodHJhYy0xMjQ5Nylcblx0XHRcdFx0dGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLFxuXHRcdFx0XHRwZXJjZW50ID0gMSAtIHRlbXAsXG5cdFx0XHRcdGluZGV4ID0gMCxcblx0XHRcdFx0bGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7XG5cblx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApO1xuXG5cdFx0XHQvLyBJZiB0aGVyZSdzIG1vcmUgdG8gZG8sIHlpZWxkXG5cdFx0XHRpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuIHJlbWFpbmluZztcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgdGhpcyB3YXMgYW4gZW1wdHkgYW5pbWF0aW9uLCBzeW50aGVzaXplIGEgZmluYWwgcHJvZ3Jlc3Mgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAoICFsZW5ndGggKSB7XG5cdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCAxLCAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzb2x2ZSB0aGUgYW5pbWF0aW9uIGFuZCByZXBvcnQgaXRzIGNvbmNsdXNpb25cblx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0cHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksXG5cdFx0XHRvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7XG5cdFx0XHRcdHNwZWNpYWxFYXNpbmc6IHt9LFxuXHRcdFx0XHRlYXNpbmc6IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHRcblx0XHRcdH0sIG9wdGlvbnMgKSxcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcblx0XHRcdG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucyxcblx0XHRcdHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxuXHRcdFx0dHdlZW5zOiBbXSxcblx0XHRcdGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkge1xuXHRcdFx0XHR2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsXG5cdFx0XHRcdFx0YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApO1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7XG5cdFx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHRcdH0sXG5cdFx0XHRzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHtcblx0XHRcdFx0dmFyIGluZGV4ID0gMCxcblxuXHRcdFx0XHRcdC8vIElmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVuc1xuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydFxuXHRcdFx0XHRcdGxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdlZW5zLmxlbmd0aCA6IDA7XG5cdFx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0XHRzdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVzb2x2ZSB3aGVuIHdlIHBsYXllZCB0aGUgbGFzdCBmcmFtZTsgb3RoZXJ3aXNlLCByZWplY3Rcblx0XHRcdFx0aWYgKCBnb3RvRW5kICkge1xuXHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCAxLCAwIF0gKTtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9ICksXG5cdFx0cHJvcHMgPSBhbmltYXRpb24ucHJvcHM7XG5cblx0cHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdHJlc3VsdCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7XG5cdFx0aWYgKCByZXN1bHQgKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggYW5pbWF0aW9uLmVsZW0sIGFuaW1hdGlvbi5vcHRzLnF1ZXVlICkuc3RvcCA9XG5cdFx0XHRcdFx0cmVzdWx0LnN0b3AuYmluZCggcmVzdWx0ICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7XG5cblx0aWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkge1xuXHRcdGFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApO1xuXHR9XG5cblx0Ly8gQXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnNcblx0YW5pbWF0aW9uXG5cdFx0LnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApXG5cdFx0LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlIClcblx0XHQuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApXG5cdFx0LmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7XG5cblx0alF1ZXJ5LmZ4LnRpbWVyKFxuXHRcdGpRdWVyeS5leHRlbmQoIHRpY2ssIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRhbmltOiBhbmltYXRpb24sXG5cdFx0XHRxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWVcblx0XHR9IClcblx0KTtcblxuXHRyZXR1cm4gYW5pbWF0aW9uO1xufVxuXG5qUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7XG5cblx0dHdlZW5lcnM6IHtcblx0XHRcIipcIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApO1xuXHRcdFx0YWRqdXN0Q1NTKCB0d2Vlbi5lbGVtLCBwcm9wLCByY3NzTnVtLmV4ZWMoIHZhbHVlICksIHR3ZWVuICk7XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fSBdXG5cdH0sXG5cblx0dHdlZW5lcjogZnVuY3Rpb24oIHByb3BzLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIHByb3BzICkgKSB7XG5cdFx0XHRjYWxsYmFjayA9IHByb3BzO1xuXHRcdFx0cHJvcHMgPSBbIFwiKlwiIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTtcblx0XHR9XG5cblx0XHR2YXIgcHJvcCxcblx0XHRcdGluZGV4ID0gMCxcblx0XHRcdGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRwcm9wID0gcHJvcHNbIGluZGV4IF07XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH0sXG5cblx0cHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sXG5cblx0cHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7XG5cdFx0aWYgKCBwcmVwZW5kICkge1xuXHRcdFx0QW5pbWF0aW9uLnByZWZpbHRlcnMudW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QW5pbWF0aW9uLnByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LnNwZWVkID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkge1xuXHR2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7XG5cdFx0Y29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHxcblx0XHRcdGlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsXG5cdFx0ZHVyYXRpb246IHNwZWVkLFxuXHRcdGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nXG5cdH07XG5cblx0Ly8gR28gdG8gdGhlIGVuZCBzdGF0ZSBpZiBmeCBhcmUgb2ZmXG5cdGlmICggalF1ZXJ5LmZ4Lm9mZiApIHtcblx0XHRvcHQuZHVyYXRpb24gPSAwO1xuXG5cdH0gZWxzZSB7XG5cdFx0aWYgKCB0eXBlb2Ygb3B0LmR1cmF0aW9uICE9PSBcIm51bWJlclwiICkge1xuXHRcdFx0aWYgKCBvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyApIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gTm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gXCJmeFwiXG5cdGlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1ZXVlID09PSB0cnVlICkge1xuXHRcdG9wdC5xdWV1ZSA9IFwiZnhcIjtcblx0fVxuXG5cdC8vIFF1ZXVlaW5nXG5cdG9wdC5vbGQgPSBvcHQuY29tcGxldGU7XG5cblx0b3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7XG5cdFx0XHRvcHQub2xkLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdC5xdWV1ZSApIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIG9wdDtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gU2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbldpdGhpblRyZWUgKS5jc3MoIFwib3BhY2l0eVwiLCAwICkuc2hvdygpXG5cblx0XHRcdC8vIEFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxuXHRcdFx0LmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fSxcblx0YW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHZhciBlbXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICksXG5cdFx0XHRvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksXG5cdFx0XHRkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0XG5cdFx0XHRcdHZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTtcblxuXHRcdFx0XHQvLyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcblx0XHRcdFx0aWYgKCBlbXB0eSB8fCBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiZmluaXNoXCIgKSApIHtcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uO1xuXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0dGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDpcblx0XHRcdHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTtcblx0fSxcblx0c3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7XG5cdFx0dmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHtcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0c3RvcCggZ290b0VuZCApO1xuXHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XG5cdFx0XHRjbGVhclF1ZXVlID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xlYXJRdWV1ZSApIHtcblx0XHRcdHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRlcXVldWUgPSB0cnVlLFxuXHRcdFx0XHRpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgXCJxdWV1ZUhvb2tzXCIsXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHtcblx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaW5kZXggaW4gZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcblx0XHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmXG5cdFx0XHRcdFx0KCB0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkgKSB7XG5cblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7XG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZC5cblx0XHRcdC8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2hcblx0XHRcdC8vIHdpbGwgZGVxdWV1ZSBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZC5cblx0XHRcdGlmICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cdGZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0aWYgKCB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5kZXgsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSxcblx0XHRcdFx0cXVldWUgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZVwiIF0sXG5cdFx0XHRcdGhvb2tzID0gZGF0YVsgdHlwZSArIFwicXVldWVIb29rc1wiIF0sXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDtcblxuXHRcdFx0Ly8gRW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YVxuXHRcdFx0ZGF0YS5maW5pc2ggPSB0cnVlO1xuXG5cdFx0XHQvLyBFbXB0eSB0aGUgcXVldWUgZmlyc3Rcblx0XHRcdGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTtcblxuXHRcdFx0aWYgKCBob29rcyAmJiBob29rcy5zdG9wICkge1xuXHRcdFx0XHRob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkge1xuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHtcblx0XHRcdFx0XHRxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFR1cm4gb2ZmIGZpbmlzaGluZyBmbGFnXG5cdFx0XHRkZWxldGUgZGF0YS5maW5pc2g7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwidG9nZ2xlXCIsIFwic2hvd1wiLCBcImhpZGVcIiBdLCBmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0gRGF0ZS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblxuXHRcdC8vIFJ1biB0aGUgdGltZXIgYW5kIHNhZmVseSByZW1vdmUgaXQgd2hlbiBkb25lIChhbGxvd2luZyBmb3IgZXh0ZXJuYWwgcmVtb3ZhbClcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRqUXVlcnkuZnguc3RhcnQoKTtcbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpblByb2dyZXNzID0gdHJ1ZTtcblx0c2NoZWR1bGUoKTtcbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdGluUHJvZ3Jlc3MgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkge1xuXHR0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lO1xuXHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHtcblx0XHR2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7XG5cdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdH07XG5cdH0gKTtcbn07XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICksXG5cdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzZWxlY3RcIiApLFxuXHRcdG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvcHRpb25cIiApICk7XG5cblx0aW5wdXQudHlwZSA9IFwiY2hlY2tib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4zIG9ubHlcblx0Ly8gRGVmYXVsdCB2YWx1ZSBmb3IgYSBjaGVja2JveCBzaG91bGQgYmUgXCJvblwiXG5cdHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSBcIlwiO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdFxuXHRzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpb1xuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC52YWx1ZSA9IFwidFwiO1xuXHRpbnB1dC50eXBlID0gXCJyYWRpb1wiO1xuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XG59ICkoKTtcblxuXG52YXIgYm9vbEhvb2ssXG5cdGF0dHJIYW5kbGUgPSBqUXVlcnkuZXhwci5hdHRySGFuZGxlO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvblxuXHRcdC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWRcblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblx0XHRcdGhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcblx0XHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyBcIlwiICk7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0Ly8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWRcblx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7XG5cdH0sXG5cblx0YXR0ckhvb2tzOiB7XG5cdFx0dHlwZToge1xuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggIXN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gXCJyYWRpb1wiICYmXG5cdFx0XHRcdFx0bm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBlbGVtLnZhbHVlO1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgdmFsdWUgKTtcblx0XHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRcdGVsZW0udmFsdWUgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0dmFyIG5hbWUsXG5cdFx0XHRpID0gMCxcblxuXHRcdFx0Ly8gQXR0cmlidXRlIG5hbWVzIGNhbiBjb250YWluIG5vbi1IVE1MIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xuXHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApO1xuXG5cdFx0aWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdHdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkge1xuXHRcdFx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIb29rcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXG5ib29sSG9vayA9IHtcblx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2Vcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7XG5cdFx0fVxuXHRcdHJldHVybiBuYW1lO1xuXHR9XG59O1xuXG5qUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goIC9cXHcrL2cgKSwgZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZSxcblx0XHRcdGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRsb3dlcmNhc2VOYW1lIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF07XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIFVzZSBwcm9wZXIgYXR0cmlidXRlIHJldHJpZXZhbCAodHJhYy0xMjA3Milcblx0XHRcdFx0dmFyIHRhYmluZGV4ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ0YWJpbmRleFwiICk7XG5cblx0XHRcdFx0aWYgKCB0YWJpbmRleCApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoIHRhYmluZGV4LCAxMCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8XG5cdFx0XHRcdFx0cmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiZcblx0XHRcdFx0XHRlbGVtLmhyZWZcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHByb3BGaXg6IHtcblx0XHRcImZvclwiOiBcImh0bWxGb3JcIixcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCJcblx0fVxufSApO1xuXG4vLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcbi8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eVxuLy8gZm9yY2VzIHRoZSBicm93c2VyIHRvIHJlc3BlY3Qgc2V0dGluZyBzZWxlY3RlZFxuLy8gb24gdGhlIG9wdGlvblxuLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWRcbi8vIHdoZW4gaW4gYW4gb3B0Z3JvdXBcbi8vIGVzbGludCBydWxlIFwibm8tdW51c2VkLWV4cHJlc3Npb25zXCIgaXMgZGlzYWJsZWQgZm9yIHRoaXMgY29kZVxuLy8gc2luY2UgaXQgY29uc2lkZXJzIHN1Y2ggYWNjZXNzaW9ucyBub29wXG5pZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkge1xuXHRqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiBcIm9mZlwiICovXG5cblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0cGFyZW50LnNlbGVjdGVkSW5kZXg7XG5cblx0XHRcdFx0aWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5qUXVlcnkuZWFjaCggW1xuXHRcInRhYkluZGV4XCIsXG5cdFwicmVhZE9ubHlcIixcblx0XCJtYXhMZW5ndGhcIixcblx0XCJjZWxsU3BhY2luZ1wiLFxuXHRcImNlbGxQYWRkaW5nXCIsXG5cdFwicm93U3BhblwiLFxuXHRcImNvbFNwYW5cIixcblx0XCJ1c2VNYXBcIixcblx0XCJmcmFtZUJvcmRlclwiLFxuXHRcImNvbnRlbnRFZGl0YWJsZVwiXG5dLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnByb3BGaXhbIHRoaXMudG9Mb3dlckNhc2UoKSBdID0gdGhpcztcbn0gKTtcblxuXG5cblxuXHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZSBhY2NvcmRpbmcgdG8gSFRNTCBzcGVjXG5cdC8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2UtYXNjaWktd2hpdGVzcGFjZVxuXHRmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHtcblx0XHR2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0XHRyZXR1cm4gdG9rZW5zLmpvaW4oIFwiIFwiICk7XG5cdH1cblxuXG5mdW5jdGlvbiBnZXRDbGFzcyggZWxlbSApIHtcblx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCBcImNsYXNzXCIgKSB8fCBcIlwiO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VzVG9BcnJheSggdmFsdWUgKSB7XG5cdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cdH1cblx0cmV0dXJuIFtdO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZXMsIGN1ciwgY3VyVmFsdWUsIGNsYXNzTmFtZSwgaSwgZmluYWxWYWx1ZTtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NOYW1lcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc05hbWVzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCB0aGlzICk7XG5cdFx0XHRcdGN1ciA9IHRoaXMubm9kZVR5cGUgPT09IDEgJiYgKCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGN1clZhbHVlICkgKyBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkgXTtcblx0XHRcdFx0XHRcdGlmICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhc3NOYW1lICsgXCIgXCIgKSA8IDAgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciArPSBjbGFzc05hbWUgKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZXMsIGN1ciwgY3VyVmFsdWUsIGNsYXNzTmFtZSwgaSwgZmluYWxWYWx1ZTtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmF0dHIoIFwiY2xhc3NcIiwgXCJcIiApO1xuXHRcdH1cblxuXHRcdGNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTtcblxuXHRcdGlmICggY2xhc3NOYW1lcy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggdGhpcyApO1xuXG5cdFx0XHRcdC8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpXG5cdFx0XHRcdGN1ciA9IHRoaXMubm9kZVR5cGUgPT09IDEgJiYgKCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGN1clZhbHVlICkgKyBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkgXTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGFzc05hbWUgKyBcIiBcIiApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciA9IGN1ci5yZXBsYWNlKCBcIiBcIiArIGNsYXNzTmFtZSArIFwiIFwiLCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZXMsIGNsYXNzTmFtZSwgaSwgc2VsZixcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWUsXG5cdFx0XHRpc1ZhbGlkVmFsdWUgPSB0eXBlID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoXG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggdGhpcywgaSwgZ2V0Q2xhc3MoIHRoaXMgKSwgc3RhdGVWYWwgKSxcblx0XHRcdFx0XHRzdGF0ZVZhbFxuXHRcdFx0XHQpO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZW9mIHN0YXRlVmFsID09PSBcImJvb2xlYW5cIiAmJiBpc1ZhbGlkVmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNWYWxpZFZhbHVlICkge1xuXG5cdFx0XHRcdC8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzXG5cdFx0XHRcdHNlbGYgPSBqUXVlcnkoIHRoaXMgKTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSBdO1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0XG5cdFx0XHRcdFx0aWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHtcblx0XHRcdFx0XHRcdHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWVcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRcdGNsYXNzTmFtZSA9IGdldENsYXNzKCB0aGlzICk7XG5cdFx0XHRcdGlmICggY2xhc3NOYW1lICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgY2xhc3NOYW1lIGlmIHNldFxuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIsIGNsYXNzTmFtZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCxcblx0XHRcdFx0Ly8gdGhlbiByZW1vdmUgdGhlIHdob2xlIGNsYXNzbmFtZSAoaWYgdGhlcmUgd2FzIG9uZSwgdGhlIGFib3ZlIHNhdmVkIGl0KS5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sgd2hhdGV2ZXIgd2FzIHByZXZpb3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSxcblx0XHRcdFx0Ly8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLlxuXHRcdFx0XHRpZiAoIHRoaXMuc2V0QXR0cmlidXRlICkge1xuXHRcdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsXG5cdFx0XHRcdFx0XHRjbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID9cblx0XHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRcdGRhdGFQcml2LmdldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIgKSB8fCBcIlwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBjbGFzc05hbWUsIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGNsYXNzTmFtZSA9IFwiIFwiICsgc2VsZWN0b3IgKyBcIiBcIjtcblx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0KCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArIFwiIFwiICkuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMSApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRpZiAoIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKHRyYWMtMTQ2ODYsIHRyYWMtMTQ4NTgpXG5cdFx0XHRcdFx0Ly8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2Vcblx0XHRcdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZVxuXHRcdFx0XHRcdHN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNlbGVjdDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHZhbHVlLCBvcHRpb24sIGksXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHRpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCxcblx0XHRcdFx0XHRvbmUgPSBlbGVtLnR5cGUgPT09IFwic2VsZWN0LW9uZVwiLFxuXHRcdFx0XHRcdHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSxcblx0XHRcdFx0XHRtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHRpZiAoIGluZGV4IDwgMCApIHtcblx0XHRcdFx0XHRpID0gbWF4O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aSA9IG9uZSA/IGluZGV4IDogMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnNcblx0XHRcdFx0Zm9yICggOyBpIDwgbWF4OyBpKysgKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHQvLyBJRTgtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICh0cmFjLTI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IW5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cblxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cbnZhciBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcblxudmFyIG5vbmNlID0geyBndWlkOiBEYXRlLm5vdygpIH07XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbCwgcGFyc2VyRXJyb3JFbGVtO1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHlcblx0Ly8gSUUgdGhyb3dzIG9uIHBhcnNlRnJvbVN0cmluZyB3aXRoIGludmFsaWQgaW5wdXQuXG5cdHRyeSB7XG5cdFx0eG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCBcInRleHQveG1sXCIgKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxuXG5cdHBhcnNlckVycm9yRWxlbSA9IHhtbCAmJiB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApWyAwIF07XG5cdGlmICggIXhtbCB8fCBwYXJzZXJFcnJvckVsZW0gKSB7XG5cdFx0alF1ZXJ5LmVycm9yKCBcIkludmFsaWQgWE1MOiBcIiArIChcblx0XHRcdHBhcnNlckVycm9yRWxlbSA/XG5cdFx0XHRcdGpRdWVyeS5tYXAoIHBhcnNlckVycm9yRWxlbS5jaGlsZE5vZGVzLCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsLnRleHRDb250ZW50O1xuXHRcdFx0XHR9ICkuam9pbiggXCJcXG5cIiApIDpcblx0XHRcdFx0ZGF0YVxuXHRcdCkgKTtcblx0fVxuXHRyZXR1cm4geG1sO1xufTtcblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gbGFzdEVsZW1lbnQgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAodHJhYy05OTUxKVxuXHRcdC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAodHJhYy05NzI0KVxuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhc3BlY2lhbC5ub0J1YmJsZSAmJiAhaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0YnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7XG5cdFx0XHRpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkge1xuXHRcdFx0XHRjdXIgPSBjdXIucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIGN1ciApO1xuXHRcdFx0XHR0bXAgPSBjdXI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxuXHRcdFx0aWYgKCB0bXAgPT09ICggZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50ICkgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCB0bXAuZGVmYXVsdFZpZXcgfHwgdG1wLnBhcmVudFdpbmRvdyB8fCB3aW5kb3cgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGxhc3RFbGVtZW50ID0gY3VyO1xuXHRcdFx0ZXZlbnQudHlwZSA9IGkgPiAxID9cblx0XHRcdFx0YnViYmxlVHlwZSA6XG5cdFx0XHRcdHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTtcblxuXHRcdFx0Ly8galF1ZXJ5IGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsIFwiZXZlbnRzXCIgKSB8fCBPYmplY3QuY3JlYXRlKCBudWxsICkgKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICh0cmFjLTYxNzApXG5cdFx0XHRcdGlmICggb250eXBlICYmIGlzRnVuY3Rpb24oIGVsZW1bIHR5cGUgXSApICYmICFpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgcmUtdHJpZ2dlciBhbiBvbkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZFxuXHRcdFx0XHRcdHRtcCA9IGVsZW1bIG9udHlwZSBdO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJldmVudCByZS10cmlnZ2VyaW5nIG9mIHRoZSBzYW1lIGV2ZW50LCBzaW5jZSB3ZSBhbHJlYWR5IGJ1YmJsZWQgaXQgYWJvdmVcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWxlbVsgdHlwZSBdKCk7XG5cblx0XHRcdFx0XHRpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRcdFx0XHRsYXN0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBzdG9wUHJvcGFnYXRpb25DYWxsYmFjayApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gdG1wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0Ly8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lXG5cdC8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQgKSB7XG5cdFx0dmFyIGUgPSBqUXVlcnkuZXh0ZW5kKFxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCgpLFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdGlzU2ltdWxhdGVkOiB0cnVlXG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7XG5cdH1cblxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xuXHRcdH0gKTtcblx0fSxcblx0dHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBlbGVtID0gdGhpc1sgMCBdO1xuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApO1xuXHRcdH1cblx0fVxufSApO1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID9cblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uKCkgOlxuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb247XG5cblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgK1xuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHR9O1xuXG5cdGlmICggYSA9PSBudWxsICkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0c2VyaWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTtcblx0fSxcblx0c2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIENhbiBhZGQgcHJvcEhvb2sgZm9yIFwiZWxlbWVudHNcIiB0byBmaWx0ZXIgb3IgYWRkIGZvcm0gZWxlbWVudHNcblx0XHRcdHZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCBcImVsZW1lbnRzXCIgKTtcblx0XHRcdHJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzO1xuXHRcdH0gKS5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRcdC8vIFVzZSAuaXMoIFwiOmRpc2FibGVkXCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3Jrc1xuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoIFwiOmRpc2FibGVkXCIgKSAmJlxuXHRcdFx0XHRyc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTtcblx0XHR9ICkubWFwKCBmdW5jdGlvbiggX2ksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cjIwID0gLyUyMC9nLFxuXHRyaGFzaCA9IC8jLiokLyxcblx0cmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vIHRyYWMtNzY1MywgdHJhYy04MTI1LCB0cmFjLTgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKHRyYWMtMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb25cblx0YWxsVHlwZXMgPSBcIiovXCIuY29uY2F0KCBcIipcIiApLFxuXG5cdC8vIEFuY2hvciB0YWcgZm9yIHBhcnNpbmcgdGhlIGRvY3VtZW50IG9yaWdpblxuXHRvcmlnaW5BbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5vcmlnaW5BbmNob3IuaHJlZiA9IGxvY2F0aW9uLmhyZWY7XG5cbi8vIEJhc2UgXCJjb25zdHJ1Y3RvclwiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnRcbmZ1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkge1xuXG5cdC8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gXCIqXCJcblx0cmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uO1xuXHRcdFx0ZGF0YVR5cGVFeHByZXNzaW9uID0gXCIqXCI7XG5cdFx0fVxuXG5cdFx0dmFyIGRhdGFUeXBlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBmdW5jICkgKSB7XG5cblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKCBkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlWyAwIF0gPT09IFwiK1wiICkge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCBcIipcIjtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnVuc2hpZnQoIGZ1bmMgKTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYXBwZW5kXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0c1xuZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHtcblxuXHR2YXIgaW5zcGVjdGVkID0ge30sXG5cdFx0c2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7XG5cblx0ZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7XG5cdFx0dmFyIHNlbGVjdGVkO1xuXHRcdGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7XG5cdFx0alF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHtcblx0XHRcdHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7XG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHtcblxuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdGluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHtcblx0XHRcdFx0cmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHRyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbIFwiKlwiIF0gJiYgaW5zcGVjdCggXCIqXCIgKTtcbn1cblxuLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zXG4vLyB0aGF0IHRha2VzIFwiZmxhdFwiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKVxuLy8gRml4ZXMgdHJhYy05ODg3XG5mdW5jdGlvbiBhamF4RXh0ZW5kKCB0YXJnZXQsIHNyYyApIHtcblx0dmFyIGtleSwgZGVlcCxcblx0XHRmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMgfHwge307XG5cblx0Zm9yICgga2V5IGluIHNyYyApIHtcblx0XHRpZiAoIHNyY1sga2V5IF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdCggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07XG5cdFx0fVxuXHR9XG5cdGlmICggZGVlcCApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDpcbiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpXG4gKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VcbiAqL1xuZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHtcblxuXHR2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsXG5cdFx0Y29udGVudHMgPSBzLmNvbnRlbnRzLFxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzO1xuXG5cdC8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzXG5cdHdoaWxlICggZGF0YVR5cGVzWyAwIF0gPT09IFwiKlwiICkge1xuXHRcdGRhdGFUeXBlcy5zaGlmdCgpO1xuXHRcdGlmICggY3QgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGN0ID0gcy5taW1lVHlwZSB8fCBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJDb250ZW50LVR5cGVcIiApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZVxuXHRpZiAoIGN0ICkge1xuXHRcdGZvciAoIHR5cGUgaW4gY29udGVudHMgKSB7XG5cdFx0XHRpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkge1xuXHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHJlc3BvbnNlIGZvciB0aGUgZXhwZWN0ZWQgZGF0YVR5cGVcblx0aWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7XG5cdFx0ZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdO1xuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlc1xuXHRcdGZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkge1xuXHRcdFx0aWYgKCAhZGF0YVR5cGVzWyAwIF0gfHwgcy5jb252ZXJ0ZXJzWyB0eXBlICsgXCIgXCIgKyBkYXRhVHlwZXNbIDAgXSBdICkge1xuXHRcdFx0XHRmaW5hbERhdGFUeXBlID0gdHlwZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoICFmaXJzdERhdGFUeXBlICkge1xuXHRcdFx0XHRmaXJzdERhdGFUeXBlID0gdHlwZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmVcblx0XHRmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlO1xuXHR9XG5cblx0Ly8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZVxuXHQvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZFxuXHQvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG5cdGlmICggZmluYWxEYXRhVHlwZSApIHtcblx0XHRpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkge1xuXHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3BvbnNlc1sgZmluYWxEYXRhVHlwZSBdO1xuXHR9XG59XG5cbi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2VcbiAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFggZmllbGRzIG9uIHRoZSBqcVhIUiBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7XG5cdHZhciBjb252MiwgY3VycmVudCwgY29udiwgdG1wLCBwcmV2LFxuXHRcdGNvbnZlcnRlcnMgPSB7fSxcblxuXHRcdC8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb25cblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpO1xuXG5cdC8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5c1xuXHRpZiAoIGRhdGFUeXBlc1sgMSBdICkge1xuXHRcdGZvciAoIGNvbnYgaW4gcy5jb252ZXJ0ZXJzICkge1xuXHRcdFx0Y29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTtcblx0XHR9XG5cdH1cblxuXHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0Ly8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGVcblx0d2hpbGUgKCBjdXJyZW50ICkge1xuXG5cdFx0aWYgKCBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gKSB7XG5cdFx0XHRqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSB0aGUgZGF0YUZpbHRlciBpZiBwcm92aWRlZFxuXHRcdGlmICggIXByZXYgJiYgaXNTdWNjZXNzICYmIHMuZGF0YUZpbHRlciApIHtcblx0XHRcdHJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApO1xuXHRcdH1cblxuXHRcdHByZXYgPSBjdXJyZW50O1xuXHRcdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHRcdGlmICggY3VycmVudCApIHtcblxuXHRcdFx0Ly8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0b1xuXHRcdFx0aWYgKCBjdXJyZW50ID09PSBcIipcIiApIHtcblxuXHRcdFx0XHRjdXJyZW50ID0gcHJldjtcblxuXHRcdFx0Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudFxuXHRcdFx0fSBlbHNlIGlmICggcHJldiAhPT0gXCIqXCIgJiYgcHJldiAhPT0gY3VycmVudCApIHtcblxuXHRcdFx0XHQvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlclxuXHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbIFwiKiBcIiArIGN1cnJlbnQgXTtcblxuXHRcdFx0XHQvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpclxuXHRcdFx0XHRpZiAoICFjb252ICkge1xuXHRcdFx0XHRcdGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudFxuXHRcdFx0XHRcdFx0dG1wID0gY29udjIuc3BsaXQoIFwiIFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dFxuXHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgdG1wWyAwIF0gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlcnNbIFwiKiBcIiArIHRtcFsgMCBdIF07XG5cdFx0XHRcdFx0XHRcdGlmICggY29udiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgY29udjIgXTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGVcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudCA9IHRtcFsgMCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpXG5cdFx0XHRcdGlmICggY29udiAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdC8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW1cblx0XHRcdFx0XHRpZiAoIGNvbnYgJiYgcy50aHJvd3MgKSB7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlOiBcInBhcnNlcmVycm9yXCIsXG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGNvbnYgPyBlIDogXCJObyBjb252ZXJzaW9uIGZyb20gXCIgKyBwcmV2ICsgXCIgdG8gXCIgKyBjdXJyZW50XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzXG5cdGFjdGl2ZTogMCxcblxuXHQvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0XG5cdGxhc3RNb2RpZmllZDoge30sXG5cdGV0YWc6IHt9LFxuXG5cdGFqYXhTZXR0aW5nczoge1xuXHRcdHVybDogbG9jYXRpb24uaHJlZixcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGxvY2F0aW9uLnByb3RvY29sICksXG5cdFx0Z2xvYmFsOiB0cnVlLFxuXHRcdHByb2Nlc3NEYXRhOiB0cnVlLFxuXHRcdGFzeW5jOiB0cnVlLFxuXHRcdGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLFxuXG5cdFx0Lypcblx0XHR0aW1lb3V0OiAwLFxuXHRcdGRhdGE6IG51bGwsXG5cdFx0ZGF0YVR5cGU6IG51bGwsXG5cdFx0dXNlcm5hbWU6IG51bGwsXG5cdFx0cGFzc3dvcmQ6IG51bGwsXG5cdFx0Y2FjaGU6IG51bGwsXG5cdFx0dGhyb3dzOiBmYWxzZSxcblx0XHR0cmFkaXRpb25hbDogZmFsc2UsXG5cdFx0aGVhZGVyczoge30sXG5cdFx0Ki9cblxuXHRcdGFjY2VwdHM6IHtcblx0XHRcdFwiKlwiOiBhbGxUeXBlcyxcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxuXHRcdFx0aHRtbDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiXG5cdFx0fSxcblxuXHRcdGNvbnRlbnRzOiB7XG5cdFx0XHR4bWw6IC9cXGJ4bWxcXGIvLFxuXHRcdFx0aHRtbDogL1xcYmh0bWwvLFxuXHRcdFx0anNvbjogL1xcYmpzb25cXGIvXG5cdFx0fSxcblxuXHRcdHJlc3BvbnNlRmllbGRzOiB7XG5cdFx0XHR4bWw6IFwicmVzcG9uc2VYTUxcIixcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCIsXG5cdFx0XHRqc29uOiBcInJlc3BvbnNlSlNPTlwiXG5cdFx0fSxcblxuXHRcdC8vIERhdGEgY29udmVydGVyc1xuXHRcdC8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCBcIipcIikgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIHdpdGggYSBzaW5nbGUgc3BhY2Vcblx0XHRjb252ZXJ0ZXJzOiB7XG5cblx0XHRcdC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dFxuXHRcdFx0XCIqIHRleHRcIjogU3RyaW5nLFxuXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcblx0XHRcdFwidGV4dCBodG1sXCI6IHRydWUsXG5cblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cblx0XHRcdFwidGV4dCBqc29uXCI6IEpTT04ucGFyc2UsXG5cblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXG5cdFx0XHRcInRleHQgeG1sXCI6IGpRdWVyeS5wYXJzZVhNTFxuXHRcdH0sXG5cblx0XHQvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOlxuXHRcdC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWZcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxuXHRcdC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKVxuXHRcdGZsYXRPcHRpb25zOiB7XG5cdFx0XHR1cmw6IHRydWUsXG5cdFx0XHRjb250ZXh0OiB0cnVlXG5cdFx0fVxuXHR9LFxuXG5cdC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0XG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cblx0Ly8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy5cblx0YWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MgP1xuXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxuXHRcdFx0YWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOlxuXG5cdFx0XHQvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzXG5cdFx0XHRhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTtcblx0fSxcblxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcblx0YWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksXG5cblx0Ly8gTWFpbiBtZXRob2Rcblx0YWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHtcblxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXG5cdFx0aWYgKCB0eXBlb2YgdXJsID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0b3B0aW9ucyA9IHVybDtcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dmFyIHRyYW5zcG9ydCxcblxuXHRcdFx0Ly8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbVxuXHRcdFx0Y2FjaGVVUkwsXG5cblx0XHRcdC8vIFJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyxcblx0XHRcdHJlc3BvbnNlSGVhZGVycyxcblxuXHRcdFx0Ly8gdGltZW91dCBoYW5kbGVcblx0XHRcdHRpbWVvdXRUaW1lcixcblxuXHRcdFx0Ly8gVXJsIGNsZWFudXAgdmFyXG5cdFx0XHR1cmxBbmNob3IsXG5cblx0XHRcdC8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbilcblx0XHRcdGNvbXBsZXRlZCxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkXG5cdFx0XHRmaXJlR2xvYmFscyxcblxuXHRcdFx0Ly8gTG9vcCB2YXJpYWJsZVxuXHRcdFx0aSxcblxuXHRcdFx0Ly8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsXG5cdFx0XHR1bmNhY2hlZCxcblxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxuXHRcdFx0cyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksXG5cblx0XHRcdC8vIENhbGxiYWNrcyBjb250ZXh0XG5cdFx0XHRjYWxsYmFja0NvbnRleHQgPSBzLmNvbnRleHQgfHwgcyxcblxuXHRcdFx0Ly8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvblxuXHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmXG5cdFx0XHRcdCggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/XG5cdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRqUXVlcnkuZXZlbnQsXG5cblx0XHRcdC8vIERlZmVycmVkc1xuXHRcdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdHN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sXG5cblx0XHRcdC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpXG5cdFx0XHRyZXF1ZXN0SGVhZGVycyA9IHt9LFxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxuXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2Vcblx0XHRcdHN0ckFib3J0ID0gXCJjYW5jZWxlZFwiLFxuXG5cdFx0XHQvLyBGYWtlIHhoclxuXHRcdFx0anFYSFIgPSB7XG5cdFx0XHRcdHJlYWR5U3RhdGU6IDAsXG5cblx0XHRcdFx0Ly8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZFxuXHRcdFx0XHRnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHtcblx0XHRcdFx0XHR2YXIgbWF0Y2g7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbIDEgXS50b0xvd2VyQ2FzZSgpICsgXCIgXCIgXSA9XG5cdFx0XHRcdFx0XHRcdFx0XHQoIHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbIDEgXS50b0xvd2VyQ2FzZSgpICsgXCIgXCIgXSB8fCBbXSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5jb25jYXQoIG1hdGNoWyAyIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bWF0Y2ggPSByZXNwb25zZUhlYWRlcnNbIGtleS50b0xvd2VyQ2FzZSgpICsgXCIgXCIgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2guam9pbiggXCIsIFwiICk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUmF3IHN0cmluZ1xuXHRcdFx0XHRnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBjb21wbGV0ZWQgPyByZXNwb25zZUhlYWRlcnNTdHJpbmcgOiBudWxsO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhY2hlcyB0aGUgaGVhZGVyXG5cdFx0XHRcdHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID1cblx0XHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gfHwgbmFtZTtcblx0XHRcdFx0XHRcdHJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQtdHlwZSBoZWFkZXJcblx0XHRcdFx0b3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0XHRzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkge1xuXHRcdFx0XHRcdHZhciBjb2RlO1xuXHRcdFx0XHRcdGlmICggbWFwICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHRcdGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBMYXp5LWFkZCB0aGUgbmV3IGNhbGxiYWNrcyBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lc1xuXHRcdFx0XHRcdFx0XHRmb3IgKCBjb2RlIGluIG1hcCApIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHJlcXVlc3Rcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0O1xuXHRcdFx0XHRcdGlmICggdHJhbnNwb3J0ICkge1xuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9uZSggMCwgZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXG5cdFx0ZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTtcblxuXHRcdC8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KVxuXHRcdC8vIEhhbmRsZSBmYWxzeSB1cmwgaW4gdGhlIHNldHRpbmdzIG9iamVjdCAodHJhYy0xMDA5MzogY29uc2lzdGVuY3kgd2l0aCBvbGQgc2lnbmF0dXJlKVxuXHRcdC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1ldGVyIGlmIGF2YWlsYWJsZVxuXHRcdHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBsb2NhdGlvbi5ocmVmICkgKyBcIlwiIClcblx0XHRcdC5yZXBsYWNlKCBycHJvdG9jb2wsIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICk7XG5cblx0XHQvLyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMgcGVyIHRpY2tldCB0cmFjLTEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9ICggcy5kYXRhVHlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLlxuXHRcdGlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkge1xuXHRcdFx0dXJsQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEsIEVkZ2UgMTIgLSAxNVxuXHRcdFx0Ly8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCxcblx0XHRcdC8vIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEgb25seVxuXHRcdFx0XHQvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZVxuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHVybEFuY2hvci5ocmVmO1xuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gb3JpZ2luQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09XG5cdFx0XHRcdFx0dXJsQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgdXJsQW5jaG9yLmhvc3Q7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbixcblx0XHRcdFx0Ly8gaXQgY2FuIGJlIHJlamVjdGVkIGJ5IHRoZSB0cmFuc3BvcnQgaWYgaXQgaXMgaW52YWxpZFxuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAodHJhYy0xNTExOClcblx0XHRmaXJlR2xvYmFscyA9IGpRdWVyeS5ldmVudCAmJiBzLmdsb2JhbDtcblxuXHRcdC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHNcblx0XHRpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdGFydFwiICk7XG5cdFx0fVxuXG5cdFx0Ly8gVXBwZXJjYXNlIHRoZSB0eXBlXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudFxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlXG5cdFx0Ly8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uXG5cdFx0Ly8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvblxuXHRcdGNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsIFwiXCIgKTtcblxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XG5cdFx0aWYgKCAhcy5oYXNDb250ZW50ICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgaGFzaCBzbyB3ZSBjYW4gcHV0IGl0IGJhY2tcblx0XHRcdHVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApO1xuXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSBhbmQgc2hvdWxkIGJlIHByb2Nlc3NlZCwgYXBwZW5kIGRhdGEgdG8gdXJsXG5cdFx0XHRpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiApICkge1xuXHRcdFx0XHRjYWNoZVVSTCArPSAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgcy5kYXRhO1xuXG5cdFx0XHRcdC8vIHRyYWMtOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBvciB1cGRhdGUgYW50aS1jYWNoZSBwYXJhbSBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdGNhY2hlVVJMID0gY2FjaGVVUkwucmVwbGFjZSggcmFudGlDYWNoZSwgXCIkMVwiICk7XG5cdFx0XHRcdHVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIFwiXz1cIiArICggbm9uY2UuZ3VpZCsrICkgK1xuXHRcdFx0XHRcdHVuY2FjaGVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQdXQgaGFzaCBhbmQgYW50aS1jYWNoZSBvbiB0aGUgVVJMIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgKGdoLTE3MzIpXG5cdFx0XHRzLnVybCA9IGNhY2hlVVJMICsgdW5jYWNoZWQ7XG5cblx0XHQvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OClcblx0XHR9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJlxuXHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKS5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgKSB7XG5cdFx0XHRzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCBcIitcIiApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGNvbXBsZXRlRGVmZXJyZWQuYWRkKCBzLmNvbXBsZXRlICk7XG5cdFx0anFYSFIuZG9uZSggcy5zdWNjZXNzICk7XG5cdFx0anFYSFIuZmFpbCggcy5lcnJvciApO1xuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb21wbGV0ZWQgPSBmYWxzZTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBSZXRocm93IHBvc3QtY29tcGxldGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHNcblx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb21wbGV0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVc2UgYSBub29wIGNvbnZlcnRlciBmb3IgbWlzc2luZyBzY3JpcHQgYnV0IG5vdCBpZiBqc29ucFxuXHRcdFx0aWYgKCAhaXNTdWNjZXNzICYmXG5cdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBcInNjcmlwdFwiLCBzLmRhdGFUeXBlcyApID4gLTEgJiZcblx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIFwianNvblwiLCBzLmRhdGFUeXBlcyApIDwgMCApIHtcblx0XHRcdFx0cy5jb252ZXJ0ZXJzWyBcInRleHQgc2NyaXB0XCIgXSA9IGZ1bmN0aW9uKCkge307XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldClcblx0XHRcdHJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7XG5cblx0XHRcdC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkxhc3QtTW9kaWZpZWRcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiZXRhZ1wiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaWYgbm8gY29udGVudFxuXHRcdFx0XHRpZiAoIHN0YXR1cyA9PT0gMjA0IHx8IHMudHlwZSA9PT0gXCJIRUFEXCIgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm9jb250ZW50XCI7XG5cblx0XHRcdFx0Ly8gaWYgbm90IG1vZGlmaWVkXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vdG1vZGlmaWVkXCI7XG5cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBkYXRhLCBsZXQncyBjb252ZXJ0IGl0XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlO1xuXHRcdFx0XHRcdHN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdGVycm9yID0gcmVzcG9uc2UuZXJyb3I7XG5cdFx0XHRcdFx0aXNTdWNjZXNzID0gIWVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHNcblx0XHRcdFx0ZXJyb3IgPSBzdGF0dXNUZXh0O1xuXHRcdFx0XHRpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJlcnJvclwiO1xuXHRcdFx0XHRcdGlmICggc3RhdHVzIDwgMCApIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0XG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0XHRqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArIFwiXCI7XG5cblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3Jcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0anFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApO1xuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/IFwiYWpheFN1Y2Nlc3NcIiA6IFwiYWpheEVycm9yXCIsXG5cdFx0XHRcdFx0WyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcGxldGVcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhDb21wbGV0ZVwiLCBbIGpxWEhSLCBzIF0gKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RvcFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ganFYSFI7XG5cdH0sXG5cblx0Z2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssIFwianNvblwiICk7XG5cdH0sXG5cblx0Z2V0U2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCBcInNjcmlwdFwiICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJnZXRcIiwgXCJwb3N0XCIgXSwgZnVuY3Rpb24oIF9pLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBmdW5jdGlvbiggcyApIHtcblx0dmFyIGk7XG5cdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xuXHRcdGlmICggaS50b0xvd2VyQ2FzZSgpID09PSBcImNvbnRlbnQtdHlwZVwiICkge1xuXHRcdFx0cy5jb250ZW50VHlwZSA9IHMuaGVhZGVyc1sgaSBdIHx8IFwiXCI7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCwgb3B0aW9ucywgZG9jICkge1xuXHRyZXR1cm4galF1ZXJ5LmFqYXgoIHtcblx0XHR1cmw6IHVybCxcblxuXHRcdC8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAodHJhYy0xMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXG5cdFx0Ly8gT25seSBldmFsdWF0ZSB0aGUgcmVzcG9uc2UgaWYgaXQgaXMgc3VjY2Vzc2Z1bCAoZ2gtNDEyNilcblx0XHQvLyBkYXRhRmlsdGVyIGlzIG5vdCBpbnZva2VkIGZvciBmYWlsdXJlIHJlc3BvbnNlcywgc28gdXNpbmcgaXQgaW5zdGVhZFxuXHRcdC8vIG9mIHRoZSBkZWZhdWx0IGNvbnZlcnRlciBpcyBrbHVkZ3kgYnV0IGl0IHdvcmtzLlxuXHRcdGNvbnZlcnRlcnM6IHtcblx0XHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oKSB7fVxuXHRcdH0sXG5cdFx0ZGF0YUZpbHRlcjogZnVuY3Rpb24oIHJlc3BvbnNlICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHJlc3BvbnNlLCBvcHRpb25zLCBkb2MgKTtcblx0XHR9XG5cdH0gKTtcbn07XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgd3JhcDtcblxuXHRcdGlmICggdGhpc1sgMCBdICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRcdGh0bWwgPSBodG1sLmNhbGwoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZFxuXHRcdFx0d3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7XG5cblx0XHRcdGlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0d3JhcC5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9ICkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLFxuXHRcdFx0XHRjb250ZW50cyA9IHNlbGYuY29udGVudHMoKTtcblxuXHRcdFx0aWYgKCBjb250ZW50cy5sZW5ndGggKSB7XG5cdFx0XHRcdGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi5hcHBlbmQoIGh0bWwgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0d3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIGh0bWxJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggaHRtbCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApO1xuXHRcdH0gKTtcblx0fSxcblxuXHR1bndyYXA6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR0aGlzLnBhcmVudCggc2VsZWN0b3IgKS5ub3QoIFwiYm9keVwiICkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0fSApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUoIGVsZW0gKTtcbn07XG5qUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICEhKCBlbGVtLm9mZnNldFdpZHRoIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0IHx8IGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKTtcbn07XG5cblxuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxufTtcblxudmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cblx0XHQvLyBGaWxlIHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIGNvZGUgMCwgYXNzdW1lIDIwMFxuXHRcdDA6IDIwMCxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0Ly8gdHJhYy0xNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNFxuXHRcdDEyMjM6IDIwNFxuXHR9LFxuXHR4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpO1xuXG5zdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoIFwid2l0aENyZWRlbnRpYWxzXCIgaW4geGhyU3VwcG9ydGVkICk7XG5zdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDtcblxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHR2YXIgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s7XG5cblx0Ly8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdFxuXHRpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0dmFyIGksXG5cdFx0XHRcdFx0eGhyID0gb3B0aW9ucy54aHIoKTtcblxuXHRcdFx0XHR4aHIub3Blbihcblx0XHRcdFx0XHRvcHRpb25zLnR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucy51cmwsXG5cdFx0XHRcdFx0b3B0aW9ucy5hc3luYyxcblx0XHRcdFx0XHRvcHRpb25zLnVzZXJuYW1lLFxuXHRcdFx0XHRcdG9wdGlvbnMucGFzc3dvcmRcblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSBpbiBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRcdHhoclsgaSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHtcblx0XHRcdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXJcblx0XHRcdFx0Ly8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZVxuXHRcdFx0XHQvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLlxuXHRcdFx0XHQvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhTZXR1cClcblx0XHRcdFx0Ly8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuXG5cdFx0XHRcdGlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gKSB7XG5cdFx0XHRcdFx0aGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSA9IFwiWE1MSHR0cFJlcXVlc3RcIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCBoZWFkZXJzXG5cdFx0XHRcdGZvciAoIGkgaW4gaGVhZGVycyApIHtcblx0XHRcdFx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrID0gZXJyb3JDYWxsYmFjayA9IHhoci5vbmxvYWQgPVxuXHRcdFx0XHRcdFx0XHRcdHhoci5vbmVycm9yID0geGhyLm9uYWJvcnQgPSB4aHIub250aW1lb3V0ID1cblx0XHRcdFx0XHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJhYm9ydFwiICkge1xuXHRcdFx0XHRcdFx0XHRcdHhoci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBcImVycm9yXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIE9uIGEgbWFudWFsIG5hdGl2ZSBhYm9ydCwgSUU5IHRocm93c1xuXHRcdFx0XHRcdFx0XHRcdC8vIGVycm9ycyBvbiBhbnkgcHJvcGVydHkgYWNjZXNzIHRoYXQgaXMgbm90IHJlYWR5U3RhdGVcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHR5cGVvZiB4aHIuc3RhdHVzICE9PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoIDAsIFwiZXJyb3JcIiApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGaWxlOiBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyAwOyBzZWUgdHJhYy04NjA1LCB0cmFjLTE0MjA3XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblx0XHRcdFx0XHRcdFx0XHRcdHhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHQsXG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBGb3IgWEhSMiBub24tdGV4dCwgbGV0IHRoZSBjYWxsZXIgaGFuZGxlIGl0IChnaC0yNDk4KVxuXHRcdFx0XHRcdFx0XHRcdFx0KCB4aHIucmVzcG9uc2VUeXBlIHx8IFwidGV4dFwiICkgIT09IFwidGV4dFwiICB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHhoci5yZXNwb25zZVRleHQgIT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGJpbmFyeTogeGhyLnJlc3BvbnNlIH0gOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IHRleHQ6IHhoci5yZXNwb25zZVRleHQgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIExpc3RlbiB0byBldmVudHNcblx0XHRcdFx0eGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7XG5cdFx0XHRcdGVycm9yQ2FsbGJhY2sgPSB4aHIub25lcnJvciA9IHhoci5vbnRpbWVvdXQgPSBjYWxsYmFjayggXCJlcnJvclwiICk7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOSBvbmx5XG5cdFx0XHRcdC8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0XG5cdFx0XHRcdC8vIHRvIGhhbmRsZSB1bmNhdWdodCBhYm9ydHNcblx0XHRcdFx0aWYgKCB4aHIub25hYm9ydCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHhoci5vbmFib3J0ID0gZXJyb3JDYWxsYmFjaztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIENoZWNrIHJlYWR5U3RhdGUgYmVmb3JlIHRpbWVvdXQgYXMgaXQgY2hhbmdlc1xuXHRcdFx0XHRcdFx0aWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCxcblx0XHRcdFx0XHRcdFx0Ly8gYnV0IHRoYXQgd2lsbCBub3QgaGFuZGxlIGEgbmF0aXZlIGFib3J0XG5cdFx0XHRcdFx0XHRcdC8vIEFsc28sIHNhdmUgZXJyb3JDYWxsYmFjayB0byBhIHZhcmlhYmxlXG5cdFx0XHRcdFx0XHRcdC8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ2FsbGJhY2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIHRoZSBhYm9ydCBjYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGNhbGxiYWNrKCBcImFib3J0XCIgKTtcblxuXHRcdFx0XHR0cnkge1xuXG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKVxuXHRcdFx0XHRcdHhoci5zZW5kKCBvcHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhIHx8IG51bGwgKTtcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHQvLyB0cmFjLTE0NjgzOiBPbmx5IHJldGhyb3cgaWYgdGhpcyBoYXNuJ3QgYmVlbiBub3RpZmllZCBhcyBhbiBlcnJvciB5ZXRcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG4vLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKVxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTtcblx0fVxufSApO1xuXG4vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZVxualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRhY2NlcHRzOiB7XG5cdFx0c2NyaXB0OiBcInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgXCIgK1xuXHRcdFx0XCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIlxuXHR9LFxuXHRjb250ZW50czoge1xuXHRcdHNjcmlwdDogL1xcYig/OmphdmF8ZWNtYSlzY3JpcHRcXGIvXG5cdH0sXG5cdGNvbnZlcnRlcnM6IHtcblx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTtcblx0XHRcdHJldHVybiB0ZXh0O1xuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIYW5kbGUgY2FjaGUncyBzcGVjaWFsIGNhc2UgYW5kIGNyb3NzRG9tYWluXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHMuY2FjaGUgPSBmYWxzZTtcblx0fVxuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cy50eXBlID0gXCJHRVRcIjtcblx0fVxufSApO1xuXG4vLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnRcbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblxuXHQvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIG9yIGZvcmNlZC1ieS1hdHRycyByZXF1ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gfHwgcy5zY3JpcHRBdHRycyApIHtcblx0XHR2YXIgc2NyaXB0LCBjYWxsYmFjaztcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkge1xuXHRcdFx0XHRzY3JpcHQgPSBqUXVlcnkoIFwiPHNjcmlwdD5cIiApXG5cdFx0XHRcdFx0LmF0dHIoIHMuc2NyaXB0QXR0cnMgfHwge30gKVxuXHRcdFx0XHRcdC5wcm9wKCB7IGNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwgc3JjOiBzLnVybCB9IClcblx0XHRcdFx0XHQub24oIFwibG9hZCBlcnJvclwiLCBjYWxsYmFjayA9IGZ1bmN0aW9uKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRzY3JpcHQucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRjYWxsYmFjayA9IG51bGw7XG5cdFx0XHRcdFx0XHRpZiAoIGV2dCApIHtcblx0XHRcdFx0XHRcdFx0Y29tcGxldGUoIGV2dC50eXBlID09PSBcImVycm9yXCIgPyA0MDQgOiAyMDAsIGV2dC50eXBlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdC8vIFVzZSBuYXRpdmUgRE9NIG1hbmlwdWxhdGlvbiB0byBhdm9pZCBvdXIgZG9tTWFuaXAgQUpBWCB0cmlja2VyeVxuXHRcdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHRbIDAgXSApO1xuXHRcdFx0fSxcblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgb2xkQ2FsbGJhY2tzID0gW10sXG5cdHJqc29ucCA9IC8oPSlcXD8oPz0mfCQpfFxcP1xcPy87XG5cbi8vIERlZmF1bHQganNvbnAgc2V0dGluZ3NcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0anNvbnA6IFwiY2FsbGJhY2tcIixcblx0anNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyBcIl9cIiArICggbm9uY2UuZ3VpZCsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0gaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogU2FmYXJpIDggb25seVxuLy8gSW4gU2FmYXJpIDggZG9jdW1lbnRzIGNyZWF0ZWQgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudFxuLy8gY29sbGFwc2Ugc2libGluZyBmb3JtczogdGhlIHNlY29uZCBvbmUgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBmaXJzdCBvbmUuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzM3XG5zdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCA9ICggZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICkuYm9keTtcblx0Ym9keS5pbm5lckhUTUwgPSBcIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+XCI7XG5cdHJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyO1xufSApKCk7XG5cblxuLy8gQXJndW1lbnQgXCJkYXRhXCIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsXG4vLyBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXG5cdHZhciBiYXNlLCBwYXJzZWQsIHNjcmlwdHM7XG5cblx0aWYgKCAhY29udGV4dCApIHtcblxuXHRcdC8vIFN0b3Agc2NyaXB0cyBvciBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBiZWluZyBleGVjdXRlZCBpbW1lZGlhdGVseVxuXHRcdC8vIGJ5IHVzaW5nIGRvY3VtZW50LmltcGxlbWVudGF0aW9uXG5cdFx0aWYgKCBzdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCApIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBiYXNlIGhyZWYgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyBzbyBhbnkgcGFyc2VkIGVsZW1lbnRzIHdpdGggVVJMc1xuXHRcdFx0Ly8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSlcblx0XHRcdGJhc2UgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiYmFzZVwiICk7XG5cdFx0XHRiYXNlLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0Y29udGV4dC5oZWFkLmFwcGVuZENoaWxkKCBiYXNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcblx0XHR9XG5cdH1cblxuXHRwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKTtcblx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLyoqXG4gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlXG4gKi9cbmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHtcblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBpc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCBcImF1dG9cIiApID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgcmVjdCwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYVxuXHRcdC8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvclxuXHRcdGlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblx0XHR9XG5cblx0XHQvLyBHZXQgZG9jdW1lbnQtcmVsYXRpdmUgcG9zaXRpb24gYnkgYWRkaW5nIHZpZXdwb3J0IHNjcm9sbCB0byB2aWV3cG9ydC1yZWxhdGl2ZSBnQkNSXG5cdFx0cmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LFxuXHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0XG5cdFx0fTtcblx0fSxcblxuXHQvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveFxuXHQvLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBiZWhhdmlvciBvZiBDU1MgYWJzb2x1dGUgcG9zaXRpb25pbmdcblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYyxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG5cdFx0Ly8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3Rcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdGhlICpyZWFsKiBvZmZzZXQgcGFyZW50LCB3aGljaCBjYW4gYmUgdGhlIGRvY3VtZW50IG9yIGl0cyByb290IGVsZW1lbnRcblx0XHRcdC8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkXG5cdFx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiZcblx0XHRcdFx0KCBvZmZzZXRQYXJlbnQgPT09IGRvYy5ib2R5IHx8IG9mZnNldFBhcmVudCA9PT0gZG9jLmRvY3VtZW50RWxlbWVudCApICYmXG5cdFx0XHRcdGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQgIT09IGVsZW0gJiYgb2Zmc2V0UGFyZW50Lm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIEluY29ycG9yYXRlIGJvcmRlcnMgaW50byBpdHMgb2Zmc2V0LCBzaW5jZSB0aGV5IGFyZSBvdXRzaWRlIGl0cyBjb250ZW50IG9yaWdpblxuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXG5cdFx0XHQvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3Ncblx0XHRcdHZhciB3aW47XG5cdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW07XG5cdFx0XHR9IGVsc2UgaWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtLmRlZmF1bHRWaWV3O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luLnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmkgPD03IC0gOS4xLCBDaHJvbWUgPD0zNyAtIDQ5XG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU4OTM0N1xuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggX2ksIHByb3AgKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdFx0Y29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTtcblxuXHRcdFx0XHQvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXRcblx0XHRcdFx0cmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID9cblx0XHRcdFx0XHRqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyBcInB4XCIgOlxuXHRcdFx0XHRcdGNvbXB1dGVkO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn0gKTtcblxuXG4vLyBDcmVhdGUgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGgsIGhlaWdodCwgd2lkdGgsIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IEhlaWdodDogXCJoZWlnaHRcIiwgV2lkdGg6IFwid2lkdGhcIiB9LCBmdW5jdGlvbiggbmFtZSwgdHlwZSApIHtcblx0alF1ZXJ5LmVhY2goIHtcblx0XHRwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLFxuXHRcdGNvbnRlbnQ6IHR5cGUsXG5cdFx0XCJcIjogXCJvdXRlclwiICsgbmFtZVxuXHR9LCBmdW5jdGlvbiggZGVmYXVsdEV4dHJhLCBmdW5jTmFtZSApIHtcblxuXHRcdC8vIE1hcmdpbiBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0ZXJXaWR0aFxuXHRcdGpRdWVyeS5mblsgZnVuY05hbWUgXSA9IGZ1bmN0aW9uKCBtYXJnaW4sIHZhbHVlICkge1xuXHRcdFx0dmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gXCJib29sZWFuXCIgKSxcblx0XHRcdFx0ZXh0cmEgPSBkZWZhdWx0RXh0cmEgfHwgKCBtYXJnaW4gPT09IHRydWUgfHwgdmFsdWUgPT09IHRydWUgPyBcIm1hcmdpblwiIDogXCJib3JkZXJcIiApO1xuXG5cdFx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgdHlwZSwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBkb2M7XG5cblx0XHRcdFx0aWYgKCBpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gJCggd2luZG93ICkub3V0ZXJXaWR0aC9IZWlnaHQgcmV0dXJuIHcvaCBpbmNsdWRpbmcgc2Nyb2xsYmFycyAoZ2gtMTcyOSlcblx0XHRcdFx0XHRyZXR1cm4gZnVuY05hbWUuaW5kZXhPZiggXCJvdXRlclwiICkgPT09IDAgP1xuXHRcdFx0XHRcdFx0ZWxlbVsgXCJpbm5lclwiICsgbmFtZSBdIDpcblx0XHRcdFx0XHRcdGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBcImNsaWVudFwiICsgbmFtZSBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodFxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0ZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRcdFx0XHQvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0gb3IgY2xpZW50W1dpZHRoL0hlaWdodF0sXG5cdFx0XHRcdFx0Ly8gd2hpY2hldmVyIGlzIGdyZWF0ZXN0XG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcInNjcm9sbFwiICsgbmFtZSBdLCBkb2NbIFwic2Nyb2xsXCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwib2Zmc2V0XCIgKyBuYW1lIF0sIGRvY1sgXCJvZmZzZXRcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGRvY1sgXCJjbGllbnRcIiArIG5hbWUgXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cblx0XHRcdFx0XHQvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0XG5cdFx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6XG5cblx0XHRcdFx0XHQvLyBTZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50XG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKTtcblx0XHRcdH0sIHR5cGUsIGNoYWluYWJsZSA/IG1hcmdpbiA6IHVuZGVmaW5lZCwgY2hhaW5hYmxlICk7XG5cdFx0fTtcblx0fSApO1xufSApO1xuXG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwiYWpheFN0YXJ0XCIsXG5cdFwiYWpheFN0b3BcIixcblx0XCJhamF4Q29tcGxldGVcIixcblx0XCJhamF4RXJyb3JcIixcblx0XCJhamF4U3VjY2Vzc1wiLFxuXHRcImFqYXhTZW5kXCJcbl0sIGZ1bmN0aW9uKCBfaSwgdHlwZSApIHtcblx0alF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7XG5cdH07XG59ICk7XG5cblxuXG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHRiaW5kOiBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlcywgbnVsbCwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7XG5cdH0sXG5cblx0ZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkge1xuXG5cdFx0Ly8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKVxuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID9cblx0XHRcdHRoaXMub2ZmKCBzZWxlY3RvciwgXCIqKlwiICkgOlxuXHRcdFx0dGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCBcIioqXCIsIGZuICk7XG5cdH0sXG5cblx0aG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkge1xuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQub24oIFwibW91c2VlbnRlclwiLCBmbk92ZXIgKVxuXHRcdFx0Lm9uKCBcIm1vdXNlbGVhdmVcIiwgZm5PdXQgfHwgZm5PdmVyICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goXG5cdCggXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBcIiArXG5cdFwibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgXCIgK1xuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnVcIiApLnNwbGl0KCBcIiBcIiApLFxuXHRmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cblx0XHQvLyBIYW5kbGUgZXZlbnQgYmluZGluZ1xuXHRcdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID9cblx0XHRcdFx0dGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6XG5cdFx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHRcdH07XG5cdH1cbik7XG5cblxuXG5cbi8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seVxuLy8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG4vLyBSZXF1aXJlIHRoYXQgdGhlIFwid2hpdGVzcGFjZSBydW5cIiBzdGFydHMgZnJvbSBhIG5vbi13aGl0ZXNwYWNlXG4vLyB0byBhdm9pZCBPKE5eMikgYmVoYXZpb3Igd2hlbiB0aGUgZW5naW5lIHdvdWxkIHRyeSBtYXRjaGluZyBcIlxccyskXCIgYXQgZWFjaCBzcGFjZSBwb3NpdGlvbi5cbnZhciBydHJpbSA9IC9eW1xcc1xcdUZFRkZcXHhBMF0rfChbXlxcc1xcdUZFRkZcXHhBMF0pW1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG4vLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnlcbi8vIGFyZ3VtZW50cy5cbi8vIGpRdWVyeS5wcm94eSBpcyBkZXByZWNhdGVkIHRvIHByb21vdGUgc3RhbmRhcmRzIChzcGVjaWZpY2FsbHkgRnVuY3Rpb24jYmluZClcbi8vIEhvd2V2ZXIsIGl0IGlzIG5vdCBzbGF0ZWQgZm9yIHJlbW92YWwgYW55IHRpbWUgc29vblxualF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkge1xuXHR2YXIgdG1wLCBhcmdzLCBwcm94eTtcblxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdHRtcCA9IGZuWyBjb250ZXh0IF07XG5cdFx0Y29udGV4dCA9IGZuO1xuXHRcdGZuID0gdG1wO1xuXHR9XG5cblx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcblx0Ly8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC5cblx0aWYgKCAhaXNGdW5jdGlvbiggZm4gKSApIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Ly8gU2ltdWxhdGVkIGJpbmRcblx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApO1xuXHRwcm94eSA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApO1xuXHR9O1xuXG5cdC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZFxuXHRwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKztcblxuXHRyZXR1cm4gcHJveHk7XG59O1xuXG5qUXVlcnkuaG9sZFJlYWR5ID0gZnVuY3Rpb24oIGhvbGQgKSB7XG5cdGlmICggaG9sZCApIHtcblx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XG5cdH0gZWxzZSB7XG5cdFx0alF1ZXJ5LnJlYWR5KCB0cnVlICk7XG5cdH1cbn07XG5qUXVlcnkuaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5qUXVlcnkucGFyc2VKU09OID0gSlNPTi5wYXJzZTtcbmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lO1xualF1ZXJ5LmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xualF1ZXJ5LmlzV2luZG93ID0gaXNXaW5kb3c7XG5qUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xualF1ZXJ5LnR5cGUgPSB0b1R5cGU7XG5cbmpRdWVyeS5ub3cgPSBEYXRlLm5vdztcblxualF1ZXJ5LmlzTnVtZXJpYyA9IGZ1bmN0aW9uKCBvYmogKSB7XG5cblx0Ly8gQXMgb2YgalF1ZXJ5IDMuMCwgaXNOdW1lcmljIGlzIGxpbWl0ZWQgdG9cblx0Ly8gc3RyaW5ncyBhbmQgbnVtYmVycyAocHJpbWl0aXZlcyBvciBvYmplY3RzKVxuXHQvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKVxuXHR2YXIgdHlwZSA9IGpRdWVyeS50eXBlKCBvYmogKTtcblx0cmV0dXJuICggdHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcInN0cmluZ1wiICkgJiZcblxuXHRcdC8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChcIlwiKVxuXHRcdC8vIC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJseSBoZXggbGl0ZXJhbHMgKFwiMHguLi5cIilcblx0XHQvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU5cblx0XHQhaXNOYU4oIG9iaiAtIHBhcnNlRmxvYXQoIG9iaiApICk7XG59O1xuXG5qUXVlcnkudHJpbSA9IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRyZXR1cm4gdGV4dCA9PSBudWxsID9cblx0XHRcIlwiIDpcblx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApO1xufTtcblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAodHJhYy03MTAyI2NvbW1lbnQ6MTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KVxuLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAodHJhYy0xMzU2NilcbmlmICggdHlwZW9mIG5vR2xvYmFsID09PSBcInVuZGVmaW5lZFwiICkge1xuXHR3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7XG59XG5cblxuXG5cbnJldHVybiBqUXVlcnk7XG59ICk7XG4iLCJpbXBvcnQgeyBJQWN0aW9uIH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XHJcbmV4cG9ydCBjb25zdCBhY3Rpb25BZGRpbnMgOlJlY29yZDxzdHJpbmcsSUFjdGlvbj49e307XHJcbiIsIlxyXG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xyXG5pbXBvcnQgeyAgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQgfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuXHJcbmludGVyZmFjZSBJTXVzdElucHV0UHJvcHN7XHJcbiAgICBmaWVsZDpJRmllbGQ7XHJcbiAgICBtZXNzYWdlOnN0cmluZzsgXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNdXN0SW5wdXRBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9ue1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xyXG4gICAgcHJvcHM6SU11c3RJbnB1dFByb3BzO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLm5hbWU9XCLlv4XpoIjjg4Hjgqfjg4Pjgq9cIjtcclxuICAgICAgICB0aGlzLmFjdGlvblByb3BzPVtdO1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICAgICAgICB0aGlzLnByb3BzPXtcclxuICAgICAgICAgICAgZmllbGQ6e2NvZGU6Jyd9LFxyXG4gICAgICAgICAgICBtZXNzYWdlOicnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuICAgICAgICBsZXQgcmVzdWx0PXtcclxuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9YWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcclxuICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ21lc3NhZ2UnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSU11c3RJbnB1dFByb3BzO1xyXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGV2ZW50LnJlY29yZDtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdPy52YWx1ZTtcclxuICAgICAgICBpZih2YWx1ZT09PXVuZGVmaW5lZCB8fCB2YWx1ZT09PScnKXtcclxuICAgICAgICAgICAgcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0uZXJyb3I9dGhpcy5wcm9wcy5tZXNzYWdlO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQ9IHtcclxuICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcclxuICAgICAgICAgIHJlc3VsdDp0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcclxuICAgIH1cclxuICAgIFxyXG59XHJcbm5ldyBNdXN0SW5wdXRBY3Rpb24oKTsiLCJleHBvcnQgY2xhc3MgRm9ybWF0dGVye1xyXG4gICAgc3RhdGljIG51bWJlckZvcm1hdChudW06bnVtYmVyLGZvcm1hdDpzdHJpbmcpOnN0cmluZ3tcclxuICAgICAgICBsZXQgaW50ZWdlclBhcnQgPSBNYXRoLmZsb29yKE1hdGguYWJzKG51bSkpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgbGV0IGZyYWN0aW9uUGFydCA9IE1hdGguYWJzKG51bSkudG9TdHJpbmcoKS5zcGxpdCgnLicpWzFdIHx8ICcnO1xyXG4gICAgICAgIGxldCBpc05lZ2F0aXZlID0gbnVtIDwgMDtcclxuICAgICAgICBsZXQgaXNQZXJjZW50ID0gZm9ybWF0LmluY2x1ZGVzKCclJyk7ICAgICAgIFxyXG4gICAgICAgIC8vICVcclxuICAgICAgICBpZiAoaXNQZXJjZW50KSB7XHJcbiAgICAgICAgICAgIG51bSAqPSAxMDA7XHJcbiAgICAgICAgICAgIGludGVnZXJQYXJ0ID0gTWF0aC5mbG9vcihNYXRoLmFicyhudW0pKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBmcmFjdGlvblBhcnQgPSBNYXRoLmFicyhudW0pLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXSB8fCAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8g5bCP5pWw44Go5pW05pWw6YOo5YiG44Gu5Yem55CGXHJcbiAgICAgICAgbGV0IFtpbnRlZ2VyRm9ybWF0LCBmcmFjdGlvbkZvcm1hdF0gPSBmb3JtYXQuc3BsaXQoJy4nKTtcclxuICAgICAgICBpbnRlZ2VyUGFydCA9IGludGVnZXJGb3JtYXQgPyBpbnRlZ2VyUGFydC5wYWRTdGFydChpbnRlZ2VyRm9ybWF0LnJlcGxhY2UoL1teMF0vZywgJycpLmxlbmd0aCwgJzAnKSA6IGludGVnZXJQYXJ0O1xyXG4gICAgICAgIGZyYWN0aW9uUGFydCA9IGZyYWN0aW9uUGFydC5wYWRFbmQoZnJhY3Rpb25Gb3JtYXQgPyBmcmFjdGlvbkZvcm1hdC5sZW5ndGggOiAwLCAnMCcpO1xyXG5cclxuICAgICAgICAvLyDjgqvjg57ljLrliIdcclxuICAgICAgICBpZiAoLywvLnRlc3QoaW50ZWdlckZvcm1hdCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBbXTtcclxuICAgICAgICAgICAgd2hpbGUgKGludGVnZXJQYXJ0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBwYXJ0cy51bnNoaWZ0KGludGVnZXJQYXJ0LnNsaWNlKC0zKSk7XHJcbiAgICAgICAgICAgIGludGVnZXJQYXJ0ID0gaW50ZWdlclBhcnQuc2xpY2UoMCwgLTMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGludGVnZXJQYXJ0ID0gcGFydHMuam9pbignLCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g44GZ44G544Gm57WE5ZCI44KP44GbXHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZyYWN0aW9uRm9ybWF0ID8gYCR7aW50ZWdlclBhcnR9LiR7ZnJhY3Rpb25QYXJ0fWAgOiBpbnRlZ2VyUGFydDtcclxuICAgICAgICByZXN1bHQgPSBpc05lZ2F0aXZlID8gYC0ke3Jlc3VsdH1gIDogcmVzdWx0O1xyXG4gICAgICAgIHJldHVybiBpc1BlcmNlbnQgPyBgJHtyZXN1bHR9JWAgOiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAgIFxyXG4gICAgc3RhdGljIGRhdGVGb3JtYXQoZGF0ZTogRGF0ZSwgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IGhvdXIgPSBkYXRlLmdldEhvdXJzKCk7XHJcbiAgICAgICAgY29uc3QgbWludXRlID0gZGF0ZS5nZXRNaW51dGVzKCk7XHJcbiAgICAgICAgY29uc3Qgc2Vjb25kID0gZGF0ZS5nZXRTZWNvbmRzKCk7XHJcbiAgICAgICAgY29uc3QgbWlsbGlzZWNvbmQgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIGNvbnN0IHRpbWVab25lT2Zmc2V0ID0gLWRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwO1xyXG4gICAgICBcclxuICAgICAgICBjb25zdCByZXBsYWNlbWVudHMgPSB7XHJcbiAgICAgICAgICAneXl5eSc6IHllYXIudG9TdHJpbmcoKSxcclxuICAgICAgICAgICd5eSc6IHllYXIudG9TdHJpbmcoKS5zbGljZSgtMiksXHJcbiAgICAgICAgICAnTU0nOiBtb250aC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyksXHJcbiAgICAgICAgICAnTSc6IG1vbnRoLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAnZGQnOiBkYXkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxyXG4gICAgICAgICAgJ2QnOiBkYXkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICdISCc6IGhvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxyXG4gICAgICAgICAgJ0gnOiBob3VyLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAnaGgnOiAoaG91ciA+IDEyID8gaG91ciAtIDEyIDogaG91cikudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxyXG4gICAgICAgICAgJ2gnOiAoaG91ciA+IDEyID8gaG91ciAtIDEyIDogaG91cikudG9TdHJpbmcoKSxcclxuICAgICAgICAgICdtbSc6IG1pbnV0ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyksXHJcbiAgICAgICAgICAnbSc6IG1pbnV0ZS50b1N0cmluZygpLFxyXG4gICAgICAgICAgJ3NzJzogc2Vjb25kLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSxcclxuICAgICAgICAgICdzJzogc2Vjb25kLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAnZmZmJzogbWlsbGlzZWNvbmQudG9TdHJpbmcoKS5wYWRTdGFydCgzLCAnMCcpLFxyXG4gICAgICAgICAgJ3p6eic6ICh0aW1lWm9uZU9mZnNldCA+PSAwID8gJysnIDogJy0nKSArIE1hdGguYWJzKHRpbWVab25lT2Zmc2V0KS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnOjAwJ1xyXG4gICAgICAgIH07XHJcbiAgICAgIFxyXG4gICAgICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgveXl5eXx5eXxNTXxNfGRkfGR8SEh8SHxoaHxofG1tfG18c3N8c3xmZmZ8enp6L2csIChtYXRjaCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50c1ttYXRjaCBhcyBrZXlvZiB0eXBlb2YgcmVwbGFjZW1lbnRzXSB8fCBtYXRjaDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgXHJcblxyXG59IiwiXHJcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7IElGaWVsZCwgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJQ29udGV4dCwgSVZhck5hbWUgfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuaW1wb3J0IHsgRm9ybWF0dGVyIH0gZnJvbSBcIi4uL3V0aWwvZm9ybWF0XCI7XHJcblxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgICBpbnRlcmZhY2UgV2luZG93IHsgJGZvcm1hdDogYW55OyB9ICBcclxufVxyXG5cclxuaW50ZXJmYWNlIElBdXRvTnVtYmVyaW5nUHJvcHN7XHJcbiAgICAvL+aWh+abuOeVquWPt+OCkuagvOe0jeOBmeOCi1xyXG4gICAgZmllbGQ6SUZpZWxkO1xyXG4gICAgZm9ybWF0OnN0cmluZztcclxuICAgIHByZWZpeDpzdHJpbmc7XHJcbiAgICBzdWZmaXg6c3RyaW5nO1xyXG4gICAgdmVyTmFtZTpJVmFyTmFtZTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEF1dG9OdW1iZXJpbmcgaW1wbGVtZW50cyBJQWN0aW9ue1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xyXG4gICAgcHJvcHM6SUF1dG9OdW1iZXJpbmdQcm9wcztcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5uYW1lPVwi6Ieq5YuV5o6h55Wq44GZ44KLXCI7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XHJcbiAgICAgICAgdGhpcy5wcm9wcz17XHJcbiAgICAgICAgICAgIGZpZWxkOntjb2RlOicnfSxcclxuICAgICAgICAgICAgZm9ybWF0OicnLFxyXG4gICAgICAgICAgICBwcmVmaXg6JycsXHJcbiAgICAgICAgICAgIHN1ZmZpeDonJyxcclxuICAgICAgICAgICAgdmVyTmFtZTp7bmFtZTonJ31cclxuICAgICAgICB9XHJcbiAgICAgICAgZ2xvYmFsVGhpcy53aW5kb3cuJGZvcm1hdD10aGlzLmZvcm1hdDtcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XHJcbiAgICB9XHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lh6bnkIbjgpLlrp/oo4XjgZnjgotcclxuICogQHBhcmFtIGFjdGlvbk5vZGUg44Ki44Kv44K344On44Oz44OO44O844OJXHJcbiAqIEBwYXJhbSBldmVudCBLaW50b25l44Gu44Kk44OZ44Oz44OIXHJcbiAqIEBwYXJhbSBjb250ZXh0IOOCs+ODs+ODhuOCreOCueODiO+8iOODrOOCs+ODvOODieOAgeWkieaVsOaDheWgseOCkuaMgeOBo+OBpuOBhOOCi++8iVxyXG4gKiBAcmV0dXJucyBcclxuICovXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgICAgIGxldCByZXN1bHQ9e1xyXG4gICAgICAgICAgICBjYW5OZXh0OmZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ2Zvcm1hdCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJQXV0b051bWJlcmluZ1Byb3BzO1xyXG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvY051bSA9IGF3YWl0IHRoaXMuY3JlYXRlTnVtYmVyKHRoaXMucHJvcHMpO1xyXG4gICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS52YWx1ZT1kb2NOdW07XHJcbiAgICAgICAgICAgIC8v5aSJ5pWw6Kit5a6aXHJcbiAgICAgICAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSAmJiB0aGlzLnByb3BzLnZlck5hbWUubmFtZSE9PScnKXtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXT1kb2NOdW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzdWx0PSB7XHJcbiAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICAgIHJlc3VsdDp0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgZXZlbnQuZXJyb3I9XCLlh6bnkIbkuK3nlbDluLjjgYznmbrnlJ/jgZfjgb7jgZfjgZ/jgIJcIjtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGNhbk5leHQ6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleGVjVGVtcGxhdGUodGVtcGxhdGU6c3RyaW5nKTpzdHJpbmd7XHJcbiAgICAgICAgaWYodGVtcGxhdGU9PT11bmRlZmluZWQpIHJldHVybiAnJztcclxuICAgICAgICBjb25zdCByZWdleCA9IC9cXCRcXHsoW159XSspXFx9L2c7XHJcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UocmVnZXgsKG1hdGNoLGV4cHIpPT57XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4ZWNFdmFsKG1hdGNoLGV4cHIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGV4ZWNFdmFsKG1hdGNoOnN0cmluZyxleHByOnN0cmluZyk6c3RyaW5ne1xyXG4gICAgICAgIGNvbnNvbGUubG9nKG1hdGNoKTtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIGV2YWwoZXhwcik7XHJcbiAgICB9XHJcblxyXG4gICAgZm9ybWF0KHBhdHRlcm46c3RyaW5nKTpzdHJpbmd7XHJcbiAgICAgICAgY29uc3Qgbm93PW5ldyBEYXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIEZvcm1hdHRlci5kYXRlRm9ybWF0KG5vdywgcGF0dGVybik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY3JlYXRlTnVtYmVyKHByb3BzOklBdXRvTnVtYmVyaW5nUHJvcHMpe1xyXG4gICAgICAgIGxldCBudW1iZXIgOnN0cmluZz0nJztcclxuICAgICAgICBsZXQgcHJlZml4OnN0cmluZz0nJztcclxuICAgICAgICBsZXQgc3VmZml4OnN0cmluZz0nJztcclxuICAgICAgICBsZXQgbm89MTsgICAgIFxyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgbm8gPSBhd2FpdCB0aGlzLmZldGNoTm8oKTtcclxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHByb3BzLmZvcm1hdCE9PXVuZGVmaW5lZCAmJiBwcm9wcy5mb3JtYXQhPT0nJyl7XHJcbiAgICAgICAgICAgIG51bWJlcj1Gb3JtYXR0ZXIubnVtYmVyRm9ybWF0KG5vLCBwcm9wcy5mb3JtYXQpO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBudW1iZXI9bm8udG9TdHJpbmcoMTApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYocHJvcHMucHJlZml4IT09dW5kZWZpbmVkICYmIHByb3BzLnByZWZpeCE9PScnKXtcclxuICAgICAgICAgICAgcHJlZml4PXRoaXMuZXhlY1RlbXBsYXRlKHByb3BzLnByZWZpeCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihwcm9wcy5zdWZmaXghPT11bmRlZmluZWQgJiYgcHJvcHMuc3VmZml4IT09Jycpe1xyXG4gICAgICAgICAgICBzdWZmaXg9dGhpcy5leGVjVGVtcGxhdGUocHJvcHMuc3VmZml4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke251bWJlcn0ke3N1ZmZpeH1gO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZldGNoTm8oKTpQcm9taXNlPG51bWJlcj57XHJcbiAgICAgICAgbGV0IHJlY05vPTE7XHJcblxyXG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcga2ludG9uZS5Qcm9taXNlPG51bWJlcj4oKHJlc29sdmUscmVqZWN0KT0+e1xyXG4gICAgICAgICAgICBjb25zdCBhcHB1cmwgPSBraW50b25lLmFwaS51cmwoJy9rL3YxL3JlY29yZHMnLHRydWUpO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJhbXM9e1xyXG4gICAgICAgICAgICAgICAgYXBwOmtpbnRvbmUuYXBwLmdldElkKCksXHJcbiAgICAgICAgICAgICAgICBmaWVsZHM6WyckaWQnXSxcclxuICAgICAgICAgICAgICAgIHF1ZXJ5OidsaW1pdCAxJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4ga2ludG9uZS5hcGkoYXBwdXJsLCdHRVQnLHBhcmFtcykudGhlbigocmVzcCk9PntcclxuICAgICAgICAgICAgICAgIGlmKHJlc3AucmVjb3Jkc1swXSE9PW51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY05vID0gcGFyc2VJbnQocmVzcC5yZWNvcmRzWzBdLiRpZC52YWx1ZSwxMCkrMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVjTm8pO1xyXG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpPT57XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlcigpOiB2b2lkIHtcclxuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXT10aGlzO1xyXG4gICAgfVxyXG4gICAgXHJcbn1cclxubmV3IEF1dG9OdW1iZXJpbmcoKTsiLCJpbXBvcnQgeyBJQ29udGV4dCB9IGZyb20gXCIuL0FjdGlvblR5cGVzXCI7XHJcblxyXG4vL+ODjuODvOODieeoruWIpVxyXG5leHBvcnQgZW51bSBOb2RlVHlwZXtcclxuICBSb290ID0gJ3Jvb3QnLFxyXG4gIExvZ2ljR3JvdXAgPSdsb2dpY2dyb3VwJyxcclxuICBDb25kaXRpb24gPSdjb25kaXRpb24nXHJcbn1cclxuXHJcbi8v44Ot44K444OD44Kv44Kq44Oa44Os44O844K/44O8XHJcbmV4cG9ydCBlbnVtIExvZ2ljYWxPcGVyYXRvcntcclxuICBBTkQgPSAnQU5EJyxcclxuICBPUiA9ICdPUidcclxufVxyXG5cclxuLy/mnaHku7bjgqrjg5rjg6zjg7zjgr/jg7xcclxuZXhwb3J0IGVudW0gT3BlcmF0b3J7XHJcbiAgRXF1YWwgPSAnPScsXHJcbiAgTm90RXF1YWw9JyE9JyxcclxuICBHcmVhdGVyID0gJz4nLFxyXG4gIEdyZWF0ZXJPckVxdWFsID0gJz49JyxcclxuICBMZXNzID0gJzwnLFxyXG4gIExlc3NPckVxdWFsID0gJzw9JyxcclxuICBDb250YWlucyA9ICdjb250YWlucycsXHJcbiAgTm90Q29udGFpbnMgPSAnbm90IGNvbnRhaW5zJyxcclxuICBTdGFydFdpdGggPSAnc3RhcnQgV2l0aCcsXHJcbiAgRW5kV2l0aCA9ICdlbmQgd2l0aCcsXHJcbiAgTm90U3RhcnRXaXRoID0gJ25vdCBzdGFydCB3aXRoJyxcclxuICBOb3RFbmRXaXRoID0gJ25vdCBlbmQgd2l0aCdcclxufVxyXG5cclxuXHJcbi8vIElOb2RlXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU5vZGUge1xyXG4gIGluZGV4Om51bWJlcjtcclxuICB0eXBlOiBOb2RlVHlwZTtcclxuICBoZWFkZXI6c3RyaW5nO1xyXG4gIHBhcmVudDogSU5vZGUgfCBudWxsO1xyXG4gIGxvZ2ljYWxPcGVyYXRvcjpMb2dpY2FsT3BlcmF0b3JcclxufVxyXG5cclxuLy8g44Ot44K444OD44Kv44OO44O844OJXHJcbmV4cG9ydCBjbGFzcyBHcm91cE5vZGUgaW1wbGVtZW50cyBJTm9kZSB7XHJcbiAgaW5kZXg6bnVtYmVyO1xyXG4gIHR5cGU6IE5vZGVUeXBlO1xyXG4gIGNoaWxkcmVuOiBJTm9kZVtdO1xyXG4gIHBhcmVudDogSU5vZGUgfCBudWxsO1xyXG4gIGxvZ2ljYWxPcGVyYXRvcjogTG9naWNhbE9wZXJhdG9yO1xyXG4gIGdldCBsYWJlbCgpOnN0cmluZ3tcclxuICAgIHJldHVybiB0aGlzLmxvZ2ljYWxPcGVyYXRvcjtcclxuICB9XHJcbiAgZ2V0IGhlYWRlcigpOnN0cmluZ3tcclxuICAgIHJldHVybiB0aGlzLnR5cGU9PT1Ob2RlVHlwZS5Sb290Pydyb290JzonZ2VuZXJpYyc7XHJcbiAgfVxyXG4gIGdldCBleHBhbmRlZCgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg+MDtcclxuICB9XHJcbiAgY29uc3RydWN0b3IobG9naWNPcDpMb2dpY2FsT3BlcmF0b3IsIHBhcmVudDogSU5vZGUgfCBudWxsKSB7XHJcbiAgICB0aGlzLmluZGV4PTA7XHJcbiAgICB0aGlzLnR5cGUgPSBwYXJlbnQ9PW51bGw/Tm9kZVR5cGUuUm9vdDogTm9kZVR5cGUuTG9naWNHcm91cDtcclxuICAgIHRoaXMubG9naWNhbE9wZXJhdG9yID0gbG9naWNPcDtcclxuICAgIHRoaXMucGFyZW50PXBhcmVudDtcclxuICAgIHRoaXMuY2hpbGRyZW49W107XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZnJvbUpTT04oanNvbjogYW55LCBwYXJlbnQ6IElOb2RlIHwgbnVsbCA9IG51bGwpOiBHcm91cE5vZGUge1xyXG4gICAgY29uc3Qgbm9kZSA9IG5ldyBHcm91cE5vZGUoanNvbi5sb2dpY2FsT3BlcmF0b3IsIHBhcmVudCk7XHJcbiAgICBub2RlLmluZGV4PWpzb24uaW5kZXg7XHJcbiAgICBub2RlLmNoaWxkcmVuID0ganNvbi5jaGlsZHJlbi5tYXAoKGNoaWxkSnNvbjogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBjaGlsZEpzb24udHlwZSA9PT0gTm9kZVR5cGUuTG9naWNHcm91cFxyXG4gICAgICAgID8gR3JvdXBOb2RlLmZyb21KU09OKGNoaWxkSnNvbiwgbm9kZSlcclxuICAgICAgICA6IENvbmRpdGlvbk5vZGUuZnJvbUpTT04oY2hpbGRKc29uLCBub2RlKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG5vZGU7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuLy8g5p2h5Lu25byP44OO44O844OJXHJcbmV4cG9ydCBjbGFzcyBDb25kaXRpb25Ob2RlIGltcGxlbWVudHMgSU5vZGUge1xyXG4gIGluZGV4OiBudW1iZXI7XHJcbiAgdHlwZTogTm9kZVR5cGU7XHJcbiAgcGFyZW50OklOb2RlO1xyXG4gIGdldCBsb2dpY2FsT3BlcmF0b3IoKTogTG9naWNhbE9wZXJhdG9ye1xyXG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmxvZ2ljYWxPcGVyYXRvcjtcclxuICB9O1xyXG4gIG9iamVjdDogYW55OyAvLyDmr5TovIPlhYNcclxuICBvcGVyYXRvcjogT3BlcmF0b3I7IC8vIOavlOi8g+WtkFxyXG4gIHZhbHVlOiBhbnk7XHJcbiAgZ2V0IGhlYWRlcigpOnN0cmluZ3tcclxuICAgIHJldHVybiAnZ2VuZXJpYyc7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvYmplY3Q6IGFueSwgb3BlcmF0b3I6IE9wZXJhdG9yLCB2YWx1ZTogYW55LCBwYXJlbnQ6IEdyb3VwTm9kZSkge1xyXG4gICAgdGhpcy5pbmRleD0wO1xyXG4gICAgdGhpcy50eXBlID0gTm9kZVR5cGUuQ29uZGl0aW9uO1xyXG4gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XHJcbiAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLnBhcmVudD1wYXJlbnQ7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZnJvbUpTT04oanNvbjogYW55LCBwYXJlbnQ6IEdyb3VwTm9kZSk6IENvbmRpdGlvbk5vZGUge1xyXG4gICAgY29uc3Qgbm9kZT0gbmV3IENvbmRpdGlvbk5vZGUoXHJcbiAgICAgIGpzb24ub2JqZWN0LFxyXG4gICAgICBqc29uLm9wZXJhdG9yLFxyXG4gICAgICBqc29uLnZhbHVlLFxyXG4gICAgICBwYXJlbnRcclxuICAgICk7XHJcbiAgICBub2RlLmluZGV4PWpzb24uaW5kZXg7XHJcbiAgICByZXR1cm4gbm9kZTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDmnaHku7blvI/jga7nrqHnkIbjgq/jg6njgrlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb25kaXRpb25UcmVlIHtcclxuICByb290OiBHcm91cE5vZGU7XHJcbiAgbWF4SW5kZXg6bnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMubWF4SW5kZXg9MDtcclxuICAgIHRoaXMucm9vdCA9IG5ldyBHcm91cE5vZGUoTG9naWNhbE9wZXJhdG9yLkFORCwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDjg47jg7zjg4nov73liqBcclxuICAgKiBAcGFyYW0gcGFyZW50IFxyXG4gICAqIEBwYXJhbSBub2RlIFxyXG4gICAqL1xyXG4gIGFkZE5vZGUocGFyZW50OiBHcm91cE5vZGUsIG5vZGU6IElOb2RlKTogdm9pZCB7XHJcbiAgICB0aGlzLm1heEluZGV4Kys7XHJcbiAgICBub2RlLmluZGV4PXRoaXMubWF4SW5kZXg7XHJcbiAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqICDjg47jg7zjg4nliYrpmaRcclxuICAgKiBAcGFyYW0gbm9kZSBcclxuICAgKi9cclxuICByZW1vdmVOb2RlKG5vZGU6IElOb2RlKTogdm9pZCB7XHJcbiAgICBpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCfjg6vjg7zjg4jjg47jg7zjg4nliYrpmaTjgafjgY3jgb7jgZvjgpMnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50IGFzIEdyb3VwTm9kZTtcclxuICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8qKlxyXG4gKiDmnaHku7bjg4Tjg6rjg7zjgYvjgonjgqTjg7Pjg4fjgqPjgq/jgrnlgKTjgafmnaHku7bjg47jg7zjg4njgpLmpJzntKLjgZnjgotcclxuICogQHBhcmFtIGluZGV4IFxyXG4gKiBAcmV0dXJucyBcclxuICovXHJcbiAgZmluZEJ5SW5kZXgoaW5kZXg6bnVtYmVyKTpJTm9kZXx1bmRlZmluZWR7XHJcbiAgICByZXR1cm4gdGhpcy5maW5kQ2hpbGRyZW4odGhpcy5yb290LGluZGV4KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOaMh+WumuOBruODjuODvOODieOCsOODq+ODvOODl+OBi+OCieOCpOODs+ODh+OCo+OCr+OCueWApOOBp+adoeS7tuODjuODvOODieOCkuaknOe0ouOBmeOCi1xyXG4gICAqIEBwYXJhbSBwYXJlbnQgXHJcbiAgICogQHBhcmFtIGluZGV4IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGZpbmRDaGlsZHJlbihwYXJlbnQ6IEdyb3VwTm9kZSwgaW5kZXg6IG51bWJlcik6IElOb2RlIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmIChwYXJlbnQuaW5kZXggPT09IGluZGV4KSB7XHJcbiAgICAgIHJldHVybiBwYXJlbnQ7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcGFyZW50LmNoaWxkcmVuKSB7XHJcbiAgICAgIGlmIChub2RlLmluZGV4ID09PSBpbmRleCkge1xyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlLnR5cGUgIT09IE5vZGVUeXBlLkNvbmRpdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGZvdW5kTm9kZSA9IHRoaXMuZmluZENoaWxkcmVuKG5vZGUgYXMgR3JvdXBOb2RlLCBpbmRleCk7XHJcbiAgICAgICAgaWYgKGZvdW5kTm9kZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZvdW5kTm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gbm9kZSDmnIDlpKfjga7jgqTjg7Pjg4fjgqPjgq/jgrnlgKTjgpLlj5blvpfjgZnjgotcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRNYXhJbmRleChub2RlOklOb2RlKTpudW1iZXJ7XHJcbiAgICBsZXQgbWF4SW5kZXg6bnVtYmVyPW5vZGUuaW5kZXg7XHJcbiAgICBpZihub2RlLnR5cGUhPT1Ob2RlVHlwZS5Db25kaXRpb24pe1xyXG4gICAgICBjb25zdCBncm91cE5vZGUgPSBub2RlIGFzIEdyb3VwTm9kZTtcclxuICAgICAgZ3JvdXBOb2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKT0+e1xyXG4gICAgICAgICAgY29uc3QgY2hpbGRNYXggPSB0aGlzLmdldE1heEluZGV4KGNoaWxkKTtcclxuICAgICAgICAgIGlmKGNoaWxkTWF4Pm1heEluZGV4KXtcclxuICAgICAgICAgICAgbWF4SW5kZXg9Y2hpbGRNYXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1heEluZGV4O1xyXG59XHJcblxyXG4gIC8qKlxyXG4gICAqIOadoeS7tuW8j+OCkuihqOekuuOBmeOCi1xyXG4gICAqIEBwYXJhbSBub2RlIOadoeS7tuODjuODvOODiVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGJ1aWxkQ29uZGl0aW9uU3RyaW5nKG5vZGU6SU5vZGUpe1xyXG4gICAgaWYgKG5vZGUudHlwZSAhPT0gTm9kZVR5cGUuQ29uZGl0aW9uKSB7XHJcbiAgICAgIGxldCBjb25kaXRpb25TdHJpbmcgPSAnKCc7XHJcbiAgICAgIGNvbnN0IGdyb3VwTm9kZSA9IG5vZGUgYXMgR3JvdXBOb2RlO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwTm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkQ29uZGl0aW9uU3RyaW5nID0gdGhpcy5idWlsZENvbmRpdGlvblN0cmluZyhncm91cE5vZGUuY2hpbGRyZW5baV0pO1xyXG4gICAgICAgIGlmIChjaGlsZENvbmRpdGlvblN0cmluZyAhPT0gJycpIHtcclxuICAgICAgICAgIGNvbmRpdGlvblN0cmluZyArPSBjaGlsZENvbmRpdGlvblN0cmluZztcclxuICAgICAgICAgIGlmIChpIDwgZ3JvdXBOb2RlLmNoaWxkcmVuLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uU3RyaW5nICs9IGAgJHtncm91cE5vZGUubG9naWNhbE9wZXJhdG9yfSBgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25kaXRpb25TdHJpbmcgKz0gJyknO1xyXG4gICAgICByZXR1cm4gY29uZGl0aW9uU3RyaW5nO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY29uZE5vZGU9bm9kZSBhcyBDb25kaXRpb25Ob2RlO1xyXG4gICAgICBpZiAoY29uZE5vZGUub2JqZWN0ICYmIGNvbmROb2RlLm9wZXJhdG9yICkge1xyXG4gICAgICAgIGxldCB2YWx1ZT1jb25kTm9kZS52YWx1ZTtcclxuICAgICAgICBpZih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09J29iamVjdCcgJiYgKCdsYWJlbCcgaW4gdmFsdWUpKXtcclxuICAgICAgICAgICAgdmFsdWUgPWNvbmROb2RlLnZhbHVlLmxhYmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7Y29uZE5vZGUub2JqZWN0Lm5hbWV9ICR7Y29uZE5vZGUub3BlcmF0b3J9ICcke3ZhbHVlfSdgO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiDjgZnjgbnjgabmnaHku7blvI/jgpLlj5blvpfjgZnjgotcclxuICAgKi9cclxuICBnZXRDb25kaXRpb25zKHBhcmVudDpHcm91cE5vZGUpOkNvbmRpdGlvbk5vZGVbXXtcclxuICAgIGNvbnN0IGNvbmRpTm9kZXM6Q29uZGl0aW9uTm9kZVtdPVtdO1xyXG4gICAgcGFyZW50LmNoaWxkcmVuLmZvckVhY2goKG5vZGUpPT57XHJcbiAgICAgIGlmKG5vZGUudHlwZT09PU5vZGVUeXBlLkNvbmRpdGlvbil7XHJcbiAgICAgICAgY29uZGlOb2Rlcy5wdXNoKG5vZGUgYXMgQ29uZGl0aW9uTm9kZSk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIGNvbmRpTm9kZXMucHVzaCguLi50aGlzLmdldENvbmRpdGlvbnMobm9kZSBhcyBHcm91cE5vZGUpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY29uZGlOb2RlcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwYXJlbnQg44GZ44G544Gm5p2h5Lu244Kw44Or44O844OX44KS5Y+W5b6X44GZ44KLXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZ2V0R3JvdXBzKHBhcmVudDpHcm91cE5vZGUpOm51bWJlcltde1xyXG4gICAgY29uc3QgZ3JvdXBzOm51bWJlcltdPVtdO1xyXG4gICAgZ3JvdXBzLnB1c2gocGFyZW50LmluZGV4KTtcclxuICAgIHBhcmVudC5jaGlsZHJlbi5mb3JFYWNoKChub2RlKT0+e1xyXG4gICAgICBpZihub2RlLnR5cGUhPT1Ob2RlVHlwZS5Db25kaXRpb24pe1xyXG4gICAgICAgIGdyb3Vwcy5wdXNoKC4uLnRoaXMuZ2V0R3JvdXBzKG5vZGUgYXMgR3JvdXBOb2RlKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGdyb3VwcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEpzb27jgYvjgonlvqnlhYNcclxuICAgKiBAcGFyYW0ganNvblN0cmluZyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBmcm9tSnNvbihqc29uU3RyaW5nOiBzdHJpbmcpOiBJTm9kZSB7XHJcbiAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcclxuICAgIHRoaXMucm9vdCA9IEdyb3VwTm9kZS5mcm9tSlNPTihqc29uKSBhcyBHcm91cE5vZGU7XHJcbiAgICB0aGlzLm1heEluZGV4PXRoaXMuZ2V0TWF4SW5kZXgodGhpcy5yb290KTtcclxuICAgIHJldHVybiB0aGlzLnJvb3Q7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEpTT07mloflrZfliJfjgavlpInmj5vjgZnjgotcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICB0b0pzb24oKTpzdHJpbmd7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5yb290LCAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgICBpZiAoa2V5ID09PSAncGFyZW50Jykge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlLnR5cGUgOiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5p2h5Lu25byP44KS6KiI566X44GZ44KLXHJcbiAgICogQHBhcmFtIG5vZGUgXHJcbiAgICogQHBhcmFtIGNvbnRleHQgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZXZhbHVhdGUobm9kZTogSU5vZGUsIGNvbnRleHQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGUuQ29uZGl0aW9uKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKG5vZGUgYXMgQ29uZGl0aW9uTm9kZSwgY29udGV4dCk7XHJcbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGUuTG9naWNHcm91cCB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlLlJvb3QpIHtcclxuICAgICAgY29uc3QgZ3JvdXBOb2RlID0gbm9kZSBhcyBHcm91cE5vZGU7XHJcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBncm91cE5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHRoaXMuZXZhbHVhdGUoY2hpbGQsIGNvbnRleHQpKTtcclxuICBcclxuICAgICAgaWYgKGdyb3VwTm9kZS5sb2dpY2FsT3BlcmF0b3IgPT09IExvZ2ljYWxPcGVyYXRvci5BTkQpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0cy5ldmVyeShyZXN1bHQgPT4gcmVzdWx0KTtcclxuICAgICAgfSBlbHNlIGlmIChncm91cE5vZGUubG9naWNhbE9wZXJhdG9yID09PSBMb2dpY2FsT3BlcmF0b3IuT1IpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0cy5zb21lKHJlc3VsdCA9PiByZXN1bHQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbG9naWNhbCBvcGVyYXRvcicpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG5vZGUgdHlwZScpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBDb25kaXRpb24gb2JqZWN044Gu5YCk44KS5Y+W5b6X44GZ44KLXHJcbiAgICogQHBhcmFtIG9iamVjdCBcclxuICAgKiBAcGFyYW0gY29udGV4dCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRPYmplY3RWYWx1ZShvYmplY3Q6YW55LGNvbnRleHQ6SUNvbnRleHQpe1xyXG4gICAgaWYoIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0IT09XCJvYmplY3RcIiB8fCAhKFwib2JqZWN0VHlwZVwiIGluIG9iamVjdCkpe1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBpZihvYmplY3Qub2JqZWN0VHlwZT09PSdmaWVsZCcpe1xyXG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gY29udGV4dC5yZWNvcmRbb2JqZWN0LmNvZGVdO1xyXG4gICAgICBpZihmaWVsZFZhbHVlLnR5cGU9PT0nTlVNQkVSJyAmJiBmaWVsZFZhbHVlLnZhbHVlIT09dW5kZWZpbmVkKXtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKGZpZWxkVmFsdWUudmFsdWUpO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICByZXR1cm4gZmllbGRWYWx1ZS52YWx1ZTtcclxuICAgICAgfSAgICAgIFxyXG4gICAgfWVsc2UgaWYob2JqZWN0Lm9iamVjdFR5cGU9PT0ndmFyaWFibGUnKXtcclxuICAgICAgcmV0dXJuIGNvbnRleHQudmFyaWFibGVzW29iamVjdC5uYW1lXS52YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOavlOi8g+OCquODluOCuOOCp+OCr+ODiOOBruWApOOCkuWPluW+l1xyXG4gICAqIEBwYXJhbSBvYmplY3QgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZ2V0Q29uZGl0aW9uVmFsdWUob2JqZWN0OmFueSl7XHJcbiAgICBpZighb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QhPT1cIm9iamVjdFwiKXtcclxuICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgIH1cclxuICAgIGlmKFwic2hhcmVkVGV4dFwiIGluIG9iamVjdCl7XHJcbiAgICAgIHJldHVybiBvYmplY3Quc2hhcmVkVGV4dDtcclxuICAgIH1cclxuICAgIGlmKFwibGFiZWxcIiBpbiBvYmplY3Qpe1xyXG4gICAgICByZXR1cm4gb2JqZWN0LmxhYmVsO1xyXG4gICAgfVxyXG4gICAgaWYoXCJ2YWx1ZVwiIGluIG9iamVjdCl7XHJcbiAgICAgIHJldHVybiBvYmplY3QudmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZihcIm5hbWVcIiBpbiBvYmplY3Qpe1xyXG4gICAgICByZXR1cm4gb2JqZWN0Lm5hbWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDmnaHku7blvI/jgpLoqIjnrpfjgZnjgotcclxuICAgKiBAcGFyYW0gY29uZGl0aW9uIFxyXG4gICAqIEBwYXJhbSBjb250ZXh0IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGV2YWx1YXRlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uTm9kZSwgY29udGV4dDogSUNvbnRleHQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHsgb2JqZWN0LCBvcGVyYXRvciwgdmFsdWUgfSA9IGNvbmRpdGlvbjtcclxuICAgIGNvbnN0IHRhcmdldFZhbHVlID0gdGhpcy5nZXRPYmplY3RWYWx1ZShvYmplY3QsY29udGV4dCk7XHJcbiAgICBjb25zdCBjb25kaXRpb25WYWx1ZSA9IHRoaXMuZ2V0Q29uZGl0aW9uVmFsdWUodmFsdWUpO1xyXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xyXG4gICAgICBjYXNlIE9wZXJhdG9yLkVxdWFsOlxyXG4gICAgICBjYXNlIE9wZXJhdG9yLk5vdEVxdWFsOlxyXG4gICAgICBjYXNlIE9wZXJhdG9yLkdyZWF0ZXI6XHJcbiAgICAgIGNhc2UgT3BlcmF0b3IuR3JlYXRlck9yRXF1YWw6XHJcbiAgICAgIGNhc2UgT3BlcmF0b3IuTGVzczpcclxuICAgICAgY2FzZSBPcGVyYXRvci5MZXNzT3JFcXVhbDpcclxuICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKG9wZXJhdG9yLHRhcmdldFZhbHVlLCBjb25kaXRpb25WYWx1ZSk7XHJcbiAgICAgIGNhc2UgT3BlcmF0b3IuQ29udGFpbnM6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbnModGFyZ2V0VmFsdWUsY29uZGl0aW9uVmFsdWUpO1xyXG4gICAgICBjYXNlIE9wZXJhdG9yLk5vdENvbnRhaW5zOlxyXG4gICAgICAgIHJldHVybiAhdGhpcy5jb250YWlucyh0YXJnZXRWYWx1ZSxjb25kaXRpb25WYWx1ZSk7XHJcbiAgICAgIGNhc2UgT3BlcmF0b3IuU3RhcnRXaXRoOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0V2l0aCh0YXJnZXRWYWx1ZSxjb25kaXRpb25WYWx1ZSk7XHJcbiAgICAgIGNhc2UgT3BlcmF0b3IuTm90U3RhcnRXaXRoOlxyXG4gICAgICAgIHJldHVybiAhdGhpcy5zdGFydFdpdGgodGFyZ2V0VmFsdWUsY29uZGl0aW9uVmFsdWUpO1xyXG4gICAgICBjYXNlIE9wZXJhdG9yLkVuZFdpdGg6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kc1dpdGgodGFyZ2V0VmFsdWUsY29uZGl0aW9uVmFsdWUpO1xyXG4gICAgICBjYXNlIE9wZXJhdG9yLk5vdEVuZFdpdGg6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kc1dpdGgodGFyZ2V0VmFsdWUsY29uZGl0aW9uVmFsdWUpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgb3BlcmF0b3InKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICog5q+U6LyD44KS5a6f6KGM44GZ44KLXHJcbiAgICogQHBhcmFtIG9wZXJhdG9yIFxyXG4gICAqIEBwYXJhbSB0YXJnZXRWYWx1ZSBcclxuICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgY29tcGFyZShvcGVyYXRvcjogT3BlcmF0b3IsIHRhcmdldFZhbHVlOiBhbnksIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIC8vIHRhcmdldFZhbHVlIOOBr+aXpeacn+aXtu+8jHZhbHVlIOOCguaXpeacn+OBq+WkieaPm+OBl+OBpuavlOi8g+OBmeOCi1xyXG4gICAgaWYodGFyZ2V0VmFsdWU9PT11bmRlZmluZWQgfHwgdGFyZ2V0VmFsdWU9PT1udWxsfHx0YXJnZXRWYWx1ZT09PScnKXtcclxuICAgICAgaWYodmFsdWU9PT11bmRlZmluZWQgfHwgdmFsdWU9PT1udWxsfHx2YWx1ZT09PScnKXtcclxuICAgICAgICB0YXJnZXRWYWx1ZT0nJztcclxuICAgICAgICB2YWx1ZT0nJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICBjb25zdCBkYXRlVmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgIGlmICghaXNOYU4oZGF0ZVZhbHVlLmdldFRpbWUoKSkpIHtcclxuICAgICAgICB2YWx1ZSA9IGRhdGVWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy90YXJnZXRWYWx1ZeOBr+aVsOWApOaZgu+8jHZhbHVlIOOCkuaVsOWApOOBq+WkieaPm+OBmeOCi1xyXG4gICAgZWxzZSBpZiAodHlwZW9mIHRhcmdldFZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgICBjb25zdCBudW1iZXJWYWx1ZSA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICAgIGlmICghaXNOYU4obnVtYmVyVmFsdWUpKSB7XHJcbiAgICAgICAgdmFsdWUgPSBudW1iZXJWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIHRhcmdldFZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XHJcbiAgICAgIGNhc2UgT3BlcmF0b3IuRXF1YWw6XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldFZhbHVlID09PSB2YWx1ZTtcclxuICAgICAgY2FzZSBPcGVyYXRvci5Ob3RFcXVhbDpcclxuICAgICAgICByZXR1cm4gdGFyZ2V0VmFsdWUgIT09IHZhbHVlO1xyXG4gICAgICBjYXNlIE9wZXJhdG9yLkdyZWF0ZXI6XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldFZhbHVlID4gdmFsdWU7XHJcbiAgICAgIGNhc2UgT3BlcmF0b3IuR3JlYXRlck9yRXF1YWw6XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldFZhbHVlID49IHZhbHVlO1xyXG4gICAgICBjYXNlIE9wZXJhdG9yLkxlc3M6XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldFZhbHVlIDwgdmFsdWU7XHJcbiAgICAgIGNhc2UgT3BlcmF0b3IuTGVzc09yRXF1YWw6XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldFZhbHVlIDw9IHZhbHVlO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgb3BlcmF0b3IgZm9yIGNvbXBhcmlzb24nKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICog5ZCr44KA6KiI566XXHJcbiAgICogQHBhcmFtIHRhcmdldFZhbHVlIFxyXG4gICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBjb250YWlucyh0YXJnZXRWYWx1ZTogYW55LCB2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodHlwZW9mIHRhcmdldFZhbHVlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiB0YXJnZXRWYWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gICAvKipcclxuICAgKiBTdGFydFdpdGjoqIjnrpdcclxuICAgKiBAcGFyYW0gdGFyZ2V0VmFsdWUgXHJcbiAgICogQHBhcmFtIHZhbHVlIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHN0YXJ0V2l0aCh0YXJnZXRWYWx1ZTogYW55LCB2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodHlwZW9mIHRhcmdldFZhbHVlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiB0YXJnZXRWYWx1ZS5zdGFydHNXaXRoKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRW5kc1dpdGjoqIjnrpdcclxuICAgKiBAcGFyYW0gdGFyZ2V0VmFsdWUgXHJcbiAgICogQHBhcmFtIHZhbHVlIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGVuZHNXaXRoKHRhcmdldFZhbHVlOiBhbnksIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICh0eXBlb2YgdGFyZ2V0VmFsdWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIHRhcmdldFZhbHVlLmVuZHNXaXRoKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG5cclxufVxyXG4iLCJcclxuaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcclxuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG5pbXBvcnQgeyBDb25kaXRpb25UcmVlIH0gZnJvbSAnLi4vdHlwZXMvQ29uZGl0aW9ucyc7XHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcclxuICovXHJcbmludGVyZmFjZSBJU2hvd25Qcm9wc3tcclxuICAgIGZpZWxkOklGaWVsZDtcclxuICAgIHNob3c6c3RyaW5nOyBcclxuICAgIGNvbmRpdGlvbjpzdHJpbmc7XHJcbn1cclxuLyoqXHJcbiAqIOihqOekuu+8j+mdnuihqOekuuOCouOCr+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEZpZWxkU2hvd25BY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9ue1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xyXG4gICAgcHJvcHM6SVNob3duUHJvcHM7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMubmFtZT1cIuihqOekuu+8j+mdnuihqOekulwiO1xyXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XHJcbiAgICAgICB0aGlzLnByb3BzPXtcclxuICAgICAgICAgICAgZmllbGQ6e2NvZGU6Jyd9LFxyXG4gICAgICAgICAgICBzaG93OicnLFxyXG4gICAgICAgICAgICBjb25kaXRpb246JydcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/jgqLjgq/jgrfjg6fjg7PjgpLnmbvpjLLjgZnjgotcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxyXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGUgXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuICAgICAgICBsZXQgcmVzdWx0PXtcclxuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ3Nob3cnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSVNob3duUHJvcHM7XHJcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMuZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbnRleHQpO1xyXG4gICAgICAgICAgICBpZihjb25kaXRpb25SZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5wcm9wcy5zaG93PT09J+ihqOekuicpe1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbnRvbmUuYXBwLnJlY29yZC5zZXRGaWVsZFNob3duKHRoaXMucHJvcHMuZmllbGQuY29kZSx0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmICh0aGlzLnByb3BzLnNob3c9PT0n6Z2e6KGo56S6Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAga2ludG9uZS5hcHAucmVjb3JkLnNldEZpZWxkU2hvd24odGhpcy5wcm9wcy5maWVsZC5jb2RlLGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXN1bHQ9IHtcclxuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6dHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcclxuICAgICAgICAgICAgZXZlbnQuZXJyb3I9ZXJyb3I7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbnRleHQg5p2h5Lu25byP44KS5a6f6KGM44GZ44KLXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBnZXRDb25kaXRpb25SZXN1bHQoY29udGV4dDphbnkpOmJvb2xlYW57XHJcbiAgICAgICAgY29uc3QgdHJlZSA9dGhpcy5nZXRDb25kaXRpb24odGhpcy5wcm9wcy5jb25kaXRpb24pO1xyXG4gICAgICAgIGlmKCF0cmVlKXtcclxuICAgICAgICAgICAgLy/mnaHku7bjgpLoqK3lrprjgZXjgozjgabjgYTjgb7jgZvjgpNcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cmVlLmV2YWx1YXRlKHRyZWUucm9vdCxjb250ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBjb25kaXRpb24g5p2h5Lu25byP44OE44Oq44O844KS5Y+W5b6X44GZ44KLXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBnZXRDb25kaXRpb24oY29uZGl0aW9uOnN0cmluZyk6Q29uZGl0aW9uVHJlZXxudWxse1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgY29uc3QgdHJlZSA9IG5ldyBDb25kaXRpb25UcmVlKCk7XHJcbiAgICAgICAgICAgIHRyZWUuZnJvbUpzb24oY29uZGl0aW9uKTtcclxuICAgICAgICAgICAgaWYodHJlZS5nZXRDb25kaXRpb25zKHRyZWUucm9vdCkubGVuZ3RoPjApe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyZWU7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcclxuICAgIH1cclxufVxyXG5uZXcgRmllbGRTaG93bkFjdGlvbigpOyIsIlxyXG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xyXG5pbXBvcnQgeyBJQWN0aW9uLCBJQWN0aW9uUHJvcGVydHksIElBY3Rpb25Ob2RlLCBJQ29udGV4dCwgSUFjdGlvblJlc3VsdCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG5pbXBvcnQgeyBDb25kaXRpb25UcmVlIH0gZnJvbSAnLi4vdHlwZXMvQ29uZGl0aW9ucyc7XHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcclxuICovXHJcbmludGVyZmFjZSBJRXJyb3JTaG93UHJvcHMge1xyXG4gICAgbWVzc2FnZTogc3RyaW5nO1xyXG4gICAgY29uZGl0aW9uOiBzdHJpbmc7XHJcbn0gICBcclxuXHJcbmV4cG9ydCBjbGFzcyBFcnJvclNob3dBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcclxuICAgIG5hbWU6IHN0cmluZzsgXHJcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107IC8v6LCD55So5LuOaW1wb3J05a+85YWl5YWz5LqO5pi+56S657G755qE5a6a5LmJXHJcbiAgICBwcm9wczogSUVycm9yU2hvd1Byb3BzOy8v5LuO5LiK5pa555qEaW50ZXJmYWNlIOWumuS5iei/meS4qnByb3Bz5omA6ZyA6KaB5o6l5Y+X55qE5bGe5oCnXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgLy/op6PmnoTlh73mlbDlrprkuYnpnIDopoHnmoTnsbvlkI1cclxuICAgICAgICB0aGlzLm5hbWUgPSBcIuOCqOODqeODvOihqOekulwiO1xyXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBbXTtcclxuICAgICAgICB0aGlzLnByb3BzID0ge1xyXG4gICAgICAgICAgICBtZXNzYWdlOiAnJyxcclxuICAgICAgICAgICAgY29uZGl0aW9uOiAnJ1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7IC8v6YeN572u5Lul5LiK5rOo5YaM6KGoXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcclxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlIFxyXG4gICAgICogQHBhcmFtIGV2ZW50IFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTogSUFjdGlvbk5vZGUsIGV2ZW50OiBhbnksIGNvbnRleHQ6IElDb250ZXh0KTogUHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7IC8v5byC5q2l5aSE55CG5p+Q5Ye95pWw5LiL55qE77yaeHjlsZ7mgKdcclxuICAgICAgICBsZXQgcmVzdWx0ID0geyBcclxuICAgICAgICAgICAgY2FuTmV4dDogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzdWx0OiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHJ5IHsgLy/lsJ3or5XmiafooYzku6XkuIvku6PnoIHpg6jliIZcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XHJcbiAgICAgICAgICAgIGlmICghKCdtZXNzYWdlJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSAmJiAhKCdjb25kaXRpb24nIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpKSB7IC8v5aaC5p6cbWVzc2FnZeS7peWPimNvbmRpdGlvbuS4pOiAhemDveS4jeWtmOWcqOeahOaDheWGteS4i3JldHVyblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMgPSBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlIGFzIElFcnJvclNob3dQcm9wczsgXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMuZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbnRleHQpOyBcclxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvblJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuZXJyb3IgPSB0aGlzLnByb3BzLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuTmV4dDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB0cnVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBldmVudC5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0gY29udGV4dCDmnaHku7blvI/jgpLlrp/ooYzjgZnjgotcclxuICAgICogQHJldHVybnMgXHJcbiAgICAqL1xyXG4gICAgZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbnRleHQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLmdldENvbmRpdGlvbih0aGlzLnByb3BzLmNvbmRpdGlvbik7XHJcbiAgICAgICAgaWYgKCF0cmVlKSB7XHJcbiAgICAgICAgICAgIC8v5p2h5Lu244KS6Kit5a6a44GV44KM44Gm44GE44G+44Gb44KTXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJlZS5ldmFsdWF0ZSh0cmVlLnJvb3QsIGNvbnRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbiDmnaHku7blvI/jg4Tjg6rjg7zjgpLlj5blvpfjgZnjgotcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBnZXRDb25kaXRpb24oY29uZGl0aW9uOiBzdHJpbmcpOiBDb25kaXRpb25UcmVlIHwgbnVsbCB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgdHJlZSA9IG5ldyBDb25kaXRpb25UcmVlKCk7XHJcbiAgICAgICAgICAgIHRyZWUuZnJvbUpzb24oY29uZGl0aW9uKTtcclxuICAgICAgICAgICAgaWYgKHRyZWUuZ2V0Q29uZGl0aW9ucyh0cmVlLnJvb3QpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cmVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xyXG4gICAgfVxyXG5cclxufVxyXG5uZXcgRXJyb3JTaG93QWN0aW9uKCk7IiwiXHJcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XHJcbmltcG9ydCB7IElBY3Rpb24sIElBY3Rpb25Qcm9wZXJ0eSwgSUFjdGlvbk5vZGUsIElBY3Rpb25SZXN1bHQgfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuaW1wb3J0IFwiLi9idXR0b24tYWRkLmNzc1wiO1xyXG5cclxuLyoqXHJcbiAqIOODnOOCv+ODs+mFjee9ruWxnuaAp+Wumue+qVxyXG4gKi9cclxuaW50ZXJmYWNlIElCdXR0b25BZGRQcm9wcyB7XHJcbiAgICAvL+ODnOOCv+ODs+ihqOekuuWQjVxyXG4gICAgYnV0dG9uTmFtZTogc3RyaW5nO1xyXG4gICAgc3BhY2U/OklTcGFjZTtcclxuICAgIC8v6YWN572u5L2N572uXHJcbiAgICBwb3NpdGlvbjogc3RyaW5nO1xyXG4gICAgLy/jgqTjg5njg7Pjg4jlkI1cclxuICAgIGV2ZW50TmFtZTpzdHJpbmdcclxufSAgIFxyXG5cclxuaW50ZXJmYWNlIElTcGFjZXtcclxuICAgIHR5cGU6c3RyaW5nLFxyXG4gICAgZWxlbWVudElkOnN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQnV0dG9uQWRkQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XHJcbiAgICBuYW1lOiBzdHJpbmc7IFxyXG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdOyBcclxuICAgIHByb3BzOiBJQnV0dG9uQWRkUHJvcHM7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgXHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCLjg5zjgr/jg7Pjga7phY3nva5cIjtcclxuICAgICAgICB0aGlzLmFjdGlvblByb3BzID0gW107XHJcbiAgICAgICAgdGhpcy5wcm9wcyA9IHtcclxuICAgICAgICAgICAgYnV0dG9uTmFtZTogJycsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnJyxcclxuICAgICAgICAgICAgZXZlbnROYW1lOicnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxyXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGUgXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOiBJQWN0aW9uTm9kZSwgZXZlbnQ6IGFueSk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4geyBcclxuICAgICAgICBsZXQgcmVzdWx0ID0geyBcclxuICAgICAgICAgICAgY2FuTmV4dDogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzdWx0OiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHJ5IHsgXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICBpZiAoISgnYnV0dG9uTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgncG9zaXRpb24nIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpKSB7IFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMgPSBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlIGFzIElCdXR0b25BZGRQcm9wczsgXHJcbiAgICAgICAgICAgIC8v44Oc44K/44Oz44KS6YWN572u44GZ44KLXHJcbiAgICAgICAgICAgIGxldCBidXR0b25TcGFjZTtcclxuICAgICAgICAgICAgaWYodGhpcy5wcm9wcy5zcGFjZSAmJiB0aGlzLnByb3BzLnNwYWNlLmVsZW1lbnRJZCl7XHJcbiAgICAgICAgICAgICAgICBidXR0b25TcGFjZSA9IGtpbnRvbmUuYXBwLnJlY29yZC5nZXRTcGFjZUVsZW1lbnQodGhpcy5wcm9wcy5zcGFjZS5lbGVtZW50SWQpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGJ1dHRvblNwYWNlID0ga2ludG9uZS5hcHAucmVjb3JkLmdldEhlYWRlck1lbnVTcGFjZUVsZW1lbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZighYnV0dG9uU3BhY2UpIHJldHVybiByZXN1bHQ7XHJcbiAgXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9JChgPGJ1dHRvbiBpZD0nJHt0aGlzLnByb3BzLmV2ZW50TmFtZX0nIGNsYXNzPSdhbGMtYnV0dG9uLW5vcm1hbCcgPiR7dGhpcy5wcm9wcy5idXR0b25OYW1lfTwvYnV0dG9uPmApO1xyXG4gICAgICAgICAgICBpZih0aGlzLnByb3BzLnBvc2l0aW9uPT09XCLkuIDnlarlt6bjgavov73liqDjgZnjgotcIil7XHJcbiAgICAgICAgICAgICAgICAkKGJ1dHRvblNwYWNlKS5wcmVwZW5kKGJ1dHRvbik7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgJChidXR0b25TcGFjZSkuYXBwZW5kKGJ1dHRvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgY2xpY2tFdmVudE5hbWUgPSBgJHtldmVudC50eXBlfS5jdXN0b21CdXR0b25DbGljay4ke3RoaXMucHJvcHMuZXZlbnROYW1lfWA7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5vbihcImNsaWNrXCIsKCk9PntcclxuICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoY2xpY2tFdmVudE5hbWUsZXZlbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBldmVudC5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgXHJcblxyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xyXG4gICAgfVxyXG5cclxufVxyXG5uZXcgQnV0dG9uQWRkQWN0aW9uKCk7IiwiXHJcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7ICBJQWN0aW9uLElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElDb250ZXh0LCBJVmFyTmFtZSB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG5pbXBvcnQgeyBDb25kaXRpb25UcmVlIH0gZnJvbSAnLi4vdHlwZXMvQ29uZGl0aW9ucyc7XHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcclxuICovXHJcbmludGVyZmFjZSBJQ29uZGl0aW9ue1xyXG4gICAgY29uZGl0aW9uOnN0cmluZztcclxuICAgIHZlck5hbWU6SVZhck5hbWU7XHJcbn1cclxuLyoqXHJcbiAqIOadoeS7tuWIhuWykOOCouOCr+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbkFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb257XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XHJcbiAgICBwcm9wczpJQ29uZGl0aW9uO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLm5hbWU9XCLmnaHku7blvI9cIjtcclxuICAgICAgICB0aGlzLmFjdGlvblByb3BzPVtdO1xyXG4gICAgICAgIHRoaXMucHJvcHM9e1xyXG4gICAgICAgICAgICBjb25kaXRpb246JycsXHJcbiAgICAgICAgICAgIHZlck5hbWU6e25hbWU6Jyd9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcclxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlIFxyXG4gICAgICogQHBhcmFtIGV2ZW50IFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdD17XHJcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcclxuICAgICAgICAgICAgcmVzdWx0OicnXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIC8v5bGe5oCn6Kit5a6a44KS5Y+W5b6X44GZ44KLXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9YWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcclxuICAgICAgICAgICAgaWYgKCEoJ2NvbmRpdGlvbicgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgndmVyTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJQ29uZGl0aW9uO1xyXG4gICAgICAgICAgICAvL+adoeS7tuW8j+OBruioiOeul+e1kOaenOOCkuWPluW+l1xyXG4gICAgICAgICAgICBjb25zdCBjb25kaXRpb25SZXN1bHQgPSB0aGlzLmdldENvbmRpdGlvblJlc3VsdChjb250ZXh0KTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnaHku7boqIjnrpfntZDmnpw6XCIsY29uZGl0aW9uUmVzdWx0KTtcclxuICAgICAgICAgICAgaWYoY29uZGl0aW9uUmVzdWx0KXtcclxuICAgICAgICAgICAgICAgIHJlc3VsdD0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6J+OBr+OBhCdcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJlc3VsdD0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6J+OBhOOBhOOBiCdcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSAmJiB0aGlzLnByb3BzLnZlck5hbWUubmFtZSE9PScnKXtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXT1yZXN1bHQucmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcclxuICAgICAgICAgICAgZXZlbnQuZXJyb3I9ZXJyb3I7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGNvbnRleHQg5p2h5Lu25byP44KS5a6f6KGM44GZ44KLXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbnRleHQ6YW55KTpib29sZWFue1xyXG4gICAgICAgIGNvbnN0IHRyZWUgPXRoaXMuZ2V0Q29uZGl0aW9uKHRoaXMucHJvcHMuY29uZGl0aW9uKTtcclxuICAgICAgICBpZighdHJlZSl7XHJcbiAgICAgICAgICAgIC8v5p2h5Lu244KS6Kit5a6a44GV44KM44Gm44GE44G+44Gb44KTXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJlZS5ldmFsdWF0ZSh0cmVlLnJvb3QsY29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uIOadoeS7tuW8j+ODhOODquODvOOCkuWPluW+l+OBmeOCi1xyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGdldENvbmRpdGlvbihjb25kaXRpb246c3RyaW5nKTpDb25kaXRpb25UcmVlfG51bGx7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBjb25zdCB0cmVlID0gbmV3IENvbmRpdGlvblRyZWUoKTtcclxuICAgICAgICAgICAgdHJlZS5mcm9tSnNvbihjb25kaXRpb24pO1xyXG4gICAgICAgICAgICBpZih0cmVlLmdldENvbmRpdGlvbnModHJlZS5yb290KS5sZW5ndGg+MCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJlZTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcclxuICAgIH1cclxuICAgIFxyXG59XHJcbm5ldyBDb25kaXRpb25BY3Rpb24oKTsiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaW5qZWN0UGxhdGZvcm1EZXBzID0gZXhwb3J0cy5wbGF0Zm9ybURlcHMgPSB2b2lkIDA7XG5leHBvcnRzLnBsYXRmb3JtRGVwcyA9IHtcbiAgICByZWFkRmlsZUZyb21QYXRoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9LFxuICAgIGdldFJlcXVlc3RUb2tlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfSxcbiAgICBnZXREZWZhdWx0QXV0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfSxcbiAgICBidWlsZFBsYXRmb3JtRGVwZW5kZW50Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9LFxuICAgIGJ1aWxkSGVhZGVyczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfSxcbiAgICBidWlsZEZvcm1EYXRhVmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgIH0sXG4gICAgYnVpbGRCYXNlVXJsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9LFxuICAgIGdldFZlcnNpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgIH0sXG59O1xudmFyIGluamVjdFBsYXRmb3JtRGVwcyA9IGZ1bmN0aW9uIChkZXBzKSB7XG4gICAgaWYgKGRlcHMucmVhZEZpbGVGcm9tUGF0aCkge1xuICAgICAgICBleHBvcnRzLnBsYXRmb3JtRGVwcy5yZWFkRmlsZUZyb21QYXRoID0gZGVwcy5yZWFkRmlsZUZyb21QYXRoO1xuICAgIH1cbiAgICBpZiAoZGVwcy5nZXRSZXF1ZXN0VG9rZW4pIHtcbiAgICAgICAgZXhwb3J0cy5wbGF0Zm9ybURlcHMuZ2V0UmVxdWVzdFRva2VuID0gZGVwcy5nZXRSZXF1ZXN0VG9rZW47XG4gICAgfVxuICAgIGlmIChkZXBzLmdldERlZmF1bHRBdXRoKSB7XG4gICAgICAgIGV4cG9ydHMucGxhdGZvcm1EZXBzLmdldERlZmF1bHRBdXRoID0gZGVwcy5nZXREZWZhdWx0QXV0aDtcbiAgICB9XG4gICAgaWYgKGRlcHMuYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZykge1xuICAgICAgICBleHBvcnRzLnBsYXRmb3JtRGVwcy5idWlsZFBsYXRmb3JtRGVwZW5kZW50Q29uZmlnID1cbiAgICAgICAgICAgIGRlcHMuYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZztcbiAgICB9XG4gICAgaWYgKGRlcHMuYnVpbGRIZWFkZXJzKSB7XG4gICAgICAgIGV4cG9ydHMucGxhdGZvcm1EZXBzLmJ1aWxkSGVhZGVycyA9IGRlcHMuYnVpbGRIZWFkZXJzO1xuICAgIH1cbiAgICBpZiAoZGVwcy5idWlsZEZvcm1EYXRhVmFsdWUpIHtcbiAgICAgICAgZXhwb3J0cy5wbGF0Zm9ybURlcHMuYnVpbGRGb3JtRGF0YVZhbHVlID0gZGVwcy5idWlsZEZvcm1EYXRhVmFsdWU7XG4gICAgfVxuICAgIGlmIChkZXBzLmJ1aWxkQmFzZVVybCkge1xuICAgICAgICBleHBvcnRzLnBsYXRmb3JtRGVwcy5idWlsZEJhc2VVcmwgPSBkZXBzLmJ1aWxkQmFzZVVybDtcbiAgICB9XG4gICAgaWYgKGRlcHMuZ2V0VmVyc2lvbikge1xuICAgICAgICBleHBvcnRzLnBsYXRmb3JtRGVwcy5nZXRWZXJzaW9uID0gZGVwcy5nZXRWZXJzaW9uO1xuICAgIH1cbn07XG5leHBvcnRzLmluamVjdFBsYXRmb3JtRGVwcyA9IGluamVjdFBsYXRmb3JtRGVwcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yID0gdm9pZCAwO1xudmFyIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcihwbGF0Zm9ybSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbWVzc2FnZSA9IFwiVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIFwiLmNvbmNhdChwbGF0Zm9ybSwgXCIgZW52aXJvbm1lbnRcIik7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjQ3VzdG9tX0Vycm9yX1R5cGVzXG4gICAgICAgIC8vIE1haW50YWlucyBwcm9wZXIgc3RhY2sgdHJhY2UgZm9yIHdoZXJlIG91ciBlcnJvciB3YXMgdGhyb3duIChvbmx5IGF2YWlsYWJsZSBvbiBWOClcbiAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShfdGhpcywgVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5uYW1lID0gXCJVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JcIjtcbiAgICAgICAgX3RoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3dpa2kvQnJlYWtpbmctQ2hhbmdlcyNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICAgICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKF90aGlzLCBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3IucHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0cy5VbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3IgPSBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3IuanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBwYXJhbSB0eXBlTWFwIFtPYmplY3RdIE1hcCBvZiBNSU1FIHR5cGUgLT4gQXJyYXlbZXh0ZW5zaW9uc11cbiAqIEBwYXJhbSAuLi5cbiAqL1xuZnVuY3Rpb24gTWltZSgpIHtcbiAgdGhpcy5fdHlwZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0aGlzLl9leHRlbnNpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuZGVmaW5lKGFyZ3VtZW50c1tpXSk7XG4gIH1cblxuICB0aGlzLmRlZmluZSA9IHRoaXMuZGVmaW5lLmJpbmQodGhpcyk7XG4gIHRoaXMuZ2V0VHlwZSA9IHRoaXMuZ2V0VHlwZS5iaW5kKHRoaXMpO1xuICB0aGlzLmdldEV4dGVuc2lvbiA9IHRoaXMuZ2V0RXh0ZW5zaW9uLmJpbmQodGhpcyk7XG59XG5cbi8qKlxuICogRGVmaW5lIG1pbWV0eXBlIC0+IGV4dGVuc2lvbiBtYXBwaW5ncy4gIEVhY2gga2V5IGlzIGEgbWltZS10eXBlIHRoYXQgbWFwc1xuICogdG8gYW4gYXJyYXkgb2YgZXh0ZW5zaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUuICBUaGUgZmlyc3QgZXh0ZW5zaW9uIGlzXG4gKiB1c2VkIGFzIHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgdGhlIHR5cGUuXG4gKlxuICogZS5nLiBtaW1lLmRlZmluZSh7J2F1ZGlvL29nZycsIFsnb2dhJywgJ29nZycsICdzcHgnXX0pO1xuICpcbiAqIElmIGEgdHlwZSBkZWNsYXJlcyBhbiBleHRlbnNpb24gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQsIGFuIGVycm9yIHdpbGxcbiAqIGJlIHRocm93bi4gIFRvIHN1cHByZXNzIHRoaXMgZXJyb3IgYW5kIGZvcmNlIHRoZSBleHRlbnNpb24gdG8gYmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGUgbmV3IHR5cGUsIHBhc3MgYGZvcmNlYD10cnVlLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSBwcmVmaXggdGhlXG4gKiBleHRlbnNpb24gd2l0aCBcIipcIiB0byBtYXAgdGhlIHR5cGUgdG8gZXh0ZW5zaW9uLCB3aXRob3V0IG1hcHBpbmcgdGhlXG4gKiBleHRlbnNpb24gdG8gdGhlIHR5cGUuXG4gKlxuICogZS5nLiBtaW1lLmRlZmluZSh7J2F1ZGlvL3dhdicsIFsnd2F2J119LCB7J2F1ZGlvL3gtd2F2JywgWycqd2F2J119KTtcbiAqXG4gKlxuICogQHBhcmFtIG1hcCAoT2JqZWN0KSB0eXBlIGRlZmluaXRpb25zXG4gKiBAcGFyYW0gZm9yY2UgKEJvb2xlYW4pIGlmIHRydWUsIGZvcmNlIG92ZXJyaWRpbmcgb2YgZXhpc3RpbmcgZGVmaW5pdGlvbnNcbiAqL1xuTWltZS5wcm90b3R5cGUuZGVmaW5lID0gZnVuY3Rpb24odHlwZU1hcCwgZm9yY2UpIHtcbiAgZm9yIChsZXQgdHlwZSBpbiB0eXBlTWFwKSB7XG4gICAgbGV0IGV4dGVuc2lvbnMgPSB0eXBlTWFwW3R5cGVdLm1hcChmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gdC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV07XG5cbiAgICAgIC8vICcqJyBwcmVmaXggPSBub3QgdGhlIHByZWZlcnJlZCB0eXBlIGZvciB0aGlzIGV4dGVuc2lvbi4gIFNvIGZpeHVwIHRoZVxuICAgICAgLy8gZXh0ZW5zaW9uLCBhbmQgc2tpcCBpdC5cbiAgICAgIGlmIChleHRbMF0gPT09ICcqJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmb3JjZSAmJiAoZXh0IGluIHRoaXMuX3R5cGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0F0dGVtcHQgdG8gY2hhbmdlIG1hcHBpbmcgZm9yIFwiJyArIGV4dCArXG4gICAgICAgICAgJ1wiIGV4dGVuc2lvbiBmcm9tIFwiJyArIHRoaXMuX3R5cGVzW2V4dF0gKyAnXCIgdG8gXCInICsgdHlwZSArXG4gICAgICAgICAgJ1wiLiBQYXNzIGBmb3JjZT10cnVlYCB0byBhbGxvdyB0aGlzLCBvdGhlcndpc2UgcmVtb3ZlIFwiJyArIGV4dCArXG4gICAgICAgICAgJ1wiIGZyb20gdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyBmb3IgXCInICsgdHlwZSArICdcIi4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3R5cGVzW2V4dF0gPSB0eXBlO1xuICAgIH1cblxuICAgIC8vIFVzZSBmaXJzdCBleHRlbnNpb24gYXMgZGVmYXVsdFxuICAgIGlmIChmb3JjZSB8fCAhdGhpcy5fZXh0ZW5zaW9uc1t0eXBlXSkge1xuICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1swXTtcbiAgICAgIHRoaXMuX2V4dGVuc2lvbnNbdHlwZV0gPSAoZXh0WzBdICE9PSAnKicpID8gZXh0IDogZXh0LnN1YnN0cigxKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogTG9va3VwIGEgbWltZSB0eXBlIGJhc2VkIG9uIGV4dGVuc2lvblxuICovXG5NaW1lLnByb3RvdHlwZS5nZXRUeXBlID0gZnVuY3Rpb24ocGF0aCkge1xuICBwYXRoID0gU3RyaW5nKHBhdGgpO1xuICBsZXQgbGFzdCA9IHBhdGgucmVwbGFjZSgvXi4qWy9cXFxcXS8sICcnKS50b0xvd2VyQ2FzZSgpO1xuICBsZXQgZXh0ID0gbGFzdC5yZXBsYWNlKC9eLipcXC4vLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICBsZXQgaGFzUGF0aCA9IGxhc3QubGVuZ3RoIDwgcGF0aC5sZW5ndGg7XG4gIGxldCBoYXNEb3QgPSBleHQubGVuZ3RoIDwgbGFzdC5sZW5ndGggLSAxO1xuXG4gIHJldHVybiAoaGFzRG90IHx8ICFoYXNQYXRoKSAmJiB0aGlzLl90eXBlc1tleHRdIHx8IG51bGw7XG59O1xuXG4vKipcbiAqIFJldHVybiBmaWxlIGV4dGVuc2lvbiBhc3NvY2lhdGVkIHdpdGggYSBtaW1lIHR5cGVcbiAqL1xuTWltZS5wcm90b3R5cGUuZ2V0RXh0ZW5zaW9uID0gZnVuY3Rpb24odHlwZSkge1xuICB0eXBlID0gL15cXHMqKFteO1xcc10qKS8udGVzdCh0eXBlKSAmJiBSZWdFeHAuJDE7XG4gIHJldHVybiB0eXBlICYmIHRoaXMuX2V4dGVuc2lvbnNbdHlwZS50b0xvd2VyQ2FzZSgpXSB8fCBudWxsO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBNaW1lO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XCJhcHBsaWNhdGlvbi9hbmRyZXctaW5zZXRcIjpbXCJlelwiXSxcImFwcGxpY2F0aW9uL2FwcGxpeHdhcmVcIjpbXCJhd1wiXSxcImFwcGxpY2F0aW9uL2F0b20reG1sXCI6W1wiYXRvbVwiXSxcImFwcGxpY2F0aW9uL2F0b21jYXQreG1sXCI6W1wiYXRvbWNhdFwiXSxcImFwcGxpY2F0aW9uL2F0b21kZWxldGVkK3htbFwiOltcImF0b21kZWxldGVkXCJdLFwiYXBwbGljYXRpb24vYXRvbXN2Yyt4bWxcIjpbXCJhdG9tc3ZjXCJdLFwiYXBwbGljYXRpb24vYXRzYy1kd2QreG1sXCI6W1wiZHdkXCJdLFwiYXBwbGljYXRpb24vYXRzYy1oZWxkK3htbFwiOltcImhlbGRcIl0sXCJhcHBsaWNhdGlvbi9hdHNjLXJzYXQreG1sXCI6W1wicnNhdFwiXSxcImFwcGxpY2F0aW9uL2Jkb2NcIjpbXCJiZG9jXCJdLFwiYXBwbGljYXRpb24vY2FsZW5kYXIreG1sXCI6W1wieGNzXCJdLFwiYXBwbGljYXRpb24vY2N4bWwreG1sXCI6W1wiY2N4bWxcIl0sXCJhcHBsaWNhdGlvbi9jZGZ4K3htbFwiOltcImNkZnhcIl0sXCJhcHBsaWNhdGlvbi9jZG1pLWNhcGFiaWxpdHlcIjpbXCJjZG1pYVwiXSxcImFwcGxpY2F0aW9uL2NkbWktY29udGFpbmVyXCI6W1wiY2RtaWNcIl0sXCJhcHBsaWNhdGlvbi9jZG1pLWRvbWFpblwiOltcImNkbWlkXCJdLFwiYXBwbGljYXRpb24vY2RtaS1vYmplY3RcIjpbXCJjZG1pb1wiXSxcImFwcGxpY2F0aW9uL2NkbWktcXVldWVcIjpbXCJjZG1pcVwiXSxcImFwcGxpY2F0aW9uL2N1LXNlZW1lXCI6W1wiY3VcIl0sXCJhcHBsaWNhdGlvbi9kYXNoK3htbFwiOltcIm1wZFwiXSxcImFwcGxpY2F0aW9uL2Rhdm1vdW50K3htbFwiOltcImRhdm1vdW50XCJdLFwiYXBwbGljYXRpb24vZG9jYm9vayt4bWxcIjpbXCJkYmtcIl0sXCJhcHBsaWNhdGlvbi9kc3NjK2RlclwiOltcImRzc2NcIl0sXCJhcHBsaWNhdGlvbi9kc3NjK3htbFwiOltcInhkc3NjXCJdLFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdFwiOltcImVzXCIsXCJlY21hXCJdLFwiYXBwbGljYXRpb24vZW1tYSt4bWxcIjpbXCJlbW1hXCJdLFwiYXBwbGljYXRpb24vZW1vdGlvbm1sK3htbFwiOltcImVtb3Rpb25tbFwiXSxcImFwcGxpY2F0aW9uL2VwdWIremlwXCI6W1wiZXB1YlwiXSxcImFwcGxpY2F0aW9uL2V4aVwiOltcImV4aVwiXSxcImFwcGxpY2F0aW9uL2V4cHJlc3NcIjpbXCJleHBcIl0sXCJhcHBsaWNhdGlvbi9mZHQreG1sXCI6W1wiZmR0XCJdLFwiYXBwbGljYXRpb24vZm9udC10ZHBmclwiOltcInBmclwiXSxcImFwcGxpY2F0aW9uL2dlbytqc29uXCI6W1wiZ2VvanNvblwiXSxcImFwcGxpY2F0aW9uL2dtbCt4bWxcIjpbXCJnbWxcIl0sXCJhcHBsaWNhdGlvbi9ncHgreG1sXCI6W1wiZ3B4XCJdLFwiYXBwbGljYXRpb24vZ3hmXCI6W1wiZ3hmXCJdLFwiYXBwbGljYXRpb24vZ3ppcFwiOltcImd6XCJdLFwiYXBwbGljYXRpb24vaGpzb25cIjpbXCJoanNvblwiXSxcImFwcGxpY2F0aW9uL2h5cGVyc3R1ZGlvXCI6W1wic3RrXCJdLFwiYXBwbGljYXRpb24vaW5rbWwreG1sXCI6W1wiaW5rXCIsXCJpbmttbFwiXSxcImFwcGxpY2F0aW9uL2lwZml4XCI6W1wiaXBmaXhcIl0sXCJhcHBsaWNhdGlvbi9pdHMreG1sXCI6W1wiaXRzXCJdLFwiYXBwbGljYXRpb24vamF2YS1hcmNoaXZlXCI6W1wiamFyXCIsXCJ3YXJcIixcImVhclwiXSxcImFwcGxpY2F0aW9uL2phdmEtc2VyaWFsaXplZC1vYmplY3RcIjpbXCJzZXJcIl0sXCJhcHBsaWNhdGlvbi9qYXZhLXZtXCI6W1wiY2xhc3NcIl0sXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCI6W1wianNcIixcIm1qc1wiXSxcImFwcGxpY2F0aW9uL2pzb25cIjpbXCJqc29uXCIsXCJtYXBcIl0sXCJhcHBsaWNhdGlvbi9qc29uNVwiOltcImpzb241XCJdLFwiYXBwbGljYXRpb24vanNvbm1sK2pzb25cIjpbXCJqc29ubWxcIl0sXCJhcHBsaWNhdGlvbi9sZCtqc29uXCI6W1wianNvbmxkXCJdLFwiYXBwbGljYXRpb24vbGdyK3htbFwiOltcImxnclwiXSxcImFwcGxpY2F0aW9uL2xvc3QreG1sXCI6W1wibG9zdHhtbFwiXSxcImFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MFwiOltcImhxeFwiXSxcImFwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvXCI6W1wiY3B0XCJdLFwiYXBwbGljYXRpb24vbWFkcyt4bWxcIjpbXCJtYWRzXCJdLFwiYXBwbGljYXRpb24vbWFuaWZlc3QranNvblwiOltcIndlYm1hbmlmZXN0XCJdLFwiYXBwbGljYXRpb24vbWFyY1wiOltcIm1yY1wiXSxcImFwcGxpY2F0aW9uL21hcmN4bWwreG1sXCI6W1wibXJjeFwiXSxcImFwcGxpY2F0aW9uL21hdGhlbWF0aWNhXCI6W1wibWFcIixcIm5iXCIsXCJtYlwiXSxcImFwcGxpY2F0aW9uL21hdGhtbCt4bWxcIjpbXCJtYXRobWxcIl0sXCJhcHBsaWNhdGlvbi9tYm94XCI6W1wibWJveFwiXSxcImFwcGxpY2F0aW9uL21lZGlhc2VydmVyY29udHJvbCt4bWxcIjpbXCJtc2NtbFwiXSxcImFwcGxpY2F0aW9uL21ldGFsaW5rK3htbFwiOltcIm1ldGFsaW5rXCJdLFwiYXBwbGljYXRpb24vbWV0YWxpbms0K3htbFwiOltcIm1ldGE0XCJdLFwiYXBwbGljYXRpb24vbWV0cyt4bWxcIjpbXCJtZXRzXCJdLFwiYXBwbGljYXRpb24vbW10LWFlaSt4bWxcIjpbXCJtYWVpXCJdLFwiYXBwbGljYXRpb24vbW10LXVzZCt4bWxcIjpbXCJtdXNkXCJdLFwiYXBwbGljYXRpb24vbW9kcyt4bWxcIjpbXCJtb2RzXCJdLFwiYXBwbGljYXRpb24vbXAyMVwiOltcIm0yMVwiLFwibXAyMVwiXSxcImFwcGxpY2F0aW9uL21wNFwiOltcIm1wNHNcIixcIm00cFwiXSxcImFwcGxpY2F0aW9uL21zd29yZFwiOltcImRvY1wiLFwiZG90XCJdLFwiYXBwbGljYXRpb24vbXhmXCI6W1wibXhmXCJdLFwiYXBwbGljYXRpb24vbi1xdWFkc1wiOltcIm5xXCJdLFwiYXBwbGljYXRpb24vbi10cmlwbGVzXCI6W1wibnRcIl0sXCJhcHBsaWNhdGlvbi9ub2RlXCI6W1wiY2pzXCJdLFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCI6W1wiYmluXCIsXCJkbXNcIixcImxyZlwiLFwibWFyXCIsXCJzb1wiLFwiZGlzdFwiLFwiZGlzdHpcIixcInBrZ1wiLFwiYnBrXCIsXCJkdW1wXCIsXCJlbGNcIixcImRlcGxveVwiLFwiZXhlXCIsXCJkbGxcIixcImRlYlwiLFwiZG1nXCIsXCJpc29cIixcImltZ1wiLFwibXNpXCIsXCJtc3BcIixcIm1zbVwiLFwiYnVmZmVyXCJdLFwiYXBwbGljYXRpb24vb2RhXCI6W1wib2RhXCJdLFwiYXBwbGljYXRpb24vb2VicHMtcGFja2FnZSt4bWxcIjpbXCJvcGZcIl0sXCJhcHBsaWNhdGlvbi9vZ2dcIjpbXCJvZ3hcIl0sXCJhcHBsaWNhdGlvbi9vbWRvYyt4bWxcIjpbXCJvbWRvY1wiXSxcImFwcGxpY2F0aW9uL29uZW5vdGVcIjpbXCJvbmV0b2NcIixcIm9uZXRvYzJcIixcIm9uZXRtcFwiLFwib25lcGtnXCJdLFwiYXBwbGljYXRpb24vb3hwc1wiOltcIm94cHNcIl0sXCJhcHBsaWNhdGlvbi9wMnAtb3ZlcmxheSt4bWxcIjpbXCJyZWxvXCJdLFwiYXBwbGljYXRpb24vcGF0Y2gtb3BzLWVycm9yK3htbFwiOltcInhlclwiXSxcImFwcGxpY2F0aW9uL3BkZlwiOltcInBkZlwiXSxcImFwcGxpY2F0aW9uL3BncC1lbmNyeXB0ZWRcIjpbXCJwZ3BcIl0sXCJhcHBsaWNhdGlvbi9wZ3Atc2lnbmF0dXJlXCI6W1wiYXNjXCIsXCJzaWdcIl0sXCJhcHBsaWNhdGlvbi9waWNzLXJ1bGVzXCI6W1wicHJmXCJdLFwiYXBwbGljYXRpb24vcGtjczEwXCI6W1wicDEwXCJdLFwiYXBwbGljYXRpb24vcGtjczctbWltZVwiOltcInA3bVwiLFwicDdjXCJdLFwiYXBwbGljYXRpb24vcGtjczctc2lnbmF0dXJlXCI6W1wicDdzXCJdLFwiYXBwbGljYXRpb24vcGtjczhcIjpbXCJwOFwiXSxcImFwcGxpY2F0aW9uL3BraXgtYXR0ci1jZXJ0XCI6W1wiYWNcIl0sXCJhcHBsaWNhdGlvbi9wa2l4LWNlcnRcIjpbXCJjZXJcIl0sXCJhcHBsaWNhdGlvbi9wa2l4LWNybFwiOltcImNybFwiXSxcImFwcGxpY2F0aW9uL3BraXgtcGtpcGF0aFwiOltcInBraXBhdGhcIl0sXCJhcHBsaWNhdGlvbi9wa2l4Y21wXCI6W1wicGtpXCJdLFwiYXBwbGljYXRpb24vcGxzK3htbFwiOltcInBsc1wiXSxcImFwcGxpY2F0aW9uL3Bvc3RzY3JpcHRcIjpbXCJhaVwiLFwiZXBzXCIsXCJwc1wiXSxcImFwcGxpY2F0aW9uL3Byb3ZlbmFuY2UreG1sXCI6W1wicHJvdnhcIl0sXCJhcHBsaWNhdGlvbi9wc2tjK3htbFwiOltcInBza2N4bWxcIl0sXCJhcHBsaWNhdGlvbi9yYW1sK3lhbWxcIjpbXCJyYW1sXCJdLFwiYXBwbGljYXRpb24vcmRmK3htbFwiOltcInJkZlwiLFwib3dsXCJdLFwiYXBwbGljYXRpb24vcmVnaW5mbyt4bWxcIjpbXCJyaWZcIl0sXCJhcHBsaWNhdGlvbi9yZWxheC1uZy1jb21wYWN0LXN5bnRheFwiOltcInJuY1wiXSxcImFwcGxpY2F0aW9uL3Jlc291cmNlLWxpc3RzK3htbFwiOltcInJsXCJdLFwiYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMtZGlmZit4bWxcIjpbXCJybGRcIl0sXCJhcHBsaWNhdGlvbi9ybHMtc2VydmljZXMreG1sXCI6W1wicnNcIl0sXCJhcHBsaWNhdGlvbi9yb3V0ZS1hcGQreG1sXCI6W1wicmFwZFwiXSxcImFwcGxpY2F0aW9uL3JvdXRlLXMtdHNpZCt4bWxcIjpbXCJzbHNcIl0sXCJhcHBsaWNhdGlvbi9yb3V0ZS11c2QreG1sXCI6W1wicnVzZFwiXSxcImFwcGxpY2F0aW9uL3Jwa2ktZ2hvc3RidXN0ZXJzXCI6W1wiZ2JyXCJdLFwiYXBwbGljYXRpb24vcnBraS1tYW5pZmVzdFwiOltcIm1mdFwiXSxcImFwcGxpY2F0aW9uL3Jwa2ktcm9hXCI6W1wicm9hXCJdLFwiYXBwbGljYXRpb24vcnNkK3htbFwiOltcInJzZFwiXSxcImFwcGxpY2F0aW9uL3Jzcyt4bWxcIjpbXCJyc3NcIl0sXCJhcHBsaWNhdGlvbi9ydGZcIjpbXCJydGZcIl0sXCJhcHBsaWNhdGlvbi9zYm1sK3htbFwiOltcInNibWxcIl0sXCJhcHBsaWNhdGlvbi9zY3ZwLWN2LXJlcXVlc3RcIjpbXCJzY3FcIl0sXCJhcHBsaWNhdGlvbi9zY3ZwLWN2LXJlc3BvbnNlXCI6W1wic2NzXCJdLFwiYXBwbGljYXRpb24vc2N2cC12cC1yZXF1ZXN0XCI6W1wic3BxXCJdLFwiYXBwbGljYXRpb24vc2N2cC12cC1yZXNwb25zZVwiOltcInNwcFwiXSxcImFwcGxpY2F0aW9uL3NkcFwiOltcInNkcFwiXSxcImFwcGxpY2F0aW9uL3Nlbm1sK3htbFwiOltcInNlbm1seFwiXSxcImFwcGxpY2F0aW9uL3NlbnNtbCt4bWxcIjpbXCJzZW5zbWx4XCJdLFwiYXBwbGljYXRpb24vc2V0LXBheW1lbnQtaW5pdGlhdGlvblwiOltcInNldHBheVwiXSxcImFwcGxpY2F0aW9uL3NldC1yZWdpc3RyYXRpb24taW5pdGlhdGlvblwiOltcInNldHJlZ1wiXSxcImFwcGxpY2F0aW9uL3NoZit4bWxcIjpbXCJzaGZcIl0sXCJhcHBsaWNhdGlvbi9zaWV2ZVwiOltcInNpdlwiLFwic2lldmVcIl0sXCJhcHBsaWNhdGlvbi9zbWlsK3htbFwiOltcInNtaVwiLFwic21pbFwiXSxcImFwcGxpY2F0aW9uL3NwYXJxbC1xdWVyeVwiOltcInJxXCJdLFwiYXBwbGljYXRpb24vc3BhcnFsLXJlc3VsdHMreG1sXCI6W1wic3J4XCJdLFwiYXBwbGljYXRpb24vc3Jnc1wiOltcImdyYW1cIl0sXCJhcHBsaWNhdGlvbi9zcmdzK3htbFwiOltcImdyeG1sXCJdLFwiYXBwbGljYXRpb24vc3J1K3htbFwiOltcInNydVwiXSxcImFwcGxpY2F0aW9uL3NzZGwreG1sXCI6W1wic3NkbFwiXSxcImFwcGxpY2F0aW9uL3NzbWwreG1sXCI6W1wic3NtbFwiXSxcImFwcGxpY2F0aW9uL3N3aWQreG1sXCI6W1wic3dpZHRhZ1wiXSxcImFwcGxpY2F0aW9uL3RlaSt4bWxcIjpbXCJ0ZWlcIixcInRlaWNvcnB1c1wiXSxcImFwcGxpY2F0aW9uL3RocmF1ZCt4bWxcIjpbXCJ0ZmlcIl0sXCJhcHBsaWNhdGlvbi90aW1lc3RhbXBlZC1kYXRhXCI6W1widHNkXCJdLFwiYXBwbGljYXRpb24vdG9tbFwiOltcInRvbWxcIl0sXCJhcHBsaWNhdGlvbi90cmlnXCI6W1widHJpZ1wiXSxcImFwcGxpY2F0aW9uL3R0bWwreG1sXCI6W1widHRtbFwiXSxcImFwcGxpY2F0aW9uL3VianNvblwiOltcInVialwiXSxcImFwcGxpY2F0aW9uL3VyYy1yZXNzaGVldCt4bWxcIjpbXCJyc2hlZXRcIl0sXCJhcHBsaWNhdGlvbi91cmMtdGFyZ2V0ZGVzYyt4bWxcIjpbXCJ0ZFwiXSxcImFwcGxpY2F0aW9uL3ZvaWNleG1sK3htbFwiOltcInZ4bWxcIl0sXCJhcHBsaWNhdGlvbi93YXNtXCI6W1wid2FzbVwiXSxcImFwcGxpY2F0aW9uL3dpZGdldFwiOltcIndndFwiXSxcImFwcGxpY2F0aW9uL3dpbmhscFwiOltcImhscFwiXSxcImFwcGxpY2F0aW9uL3dzZGwreG1sXCI6W1wid3NkbFwiXSxcImFwcGxpY2F0aW9uL3dzcG9saWN5K3htbFwiOltcIndzcG9saWN5XCJdLFwiYXBwbGljYXRpb24veGFtbCt4bWxcIjpbXCJ4YW1sXCJdLFwiYXBwbGljYXRpb24veGNhcC1hdHQreG1sXCI6W1wieGF2XCJdLFwiYXBwbGljYXRpb24veGNhcC1jYXBzK3htbFwiOltcInhjYVwiXSxcImFwcGxpY2F0aW9uL3hjYXAtZGlmZit4bWxcIjpbXCJ4ZGZcIl0sXCJhcHBsaWNhdGlvbi94Y2FwLWVsK3htbFwiOltcInhlbFwiXSxcImFwcGxpY2F0aW9uL3hjYXAtbnMreG1sXCI6W1wieG5zXCJdLFwiYXBwbGljYXRpb24veGVuYyt4bWxcIjpbXCJ4ZW5jXCJdLFwiYXBwbGljYXRpb24veGh0bWwreG1sXCI6W1wieGh0bWxcIixcInhodFwiXSxcImFwcGxpY2F0aW9uL3hsaWZmK3htbFwiOltcInhsZlwiXSxcImFwcGxpY2F0aW9uL3htbFwiOltcInhtbFwiLFwieHNsXCIsXCJ4c2RcIixcInJuZ1wiXSxcImFwcGxpY2F0aW9uL3htbC1kdGRcIjpbXCJkdGRcIl0sXCJhcHBsaWNhdGlvbi94b3AreG1sXCI6W1wieG9wXCJdLFwiYXBwbGljYXRpb24veHByb2MreG1sXCI6W1wieHBsXCJdLFwiYXBwbGljYXRpb24veHNsdCt4bWxcIjpbXCIqeHNsXCIsXCJ4c2x0XCJdLFwiYXBwbGljYXRpb24veHNwZit4bWxcIjpbXCJ4c3BmXCJdLFwiYXBwbGljYXRpb24veHYreG1sXCI6W1wibXhtbFwiLFwieGh2bWxcIixcInh2bWxcIixcInh2bVwiXSxcImFwcGxpY2F0aW9uL3lhbmdcIjpbXCJ5YW5nXCJdLFwiYXBwbGljYXRpb24veWluK3htbFwiOltcInlpblwiXSxcImFwcGxpY2F0aW9uL3ppcFwiOltcInppcFwiXSxcImF1ZGlvLzNncHBcIjpbXCIqM2dwcFwiXSxcImF1ZGlvL2FkcGNtXCI6W1wiYWRwXCJdLFwiYXVkaW8vYW1yXCI6W1wiYW1yXCJdLFwiYXVkaW8vYmFzaWNcIjpbXCJhdVwiLFwic25kXCJdLFwiYXVkaW8vbWlkaVwiOltcIm1pZFwiLFwibWlkaVwiLFwia2FyXCIsXCJybWlcIl0sXCJhdWRpby9tb2JpbGUteG1mXCI6W1wibXhtZlwiXSxcImF1ZGlvL21wM1wiOltcIiptcDNcIl0sXCJhdWRpby9tcDRcIjpbXCJtNGFcIixcIm1wNGFcIl0sXCJhdWRpby9tcGVnXCI6W1wibXBnYVwiLFwibXAyXCIsXCJtcDJhXCIsXCJtcDNcIixcIm0yYVwiLFwibTNhXCJdLFwiYXVkaW8vb2dnXCI6W1wib2dhXCIsXCJvZ2dcIixcInNweFwiLFwib3B1c1wiXSxcImF1ZGlvL3MzbVwiOltcInMzbVwiXSxcImF1ZGlvL3NpbGtcIjpbXCJzaWxcIl0sXCJhdWRpby93YXZcIjpbXCJ3YXZcIl0sXCJhdWRpby93YXZlXCI6W1wiKndhdlwiXSxcImF1ZGlvL3dlYm1cIjpbXCJ3ZWJhXCJdLFwiYXVkaW8veG1cIjpbXCJ4bVwiXSxcImZvbnQvY29sbGVjdGlvblwiOltcInR0Y1wiXSxcImZvbnQvb3RmXCI6W1wib3RmXCJdLFwiZm9udC90dGZcIjpbXCJ0dGZcIl0sXCJmb250L3dvZmZcIjpbXCJ3b2ZmXCJdLFwiZm9udC93b2ZmMlwiOltcIndvZmYyXCJdLFwiaW1hZ2UvYWNlc1wiOltcImV4clwiXSxcImltYWdlL2FwbmdcIjpbXCJhcG5nXCJdLFwiaW1hZ2UvYXZpZlwiOltcImF2aWZcIl0sXCJpbWFnZS9ibXBcIjpbXCJibXBcIl0sXCJpbWFnZS9jZ21cIjpbXCJjZ21cIl0sXCJpbWFnZS9kaWNvbS1ybGVcIjpbXCJkcmxlXCJdLFwiaW1hZ2UvZW1mXCI6W1wiZW1mXCJdLFwiaW1hZ2UvZml0c1wiOltcImZpdHNcIl0sXCJpbWFnZS9nM2ZheFwiOltcImczXCJdLFwiaW1hZ2UvZ2lmXCI6W1wiZ2lmXCJdLFwiaW1hZ2UvaGVpY1wiOltcImhlaWNcIl0sXCJpbWFnZS9oZWljLXNlcXVlbmNlXCI6W1wiaGVpY3NcIl0sXCJpbWFnZS9oZWlmXCI6W1wiaGVpZlwiXSxcImltYWdlL2hlaWYtc2VxdWVuY2VcIjpbXCJoZWlmc1wiXSxcImltYWdlL2hlajJrXCI6W1wiaGVqMlwiXSxcImltYWdlL2hzajJcIjpbXCJoc2oyXCJdLFwiaW1hZ2UvaWVmXCI6W1wiaWVmXCJdLFwiaW1hZ2UvamxzXCI6W1wiamxzXCJdLFwiaW1hZ2UvanAyXCI6W1wianAyXCIsXCJqcGcyXCJdLFwiaW1hZ2UvanBlZ1wiOltcImpwZWdcIixcImpwZ1wiLFwianBlXCJdLFwiaW1hZ2UvanBoXCI6W1wianBoXCJdLFwiaW1hZ2UvanBoY1wiOltcImpoY1wiXSxcImltYWdlL2pwbVwiOltcImpwbVwiXSxcImltYWdlL2pweFwiOltcImpweFwiLFwianBmXCJdLFwiaW1hZ2UvanhyXCI6W1wianhyXCJdLFwiaW1hZ2UvanhyYVwiOltcImp4cmFcIl0sXCJpbWFnZS9qeHJzXCI6W1wianhyc1wiXSxcImltYWdlL2p4c1wiOltcImp4c1wiXSxcImltYWdlL2p4c2NcIjpbXCJqeHNjXCJdLFwiaW1hZ2UvanhzaVwiOltcImp4c2lcIl0sXCJpbWFnZS9qeHNzXCI6W1wianhzc1wiXSxcImltYWdlL2t0eFwiOltcImt0eFwiXSxcImltYWdlL2t0eDJcIjpbXCJrdHgyXCJdLFwiaW1hZ2UvcG5nXCI6W1wicG5nXCJdLFwiaW1hZ2Uvc2dpXCI6W1wic2dpXCJdLFwiaW1hZ2Uvc3ZnK3htbFwiOltcInN2Z1wiLFwic3ZnelwiXSxcImltYWdlL3QzOFwiOltcInQzOFwiXSxcImltYWdlL3RpZmZcIjpbXCJ0aWZcIixcInRpZmZcIl0sXCJpbWFnZS90aWZmLWZ4XCI6W1widGZ4XCJdLFwiaW1hZ2Uvd2VicFwiOltcIndlYnBcIl0sXCJpbWFnZS93bWZcIjpbXCJ3bWZcIl0sXCJtZXNzYWdlL2Rpc3Bvc2l0aW9uLW5vdGlmaWNhdGlvblwiOltcImRpc3Bvc2l0aW9uLW5vdGlmaWNhdGlvblwiXSxcIm1lc3NhZ2UvZ2xvYmFsXCI6W1widThtc2dcIl0sXCJtZXNzYWdlL2dsb2JhbC1kZWxpdmVyeS1zdGF0dXNcIjpbXCJ1OGRzblwiXSxcIm1lc3NhZ2UvZ2xvYmFsLWRpc3Bvc2l0aW9uLW5vdGlmaWNhdGlvblwiOltcInU4bWRuXCJdLFwibWVzc2FnZS9nbG9iYWwtaGVhZGVyc1wiOltcInU4aGRyXCJdLFwibWVzc2FnZS9yZmM4MjJcIjpbXCJlbWxcIixcIm1pbWVcIl0sXCJtb2RlbC8zbWZcIjpbXCIzbWZcIl0sXCJtb2RlbC9nbHRmK2pzb25cIjpbXCJnbHRmXCJdLFwibW9kZWwvZ2x0Zi1iaW5hcnlcIjpbXCJnbGJcIl0sXCJtb2RlbC9pZ2VzXCI6W1wiaWdzXCIsXCJpZ2VzXCJdLFwibW9kZWwvbWVzaFwiOltcIm1zaFwiLFwibWVzaFwiLFwic2lsb1wiXSxcIm1vZGVsL210bFwiOltcIm10bFwiXSxcIm1vZGVsL29ialwiOltcIm9ialwiXSxcIm1vZGVsL3N0ZXAreG1sXCI6W1wic3RweFwiXSxcIm1vZGVsL3N0ZXAremlwXCI6W1wic3RwelwiXSxcIm1vZGVsL3N0ZXAteG1sK3ppcFwiOltcInN0cHh6XCJdLFwibW9kZWwvc3RsXCI6W1wic3RsXCJdLFwibW9kZWwvdnJtbFwiOltcIndybFwiLFwidnJtbFwiXSxcIm1vZGVsL3gzZCtiaW5hcnlcIjpbXCIqeDNkYlwiLFwieDNkYnpcIl0sXCJtb2RlbC94M2QrZmFzdGluZm9zZXRcIjpbXCJ4M2RiXCJdLFwibW9kZWwveDNkK3ZybWxcIjpbXCIqeDNkdlwiLFwieDNkdnpcIl0sXCJtb2RlbC94M2QreG1sXCI6W1wieDNkXCIsXCJ4M2R6XCJdLFwibW9kZWwveDNkLXZybWxcIjpbXCJ4M2R2XCJdLFwidGV4dC9jYWNoZS1tYW5pZmVzdFwiOltcImFwcGNhY2hlXCIsXCJtYW5pZmVzdFwiXSxcInRleHQvY2FsZW5kYXJcIjpbXCJpY3NcIixcImlmYlwiXSxcInRleHQvY29mZmVlc2NyaXB0XCI6W1wiY29mZmVlXCIsXCJsaXRjb2ZmZWVcIl0sXCJ0ZXh0L2Nzc1wiOltcImNzc1wiXSxcInRleHQvY3N2XCI6W1wiY3N2XCJdLFwidGV4dC9odG1sXCI6W1wiaHRtbFwiLFwiaHRtXCIsXCJzaHRtbFwiXSxcInRleHQvamFkZVwiOltcImphZGVcIl0sXCJ0ZXh0L2pzeFwiOltcImpzeFwiXSxcInRleHQvbGVzc1wiOltcImxlc3NcIl0sXCJ0ZXh0L21hcmtkb3duXCI6W1wibWFya2Rvd25cIixcIm1kXCJdLFwidGV4dC9tYXRobWxcIjpbXCJtbWxcIl0sXCJ0ZXh0L21keFwiOltcIm1keFwiXSxcInRleHQvbjNcIjpbXCJuM1wiXSxcInRleHQvcGxhaW5cIjpbXCJ0eHRcIixcInRleHRcIixcImNvbmZcIixcImRlZlwiLFwibGlzdFwiLFwibG9nXCIsXCJpblwiLFwiaW5pXCJdLFwidGV4dC9yaWNodGV4dFwiOltcInJ0eFwiXSxcInRleHQvcnRmXCI6W1wiKnJ0ZlwiXSxcInRleHQvc2dtbFwiOltcInNnbWxcIixcInNnbVwiXSxcInRleHQvc2hleFwiOltcInNoZXhcIl0sXCJ0ZXh0L3NsaW1cIjpbXCJzbGltXCIsXCJzbG1cIl0sXCJ0ZXh0L3NwZHhcIjpbXCJzcGR4XCJdLFwidGV4dC9zdHlsdXNcIjpbXCJzdHlsdXNcIixcInN0eWxcIl0sXCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzXCI6W1widHN2XCJdLFwidGV4dC90cm9mZlwiOltcInRcIixcInRyXCIsXCJyb2ZmXCIsXCJtYW5cIixcIm1lXCIsXCJtc1wiXSxcInRleHQvdHVydGxlXCI6W1widHRsXCJdLFwidGV4dC91cmktbGlzdFwiOltcInVyaVwiLFwidXJpc1wiLFwidXJsc1wiXSxcInRleHQvdmNhcmRcIjpbXCJ2Y2FyZFwiXSxcInRleHQvdnR0XCI6W1widnR0XCJdLFwidGV4dC94bWxcIjpbXCIqeG1sXCJdLFwidGV4dC95YW1sXCI6W1wieWFtbFwiLFwieW1sXCJdLFwidmlkZW8vM2dwcFwiOltcIjNncFwiLFwiM2dwcFwiXSxcInZpZGVvLzNncHAyXCI6W1wiM2cyXCJdLFwidmlkZW8vaDI2MVwiOltcImgyNjFcIl0sXCJ2aWRlby9oMjYzXCI6W1wiaDI2M1wiXSxcInZpZGVvL2gyNjRcIjpbXCJoMjY0XCJdLFwidmlkZW8vaXNvLnNlZ21lbnRcIjpbXCJtNHNcIl0sXCJ2aWRlby9qcGVnXCI6W1wianBndlwiXSxcInZpZGVvL2pwbVwiOltcIipqcG1cIixcImpwZ21cIl0sXCJ2aWRlby9tajJcIjpbXCJtajJcIixcIm1qcDJcIl0sXCJ2aWRlby9tcDJ0XCI6W1widHNcIl0sXCJ2aWRlby9tcDRcIjpbXCJtcDRcIixcIm1wNHZcIixcIm1wZzRcIl0sXCJ2aWRlby9tcGVnXCI6W1wibXBlZ1wiLFwibXBnXCIsXCJtcGVcIixcIm0xdlwiLFwibTJ2XCJdLFwidmlkZW8vb2dnXCI6W1wib2d2XCJdLFwidmlkZW8vcXVpY2t0aW1lXCI6W1wicXRcIixcIm1vdlwiXSxcInZpZGVvL3dlYm1cIjpbXCJ3ZWJtXCJdfTsiLCIndXNlIHN0cmljdCc7XG5cbmxldCBNaW1lID0gcmVxdWlyZSgnLi9NaW1lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBNaW1lKHJlcXVpcmUoJy4vdHlwZXMvc3RhbmRhcmQnKSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0VmVyc2lvbiA9IGV4cG9ydHMuYnVpbGRCYXNlVXJsID0gZXhwb3J0cy5idWlsZEZvcm1EYXRhVmFsdWUgPSBleHBvcnRzLmJ1aWxkSGVhZGVycyA9IGV4cG9ydHMuYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZyA9IGV4cG9ydHMuZ2V0RGVmYXVsdEF1dGggPSBleHBvcnRzLmdldFJlcXVlc3RUb2tlbiA9IGV4cG9ydHMucmVhZEZpbGVGcm9tUGF0aCA9IHZvaWQgMDtcbnZhciBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JfMSA9IHJlcXVpcmUoXCIuL1Vuc3VwcG9ydGVkUGxhdGZvcm1FcnJvclwiKTtcbnZhciBsaXRlXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIm1pbWUvbGl0ZVwiKSk7XG52YXIgcGFja2FnZV9qc29uXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uL3BhY2thZ2UuanNvblwiKSk7XG52YXIgcmVhZEZpbGVGcm9tUGF0aCA9IGZ1bmN0aW9uIChmaWxlUGF0aCkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JfMS5VbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3IoXCJCcm93c2VyXCIpO1xufTtcbmV4cG9ydHMucmVhZEZpbGVGcm9tUGF0aCA9IHJlYWRGaWxlRnJvbVBhdGg7XG52YXIgZ2V0UmVxdWVzdFRva2VuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBraW50b25lID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBraW50b25lICE9PSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2Yga2ludG9uZS5nZXRSZXF1ZXN0VG9rZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGtpbnRvbmUuZ2V0UmVxdWVzdFRva2VuKCldO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZ2Fyb29uID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBnYXJvb24gIT09IG51bGwgJiZcbiAgICAgICAgICAgIHR5cGVvZiAoKF9iID0gKF9hID0gZ2Fyb29uLmNvbm5lY3QpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5raW50b25lKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZ2V0UmVxdWVzdFRva2VuKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZ2Fyb29uLmNvbm5lY3Qua2ludG9uZS5nZXRSZXF1ZXN0VG9rZW4oKV07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2Vzc2lvbiBhdXRoZW50aWNhdGlvbiBtdXN0IHNwZWNpZnkgYSByZXF1ZXN0IHRva2VuXCIpO1xuICAgIH0pO1xufSk7IH07XG5leHBvcnRzLmdldFJlcXVlc3RUb2tlbiA9IGdldFJlcXVlc3RUb2tlbjtcbnZhciBnZXREZWZhdWx0QXV0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInNlc3Npb25cIixcbiAgICB9O1xufTtcbmV4cG9ydHMuZ2V0RGVmYXVsdEF1dGggPSBnZXREZWZhdWx0QXV0aDtcbnZhciBidWlsZFBsYXRmb3JtRGVwZW5kZW50Q29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7fTtcbn07XG5leHBvcnRzLmJ1aWxkUGxhdGZvcm1EZXBlbmRlbnRDb25maWcgPSBidWlsZFBsYXRmb3JtRGVwZW5kZW50Q29uZmlnO1xudmFyIGJ1aWxkSGVhZGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge307XG59O1xuZXhwb3J0cy5idWlsZEhlYWRlcnMgPSBidWlsZEhlYWRlcnM7XG52YXIgYnVpbGRGb3JtRGF0YVZhbHVlID0gZnVuY3Rpb24gKGRhdGEsIGZpbGVOYW1lKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICBpZiAoZmlsZU5hbWUpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gbGl0ZV8xLmRlZmF1bHQuZ2V0VHlwZShmaWxlTmFtZSkgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJsb2IoW2RhdGFdLCBvcHRpb25zKTtcbn07XG5leHBvcnRzLmJ1aWxkRm9ybURhdGFWYWx1ZSA9IGJ1aWxkRm9ybURhdGFWYWx1ZTtcbnZhciBidWlsZEJhc2VVcmwgPSBmdW5jdGlvbiAoYmFzZVVybCkge1xuICAgIGlmIChiYXNlVXJsKSB7XG4gICAgICAgIHJldHVybiBiYXNlVXJsO1xuICAgIH1cbiAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYmFzZVVybCBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZW52aXJvbm1lbnRcIik7XG4gICAgfVxuICAgIHZhciBob3N0ID0gbG9jYXRpb24uaG9zdCwgcHJvdG9jb2wgPSBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQocHJvdG9jb2wsIFwiLy9cIikuY29uY2F0KGhvc3QpO1xufTtcbmV4cG9ydHMuYnVpbGRCYXNlVXJsID0gYnVpbGRCYXNlVXJsO1xudmFyIGdldFZlcnNpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VfanNvbl8xLmRlZmF1bHQudmVyc2lvbjtcbn07XG5leHBvcnRzLmdldFZlcnNpb24gPSBnZXRWZXJzaW9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJvd3Nlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYnVpbGRQYXRoID0gdm9pZCAwO1xudmFyIGJ1aWxkUGF0aCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICB2YXIgZW5kcG9pbnROYW1lID0gcGFyYW1zLmVuZHBvaW50TmFtZSwgZ3Vlc3RTcGFjZUlkID0gcGFyYW1zLmd1ZXN0U3BhY2VJZCwgcHJldmlldyA9IHBhcmFtcy5wcmV2aWV3O1xuICAgIHZhciBndWVzdFBhdGggPSBndWVzdFNwYWNlSWQgIT09IHVuZGVmaW5lZCA/IFwiL2d1ZXN0L1wiLmNvbmNhdChndWVzdFNwYWNlSWQpIDogXCJcIjtcbiAgICB2YXIgcHJldmlld1BhdGggPSBwcmV2aWV3ID8gXCIvcHJldmlld1wiIDogXCJcIjtcbiAgICByZXR1cm4gXCIva1wiLmNvbmNhdChndWVzdFBhdGgsIFwiL3YxXCIpLmNvbmNhdChwcmV2aWV3UGF0aCwgXCIvXCIpLmNvbmNhdChlbmRwb2ludE5hbWUsIFwiLmpzb25cIik7XG59O1xuZXhwb3J0cy5idWlsZFBhdGggPSBidWlsZFBhdGg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11cmwuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5CYXNlQ2xpZW50ID0gdm9pZCAwO1xudmFyIHVybF8xID0gcmVxdWlyZShcIi4uL3VybFwiKTtcbnZhciBCYXNlQ2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2VDbGllbnQoY2xpZW50LCBndWVzdFNwYWNlSWQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuZ3Vlc3RTcGFjZUlkID0gZ3Vlc3RTcGFjZUlkO1xuICAgIH1cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gKDAsIHVybF8xLmJ1aWxkUGF0aCkoX19hc3NpZ24oX19hc3NpZ24oe30sIHBhcmFtcyksIHsgZ3Vlc3RTcGFjZUlkOiB0aGlzLmd1ZXN0U3BhY2VJZCB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBlbmRwb2ludCBmb3IgdGhlIEFQSSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGd1ZXN0IHNwYWNlIFVSTC5cbiAgICAgKiBPdGhlcndpc2UsIHBsZWFzZSB1c2UgYGJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWRgIGluc3RlYWQuXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5idWlsZFBhdGggPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiAoMCwgdXJsXzEuYnVpbGRQYXRoKShwYXJhbXMpO1xuICAgIH07XG4gICAgcmV0dXJuIEJhc2VDbGllbnQ7XG59KCkpO1xuZXhwb3J0cy5CYXNlQ2xpZW50ID0gQmFzZUNsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhc2VDbGllbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQnVsa1JlcXVlc3RDbGllbnQgPSB2b2lkIDA7XG52YXIgQmFzZUNsaWVudF8xID0gcmVxdWlyZShcIi4vQmFzZUNsaWVudFwiKTtcbnZhciBCdWxrUmVxdWVzdENsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQnVsa1JlcXVlc3RDbGllbnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQnVsa1JlcXVlc3RDbGllbnQoY2xpZW50LCBndWVzdFNwYWNlSWQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY2xpZW50LCBndWVzdFNwYWNlSWQpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLlJFUVVFU1RTX0xFTkdUSF9MSU1JVCA9IDIwO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEJ1bGtSZXF1ZXN0Q2xpZW50LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVxdWVzdHNQYXJhbSA9IHBhcmFtcy5yZXF1ZXN0cztcbiAgICAgICAgdmFyIHJlcXVlc3RzID0gcmVxdWVzdHNQYXJhbS5tYXAoZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIGlmIChcImVuZHBvaW50TmFtZVwiIGluIHJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgZW5kcG9pbnROYW1lID0gcmVxdWVzdC5lbmRwb2ludE5hbWUsIHJlc3QgPSBfX3Jlc3QocmVxdWVzdCwgW1wiZW5kcG9pbnROYW1lXCJdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oeyBhcGk6IF90aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoeyBlbmRwb2ludE5hbWU6IGVuZHBvaW50TmFtZSB9KSB9LCByZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImJ1bGtSZXF1ZXN0XCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCB7IHJlcXVlc3RzOiByZXF1ZXN0cyB9KTtcbiAgICB9O1xuICAgIHJldHVybiBCdWxrUmVxdWVzdENsaWVudDtcbn0oQmFzZUNsaWVudF8xLkJhc2VDbGllbnQpKTtcbmV4cG9ydHMuQnVsa1JlcXVlc3RDbGllbnQgPSBCdWxrUmVxdWVzdENsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJ1bGtSZXF1ZXN0Q2xpZW50LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFwcENsaWVudCA9IHZvaWQgMDtcbnZhciBCYXNlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9CYXNlQ2xpZW50XCIpO1xudmFyIEFwcENsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXBwQ2xpZW50LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFwcENsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEZvcm1GaWVsZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2ZpZWxkc1wiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuYWRkRm9ybUZpZWxkcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2ZpZWxkc1wiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wb3N0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZUZvcm1GaWVsZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvZm9ybS9maWVsZHNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmRlbGV0ZUZvcm1GaWVsZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvZm9ybS9maWVsZHNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlKHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEZvcm1MYXlvdXQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2xheW91dFwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlRm9ybUxheW91dCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2xheW91dFwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0Vmlld3MgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC92aWV3c1wiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcmVzdCk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZVZpZXdzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL3ZpZXdzXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5nZXRBcHAgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHBcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0QXBwcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcHNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuYWRkQXBwID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSwgc3BhY2UsIHBhdGgsIHNwYWNlUGF0aCwgZGVmYXVsdFRocmVhZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXJhbXMubmFtZSwgc3BhY2UgPSBwYXJhbXMuc3BhY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZVBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJzcGFjZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNsaWVudC5nZXQoc3BhY2VQYXRoLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUaHJlYWQgPSAoX2Euc2VudCgpKS5kZWZhdWx0VGhyZWFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgX19hc3NpZ24oX19hc3NpZ24oe30sIHBhcmFtcyksIHsgdGhyZWFkOiBkZWZhdWx0VGhyZWFkIH0pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgeyBuYW1lOiBuYW1lIH0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEFwcFNldHRpbmdzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcHJldmlldyA9IHBhcmFtcy5wcmV2aWV3LCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wicHJldmlld1wiXSk7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvc2V0dGluZ3NcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHJlc3QpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBcHBTZXR0aW5ncyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9zZXR0aW5nc1wiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0UHJvY2Vzc01hbmFnZW1lbnQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9zdGF0dXNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHJlc3QpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVQcm9jZXNzTWFuYWdlbWVudCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9zdGF0dXNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldERlcGxveVN0YXR1cyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9kZXBsb3lcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmRlcGxveUFwcCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9kZXBsb3lcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5nZXRGaWVsZEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiZmllbGQvYWNsXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiBwcmV2aWV3LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCBfX2Fzc2lnbih7fSwgcmVzdCkpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVGaWVsZEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgLy8gTk9URTogV2hlbiBleGVjdXRpbmcgdGhpcyBBUEkgd2l0aG91dCBgcHJldmlld2AsXG4gICAgICAgIC8vIGFsbCBwcmUtbGl2ZSBhcHAncyBzZXR0aW5ncyB3aWxsIGJlIGRlcGxveWVkIHRvIGxpdmUgYXBwLlxuICAgICAgICAvLyBUaGlzIGJlaGF2aW9yIG1heSBub3QgYmUgd2hhdCB0aGUgdXNlcnMgZXhwZWN0ZWQsXG4gICAgICAgIC8vIHNvIHdlIGRpc2FibGUgaXQgdGVtcG9yYXJpbHkuXG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJmaWVsZC9hY2xcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEFwcEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2FjbFwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlQXBwQWNsID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAvLyBOT1RFOiBXaGVuIGV4ZWN1dGluZyB0aGlzIEFQSSB3aXRob3V0IGBwcmV2aWV3YCxcbiAgICAgICAgLy8gYWxsIHByZS1saXZlIGFwcCdzIHNldHRpbmdzIHdpbGwgYmUgZGVwbG95ZWQgdG8gbGl2ZSBhcHAuXG4gICAgICAgIC8vIFRoaXMgYmVoYXZpb3IgbWF5IG5vdCBiZSB3aGF0IHRoZSB1c2VycyBleHBlY3RlZCxcbiAgICAgICAgLy8gc28gd2UgZGlzYWJsZSBpdCB0ZW1wb3JhcmlseS5cbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9hY2xcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmV2YWx1YXRlUmVjb3Jkc0FjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHMvYWNsL2V2YWx1YXRlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldFJlY29yZEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3JkL2FjbFwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlUmVjb3JkQWNsID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAvLyBOT1RFOiBXaGVuIGV4ZWN1dGluZyB0aGlzIEFQSSB3aXRob3V0IGBwcmV2aWV3YCxcbiAgICAgICAgLy8gYWxsIHByZS1saXZlIGFwcCdzIHNldHRpbmdzIHdpbGwgYmUgZGVwbG95ZWQgdG8gbGl2ZSBhcHAuXG4gICAgICAgIC8vIFRoaXMgYmVoYXZpb3IgbWF5IG5vdCBiZSB3aGF0IHRoZSB1c2VycyBleHBlY3RlZCxcbiAgICAgICAgLy8gc28gd2UgZGlzYWJsZSBpdCB0ZW1wb3JhcmlseS5cbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZC9hY2xcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEFwcEN1c3RvbWl6ZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2N1c3RvbWl6ZVwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlQXBwQ3VzdG9taXplID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2N1c3RvbWl6ZVwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0R2VuZXJhbE5vdGlmaWNhdGlvbnMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9ub3RpZmljYXRpb25zL2dlbmVyYWxcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIF9fYXNzaWduKHt9LCByZXN0KSk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZUdlbmVyYWxOb3RpZmljYXRpb25zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL25vdGlmaWNhdGlvbnMvZ2VuZXJhbFwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0UGVyUmVjb3JkTm90aWZpY2F0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL25vdGlmaWNhdGlvbnMvcGVyUmVjb3JkXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiBwcmV2aWV3LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCByZXN0KTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlUGVyUmVjb3JkTm90aWZpY2F0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9ub3RpZmljYXRpb25zL3BlclJlY29yZFwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0UmVtaW5kZXJOb3RpZmljYXRpb25zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcHJldmlldyA9IHBhcmFtcy5wcmV2aWV3LCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wicHJldmlld1wiXSk7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvbm90aWZpY2F0aW9ucy9yZW1pbmRlclwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcmVzdCk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZVJlbWluZGVyTm90aWZpY2F0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9ub3RpZmljYXRpb25zL3JlbWluZGVyXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5nZXRSZXBvcnRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcHJldmlldyA9IHBhcmFtcy5wcmV2aWV3LCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wicHJldmlld1wiXSk7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvcmVwb3J0c1wiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcmVzdCk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZVJlcG9ydHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvcmVwb3J0c1wiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0QXBwQWN0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2FjdGlvbnNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHJlc3QpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBcHBBY3Rpb25zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2FjdGlvbnNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICByZXR1cm4gQXBwQ2xpZW50O1xufShCYXNlQ2xpZW50XzEuQmFzZUNsaWVudCkpO1xuZXhwb3J0cy5BcHBDbGllbnQgPSBBcHBDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcHBDbGllbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5LaW50b25lQWJvcnRTZWFyY2hFcnJvciA9IHZvaWQgMDtcbnZhciBLaW50b25lQWJvcnRTZWFyY2hFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoS2ludG9uZUFib3J0U2VhcmNoRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gS2ludG9uZUFib3J0U2VhcmNoRXJyb3IobWVzc2FnZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5uYW1lID0gXCJLaW50b25lQWJvcnRTZWFyY2hFcnJvclwiO1xuICAgICAgICBfdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3dpa2kvQnJlYWtpbmctQ2hhbmdlcyNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICAgICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKF90aGlzLCBLaW50b25lQWJvcnRTZWFyY2hFcnJvci5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBLaW50b25lQWJvcnRTZWFyY2hFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydHMuS2ludG9uZUFib3J0U2VhcmNoRXJyb3IgPSBLaW50b25lQWJvcnRTZWFyY2hFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtpbnRvbmVBYm9ydFNlYXJjaEVycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuS2ludG9uZUFsbFJlY29yZHNFcnJvciA9IHZvaWQgMDtcbnZhciBLaW50b25lQWxsUmVjb3Jkc0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhLaW50b25lQWxsUmVjb3Jkc0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEtpbnRvbmVBbGxSZWNvcmRzRXJyb3IocHJvY2Vzc2VkUmVjb3Jkc1Jlc3VsdCwgdW5wcm9jZXNzZWRSZWNvcmRzLCBudW1PZkFsbFJlY29yZHMsIGVycm9yLCBjaHVua0xlbmd0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbnVtT2ZQcm9jZXNzZWRSZWNvcmRzID0gbnVtT2ZBbGxSZWNvcmRzIC0gdW5wcm9jZXNzZWRSZWNvcmRzLmxlbmd0aDtcbiAgICAgICAgdmFyIGVycm9ySW5kZXggPSBLaW50b25lQWxsUmVjb3Jkc0Vycm9yLmV4dHJhY3RFcnJvckluZGV4KG51bU9mUHJvY2Vzc2VkUmVjb3JkcywgZXJyb3IsIGNodW5rTGVuZ3RoKTtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBLaW50b25lQWxsUmVjb3Jkc0Vycm9yLmJ1aWxkRXJyb3JNZXNzYWdlKG51bU9mUHJvY2Vzc2VkUmVjb3JkcywgbnVtT2ZBbGxSZWNvcmRzLCBlcnJvckluZGV4KTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5uYW1lID0gXCJLaW50b25lQWxsUmVjb3Jkc0Vycm9yXCI7XG4gICAgICAgIF90aGlzLnByb2Nlc3NlZFJlY29yZHNSZXN1bHQgPSBwcm9jZXNzZWRSZWNvcmRzUmVzdWx0O1xuICAgICAgICBfdGhpcy51bnByb2Nlc3NlZFJlY29yZHMgPSB1bnByb2Nlc3NlZFJlY29yZHM7XG4gICAgICAgIF90aGlzLmVycm9yID0gZXJyb3I7XG4gICAgICAgIF90aGlzLmVycm9ySW5kZXggPSBlcnJvckluZGV4O1xuICAgICAgICBfdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgX3RoaXMubnVtT2ZQcm9jZXNzZWRSZWNvcmRzID0gbnVtT2ZQcm9jZXNzZWRSZWNvcmRzO1xuICAgICAgICBfdGhpcy5udW1PZkFsbFJlY29yZHMgPSBudW1PZkFsbFJlY29yZHM7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC93aWtpL0JyZWFraW5nLUNoYW5nZXMjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgS2ludG9uZUFsbFJlY29yZHNFcnJvci5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEtpbnRvbmVBbGxSZWNvcmRzRXJyb3IucGFyc2VFcnJvckluZGV4ID0gZnVuY3Rpb24gKGVycm9ycykge1xuICAgICAgICAvLyBUT0RPOiB1c2UgbWF0Y2hBbGwgYWZ0ZXIgRVMyMDIwIHN1cHBvcnRcbiAgICAgICAgdmFyIGVycm9ySW5kZXhlcyA9IFtdO1xuICAgICAgICBPYmplY3Qua2V5cyhlcnJvcnMpLmZvckVhY2goZnVuY3Rpb24gKGVycm9yS2V5KSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZXJyb3JLZXkubWF0Y2goL3JlY29yZHNcXFsoXFxkKylcXF0vKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBlcnJvckluZGV4ZXMucHVzaChOdW1iZXIocmVzdWx0WzFdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXJyb3JJbmRleGVzLmxlbmd0aCA+IDAgPyBNYXRoLm1pbi5hcHBseShNYXRoLCBlcnJvckluZGV4ZXMpIDogbnVsbDtcbiAgICB9O1xuICAgIEtpbnRvbmVBbGxSZWNvcmRzRXJyb3IuZXh0cmFjdEVycm9ySW5kZXggPSBmdW5jdGlvbiAobnVtT2ZQcm9jZXNzZWRSZWNvcmRzLCBlcnJvciwgY2h1bmtMZW5ndGgpIHtcbiAgICAgICAgaWYgKGVycm9yLmJ1bGtSZXF1ZXN0SW5kZXggIT09IHVuZGVmaW5lZCAmJiBlcnJvci5lcnJvcnMpIHtcbiAgICAgICAgICAgIHZhciBlcnJvclBhcnNlUmVzdWx0ID0gS2ludG9uZUFsbFJlY29yZHNFcnJvci5wYXJzZUVycm9ySW5kZXgoZXJyb3IuZXJyb3JzKTtcbiAgICAgICAgICAgIGlmIChlcnJvclBhcnNlUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChudW1PZlByb2Nlc3NlZFJlY29yZHMgK1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5idWxrUmVxdWVzdEluZGV4ICogY2h1bmtMZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICBlcnJvclBhcnNlUmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgS2ludG9uZUFsbFJlY29yZHNFcnJvci5idWlsZEVycm9yTWVzc2FnZSA9IGZ1bmN0aW9uIChudW1PZlByb2Nlc3NlZFJlY29yZHMsIG51bU9mQWxsUmVjb3JkcywgZXJyb3JJbmRleCkge1xuICAgICAgICB2YXIgbWVzc2FnZSA9IFwiXCI7XG4gICAgICAgIGlmIChlcnJvckluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkFuIGVycm9yIG9jY3VycmVkIGF0IHJlY29yZHNbXCIuY29uY2F0KGVycm9ySW5kZXgsIFwiXS4gXCIpO1xuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcIi5jb25jYXQobnVtT2ZQcm9jZXNzZWRSZWNvcmRzLCBcIi9cIikuY29uY2F0KG51bU9mQWxsUmVjb3JkcywgXCIgcmVjb3JkcyBhcmUgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseVwiKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfTtcbiAgICByZXR1cm4gS2ludG9uZUFsbFJlY29yZHNFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydHMuS2ludG9uZUFsbFJlY29yZHNFcnJvciA9IEtpbnRvbmVBbGxSZWNvcmRzRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1LaW50b25lQWxsUmVjb3Jkc0Vycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuS2ludG9uZVJlc3RBUElFcnJvciA9IHZvaWQgMDtcbnZhciBLaW50b25lUmVzdEFQSUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhLaW50b25lUmVzdEFQSUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEtpbnRvbmVSZXN0QVBJRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gS2ludG9uZVJlc3RBUElFcnJvci5idWlsZEVycm9yUmVzcG9uc2VEYXRlV2l0aEluZGV4KGVycm9yKSwgZGF0YSA9IF9hLmRhdGEsIGJ1bGtSZXF1ZXN0SW5kZXggPSBfYS5idWxrUmVxdWVzdEluZGV4O1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRhdGEubWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IFwiS2ludG9uZVJlc3RBUElFcnJvclwiO1xuICAgICAgICBfdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgICAgIF90aGlzLmNvZGUgPSBkYXRhLmNvZGU7XG4gICAgICAgIF90aGlzLmVycm9ycyA9IGRhdGEuZXJyb3JzO1xuICAgICAgICBfdGhpcy5zdGF0dXMgPSBlcnJvci5zdGF0dXM7XG4gICAgICAgIF90aGlzLmJ1bGtSZXF1ZXN0SW5kZXggPSBidWxrUmVxdWVzdEluZGV4O1xuICAgICAgICBfdGhpcy5oZWFkZXJzID0gZXJyb3IuaGVhZGVycztcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiW1wiLmNvbmNhdChlcnJvci5zdGF0dXMsIFwiXSBbXCIpLmNvbmNhdChfdGhpcy5jb2RlLCBcIl0gXCIpLmNvbmNhdChfdGhpcy5tZXNzYWdlLCBcIiAoXCIpLmNvbmNhdChfdGhpcy5pZCwgXCIpXCIpO1xuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9FcnJvciNDdXN0b21fRXJyb3JfVHlwZXNcbiAgICAgICAgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSBmb3Igd2hlcmUgb3VyIGVycm9yIHdhcyB0aHJvd24gKG9ubHkgYXZhaWxhYmxlIG9uIFY4KVxuICAgICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKF90aGlzLCBLaW50b25lUmVzdEFQSUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvd2lraS9CcmVha2luZy1DaGFuZ2VzI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgICAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoX3RoaXMsIEtpbnRvbmVSZXN0QVBJRXJyb3IucHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBLaW50b25lUmVzdEFQSUVycm9yLmZpbmRFcnJvclJlc3BvbnNlRGF0YVdpdGhJbmRleCA9IGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdHNbaV0pLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gcmVzdWx0c1tpXTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBkYXRhLCBidWxrUmVxdWVzdEluZGV4OiBpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNaXNzaW5nIHJlc3BvbnNlIGRhdGEgaW4gYHJlc3VsdHNgLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gS2ludG9uZSBSRVNUIEFQSSBDbGllbnQuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiKTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXN0QVBJRXJyb3IuYnVpbGRFcnJvclJlc3BvbnNlRGF0ZVdpdGhJbmRleCA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBpZiAoXCJyZXN1bHRzXCIgaW4gZXJyb3IuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIEtpbnRvbmVSZXN0QVBJRXJyb3IuZmluZEVycm9yUmVzcG9uc2VEYXRhV2l0aEluZGV4KGVycm9yLmRhdGEucmVzdWx0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YTogZXJyb3IuZGF0YSB9O1xuICAgIH07XG4gICAgcmV0dXJuIEtpbnRvbmVSZXN0QVBJRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnRzLktpbnRvbmVSZXN0QVBJRXJyb3IgPSBLaW50b25lUmVzdEFQSUVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9S2ludG9uZVJlc3RBUElFcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0tpbnRvbmVBYm9ydFNlYXJjaEVycm9yXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9LaW50b25lQWxsUmVjb3Jkc0Vycm9yXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9LaW50b25lUmVzdEFQSUVycm9yXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlJlY29yZENsaWVudCA9IHZvaWQgMDtcbnZhciBlcnJvcl8xID0gcmVxdWlyZShcIi4uL2Vycm9yXCIpO1xudmFyIEJhc2VDbGllbnRfMSA9IHJlcXVpcmUoXCIuL0Jhc2VDbGllbnRcIik7XG52YXIgQUREX1JFQ09SRFNfTElNSVQgPSAxMDA7XG52YXIgVVBEQVRFX1JFQ09SRFNfTElNSVQgPSAxMDA7XG52YXIgREVMRVRFX1JFQ09SRFNfTElNSVQgPSAxMDA7XG52YXIgR0VUX1JFQ09SRFNfTElNSVQgPSA1MDA7XG52YXIgUmVjb3JkQ2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWNvcmRDbGllbnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVjb3JkQ2xpZW50KGNsaWVudCwgYnVsa1JlcXVlc3RDbGllbnQsIGd1ZXN0U3BhY2VJZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjbGllbnQsIGd1ZXN0U3BhY2VJZCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuYnVsa1JlcXVlc3RDbGllbnQgPSBidWxrUmVxdWVzdENsaWVudDtcbiAgICAgICAgX3RoaXMuZGlkV2Fybk1heGltdW1PZmZzZXRWYWx1ZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZ2V0UmVjb3JkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3JkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmFkZFJlY29yZCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUudXBkYXRlUmVjb3JkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3JkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLnVwc2VydFJlY29yZCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFwcCwgdXBkYXRlS2V5LCByZWNvcmQsIHJlY29yZHMsIHJldmlzaW9uO1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwID0gcGFyYW1zLmFwcCwgdXBkYXRlS2V5ID0gcGFyYW1zLnVwZGF0ZUtleSwgcmVjb3JkID0gcGFyYW1zLnJlY29yZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0UmVjb3Jkcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogXCJcIi5jb25jYXQodXBkYXRlS2V5LmZpZWxkLCBcIiA9IFxcXCJcIikuY29uY2F0KHVwZGF0ZUtleS52YWx1ZSwgXCJcXFwiXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkcyA9IChfYi5zZW50KCkpLnJlY29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyZWNvcmRzLmxlbmd0aCA+IDApKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHJlY29yZHNbMF0uJGlkLnR5cGUgPT09IFwiX19JRF9fXCIpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMudXBkYXRlUmVjb3JkKHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbiA9IChfYi5zZW50KCkpLnJldmlzaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgaWQ6IHJlY29yZHNbMF0uJGlkLnZhbHVlLCByZXZpc2lvbjogcmV2aXNpb24gfV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBgJGlkYCBpbiBgZ2V0UmVjb3Jkc2AgcmVzcG9uc2UuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBLaW50b25lIFJFU1QgQVBJIENsaWVudC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmFkZFJlY29yZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkOiBPYmplY3QuYXNzaWduKHt9LCByZWNvcmQsIChfYSA9IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYVt1cGRhdGVLZXkuZmllbGRdID0geyB2YWx1ZTogdXBkYXRlS2V5LnZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hKSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gVE9ETzogYHJlY29yZHNgIHR5cGUgaW4gcmV0dXJuIHR5cGUgc2hvdWxkIGJlIGZpbHRlcmVkIGJ5IGBmaWVsZHNgLlxuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZ2V0UmVjb3JkcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHBhdGgsIHJlc3BvbnNlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2Fybk1heGltdW1PZmZzZXRWYWx1ZUlmTmVlZGVkKHBhcmFtcy5xdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzcG9uc2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUud2Fybk1heGltdW1PZmZzZXRWYWx1ZUlmTmVlZGVkID0gZnVuY3Rpb24gKHF1ZXJ5KSB7XG4gICAgICAgIGlmIChxdWVyeSkge1xuICAgICAgICAgICAgdmFyIHJlZ2V4cCA9IC9vZmZzZXRcXHMrKFxcZCspL2k7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gcXVlcnkubWF0Y2gocmVnZXhwKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5kaWRXYXJuTWF4aW11bU9mZnNldFZhbHVlICYmXG4gICAgICAgICAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgICAgICAgICAgTnVtYmVyKHJlc3VsdFsxXSkgPiAxMDAwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlkV2Fybk1heGltdW1PZmZzZXRWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiV2FybmluZzogVGhlIG1heGltdW0gb2Zmc2V0IHZhbHVlIHdpbGwgYmUgbGltaXRlZCB0byAxMCwwMDAgaW4gdGhlIGZ1dHVyZS4gUGxlYXNlIHVzZSBgY3JlYXRlQ3Vyc29yKClgIGFuZCBgZ2V0UmVjb3Jkc0J5Q3Vyc29yKClgIGluc3RlYWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmFkZFJlY29yZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXRoLCBfYSwgaWRzLCByZXZpc2lvbnM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNsaWVudC5wb3N0KHBhdGgsIHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKSwgaWRzID0gX2EuaWRzLCByZXZpc2lvbnMgPSBfYS5yZXZpc2lvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHM6IGlkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb25zOiByZXZpc2lvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IGlkcy5tYXAoZnVuY3Rpb24gKGlkLCBpKSB7IHJldHVybiAoeyBpZDogaWQsIHJldmlzaW9uOiByZXZpc2lvbnNbaV0gfSk7IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUudXBkYXRlUmVjb3JkcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZGVsZXRlUmVjb3JkcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGUocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuY3JlYXRlQ3Vyc29yID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkcy9jdXJzb3JcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wb3N0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmdldFJlY29yZHNCeUN1cnNvciA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHMvY3Vyc29yXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmRlbGV0ZUN1cnNvciA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHMvY3Vyc29yXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlKHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmdldEFsbFJlY29yZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb25kaXRpb24sIG9yZGVyQnksIF9hLCB3aXRoQ3Vyc29yLCByZXN0LCBjb25kaXRpb25RdWVyeSwgcXVlcnk7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgY29uZGl0aW9uID0gcGFyYW1zLmNvbmRpdGlvbiwgb3JkZXJCeSA9IHBhcmFtcy5vcmRlckJ5LCBfYSA9IHBhcmFtcy53aXRoQ3Vyc29yLCB3aXRoQ3Vyc29yID0gX2EgPT09IHZvaWQgMCA/IHRydWUgOiBfYSwgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcImNvbmRpdGlvblwiLCBcIm9yZGVyQnlcIiwgXCJ3aXRoQ3Vyc29yXCJdKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQnkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuZ2V0QWxsUmVjb3Jkc1dpdGhJZChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzdCksIHsgY29uZGl0aW9uOiBjb25kaXRpb24gfSkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHdpdGhDdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uUXVlcnkgPSBjb25kaXRpb24gPyBcIlwiLmNvbmNhdChjb25kaXRpb24sIFwiIFwiKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gXCJcIi5jb25jYXQoY29uZGl0aW9uUXVlcnkpLmNvbmNhdChvcmRlckJ5ID8gXCJvcmRlciBieSBcIi5jb25jYXQob3JkZXJCeSkgOiBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuZ2V0QWxsUmVjb3Jkc1dpdGhDdXJzb3IoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlc3QpLCB7IHF1ZXJ5OiBxdWVyeSB9KSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5nZXRBbGxSZWNvcmRzV2l0aE9mZnNldChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzdCksIHsgb3JkZXJCeTogb3JkZXJCeSwgY29uZGl0aW9uOiBjb25kaXRpb24gfSkpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZ2V0QWxsUmVjb3Jkc1dpdGhJZCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9yaWdpbmFsRmllbGRzLCBjb25kaXRpb24sIHJlc3QsIGZpZWxkcywgY29uZGl0aW9uUXVlcnksIGFsbFJlY29yZHMsIGxhc3RJZCwgcXVlcnksIHJlc3VsdCwgbGFzdFJlY29yZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRmllbGRzID0gcGFyYW1zLmZpZWxkcywgY29uZGl0aW9uID0gcGFyYW1zLmNvbmRpdGlvbiwgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcImZpZWxkc1wiLCBcImNvbmRpdGlvblwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMgPSBvcmlnaW5hbEZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCAkaWQgaWYgJGlkIGRvZXNuJ3QgZXhpc3QgaW4gZmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwICYmIGZpZWxkcy5pbmRleE9mKFwiJGlkXCIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcyA9IF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgZmllbGRzLCB0cnVlKSwgW1wiJGlkXCJdLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25RdWVyeSA9IGNvbmRpdGlvbiA/IFwiKFwiLmNvbmNhdChjb25kaXRpb24sIFwiKSBhbmQgXCIpIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbFJlY29yZHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJZCA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRydWUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgPSBcIlwiLmNvbmNhdChjb25kaXRpb25RdWVyeSwgXCIkaWQgPiBcIikuY29uY2F0KGxhc3RJZCwgXCIgb3JkZXIgYnkgJGlkIGFzYyBsaW1pdCBcIikuY29uY2F0KEdFVF9SRUNPUkRTX0xJTUlUKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0UmVjb3JkcyhfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzdCksIHsgZmllbGRzOiBmaWVsZHMsIHF1ZXJ5OiBxdWVyeSB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxSZWNvcmRzID0gYWxsUmVjb3Jkcy5jb25jYXQocmVzdWx0LnJlY29yZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZWNvcmRzLmxlbmd0aCA8IEdFVF9SRUNPUkRTX0xJTUlUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0UmVjb3JkID0gcmVzdWx0LnJlY29yZHNbcmVzdWx0LnJlY29yZHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFJlY29yZC4kaWQudHlwZSA9PT0gXCJfX0lEX19cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJZCA9IGxhc3RSZWNvcmQuJGlkLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBgJGlkYCBpbiBgZ2V0UmVjb3Jkc2AgcmVzcG9uc2UuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBLaW50b25lIFJFU1QgQVBJIENsaWVudC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGFsbFJlY29yZHNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZ2V0QWxsUmVjb3Jkc1dpdGhPZmZzZXQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb25kaXRpb24sIG9yZGVyQnksIHJlc3QsIGNvbmRpdGlvblF1ZXJ5LCBhbGxSZWNvcmRzLCBvZmZzZXQsIHF1ZXJ5LCByZXN1bHQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBwYXJhbXMuY29uZGl0aW9uLCBvcmRlckJ5ID0gcGFyYW1zLm9yZGVyQnksIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJjb25kaXRpb25cIiwgXCJvcmRlckJ5XCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvblF1ZXJ5ID0gY29uZGl0aW9uID8gXCJcIi5jb25jYXQoY29uZGl0aW9uLCBcIiBcIikgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUmVjb3JkcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cnVlKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gXCJcIi5jb25jYXQoY29uZGl0aW9uUXVlcnkpLmNvbmNhdChvcmRlckJ5ID8gXCJvcmRlciBieSBcIi5jb25jYXQob3JkZXJCeSwgXCIgXCIpIDogXCJcIiwgXCJsaW1pdCBcIikuY29uY2F0KEdFVF9SRUNPUkRTX0xJTUlULCBcIiBvZmZzZXQgXCIpLmNvbmNhdChvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSZWNvcmRzKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXN0KSwgeyBxdWVyeTogcXVlcnkgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUmVjb3JkcyA9IGFsbFJlY29yZHMuY29uY2F0KHJlc3VsdC5yZWNvcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVjb3Jkcy5sZW5ndGggPCBHRVRfUkVDT1JEU19MSU1JVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IEdFVF9SRUNPUkRTX0xJTUlUO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGFsbFJlY29yZHNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZ2V0QWxsUmVjb3Jkc1dpdGhDdXJzb3IgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpZCwgYWxsUmVjb3JkcywgcmVzdWx0LCBlcnJvcl8yO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZUN1cnNvcihwYXJhbXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSAoX2Euc2VudCgpKS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsyLCA2LCAsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbFJlY29yZHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cnVlKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0UmVjb3Jkc0J5Q3Vyc29yKHsgaWQ6IGlkIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUmVjb3JkcyA9IGFsbFJlY29yZHMuY29uY2F0KHJlc3VsdC5yZWNvcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovLCBhbGxSZWNvcmRzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZGVsZXRlQ3Vyc29yKHsgaWQ6IGlkIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JfMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5hZGRBbGxSZWNvcmRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMucmVjb3Jkcy5ldmVyeShmdW5jdGlvbiAocmVjb3JkKSB7IHJldHVybiAhQXJyYXkuaXNBcnJheShyZWNvcmQpICYmIHJlY29yZCBpbnN0YW5jZW9mIE9iamVjdDsgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGhlIGByZWNvcmRzYCBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBhcnJheSBvZiBvYmplY3QuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5hZGRBbGxSZWNvcmRzUmVjdXJzaXZlKHBhcmFtcywgcGFyYW1zLnJlY29yZHMubGVuZ3RoLCBbXSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5hZGRBbGxSZWNvcmRzUmVjdXJzaXZlID0gZnVuY3Rpb24gKHBhcmFtcywgbnVtT2ZBbGxSZWNvcmRzLCByZXN1bHRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBDSFVOS19MRU5HVEgsIGFwcCwgcmVjb3JkcywgcmVjb3Jkc0NodW5rLCBuZXdSZXN1bHRzLCBlXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBDSFVOS19MRU5HVEggPSB0aGlzLmJ1bGtSZXF1ZXN0Q2xpZW50LlJFUVVFU1RTX0xFTkdUSF9MSU1JVCAqIEFERF9SRUNPUkRTX0xJTUlUO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwID0gcGFyYW1zLmFwcCwgcmVjb3JkcyA9IHBhcmFtcy5yZWNvcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc0NodW5rID0gcmVjb3Jkcy5zbGljZSgwLCBDSFVOS19MRU5HVEgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZHNDaHVuay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyByZWNvcmRzOiByZXN1bHRzIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5hZGRBbGxSZWNvcmRzV2l0aEJ1bGtSZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHNDaHVuayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Jlc3VsdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yXzEuS2ludG9uZUFsbFJlY29yZHNFcnJvcih7IHJlY29yZHM6IHJlc3VsdHMgfSwgcmVjb3JkcywgbnVtT2ZBbGxSZWNvcmRzLCBlXzEsIEFERF9SRUNPUkRTX0xJTUlUKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5hZGRBbGxSZWNvcmRzUmVjdXJzaXZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IGFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzOiByZWNvcmRzLnNsaWNlKENIVU5LX0xFTkdUSCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBudW1PZkFsbFJlY29yZHMsIHJlc3VsdHMuY29uY2F0KG5ld1Jlc3VsdHMpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5hZGRBbGxSZWNvcmRzV2l0aEJ1bGtSZXF1ZXN0ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc2VwYXJhdGVkUmVjb3JkcywgcmVxdWVzdHMsIHJlc3VsdHM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZWRSZWNvcmRzID0gdGhpcy5zZXBhcmF0ZUFycmF5UmVjdXJzaXZlKEFERF9SRUNPUkRTX0xJTUlULCBbXSwgcGFyYW1zLnJlY29yZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgPSBzZXBhcmF0ZWRSZWNvcmRzLm1hcChmdW5jdGlvbiAocmVjb3JkcykgeyByZXR1cm4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnVsa1JlcXVlc3RDbGllbnQuc2VuZCh7IHJlcXVlc3RzOiByZXF1ZXN0cyB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSAoX2Euc2VudCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZHMgPSByZXN1bHQuaWRzLCByZXZpc2lvbnMgPSByZXN1bHQucmV2aXNpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWRzLm1hcChmdW5jdGlvbiAoaWQsIGkpIHsgcmV0dXJuICh7IGlkOiBpZCwgcmV2aXNpb246IHJldmlzaW9uc1tpXSB9KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYWNjLCByZWNvcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2MuY29uY2F0KHJlY29yZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBbGxSZWNvcmRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMudXBkYXRlQWxsUmVjb3Jkc1JlY3Vyc2l2ZShwYXJhbXMsIHBhcmFtcy5yZWNvcmRzLmxlbmd0aCwgW10pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUudXBkYXRlQWxsUmVjb3Jkc1JlY3Vyc2l2ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIG51bU9mQWxsUmVjb3JkcywgcmVzdWx0cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgQ0hVTktfTEVOR1RILCBhcHAsIHJlY29yZHMsIHJlY29yZHNDaHVuaywgbmV3UmVzdWx0cywgZV8yO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgQ0hVTktfTEVOR1RIID0gdGhpcy5idWxrUmVxdWVzdENsaWVudC5SRVFVRVNUU19MRU5HVEhfTElNSVQgKiBVUERBVEVfUkVDT1JEU19MSU1JVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcCA9IHBhcmFtcy5hcHAsIHJlY29yZHMgPSBwYXJhbXMucmVjb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHNDaHVuayA9IHJlY29yZHMuc2xpY2UoMCwgQ0hVTktfTEVOR1RIKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmRzQ2h1bmsubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgcmVjb3JkczogcmVzdWx0cyB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMudXBkYXRlQWxsUmVjb3Jkc1dpdGhCdWxrUmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzOiByZWNvcmRzQ2h1bmssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdSZXN1bHRzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcl8xLktpbnRvbmVBbGxSZWNvcmRzRXJyb3IoeyByZWNvcmRzOiByZXN1bHRzIH0sIHJlY29yZHMsIG51bU9mQWxsUmVjb3JkcywgZV8yLCBVUERBVEVfUkVDT1JEU19MSU1JVCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMudXBkYXRlQWxsUmVjb3Jkc1JlY3Vyc2l2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkczogcmVjb3Jkcy5zbGljZShDSFVOS19MRU5HVEgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVtT2ZBbGxSZWNvcmRzLCByZXN1bHRzLmNvbmNhdChuZXdSZXN1bHRzKSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUudXBkYXRlQWxsUmVjb3Jkc1dpdGhCdWxrUmVxdWVzdCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNlcGFyYXRlZFJlY29yZHMsIHJlcXVlc3RzLCByZXN1bHRzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGVkUmVjb3JkcyA9IHRoaXMuc2VwYXJhdGVBcnJheVJlY3Vyc2l2ZShVUERBVEVfUkVDT1JEU19MSU1JVCwgW10sIHBhcmFtcy5yZWNvcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzID0gc2VwYXJhdGVkUmVjb3Jkcy5tYXAoZnVuY3Rpb24gKHJlY29yZHMpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnVsa1JlcXVlc3RDbGllbnQuc2VuZCh7IHJlcXVlc3RzOiByZXF1ZXN0cyB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSAoX2Euc2VudCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAocmVzdWx0KSB7IHJldHVybiByZXN1bHQucmVjb3JkczsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYWNjLCByZWNvcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2MuY29uY2F0KHJlY29yZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5kZWxldGVBbGxSZWNvcmRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVBbGxSZWNvcmRzUmVjdXJzaXZlKHBhcmFtcywgcGFyYW1zLnJlY29yZHMubGVuZ3RoKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZGVsZXRlQWxsUmVjb3Jkc1JlY3Vyc2l2ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIG51bU9mQWxsUmVjb3Jkcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgQ0hVTktfTEVOR1RILCBhcHAsIHJlY29yZHMsIHJlY29yZHNDaHVuaywgZV8zO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgQ0hVTktfTEVOR1RIID0gdGhpcy5idWxrUmVxdWVzdENsaWVudC5SRVFVRVNUU19MRU5HVEhfTElNSVQgKiBERUxFVEVfUkVDT1JEU19MSU1JVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcCA9IHBhcmFtcy5hcHAsIHJlY29yZHMgPSBwYXJhbXMucmVjb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHNDaHVuayA9IHJlY29yZHMuc2xpY2UoMCwgQ0hVTktfTEVOR1RIKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmRzQ2h1bmsubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHt9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZGVsZXRlQWxsUmVjb3Jkc1dpdGhCdWxrUmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzOiByZWNvcmRzQ2h1bmssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yXzEuS2ludG9uZUFsbFJlY29yZHNFcnJvcih7fSwgcmVjb3JkcywgbnVtT2ZBbGxSZWNvcmRzLCBlXzMsIERFTEVURV9SRUNPUkRTX0xJTUlUKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5kZWxldGVBbGxSZWNvcmRzUmVjdXJzaXZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IGFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzOiByZWNvcmRzLnNsaWNlKENIVU5LX0xFTkdUSCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBudW1PZkFsbFJlY29yZHMpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmRlbGV0ZUFsbFJlY29yZHNXaXRoQnVsa1JlcXVlc3QgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzZXBhcmF0ZWRSZWNvcmRzLCByZXF1ZXN0cztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlZFJlY29yZHMgPSB0aGlzLnNlcGFyYXRlQXJyYXlSZWN1cnNpdmUoREVMRVRFX1JFQ09SRFNfTElNSVQsIFtdLCBwYXJhbXMucmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cyA9IHNlcGFyYXRlZFJlY29yZHMubWFwKGZ1bmN0aW9uIChyZWNvcmRzKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHM6IHJlY29yZHMubWFwKGZ1bmN0aW9uIChyZWNvcmQpIHsgcmV0dXJuIHJlY29yZC5pZDsgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uczogcmVjb3Jkcy5tYXAoZnVuY3Rpb24gKHJlY29yZCkgeyByZXR1cm4gcmVjb3JkLnJldmlzaW9uOyB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWxrUmVxdWVzdENsaWVudC5zZW5kKHsgcmVxdWVzdHM6IHJlcXVlc3RzIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuc2VwYXJhdGVBcnJheVJlY3Vyc2l2ZSA9IGZ1bmN0aW9uIChzaXplLCBzZXBhcmF0ZWQsIGFycmF5KSB7XG4gICAgICAgIHZhciBjaHVuayA9IGFycmF5LnNsaWNlKDAsIHNpemUpO1xuICAgICAgICBpZiAoY2h1bmsubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VwYXJhdGVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNlcGFyYXRlQXJyYXlSZWN1cnNpdmUoc2l6ZSwgX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBzZXBhcmF0ZWQsIHRydWUpLCBbY2h1bmtdLCBmYWxzZSksIGFycmF5LnNsaWNlKHNpemUpKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuYWRkUmVjb3JkQ29tbWVudCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZC9jb21tZW50XCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5kZWxldGVSZWNvcmRDb21tZW50ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3JkL2NvbW1lbnRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGUocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZ2V0UmVjb3JkQ29tbWVudHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmQvY29tbWVudHNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUudXBkYXRlUmVjb3JkQXNzaWduZWVzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3JkL2Fzc2lnbmVlc1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVSZWNvcmRTdGF0dXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmQvc3RhdHVzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLnVwZGF0ZVJlY29yZHNTdGF0dXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRzL3N0YXR1c1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgcmV0dXJuIFJlY29yZENsaWVudDtcbn0oQmFzZUNsaWVudF8xLkJhc2VDbGllbnQpKTtcbmV4cG9ydHMuUmVjb3JkQ2xpZW50ID0gUmVjb3JkQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVjb3JkQ2xpZW50LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3BhY2VDbGllbnQgPSB2b2lkIDA7XG52YXIgQmFzZUNsaWVudF8xID0gcmVxdWlyZShcIi4vQmFzZUNsaWVudFwiKTtcbnZhciBTcGFjZUNsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3BhY2VDbGllbnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU3BhY2VDbGllbnQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLmdldFNwYWNlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwic3BhY2VcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFNwYWNlQ2xpZW50LnByb3RvdHlwZS5kZWxldGVTcGFjZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInNwYWNlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlKHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUudXBkYXRlU3BhY2VCb2R5ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwic3BhY2UvYm9keVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLmdldFNwYWNlTWVtYmVycyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInNwYWNlL21lbWJlcnNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFNwYWNlQ2xpZW50LnByb3RvdHlwZS51cGRhdGVTcGFjZU1lbWJlcnMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJzcGFjZS9tZW1iZXJzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUudXBkYXRlVGhyZWFkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwic3BhY2UvdGhyZWFkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUuYWRkVGhyZWFkQ29tbWVudCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInNwYWNlL3RocmVhZC9jb21tZW50XCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLmFkZEd1ZXN0cyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiZ3Vlc3RzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLmRlbGV0ZUd1ZXN0cyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiZ3Vlc3RzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlKHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUudXBkYXRlU3BhY2VHdWVzdHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJzcGFjZS9ndWVzdHNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFNwYWNlQ2xpZW50LnByb3RvdHlwZS5hZGRTcGFjZUZyb21UZW1wbGF0ZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwidGVtcGxhdGUvc3BhY2VcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wb3N0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICByZXR1cm4gU3BhY2VDbGllbnQ7XG59KEJhc2VDbGllbnRfMS5CYXNlQ2xpZW50KSk7XG5leHBvcnRzLlNwYWNlQ2xpZW50ID0gU3BhY2VDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFjZUNsaWVudC5qcy5tYXAiLCIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgPyBzZWxmLkZvcm1EYXRhIDogd2luZG93LkZvcm1EYXRhO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5GaWxlQ2xpZW50ID0gdm9pZCAwO1xudmFyIGZvcm1fZGF0YV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJmb3JtLWRhdGFcIikpO1xudmFyIHBsYXRmb3JtXzEgPSByZXF1aXJlKFwiLi4vcGxhdGZvcm1cIik7XG52YXIgVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yXzEgPSByZXF1aXJlKFwiLi4vcGxhdGZvcm0vVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yXCIpO1xudmFyIEJhc2VDbGllbnRfMSA9IHJlcXVpcmUoXCIuL0Jhc2VDbGllbnRcIik7XG52YXIgRmlsZUNsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmlsZUNsaWVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGaWxlQ2xpZW50KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIEZpbGVDbGllbnQucHJvdG90eXBlLnVwbG9hZEZpbGUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXRoLCBmb3JtRGF0YSwgX2EsIG5hbWVfMSwgZGF0YSwgZV8xLCBfYiwgbmFtZV8yLCBkYXRhLCBmaWxlRGF0YTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJmaWxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IGZvcm1fZGF0YV8xLmRlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKFwicGF0aFwiIGluIHBhcmFtcy5maWxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBwbGF0Zm9ybV8xLnBsYXRmb3JtRGVwcy5yZWFkRmlsZUZyb21QYXRoKHBhcmFtcy5maWxlLnBhdGgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYy5zZW50KCksIG5hbWVfMSA9IF9hLm5hbWUsIGRhdGEgPSBfYS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCBkYXRhLCBuYW1lXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMSA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlXzEgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JfMS5VbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cGxvYWRGaWxlIGRvZXNuJ3QgYWxsb3cgdG8gYWNjZXB0IGEgZmlsZSBwYXRoIGluIFwiLmNvbmNhdChlXzEucGxhdGZvcm0sIFwiIGVudmlyb25tZW50LlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gcGFyYW1zLmZpbGUsIG5hbWVfMiA9IF9iLm5hbWUsIGRhdGEgPSBfYi5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZURhdGEgPSBwbGF0Zm9ybV8xLnBsYXRmb3JtRGVwcy5idWlsZEZvcm1EYXRhVmFsdWUoZGF0YSwgbmFtZV8yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChcImZpbGVcIiwgZmlsZURhdGEsIG5hbWVfMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY2xpZW50LnBvc3REYXRhKHBhdGgsIGZvcm1EYXRhKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRmlsZUNsaWVudC5wcm90b3R5cGUuZG93bmxvYWRGaWxlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiZmlsZVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldERhdGEocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIHJldHVybiBGaWxlQ2xpZW50O1xufShCYXNlQ2xpZW50XzEuQmFzZUNsaWVudCkpO1xuZXhwb3J0cy5GaWxlQ2xpZW50ID0gRmlsZUNsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGVDbGllbnQuanMubWFwIiwiLy8gQXhpb3MgdjEuNy4yIENvcHlyaWdodCAoYykgMjAyNCBNYXR0IFphYnJpc2tpZSBhbmQgY29udHJpYnV0b3JzXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbmNvbnN0IHt0b1N0cmluZ30gPSBPYmplY3QucHJvdG90eXBlO1xuY29uc3Qge2dldFByb3RvdHlwZU9mfSA9IE9iamVjdDtcblxuY29uc3Qga2luZE9mID0gKGNhY2hlID0+IHRoaW5nID0+IHtcbiAgICBjb25zdCBzdHIgPSB0b1N0cmluZy5jYWxsKHRoaW5nKTtcbiAgICByZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IHN0ci5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKSk7XG59KShPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuY29uc3Qga2luZE9mVGVzdCA9ICh0eXBlKSA9PiB7XG4gIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAodGhpbmcpID0+IGtpbmRPZih0aGluZykgPT09IHR5cGVcbn07XG5cbmNvbnN0IHR5cGVPZlRlc3QgPSB0eXBlID0+IHRoaW5nID0+IHR5cGVvZiB0aGluZyA9PT0gdHlwZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IHtpc0FycmF5fSA9IEFycmF5O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVW5kZWZpbmVkID0gdHlwZU9mVGVzdCgndW5kZWZpbmVkJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCdWZmZXIodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbCkgJiYgdmFsLmNvbnN0cnVjdG9yICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwuY29uc3RydWN0b3IpXG4gICAgJiYgaXNGdW5jdGlvbih2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIpICYmIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQXJyYXlCdWZmZXIgPSBraW5kT2ZUZXN0KCdBcnJheUJ1ZmZlcicpO1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyh2YWwpIHtcbiAgbGV0IHJlc3VsdDtcbiAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSAmJiAoQXJyYXlCdWZmZXIuaXNWaWV3KSkge1xuICAgIHJlc3VsdCA9IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9ICh2YWwpICYmICh2YWwuYnVmZmVyKSAmJiAoaXNBcnJheUJ1ZmZlcih2YWwuYnVmZmVyKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1N0cmluZyA9IHR5cGVPZlRlc3QoJ3N0cmluZycpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRnVuY3Rpb24gPSB0eXBlT2ZUZXN0KCdmdW5jdGlvbicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgTnVtYmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzTnVtYmVyID0gdHlwZU9mVGVzdCgnbnVtYmVyJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzT2JqZWN0ID0gKHRoaW5nKSA9PiB0aGluZyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQm9vbGVhblxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQm9vbGVhbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQm9vbGVhbiA9IHRoaW5nID0+IHRoaW5nID09PSB0cnVlIHx8IHRoaW5nID09PSBmYWxzZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKHZhbCkgPT4ge1xuICBpZiAoa2luZE9mKHZhbCkgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YodmFsKTtcbiAgcmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWwpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNEYXRlID0ga2luZE9mVGVzdCgnRGF0ZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlID0ga2luZE9mVGVzdCgnRmlsZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZUxpc3QgPSBraW5kT2ZUZXN0KCdGaWxlTGlzdCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyZWFtID0gKHZhbCkgPT4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGb3JtRGF0YSA9ICh0aGluZykgPT4ge1xuICBsZXQga2luZDtcbiAgcmV0dXJuIHRoaW5nICYmIChcbiAgICAodHlwZW9mIEZvcm1EYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaW5nIGluc3RhbmNlb2YgRm9ybURhdGEpIHx8IChcbiAgICAgIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiAoXG4gICAgICAgIChraW5kID0ga2luZE9mKHRoaW5nKSkgPT09ICdmb3JtZGF0YScgfHxcbiAgICAgICAgLy8gZGV0ZWN0IGZvcm0tZGF0YSBpbnN0YW5jZVxuICAgICAgICAoa2luZCA9PT0gJ29iamVjdCcgJiYgaXNGdW5jdGlvbih0aGluZy50b1N0cmluZykgJiYgdGhpbmcudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJylcbiAgICAgIClcbiAgICApXG4gIClcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IGtpbmRPZlRlc3QoJ1VSTFNlYXJjaFBhcmFtcycpO1xuXG5jb25zdCBbaXNSZWFkYWJsZVN0cmVhbSwgaXNSZXF1ZXN0LCBpc1Jlc3BvbnNlLCBpc0hlYWRlcnNdID0gWydSZWFkYWJsZVN0cmVhbScsICdSZXF1ZXN0JywgJ1Jlc3BvbnNlJywgJ0hlYWRlcnMnXS5tYXAoa2luZE9mVGVzdCk7XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmNvbnN0IHRyaW0gPSAoc3RyKSA9PiBzdHIudHJpbSA/XG4gIHN0ci50cmltKCkgOiBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csICcnKTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXMgPSBmYWxzZV1cbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbiwge2FsbE93bktleXMgPSBmYWxzZX0gPSB7fSkge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpO1xuICBsZXQgbDtcblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAoaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgY29uc3Qga2V5cyA9IGFsbE93bktleXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iaiwga2V5KSB7XG4gIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgbGV0IF9rZXk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgX2tleSA9IGtleXNbaV07XG4gICAgaWYgKGtleSA9PT0gX2tleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gX2tleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IF9nbG9iYWwgPSAoKCkgPT4ge1xuICAvKmVzbGludCBuby11bmRlZjowKi9cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZ2xvYmFsVGhpcztcbiAgcmV0dXJuIHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbClcbn0pKCk7XG5cbmNvbnN0IGlzQ29udGV4dERlZmluZWQgPSAoY29udGV4dCkgPT4gIWlzVW5kZWZpbmVkKGNvbnRleHQpICYmIGNvbnRleHQgIT09IF9nbG9iYWw7XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgY29uc3Qge2Nhc2VsZXNzfSA9IGlzQ29udGV4dERlZmluZWQodGhpcykgJiYgdGhpcyB8fCB7fTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGNvbnN0IGFzc2lnblZhbHVlID0gKHZhbCwga2V5KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gY2FzZWxlc3MgJiYgZmluZEtleShyZXN1bHQsIGtleSkgfHwga2V5O1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHJlc3VsdFt0YXJnZXRLZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2UocmVzdWx0W3RhcmdldEtleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBhcmd1bWVudHNbaV0gJiYgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGEgYnkgbXV0YWJseSBhZGRpbmcgdG8gaXQgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IGIgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgVGhlIG9iamVjdCB0byBiaW5kIGZ1bmN0aW9uIHRvXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5c11cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgdmFsdWUgb2Ygb2JqZWN0IGFcbiAqL1xuY29uc3QgZXh0ZW5kID0gKGEsIGIsIHRoaXNBcmcsIHthbGxPd25LZXlzfT0ge30pID0+IHtcbiAgZm9yRWFjaChiLCAodmFsLCBrZXkpID0+IHtcbiAgICBpZiAodGhpc0FyZyAmJiBpc0Z1bmN0aW9uKHZhbCkpIHtcbiAgICAgIGFba2V5XSA9IGJpbmQodmFsLCB0aGlzQXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gdmFsO1xuICAgIH1cbiAgfSwge2FsbE93bktleXN9KTtcbiAgcmV0dXJuIGE7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBieXRlIG9yZGVyIG1hcmtlci4gVGhpcyBjYXRjaGVzIEVGIEJCIEJGICh0aGUgVVRGLTggQk9NKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IHdpdGggQk9NXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gY29udGVudCB2YWx1ZSB3aXRob3V0IEJPTVxuICovXG5jb25zdCBzdHJpcEJPTSA9IChjb250ZW50KSA9PiB7XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufTtcblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtvYmplY3R9IFtkZXNjcmlwdG9yc11cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgaW5oZXJpdHMgPSAoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IsIHByb3BzLCBkZXNjcmlwdG9ycykgPT4ge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RydWN0b3IsICdzdXBlcicsIHtcbiAgICB2YWx1ZTogc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGVcbiAgfSk7XG4gIHByb3BzICYmIE9iamVjdC5hc3NpZ24oY29uc3RydWN0b3IucHJvdG90eXBlLCBwcm9wcyk7XG59O1xuXG4vKipcbiAqIFJlc29sdmUgb2JqZWN0IHdpdGggZGVlcCBwcm90b3R5cGUgY2hhaW4gdG8gYSBmbGF0IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZU9iaiBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gW2Rlc3RPYmpdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEJvb2xlYW59IFtmaWx0ZXJdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcEZpbHRlcl1cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5jb25zdCB0b0ZsYXRPYmplY3QgPSAoc291cmNlT2JqLCBkZXN0T2JqLCBmaWx0ZXIsIHByb3BGaWx0ZXIpID0+IHtcbiAgbGV0IHByb3BzO1xuICBsZXQgaTtcbiAgbGV0IHByb3A7XG4gIGNvbnN0IG1lcmdlZCA9IHt9O1xuXG4gIGRlc3RPYmogPSBkZXN0T2JqIHx8IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgaWYgKHNvdXJjZU9iaiA9PSBudWxsKSByZXR1cm4gZGVzdE9iajtcblxuICBkbyB7XG4gICAgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VPYmopO1xuICAgIGkgPSBwcm9wcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgIGlmICgoIXByb3BGaWx0ZXIgfHwgcHJvcEZpbHRlcihwcm9wLCBzb3VyY2VPYmosIGRlc3RPYmopKSAmJiAhbWVyZ2VkW3Byb3BdKSB7XG4gICAgICAgIGRlc3RPYmpbcHJvcF0gPSBzb3VyY2VPYmpbcHJvcF07XG4gICAgICAgIG1lcmdlZFtwcm9wXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZU9iaiA9IGZpbHRlciAhPT0gZmFsc2UgJiYgZ2V0UHJvdG90eXBlT2Yoc291cmNlT2JqKTtcbiAgfSB3aGlsZSAoc291cmNlT2JqICYmICghZmlsdGVyIHx8IGZpbHRlcihzb3VyY2VPYmosIGRlc3RPYmopKSAmJiBzb3VyY2VPYmogIT09IE9iamVjdC5wcm90b3R5cGUpO1xuXG4gIHJldHVybiBkZXN0T2JqO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBjaGFyYWN0ZXJzIG9mIGEgc3BlY2lmaWVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWFyY2hTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb249IDBdXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGVuZHNXaXRoID0gKHN0ciwgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbikgPT4ge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPiBzdHIubGVuZ3RoKSB7XG4gICAgcG9zaXRpb24gPSBzdHIubGVuZ3RoO1xuICB9XG4gIHBvc2l0aW9uIC09IHNlYXJjaFN0cmluZy5sZW5ndGg7XG4gIGNvbnN0IGxhc3RJbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0cmluZywgcG9zaXRpb24pO1xuICByZXR1cm4gbGFzdEluZGV4ICE9PSAtMSAmJiBsYXN0SW5kZXggPT09IHBvc2l0aW9uO1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGZyb20gYXJyYXkgbGlrZSBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqXG4gKiBAcGFyYW0geyp9IFt0aGluZ11cbiAqXG4gKiBAcmV0dXJucyB7P0FycmF5fVxuICovXG5jb25zdCB0b0FycmF5ID0gKHRoaW5nKSA9PiB7XG4gIGlmICghdGhpbmcpIHJldHVybiBudWxsO1xuICBpZiAoaXNBcnJheSh0aGluZykpIHJldHVybiB0aGluZztcbiAgbGV0IGkgPSB0aGluZy5sZW5ndGg7XG4gIGlmICghaXNOdW1iZXIoaSkpIHJldHVybiBudWxsO1xuICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgYXJyW2ldID0gdGhpbmdbaV07XG4gIH1cbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qKlxuICogQ2hlY2tpbmcgaWYgdGhlIFVpbnQ4QXJyYXkgZXhpc3RzIGFuZCBpZiBpdCBkb2VzLCBpdCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgdGhlXG4gKiB0aGluZyBwYXNzZWQgaW4gaXMgYW4gaW5zdGFuY2Ugb2YgVWludDhBcnJheVxuICpcbiAqIEBwYXJhbSB7VHlwZWRBcnJheX1cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5jb25zdCBpc1R5cGVkQXJyYXkgPSAoVHlwZWRBcnJheSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiB0aGluZyA9PiB7XG4gICAgcmV0dXJuIFR5cGVkQXJyYXkgJiYgdGhpbmcgaW5zdGFuY2VvZiBUeXBlZEFycmF5O1xuICB9O1xufSkodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkpKTtcblxuLyoqXG4gKiBGb3IgZWFjaCBlbnRyeSBpbiB0aGUgb2JqZWN0LCBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBrZXkgYW5kIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBmb3JFYWNoRW50cnkgPSAob2JqLCBmbikgPT4ge1xuICBjb25zdCBnZW5lcmF0b3IgPSBvYmogJiYgb2JqW1N5bWJvbC5pdGVyYXRvcl07XG5cbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3IuY2FsbChvYmopO1xuXG4gIGxldCByZXN1bHQ7XG5cbiAgd2hpbGUgKChyZXN1bHQgPSBpdGVyYXRvci5uZXh0KCkpICYmICFyZXN1bHQuZG9uZSkge1xuICAgIGNvbnN0IHBhaXIgPSByZXN1bHQudmFsdWU7XG4gICAgZm4uY2FsbChvYmosIHBhaXJbMF0sIHBhaXJbMV0pO1xuICB9XG59O1xuXG4vKipcbiAqIEl0IHRha2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBhIHN0cmluZywgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtYXRjaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8Ym9vbGVhbj59XG4gKi9cbmNvbnN0IG1hdGNoQWxsID0gKHJlZ0V4cCwgc3RyKSA9PiB7XG4gIGxldCBtYXRjaGVzO1xuICBjb25zdCBhcnIgPSBbXTtcblxuICB3aGlsZSAoKG1hdGNoZXMgPSByZWdFeHAuZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKG1hdGNoZXMpO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qIENoZWNraW5nIGlmIHRoZSBraW5kT2ZUZXN0IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhbiBIVE1MRm9ybUVsZW1lbnQuICovXG5jb25zdCBpc0hUTUxGb3JtID0ga2luZE9mVGVzdCgnSFRNTEZvcm1FbGVtZW50Jyk7XG5cbmNvbnN0IHRvQ2FtZWxDYXNlID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX1xcc10oW2EtelxcZF0pKFxcdyopL2csXG4gICAgZnVuY3Rpb24gcmVwbGFjZXIobSwgcDEsIHAyKSB7XG4gICAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKSArIHAyO1xuICAgIH1cbiAgKTtcbn07XG5cbi8qIENyZWF0aW5nIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBwcm9wZXJ0eS4gKi9cbmNvbnN0IGhhc093blByb3BlcnR5ID0gKCh7aGFzT3duUHJvcGVydHl9KSA9PiAob2JqLCBwcm9wKSA9PiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpKE9iamVjdC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNSZWdFeHAgPSBraW5kT2ZUZXN0KCdSZWdFeHAnKTtcblxuY29uc3QgcmVkdWNlRGVzY3JpcHRvcnMgPSAob2JqLCByZWR1Y2VyKSA9PiB7XG4gIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKTtcbiAgY29uc3QgcmVkdWNlZERlc2NyaXB0b3JzID0ge307XG5cbiAgZm9yRWFjaChkZXNjcmlwdG9ycywgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICBsZXQgcmV0O1xuICAgIGlmICgocmV0ID0gcmVkdWNlcihkZXNjcmlwdG9yLCBuYW1lLCBvYmopKSAhPT0gZmFsc2UpIHtcbiAgICAgIHJlZHVjZWREZXNjcmlwdG9yc1tuYW1lXSA9IHJldCB8fCBkZXNjcmlwdG9yO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqLCByZWR1Y2VkRGVzY3JpcHRvcnMpO1xufTtcblxuLyoqXG4gKiBNYWtlcyBhbGwgbWV0aG9kcyByZWFkLW9ubHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqL1xuXG5jb25zdCBmcmVlemVNZXRob2RzID0gKG9iaikgPT4ge1xuICByZWR1Y2VEZXNjcmlwdG9ycyhvYmosIChkZXNjcmlwdG9yLCBuYW1lKSA9PiB7XG4gICAgLy8gc2tpcCByZXN0cmljdGVkIHByb3BzIGluIHN0cmljdCBtb2RlXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSAmJiBbJ2FyZ3VtZW50cycsICdjYWxsZXInLCAnY2FsbGVlJ10uaW5kZXhPZihuYW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtuYW1lXTtcblxuICAgIGlmICghaXNGdW5jdGlvbih2YWx1ZSkpIHJldHVybjtcblxuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGZhbHNlO1xuXG4gICAgaWYgKCd3cml0YWJsZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgZGVzY3JpcHRvci53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGVzY3JpcHRvci5zZXQpIHtcbiAgICAgIGRlc2NyaXB0b3Iuc2V0ID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBFcnJvcignQ2FuIG5vdCByZXdyaXRlIHJlYWQtb25seSBtZXRob2QgXFwnJyArIG5hbWUgKyAnXFwnJyk7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCB0b09iamVjdFNldCA9IChhcnJheU9yU3RyaW5nLCBkZWxpbWl0ZXIpID0+IHtcbiAgY29uc3Qgb2JqID0ge307XG5cbiAgY29uc3QgZGVmaW5lID0gKGFycikgPT4ge1xuICAgIGFyci5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIG9ialt2YWx1ZV0gPSB0cnVlO1xuICAgIH0pO1xuICB9O1xuXG4gIGlzQXJyYXkoYXJyYXlPclN0cmluZykgPyBkZWZpbmUoYXJyYXlPclN0cmluZykgOiBkZWZpbmUoU3RyaW5nKGFycmF5T3JTdHJpbmcpLnNwbGl0KGRlbGltaXRlcikpO1xuXG4gIHJldHVybiBvYmo7XG59O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmNvbnN0IHRvRmluaXRlTnVtYmVyID0gKHZhbHVlLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlID0gK3ZhbHVlKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlO1xufTtcblxuY29uc3QgQUxQSEEgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonO1xuXG5jb25zdCBESUdJVCA9ICcwMTIzNDU2Nzg5JztcblxuY29uc3QgQUxQSEFCRVQgPSB7XG4gIERJR0lULFxuICBBTFBIQSxcbiAgQUxQSEFfRElHSVQ6IEFMUEhBICsgQUxQSEEudG9VcHBlckNhc2UoKSArIERJR0lUXG59O1xuXG5jb25zdCBnZW5lcmF0ZVN0cmluZyA9IChzaXplID0gMTYsIGFscGhhYmV0ID0gQUxQSEFCRVQuQUxQSEFfRElHSVQpID0+IHtcbiAgbGV0IHN0ciA9ICcnO1xuICBjb25zdCB7bGVuZ3RofSA9IGFscGhhYmV0O1xuICB3aGlsZSAoc2l6ZS0tKSB7XG4gICAgc3RyICs9IGFscGhhYmV0W01hdGgucmFuZG9tKCkgKiBsZW5ndGh8MF07XG4gIH1cblxuICByZXR1cm4gc3RyO1xufTtcblxuLyoqXG4gKiBJZiB0aGUgdGhpbmcgaXMgYSBGb3JtRGF0YSBvYmplY3QsIHJldHVybiB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpbmcgLSBUaGUgdGhpbmcgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzU3BlY0NvbXBsaWFudEZvcm0odGhpbmcpIHtcbiAgcmV0dXJuICEhKHRoaW5nICYmIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiB0aGluZ1tTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnICYmIHRoaW5nW1N5bWJvbC5pdGVyYXRvcl0pO1xufVxuXG5jb25zdCB0b0pTT05PYmplY3QgPSAob2JqKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEFycmF5KDEwKTtcblxuICBjb25zdCB2aXNpdCA9IChzb3VyY2UsIGkpID0+IHtcblxuICAgIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICBpZiAoc3RhY2suaW5kZXhPZihzb3VyY2UpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZighKCd0b0pTT04nIGluIHNvdXJjZSkpIHtcbiAgICAgICAgc3RhY2tbaV0gPSBzb3VyY2U7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGlzQXJyYXkoc291cmNlKSA/IFtdIDoge307XG5cbiAgICAgICAgZm9yRWFjaChzb3VyY2UsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVkdWNlZFZhbHVlID0gdmlzaXQodmFsdWUsIGkgKyAxKTtcbiAgICAgICAgICAhaXNVbmRlZmluZWQocmVkdWNlZFZhbHVlKSAmJiAodGFyZ2V0W2tleV0gPSByZWR1Y2VkVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzdGFja1tpXSA9IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2U7XG4gIH07XG5cbiAgcmV0dXJuIHZpc2l0KG9iaiwgMCk7XG59O1xuXG5jb25zdCBpc0FzeW5jRm4gPSBraW5kT2ZUZXN0KCdBc3luY0Z1bmN0aW9uJyk7XG5cbmNvbnN0IGlzVGhlbmFibGUgPSAodGhpbmcpID0+XG4gIHRoaW5nICYmIChpc09iamVjdCh0aGluZykgfHwgaXNGdW5jdGlvbih0aGluZykpICYmIGlzRnVuY3Rpb24odGhpbmcudGhlbikgJiYgaXNGdW5jdGlvbih0aGluZy5jYXRjaCk7XG5cbnZhciB1dGlscyQxID0ge1xuICBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyLFxuICBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nLFxuICBpc051bWJlcixcbiAgaXNCb29sZWFuLFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNSZWFkYWJsZVN0cmVhbSxcbiAgaXNSZXF1ZXN0LFxuICBpc1Jlc3BvbnNlLFxuICBpc0hlYWRlcnMsXG4gIGlzVW5kZWZpbmVkLFxuICBpc0RhdGUsXG4gIGlzRmlsZSxcbiAgaXNCbG9iLFxuICBpc1JlZ0V4cCxcbiAgaXNGdW5jdGlvbixcbiAgaXNTdHJlYW0sXG4gIGlzVVJMU2VhcmNoUGFyYW1zLFxuICBpc1R5cGVkQXJyYXksXG4gIGlzRmlsZUxpc3QsXG4gIGZvckVhY2gsXG4gIG1lcmdlLFxuICBleHRlbmQsXG4gIHRyaW0sXG4gIHN0cmlwQk9NLFxuICBpbmhlcml0cyxcbiAgdG9GbGF0T2JqZWN0LFxuICBraW5kT2YsXG4gIGtpbmRPZlRlc3QsXG4gIGVuZHNXaXRoLFxuICB0b0FycmF5LFxuICBmb3JFYWNoRW50cnksXG4gIG1hdGNoQWxsLFxuICBpc0hUTUxGb3JtLFxuICBoYXNPd25Qcm9wZXJ0eSxcbiAgaGFzT3duUHJvcDogaGFzT3duUHJvcGVydHksIC8vIGFuIGFsaWFzIHRvIGF2b2lkIEVTTGludCBuby1wcm90b3R5cGUtYnVpbHRpbnMgZGV0ZWN0aW9uXG4gIHJlZHVjZURlc2NyaXB0b3JzLFxuICBmcmVlemVNZXRob2RzLFxuICB0b09iamVjdFNldCxcbiAgdG9DYW1lbENhc2UsXG4gIG5vb3AsXG4gIHRvRmluaXRlTnVtYmVyLFxuICBmaW5kS2V5LFxuICBnbG9iYWw6IF9nbG9iYWwsXG4gIGlzQ29udGV4dERlZmluZWQsXG4gIEFMUEhBQkVULFxuICBnZW5lcmF0ZVN0cmluZyxcbiAgaXNTcGVjQ29tcGxpYW50Rm9ybSxcbiAgdG9KU09OT2JqZWN0LFxuICBpc0FzeW5jRm4sXG4gIGlzVGhlbmFibGVcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29uZmlnXSBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5mdW5jdGlvbiBBeGlvc0Vycm9yKG1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgRXJyb3IuY2FsbCh0aGlzKTtcblxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgfVxuXG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMubmFtZSA9ICdBeGlvc0Vycm9yJztcbiAgY29kZSAmJiAodGhpcy5jb2RlID0gY29kZSk7XG4gIGNvbmZpZyAmJiAodGhpcy5jb25maWcgPSBjb25maWcpO1xuICByZXF1ZXN0ICYmICh0aGlzLnJlcXVlc3QgPSByZXF1ZXN0KTtcbiAgcmVzcG9uc2UgJiYgKHRoaXMucmVzcG9uc2UgPSByZXNwb25zZSk7XG59XG5cbnV0aWxzJDEuaW5oZXJpdHMoQXhpb3NFcnJvciwgRXJyb3IsIHtcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdXRpbHMkMS50b0pTT05PYmplY3QodGhpcy5jb25maWcpLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgc3RhdHVzOiB0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2Uuc3RhdHVzID8gdGhpcy5yZXNwb25zZS5zdGF0dXMgOiBudWxsXG4gICAgfTtcbiAgfVxufSk7XG5cbmNvbnN0IHByb3RvdHlwZSQxID0gQXhpb3NFcnJvci5wcm90b3R5cGU7XG5jb25zdCBkZXNjcmlwdG9ycyA9IHt9O1xuXG5bXG4gICdFUlJfQkFEX09QVElPTl9WQUxVRScsXG4gICdFUlJfQkFEX09QVElPTicsXG4gICdFQ09OTkFCT1JURUQnLFxuICAnRVRJTUVET1VUJyxcbiAgJ0VSUl9ORVRXT1JLJyxcbiAgJ0VSUl9GUl9UT09fTUFOWV9SRURJUkVDVFMnLFxuICAnRVJSX0RFUFJFQ0FURUQnLFxuICAnRVJSX0JBRF9SRVNQT05TRScsXG4gICdFUlJfQkFEX1JFUVVFU1QnLFxuICAnRVJSX0NBTkNFTEVEJyxcbiAgJ0VSUl9OT1RfU1VQUE9SVCcsXG4gICdFUlJfSU5WQUxJRF9VUkwnXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuXS5mb3JFYWNoKGNvZGUgPT4ge1xuICBkZXNjcmlwdG9yc1tjb2RlXSA9IHt2YWx1ZTogY29kZX07XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXhpb3NFcnJvciwgZGVzY3JpcHRvcnMpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSQxLCAnaXNBeGlvc0Vycm9yJywge3ZhbHVlOiB0cnVlfSk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5BeGlvc0Vycm9yLmZyb20gPSAoZXJyb3IsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UsIGN1c3RvbVByb3BzKSA9PiB7XG4gIGNvbnN0IGF4aW9zRXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSQxKTtcblxuICB1dGlscyQxLnRvRmxhdE9iamVjdChlcnJvciwgYXhpb3NFcnJvciwgZnVuY3Rpb24gZmlsdGVyKG9iaikge1xuICAgIHJldHVybiBvYmogIT09IEVycm9yLnByb3RvdHlwZTtcbiAgfSwgcHJvcCA9PiB7XG4gICAgcmV0dXJuIHByb3AgIT09ICdpc0F4aW9zRXJyb3InO1xuICB9KTtcblxuICBBeGlvc0Vycm9yLmNhbGwoYXhpb3NFcnJvciwgZXJyb3IubWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSk7XG5cbiAgYXhpb3NFcnJvci5jYXVzZSA9IGVycm9yO1xuXG4gIGF4aW9zRXJyb3IubmFtZSA9IGVycm9yLm5hbWU7XG5cbiAgY3VzdG9tUHJvcHMgJiYgT2JqZWN0LmFzc2lnbihheGlvc0Vycm9yLCBjdXN0b21Qcm9wcyk7XG5cbiAgcmV0dXJuIGF4aW9zRXJyb3I7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3RyaWN0XG52YXIgaHR0cEFkYXB0ZXIgPSBudWxsO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHRoaW5nIGlzIGEgYXJyYXkgb3IganMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aGluZyAtIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gYmUgdmlzaXRlZC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNWaXNpdGFibGUodGhpbmcpIHtcbiAgcmV0dXJuIHV0aWxzJDEuaXNQbGFpbk9iamVjdCh0aGluZykgfHwgdXRpbHMkMS5pc0FycmF5KHRoaW5nKTtcbn1cblxuLyoqXG4gKiBJdCByZW1vdmVzIHRoZSBicmFja2V0cyBmcm9tIHRoZSBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgcGFyYW1ldGVyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBrZXkgd2l0aG91dCB0aGUgYnJhY2tldHMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUJyYWNrZXRzKGtleSkge1xuICByZXR1cm4gdXRpbHMkMS5lbmRzV2l0aChrZXksICdbXScpID8ga2V5LnNsaWNlKDAsIC0yKSA6IGtleTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhdGgsIGEga2V5LCBhbmQgYSBib29sZWFuLCBhbmQgcmV0dXJucyBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGJlaW5nIGl0ZXJhdGVkIG92ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZG90cyAtIElmIHRydWUsIHRoZSBrZXkgd2lsbCBiZSByZW5kZXJlZCB3aXRoIGRvdHMgaW5zdGVhZCBvZiBicmFja2V0cy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCB0byB0aGUgY3VycmVudCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4ga2V5O1xuICByZXR1cm4gcGF0aC5jb25jYXQoa2V5KS5tYXAoZnVuY3Rpb24gZWFjaCh0b2tlbiwgaSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIHRva2VuID0gcmVtb3ZlQnJhY2tldHModG9rZW4pO1xuICAgIHJldHVybiAhZG90cyAmJiBpID8gJ1snICsgdG9rZW4gKyAnXScgOiB0b2tlbjtcbiAgfSkuam9pbihkb3RzID8gJy4nIDogJycpO1xufVxuXG4vKipcbiAqIElmIHRoZSBhcnJheSBpcyBhbiBhcnJheSBhbmQgbm9uZSBvZiBpdHMgZWxlbWVudHMgYXJlIHZpc2l0YWJsZSwgdGhlbiBpdCdzIGEgZmxhdCBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZsYXRBcnJheShhcnIpIHtcbiAgcmV0dXJuIHV0aWxzJDEuaXNBcnJheShhcnIpICYmICFhcnIuc29tZShpc1Zpc2l0YWJsZSk7XG59XG5cbmNvbnN0IHByZWRpY2F0ZXMgPSB1dGlscyQxLnRvRmxhdE9iamVjdCh1dGlscyQxLCB7fSwgbnVsbCwgZnVuY3Rpb24gZmlsdGVyKHByb3ApIHtcbiAgcmV0dXJuIC9eaXNbQS1aXS8udGVzdChwcm9wKTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSBkYXRhIG9iamVjdCB0byBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7P09iamVjdH0gW2Zvcm1EYXRhXVxuICogQHBhcmFtIHs/T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZpc2l0b3JdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1ldGFUb2tlbnMgPSB0cnVlXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kb3RzID0gZmFsc2VdXG4gKiBAcGFyYW0gez9Cb29sZWFufSBbb3B0aW9ucy5pbmRleGVzID0gZmFsc2VdXG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqKi9cblxuLyoqXG4gKiBJdCBjb252ZXJ0cyBhbiBvYmplY3QgaW50byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIGZvcm0gZGF0YS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSAtIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zXG4gKlxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gdG9Gb3JtRGF0YShvYmosIGZvcm1EYXRhLCBvcHRpb25zKSB7XG4gIGlmICghdXRpbHMkMS5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgZm9ybURhdGEgPSBmb3JtRGF0YSB8fCBuZXcgKEZvcm1EYXRhKSgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBvcHRpb25zID0gdXRpbHMkMS50b0ZsYXRPYmplY3Qob3B0aW9ucywge1xuICAgIG1ldGFUb2tlbnM6IHRydWUsXG4gICAgZG90czogZmFsc2UsXG4gICAgaW5kZXhlczogZmFsc2VcbiAgfSwgZmFsc2UsIGZ1bmN0aW9uIGRlZmluZWQob3B0aW9uLCBzb3VyY2UpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgICByZXR1cm4gIXV0aWxzJDEuaXNVbmRlZmluZWQoc291cmNlW29wdGlvbl0pO1xuICB9KTtcblxuICBjb25zdCBtZXRhVG9rZW5zID0gb3B0aW9ucy5tZXRhVG9rZW5zO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgY29uc3QgdmlzaXRvciA9IG9wdGlvbnMudmlzaXRvciB8fCBkZWZhdWx0VmlzaXRvcjtcbiAgY29uc3QgZG90cyA9IG9wdGlvbnMuZG90cztcbiAgY29uc3QgaW5kZXhlcyA9IG9wdGlvbnMuaW5kZXhlcztcbiAgY29uc3QgX0Jsb2IgPSBvcHRpb25zLkJsb2IgfHwgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIEJsb2I7XG4gIGNvbnN0IHVzZUJsb2IgPSBfQmxvYiAmJiB1dGlscyQxLmlzU3BlY0NvbXBsaWFudEZvcm0oZm9ybURhdGEpO1xuXG4gIGlmICghdXRpbHMkMS5pc0Z1bmN0aW9uKHZpc2l0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmlzaXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICcnO1xuXG4gICAgaWYgKHV0aWxzJDEuaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VCbG9iICYmIHV0aWxzJDEuaXNCbG9iKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ0Jsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzJDEuaXNBcnJheUJ1ZmZlcih2YWx1ZSkgfHwgdXRpbHMkMS5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdXNlQmxvYiAmJiB0eXBlb2YgQmxvYiA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBCbG9iKFt2YWx1ZV0pIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZpc2l0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBrZXlcbiAgICogQHBhcmFtIHtBcnJheTxTdHJpbmd8TnVtYmVyPn0gcGF0aFxuICAgKiBAdGhpcyB7Rm9ybURhdGF9XG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgZWFjaCBwcm9wIG9mIHRoZSB2YWx1ZSByZWN1cnNpdmVseVxuICAgKi9cbiAgZnVuY3Rpb24gZGVmYXVsdFZpc2l0b3IodmFsdWUsIGtleSwgcGF0aCkge1xuICAgIGxldCBhcnIgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhcGF0aCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodXRpbHMkMS5lbmRzV2l0aChrZXksICd7fScpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSBtZXRhVG9rZW5zID8ga2V5IDoga2V5LnNsaWNlKDAsIC0yKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKHV0aWxzJDEuaXNBcnJheSh2YWx1ZSkgJiYgaXNGbGF0QXJyYXkodmFsdWUpKSB8fFxuICAgICAgICAoKHV0aWxzJDEuaXNGaWxlTGlzdCh2YWx1ZSkgfHwgdXRpbHMkMS5lbmRzV2l0aChrZXksICdbXScpKSAmJiAoYXJyID0gdXRpbHMkMS50b0FycmF5KHZhbHVlKSlcbiAgICAgICAgKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gcmVtb3ZlQnJhY2tldHMoa2V5KTtcblxuICAgICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiBlYWNoKGVsLCBpbmRleCkge1xuICAgICAgICAgICEodXRpbHMkMS5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgaW5kZXhlcyA9PT0gdHJ1ZSA/IHJlbmRlcktleShba2V5XSwgaW5kZXgsIGRvdHMpIDogKGluZGV4ZXMgPT09IG51bGwgPyBrZXkgOiBrZXkgKyAnW10nKSxcbiAgICAgICAgICAgIGNvbnZlcnRWYWx1ZShlbClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1Zpc2l0YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvcm1EYXRhLmFwcGVuZChyZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSwgY29udmVydFZhbHVlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzdGFjayA9IFtdO1xuXG4gIGNvbnN0IGV4cG9zZWRIZWxwZXJzID0gT2JqZWN0LmFzc2lnbihwcmVkaWNhdGVzLCB7XG4gICAgZGVmYXVsdFZpc2l0b3IsXG4gICAgY29udmVydFZhbHVlLFxuICAgIGlzVmlzaXRhYmxlXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGJ1aWxkKHZhbHVlLCBwYXRoKSB7XG4gICAgaWYgKHV0aWxzJDEuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47XG5cbiAgICBpZiAoc3RhY2suaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICcgKyBwYXRoLmpvaW4oJy4nKSk7XG4gICAgfVxuXG4gICAgc3RhY2sucHVzaCh2YWx1ZSk7XG5cbiAgICB1dGlscyQxLmZvckVhY2godmFsdWUsIGZ1bmN0aW9uIGVhY2goZWwsIGtleSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gISh1dGlscyQxLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgdmlzaXRvci5jYWxsKFxuICAgICAgICBmb3JtRGF0YSwgZWwsIHV0aWxzJDEuaXNTdHJpbmcoa2V5KSA/IGtleS50cmltKCkgOiBrZXksIHBhdGgsIGV4cG9zZWRIZWxwZXJzXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGJ1aWxkKGVsLCBwYXRoID8gcGF0aC5jb25jYXQoa2V5KSA6IFtrZXldKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0YWNrLnBvcCgpO1xuICB9XG5cbiAgaWYgKCF1dGlscyQxLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkYXRhIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBidWlsZChvYmopO1xuXG4gIHJldHVybiBmb3JtRGF0YTtcbn1cblxuLyoqXG4gKiBJdCBlbmNvZGVzIGEgc3RyaW5nIGJ5IHJlcGxhY2luZyBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgaW4gdGhlIHVucmVzZXJ2ZWQgc2V0IHdpdGhcbiAqIHRoZWlyIHBlcmNlbnQtZW5jb2RlZCBlcXVpdmFsZW50c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIGVuY29kZS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZSQxKHN0cikge1xuICBjb25zdCBjaGFyTWFwID0ge1xuICAgICchJzogJyUyMScsXG4gICAgXCInXCI6ICclMjcnLFxuICAgICcoJzogJyUyOCcsXG4gICAgJyknOiAnJTI5JyxcbiAgICAnfic6ICclN0UnLFxuICAgICclMjAnOiAnKycsXG4gICAgJyUwMCc6ICdcXHgwMCdcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpfl18JTIwfCUwMC9nLCBmdW5jdGlvbiByZXBsYWNlcihtYXRjaCkge1xuICAgIHJldHVybiBjaGFyTWFwW21hdGNoXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXJhbXMgb2JqZWN0IGFuZCBjb252ZXJ0cyBpdCB0byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gYmUgY29udmVydGVkIHRvIGEgRm9ybURhdGEgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0IHBhc3NlZCB0byB0aGUgQXhpb3MgY29uc3RydWN0b3IuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIEF4aW9zVVJMU2VhcmNoUGFyYW1zKHBhcmFtcywgb3B0aW9ucykge1xuICB0aGlzLl9wYWlycyA9IFtdO1xuXG4gIHBhcmFtcyAmJiB0b0Zvcm1EYXRhKHBhcmFtcywgdGhpcywgb3B0aW9ucyk7XG59XG5cbmNvbnN0IHByb3RvdHlwZSA9IEF4aW9zVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcblxucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZChuYW1lLCB2YWx1ZSkge1xuICB0aGlzLl9wYWlycy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xufTtcblxucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoZW5jb2Rlcikge1xuICBjb25zdCBfZW5jb2RlID0gZW5jb2RlciA/IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVuY29kZXIuY2FsbCh0aGlzLCB2YWx1ZSwgZW5jb2RlJDEpO1xuICB9IDogZW5jb2RlJDE7XG5cbiAgcmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbiBlYWNoKHBhaXIpIHtcbiAgICByZXR1cm4gX2VuY29kZShwYWlyWzBdKSArICc9JyArIF9lbmNvZGUocGFpclsxXSk7XG4gIH0sICcnKS5qb2luKCcmJyk7XG59O1xuXG4vKipcbiAqIEl0IHJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGNoYXJhY3RlcnMgYDpgLCBgJGAsIGAsYCwgYCtgLCBgW2AsIGFuZCBgXWAgd2l0aCB0aGVpclxuICogVVJJIGVuY29kZWQgY291bnRlcnBhcnRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCBUaGUgdmFsdWUgdG8gYmUgZW5jb2RlZC5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEBwYXJhbSB7P29iamVjdH0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkVVJMKHVybCwgcGFyYW1zLCBvcHRpb25zKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICBpZiAoIXBhcmFtcykge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgXG4gIGNvbnN0IF9lbmNvZGUgPSBvcHRpb25zICYmIG9wdGlvbnMuZW5jb2RlIHx8IGVuY29kZTtcblxuICBjb25zdCBzZXJpYWxpemVGbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5zZXJpYWxpemU7XG5cbiAgbGV0IHNlcmlhbGl6ZWRQYXJhbXM7XG5cbiAgaWYgKHNlcmlhbGl6ZUZuKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHNlcmlhbGl6ZUZuKHBhcmFtcywgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHV0aWxzJDEuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSA/XG4gICAgICBwYXJhbXMudG9TdHJpbmcoKSA6XG4gICAgICBuZXcgQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKS50b1N0cmluZyhfZW5jb2RlKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgY29uc3QgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKFwiI1wiKTtcblxuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuXG5jbGFzcyBJbnRlcmNlcHRvck1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAgICovXG4gIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkLCBvcHRpb25zKSB7XG4gICAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICAgIGZ1bGZpbGxlZCxcbiAgICAgIHJlamVjdGVkLFxuICAgICAgc3luY2hyb25vdXM6IG9wdGlvbnMgPyBvcHRpb25zLnN5bmNocm9ub3VzIDogZmFsc2UsXG4gICAgICBydW5XaGVuOiBvcHRpb25zID8gb3B0aW9ucy5ydW5XaGVuIDogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGludGVyY2VwdG9yIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAgICpcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW50ZXJjZXB0b3Igd2FzIHJlbW92ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAqL1xuICBlamVjdChpZCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgICAgdGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgaW50ZXJjZXB0b3JzIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAgICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZm9yRWFjaChmbikge1xuICAgIHV0aWxzJDEuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgICBmbihoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyJDEgPSBJbnRlcmNlcHRvck1hbmFnZXI7XG5cbnZhciB0cmFuc2l0aW9uYWxEZWZhdWx0cyA9IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZVxufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtcyQxID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgPyBVUkxTZWFyY2hQYXJhbXMgOiBBeGlvc1VSTFNlYXJjaFBhcmFtcztcblxudmFyIEZvcm1EYXRhJDEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnID8gRm9ybURhdGEgOiBudWxsO1xuXG52YXIgQmxvYiQxID0gdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnID8gQmxvYiA6IG51bGw7XG5cbnZhciBwbGF0Zm9ybSQxID0ge1xuICBpc0Jyb3dzZXI6IHRydWUsXG4gIGNsYXNzZXM6IHtcbiAgICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtcyQxLFxuICAgIEZvcm1EYXRhOiBGb3JtRGF0YSQxLFxuICAgIEJsb2I6IEJsb2IkMVxuICB9LFxuICBwcm90b2NvbHM6IFsnaHR0cCcsICdodHRwcycsICdmaWxlJywgJ2Jsb2InLCAndXJsJywgJ2RhdGEnXVxufTtcblxuY29uc3QgaGFzQnJvd3NlckVudiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50XG4gKlxuICogVGhpcyBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlciwgYW5kIHJlYWN0LW5hdGl2ZS5cbiAqIEJvdGggZW52aXJvbm1lbnRzIHN1cHBvcnQgWE1MSHR0cFJlcXVlc3QsIGJ1dCBub3QgZnVsbHkgc3RhbmRhcmQgZ2xvYmFscy5cbiAqXG4gKiB3ZWIgd29ya2VyczpcbiAqICB0eXBlb2Ygd2luZG93IC0+IHVuZGVmaW5lZFxuICogIHR5cGVvZiBkb2N1bWVudCAtPiB1bmRlZmluZWRcbiAqXG4gKiByZWFjdC1uYXRpdmU6XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ1JlYWN0TmF0aXZlJ1xuICogbmF0aXZlc2NyaXB0XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ05hdGl2ZVNjcmlwdCcgb3IgJ05TJ1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBoYXNTdGFuZGFyZEJyb3dzZXJFbnYgPSAoXG4gIChwcm9kdWN0KSA9PiB7XG4gICAgcmV0dXJuIGhhc0Jyb3dzZXJFbnYgJiYgWydSZWFjdE5hdGl2ZScsICdOYXRpdmVTY3JpcHQnLCAnTlMnXS5pbmRleE9mKHByb2R1Y3QpIDwgMFxuICB9KSh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IucHJvZHVjdCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIHdlYldvcmtlciBlbnZpcm9ubWVudFxuICpcbiAqIEFsdGhvdWdoIHRoZSBgaXNTdGFuZGFyZEJyb3dzZXJFbnZgIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdFxuICogYGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyYCwgdGhlIFdlYldvcmtlciB3aWxsIHN0aWxsIGJlXG4gKiBmaWx0ZXJlZCBvdXQgZHVlIHRvIGl0cyBqdWRnbWVudCBzdGFuZGFyZFxuICogYHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdgLlxuICogVGhpcyBsZWFkcyB0byBhIHByb2JsZW0gd2hlbiBheGlvcyBwb3N0IGBGb3JtRGF0YWAgaW4gd2ViV29ya2VyXG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudiA9ICgoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSAmJlxuICAgIHR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHMgPT09ICdmdW5jdGlvbidcbiAgKTtcbn0pKCk7XG5cbmNvbnN0IG9yaWdpbiA9IGhhc0Jyb3dzZXJFbnYgJiYgd2luZG93LmxvY2F0aW9uLmhyZWYgfHwgJ2h0dHA6Ly9sb2NhbGhvc3QnO1xuXG52YXIgdXRpbHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgaGFzQnJvd3NlckVudjogaGFzQnJvd3NlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52OiBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlckVudjogaGFzU3RhbmRhcmRCcm93c2VyRW52LFxuICBvcmlnaW46IG9yaWdpblxufSk7XG5cbnZhciBwbGF0Zm9ybSA9IHtcbiAgLi4udXRpbHMsXG4gIC4uLnBsYXRmb3JtJDFcbn07XG5cbmZ1bmN0aW9uIHRvVVJMRW5jb2RlZEZvcm0oZGF0YSwgb3B0aW9ucykge1xuICByZXR1cm4gdG9Gb3JtRGF0YShkYXRhLCBuZXcgcGxhdGZvcm0uY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMoKSwgT2JqZWN0LmFzc2lnbih7XG4gICAgdmlzaXRvcjogZnVuY3Rpb24odmFsdWUsIGtleSwgcGF0aCwgaGVscGVycykge1xuICAgICAgaWYgKHBsYXRmb3JtLmlzTm9kZSAmJiB1dGlscyQxLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgICB0aGlzLmFwcGVuZChrZXksIHZhbHVlLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhlbHBlcnMuZGVmYXVsdFZpc2l0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH0sIG9wdGlvbnMpKTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHN0cmluZyBsaWtlIGBmb29beF1beV1bel1gIGFuZCByZXR1cm5zIGFuIGFycmF5IGxpa2UgYFsnZm9vJywgJ3gnLCAneScsICd6J11cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQcm9wUGF0aChuYW1lKSB7XG4gIC8vIGZvb1t4XVt5XVt6XVxuICAvLyBmb28ueC55LnpcbiAgLy8gZm9vLXgteS16XG4gIC8vIGZvbyB4IHkgelxuICByZXR1cm4gdXRpbHMkMS5tYXRjaEFsbCgvXFx3K3xcXFsoXFx3KildL2csIG5hbWUpLm1hcChtYXRjaCA9PiB7XG4gICAgcmV0dXJuIG1hdGNoWzBdID09PSAnW10nID8gJycgOiBtYXRjaFsxXSB8fCBtYXRjaFswXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBhcnJheSB0byBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY29udmVydCB0byBhbiBvYmplY3QuXG4gKlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzIGFzIHRoZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlUb09iamVjdChhcnIpIHtcbiAgY29uc3Qgb2JqID0ge307XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcnIpO1xuICBsZXQgaTtcbiAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGg7XG4gIGxldCBrZXk7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGtleSA9IGtleXNbaV07XG4gICAgb2JqW2tleV0gPSBhcnJba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgRm9ybURhdGEgb2JqZWN0IGFuZCByZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgVGhlIEZvcm1EYXRhIG9iamVjdCB0byBjb252ZXJ0IHRvIEpTT04uXG4gKlxuICogQHJldHVybnMge09iamVjdDxzdHJpbmcsIGFueT4gfCBudWxsfSBUaGUgY29udmVydGVkIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZm9ybURhdGFUb0pTT04oZm9ybURhdGEpIHtcbiAgZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXQsIGluZGV4KSB7XG4gICAgbGV0IG5hbWUgPSBwYXRoW2luZGV4KytdO1xuXG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGlzTnVtZXJpY0tleSA9IE51bWJlci5pc0Zpbml0ZSgrbmFtZSk7XG4gICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPj0gcGF0aC5sZW5ndGg7XG4gICAgbmFtZSA9ICFuYW1lICYmIHV0aWxzJDEuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0Lmxlbmd0aCA6IG5hbWU7XG5cbiAgICBpZiAoaXNMYXN0KSB7XG4gICAgICBpZiAodXRpbHMkMS5oYXNPd25Qcm9wKHRhcmdldCwgbmFtZSkpIHtcbiAgICAgICAgdGFyZ2V0W25hbWVdID0gW3RhcmdldFtuYW1lXSwgdmFsdWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W25hbWVdID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0W25hbWVdIHx8ICF1dGlscyQxLmlzT2JqZWN0KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0W25hbWVdLCBpbmRleCk7XG5cbiAgICBpZiAocmVzdWx0ICYmIHV0aWxzJDEuaXNBcnJheSh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBhcnJheVRvT2JqZWN0KHRhcmdldFtuYW1lXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gIH1cblxuICBpZiAodXRpbHMkMS5pc0Zvcm1EYXRhKGZvcm1EYXRhKSAmJiB1dGlscyQxLmlzRnVuY3Rpb24oZm9ybURhdGEuZW50cmllcykpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcblxuICAgIHV0aWxzJDEuZm9yRWFjaEVudHJ5KGZvcm1EYXRhLCAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgIGJ1aWxkUGF0aChwYXJzZVByb3BQYXRoKG5hbWUpLCB2YWx1ZSwgb2JqLCAwKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHN0cmluZywgdHJpZXMgdG8gcGFyc2UgaXQsIGFuZCBpZiBpdCBmYWlscywgaXQgcmV0dXJucyB0aGUgc3RyaW5naWZpZWQgdmVyc2lvblxuICogb2YgdGhlIGlucHV0XG4gKlxuICogQHBhcmFtIHthbnl9IHJhd1ZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHN0cmluZ2lmaWVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyc2VyIC0gQSBmdW5jdGlvbiB0aGF0IHBhcnNlcyBhIHN0cmluZyBpbnRvIGEgSmF2YVNjcmlwdCBvYmplY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmNvZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgdmFsdWUgYW5kIHJldHVybnMgYSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gQSBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIHRoZSByYXdWYWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5U2FmZWx5KHJhd1ZhbHVlLCBwYXJzZXIsIGVuY29kZXIpIHtcbiAgaWYgKHV0aWxzJDEuaXNTdHJpbmcocmF3VmFsdWUpKSB7XG4gICAgdHJ5IHtcbiAgICAgIChwYXJzZXIgfHwgSlNPTi5wYXJzZSkocmF3VmFsdWUpO1xuICAgICAgcmV0dXJuIHV0aWxzJDEudHJpbShyYXdWYWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUubmFtZSAhPT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoZW5jb2RlciB8fCBKU09OLnN0cmluZ2lmeSkocmF3VmFsdWUpO1xufVxuXG5jb25zdCBkZWZhdWx0cyA9IHtcblxuICB0cmFuc2l0aW9uYWw6IHRyYW5zaXRpb25hbERlZmF1bHRzLFxuXG4gIGFkYXB0ZXI6IFsneGhyJywgJ2h0dHAnLCAnZmV0Y2gnXSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzLmdldENvbnRlbnRUeXBlKCkgfHwgJyc7XG4gICAgY29uc3QgaGFzSlNPTkNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpID4gLTE7XG4gICAgY29uc3QgaXNPYmplY3RQYXlsb2FkID0gdXRpbHMkMS5pc09iamVjdChkYXRhKTtcblxuICAgIGlmIChpc09iamVjdFBheWxvYWQgJiYgdXRpbHMkMS5pc0hUTUxGb3JtKGRhdGEpKSB7XG4gICAgICBkYXRhID0gbmV3IEZvcm1EYXRhKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRm9ybURhdGEgPSB1dGlscyQxLmlzRm9ybURhdGEoZGF0YSk7XG5cbiAgICBpZiAoaXNGb3JtRGF0YSkge1xuICAgICAgcmV0dXJuIGhhc0pTT05Db250ZW50VHlwZSA/IEpTT04uc3RyaW5naWZ5KGZvcm1EYXRhVG9KU09OKGRhdGEpKSA6IGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzJDEuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMkMS5pc0J1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMkMS5pc1N0cmVhbShkYXRhKSB8fFxuICAgICAgdXRpbHMkMS5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgIHV0aWxzJDEuaXNCbG9iKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzUmVhZGFibGVTdHJlYW0oZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMkMS5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMkMS5pc1VSTFNlYXJjaFBhcmFtcyhkYXRhKSkge1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnLCBmYWxzZSk7XG4gICAgICByZXR1cm4gZGF0YS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGxldCBpc0ZpbGVMaXN0O1xuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCkge1xuICAgICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRvVVJMRW5jb2RlZEZvcm0oZGF0YSwgdGhpcy5mb3JtU2VyaWFsaXplcikudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChpc0ZpbGVMaXN0ID0gdXRpbHMkMS5pc0ZpbGVMaXN0KGRhdGEpKSB8fCBjb250ZW50VHlwZS5pbmRleE9mKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykgPiAtMSkge1xuICAgICAgICBjb25zdCBfRm9ybURhdGEgPSB0aGlzLmVudiAmJiB0aGlzLmVudi5Gb3JtRGF0YTtcblxuICAgICAgICByZXR1cm4gdG9Gb3JtRGF0YShcbiAgICAgICAgICBpc0ZpbGVMaXN0ID8geydmaWxlc1tdJzogZGF0YX0gOiBkYXRhLFxuICAgICAgICAgIF9Gb3JtRGF0YSAmJiBuZXcgX0Zvcm1EYXRhKCksXG4gICAgICAgICAgdGhpcy5mb3JtU2VyaWFsaXplclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc09iamVjdFBheWxvYWQgfHwgaGFzSlNPTkNvbnRlbnRUeXBlICkge1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24vanNvbicsIGZhbHNlKTtcbiAgICAgIHJldHVybiBzdHJpbmdpZnlTYWZlbHkoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIHRyYW5zZm9ybVJlc3BvbnNlOiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2UoZGF0YSkge1xuICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IHRoaXMudHJhbnNpdGlvbmFsIHx8IGRlZmF1bHRzLnRyYW5zaXRpb25hbDtcbiAgICBjb25zdCBmb3JjZWRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuZm9yY2VkSlNPTlBhcnNpbmc7XG4gICAgY29uc3QgSlNPTlJlcXVlc3RlZCA9IHRoaXMucmVzcG9uc2VUeXBlID09PSAnanNvbic7XG5cbiAgICBpZiAodXRpbHMkMS5pc1Jlc3BvbnNlKGRhdGEpIHx8IHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgdXRpbHMkMS5pc1N0cmluZyhkYXRhKSAmJiAoKGZvcmNlZEpTT05QYXJzaW5nICYmICF0aGlzLnJlc3BvbnNlVHlwZSkgfHwgSlNPTlJlcXVlc3RlZCkpIHtcbiAgICAgIGNvbnN0IHNpbGVudEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5zaWxlbnRKU09OUGFyc2luZztcbiAgICAgIGNvbnN0IHN0cmljdEpTT05QYXJzaW5nID0gIXNpbGVudEpTT05QYXJzaW5nICYmIEpTT05SZXF1ZXN0ZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoc3RyaWN0SlNPTlBhcnNpbmcpIHtcbiAgICAgICAgICBpZiAoZS5uYW1lID09PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgICAgICB0aHJvdyBBeGlvc0Vycm9yLmZyb20oZSwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLCB0aGlzLCBudWxsLCB0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcbiAgbWF4Qm9keUxlbmd0aDogLTEsXG5cbiAgZW52OiB7XG4gICAgRm9ybURhdGE6IHBsYXRmb3JtLmNsYXNzZXMuRm9ybURhdGEsXG4gICAgQmxvYjogcGxhdGZvcm0uY2xhc3Nlcy5CbG9iXG4gIH0sXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfSxcblxuICBoZWFkZXJzOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicsXG4gICAgICAnQ29udGVudC1UeXBlJzogdW5kZWZpbmVkXG4gICAgfVxuICB9XG59O1xuXG51dGlscyQxLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgKG1ldGhvZCkgPT4ge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB7fTtcbn0pO1xuXG52YXIgZGVmYXVsdHMkMSA9IGRlZmF1bHRzO1xuXG4vLyBSYXdBeGlvc0hlYWRlcnMgd2hvc2UgZHVwbGljYXRlcyBhcmUgaWdub3JlZCBieSBub2RlXG4vLyBjLmYuIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfbWVzc2FnZV9oZWFkZXJzXG5jb25zdCBpZ25vcmVEdXBsaWNhdGVPZiA9IHV0aWxzJDEudG9PYmplY3RTZXQoW1xuICAnYWdlJywgJ2F1dGhvcml6YXRpb24nLCAnY29udGVudC1sZW5ndGgnLCAnY29udGVudC10eXBlJywgJ2V0YWcnLFxuICAnZXhwaXJlcycsICdmcm9tJywgJ2hvc3QnLCAnaWYtbW9kaWZpZWQtc2luY2UnLCAnaWYtdW5tb2RpZmllZC1zaW5jZScsXG4gICdsYXN0LW1vZGlmaWVkJywgJ2xvY2F0aW9uJywgJ21heC1mb3J3YXJkcycsICdwcm94eS1hdXRob3JpemF0aW9uJyxcbiAgJ3JlZmVyZXInLCAncmV0cnktYWZ0ZXInLCAndXNlci1hZ2VudCdcbl0pO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcmF3SGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKlxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xudmFyIHBhcnNlSGVhZGVycyA9IHJhd0hlYWRlcnMgPT4ge1xuICBjb25zdCBwYXJzZWQgPSB7fTtcbiAgbGV0IGtleTtcbiAgbGV0IHZhbDtcbiAgbGV0IGk7XG5cbiAgcmF3SGVhZGVycyAmJiByYXdIZWFkZXJzLnNwbGl0KCdcXG4nKS5mb3JFYWNoKGZ1bmN0aW9uIHBhcnNlcihsaW5lKSB7XG4gICAgaSA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgIGtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIGkpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKS50cmltKCk7XG5cbiAgICBpZiAoIWtleSB8fCAocGFyc2VkW2tleV0gJiYgaWdub3JlRHVwbGljYXRlT2Zba2V5XSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIGlmIChwYXJzZWRba2V5XSkge1xuICAgICAgICBwYXJzZWRba2V5XS5wdXNoKHZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWRba2V5XSA9IFt2YWxdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn07XG5cbmNvbnN0ICRpbnRlcm5hbHMgPSBTeW1ib2woJ2ludGVybmFscycpO1xuXG5mdW5jdGlvbiBub3JtYWxpemVIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIgJiYgU3RyaW5nKGhlYWRlcikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1dGlscyQxLmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKG5vcm1hbGl6ZVZhbHVlKSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVG9rZW5zKHN0cikge1xuICBjb25zdCB0b2tlbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBjb25zdCB0b2tlbnNSRSA9IC8oW15cXHMsOz1dKylcXHMqKD86PVxccyooW14sO10rKSk/L2c7XG4gIGxldCBtYXRjaDtcblxuICB3aGlsZSAoKG1hdGNoID0gdG9rZW5zUkUuZXhlYyhzdHIpKSkge1xuICAgIHRva2Vuc1ttYXRjaFsxXV0gPSBtYXRjaFsyXTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmNvbnN0IGlzVmFsaWRIZWFkZXJOYW1lID0gKHN0cikgPT4gL15bLV9hLXpBLVowLTleYHx+LCEjJCUmJyorLl0rJC8udGVzdChzdHIudHJpbSgpKTtcblxuZnVuY3Rpb24gbWF0Y2hIZWFkZXJWYWx1ZShjb250ZXh0LCB2YWx1ZSwgaGVhZGVyLCBmaWx0ZXIsIGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICBpZiAodXRpbHMkMS5pc0Z1bmN0aW9uKGZpbHRlcikpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcywgdmFsdWUsIGhlYWRlcik7XG4gIH1cblxuICBpZiAoaXNIZWFkZXJOYW1lRmlsdGVyKSB7XG4gICAgdmFsdWUgPSBoZWFkZXI7XG4gIH1cblxuICBpZiAoIXV0aWxzJDEuaXNTdHJpbmcodmFsdWUpKSByZXR1cm47XG5cbiAgaWYgKHV0aWxzJDEuaXNTdHJpbmcoZmlsdGVyKSkge1xuICAgIHJldHVybiB2YWx1ZS5pbmRleE9mKGZpbHRlcikgIT09IC0xO1xuICB9XG5cbiAgaWYgKHV0aWxzJDEuaXNSZWdFeHAoZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIudGVzdCh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0SGVhZGVyKGhlYWRlcikge1xuICByZXR1cm4gaGVhZGVyLnRyaW0oKVxuICAgIC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XFxkXSkoXFx3KikvZywgKHcsIGNoYXIsIHN0cikgPT4ge1xuICAgICAgcmV0dXJuIGNoYXIudG9VcHBlckNhc2UoKSArIHN0cjtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBY2Nlc3NvcnMob2JqLCBoZWFkZXIpIHtcbiAgY29uc3QgYWNjZXNzb3JOYW1lID0gdXRpbHMkMS50b0NhbWVsQ2FzZSgnICcgKyBoZWFkZXIpO1xuXG4gIFsnZ2V0JywgJ3NldCcsICdoYXMnXS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZE5hbWUgKyBhY2Nlc3Nvck5hbWUsIHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICAgIHJldHVybiB0aGlzW21ldGhvZE5hbWVdLmNhbGwodGhpcywgaGVhZGVyLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNsYXNzIEF4aW9zSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yKGhlYWRlcnMpIHtcbiAgICBoZWFkZXJzICYmIHRoaXMuc2V0KGhlYWRlcnMpO1xuICB9XG5cbiAgc2V0KGhlYWRlciwgdmFsdWVPclJld3JpdGUsIHJld3JpdGUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWxIZWFkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZWFkZXIgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkoc2VsZiwgbEhlYWRlcik7XG5cbiAgICAgIGlmKCFrZXkgfHwgc2VsZltrZXldID09PSB1bmRlZmluZWQgfHwgX3Jld3JpdGUgPT09IHRydWUgfHwgKF9yZXdyaXRlID09PSB1bmRlZmluZWQgJiYgc2VsZltrZXldICE9PSBmYWxzZSkpIHtcbiAgICAgICAgc2VsZltrZXkgfHwgX2hlYWRlcl0gPSBub3JtYWxpemVWYWx1ZShfdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldEhlYWRlcnMgPSAoaGVhZGVycywgX3Jld3JpdGUpID0+XG4gICAgICB1dGlscyQxLmZvckVhY2goaGVhZGVycywgKF92YWx1ZSwgX2hlYWRlcikgPT4gc2V0SGVhZGVyKF92YWx1ZSwgX2hlYWRlciwgX3Jld3JpdGUpKTtcblxuICAgIGlmICh1dGlscyQxLmlzUGxhaW5PYmplY3QoaGVhZGVyKSB8fCBoZWFkZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzZXRIZWFkZXJzKGhlYWRlciwgdmFsdWVPclJld3JpdGUpO1xuICAgIH0gZWxzZSBpZih1dGlscyQxLmlzU3RyaW5nKGhlYWRlcikgJiYgKGhlYWRlciA9IGhlYWRlci50cmltKCkpICYmICFpc1ZhbGlkSGVhZGVyTmFtZShoZWFkZXIpKSB7XG4gICAgICBzZXRIZWFkZXJzKHBhcnNlSGVhZGVycyhoZWFkZXIpLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscyQxLmlzSGVhZGVycyhoZWFkZXIpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBoZWFkZXIuZW50cmllcygpKSB7XG4gICAgICAgIHNldEhlYWRlcih2YWx1ZSwga2V5LCByZXdyaXRlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyICE9IG51bGwgJiYgc2V0SGVhZGVyKHZhbHVlT3JSZXdyaXRlLCBoZWFkZXIsIHJld3JpdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0KGhlYWRlciwgcGFyc2VyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkodGhpcywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XTtcblxuICAgICAgICBpZiAoIXBhcnNlcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJzZXIgPT09IHRydWUpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbnModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5jYWxsKHRoaXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzJDEuaXNSZWdFeHAocGFyc2VyKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZXIuZXhlYyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhcyhoZWFkZXIsIG1hdGNoZXIpIHtcbiAgICBoZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoaGVhZGVyKTtcblxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICByZXR1cm4gISEoa2V5ICYmIHRoaXNba2V5XSAhPT0gdW5kZWZpbmVkICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHRoaXMsIHRoaXNba2V5XSwga2V5LCBtYXRjaGVyKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGRlbGV0ZShoZWFkZXIsIG1hdGNoZXIpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gZGVsZXRlSGVhZGVyKF9oZWFkZXIpIHtcbiAgICAgIF9oZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmIChfaGVhZGVyKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleShzZWxmLCBfaGVhZGVyKTtcblxuICAgICAgICBpZiAoa2V5ICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHNlbGYsIHNlbGZba2V5XSwga2V5LCBtYXRjaGVyKSkpIHtcbiAgICAgICAgICBkZWxldGUgc2VsZltrZXldO1xuXG4gICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc0FycmF5KGhlYWRlcikpIHtcbiAgICAgIGhlYWRlci5mb3JFYWNoKGRlbGV0ZUhlYWRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZUhlYWRlcihoZWFkZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgY2xlYXIobWF0Y2hlcikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlciwgdHJ1ZSkpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNba2V5XTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBub3JtYWxpemUoZm9ybWF0KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoKHRoaXMsICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkoaGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBzZWxmW2tleV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZvcm1hdCA/IGZvcm1hdEhlYWRlcihoZWFkZXIpIDogU3RyaW5nKGhlYWRlcikudHJpbSgpO1xuXG4gICAgICBpZiAobm9ybWFsaXplZCAhPT0gaGVhZGVyKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICB9XG5cbiAgICAgIHNlbGZbbm9ybWFsaXplZF0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZF0gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb25jYXQoLi4udGFyZ2V0cykge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLCAuLi50YXJnZXRzKTtcbiAgfVxuXG4gIHRvSlNPTihhc1N0cmluZ3MpIHtcbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoKHRoaXMsICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgICB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSBmYWxzZSAmJiAob2JqW2hlYWRlcl0gPSBhc1N0cmluZ3MgJiYgdXRpbHMkMS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmpvaW4oJywgJykgOiB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKS5tYXAoKFtoZWFkZXIsIHZhbHVlXSkgPT4gaGVhZGVyICsgJzogJyArIHZhbHVlKS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0F4aW9zSGVhZGVycyc7XG4gIH1cblxuICBzdGF0aWMgZnJvbSh0aGluZykge1xuICAgIHJldHVybiB0aGluZyBpbnN0YW5jZW9mIHRoaXMgPyB0aGluZyA6IG5ldyB0aGlzKHRoaW5nKTtcbiAgfVxuXG4gIHN0YXRpYyBjb25jYXQoZmlyc3QsIC4uLnRhcmdldHMpIHtcbiAgICBjb25zdCBjb21wdXRlZCA9IG5ldyB0aGlzKGZpcnN0KTtcblxuICAgIHRhcmdldHMuZm9yRWFjaCgodGFyZ2V0KSA9PiBjb21wdXRlZC5zZXQodGFyZ2V0KSk7XG5cbiAgICByZXR1cm4gY29tcHV0ZWQ7XG4gIH1cblxuICBzdGF0aWMgYWNjZXNzb3IoaGVhZGVyKSB7XG4gICAgY29uc3QgaW50ZXJuYWxzID0gdGhpc1skaW50ZXJuYWxzXSA9ICh0aGlzWyRpbnRlcm5hbHNdID0ge1xuICAgICAgYWNjZXNzb3JzOiB7fVxuICAgIH0pO1xuXG4gICAgY29uc3QgYWNjZXNzb3JzID0gaW50ZXJuYWxzLmFjY2Vzc29ycztcbiAgICBjb25zdCBwcm90b3R5cGUgPSB0aGlzLnByb3RvdHlwZTtcblxuICAgIGZ1bmN0aW9uIGRlZmluZUFjY2Vzc29yKF9oZWFkZXIpIHtcbiAgICAgIGNvbnN0IGxIZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmICghYWNjZXNzb3JzW2xIZWFkZXJdKSB7XG4gICAgICAgIGJ1aWxkQWNjZXNzb3JzKHByb3RvdHlwZSwgX2hlYWRlcik7XG4gICAgICAgIGFjY2Vzc29yc1tsSGVhZGVyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXRpbHMkMS5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXIuZm9yRWFjaChkZWZpbmVBY2Nlc3NvcikgOiBkZWZpbmVBY2Nlc3NvcihoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuQXhpb3NIZWFkZXJzLmFjY2Vzc29yKFsnQ29udGVudC1UeXBlJywgJ0NvbnRlbnQtTGVuZ3RoJywgJ0FjY2VwdCcsICdBY2NlcHQtRW5jb2RpbmcnLCAnVXNlci1BZ2VudCcsICdBdXRob3JpemF0aW9uJ10pO1xuXG4vLyByZXNlcnZlZCBuYW1lcyBob3RmaXhcbnV0aWxzJDEucmVkdWNlRGVzY3JpcHRvcnMoQXhpb3NIZWFkZXJzLnByb3RvdHlwZSwgKHt2YWx1ZX0sIGtleSkgPT4ge1xuICBsZXQgbWFwcGVkID0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7IC8vIG1hcCBgc2V0YCA9PiBgU2V0YFxuICByZXR1cm4ge1xuICAgIGdldDogKCkgPT4gdmFsdWUsXG4gICAgc2V0KGhlYWRlclZhbHVlKSB7XG4gICAgICB0aGlzW21hcHBlZF0gPSBoZWFkZXJWYWx1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG51dGlscyQxLmZyZWV6ZU1ldGhvZHMoQXhpb3NIZWFkZXJzKTtcblxudmFyIEF4aW9zSGVhZGVycyQxID0gQXhpb3NIZWFkZXJzO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgZGF0YSBmb3IgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcGFyYW0gez9PYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBkYXRhXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZm5zLCByZXNwb25zZSkge1xuICBjb25zdCBjb25maWcgPSB0aGlzIHx8IGRlZmF1bHRzJDE7XG4gIGNvbnN0IGNvbnRleHQgPSByZXNwb25zZSB8fCBjb25maWc7XG4gIGNvbnN0IGhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKGNvbnRleHQuaGVhZGVycyk7XG4gIGxldCBkYXRhID0gY29udGV4dC5kYXRhO1xuXG4gIHV0aWxzJDEuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIGRhdGEgPSBmbi5jYWxsKGNvbmZpZywgZGF0YSwgaGVhZGVycy5ub3JtYWxpemUoKSwgcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiB1bmRlZmluZWQpO1xuICB9KTtcblxuICBoZWFkZXJzLm5vcm1hbGl6ZSgpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59XG5cbi8qKlxuICogQSBgQ2FuY2VsZWRFcnJvcmAgaXMgYW4gb2JqZWN0IHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGNhbmNlbGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbWVzc2FnZSBUaGUgbWVzc2FnZS5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdD19IHJlcXVlc3QgVGhlIHJlcXVlc3QuXG4gKlxuICogQHJldHVybnMge0NhbmNlbGVkRXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5mdW5jdGlvbiBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgQXhpb3NFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UgPT0gbnVsbCA/ICdjYW5jZWxlZCcgOiBtZXNzYWdlLCBBeGlvc0Vycm9yLkVSUl9DQU5DRUxFRCwgY29uZmlnLCByZXF1ZXN0KTtcbiAgdGhpcy5uYW1lID0gJ0NhbmNlbGVkRXJyb3InO1xufVxuXG51dGlscyQxLmluaGVyaXRzKENhbmNlbGVkRXJyb3IsIEF4aW9zRXJyb3IsIHtcbiAgX19DQU5DRUxfXzogdHJ1ZVxufSk7XG5cbi8qKlxuICogUmVzb2x2ZSBvciByZWplY3QgYSBQcm9taXNlIGJhc2VkIG9uIHJlc3BvbnNlIHN0YXR1cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlIEEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdCBBIGZ1bmN0aW9uIHRoYXQgcmVqZWN0cyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge29iamVjdH0gVGhlIHJlc3BvbnNlLlxuICovXG5mdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICBjb25zdCB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCFyZXNwb25zZS5zdGF0dXMgfHwgIXZhbGlkYXRlU3RhdHVzIHx8IHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAnUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgW0F4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0VdW01hdGguZmxvb3IocmVzcG9uc2Uuc3RhdHVzIC8gMTAwKSAtIDRdLFxuICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VQcm90b2NvbCh1cmwpIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbLStcXHddezEsMjV9KSg6P1xcL1xcL3w6KS8uZXhlYyh1cmwpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRhdGEgbWF4UmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtzYW1wbGVzQ291bnQ9IDEwXVxuICogQHBhcmFtIHtOdW1iZXJ9IFttaW49IDEwMDBdXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHNwZWVkb21ldGVyKHNhbXBsZXNDb3VudCwgbWluKSB7XG4gIHNhbXBsZXNDb3VudCA9IHNhbXBsZXNDb3VudCB8fCAxMDtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgY29uc3QgdGltZXN0YW1wcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBsZXQgaGVhZCA9IDA7XG4gIGxldCB0YWlsID0gMDtcbiAgbGV0IGZpcnN0U2FtcGxlVFM7XG5cbiAgbWluID0gbWluICE9PSB1bmRlZmluZWQgPyBtaW4gOiAxMDAwO1xuXG4gIHJldHVybiBmdW5jdGlvbiBwdXNoKGNodW5rTGVuZ3RoKSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHRpbWVzdGFtcHNbdGFpbF07XG5cbiAgICBpZiAoIWZpcnN0U2FtcGxlVFMpIHtcbiAgICAgIGZpcnN0U2FtcGxlVFMgPSBub3c7XG4gICAgfVxuXG4gICAgYnl0ZXNbaGVhZF0gPSBjaHVua0xlbmd0aDtcbiAgICB0aW1lc3RhbXBzW2hlYWRdID0gbm93O1xuXG4gICAgbGV0IGkgPSB0YWlsO1xuICAgIGxldCBieXRlc0NvdW50ID0gMDtcblxuICAgIHdoaWxlIChpICE9PSBoZWFkKSB7XG4gICAgICBieXRlc0NvdW50ICs9IGJ5dGVzW2krK107XG4gICAgICBpID0gaSAlIHNhbXBsZXNDb3VudDtcbiAgICB9XG5cbiAgICBoZWFkID0gKGhlYWQgKyAxKSAlIHNhbXBsZXNDb3VudDtcblxuICAgIGlmIChoZWFkID09PSB0YWlsKSB7XG4gICAgICB0YWlsID0gKHRhaWwgKyAxKSAlIHNhbXBsZXNDb3VudDtcbiAgICB9XG5cbiAgICBpZiAobm93IC0gZmlyc3RTYW1wbGVUUyA8IG1pbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhc3NlZCA9IHN0YXJ0ZWRBdCAmJiBub3cgLSBzdGFydGVkQXQ7XG5cbiAgICByZXR1cm4gcGFzc2VkID8gTWF0aC5yb3VuZChieXRlc0NvdW50ICogMTAwMCAvIHBhc3NlZCkgOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbi8qKlxuICogVGhyb3R0bGUgZGVjb3JhdG9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtOdW1iZXJ9IGZyZXFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmbiwgZnJlcSkge1xuICBsZXQgdGltZXN0YW1wID0gMDtcbiAgY29uc3QgdGhyZXNob2xkID0gMTAwMCAvIGZyZXE7XG4gIGxldCB0aW1lciA9IG51bGw7XG4gIHJldHVybiBmdW5jdGlvbiB0aHJvdHRsZWQoKSB7XG4gICAgY29uc3QgZm9yY2UgPSB0aGlzID09PSB0cnVlO1xuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAoZm9yY2UgfHwgbm93IC0gdGltZXN0YW1wID4gdGhyZXNob2xkKSB7XG4gICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGltZXN0YW1wID0gbm93O1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIGlmICghdGltZXIpIHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICB9LCB0aHJlc2hvbGQgLSAobm93IC0gdGltZXN0YW1wKSk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgcHJvZ3Jlc3NFdmVudFJlZHVjZXIgPSAobGlzdGVuZXIsIGlzRG93bmxvYWRTdHJlYW0sIGZyZXEgPSAzKSA9PiB7XG4gIGxldCBieXRlc05vdGlmaWVkID0gMDtcbiAgY29uc3QgX3NwZWVkb21ldGVyID0gc3BlZWRvbWV0ZXIoNTAsIDI1MCk7XG5cbiAgcmV0dXJuIHRocm90dGxlKGUgPT4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGUubG9hZGVkO1xuICAgIGNvbnN0IHRvdGFsID0gZS5sZW5ndGhDb21wdXRhYmxlID8gZS50b3RhbCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9ncmVzc0J5dGVzID0gbG9hZGVkIC0gYnl0ZXNOb3RpZmllZDtcbiAgICBjb25zdCByYXRlID0gX3NwZWVkb21ldGVyKHByb2dyZXNzQnl0ZXMpO1xuICAgIGNvbnN0IGluUmFuZ2UgPSBsb2FkZWQgPD0gdG90YWw7XG5cbiAgICBieXRlc05vdGlmaWVkID0gbG9hZGVkO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGxvYWRlZCxcbiAgICAgIHRvdGFsLFxuICAgICAgcHJvZ3Jlc3M6IHRvdGFsID8gKGxvYWRlZCAvIHRvdGFsKSA6IHVuZGVmaW5lZCxcbiAgICAgIGJ5dGVzOiBwcm9ncmVzc0J5dGVzLFxuICAgICAgcmF0ZTogcmF0ZSA/IHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBlc3RpbWF0ZWQ6IHJhdGUgJiYgdG90YWwgJiYgaW5SYW5nZSA/ICh0b3RhbCAtIGxvYWRlZCkgLyByYXRlIDogdW5kZWZpbmVkLFxuICAgICAgZXZlbnQ6IGUsXG4gICAgICBsZW5ndGhDb21wdXRhYmxlOiB0b3RhbCAhPSBudWxsXG4gICAgfTtcblxuICAgIGRhdGFbaXNEb3dubG9hZFN0cmVhbSA/ICdkb3dubG9hZCcgOiAndXBsb2FkJ10gPSB0cnVlO1xuXG4gICAgbGlzdGVuZXIoZGF0YSk7XG4gIH0sIGZyZXEpO1xufTtcblxudmFyIGlzVVJMU2FtZU9yaWdpbiA9IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiA/XG5cbi8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBoYXZlIGZ1bGwgc3VwcG9ydCBvZiB0aGUgQVBJcyBuZWVkZWQgdG8gdGVzdFxuLy8gd2hldGhlciB0aGUgcmVxdWVzdCBVUkwgaXMgb2YgdGhlIHNhbWUgb3JpZ2luIGFzIGN1cnJlbnQgbG9jYXRpb24uXG4gIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgY29uc3QgbXNpZSA9IC8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgY29uc3QgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgbGV0IG9yaWdpblVSTDtcblxuICAgIC8qKlxuICAgICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXRzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICAgIGxldCBocmVmID0gdXJsO1xuXG4gICAgICBpZiAobXNpZSkge1xuICAgICAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgICAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgICAgIH1cblxuICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgICAgIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICAgICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgICAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgICAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxuICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gICAgICB9O1xuICAgIH1cblxuICAgIG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgLyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgY3VycmVudCBsb2NhdGlvblxuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VVJMIFRoZSBVUkwgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4sIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbihyZXF1ZXN0VVJMKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSAodXRpbHMkMS5pc1N0cmluZyhyZXF1ZXN0VVJMKSkgPyByZXNvbHZlVVJMKHJlcXVlc3RVUkwpIDogcmVxdWVzdFVSTDtcbiAgICAgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiZcbiAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVVJMLmhvc3QpO1xuICAgIH07XG4gIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudnMgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH0pKCk7XG5cbnZhciBjb29raWVzID0gcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52ID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAge1xuICAgIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgY29uc3QgY29va2llID0gW25hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpXTtcblxuICAgICAgdXRpbHMkMS5pc051bWJlcihleHBpcmVzKSAmJiBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG5cbiAgICAgIHV0aWxzJDEuaXNTdHJpbmcocGF0aCkgJiYgY29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xuXG4gICAgICB1dGlscyQxLmlzU3RyaW5nKGRvbWFpbikgJiYgY29va2llLnB1c2goJ2RvbWFpbj0nICsgZG9tYWluKTtcblxuICAgICAgc2VjdXJlID09PSB0cnVlICYmIGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcblxuICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgfSxcblxuICAgIHJlYWQobmFtZSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58O1xcXFxzKikoJyArIG5hbWUgKyAnKT0oW147XSopJykpO1xuICAgICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcbiAgICB9LFxuXG4gICAgcmVtb3ZlKG5hbWUpIHtcbiAgICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG4gICAgfVxuICB9XG5cbiAgOlxuXG4gIC8vIE5vbi1zdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAge1xuICAgIHdyaXRlKCkge30sXG4gICAgcmVhZCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcmVtb3ZlKCkge31cbiAgfTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBYnNvbHV0ZVVSTCh1cmwpIHtcbiAgLy8gQSBVUkwgaXMgY29uc2lkZXJlZCBhYnNvbHV0ZSBpZiBpdCBiZWdpbnMgd2l0aCBcIjxzY2hlbWU+Oi8vXCIgb3IgXCIvL1wiIChwcm90b2NvbC1yZWxhdGl2ZSBVUkwpLlxuICAvLyBSRkMgMzk4NiBkZWZpbmVzIHNjaGVtZSBuYW1lIGFzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBiZWdpbm5pbmcgd2l0aCBhIGxldHRlciBhbmQgZm9sbG93ZWRcbiAgLy8gYnkgYW55IGNvbWJpbmF0aW9uIG9mIGxldHRlcnMsIGRpZ2l0cywgcGx1cywgcGVyaW9kLCBvciBoeXBoZW4uXG4gIHJldHVybiAvXihbYS16XVthLXpcXGQrXFwtLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIFVSTFxuICovXG5mdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvP1xcLyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIGJhc2VVUkwgd2l0aCB0aGUgcmVxdWVzdGVkVVJMLFxuICogb25seSB3aGVuIHRoZSByZXF1ZXN0ZWRVUkwgaXMgbm90IGFscmVhZHkgYW4gYWJzb2x1dGUgVVJMLlxuICogSWYgdGhlIHJlcXVlc3RVUkwgaXMgYWJzb2x1dGUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWVzdGVkVVJMIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXF1ZXN0ZWRVUkwgQWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGNvbWJpbmVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgZnVsbCBwYXRoXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRnVsbFBhdGgoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKSB7XG4gIGlmIChiYXNlVVJMICYmICFpc0Fic29sdXRlVVJMKHJlcXVlc3RlZFVSTCkpIHtcbiAgICByZXR1cm4gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xufVxuXG5jb25zdCBoZWFkZXJzVG9PYmplY3QgPSAodGhpbmcpID0+IHRoaW5nIGluc3RhbmNlb2YgQXhpb3NIZWFkZXJzJDEgPyB7IC4uLnRoaW5nIH0gOiB0aGluZztcblxuLyoqXG4gKiBDb25maWctc3BlY2lmaWMgbWVyZ2UtZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIG5ldyBjb25maWctb2JqZWN0XG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzFcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXG4gKlxuICogQHJldHVybnMge09iamVjdH0gTmV3IG9iamVjdCByZXN1bHRpbmcgZnJvbSBtZXJnaW5nIGNvbmZpZzIgdG8gY29uZmlnMVxuICovXG5mdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgY29uc3QgY29uZmlnID0ge307XG5cbiAgZnVuY3Rpb24gZ2V0TWVyZ2VkVmFsdWUodGFyZ2V0LCBzb3VyY2UsIGNhc2VsZXNzKSB7XG4gICAgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdCh0YXJnZXQpICYmIHV0aWxzJDEuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMkMS5tZXJnZS5jYWxsKHtjYXNlbGVzc30sIHRhcmdldCwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMkMS5tZXJnZSh7fSwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEZWVwUHJvcGVydGllcyhhLCBiLCBjYXNlbGVzcykge1xuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIsIGNhc2VsZXNzKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhLCBjYXNlbGVzcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfSBlbHNlIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChhKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGlyZWN0S2V5cyhhLCBiLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgaW4gY29uZmlnMikge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIpO1xuICAgIH0gZWxzZSBpZiAocHJvcCBpbiBjb25maWcxKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXJnZU1hcCA9IHtcbiAgICB1cmw6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgbWV0aG9kOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGRhdGE6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgYmFzZVVSTDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHBhcmFtc1NlcmlhbGl6ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0TWVzc2FnZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoQ3JlZGVudGlhbHM6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aFhTUkZUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBhZGFwdGVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlVHlwZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmQ29va2llTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmSGVhZGVyTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvblVwbG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBkZWNvbXByZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heENvbnRlbnRMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Qm9keUxlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBiZWZvcmVSZWRpcmVjdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc3BvcnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cEFnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBzQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgY2FuY2VsVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgc29ja2V0UGF0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZUVuY29kaW5nOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHZhbGlkYXRlU3RhdHVzOiBtZXJnZURpcmVjdEtleXMsXG4gICAgaGVhZGVyczogKGEsIGIpID0+IG1lcmdlRGVlcFByb3BlcnRpZXMoaGVhZGVyc1RvT2JqZWN0KGEpLCBoZWFkZXJzVG9PYmplY3QoYiksIHRydWUpXG4gIH07XG5cbiAgdXRpbHMkMS5mb3JFYWNoKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZzEsIGNvbmZpZzIpKSwgZnVuY3Rpb24gY29tcHV0ZUNvbmZpZ1ZhbHVlKHByb3ApIHtcbiAgICBjb25zdCBtZXJnZSA9IG1lcmdlTWFwW3Byb3BdIHx8IG1lcmdlRGVlcFByb3BlcnRpZXM7XG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSBtZXJnZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdLCBwcm9wKTtcbiAgICAodXRpbHMkMS5pc1VuZGVmaW5lZChjb25maWdWYWx1ZSkgJiYgbWVyZ2UgIT09IG1lcmdlRGlyZWN0S2V5cykgfHwgKGNvbmZpZ1twcm9wXSA9IGNvbmZpZ1ZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxudmFyIHJlc29sdmVDb25maWcgPSAoY29uZmlnKSA9PiB7XG4gIGNvbnN0IG5ld0NvbmZpZyA9IG1lcmdlQ29uZmlnKHt9LCBjb25maWcpO1xuXG4gIGxldCB7ZGF0YSwgd2l0aFhTUkZUb2tlbiwgeHNyZkhlYWRlck5hbWUsIHhzcmZDb29raWVOYW1lLCBoZWFkZXJzLCBhdXRofSA9IG5ld0NvbmZpZztcblxuICBuZXdDb25maWcuaGVhZGVycyA9IGhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKGhlYWRlcnMpO1xuXG4gIG5ld0NvbmZpZy51cmwgPSBidWlsZFVSTChidWlsZEZ1bGxQYXRoKG5ld0NvbmZpZy5iYXNlVVJMLCBuZXdDb25maWcudXJsKSwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpO1xuXG4gIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgaWYgKGF1dGgpIHtcbiAgICBoZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCYXNpYyAnICtcbiAgICAgIGJ0b2EoKGF1dGgudXNlcm5hbWUgfHwgJycpICsgJzonICsgKGF1dGgucGFzc3dvcmQgPyB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYXV0aC5wYXNzd29yZCkpIDogJycpKVxuICAgICk7XG4gIH1cblxuICBsZXQgY29udGVudFR5cGU7XG5cbiAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKSkge1xuICAgIGlmIChwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgfHwgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52KSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKHVuZGVmaW5lZCk7IC8vIExldCB0aGUgYnJvd3NlciBzZXQgaXRcbiAgICB9IGVsc2UgaWYgKChjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKSkgIT09IGZhbHNlKSB7XG4gICAgICAvLyBmaXggc2VtaWNvbG9uIGR1cGxpY2F0aW9uIGlzc3VlIGZvciBSZWFjdE5hdGl2ZSBGb3JtRGF0YSBpbXBsZW1lbnRhdGlvblxuICAgICAgY29uc3QgW3R5cGUsIC4uLnRva2Vuc10gPSBjb250ZW50VHlwZSA/IGNvbnRlbnRUeXBlLnNwbGl0KCc7JykubWFwKHRva2VuID0+IHRva2VuLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pIDogW107XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKFt0eXBlIHx8ICdtdWx0aXBhcnQvZm9ybS1kYXRhJywgLi4udG9rZW5zXS5qb2luKCc7ICcpKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXG5cbiAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudikge1xuICAgIHdpdGhYU1JGVG9rZW4gJiYgdXRpbHMkMS5pc0Z1bmN0aW9uKHdpdGhYU1JGVG9rZW4pICYmICh3aXRoWFNSRlRva2VuID0gd2l0aFhTUkZUb2tlbihuZXdDb25maWcpKTtcblxuICAgIGlmICh3aXRoWFNSRlRva2VuIHx8ICh3aXRoWFNSRlRva2VuICE9PSBmYWxzZSAmJiBpc1VSTFNhbWVPcmlnaW4obmV3Q29uZmlnLnVybCkpKSB7XG4gICAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAgIGNvbnN0IHhzcmZWYWx1ZSA9IHhzcmZIZWFkZXJOYW1lICYmIHhzcmZDb29raWVOYW1lICYmIGNvb2tpZXMucmVhZCh4c3JmQ29va2llTmFtZSk7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgaGVhZGVycy5zZXQoeHNyZkhlYWRlck5hbWUsIHhzcmZWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0NvbmZpZztcbn07XG5cbmNvbnN0IGlzWEhSQWRhcHRlclN1cHBvcnRlZCA9IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCc7XG5cbnZhciB4aHJBZGFwdGVyID0gaXNYSFJBZGFwdGVyU3VwcG9ydGVkICYmIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGRpc3BhdGNoWGhyUmVxdWVzdChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBjb25zdCBfY29uZmlnID0gcmVzb2x2ZUNvbmZpZyhjb25maWcpO1xuICAgIGxldCByZXF1ZXN0RGF0YSA9IF9jb25maWcuZGF0YTtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oX2NvbmZpZy5oZWFkZXJzKS5ub3JtYWxpemUoKTtcbiAgICBsZXQge3Jlc3BvbnNlVHlwZX0gPSBfY29uZmlnO1xuICAgIGxldCBvbkNhbmNlbGVkO1xuICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICBpZiAoX2NvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgICAgICBfY29uZmlnLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgX2NvbmZpZy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vcGVuKF9jb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIF9jb25maWcudXJsLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gX2NvbmZpZy50aW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gb25sb2FkZW5kKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKFxuICAgICAgICAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSAhcmVzcG9uc2VUeXBlIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nID9cbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKGZ1bmN0aW9uIF9yZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCBmdW5jdGlvbiBfcmVqZWN0KGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoJ29ubG9hZGVuZCcgaW4gcmVxdWVzdCkge1xuICAgICAgLy8gVXNlIG9ubG9hZGVuZCBpZiBhdmFpbGFibGVcbiAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gb25sb2FkZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlIHRvIGVtdWxhdGUgb25sb2FkZW5kXG4gICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZHlzdGF0ZSBoYW5kbGVyIGlzIGNhbGxpbmcgYmVmb3JlIG9uZXJyb3Igb3Igb250aW1lb3V0IGhhbmRsZXJzLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgY2FsbCBvbmxvYWRlbmQgb24gdGhlIG5leHQgJ3RpY2snXG4gICAgICAgIHNldFRpbWVvdXQob25sb2FkZW5kKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCwgX2NvbmZpZywgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuICAgICAgLy8gUmVhbCBlcnJvcnMgYXJlIGhpZGRlbiBmcm9tIHVzIGJ5IHRoZSBicm93c2VyXG4gICAgICAvLyBvbmVycm9yIHNob3VsZCBvbmx5IGZpcmUgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignTmV0d29yayBFcnJvcicsIEF4aW9zRXJyb3IuRVJSX05FVFdPUkssIF9jb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgbGV0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBfY29uZmlnLnRpbWVvdXQgPyAndGltZW91dCBvZiAnICsgX2NvbmZpZy50aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJyA6ICd0aW1lb3V0IGV4Y2VlZGVkJztcbiAgICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IF9jb25maWcudHJhbnNpdGlvbmFsIHx8IHRyYW5zaXRpb25hbERlZmF1bHRzO1xuICAgICAgaWYgKF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICB0cmFuc2l0aW9uYWwuY2xhcmlmeVRpbWVvdXRFcnJvciA/IEF4aW9zRXJyb3IuRVRJTUVET1VUIDogQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsXG4gICAgICAgIF9jb25maWcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICByZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkICYmIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKG51bGwpO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzJDEuZm9yRWFjaChyZXF1ZXN0SGVhZGVycy50b0pTT04oKSwgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChfY29uZmlnLndpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFfY29uZmlnLndpdGhDcmVkZW50aWFscztcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKHJlc3BvbnNlVHlwZSAmJiByZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBfY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBfY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHByb2dyZXNzRXZlbnRSZWR1Y2VyKF9jb25maWcub25Eb3dubG9hZFByb2dyZXNzLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAodHlwZW9mIF9jb25maWcub25VcGxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBwcm9ncmVzc0V2ZW50UmVkdWNlcihfY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MpKTtcbiAgICB9XG5cbiAgICBpZiAoX2NvbmZpZy5jYW5jZWxUb2tlbiB8fCBfY29uZmlnLnNpZ25hbCkge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIG9uQ2FuY2VsZWQgPSBjYW5jZWwgPT4ge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCFjYW5jZWwgfHwgY2FuY2VsLnR5cGUgPyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcsIHJlcXVlc3QpIDogY2FuY2VsKTtcbiAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIF9jb25maWcuY2FuY2VsVG9rZW4gJiYgX2NvbmZpZy5jYW5jZWxUb2tlbi5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG4gICAgICBpZiAoX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgX2NvbmZpZy5zaWduYWwuYWJvcnRlZCA/IG9uQ2FuY2VsZWQoKSA6IF9jb25maWcuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG9jb2wgPSBwYXJzZVByb3RvY29sKF9jb25maWcudXJsKTtcblxuICAgIGlmIChwcm90b2NvbCAmJiBwbGF0Zm9ybS5wcm90b2NvbHMuaW5kZXhPZihwcm90b2NvbCkgPT09IC0xKSB7XG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1Vuc3VwcG9ydGVkIHByb3RvY29sICcgKyBwcm90b2NvbCArICc6JywgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIGNvbmZpZykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSB8fCBudWxsKTtcbiAgfSk7XG59O1xuXG5jb25zdCBjb21wb3NlU2lnbmFscyA9IChzaWduYWxzLCB0aW1lb3V0KSA9PiB7XG4gIGxldCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGxldCBhYm9ydGVkO1xuXG4gIGNvbnN0IG9uYWJvcnQgPSBmdW5jdGlvbiAoY2FuY2VsKSB7XG4gICAgaWYgKCFhYm9ydGVkKSB7XG4gICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICBjb25zdCBlcnIgPSBjYW5jZWwgaW5zdGFuY2VvZiBFcnJvciA/IGNhbmNlbCA6IHRoaXMucmVhc29uO1xuICAgICAgY29udHJvbGxlci5hYm9ydChlcnIgaW5zdGFuY2VvZiBBeGlvc0Vycm9yID8gZXJyIDogbmV3IENhbmNlbGVkRXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycikpO1xuICAgIH1cbiAgfTtcblxuICBsZXQgdGltZXIgPSB0aW1lb3V0ICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIG9uYWJvcnQobmV3IEF4aW9zRXJyb3IoYHRpbWVvdXQgJHt0aW1lb3V0fSBvZiBtcyBleGNlZWRlZGAsIEF4aW9zRXJyb3IuRVRJTUVET1VUKSk7XG4gIH0sIHRpbWVvdXQpO1xuXG4gIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgIGlmIChzaWduYWxzKSB7XG4gICAgICB0aW1lciAmJiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgc2lnbmFscy5mb3JFYWNoKHNpZ25hbCA9PiB7XG4gICAgICAgIHNpZ25hbCAmJlxuICAgICAgICAoc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIgPyBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbmFib3J0KSA6IHNpZ25hbC51bnN1YnNjcmliZShvbmFib3J0KSk7XG4gICAgICB9KTtcbiAgICAgIHNpZ25hbHMgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4gc2lnbmFsICYmIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICYmIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uYWJvcnQpKTtcblxuICBjb25zdCB7c2lnbmFsfSA9IGNvbnRyb2xsZXI7XG5cbiAgc2lnbmFsLnVuc3Vic2NyaWJlID0gdW5zdWJzY3JpYmU7XG5cbiAgcmV0dXJuIFtzaWduYWwsICgpID0+IHtcbiAgICB0aW1lciAmJiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIHRpbWVyID0gbnVsbDtcbiAgfV07XG59O1xuXG52YXIgY29tcG9zZVNpZ25hbHMkMSA9IGNvbXBvc2VTaWduYWxzO1xuXG5jb25zdCBzdHJlYW1DaHVuayA9IGZ1bmN0aW9uKiAoY2h1bmssIGNodW5rU2l6ZSkge1xuICBsZXQgbGVuID0gY2h1bmsuYnl0ZUxlbmd0aDtcblxuICBpZiAoIWNodW5rU2l6ZSB8fCBsZW4gPCBjaHVua1NpemUpIHtcbiAgICB5aWVsZCBjaHVuaztcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgcG9zID0gMDtcbiAgbGV0IGVuZDtcblxuICB3aGlsZSAocG9zIDwgbGVuKSB7XG4gICAgZW5kID0gcG9zICsgY2h1bmtTaXplO1xuICAgIHlpZWxkIGNodW5rLnNsaWNlKHBvcywgZW5kKTtcbiAgICBwb3MgPSBlbmQ7XG4gIH1cbn07XG5cbmNvbnN0IHJlYWRCeXRlcyA9IGFzeW5jIGZ1bmN0aW9uKiAoaXRlcmFibGUsIGNodW5rU2l6ZSwgZW5jb2RlKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCogc3RyZWFtQ2h1bmsoQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSA/IGNodW5rIDogKGF3YWl0IGVuY29kZShTdHJpbmcoY2h1bmspKSksIGNodW5rU2l6ZSk7XG4gIH1cbn07XG5cbmNvbnN0IHRyYWNrU3RyZWFtID0gKHN0cmVhbSwgY2h1bmtTaXplLCBvblByb2dyZXNzLCBvbkZpbmlzaCwgZW5jb2RlKSA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gcmVhZEJ5dGVzKHN0cmVhbSwgY2h1bmtTaXplLCBlbmNvZGUpO1xuXG4gIGxldCBieXRlcyA9IDA7XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgdHlwZTogJ2J5dGVzJyxcblxuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICBvbkZpbmlzaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgb25Qcm9ncmVzcyAmJiBvblByb2dyZXNzKGJ5dGVzICs9IGxlbik7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpKTtcbiAgICB9LFxuICAgIGNhbmNlbChyZWFzb24pIHtcbiAgICAgIG9uRmluaXNoKHJlYXNvbik7XG4gICAgICByZXR1cm4gaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgfVxuICB9LCB7XG4gICAgaGlnaFdhdGVyTWFyazogMlxuICB9KVxufTtcblxuY29uc3QgZmV0Y2hQcm9ncmVzc0RlY29yYXRvciA9ICh0b3RhbCwgZm4pID0+IHtcbiAgY29uc3QgbGVuZ3RoQ29tcHV0YWJsZSA9IHRvdGFsICE9IG51bGw7XG4gIHJldHVybiAobG9hZGVkKSA9PiBzZXRUaW1lb3V0KCgpID0+IGZuKHtcbiAgICBsZW5ndGhDb21wdXRhYmxlLFxuICAgIHRvdGFsLFxuICAgIGxvYWRlZFxuICB9KSk7XG59O1xuXG5jb25zdCBpc0ZldGNoU3VwcG9ydGVkID0gdHlwZW9mIGZldGNoID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBSZXF1ZXN0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBSZXNwb25zZSA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSBpc0ZldGNoU3VwcG9ydGVkICYmIHR5cGVvZiBSZWFkYWJsZVN0cmVhbSA9PT0gJ2Z1bmN0aW9uJztcblxuLy8gdXNlZCBvbmx5IGluc2lkZSB0aGUgZmV0Y2ggYWRhcHRlclxuY29uc3QgZW5jb2RlVGV4dCA9IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgKHR5cGVvZiBUZXh0RW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgKChlbmNvZGVyKSA9PiAoc3RyKSA9PiBlbmNvZGVyLmVuY29kZShzdHIpKShuZXcgVGV4dEVuY29kZXIoKSkgOlxuICAgIGFzeW5jIChzdHIpID0+IG5ldyBVaW50OEFycmF5KGF3YWl0IG5ldyBSZXNwb25zZShzdHIpLmFycmF5QnVmZmVyKCkpXG4pO1xuXG5jb25zdCBzdXBwb3J0c1JlcXVlc3RTdHJlYW0gPSBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkICYmICgoKSA9PiB7XG4gIGxldCBkdXBsZXhBY2Nlc3NlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgYm9keTogbmV3IFJlYWRhYmxlU3RyZWFtKCksXG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgZ2V0IGR1cGxleCgpIHtcbiAgICAgIGR1cGxleEFjY2Vzc2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiAnaGFsZic7XG4gICAgfSxcbiAgfSkuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpO1xuXG4gIHJldHVybiBkdXBsZXhBY2Nlc3NlZCAmJiAhaGFzQ29udGVudFR5cGU7XG59KSgpO1xuXG5jb25zdCBERUZBVUxUX0NIVU5LX1NJWkUgPSA2NCAqIDEwMjQ7XG5cbmNvbnN0IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gPSBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkICYmICEhKCgpPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB1dGlscyQxLmlzUmVhZGFibGVTdHJlYW0obmV3IFJlc3BvbnNlKCcnKS5ib2R5KTtcbiAgfSBjYXRjaChlcnIpIHtcbiAgICAvLyByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn0pKCk7XG5cbmNvbnN0IHJlc29sdmVycyA9IHtcbiAgc3RyZWFtOiBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmICgocmVzKSA9PiByZXMuYm9keSlcbn07XG5cbmlzRmV0Y2hTdXBwb3J0ZWQgJiYgKCgocmVzKSA9PiB7XG4gIFsndGV4dCcsICdhcnJheUJ1ZmZlcicsICdibG9iJywgJ2Zvcm1EYXRhJywgJ3N0cmVhbSddLmZvckVhY2godHlwZSA9PiB7XG4gICAgIXJlc29sdmVyc1t0eXBlXSAmJiAocmVzb2x2ZXJzW3R5cGVdID0gdXRpbHMkMS5pc0Z1bmN0aW9uKHJlc1t0eXBlXSkgPyAocmVzKSA9PiByZXNbdHlwZV0oKSA6XG4gICAgICAoXywgY29uZmlnKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKGBSZXNwb25zZSB0eXBlICcke3R5cGV9JyBpcyBub3Qgc3VwcG9ydGVkYCwgQXhpb3NFcnJvci5FUlJfTk9UX1NVUFBPUlQsIGNvbmZpZyk7XG4gICAgICB9KTtcbiAgfSk7XG59KShuZXcgUmVzcG9uc2UpKTtcblxuY29uc3QgZ2V0Qm9keUxlbmd0aCA9IGFzeW5jIChib2R5KSA9PiB7XG4gIGlmIChib2R5ID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNCbG9iKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHkuc2l6ZTtcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNTcGVjQ29tcGxpYW50Rm9ybShib2R5KSkge1xuICAgIHJldHVybiAoYXdhaXQgbmV3IFJlcXVlc3QoYm9keSkuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5ieXRlTGVuZ3RoO1xuICB9XG5cbiAgaWYodXRpbHMkMS5pc1VSTFNlYXJjaFBhcmFtcyhib2R5KSkge1xuICAgIGJvZHkgPSBib2R5ICsgJyc7XG4gIH1cblxuICBpZih1dGlscyQxLmlzU3RyaW5nKGJvZHkpKSB7XG4gICAgcmV0dXJuIChhd2FpdCBlbmNvZGVUZXh0KGJvZHkpKS5ieXRlTGVuZ3RoO1xuICB9XG59O1xuXG5jb25zdCByZXNvbHZlQm9keUxlbmd0aCA9IGFzeW5jIChoZWFkZXJzLCBib2R5KSA9PiB7XG4gIGNvbnN0IGxlbmd0aCA9IHV0aWxzJDEudG9GaW5pdGVOdW1iZXIoaGVhZGVycy5nZXRDb250ZW50TGVuZ3RoKCkpO1xuXG4gIHJldHVybiBsZW5ndGggPT0gbnVsbCA/IGdldEJvZHlMZW5ndGgoYm9keSkgOiBsZW5ndGg7XG59O1xuXG52YXIgZmV0Y2hBZGFwdGVyID0gaXNGZXRjaFN1cHBvcnRlZCAmJiAoYXN5bmMgKGNvbmZpZykgPT4ge1xuICBsZXQge1xuICAgIHVybCxcbiAgICBtZXRob2QsXG4gICAgZGF0YSxcbiAgICBzaWduYWwsXG4gICAgY2FuY2VsVG9rZW4sXG4gICAgdGltZW91dCxcbiAgICBvbkRvd25sb2FkUHJvZ3Jlc3MsXG4gICAgb25VcGxvYWRQcm9ncmVzcyxcbiAgICByZXNwb25zZVR5cGUsXG4gICAgaGVhZGVycyxcbiAgICB3aXRoQ3JlZGVudGlhbHMgPSAnc2FtZS1vcmlnaW4nLFxuICAgIGZldGNoT3B0aW9uc1xuICB9ID0gcmVzb2x2ZUNvbmZpZyhjb25maWcpO1xuXG4gIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSA/IChyZXNwb25zZVR5cGUgKyAnJykudG9Mb3dlckNhc2UoKSA6ICd0ZXh0JztcblxuICBsZXQgW2NvbXBvc2VkU2lnbmFsLCBzdG9wVGltZW91dF0gPSAoc2lnbmFsIHx8IGNhbmNlbFRva2VuIHx8IHRpbWVvdXQpID9cbiAgICBjb21wb3NlU2lnbmFscyQxKFtzaWduYWwsIGNhbmNlbFRva2VuXSwgdGltZW91dCkgOiBbXTtcblxuICBsZXQgZmluaXNoZWQsIHJlcXVlc3Q7XG5cbiAgY29uc3Qgb25GaW5pc2ggPSAoKSA9PiB7XG4gICAgIWZpbmlzaGVkICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29tcG9zZWRTaWduYWwgJiYgY29tcG9zZWRTaWduYWwudW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcblxuICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgfTtcblxuICBsZXQgcmVxdWVzdENvbnRlbnRMZW5ndGg7XG5cbiAgdHJ5IHtcbiAgICBpZiAoXG4gICAgICBvblVwbG9hZFByb2dyZXNzICYmIHN1cHBvcnRzUmVxdWVzdFN0cmVhbSAmJiBtZXRob2QgIT09ICdnZXQnICYmIG1ldGhvZCAhPT0gJ2hlYWQnICYmXG4gICAgICAocmVxdWVzdENvbnRlbnRMZW5ndGggPSBhd2FpdCByZXNvbHZlQm9keUxlbmd0aChoZWFkZXJzLCBkYXRhKSkgIT09IDBcbiAgICApIHtcbiAgICAgIGxldCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgZHVwbGV4OiBcImhhbGZcIlxuICAgICAgfSk7XG5cbiAgICAgIGxldCBjb250ZW50VHlwZUhlYWRlcjtcblxuICAgICAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKSAmJiAoY29udGVudFR5cGVIZWFkZXIgPSBfcmVxdWVzdC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVIZWFkZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3JlcXVlc3QuYm9keSkge1xuICAgICAgICBkYXRhID0gdHJhY2tTdHJlYW0oX3JlcXVlc3QuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBmZXRjaFByb2dyZXNzRGVjb3JhdG9yKFxuICAgICAgICAgIHJlcXVlc3RDb250ZW50TGVuZ3RoLFxuICAgICAgICAgIHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uVXBsb2FkUHJvZ3Jlc3MpXG4gICAgICAgICksIG51bGwsIGVuY29kZVRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXRpbHMkMS5pc1N0cmluZyh3aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICB3aXRoQ3JlZGVudGlhbHMgPSB3aXRoQ3JlZGVudGlhbHMgPyAnY29ycycgOiAnb21pdCc7XG4gICAgfVxuXG4gICAgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgLi4uZmV0Y2hPcHRpb25zLFxuICAgICAgc2lnbmFsOiBjb21wb3NlZFNpZ25hbCxcbiAgICAgIG1ldGhvZDogbWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLm5vcm1hbGl6ZSgpLnRvSlNPTigpLFxuICAgICAgYm9keTogZGF0YSxcbiAgICAgIGR1cGxleDogXCJoYWxmXCIsXG4gICAgICB3aXRoQ3JlZGVudGlhbHNcbiAgICB9KTtcblxuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuXG4gICAgY29uc3QgaXNTdHJlYW1SZXNwb25zZSA9IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gJiYgKHJlc3BvbnNlVHlwZSA9PT0gJ3N0cmVhbScgfHwgcmVzcG9uc2VUeXBlID09PSAncmVzcG9uc2UnKTtcblxuICAgIGlmIChzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChvbkRvd25sb2FkUHJvZ3Jlc3MgfHwgaXNTdHJlYW1SZXNwb25zZSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcblxuICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IHJlc3BvbnNlW3Byb3BdO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzJDEudG9GaW5pdGVOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykpO1xuXG4gICAgICByZXNwb25zZSA9IG5ldyBSZXNwb25zZShcbiAgICAgICAgdHJhY2tTdHJlYW0ocmVzcG9uc2UuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvbkRvd25sb2FkUHJvZ3Jlc3MgJiYgZmV0Y2hQcm9ncmVzc0RlY29yYXRvcihcbiAgICAgICAgICByZXNwb25zZUNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIob25Eb3dubG9hZFByb2dyZXNzLCB0cnVlKVxuICAgICAgICApLCBpc1N0cmVhbVJlc3BvbnNlICYmIG9uRmluaXNoLCBlbmNvZGVUZXh0KSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUgfHwgJ3RleHQnO1xuXG4gICAgbGV0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc29sdmVyc1t1dGlscyQxLmZpbmRLZXkocmVzb2x2ZXJzLCByZXNwb25zZVR5cGUpIHx8ICd0ZXh0J10ocmVzcG9uc2UsIGNvbmZpZyk7XG5cbiAgICAhaXNTdHJlYW1SZXNwb25zZSAmJiBvbkZpbmlzaCgpO1xuXG4gICAgc3RvcFRpbWVvdXQgJiYgc3RvcFRpbWVvdXQoKTtcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgaGVhZGVyczogQXhpb3NIZWFkZXJzJDEuZnJvbShyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfSk7XG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgb25GaW5pc2goKTtcblxuICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdUeXBlRXJyb3InICYmIC9mZXRjaC9pLnRlc3QoZXJyLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKFxuICAgICAgICBuZXcgQXhpb3NFcnJvcignTmV0d29yayBFcnJvcicsIEF4aW9zRXJyb3IuRVJSX05FVFdPUkssIGNvbmZpZywgcmVxdWVzdCksXG4gICAgICAgIHtcbiAgICAgICAgICBjYXVzZTogZXJyLmNhdXNlIHx8IGVyclxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuXG4gICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGVyciwgZXJyICYmIGVyci5jb2RlLCBjb25maWcsIHJlcXVlc3QpO1xuICB9XG59KTtcblxuY29uc3Qga25vd25BZGFwdGVycyA9IHtcbiAgaHR0cDogaHR0cEFkYXB0ZXIsXG4gIHhocjogeGhyQWRhcHRlcixcbiAgZmV0Y2g6IGZldGNoQWRhcHRlclxufTtcblxudXRpbHMkMS5mb3JFYWNoKGtub3duQWRhcHRlcnMsIChmbiwgdmFsdWUpID0+IHtcbiAgaWYgKGZuKSB7XG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ25hbWUnLCB7dmFsdWV9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnYWRhcHRlck5hbWUnLCB7dmFsdWV9KTtcbiAgfVxufSk7XG5cbmNvbnN0IHJlbmRlclJlYXNvbiA9IChyZWFzb24pID0+IGAtICR7cmVhc29ufWA7XG5cbmNvbnN0IGlzUmVzb2x2ZWRIYW5kbGUgPSAoYWRhcHRlcikgPT4gdXRpbHMkMS5pc0Z1bmN0aW9uKGFkYXB0ZXIpIHx8IGFkYXB0ZXIgPT09IG51bGwgfHwgYWRhcHRlciA9PT0gZmFsc2U7XG5cbnZhciBhZGFwdGVycyA9IHtcbiAgZ2V0QWRhcHRlcjogKGFkYXB0ZXJzKSA9PiB7XG4gICAgYWRhcHRlcnMgPSB1dGlscyQxLmlzQXJyYXkoYWRhcHRlcnMpID8gYWRhcHRlcnMgOiBbYWRhcHRlcnNdO1xuXG4gICAgY29uc3Qge2xlbmd0aH0gPSBhZGFwdGVycztcbiAgICBsZXQgbmFtZU9yQWRhcHRlcjtcbiAgICBsZXQgYWRhcHRlcjtcblxuICAgIGNvbnN0IHJlamVjdGVkUmVhc29ucyA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbmFtZU9yQWRhcHRlciA9IGFkYXB0ZXJzW2ldO1xuICAgICAgbGV0IGlkO1xuXG4gICAgICBhZGFwdGVyID0gbmFtZU9yQWRhcHRlcjtcblxuICAgICAgaWYgKCFpc1Jlc29sdmVkSGFuZGxlKG5hbWVPckFkYXB0ZXIpKSB7XG4gICAgICAgIGFkYXB0ZXIgPSBrbm93bkFkYXB0ZXJzWyhpZCA9IFN0cmluZyhuYW1lT3JBZGFwdGVyKSkudG9Mb3dlckNhc2UoKV07XG5cbiAgICAgICAgaWYgKGFkYXB0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKGBVbmtub3duIGFkYXB0ZXIgJyR7aWR9J2ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZWplY3RlZFJlYXNvbnNbaWQgfHwgJyMnICsgaV0gPSBhZGFwdGVyO1xuICAgIH1cblxuICAgIGlmICghYWRhcHRlcikge1xuXG4gICAgICBjb25zdCByZWFzb25zID0gT2JqZWN0LmVudHJpZXMocmVqZWN0ZWRSZWFzb25zKVxuICAgICAgICAubWFwKChbaWQsIHN0YXRlXSkgPT4gYGFkYXB0ZXIgJHtpZH0gYCArXG4gICAgICAgICAgKHN0YXRlID09PSBmYWxzZSA/ICdpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCcgOiAnaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnVpbGQnKVxuICAgICAgICApO1xuXG4gICAgICBsZXQgcyA9IGxlbmd0aCA/XG4gICAgICAgIChyZWFzb25zLmxlbmd0aCA+IDEgPyAnc2luY2UgOlxcbicgKyByZWFzb25zLm1hcChyZW5kZXJSZWFzb24pLmpvaW4oJ1xcbicpIDogJyAnICsgcmVuZGVyUmVhc29uKHJlYXNvbnNbMF0pKSA6XG4gICAgICAgICdhcyBubyBhZGFwdGVyIHNwZWNpZmllZCc7XG5cbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBgVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCBgICsgcyxcbiAgICAgICAgJ0VSUl9OT1RfU1VQUE9SVCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkYXB0ZXI7XG4gIH0sXG4gIGFkYXB0ZXJzOiBrbm93bkFkYXB0ZXJzXG59O1xuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKSB7XG4gIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICBjb25maWcuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5zaWduYWwgJiYgY29uZmlnLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IENhbmNlbGVkRXJyb3IobnVsbCwgY29uZmlnKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdChjb25maWcpIHtcbiAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gIGNvbmZpZy5oZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShjb25maWcuaGVhZGVycyk7XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICBjb25maWcsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICBpZiAoWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLmluZGV4T2YoY29uZmlnLm1ldGhvZCkgIT09IC0xKSB7XG4gICAgY29uZmlnLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyKGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzJDEuYWRhcHRlcik7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgICBjb25maWcsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICByZXNwb25zZVxuICAgICk7XG5cbiAgICByZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShyZXNwb25zZS5oZWFkZXJzKTtcblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSwgZnVuY3Rpb24gb25BZGFwdGVyUmVqZWN0aW9uKHJlYXNvbikge1xuICAgIGlmICghaXNDYW5jZWwocmVhc29uKSkge1xuICAgICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgICAgaWYgKHJlYXNvbiAmJiByZWFzb24ucmVzcG9uc2UpIHtcbiAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZSxcbiAgICAgICAgICByZWFzb24ucmVzcG9uc2VcbiAgICAgICAgKTtcbiAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgfSk7XG59XG5cbmNvbnN0IFZFUlNJT04gPSBcIjEuNy4yXCI7XG5cbmNvbnN0IHZhbGlkYXRvcnMkMSA9IHt9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuWydvYmplY3QnLCAnYm9vbGVhbicsICdudW1iZXInLCAnZnVuY3Rpb24nLCAnc3RyaW5nJywgJ3N5bWJvbCddLmZvckVhY2goKHR5cGUsIGkpID0+IHtcbiAgdmFsaWRhdG9ycyQxW3R5cGVdID0gZnVuY3Rpb24gdmFsaWRhdG9yKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gdHlwZSB8fCAnYScgKyAoaSA8IDEgPyAnbiAnIDogJyAnKSArIHR5cGU7XG4gIH07XG59KTtcblxuY29uc3QgZGVwcmVjYXRlZFdhcm5pbmdzID0ge307XG5cbi8qKlxuICogVHJhbnNpdGlvbmFsIG9wdGlvbiB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufGJvb2xlYW4/fSB2YWxpZGF0b3IgLSBzZXQgdG8gZmFsc2UgaWYgdGhlIHRyYW5zaXRpb25hbCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZFxuICogQHBhcmFtIHtzdHJpbmc/fSB2ZXJzaW9uIC0gZGVwcmVjYXRlZCB2ZXJzaW9uIC8gcmVtb3ZlZCBzaW5jZSB2ZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZz99IG1lc3NhZ2UgLSBzb21lIG1lc3NhZ2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9cbiAqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKi9cbnZhbGlkYXRvcnMkMS50cmFuc2l0aW9uYWwgPSBmdW5jdGlvbiB0cmFuc2l0aW9uYWwodmFsaWRhdG9yLCB2ZXJzaW9uLCBtZXNzYWdlKSB7XG4gIGZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2Uob3B0LCBkZXNjKSB7XG4gICAgcmV0dXJuICdbQXhpb3MgdicgKyBWRVJTSU9OICsgJ10gVHJhbnNpdGlvbmFsIG9wdGlvbiBcXCcnICsgb3B0ICsgJ1xcJycgKyBkZXNjICsgKG1lc3NhZ2UgPyAnLiAnICsgbWVzc2FnZSA6ICcnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiAodmFsdWUsIG9wdCwgb3B0cykgPT4ge1xuICAgIGlmICh2YWxpZGF0b3IgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShvcHQsICcgaGFzIGJlZW4gcmVtb3ZlZCcgKyAodmVyc2lvbiA/ICcgaW4gJyArIHZlcnNpb24gOiAnJykpLFxuICAgICAgICBBeGlvc0Vycm9yLkVSUl9ERVBSRUNBVEVEXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uICYmICFkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSkge1xuICAgICAgZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0gPSB0cnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICBvcHQsXG4gICAgICAgICAgJyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYnICsgdmVyc2lvbiArICcgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvciA/IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRzKSA6IHRydWU7XG4gIH07XG59O1xuXG4vKipcbiAqIEFzc2VydCBvYmplY3QncyBwcm9wZXJ0aWVzIHR5cGVcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtvYmplY3R9IHNjaGVtYVxuICogQHBhcmFtIHtib29sZWFuP30gYWxsb3dVbmtub3duXG4gKlxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBhc3NlcnRPcHRpb25zKG9wdGlvbnMsIHNjaGVtYSwgYWxsb3dVbmtub3duKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUpO1xuICB9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBjb25zdCBvcHQgPSBrZXlzW2ldO1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHNjaGVtYVtvcHRdO1xuICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc1tvcHRdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0aW9ucyk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB0cnVlKSB7XG4gICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb24gJyArIG9wdCArICcgbXVzdCBiZSAnICsgcmVzdWx0LCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYWxsb3dVbmtub3duICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignVW5rbm93biBvcHRpb24gJyArIG9wdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTik7XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWxpZGF0b3IgPSB7XG4gIGFzc2VydE9wdGlvbnMsXG4gIHZhbGlkYXRvcnM6IHZhbGlkYXRvcnMkMVxufTtcblxuY29uc3QgdmFsaWRhdG9ycyA9IHZhbGlkYXRvci52YWxpZGF0b3JzO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5jbGFzcyBBeGlvcyB7XG4gIGNvbnN0cnVjdG9yKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IGluc3RhbmNlQ29uZmlnO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlciQxKCksXG4gICAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlciQxKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGEgcmVxdWVzdFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGNvbmZpZ09yVXJsIFRoZSBjb25maWcgc3BlY2lmaWMgZm9yIHRoaXMgcmVxdWVzdCAobWVyZ2VkIHdpdGggdGhpcy5kZWZhdWx0cylcbiAgICogQHBhcmFtIHs/T2JqZWN0fSBjb25maWdcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGxldCBkdW1teTtcblxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA/IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGR1bW15ID0ge30pIDogKGR1bW15ID0gbmV3IEVycm9yKCkpO1xuXG4gICAgICAgIC8vIHNsaWNlIG9mZiB0aGUgRXJyb3I6IC4uLiBsaW5lXG4gICAgICAgIGNvbnN0IHN0YWNrID0gZHVtbXkuc3RhY2sgPyBkdW1teS5zdGFjay5yZXBsYWNlKC9eLitcXG4vLCAnJykgOiAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIWVyci5zdGFjaykge1xuICAgICAgICAgICAgZXJyLnN0YWNrID0gc3RhY2s7XG4gICAgICAgICAgICAvLyBtYXRjaCB3aXRob3V0IHRoZSAyIHRvcCBzdGFjayBsaW5lc1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2sgJiYgIVN0cmluZyhlcnIuc3RhY2spLmVuZHNXaXRoKHN0YWNrLnJlcGxhY2UoL14uK1xcbi4rXFxuLywgJycpKSkge1xuICAgICAgICAgICAgZXJyLnN0YWNrICs9ICdcXG4nICsgc3RhY2s7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gaWdub3JlIHRoZSBjYXNlIHdoZXJlIFwic3RhY2tcIiBpcyBhbiB1bi13cml0YWJsZSBwcm9wZXJ0eVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBfcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgLy8gQWxsb3cgZm9yIGF4aW9zKCdleGFtcGxlL3VybCdbLCBjb25maWddKSBhIGxhIGZldGNoIEFQSVxuICAgIGlmICh0eXBlb2YgY29uZmlnT3JVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25maWcgPSBjb25maWcgfHwge307XG4gICAgICBjb25maWcudXJsID0gY29uZmlnT3JVcmw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZ09yVXJsIHx8IHt9O1xuICAgIH1cblxuICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG5cbiAgICBjb25zdCB7dHJhbnNpdGlvbmFsLCBwYXJhbXNTZXJpYWxpemVyLCBoZWFkZXJzfSA9IGNvbmZpZztcblxuICAgIGlmICh0cmFuc2l0aW9uYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnModHJhbnNpdGlvbmFsLCB7XG4gICAgICAgIHNpbGVudEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICBmb3JjZWRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgY2xhcmlmeVRpbWVvdXRFcnJvcjogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKVxuICAgICAgfSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXNTZXJpYWxpemVyICE9IG51bGwpIHtcbiAgICAgIGlmICh1dGlscyQxLmlzRnVuY3Rpb24ocGFyYW1zU2VyaWFsaXplcikpIHtcbiAgICAgICAgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIgPSB7XG4gICAgICAgICAgc2VyaWFsaXplOiBwYXJhbXNTZXJpYWxpemVyXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyhwYXJhbXNTZXJpYWxpemVyLCB7XG4gICAgICAgICAgZW5jb2RlOiB2YWxpZGF0b3JzLmZ1bmN0aW9uLFxuICAgICAgICAgIHNlcmlhbGl6ZTogdmFsaWRhdG9ycy5mdW5jdGlvblxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICAgIGNvbmZpZy5tZXRob2QgPSAoY29uZmlnLm1ldGhvZCB8fCB0aGlzLmRlZmF1bHRzLm1ldGhvZCB8fCAnZ2V0JykudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICAgIGxldCBjb250ZXh0SGVhZGVycyA9IGhlYWRlcnMgJiYgdXRpbHMkMS5tZXJnZShcbiAgICAgIGhlYWRlcnMuY29tbW9uLFxuICAgICAgaGVhZGVyc1tjb25maWcubWV0aG9kXVxuICAgICk7XG5cbiAgICBoZWFkZXJzICYmIHV0aWxzJDEuZm9yRWFjaChcbiAgICAgIFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ2NvbW1vbiddLFxuICAgICAgKG1ldGhvZCkgPT4ge1xuICAgICAgICBkZWxldGUgaGVhZGVyc1ttZXRob2RdO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmNvbmNhdChjb250ZXh0SGVhZGVycywgaGVhZGVycyk7XG5cbiAgICAvLyBmaWx0ZXIgb3V0IHNraXBwZWQgaW50ZXJjZXB0b3JzXG4gICAgY29uc3QgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgICBsZXQgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gdHJ1ZTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24gdW5zaGlmdFJlcXVlc3RJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IucnVuV2hlbiA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnRlcmNlcHRvci5ydW5XaGVuKGNvbmZpZykgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9yLnN5bmNocm9ub3VzO1xuXG4gICAgICByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgbGV0IHByb21pc2U7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW47XG5cbiAgICBpZiAoIXN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycykge1xuICAgICAgY29uc3QgY2hhaW4gPSBbZGlzcGF0Y2hSZXF1ZXN0LmJpbmQodGhpcyksIHVuZGVmaW5lZF07XG4gICAgICBjaGFpbi51bnNoaWZ0LmFwcGx5KGNoYWluLCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBjaGFpbi5wdXNoLmFwcGx5KGNoYWluLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4pO1xuICAgICAgbGVuID0gY2hhaW4ubGVuZ3RoO1xuXG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oY2hhaW5baSsrXSwgY2hhaW5baSsrXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIGxlbiA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIGxldCBuZXdDb25maWcgPSBjb25maWc7XG5cbiAgICBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBjb25zdCBvbkZ1bGZpbGxlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICBjb25zdCBvblJlamVjdGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ld0NvbmZpZyA9IG9uRnVsZmlsbGVkKG5ld0NvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvblJlamVjdGVkLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcHJvbWlzZSA9IGRpc3BhdGNoUmVxdWVzdC5jYWxsKHRoaXMsIG5ld0NvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuXG4gICAgaSA9IDA7XG4gICAgbGVuID0gcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBnZXRVcmkoY29uZmlnKSB7XG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwpO1xuICAgIHJldHVybiBidWlsZFVSTChmdWxsUGF0aCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpO1xuICB9XG59XG5cbi8vIFByb3ZpZGUgYWxpYXNlcyBmb3Igc3VwcG9ydGVkIHJlcXVlc3QgbWV0aG9kc1xudXRpbHMkMS5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBkYXRhOiAoY29uZmlnIHx8IHt9KS5kYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzJDEuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cblxuICBmdW5jdGlvbiBnZW5lcmF0ZUhUVFBNZXRob2QoaXNGb3JtKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGh0dHBNZXRob2QodXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogaXNGb3JtID8ge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSdcbiAgICAgICAgfSA6IHt9LFxuICAgICAgICB1cmwsXG4gICAgICAgIGRhdGFcbiAgICAgIH0pKTtcbiAgICB9O1xuICB9XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBnZW5lcmF0ZUhUVFBNZXRob2QoKTtcblxuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kICsgJ0Zvcm0nXSA9IGdlbmVyYXRlSFRUUE1ldGhvZCh0cnVlKTtcbn0pO1xuXG52YXIgQXhpb3MkMSA9IEF4aW9zO1xuXG4vKipcbiAqIEEgYENhbmNlbFRva2VuYCBpcyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiBhbiBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtDYW5jZWxUb2tlbn1cbiAqL1xuY2xhc3MgQ2FuY2VsVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihleGVjdXRvcikge1xuICAgIGlmICh0eXBlb2YgZXhlY3V0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzb2x2ZVByb21pc2U7XG5cbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlRXhlY3V0b3IocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdG9rZW4gPSB0aGlzO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICB0aGlzLnByb21pc2UudGhlbihjYW5jZWwgPT4ge1xuICAgICAgaWYgKCF0b2tlbi5fbGlzdGVuZXJzKSByZXR1cm47XG5cbiAgICAgIGxldCBpID0gdG9rZW4uX2xpc3RlbmVycy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgIHRva2VuLl9saXN0ZW5lcnNbaV0oY2FuY2VsKTtcbiAgICAgIH1cbiAgICAgIHRva2VuLl9saXN0ZW5lcnMgPSBudWxsO1xuICAgIH0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICB0aGlzLnByb21pc2UudGhlbiA9IG9uZnVsZmlsbGVkID0+IHtcbiAgICAgIGxldCBfcmVzb2x2ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHRva2VuLnN1YnNjcmliZShyZXNvbHZlKTtcbiAgICAgICAgX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgfSkudGhlbihvbmZ1bGZpbGxlZCk7XG5cbiAgICAgIHByb21pc2UuY2FuY2VsID0gZnVuY3Rpb24gcmVqZWN0KCkge1xuICAgICAgICB0b2tlbi51bnN1YnNjcmliZShfcmVzb2x2ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgZXhlY3V0b3IoZnVuY3Rpb24gY2FuY2VsKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCkge1xuICAgICAgaWYgKHRva2VuLnJlYXNvbikge1xuICAgICAgICAvLyBDYW5jZWxsYXRpb24gaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0b2tlbi5yZWFzb24gPSBuZXcgQ2FuY2VsZWRFcnJvcihtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpO1xuICAgICAgcmVzb2x2ZVByb21pc2UodG9rZW4ucmVhc29uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYSBgQ2FuY2VsZWRFcnJvcmAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAgICovXG4gIHRocm93SWZSZXF1ZXN0ZWQoKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICB0aHJvdyB0aGlzLnJlYXNvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgbGlzdGVuZXIodGhpcy5yZWFzb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW2xpc3RlbmVyXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmUgZnJvbSB0aGUgY2FuY2VsIHNpZ25hbFxuICAgKi9cblxuICB1bnN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXG4gICAqIGNhbmNlbHMgdGhlIGBDYW5jZWxUb2tlbmAuXG4gICAqL1xuICBzdGF0aWMgc291cmNlKCkge1xuICAgIGxldCBjYW5jZWw7XG4gICAgY29uc3QgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oZnVuY3Rpb24gZXhlY3V0b3IoYykge1xuICAgICAgY2FuY2VsID0gYztcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW4sXG4gICAgICBjYW5jZWxcbiAgICB9O1xuICB9XG59XG5cbnZhciBDYW5jZWxUb2tlbiQxID0gQ2FuY2VsVG9rZW47XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3NcbiAqXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3MsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0F4aW9zRXJyb3IocGF5bG9hZCkge1xuICByZXR1cm4gdXRpbHMkMS5pc09iamVjdChwYXlsb2FkKSAmJiAocGF5bG9hZC5pc0F4aW9zRXJyb3IgPT09IHRydWUpO1xufVxuXG5jb25zdCBIdHRwU3RhdHVzQ29kZSA9IHtcbiAgQ29udGludWU6IDEwMCxcbiAgU3dpdGNoaW5nUHJvdG9jb2xzOiAxMDEsXG4gIFByb2Nlc3Npbmc6IDEwMixcbiAgRWFybHlIaW50czogMTAzLFxuICBPazogMjAwLFxuICBDcmVhdGVkOiAyMDEsXG4gIEFjY2VwdGVkOiAyMDIsXG4gIE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjogMjAzLFxuICBOb0NvbnRlbnQ6IDIwNCxcbiAgUmVzZXRDb250ZW50OiAyMDUsXG4gIFBhcnRpYWxDb250ZW50OiAyMDYsXG4gIE11bHRpU3RhdHVzOiAyMDcsXG4gIEFscmVhZHlSZXBvcnRlZDogMjA4LFxuICBJbVVzZWQ6IDIyNixcbiAgTXVsdGlwbGVDaG9pY2VzOiAzMDAsXG4gIE1vdmVkUGVybWFuZW50bHk6IDMwMSxcbiAgRm91bmQ6IDMwMixcbiAgU2VlT3RoZXI6IDMwMyxcbiAgTm90TW9kaWZpZWQ6IDMwNCxcbiAgVXNlUHJveHk6IDMwNSxcbiAgVW51c2VkOiAzMDYsXG4gIFRlbXBvcmFyeVJlZGlyZWN0OiAzMDcsXG4gIFBlcm1hbmVudFJlZGlyZWN0OiAzMDgsXG4gIEJhZFJlcXVlc3Q6IDQwMCxcbiAgVW5hdXRob3JpemVkOiA0MDEsXG4gIFBheW1lbnRSZXF1aXJlZDogNDAyLFxuICBGb3JiaWRkZW46IDQwMyxcbiAgTm90Rm91bmQ6IDQwNCxcbiAgTWV0aG9kTm90QWxsb3dlZDogNDA1LFxuICBOb3RBY2NlcHRhYmxlOiA0MDYsXG4gIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDogNDA3LFxuICBSZXF1ZXN0VGltZW91dDogNDA4LFxuICBDb25mbGljdDogNDA5LFxuICBHb25lOiA0MTAsXG4gIExlbmd0aFJlcXVpcmVkOiA0MTEsXG4gIFByZWNvbmRpdGlvbkZhaWxlZDogNDEyLFxuICBQYXlsb2FkVG9vTGFyZ2U6IDQxMyxcbiAgVXJpVG9vTG9uZzogNDE0LFxuICBVbnN1cHBvcnRlZE1lZGlhVHlwZTogNDE1LFxuICBSYW5nZU5vdFNhdGlzZmlhYmxlOiA0MTYsXG4gIEV4cGVjdGF0aW9uRmFpbGVkOiA0MTcsXG4gIEltQVRlYXBvdDogNDE4LFxuICBNaXNkaXJlY3RlZFJlcXVlc3Q6IDQyMSxcbiAgVW5wcm9jZXNzYWJsZUVudGl0eTogNDIyLFxuICBMb2NrZWQ6IDQyMyxcbiAgRmFpbGVkRGVwZW5kZW5jeTogNDI0LFxuICBUb29FYXJseTogNDI1LFxuICBVcGdyYWRlUmVxdWlyZWQ6IDQyNixcbiAgUHJlY29uZGl0aW9uUmVxdWlyZWQ6IDQyOCxcbiAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTogNDMxLFxuICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczogNDUxLFxuICBJbnRlcm5hbFNlcnZlckVycm9yOiA1MDAsXG4gIE5vdEltcGxlbWVudGVkOiA1MDEsXG4gIEJhZEdhdGV3YXk6IDUwMixcbiAgU2VydmljZVVuYXZhaWxhYmxlOiA1MDMsXG4gIEdhdGV3YXlUaW1lb3V0OiA1MDQsXG4gIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOiA1MDUsXG4gIFZhcmlhbnRBbHNvTmVnb3RpYXRlczogNTA2LFxuICBJbnN1ZmZpY2llbnRTdG9yYWdlOiA1MDcsXG4gIExvb3BEZXRlY3RlZDogNTA4LFxuICBOb3RFeHRlbmRlZDogNTEwLFxuICBOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDogNTExLFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxudmFyIEh0dHBTdGF0dXNDb2RlJDEgPSBIdHRwU3RhdHVzQ29kZTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm5zIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEF4aW9zJDEoZGVmYXVsdENvbmZpZyk7XG4gIGNvbnN0IGluc3RhbmNlID0gYmluZChBeGlvcyQxLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscyQxLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MkMS5wcm90b3R5cGUsIGNvbnRleHQsIHthbGxPd25LZXlzOiB0cnVlfSk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzJDEuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0LCBudWxsLCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbiAgaW5zdGFuY2UuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGRlZmF1bHRDb25maWcsIGluc3RhbmNlQ29uZmlnKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbmNvbnN0IGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMkMSk7XG5cbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxuYXhpb3MuQXhpb3MgPSBBeGlvcyQxO1xuXG4vLyBFeHBvc2UgQ2FuY2VsICYgQ2FuY2VsVG9rZW5cbmF4aW9zLkNhbmNlbGVkRXJyb3IgPSBDYW5jZWxlZEVycm9yO1xuYXhpb3MuQ2FuY2VsVG9rZW4gPSBDYW5jZWxUb2tlbiQxO1xuYXhpb3MuaXNDYW5jZWwgPSBpc0NhbmNlbDtcbmF4aW9zLlZFUlNJT04gPSBWRVJTSU9OO1xuYXhpb3MudG9Gb3JtRGF0YSA9IHRvRm9ybURhdGE7XG5cbi8vIEV4cG9zZSBBeGlvc0Vycm9yIGNsYXNzXG5heGlvcy5BeGlvc0Vycm9yID0gQXhpb3NFcnJvcjtcblxuLy8gYWxpYXMgZm9yIENhbmNlbGVkRXJyb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmF4aW9zLkNhbmNlbCA9IGF4aW9zLkNhbmNlbGVkRXJyb3I7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5cbmF4aW9zLnNwcmVhZCA9IHNwcmVhZDtcblxuLy8gRXhwb3NlIGlzQXhpb3NFcnJvclxuYXhpb3MuaXNBeGlvc0Vycm9yID0gaXNBeGlvc0Vycm9yO1xuXG4vLyBFeHBvc2UgbWVyZ2VDb25maWdcbmF4aW9zLm1lcmdlQ29uZmlnID0gbWVyZ2VDb25maWc7XG5cbmF4aW9zLkF4aW9zSGVhZGVycyA9IEF4aW9zSGVhZGVycyQxO1xuXG5heGlvcy5mb3JtVG9KU09OID0gdGhpbmcgPT4gZm9ybURhdGFUb0pTT04odXRpbHMkMS5pc0hUTUxGb3JtKHRoaW5nKSA/IG5ldyBGb3JtRGF0YSh0aGluZykgOiB0aGluZyk7XG5cbmF4aW9zLmdldEFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyO1xuXG5heGlvcy5IdHRwU3RhdHVzQ29kZSA9IEh0dHBTdGF0dXNDb2RlJDE7XG5cbmF4aW9zLmRlZmF1bHQgPSBheGlvcztcblxubW9kdWxlLmV4cG9ydHMgPSBheGlvcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF4aW9zLmNqcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQXhpb3NDbGllbnQgPSB2b2lkIDA7XG52YXIgYXhpb3NfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiYXhpb3NcIikpO1xudmFyIEF4aW9zQ2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEF4aW9zQ2xpZW50KF9hKSB7XG4gICAgICAgIHZhciByZXNwb25zZUhhbmRsZXIgPSBfYS5yZXNwb25zZUhhbmRsZXIsIHJlcXVlc3RDb25maWdCdWlsZGVyID0gX2EucmVxdWVzdENvbmZpZ0J1aWxkZXI7XG4gICAgICAgIHRoaXMucmVzcG9uc2VIYW5kbGVyID0gcmVzcG9uc2VIYW5kbGVyO1xuICAgICAgICB0aGlzLnJlcXVlc3RDb25maWdCdWlsZGVyID0gcmVxdWVzdENvbmZpZ0J1aWxkZXI7XG4gICAgfVxuICAgIEF4aW9zQ2xpZW50LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAocGF0aCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0Q29uZmlnO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlcXVlc3RDb25maWdCdWlsZGVyLmJ1aWxkKFwiZ2V0XCIsIHBhdGgsIHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29uZmlnID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZW5kUmVxdWVzdChyZXF1ZXN0Q29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYS5zZW50KCkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBBeGlvc0NsaWVudC5wcm90b3R5cGUuZ2V0RGF0YSA9IGZ1bmN0aW9uIChwYXRoLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RDb25maWc7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVxdWVzdENvbmZpZ0J1aWxkZXIuYnVpbGQoXCJnZXRcIiwgcGF0aCwgcGFyYW1zLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb25maWcgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3RDb25maWcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qLywgKF9hLnNlbnQoKSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEF4aW9zQ2xpZW50LnByb3RvdHlwZS5wb3N0ID0gZnVuY3Rpb24gKHBhdGgsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdENvbmZpZztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZXF1ZXN0Q29uZmlnQnVpbGRlci5idWlsZChcInBvc3RcIiwgcGF0aCwgcGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb25maWcgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3RDb25maWcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qLywgKF9hLnNlbnQoKSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEF4aW9zQ2xpZW50LnByb3RvdHlwZS5wb3N0RGF0YSA9IGZ1bmN0aW9uIChwYXRoLCBmb3JtRGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdENvbmZpZztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZXF1ZXN0Q29uZmlnQnVpbGRlci5idWlsZChcInBvc3RcIiwgcGF0aCwgZm9ybURhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbmZpZyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc2VuZFJlcXVlc3QocmVxdWVzdENvbmZpZyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCAoX2Euc2VudCgpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQXhpb3NDbGllbnQucHJvdG90eXBlLnB1dCA9IGZ1bmN0aW9uIChwYXRoLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RDb25maWc7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVxdWVzdENvbmZpZ0J1aWxkZXIuYnVpbGQoXCJwdXRcIiwgcGF0aCwgcGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb25maWcgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3RDb25maWcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qLywgKF9hLnNlbnQoKSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEF4aW9zQ2xpZW50LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAocGF0aCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0Q29uZmlnO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlcXVlc3RDb25maWdCdWlsZGVyLmJ1aWxkKFwiZGVsZXRlXCIsIHBhdGgsIHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29uZmlnID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZW5kUmVxdWVzdChyZXF1ZXN0Q29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYS5zZW50KCkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBBeGlvc0NsaWVudC5wcm90b3R5cGUuc2VuZFJlcXVlc3QgPSBmdW5jdGlvbiAocmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZUhhbmRsZXIuaGFuZGxlKFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgICAoMCwgYXhpb3NfMS5kZWZhdWx0KShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVxdWVzdENvbmZpZyksIHsgbWF4Qm9keUxlbmd0aDogSW5maW5pdHksIG1heENvbnRlbnRMZW5ndGg6IEluZmluaXR5IH0pKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQXhpb3NDbGllbnQ7XG59KCkpO1xuZXhwb3J0cy5BeGlvc0NsaWVudCA9IEF4aW9zQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXhpb3NDbGllbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRlZmF1bHRIdHRwQ2xpZW50ID0gdm9pZCAwO1xudmFyIEF4aW9zQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9BeGlvc0NsaWVudFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRlZmF1bHRIdHRwQ2xpZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBBeGlvc0NsaWVudF8xLkF4aW9zQ2xpZW50OyB9IH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZXZhbCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBFdmFsRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JhbmdlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JlZicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBSZWZlcmVuY2VFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc3ludGF4Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRheEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi90eXBlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFR5cGVFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vdXJpJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFVSSUVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgY29tcGxleGl0eTogWzIsIDE4XSwgbWF4LXN0YXRlbWVudHM6IFsyLCAzM10gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJykgeyByZXR1cm4gdHJ1ZTsgfVxuXG5cdHZhciBvYmogPSB7fTtcblx0dmFyIHN5bSA9IFN5bWJvbCgndGVzdCcpO1xuXHR2YXIgc3ltT2JqID0gT2JqZWN0KHN5bSk7XG5cdGlmICh0eXBlb2Ygc3ltID09PSAnc3RyaW5nJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bU9iaikgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvb2JqZWN0LmFzc2lnbi9pc3N1ZXMvMTdcblx0Ly8gaWYgKHN5bSBpbnN0YW5jZW9mIFN5bWJvbCkgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL1dlYlJlZmxlY3Rpb24vZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzL2lzc3Vlcy80XG5cdC8vIGlmICghKHN5bU9iaiBpbnN0YW5jZW9mIFN5bWJvbCkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gaWYgKHR5cGVvZiBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyBpZiAoU3RyaW5nKHN5bSkgIT09IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1WYWwgPSA0Mjtcblx0b2JqW3N5bV0gPSBzeW1WYWw7XG5cdGZvciAoc3ltIGluIG9iaikgeyByZXR1cm4gZmFsc2U7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tdW5yZWFjaGFibGUtbG9vcFxuXHRpZiAodHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG5cdGlmIChzeW1zLmxlbmd0aCAhPT0gMSB8fCBzeW1zWzBdICE9PSBzeW0pIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqLCBzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHN5bSk7XG5cdFx0aWYgKGRlc2NyaXB0b3IudmFsdWUgIT09IHN5bVZhbCB8fCBkZXNjcmlwdG9yLmVudW1lcmFibGUgIT09IHRydWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvcmlnU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sO1xudmFyIGhhc1N5bWJvbFNoYW0gPSByZXF1aXJlKCcuL3NoYW1zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzTmF0aXZlU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sKCdmb28nKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sKCdiYXInKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0cmV0dXJuIGhhc1N5bWJvbFNoYW0oKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0ZXN0ID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdGZvbzoge31cbn07XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNQcm90bygpIHtcblx0Ly8gQHRzLWV4cGVjdC1lcnJvcjogVFMgZXJyb3JzIG9uIGFuIGluaGVyaXRlZCBwcm9wZXJ0eSBmb3Igc29tZSByZWFzb25cblx0cmV0dXJuIHsgX19wcm90b19fOiB0ZXN0IH0uZm9vID09PSB0ZXN0LmZvb1xuXHRcdCYmICEodGVzdCBpbnN0YW5jZW9mICRPYmplY3QpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxudmFyIGNvbmNhdHR5ID0gZnVuY3Rpb24gY29uY2F0dHkoYSwgYikge1xuICAgIHZhciBhcnIgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBhcnJbaV0gPSBhW2ldO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGIubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgYXJyW2ogKyBhLmxlbmd0aF0gPSBiW2pdO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG59O1xuXG52YXIgc2xpY3kgPSBmdW5jdGlvbiBzbGljeShhcnJMaWtlLCBvZmZzZXQpIHtcbiAgICB2YXIgYXJyID0gW107XG4gICAgZm9yICh2YXIgaSA9IG9mZnNldCB8fCAwLCBqID0gMDsgaSA8IGFyckxpa2UubGVuZ3RoOyBpICs9IDEsIGogKz0gMSkge1xuICAgICAgICBhcnJbal0gPSBhcnJMaWtlW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xufTtcblxudmFyIGpvaW55ID0gZnVuY3Rpb24gKGFyciwgam9pbmVyKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHN0ciArPSBhcnJbaV07XG4gICAgICAgIGlmIChpICsgMSA8IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0ciArPSBqb2luZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7XG4gICAgdmFyIHRhcmdldCA9IHRoaXM7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicgfHwgdG9TdHIuYXBwbHkodGFyZ2V0KSAhPT0gZnVuY1R5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJPUl9NRVNTQUdFICsgdGFyZ2V0KTtcbiAgICB9XG4gICAgdmFyIGFyZ3MgPSBzbGljeShhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBjb25jYXR0eShhcmdzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldC5hcHBseShcbiAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICBjb25jYXR0eShhcmdzLCBhcmd1bWVudHMpXG4gICAgICAgICk7XG5cbiAgICB9O1xuXG4gICAgdmFyIGJvdW5kTGVuZ3RoID0gbWF4KDAsIHRhcmdldC5sZW5ndGggLSBhcmdzLmxlbmd0aCk7XG4gICAgdmFyIGJvdW5kQXJncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRMZW5ndGg7IGkrKykge1xuICAgICAgICBib3VuZEFyZ3NbaV0gPSAnJCcgKyBpO1xuICAgIH1cblxuICAgIGJvdW5kID0gRnVuY3Rpb24oJ2JpbmRlcicsICdyZXR1cm4gZnVuY3Rpb24gKCcgKyBqb2lueShib3VuZEFyZ3MsICcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGltcGxlbWVudGF0aW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xudmFyICRoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmQuY2FsbChjYWxsLCAkaGFzT3duKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHVuZGVmaW5lZDtcblxudmFyICRFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycycpO1xudmFyICRFdmFsRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvZXZhbCcpO1xudmFyICRSYW5nZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3JhbmdlJyk7XG52YXIgJFJlZmVyZW5jZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3JlZicpO1xudmFyICRTeW50YXhFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9zeW50YXgnKTtcbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcbnZhciAkVVJJRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdXJpJyk7XG5cbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG52YXIgZ2V0RXZhbGxlZENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKGV4cHJlc3Npb25TeW50YXgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gJEZ1bmN0aW9uKCdcInVzZSBzdHJpY3RcIjsgcmV0dXJuICgnICsgZXhwcmVzc2lvblN5bnRheCArICcpLmNvbnN0cnVjdG9yOycpKCk7XG5cdH0gY2F0Y2ggKGUpIHt9XG59O1xuXG52YXIgJGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuaWYgKCRnT1BEKSB7XG5cdHRyeSB7XG5cdFx0JGdPUEQoe30sICcnKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdCRnT1BEID0gbnVsbDsgLy8gdGhpcyBpcyBJRSA4LCB3aGljaCBoYXMgYSBicm9rZW4gZ09QRFxuXHR9XG59XG5cbnZhciB0aHJvd1R5cGVFcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoKTtcbn07XG52YXIgVGhyb3dUeXBlRXJyb3IgPSAkZ09QRFxuXHQ/IChmdW5jdGlvbiAoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMsIG5vLWNhbGxlciwgbm8tcmVzdHJpY3RlZC1wcm9wZXJ0aWVzXG5cdFx0XHRhcmd1bWVudHMuY2FsbGVlOyAvLyBJRSA4IGRvZXMgbm90IHRocm93IGhlcmVcblx0XHRcdHJldHVybiB0aHJvd1R5cGVFcnJvcjtcblx0XHR9IGNhdGNoIChjYWxsZWVUaHJvd3MpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIElFIDggdGhyb3dzIG9uIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXJndW1lbnRzLCAnJylcblx0XHRcdFx0cmV0dXJuICRnT1BEKGFyZ3VtZW50cywgJ2NhbGxlZScpLmdldDtcblx0XHRcdH0gY2F0Y2ggKGdPUER0aHJvd3MpIHtcblx0XHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fSgpKVxuXHQ6IHRocm93VHlwZUVycm9yO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcbnZhciBoYXNQcm90byA9IHJlcXVpcmUoJ2hhcy1wcm90bycpKCk7XG5cbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCAoXG5cdGhhc1Byb3RvXG5cdFx0PyBmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5fX3Byb3RvX187IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuXHRcdDogbnVsbFxuKTtcblxudmFyIG5lZWRzRXZhbCA9IHt9O1xuXG52YXIgVHlwZWRBcnJheSA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhVaW50OEFycmF5KTtcblxudmFyIElOVFJJTlNJQ1MgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0JyVBZ2dyZWdhdGVFcnJvciUnOiB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQWdncmVnYXRlRXJyb3IsXG5cdCclQXJyYXklJzogQXJyYXksXG5cdCclQXJyYXlCdWZmZXIlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFycmF5QnVmZmVyLFxuXHQnJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGcm9tU3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Z1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiBuZWVkc0V2YWwsXG5cdCclQXRvbWljcyUnOiB0eXBlb2YgQXRvbWljcyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBdG9taWNzLFxuXHQnJUJpZ0ludCUnOiB0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludCxcblx0JyVCaWdJbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdJbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludDY0QXJyYXksXG5cdCclQmlnVWludDY0QXJyYXklJzogdHlwZW9mIEJpZ1VpbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ1VpbnQ2NEFycmF5LFxuXHQnJUJvb2xlYW4lJzogQm9vbGVhbixcblx0JyVEYXRhVmlldyUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRGF0YVZpZXcsXG5cdCclRGF0ZSUnOiBEYXRlLFxuXHQnJWRlY29kZVVSSSUnOiBkZWNvZGVVUkksXG5cdCclZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcblx0JyVlbmNvZGVVUkklJzogZW5jb2RlVVJJLFxuXHQnJWVuY29kZVVSSUNvbXBvbmVudCUnOiBlbmNvZGVVUklDb21wb25lbnQsXG5cdCclRXJyb3IlJzogJEVycm9yLFxuXHQnJWV2YWwlJzogZXZhbCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1ldmFsXG5cdCclRXZhbEVycm9yJSc6ICRFdmFsRXJyb3IsXG5cdCclRmxvYXQzMkFycmF5JSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LFxuXHQnJUZsb2F0NjRBcnJheSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheSxcblx0JyVGaW5hbGl6YXRpb25SZWdpc3RyeSUnOiB0eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmluYWxpemF0aW9uUmVnaXN0cnksXG5cdCclRnVuY3Rpb24lJzogJEZ1bmN0aW9uLFxuXHQnJUdlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVJbnQ4QXJyYXklJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQ4QXJyYXksXG5cdCclSW50MTZBcnJheSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQxNkFycmF5LFxuXHQnJUludDMyQXJyYXklJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MzJBcnJheSxcblx0JyVpc0Zpbml0ZSUnOiBpc0Zpbml0ZSxcblx0JyVpc05hTiUnOiBpc05hTixcblx0JyVJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSkgOiB1bmRlZmluZWQsXG5cdCclSlNPTiUnOiB0eXBlb2YgSlNPTiA9PT0gJ29iamVjdCcgPyBKU09OIDogdW5kZWZpbmVkLFxuXHQnJU1hcCUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE1hcCxcblx0JyVNYXBJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgTWFwKClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVNYXRoJSc6IE1hdGgsXG5cdCclTnVtYmVyJSc6IE51bWJlcixcblx0JyVPYmplY3QlJzogT2JqZWN0LFxuXHQnJXBhcnNlRmxvYXQlJzogcGFyc2VGbG9hdCxcblx0JyVwYXJzZUludCUnOiBwYXJzZUludCxcblx0JyVQcm9taXNlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UsXG5cdCclUHJveHklJzogdHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb3h5LFxuXHQnJVJhbmdlRXJyb3IlJzogJFJhbmdlRXJyb3IsXG5cdCclUmVmZXJlbmNlRXJyb3IlJzogJFJlZmVyZW5jZUVycm9yLFxuXHQnJVJlZmxlY3QlJzogdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUmVmbGVjdCxcblx0JyVSZWdFeHAlJzogUmVnRXhwLFxuXHQnJVNldCUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNldCxcblx0JyVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgU2V0KClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlciUnOiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2hhcmVkQXJyYXlCdWZmZXIsXG5cdCclU3RyaW5nJSc6IFN0cmluZyxcblx0JyVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oJydbU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyVTeW1ib2wlJzogaGFzU3ltYm9scyA/IFN5bWJvbCA6IHVuZGVmaW5lZCxcblx0JyVTeW50YXhFcnJvciUnOiAkU3ludGF4RXJyb3IsXG5cdCclVGhyb3dUeXBlRXJyb3IlJzogVGhyb3dUeXBlRXJyb3IsXG5cdCclVHlwZWRBcnJheSUnOiBUeXBlZEFycmF5LFxuXHQnJVR5cGVFcnJvciUnOiAkVHlwZUVycm9yLFxuXHQnJVVpbnQ4QXJyYXklJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhBcnJheSxcblx0JyVVaW50OENsYW1wZWRBcnJheSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhDbGFtcGVkQXJyYXksXG5cdCclVWludDE2QXJyYXklJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQxNkFycmF5LFxuXHQnJVVpbnQzMkFycmF5JSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MzJBcnJheSxcblx0JyVVUklFcnJvciUnOiAkVVJJRXJyb3IsXG5cdCclV2Vha01hcCUnOiB0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrTWFwLFxuXHQnJVdlYWtSZWYlJzogdHlwZW9mIFdlYWtSZWYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha1JlZixcblx0JyVXZWFrU2V0JSc6IHR5cGVvZiBXZWFrU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtTZXRcbn07XG5cbmlmIChnZXRQcm90bykge1xuXHR0cnkge1xuXHRcdG51bGwuZXJyb3I7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zaGFkb3dyZWFsbS9wdWxsLzM4NCNpc3N1ZWNvbW1lbnQtMTM2NDI2NDIyOVxuXHRcdHZhciBlcnJvclByb3RvID0gZ2V0UHJvdG8oZ2V0UHJvdG8oZSkpO1xuXHRcdElOVFJJTlNJQ1NbJyVFcnJvci5wcm90b3R5cGUlJ10gPSBlcnJvclByb3RvO1xuXHR9XG59XG5cbnZhciBkb0V2YWwgPSBmdW5jdGlvbiBkb0V2YWwobmFtZSkge1xuXHR2YXIgdmFsdWU7XG5cdGlmIChuYW1lID09PSAnJUFzeW5jRnVuY3Rpb24lJykge1xuXHRcdHZhbHVlID0gZ2V0RXZhbGxlZENvbnN0cnVjdG9yKCdhc3luYyBmdW5jdGlvbiAoKSB7fScpO1xuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclR2VuZXJhdG9yRnVuY3Rpb24lJykge1xuXHRcdHZhbHVlID0gZ2V0RXZhbGxlZENvbnN0cnVjdG9yKCdmdW5jdGlvbiogKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJykge1xuXHRcdHZhbHVlID0gZ2V0RXZhbGxlZENvbnN0cnVjdG9yKCdhc3luYyBmdW5jdGlvbiogKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jR2VuZXJhdG9yJScpIHtcblx0XHR2YXIgZm4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpO1xuXHRcdGlmIChmbikge1xuXHRcdFx0dmFsdWUgPSBmbi5wcm90b3R5cGU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnKSB7XG5cdFx0dmFyIGdlbiA9IGRvRXZhbCgnJUFzeW5jR2VuZXJhdG9yJScpO1xuXHRcdGlmIChnZW4gJiYgZ2V0UHJvdG8pIHtcblx0XHRcdHZhbHVlID0gZ2V0UHJvdG8oZ2VuLnByb3RvdHlwZSk7XG5cdFx0fVxuXHR9XG5cblx0SU5UUklOU0lDU1tuYW1lXSA9IHZhbHVlO1xuXG5cdHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBMRUdBQ1lfQUxJQVNFUyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnJUFycmF5QnVmZmVyUHJvdG90eXBlJSc6IFsnQXJyYXlCdWZmZXInLCAncHJvdG90eXBlJ10sXG5cdCclQXJyYXlQcm90b3R5cGUlJzogWydBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvX2VudHJpZXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAnZW50cmllcyddLFxuXHQnJUFycmF5UHJvdG9fZm9yRWFjaCUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdmb3JFYWNoJ10sXG5cdCclQXJyYXlQcm90b19rZXlzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2tleXMnXSxcblx0JyVBcnJheVByb3RvX3ZhbHVlcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICd2YWx1ZXMnXSxcblx0JyVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSc6IFsnQXN5bmNGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlJzogWydBc3luY0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVCb29sZWFuUHJvdG90eXBlJSc6IFsnQm9vbGVhbicsICdwcm90b3R5cGUnXSxcblx0JyVEYXRhVmlld1Byb3RvdHlwZSUnOiBbJ0RhdGFWaWV3JywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGVQcm90b3R5cGUlJzogWydEYXRlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUVycm9yUHJvdG90eXBlJSc6IFsnRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRXZhbEVycm9yUHJvdG90eXBlJSc6IFsnRXZhbEVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0MzJBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGbG9hdDY0QXJyYXlQcm90b3R5cGUlJzogWydGbG9hdDY0QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclRnVuY3Rpb25Qcm90b3R5cGUlJzogWydGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVHZW5lcmF0b3IlJzogWydHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVHZW5lcmF0b3JQcm90b3R5cGUlJzogWydHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnLCAncHJvdG90eXBlJ10sXG5cdCclSW50OEFycmF5UHJvdG90eXBlJSc6IFsnSW50OEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDE2QXJyYXlQcm90b3R5cGUlJzogWydJbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDMyQXJyYXlQcm90b3R5cGUlJzogWydJbnQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUpTT05QYXJzZSUnOiBbJ0pTT04nLCAncGFyc2UnXSxcblx0JyVKU09OU3RyaW5naWZ5JSc6IFsnSlNPTicsICdzdHJpbmdpZnknXSxcblx0JyVNYXBQcm90b3R5cGUlJzogWydNYXAnLCAncHJvdG90eXBlJ10sXG5cdCclTnVtYmVyUHJvdG90eXBlJSc6IFsnTnVtYmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJU9iamVjdFByb3RvdHlwZSUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnXSxcblx0JyVPYmpQcm90b190b1N0cmluZyUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnLCAndG9TdHJpbmcnXSxcblx0JyVPYmpQcm90b192YWx1ZU9mJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd2YWx1ZU9mJ10sXG5cdCclUHJvbWlzZVByb3RvdHlwZSUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJ10sXG5cdCclUHJvbWlzZVByb3RvX3RoZW4lJzogWydQcm9taXNlJywgJ3Byb3RvdHlwZScsICd0aGVuJ10sXG5cdCclUHJvbWlzZV9hbGwlJzogWydQcm9taXNlJywgJ2FsbCddLFxuXHQnJVByb21pc2VfcmVqZWN0JSc6IFsnUHJvbWlzZScsICdyZWplY3QnXSxcblx0JyVQcm9taXNlX3Jlc29sdmUlJzogWydQcm9taXNlJywgJ3Jlc29sdmUnXSxcblx0JyVSYW5nZUVycm9yUHJvdG90eXBlJSc6IFsnUmFuZ2VFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVSZWZlcmVuY2VFcnJvclByb3RvdHlwZSUnOiBbJ1JlZmVyZW5jZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZ0V4cFByb3RvdHlwZSUnOiBbJ1JlZ0V4cCcsICdwcm90b3R5cGUnXSxcblx0JyVTZXRQcm90b3R5cGUlJzogWydTZXQnLCAncHJvdG90eXBlJ10sXG5cdCclU2hhcmVkQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydTaGFyZWRBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVTdHJpbmdQcm90b3R5cGUlJzogWydTdHJpbmcnLCAncHJvdG90eXBlJ10sXG5cdCclU3ltYm9sUHJvdG90eXBlJSc6IFsnU3ltYm9sJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN5bnRheEVycm9yUHJvdG90eXBlJSc6IFsnU3ludGF4RXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVHlwZWRBcnJheVByb3RvdHlwZSUnOiBbJ1R5cGVkQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVHlwZUVycm9yUHJvdG90eXBlJSc6IFsnVHlwZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQ4QXJyYXlQcm90b3R5cGUlJzogWydVaW50OEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVWludDhDbGFtcGVkQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDE2QXJyYXlQcm90b3R5cGUlJzogWydVaW50MTZBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVSSUVycm9yUHJvdG90eXBlJSc6IFsnVVJJRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclV2Vha01hcFByb3RvdHlwZSUnOiBbJ1dlYWtNYXAnLCAncHJvdG90eXBlJ10sXG5cdCclV2Vha1NldFByb3RvdHlwZSUnOiBbJ1dlYWtTZXQnLCAncHJvdG90eXBlJ11cbn07XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJ2hhc293bicpO1xudmFyICRjb25jYXQgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgQXJyYXkucHJvdG90eXBlLmNvbmNhdCk7XG52YXIgJHNwbGljZUFwcGx5ID0gYmluZC5jYWxsKEZ1bmN0aW9uLmFwcGx5LCBBcnJheS5wcm90b3R5cGUuc3BsaWNlKTtcbnZhciAkcmVwbGFjZSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpO1xudmFyICRzdHJTbGljZSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnNsaWNlKTtcbnZhciAkZXhlYyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBSZWdFeHAucHJvdG90eXBlLmV4ZWMpO1xuXG4vKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjE3LjE1L2Rpc3QvbG9kYXNoLmpzI0w2NzM1LUw2NzQ0ICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXiUuW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JSQpKS9nO1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nOyAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBmdW5jdGlvbiBzdHJpbmdUb1BhdGgoc3RyaW5nKSB7XG5cdHZhciBmaXJzdCA9ICRzdHJTbGljZShzdHJpbmcsIDAsIDEpO1xuXHR2YXIgbGFzdCA9ICRzdHJTbGljZShzdHJpbmcsIC0xKTtcblx0aWYgKGZpcnN0ID09PSAnJScgJiYgbGFzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBjbG9zaW5nIGAlYCcpO1xuXHR9IGVsc2UgaWYgKGxhc3QgPT09ICclJyAmJiBmaXJzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBvcGVuaW5nIGAlYCcpO1xuXHR9XG5cdHZhciByZXN1bHQgPSBbXTtcblx0JHJlcGxhY2Uoc3RyaW5nLCByZVByb3BOYW1lLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuXHRcdHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHF1b3RlID8gJHJlcGxhY2Uoc3ViU3RyaW5nLCByZUVzY2FwZUNoYXIsICckMScpIDogbnVtYmVyIHx8IG1hdGNoO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKiBlbmQgYWRhcHRhdGlvbiAqL1xuXG52YXIgZ2V0QmFzZUludHJpbnNpYyA9IGZ1bmN0aW9uIGdldEJhc2VJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWNOYW1lID0gbmFtZTtcblx0dmFyIGFsaWFzO1xuXHRpZiAoaGFzT3duKExFR0FDWV9BTElBU0VTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdGFsaWFzID0gTEVHQUNZX0FMSUFTRVNbaW50cmluc2ljTmFtZV07XG5cdFx0aW50cmluc2ljTmFtZSA9ICclJyArIGFsaWFzWzBdICsgJyUnO1xuXHR9XG5cblx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdHZhciB2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljTmFtZV07XG5cdFx0aWYgKHZhbHVlID09PSBuZWVkc0V2YWwpIHtcblx0XHRcdHZhbHVlID0gZG9FdmFsKGludHJpbnNpY05hbWUpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyAmJiAhYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YWxpYXM6IGFsaWFzLFxuXHRcdFx0bmFtZTogaW50cmluc2ljTmFtZSxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH07XG5cdH1cblxuXHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBHZXRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1wiYWxsb3dNaXNzaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdGlmICgkZXhlYygvXiU/W14lXSolPyQvLCBuYW1lKSA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2AlYCBtYXkgbm90IGJlIHByZXNlbnQgYW55d2hlcmUgYnV0IGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgaW50cmluc2ljIG5hbWUnKTtcblx0fVxuXHR2YXIgcGFydHMgPSBzdHJpbmdUb1BhdGgobmFtZSk7XG5cdHZhciBpbnRyaW5zaWNCYXNlTmFtZSA9IHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0c1swXSA6ICcnO1xuXG5cdHZhciBpbnRyaW5zaWMgPSBnZXRCYXNlSW50cmluc2ljKCclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnLCBhbGxvd01pc3NpbmcpO1xuXHR2YXIgaW50cmluc2ljUmVhbE5hbWUgPSBpbnRyaW5zaWMubmFtZTtcblx0dmFyIHZhbHVlID0gaW50cmluc2ljLnZhbHVlO1xuXHR2YXIgc2tpcEZ1cnRoZXJDYWNoaW5nID0gZmFsc2U7XG5cblx0dmFyIGFsaWFzID0gaW50cmluc2ljLmFsaWFzO1xuXHRpZiAoYWxpYXMpIHtcblx0XHRpbnRyaW5zaWNCYXNlTmFtZSA9IGFsaWFzWzBdO1xuXHRcdCRzcGxpY2VBcHBseShwYXJ0cywgJGNvbmNhdChbMCwgMV0sIGFsaWFzKSk7XG5cdH1cblxuXHRmb3IgKHZhciBpID0gMSwgaXNPd24gPSB0cnVlOyBpIDwgcGFydHMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHR2YXIgcGFydCA9IHBhcnRzW2ldO1xuXHRcdHZhciBmaXJzdCA9ICRzdHJTbGljZShwYXJ0LCAwLCAxKTtcblx0XHR2YXIgbGFzdCA9ICRzdHJTbGljZShwYXJ0LCAtMSk7XG5cdFx0aWYgKFxuXHRcdFx0KFxuXHRcdFx0XHQoZmlyc3QgPT09ICdcIicgfHwgZmlyc3QgPT09IFwiJ1wiIHx8IGZpcnN0ID09PSAnYCcpXG5cdFx0XHRcdHx8IChsYXN0ID09PSAnXCInIHx8IGxhc3QgPT09IFwiJ1wiIHx8IGxhc3QgPT09ICdgJylcblx0XHRcdClcblx0XHRcdCYmIGZpcnN0ICE9PSBsYXN0XG5cdFx0KSB7XG5cdFx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdwcm9wZXJ0eSBuYW1lcyB3aXRoIHF1b3RlcyBtdXN0IGhhdmUgbWF0Y2hpbmcgcXVvdGVzJyk7XG5cdFx0fVxuXHRcdGlmIChwYXJ0ID09PSAnY29uc3RydWN0b3InIHx8ICFpc093bikge1xuXHRcdFx0c2tpcEZ1cnRoZXJDYWNoaW5nID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpbnRyaW5zaWNCYXNlTmFtZSArPSAnLicgKyBwYXJ0O1xuXHRcdGludHJpbnNpY1JlYWxOYW1lID0gJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJSc7XG5cblx0XHRpZiAoaGFzT3duKElOVFJJTlNJQ1MsIGludHJpbnNpY1JlYWxOYW1lKSkge1xuXHRcdFx0dmFsdWUgPSBJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcblx0XHRcdGlmICghKHBhcnQgaW4gdmFsdWUpKSB7XG5cdFx0XHRcdGlmICghYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Jhc2UgaW50cmluc2ljIGZvciAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgdGhlIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUuJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZvaWQgdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCRnT1BEICYmIChpICsgMSkgPj0gcGFydHMubGVuZ3RoKSB7XG5cdFx0XHRcdHZhciBkZXNjID0gJGdPUEQodmFsdWUsIHBhcnQpO1xuXHRcdFx0XHRpc093biA9ICEhZGVzYztcblxuXHRcdFx0XHQvLyBCeSBjb252ZW50aW9uLCB3aGVuIGEgZGF0YSBwcm9wZXJ0eSBpcyBjb252ZXJ0ZWQgdG8gYW4gYWNjZXNzb3Jcblx0XHRcdFx0Ly8gcHJvcGVydHkgdG8gZW11bGF0ZSBhIGRhdGEgcHJvcGVydHkgdGhhdCBkb2VzIG5vdCBzdWZmZXIgZnJvbVxuXHRcdFx0XHQvLyB0aGUgb3ZlcnJpZGUgbWlzdGFrZSwgdGhhdCBhY2Nlc3NvcidzIGdldHRlciBpcyBtYXJrZWQgd2l0aFxuXHRcdFx0XHQvLyBhbiBgb3JpZ2luYWxWYWx1ZWAgcHJvcGVydHkuIEhlcmUsIHdoZW4gd2UgZGV0ZWN0IHRoaXMsIHdlXG5cdFx0XHRcdC8vIHVwaG9sZCB0aGUgaWxsdXNpb24gYnkgcHJldGVuZGluZyB0byBzZWUgdGhhdCBvcmlnaW5hbCBkYXRhXG5cdFx0XHRcdC8vIHByb3BlcnR5LCBpLmUuLCByZXR1cm5pbmcgdGhlIHZhbHVlIHJhdGhlciB0aGFuIHRoZSBnZXR0ZXJcblx0XHRcdFx0Ly8gaXRzZWxmLlxuXHRcdFx0XHRpZiAoaXNPd24gJiYgJ2dldCcgaW4gZGVzYyAmJiAhKCdvcmlnaW5hbFZhbHVlJyBpbiBkZXNjLmdldCkpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGRlc2MuZ2V0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlzT3duID0gaGFzT3duKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzT3duICYmICFza2lwRnVydGhlckNhY2hpbmcpIHtcblx0XHRcdFx0SU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZGVmaW5lUHJvcGVydHklJywgdHJ1ZSkgfHwgZmFsc2U7XG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0JGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgdmFsdWU6IDEgfSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBkZWZpbmVQcm9wZXJ0eVxuXHRcdCRkZWZpbmVQcm9wZXJ0eSA9IGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gJGRlZmluZVByb3BlcnR5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgJGdPUEQgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJScsIHRydWUpO1xuXG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRChbXSwgJ2xlbmd0aCcpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZ09QRFxuXHRcdCRnT1BEID0gbnVsbDtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRnT1BEO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnZXMtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciAkU3ludGF4RXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvc3ludGF4Jyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG5cbnZhciBnb3BkID0gcmVxdWlyZSgnZ29wZCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVEYXRhUHJvcGVydHkoXG5cdG9iaixcblx0cHJvcGVydHksXG5cdHZhbHVlXG4pIHtcblx0aWYgKCFvYmogfHwgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmogIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BvYmpgIG11c3QgYmUgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb25gJyk7XG5cdH1cblx0aWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHByb3BlcnR5ICE9PSAnc3ltYm9sJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgcHJvcGVydHlgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2xgJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHR5cGVvZiBhcmd1bWVudHNbM10gIT09ICdib29sZWFuJyAmJiBhcmd1bWVudHNbM10gIT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYG5vbkVudW1lcmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNCAmJiB0eXBlb2YgYXJndW1lbnRzWzRdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzRdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25Xcml0YWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIHR5cGVvZiBhcmd1bWVudHNbNV0gIT09ICdib29sZWFuJyAmJiBhcmd1bWVudHNbNV0gIT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYG5vbkNvbmZpZ3VyYWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiA2ICYmIHR5cGVvZiBhcmd1bWVudHNbNl0gIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbG9vc2VgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdHZhciBub25FbnVtZXJhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXHR2YXIgbm9uV3JpdGFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNCA/IGFyZ3VtZW50c1s0XSA6IG51bGw7XG5cdHZhciBub25Db25maWd1cmFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNSA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG5cdHZhciBsb29zZSA9IGFyZ3VtZW50cy5sZW5ndGggPiA2ID8gYXJndW1lbnRzWzZdIDogZmFsc2U7XG5cblx0LyogQHR5cGUge2ZhbHNlIHwgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj59ICovXG5cdHZhciBkZXNjID0gISFnb3BkICYmIGdvcGQob2JqLCBwcm9wZXJ0eSk7XG5cblx0aWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5LCB7XG5cdFx0XHRjb25maWd1cmFibGU6IG5vbkNvbmZpZ3VyYWJsZSA9PT0gbnVsbCAmJiBkZXNjID8gZGVzYy5jb25maWd1cmFibGUgOiAhbm9uQ29uZmlndXJhYmxlLFxuXHRcdFx0ZW51bWVyYWJsZTogbm9uRW51bWVyYWJsZSA9PT0gbnVsbCAmJiBkZXNjID8gZGVzYy5lbnVtZXJhYmxlIDogIW5vbkVudW1lcmFibGUsXG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHR3cml0YWJsZTogbm9uV3JpdGFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2Mud3JpdGFibGUgOiAhbm9uV3JpdGFibGVcblx0XHR9KTtcblx0fSBlbHNlIGlmIChsb29zZSB8fCAoIW5vbkVudW1lcmFibGUgJiYgIW5vbldyaXRhYmxlICYmICFub25Db25maWd1cmFibGUpKSB7XG5cdFx0Ly8gbXVzdCBmYWxsIGJhY2sgdG8gW1tTZXRdXSwgYW5kIHdhcyBub3QgZXhwbGljaXRseSBhc2tlZCB0byBtYWtlIG5vbi1lbnVtZXJhYmxlLCBub24td3JpdGFibGUsIG9yIG5vbi1jb25maWd1cmFibGVcblx0XHRvYmpbcHJvcGVydHldID0gdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdUaGlzIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgZGVmaW5pbmcgYSBwcm9wZXJ0eSBhcyBub24tY29uZmlndXJhYmxlLCBub24td3JpdGFibGUsIG9yIG5vbi1lbnVtZXJhYmxlLicpO1xuXHR9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnZXMtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3JzID0gZnVuY3Rpb24gaGFzUHJvcGVydHlEZXNjcmlwdG9ycygpIHtcblx0cmV0dXJuICEhJGRlZmluZVByb3BlcnR5O1xufTtcblxuaGFzUHJvcGVydHlEZXNjcmlwdG9ycy5oYXNBcnJheUxlbmd0aERlZmluZUJ1ZyA9IGZ1bmN0aW9uIGhhc0FycmF5TGVuZ3RoRGVmaW5lQnVnKCkge1xuXHQvLyBub2RlIHYwLjYgaGFzIGEgYnVnIHdoZXJlIGFycmF5IGxlbmd0aHMgY2FuIGJlIFNldCBidXQgbm90IERlZmluZWRcblx0aWYgKCEkZGVmaW5lUHJvcGVydHkpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHR0cnkge1xuXHRcdHJldHVybiAkZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHZhbHVlOiAxIH0pLmxlbmd0aCAhPT0gMTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIEluIEZpcmVmb3ggNC0yMiwgZGVmaW5pbmcgbGVuZ3RoIG9uIGFuIGFycmF5IHRocm93cyBhbiBleGNlcHRpb24uXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUHJvcGVydHlEZXNjcmlwdG9ycztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtZGF0YS1wcm9wZXJ0eScpO1xudmFyIGhhc0Rlc2NyaXB0b3JzID0gcmVxdWlyZSgnaGFzLXByb3BlcnR5LWRlc2NyaXB0b3JzJykoKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnZ29wZCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG52YXIgJGZsb29yID0gR2V0SW50cmluc2ljKCclTWF0aC5mbG9vciUnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2V0RnVuY3Rpb25MZW5ndGgoZm4sIGxlbmd0aCkge1xuXHRpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BmbmAgaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0fVxuXHRpZiAodHlwZW9mIGxlbmd0aCAhPT0gJ251bWJlcicgfHwgbGVuZ3RoIDwgMCB8fCBsZW5ndGggPiAweEZGRkZGRkZGIHx8ICRmbG9vcihsZW5ndGgpICE9PSBsZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYGxlbmd0aGAgbXVzdCBiZSBhIHBvc2l0aXZlIDMyLWJpdCBpbnRlZ2VyJyk7XG5cdH1cblxuXHR2YXIgbG9vc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiAhIWFyZ3VtZW50c1syXTtcblxuXHR2YXIgZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZSA9IHRydWU7XG5cdHZhciBmdW5jdGlvbkxlbmd0aElzV3JpdGFibGUgPSB0cnVlO1xuXHRpZiAoJ2xlbmd0aCcgaW4gZm4gJiYgZ09QRCkge1xuXHRcdHZhciBkZXNjID0gZ09QRChmbiwgJ2xlbmd0aCcpO1xuXHRcdGlmIChkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSkge1xuXHRcdFx0ZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZSA9IGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoZGVzYyAmJiAhZGVzYy53cml0YWJsZSkge1xuXHRcdFx0ZnVuY3Rpb25MZW5ndGhJc1dyaXRhYmxlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGZ1bmN0aW9uTGVuZ3RoSXNDb25maWd1cmFibGUgfHwgZnVuY3Rpb25MZW5ndGhJc1dyaXRhYmxlIHx8ICFsb29zZSkge1xuXHRcdGlmIChoYXNEZXNjcmlwdG9ycykge1xuXHRcdFx0ZGVmaW5lKC8qKiBAdHlwZSB7UGFyYW1ldGVyczxkZWZpbmU+WzBdfSAqLyAoZm4pLCAnbGVuZ3RoJywgbGVuZ3RoLCB0cnVlLCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVmaW5lKC8qKiBAdHlwZSB7UGFyYW1ldGVyczxkZWZpbmU+WzBdfSAqLyAoZm4pLCAnbGVuZ3RoJywgbGVuZ3RoKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZuO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIHNldEZ1bmN0aW9uTGVuZ3RoID0gcmVxdWlyZSgnc2V0LWZ1bmN0aW9uLWxlbmd0aCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG52YXIgJGFwcGx5ID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5JScpO1xudmFyICRjYWxsID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwlJyk7XG52YXIgJHJlZmxlY3RBcHBseSA9IEdldEludHJpbnNpYygnJVJlZmxlY3QuYXBwbHklJywgdHJ1ZSkgfHwgYmluZC5jYWxsKCRjYWxsLCAkYXBwbHkpO1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnZXMtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgJG1heCA9IEdldEludHJpbnNpYygnJU1hdGgubWF4JScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCaW5kKG9yaWdpbmFsRnVuY3Rpb24pIHtcblx0aWYgKHR5cGVvZiBvcmlnaW5hbEZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2EgZnVuY3Rpb24gaXMgcmVxdWlyZWQnKTtcblx0fVxuXHR2YXIgZnVuYyA9ICRyZWZsZWN0QXBwbHkoYmluZCwgJGNhbGwsIGFyZ3VtZW50cyk7XG5cdHJldHVybiBzZXRGdW5jdGlvbkxlbmd0aChcblx0XHRmdW5jLFxuXHRcdDEgKyAkbWF4KDAsIG9yaWdpbmFsRnVuY3Rpb24ubGVuZ3RoIC0gKGFyZ3VtZW50cy5sZW5ndGggLSAxKSksXG5cdFx0dHJ1ZVxuXHQpO1xufTtcblxudmFyIGFwcGx5QmluZCA9IGZ1bmN0aW9uIGFwcGx5QmluZCgpIHtcblx0cmV0dXJuICRyZWZsZWN0QXBwbHkoYmluZCwgJGFwcGx5LCBhcmd1bWVudHMpO1xufTtcblxuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHQkZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdhcHBseScsIHsgdmFsdWU6IGFwcGx5QmluZCB9KTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzLmFwcGx5ID0gYXBwbHlCaW5kO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuLycpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kKGludHJpbnNpYyk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iLCJleHBvcnQgZGVmYXVsdCB7fSIsInZhciBoYXNNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIE1hcC5wcm90b3R5cGU7XG52YXIgbWFwU2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc01hcCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTWFwLnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgbWFwU2l6ZSA9IGhhc01hcCAmJiBtYXBTaXplRGVzY3JpcHRvciAmJiB0eXBlb2YgbWFwU2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gbWFwU2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBtYXBGb3JFYWNoID0gaGFzTWFwICYmIE1hcC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIFNldC5wcm90b3R5cGU7XG52YXIgc2V0U2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc1NldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU2V0LnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgc2V0U2l6ZSA9IGhhc1NldCAmJiBzZXRTaXplRGVzY3JpcHRvciAmJiB0eXBlb2Ygc2V0U2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gc2V0U2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBzZXRGb3JFYWNoID0gaGFzU2V0ICYmIFNldC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgV2Vha01hcC5wcm90b3R5cGU7XG52YXIgd2Vha01hcEhhcyA9IGhhc1dlYWtNYXAgPyBXZWFrTWFwLnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrU2V0LnByb3RvdHlwZTtcbnZhciB3ZWFrU2V0SGFzID0gaGFzV2Vha1NldCA/IFdlYWtTZXQucHJvdG90eXBlLmhhcyA6IG51bGw7XG52YXIgaGFzV2Vha1JlZiA9IHR5cGVvZiBXZWFrUmVmID09PSAnZnVuY3Rpb24nICYmIFdlYWtSZWYucHJvdG90eXBlO1xudmFyIHdlYWtSZWZEZXJlZiA9IGhhc1dlYWtSZWYgPyBXZWFrUmVmLnByb3RvdHlwZS5kZXJlZiA6IG51bGw7XG52YXIgYm9vbGVhblZhbHVlT2YgPSBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mO1xudmFyIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyICRtYXRjaCA9IFN0cmluZy5wcm90b3R5cGUubWF0Y2g7XG52YXIgJHNsaWNlID0gU3RyaW5nLnByb3RvdHlwZS5zbGljZTtcbnZhciAkcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciAkdG9VcHBlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvVXBwZXJDYXNlO1xudmFyICR0b0xvd2VyQ2FzZSA9IFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2U7XG52YXIgJHRlc3QgPSBSZWdFeHAucHJvdG90eXBlLnRlc3Q7XG52YXIgJGNvbmNhdCA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQ7XG52YXIgJGpvaW4gPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbnZhciAkYXJyU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgJGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBiaWdJbnRWYWx1ZU9mID0gdHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJyA/IEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZiA6IG51bGw7XG52YXIgZ09QUyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgc3ltVG9TdHJpbmcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnID8gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyA6IG51bGw7XG52YXIgaGFzU2hhbW1lZFN5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdvYmplY3QnO1xuLy8gaWUsIGBoYXMtdG9zdHJpbmd0YWcvc2hhbXNcbnZhciB0b1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnICYmICh0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSBoYXNTaGFtbWVkU3ltYm9scyA/ICdvYmplY3QnIDogJ3N5bWJvbCcpXG4gICAgPyBTeW1ib2wudG9TdHJpbmdUYWdcbiAgICA6IG51bGw7XG52YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxudmFyIGdQTyA9ICh0eXBlb2YgUmVmbGVjdCA9PT0gJ2Z1bmN0aW9uJyA/IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YgOiBPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHx8IChcbiAgICBbXS5fX3Byb3RvX18gPT09IEFycmF5LnByb3RvdHlwZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG4gICAgICAgID8gZnVuY3Rpb24gKE8pIHtcbiAgICAgICAgICAgIHJldHVybiBPLl9fcHJvdG9fXzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICB9XG4gICAgICAgIDogbnVsbFxuKTtcblxuZnVuY3Rpb24gYWRkTnVtZXJpY1NlcGFyYXRvcihudW0sIHN0cikge1xuICAgIGlmIChcbiAgICAgICAgbnVtID09PSBJbmZpbml0eVxuICAgICAgICB8fCBudW0gPT09IC1JbmZpbml0eVxuICAgICAgICB8fCBudW0gIT09IG51bVxuICAgICAgICB8fCAobnVtICYmIG51bSA+IC0xMDAwICYmIG51bSA8IDEwMDApXG4gICAgICAgIHx8ICR0ZXN0LmNhbGwoL2UvLCBzdHIpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHZhciBzZXBSZWdleCA9IC9bMC05XSg/PSg/OlswLTldezN9KSsoPyFbMC05XSkpL2c7XG4gICAgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBpbnQgPSBudW0gPCAwID8gLSRmbG9vcigtbnVtKSA6ICRmbG9vcihudW0pOyAvLyB0cnVuYyhudW0pXG4gICAgICAgIGlmIChpbnQgIT09IG51bSkge1xuICAgICAgICAgICAgdmFyIGludFN0ciA9IFN0cmluZyhpbnQpO1xuICAgICAgICAgICAgdmFyIGRlYyA9ICRzbGljZS5jYWxsKHN0ciwgaW50U3RyLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoaW50U3RyLCBzZXBSZWdleCwgJyQmXycpICsgJy4nICsgJHJlcGxhY2UuY2FsbCgkcmVwbGFjZS5jYWxsKGRlYywgLyhbMC05XXszfSkvZywgJyQmXycpLCAvXyQvLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoc3RyLCBzZXBSZWdleCwgJyQmXycpO1xufVxuXG52YXIgdXRpbEluc3BlY3QgPSByZXF1aXJlKCcuL3V0aWwuaW5zcGVjdCcpO1xudmFyIGluc3BlY3RDdXN0b20gPSB1dGlsSW5zcGVjdC5jdXN0b207XG52YXIgaW5zcGVjdFN5bWJvbCA9IGlzU3ltYm9sKGluc3BlY3RDdXN0b20pID8gaW5zcGVjdEN1c3RvbSA6IG51bGw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5zcGVjdF8ob2JqLCBvcHRpb25zLCBkZXB0aCwgc2Vlbikge1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGlmIChoYXMob3B0cywgJ3F1b3RlU3R5bGUnKSAmJiAob3B0cy5xdW90ZVN0eWxlICE9PSAnc2luZ2xlJyAmJiBvcHRzLnF1b3RlU3R5bGUgIT09ICdkb3VibGUnKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJxdW90ZVN0eWxlXCIgbXVzdCBiZSBcInNpbmdsZVwiIG9yIFwiZG91YmxlXCInKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICBoYXMob3B0cywgJ21heFN0cmluZ0xlbmd0aCcpICYmICh0eXBlb2Ygb3B0cy5tYXhTdHJpbmdMZW5ndGggPT09ICdudW1iZXInXG4gICAgICAgICAgICA/IG9wdHMubWF4U3RyaW5nTGVuZ3RoIDwgMCAmJiBvcHRzLm1heFN0cmluZ0xlbmd0aCAhPT0gSW5maW5pdHlcbiAgICAgICAgICAgIDogb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IG51bGxcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJtYXhTdHJpbmdMZW5ndGhcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBJbmZpbml0eSwgb3IgYG51bGxgJyk7XG4gICAgfVxuICAgIHZhciBjdXN0b21JbnNwZWN0ID0gaGFzKG9wdHMsICdjdXN0b21JbnNwZWN0JykgPyBvcHRzLmN1c3RvbUluc3BlY3QgOiB0cnVlO1xuICAgIGlmICh0eXBlb2YgY3VzdG9tSW5zcGVjdCAhPT0gJ2Jvb2xlYW4nICYmIGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcImN1c3RvbUluc3BlY3RcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgLCBgZmFsc2VgLCBvciBgXFwnc3ltYm9sXFwnYCcpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdpbmRlbnQnKVxuICAgICAgICAmJiBvcHRzLmluZGVudCAhPT0gbnVsbFxuICAgICAgICAmJiBvcHRzLmluZGVudCAhPT0gJ1xcdCdcbiAgICAgICAgJiYgIShwYXJzZUludChvcHRzLmluZGVudCwgMTApID09PSBvcHRzLmluZGVudCAmJiBvcHRzLmluZGVudCA+IDApXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcImluZGVudFwiIG11c3QgYmUgXCJcXFxcdFwiLCBhbiBpbnRlZ2VyID4gMCwgb3IgYG51bGxgJyk7XG4gICAgfVxuICAgIGlmIChoYXMob3B0cywgJ251bWVyaWNTZXBhcmF0b3InKSAmJiB0eXBlb2Ygb3B0cy5udW1lcmljU2VwYXJhdG9yICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibnVtZXJpY1NlcGFyYXRvclwiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCcpO1xuICAgIH1cbiAgICB2YXIgbnVtZXJpY1NlcGFyYXRvciA9IG9wdHMubnVtZXJpY1NlcGFyYXRvcjtcblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gb2JqID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RTdHJpbmcob2JqLCBvcHRzKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChvYmogPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBJbmZpbml0eSAvIG9iaiA+IDAgPyAnMCcgOiAnLTAnO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdHIgPSBTdHJpbmcob2JqKTtcbiAgICAgICAgcmV0dXJuIG51bWVyaWNTZXBhcmF0b3IgPyBhZGROdW1lcmljU2VwYXJhdG9yKG9iaiwgc3RyKSA6IHN0cjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHZhciBiaWdJbnRTdHIgPSBTdHJpbmcob2JqKSArICduJztcbiAgICAgICAgcmV0dXJuIG51bWVyaWNTZXBhcmF0b3IgPyBhZGROdW1lcmljU2VwYXJhdG9yKG9iaiwgYmlnSW50U3RyKSA6IGJpZ0ludFN0cjtcbiAgICB9XG5cbiAgICB2YXIgbWF4RGVwdGggPSB0eXBlb2Ygb3B0cy5kZXB0aCA9PT0gJ3VuZGVmaW5lZCcgPyA1IDogb3B0cy5kZXB0aDtcbiAgICBpZiAodHlwZW9mIGRlcHRoID09PSAndW5kZWZpbmVkJykgeyBkZXB0aCA9IDA7IH1cbiAgICBpZiAoZGVwdGggPj0gbWF4RGVwdGggJiYgbWF4RGVwdGggPiAwICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KG9iaikgPyAnW0FycmF5XScgOiAnW09iamVjdF0nO1xuICAgIH1cblxuICAgIHZhciBpbmRlbnQgPSBnZXRJbmRlbnQob3B0cywgZGVwdGgpO1xuXG4gICAgaWYgKHR5cGVvZiBzZWVuID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWVuID0gW107XG4gICAgfSBlbHNlIGlmIChpbmRleE9mKHNlZW4sIG9iaikgPj0gMCkge1xuICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3BlY3QodmFsdWUsIGZyb20sIG5vSW5kZW50KSB7XG4gICAgICAgIGlmIChmcm9tKSB7XG4gICAgICAgICAgICBzZWVuID0gJGFyclNsaWNlLmNhbGwoc2Vlbik7XG4gICAgICAgICAgICBzZWVuLnB1c2goZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vSW5kZW50KSB7XG4gICAgICAgICAgICB2YXIgbmV3T3B0cyA9IHtcbiAgICAgICAgICAgICAgICBkZXB0aDogb3B0cy5kZXB0aFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChoYXMob3B0cywgJ3F1b3RlU3R5bGUnKSkge1xuICAgICAgICAgICAgICAgIG5ld09wdHMucXVvdGVTdHlsZSA9IG9wdHMucXVvdGVTdHlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnNwZWN0Xyh2YWx1ZSwgbmV3T3B0cywgZGVwdGggKyAxLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG9wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicgJiYgIWlzUmVnRXhwKG9iaikpIHsgLy8gaW4gb2xkZXIgZW5naW5lcywgcmVnZXhlcyBhcmUgY2FsbGFibGVcbiAgICAgICAgdmFyIG5hbWUgPSBuYW1lT2Yob2JqKTtcbiAgICAgICAgdmFyIGtleXMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIHJldHVybiAnW0Z1bmN0aW9uJyArIChuYW1lID8gJzogJyArIG5hbWUgOiAnIChhbm9ueW1vdXMpJykgKyAnXScgKyAoa2V5cy5sZW5ndGggPiAwID8gJyB7ICcgKyAkam9pbi5jYWxsKGtleXMsICcsICcpICsgJyB9JyA6ICcnKTtcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKG9iaikpIHtcbiAgICAgICAgdmFyIHN5bVN0cmluZyA9IGhhc1NoYW1tZWRTeW1ib2xzID8gJHJlcGxhY2UuY2FsbChTdHJpbmcob2JqKSwgL14oU3ltYm9sXFwoLipcXCkpX1teKV0qJC8sICckMScpIDogc3ltVG9TdHJpbmcuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIWhhc1NoYW1tZWRTeW1ib2xzID8gbWFya0JveGVkKHN5bVN0cmluZykgOiBzeW1TdHJpbmc7XG4gICAgfVxuICAgIGlmIChpc0VsZW1lbnQob2JqKSkge1xuICAgICAgICB2YXIgcyA9ICc8JyArICR0b0xvd2VyQ2FzZS5jYWxsKFN0cmluZyhvYmoubm9kZU5hbWUpKTtcbiAgICAgICAgdmFyIGF0dHJzID0gb2JqLmF0dHJpYnV0ZXMgfHwgW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHMgKz0gJyAnICsgYXR0cnNbaV0ubmFtZSArICc9JyArIHdyYXBRdW90ZXMocXVvdGUoYXR0cnNbaV0udmFsdWUpLCAnZG91YmxlJywgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcyArPSAnPic7XG4gICAgICAgIGlmIChvYmouY2hpbGROb2RlcyAmJiBvYmouY2hpbGROb2Rlcy5sZW5ndGgpIHsgcyArPSAnLi4uJzsgfVxuICAgICAgICBzICs9ICc8LycgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSkgKyAnPic7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChvYmoubGVuZ3RoID09PSAwKSB7IHJldHVybiAnW10nOyB9XG4gICAgICAgIHZhciB4cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKGluZGVudCAmJiAhc2luZ2xlTGluZVZhbHVlcyh4cykpIHtcbiAgICAgICAgICAgIHJldHVybiAnWycgKyBpbmRlbnRlZEpvaW4oeHMsIGluZGVudCkgKyAnXSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdbICcgKyAkam9pbi5jYWxsKHhzLCAnLCAnKSArICcgXSc7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKG9iaikpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICBpZiAoISgnY2F1c2UnIGluIEVycm9yLnByb3RvdHlwZSkgJiYgJ2NhdXNlJyBpbiBvYmogJiYgIWlzRW51bWVyYWJsZS5jYWxsKG9iaiwgJ2NhdXNlJykpIHtcbiAgICAgICAgICAgIHJldHVybiAneyBbJyArIFN0cmluZyhvYmopICsgJ10gJyArICRqb2luLmNhbGwoJGNvbmNhdC5jYWxsKCdbY2F1c2VdOiAnICsgaW5zcGVjdChvYmouY2F1c2UpLCBwYXJ0cyksICcsICcpICsgJyB9JztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAwKSB7IHJldHVybiAnWycgKyBTdHJpbmcob2JqKSArICddJzsgfVxuICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKHBhcnRzLCAnLCAnKSArICcgfSc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBjdXN0b21JbnNwZWN0KSB7XG4gICAgICAgIGlmIChpbnNwZWN0U3ltYm9sICYmIHR5cGVvZiBvYmpbaW5zcGVjdFN5bWJvbF0gPT09ICdmdW5jdGlvbicgJiYgdXRpbEluc3BlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlsSW5zcGVjdChvYmosIHsgZGVwdGg6IG1heERlcHRoIC0gZGVwdGggfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VzdG9tSW5zcGVjdCAhPT0gJ3N5bWJvbCcgJiYgdHlwZW9mIG9iai5pbnNwZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLmluc3BlY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNNYXAob2JqKSkge1xuICAgICAgICB2YXIgbWFwUGFydHMgPSBbXTtcbiAgICAgICAgaWYgKG1hcEZvckVhY2gpIHtcbiAgICAgICAgICAgIG1hcEZvckVhY2guY2FsbChvYmosIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgbWFwUGFydHMucHVzaChpbnNwZWN0KGtleSwgb2JqLCB0cnVlKSArICcgPT4gJyArIGluc3BlY3QodmFsdWUsIG9iaikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZignTWFwJywgbWFwU2l6ZS5jYWxsKG9iaiksIG1hcFBhcnRzLCBpbmRlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNTZXQob2JqKSkge1xuICAgICAgICB2YXIgc2V0UGFydHMgPSBbXTtcbiAgICAgICAgaWYgKHNldEZvckVhY2gpIHtcbiAgICAgICAgICAgIHNldEZvckVhY2guY2FsbChvYmosIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHNldFBhcnRzLnB1c2goaW5zcGVjdCh2YWx1ZSwgb2JqKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mKCdTZXQnLCBzZXRTaXplLmNhbGwob2JqKSwgc2V0UGFydHMsIGluZGVudCk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtNYXAob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha01hcCcpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrU2V0KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtTZXQnKTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha1JlZihvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrUmVmJyk7XG4gICAgfVxuICAgIGlmIChpc051bWJlcihvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChOdW1iZXIob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoaXNCaWdJbnQob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoYmlnSW50VmFsdWVPZi5jYWxsKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQm9vbGVhbihvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoYm9vbGVhblZhbHVlT2YuY2FsbChvYmopKTtcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KFN0cmluZyhvYmopKSk7XG4gICAgfVxuICAgIC8vIG5vdGU6IGluIElFIDgsIHNvbWV0aW1lcyBgZ2xvYmFsICE9PSB3aW5kb3dgIGJ1dCBib3RoIGFyZSB0aGUgcHJvdG90eXBlcyBvZiBlYWNoIG90aGVyXG4gICAgLyogZXNsaW50LWVudiBicm93c2VyICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIG9iaiA9PT0gd2luZG93KSB7XG4gICAgICAgIHJldHVybiAneyBbb2JqZWN0IFdpbmRvd10gfSc7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBvYmogPT09IGdsb2JhbFRoaXMpXG4gICAgICAgIHx8ICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBvYmogPT09IGdsb2JhbClcbiAgICApIHtcbiAgICAgICAgcmV0dXJuICd7IFtvYmplY3QgZ2xvYmFsVGhpc10gfSc7XG4gICAgfVxuICAgIGlmICghaXNEYXRlKG9iaikgJiYgIWlzUmVnRXhwKG9iaikpIHtcbiAgICAgICAgdmFyIHlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICB2YXIgaXNQbGFpbk9iamVjdCA9IGdQTyA/IGdQTyhvYmopID09PSBPYmplY3QucHJvdG90eXBlIDogb2JqIGluc3RhbmNlb2YgT2JqZWN0IHx8IG9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0O1xuICAgICAgICB2YXIgcHJvdG9UYWcgPSBvYmogaW5zdGFuY2VvZiBPYmplY3QgPyAnJyA6ICdudWxsIHByb3RvdHlwZSc7XG4gICAgICAgIHZhciBzdHJpbmdUYWcgPSAhaXNQbGFpbk9iamVjdCAmJiB0b1N0cmluZ1RhZyAmJiBPYmplY3Qob2JqKSA9PT0gb2JqICYmIHRvU3RyaW5nVGFnIGluIG9iaiA/ICRzbGljZS5jYWxsKHRvU3RyKG9iaiksIDgsIC0xKSA6IHByb3RvVGFnID8gJ09iamVjdCcgOiAnJztcbiAgICAgICAgdmFyIGNvbnN0cnVjdG9yVGFnID0gaXNQbGFpbk9iamVjdCB8fCB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yICE9PSAnZnVuY3Rpb24nID8gJycgOiBvYmouY29uc3RydWN0b3IubmFtZSA/IG9iai5jb25zdHJ1Y3Rvci5uYW1lICsgJyAnIDogJyc7XG4gICAgICAgIHZhciB0YWcgPSBjb25zdHJ1Y3RvclRhZyArIChzdHJpbmdUYWcgfHwgcHJvdG9UYWcgPyAnWycgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbChbXSwgc3RyaW5nVGFnIHx8IFtdLCBwcm90b1RhZyB8fCBbXSksICc6ICcpICsgJ10gJyA6ICcnKTtcbiAgICAgICAgaWYgKHlzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gdGFnICsgJ3t9JzsgfVxuICAgICAgICBpZiAoaW5kZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFnICsgJ3snICsgaW5kZW50ZWRKb2luKHlzLCBpbmRlbnQpICsgJ30nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWcgKyAneyAnICsgJGpvaW4uY2FsbCh5cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKG9iaik7XG59O1xuXG5mdW5jdGlvbiB3cmFwUXVvdGVzKHMsIGRlZmF1bHRTdHlsZSwgb3B0cykge1xuICAgIHZhciBxdW90ZUNoYXIgPSAob3B0cy5xdW90ZVN0eWxlIHx8IGRlZmF1bHRTdHlsZSkgPT09ICdkb3VibGUnID8gJ1wiJyA6IFwiJ1wiO1xuICAgIHJldHVybiBxdW90ZUNoYXIgKyBzICsgcXVvdGVDaGFyO1xufVxuXG5mdW5jdGlvbiBxdW90ZShzKSB7XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoU3RyaW5nKHMpLCAvXCIvZywgJyZxdW90OycpO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5KG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzRGF0ZShvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IERhdGVdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc0Vycm9yKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzU3RyaW5nKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgU3RyaW5nXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc051bWJlcihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNCb29sZWFuKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgQm9vbGVhbl0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuXG4vLyBTeW1ib2wgYW5kIEJpZ0ludCBkbyBoYXZlIFN5bWJvbC50b1N0cmluZ1RhZyBieSBzcGVjLCBzbyB0aGF0IGNhbid0IGJlIHVzZWQgdG8gZWxpbWluYXRlIGZhbHNlIHBvc2l0aXZlc1xuZnVuY3Rpb24gaXNTeW1ib2wob2JqKSB7XG4gICAgaWYgKGhhc1NoYW1tZWRTeW1ib2xzKSB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqIGluc3RhbmNlb2YgU3ltYm9sO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8ICFzeW1Ub1N0cmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzQmlnSW50KG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8ICFiaWdJbnRWYWx1ZU9mKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgYmlnSW50VmFsdWVPZi5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSB8fCBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgaW4gdGhpczsgfTtcbmZ1bmN0aW9uIGhhcyhvYmosIGtleSkge1xuICAgIHJldHVybiBoYXNPd24uY2FsbChvYmosIGtleSk7XG59XG5cbmZ1bmN0aW9uIHRvU3RyKG9iaikge1xuICAgIHJldHVybiBvYmplY3RUb1N0cmluZy5jYWxsKG9iaik7XG59XG5cbmZ1bmN0aW9uIG5hbWVPZihmKSB7XG4gICAgaWYgKGYubmFtZSkgeyByZXR1cm4gZi5uYW1lOyB9XG4gICAgdmFyIG0gPSAkbWF0Y2guY2FsbChmdW5jdGlvblRvU3RyaW5nLmNhbGwoZiksIC9eZnVuY3Rpb25cXHMqKFtcXHckXSspLyk7XG4gICAgaWYgKG0pIHsgcmV0dXJuIG1bMV07IH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICAgIGlmICh4cy5pbmRleE9mKSB7IHJldHVybiB4cy5pbmRleE9mKHgpOyB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKHhzW2ldID09PSB4KSB7IHJldHVybiBpOyB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gaXNNYXAoeCkge1xuICAgIGlmICghbWFwU2l6ZSB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBtYXBTaXplLmNhbGwoeCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZXRTaXplLmNhbGwoeCk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrTWFwKHgpIHtcbiAgICBpZiAoIXdlYWtNYXBIYXMgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgd2Vha01hcEhhcy5jYWxsKHgsIHdlYWtNYXBIYXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2Vha1NldEhhcy5jYWxsKHgsIHdlYWtTZXRIYXMpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdlYWtNYXA7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1dlYWtSZWYoeCkge1xuICAgIGlmICghd2Vha1JlZkRlcmVmIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtSZWZEZXJlZi5jYWxsKHgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNTZXQoeCkge1xuICAgIGlmICghc2V0U2l6ZSB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzZXRTaXplLmNhbGwoeCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXBTaXplLmNhbGwoeCk7XG4gICAgICAgIH0gY2F0Y2ggKG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrU2V0KHgpIHtcbiAgICBpZiAoIXdlYWtTZXRIYXMgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgd2Vha1NldEhhcy5jYWxsKHgsIHdlYWtTZXRIYXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2Vha01hcEhhcy5jYWxsKHgsIHdlYWtNYXBIYXMpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdlYWtTZXQ7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnQoeCkge1xuICAgIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgeCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIHgubm9kZU5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB4LmdldEF0dHJpYnV0ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaW5zcGVjdFN0cmluZyhzdHIsIG9wdHMpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IG9wdHMubWF4U3RyaW5nTGVuZ3RoKSB7XG4gICAgICAgIHZhciByZW1haW5pbmcgPSBzdHIubGVuZ3RoIC0gb3B0cy5tYXhTdHJpbmdMZW5ndGg7XG4gICAgICAgIHZhciB0cmFpbGVyID0gJy4uLiAnICsgcmVtYWluaW5nICsgJyBtb3JlIGNoYXJhY3RlcicgKyAocmVtYWluaW5nID4gMSA/ICdzJyA6ICcnKTtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RTdHJpbmcoJHNsaWNlLmNhbGwoc3RyLCAwLCBvcHRzLm1heFN0cmluZ0xlbmd0aCksIG9wdHMpICsgdHJhaWxlcjtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbiAgICB2YXIgcyA9ICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChzdHIsIC8oWydcXFxcXSkvZywgJ1xcXFwkMScpLCAvW1xceDAwLVxceDFmXS9nLCBsb3dieXRlKTtcbiAgICByZXR1cm4gd3JhcFF1b3RlcyhzLCAnc2luZ2xlJywgb3B0cyk7XG59XG5cbmZ1bmN0aW9uIGxvd2J5dGUoYykge1xuICAgIHZhciBuID0gYy5jaGFyQ29kZUF0KDApO1xuICAgIHZhciB4ID0ge1xuICAgICAgICA4OiAnYicsXG4gICAgICAgIDk6ICd0JyxcbiAgICAgICAgMTA6ICduJyxcbiAgICAgICAgMTI6ICdmJyxcbiAgICAgICAgMTM6ICdyJ1xuICAgIH1bbl07XG4gICAgaWYgKHgpIHsgcmV0dXJuICdcXFxcJyArIHg7IH1cbiAgICByZXR1cm4gJ1xcXFx4JyArIChuIDwgMHgxMCA/ICcwJyA6ICcnKSArICR0b1VwcGVyQ2FzZS5jYWxsKG4udG9TdHJpbmcoMTYpKTtcbn1cblxuZnVuY3Rpb24gbWFya0JveGVkKHN0cikge1xuICAgIHJldHVybiAnT2JqZWN0KCcgKyBzdHIgKyAnKSc7XG59XG5cbmZ1bmN0aW9uIHdlYWtDb2xsZWN0aW9uT2YodHlwZSkge1xuICAgIHJldHVybiB0eXBlICsgJyB7ID8gfSc7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3Rpb25PZih0eXBlLCBzaXplLCBlbnRyaWVzLCBpbmRlbnQpIHtcbiAgICB2YXIgam9pbmVkRW50cmllcyA9IGluZGVudCA/IGluZGVudGVkSm9pbihlbnRyaWVzLCBpbmRlbnQpIDogJGpvaW4uY2FsbChlbnRyaWVzLCAnLCAnKTtcbiAgICByZXR1cm4gdHlwZSArICcgKCcgKyBzaXplICsgJykgeycgKyBqb2luZWRFbnRyaWVzICsgJ30nO1xufVxuXG5mdW5jdGlvbiBzaW5nbGVMaW5lVmFsdWVzKHhzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaW5kZXhPZih4c1tpXSwgJ1xcbicpID49IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKSB7XG4gICAgdmFyIGJhc2VJbmRlbnQ7XG4gICAgaWYgKG9wdHMuaW5kZW50ID09PSAnXFx0Jykge1xuICAgICAgICBiYXNlSW5kZW50ID0gJ1xcdCc7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0cy5pbmRlbnQgPT09ICdudW1iZXInICYmIG9wdHMuaW5kZW50ID4gMCkge1xuICAgICAgICBiYXNlSW5kZW50ID0gJGpvaW4uY2FsbChBcnJheShvcHRzLmluZGVudCArIDEpLCAnICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBiYXNlOiBiYXNlSW5kZW50LFxuICAgICAgICBwcmV2OiAkam9pbi5jYWxsKEFycmF5KGRlcHRoICsgMSksIGJhc2VJbmRlbnQpXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpIHtcbiAgICBpZiAoeHMubGVuZ3RoID09PSAwKSB7IHJldHVybiAnJzsgfVxuICAgIHZhciBsaW5lSm9pbmVyID0gJ1xcbicgKyBpbmRlbnQucHJldiArIGluZGVudC5iYXNlO1xuICAgIHJldHVybiBsaW5lSm9pbmVyICsgJGpvaW4uY2FsbCh4cywgJywnICsgbGluZUpvaW5lcikgKyAnXFxuJyArIGluZGVudC5wcmV2O1xufVxuXG5mdW5jdGlvbiBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCkge1xuICAgIHZhciBpc0FyciA9IGlzQXJyYXkob2JqKTtcbiAgICB2YXIgeHMgPSBbXTtcbiAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgeHMubGVuZ3RoID0gb2JqLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHhzW2ldID0gaGFzKG9iaiwgaSkgPyBpbnNwZWN0KG9ialtpXSwgb2JqKSA6ICcnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBzeW1zID0gdHlwZW9mIGdPUFMgPT09ICdmdW5jdGlvbicgPyBnT1BTKG9iaikgOiBbXTtcbiAgICB2YXIgc3ltTWFwO1xuICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scykge1xuICAgICAgICBzeW1NYXAgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzeW1zLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBzeW1NYXBbJyQnICsgc3ltc1trXV0gPSBzeW1zW2tdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIga2V5IGluIG9iaikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgIGlmICghaGFzKG9iaiwga2V5KSkgeyBjb250aW51ZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICBpZiAoaXNBcnIgJiYgU3RyaW5nKE51bWJlcihrZXkpKSA9PT0ga2V5ICYmIGtleSA8IG9iai5sZW5ndGgpIHsgY29udGludWU7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgaWYgKGhhc1NoYW1tZWRTeW1ib2xzICYmIHN5bU1hcFsnJCcgKyBrZXldIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHByZXZlbnQgc2hhbW1lZCBTeW1ib2xzLCB3aGljaCBhcmUgc3RvcmVkIGFzIHN0cmluZ3MsIGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIHN0cmluZyBrZXkgc2VjdGlvblxuICAgICAgICAgICAgY29udGludWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoJHRlc3QuY2FsbCgvW15cXHckXS8sIGtleSkpIHtcbiAgICAgICAgICAgIHhzLnB1c2goaW5zcGVjdChrZXksIG9iaikgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4cy5wdXNoKGtleSArICc6ICcgKyBpbnNwZWN0KG9ialtrZXldLCBvYmopKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGdPUFMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzeW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoaXNFbnVtZXJhYmxlLmNhbGwob2JqLCBzeW1zW2pdKSkge1xuICAgICAgICAgICAgICAgIHhzLnB1c2goJ1snICsgaW5zcGVjdChzeW1zW2pdKSArICddOiAnICsgaW5zcGVjdChvYmpbc3ltc1tqXV0sIG9iaikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB4cztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgaW5zcGVjdCA9IHJlcXVpcmUoJ29iamVjdC1pbnNwZWN0Jyk7XG5cbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcbnZhciAkV2Vha01hcCA9IEdldEludHJpbnNpYygnJVdlYWtNYXAlJywgdHJ1ZSk7XG52YXIgJE1hcCA9IEdldEludHJpbnNpYygnJU1hcCUnLCB0cnVlKTtcblxudmFyICR3ZWFrTWFwR2V0ID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5nZXQnLCB0cnVlKTtcbnZhciAkd2Vha01hcFNldCA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuc2V0JywgdHJ1ZSk7XG52YXIgJHdlYWtNYXBIYXMgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLmhhcycsIHRydWUpO1xudmFyICRtYXBHZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG52YXIgJG1hcFNldCA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5zZXQnLCB0cnVlKTtcbnZhciAkbWFwSGFzID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmhhcycsIHRydWUpO1xuXG4vKlxuKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgbGlzdCByZXR1cm5pbmcgdGhlIG5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4ga2V5LlxuKlxuKiBUaGF0IG5vZGUgaXMgYWxzbyBtb3ZlZCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgc28gdGhhdCBpZiBpdCdzIGFjY2Vzc2VkIGFnYWluIHdlIGRvbid0IG5lZWQgdG8gdHJhdmVyc2UgdGhlIHdob2xlIGxpc3QuIEJ5IGRvaW5nIHNvLCBhbGwgdGhlIHJlY2VudGx5IHVzZWQgbm9kZXMgY2FuIGJlIGFjY2Vzc2VkIHJlbGF0aXZlbHkgcXVpY2tseS5cbiovXG4vKiogQHR5cGUge2ltcG9ydCgnLicpLmxpc3RHZXROb2RlfSAqL1xudmFyIGxpc3RHZXROb2RlID0gZnVuY3Rpb24gKGxpc3QsIGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdC8qKiBAdHlwZSB7dHlwZW9mIGxpc3QgfCBOb25OdWxsYWJsZTwodHlwZW9mIGxpc3QpWyduZXh0J10+fSAqL1xuXHR2YXIgcHJldiA9IGxpc3Q7XG5cdC8qKiBAdHlwZSB7KHR5cGVvZiBsaXN0KVsnbmV4dCddfSAqL1xuXHR2YXIgY3Vycjtcblx0Zm9yICg7IChjdXJyID0gcHJldi5uZXh0KSAhPT0gbnVsbDsgcHJldiA9IGN1cnIpIHtcblx0XHRpZiAoY3Vyci5rZXkgPT09IGtleSkge1xuXHRcdFx0cHJldi5uZXh0ID0gY3Vyci5uZXh0O1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHRcdFx0Y3Vyci5uZXh0ID0gLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgbGlzdC5uZXh0Pn0gKi8gKGxpc3QubmV4dCk7XG5cdFx0XHRsaXN0Lm5leHQgPSBjdXJyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG5cdFx0XHRyZXR1cm4gY3Vycjtcblx0XHR9XG5cdH1cbn07XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJykubGlzdEdldH0gKi9cbnZhciBsaXN0R2V0ID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSkge1xuXHR2YXIgbm9kZSA9IGxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG5cdHJldHVybiBub2RlICYmIG5vZGUudmFsdWU7XG59O1xuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5saXN0U2V0fSAqL1xudmFyIGxpc3RTZXQgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5LCB2YWx1ZSkge1xuXHR2YXIgbm9kZSA9IGxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG5cdGlmIChub2RlKSB7XG5cdFx0bm9kZS52YWx1ZSA9IHZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFByZXBlbmQgdGhlIG5ldyBub2RlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3Rcblx0XHRvYmplY3RzLm5leHQgPSAvKiogQHR5cGUge2ltcG9ydCgnLicpLkxpc3ROb2RlPHR5cGVvZiB2YWx1ZT59ICovICh7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24sIG5vLWV4dHJhLXBhcmVuc1xuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHRuZXh0OiBvYmplY3RzLm5leHQsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9KTtcblx0fVxufTtcbi8qKiBAdHlwZSB7aW1wb3J0KCcuJykubGlzdEhhc30gKi9cbnZhciBsaXN0SGFzID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSkge1xuXHRyZXR1cm4gISFsaXN0R2V0Tm9kZShvYmplY3RzLCBrZXkpO1xufTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0U2lkZUNoYW5uZWwoKSB7XG5cdC8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIHVua25vd24+fSAqLyB2YXIgJHdtO1xuXHQvKiogQHR5cGUge01hcDxvYmplY3QsIHVua25vd24+fSAqLyB2YXIgJG07XG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuJykuUm9vdE5vZGU8dW5rbm93bj59ICovIHZhciAkbztcblxuXHQvKiogQHR5cGUge2ltcG9ydCgnLicpLkNoYW5uZWx9ICovXG5cdHZhciBjaGFubmVsID0ge1xuXHRcdGFzc2VydDogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0aWYgKCFjaGFubmVsLmhhcyhrZXkpKSB7XG5cdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdTaWRlIGNoYW5uZWwgZG9lcyBub3QgY29udGFpbiAnICsgaW5zcGVjdChrZXkpKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGdldDogZnVuY3Rpb24gKGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoJHdtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICR3ZWFrTWFwR2V0KCR3bSwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICgkTWFwKSB7XG5cdFx0XHRcdGlmICgkbSkge1xuXHRcdFx0XHRcdHJldHVybiAkbWFwR2V0KCRtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoJG8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1sb25lbHktaWZcblx0XHRcdFx0XHRyZXR1cm4gbGlzdEdldCgkbywga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aGFzOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoJHdtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICR3ZWFrTWFwSGFzKCR3bSwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICgkTWFwKSB7XG5cdFx0XHRcdGlmICgkbSkge1xuXHRcdFx0XHRcdHJldHVybiAkbWFwSGFzKCRtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoJG8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1sb25lbHktaWZcblx0XHRcdFx0XHRyZXR1cm4gbGlzdEhhcygkbywga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCRXZWFrTWFwICYmIGtleSAmJiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0aWYgKCEkd20pIHtcblx0XHRcdFx0XHQkd20gPSBuZXcgJFdlYWtNYXAoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkd2Vha01hcFNldCgkd20sIGtleSwgdmFsdWUpO1xuXHRcdFx0fSBlbHNlIGlmICgkTWFwKSB7XG5cdFx0XHRcdGlmICghJG0pIHtcblx0XHRcdFx0XHQkbSA9IG5ldyAkTWFwKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0JG1hcFNldCgkbSwga2V5LCB2YWx1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoISRvKSB7XG5cdFx0XHRcdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgbGlua2VkIGxpc3QgYXMgYW4gZW1wdHkgbm9kZSwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHNwZWNpYWwtY2FzZSBoYW5kbGluZyBvZiB0aGUgZmlyc3Qgbm9kZTogd2UgY2FuIGFsd2F5cyByZWZlciB0byBpdCBhcyAocHJldmlvdXMgbm9kZSkubmV4dCwgaW5zdGVhZCBvZiBzb21ldGhpbmcgbGlrZSAobGlzdCkuaGVhZFxuXHRcdFx0XHRcdCRvID0geyBrZXk6IHt9LCBuZXh0OiBudWxsIH07XG5cdFx0XHRcdH1cblx0XHRcdFx0bGlzdFNldCgkbywga2V5LCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gY2hhbm5lbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xudmFyIHBlcmNlbnRUd2VudGllcyA9IC8lMjAvZztcblxudmFyIEZvcm1hdCA9IHtcbiAgICBSRkMxNzM4OiAnUkZDMTczOCcsXG4gICAgUkZDMzk4NjogJ1JGQzM5ODYnXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZGVmYXVsdCc6IEZvcm1hdC5SRkMzOTg2LFxuICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgICAgUkZDMTczODogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZS5jYWxsKHZhbHVlLCBwZXJjZW50VHdlbnRpZXMsICcrJyk7XG4gICAgICAgIH0sXG4gICAgICAgIFJGQzM5ODY6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFJGQzE3Mzg6IEZvcm1hdC5SRkMxNzM4LFxuICAgIFJGQzM5ODY6IEZvcm1hdC5SRkMzOTg2XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxudmFyIGhleFRhYmxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gICAgICAgIGFycmF5LnB1c2goJyUnICsgKChpIDwgMTYgPyAnMCcgOiAnJykgKyBpLnRvU3RyaW5nKDE2KSkudG9VcHBlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5O1xufSgpKTtcblxudmFyIGNvbXBhY3RRdWV1ZSA9IGZ1bmN0aW9uIGNvbXBhY3RRdWV1ZShxdWV1ZSkge1xuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgIHZhciBpdGVtID0gcXVldWUucG9wKCk7XG4gICAgICAgIHZhciBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHZhciBjb21wYWN0ZWQgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvYmoubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ialtqXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGFjdGVkLnB1c2gob2JqW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGl0ZW0ub2JqW2l0ZW0ucHJvcF0gPSBjb21wYWN0ZWQ7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgYXJyYXlUb09iamVjdCA9IGZ1bmN0aW9uIGFycmF5VG9PYmplY3Qoc291cmNlLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2VbaV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvYmpbaV0gPSBzb3VyY2VbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxudmFyIG1lcmdlID0gZnVuY3Rpb24gbWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAvKiBlc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246IDAgKi9cbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaChzb3VyY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKChvcHRpb25zICYmIChvcHRpb25zLnBsYWluT2JqZWN0cyB8fCBvcHRpb25zLmFsbG93UHJvdG90eXBlcykpIHx8ICFoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3NvdXJjZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFt0YXJnZXQsIHNvdXJjZV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0IHx8IHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBbdGFyZ2V0XS5jb25jYXQoc291cmNlKTtcbiAgICB9XG5cbiAgICB2YXIgbWVyZ2VUYXJnZXQgPSB0YXJnZXQ7XG4gICAgaWYgKGlzQXJyYXkodGFyZ2V0KSAmJiAhaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIG1lcmdlVGFyZ2V0ID0gYXJyYXlUb09iamVjdCh0YXJnZXQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIHNvdXJjZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgICAgICAgICBpZiAoaGFzLmNhbGwodGFyZ2V0LCBpKSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRJdGVtID0gdGFyZ2V0W2ldO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRJdGVtICYmIHR5cGVvZiB0YXJnZXRJdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBtZXJnZSh0YXJnZXRJdGVtLCBpdGVtLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gc291cmNlW2tleV07XG5cbiAgICAgICAgaWYgKGhhcy5jYWxsKGFjYywga2V5KSkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBtZXJnZShhY2Nba2V5XSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIG1lcmdlVGFyZ2V0KTtcbn07XG5cbnZhciBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ25TaW5nbGVTb3VyY2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIGFjY1trZXldID0gc291cmNlW2tleV07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgdGFyZ2V0KTtcbn07XG5cbnZhciBkZWNvZGUgPSBmdW5jdGlvbiAoc3RyLCBkZWNvZGVyLCBjaGFyc2V0KSB7XG4gICAgdmFyIHN0cldpdGhvdXRQbHVzID0gc3RyLnJlcGxhY2UoL1xcKy9nLCAnICcpO1xuICAgIGlmIChjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgLy8gdW5lc2NhcGUgbmV2ZXIgdGhyb3dzLCBubyB0cnkuLi5jYXRjaCBuZWVkZWQ6XG4gICAgICAgIHJldHVybiBzdHJXaXRob3V0UGx1cy5yZXBsYWNlKC8lWzAtOWEtZl17Mn0vZ2ksIHVuZXNjYXBlKTtcbiAgICB9XG4gICAgLy8gdXRmLThcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cldpdGhvdXRQbHVzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzdHJXaXRob3V0UGx1cztcbiAgICB9XG59O1xuXG52YXIgbGltaXQgPSAxMDI0O1xuXG4vKiBlc2xpbnQgb3BlcmF0b3ItbGluZWJyZWFrOiBbMiwgXCJiZWZvcmVcIl0gKi9cblxudmFyIGVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIsIGRlZmF1bHRFbmNvZGVyLCBjaGFyc2V0LCBraW5kLCBmb3JtYXQpIHtcbiAgICAvLyBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBCcmlhbiBXaGl0ZSAobXNjZGV4KSBmb3IgdGhlIGlvLmpzIGNvcmUgcXVlcnlzdHJpbmcgbGlicmFyeS5cbiAgICAvLyBJdCBoYXMgYmVlbiBhZGFwdGVkIGhlcmUgZm9yIHN0cmljdGVyIGFkaGVyZW5jZSB0byBSRkMgMzk4NlxuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgdmFyIHN0cmluZyA9IHN0cjtcbiAgICBpZiAodHlwZW9mIHN0ciA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgc3RyaW5nID0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN0cik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICBzdHJpbmcgPSBTdHJpbmcoc3RyKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHJldHVybiBlc2NhcGUoc3RyaW5nKS5yZXBsYWNlKC8ldVswLTlhLWZdezR9L2dpLCBmdW5jdGlvbiAoJDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJTI2JTIzJyArIHBhcnNlSW50KCQwLnNsaWNlKDIpLCAxNikgKyAnJTNCJztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIG91dCA9ICcnO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3RyaW5nLmxlbmd0aDsgaiArPSBsaW1pdCkge1xuICAgICAgICB2YXIgc2VnbWVudCA9IHN0cmluZy5sZW5ndGggPj0gbGltaXQgPyBzdHJpbmcuc2xpY2UoaiwgaiArIGxpbWl0KSA6IHN0cmluZztcbiAgICAgICAgdmFyIGFyciA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGMgPSBzZWdtZW50LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgYyA9PT0gMHgyRCAvLyAtXG4gICAgICAgICAgICAgICAgfHwgYyA9PT0gMHgyRSAvLyAuXG4gICAgICAgICAgICAgICAgfHwgYyA9PT0gMHg1RiAvLyBfXG4gICAgICAgICAgICAgICAgfHwgYyA9PT0gMHg3RSAvLyB+XG4gICAgICAgICAgICAgICAgfHwgKGMgPj0gMHgzMCAmJiBjIDw9IDB4MzkpIC8vIDAtOVxuICAgICAgICAgICAgICAgIHx8IChjID49IDB4NDEgJiYgYyA8PSAweDVBKSAvLyBhLXpcbiAgICAgICAgICAgICAgICB8fCAoYyA+PSAweDYxICYmIGMgPD0gMHg3QSkgLy8gQS1aXG4gICAgICAgICAgICAgICAgfHwgKGZvcm1hdCA9PT0gZm9ybWF0cy5SRkMxNzM4ICYmIChjID09PSAweDI4IHx8IGMgPT09IDB4MjkpKSAvLyAoIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IHNlZ21lbnQuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBoZXhUYWJsZVtjXTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IGhleFRhYmxlWzB4QzAgfCAoYyA+PiA2KV1cbiAgICAgICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPj0gMHhFMDAwKSB7XG4gICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gaGV4VGFibGVbMHhFMCB8IChjID4+IDEyKV1cbiAgICAgICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildXG4gICAgICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICBjID0gMHgxMDAwMCArICgoKGMgJiAweDNGRikgPDwgMTApIHwgKHNlZ21lbnQuY2hhckNvZGVBdChpKSAmIDB4M0ZGKSk7XG5cbiAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IGhleFRhYmxlWzB4RjAgfCAoYyA+PiAxOCldXG4gICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpXVxuICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXVxuICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ICs9IGFyci5qb2luKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxudmFyIGNvbXBhY3QgPSBmdW5jdGlvbiBjb21wYWN0KHZhbHVlKSB7XG4gICAgdmFyIHF1ZXVlID0gW3sgb2JqOiB7IG86IHZhbHVlIH0sIHByb3A6ICdvJyB9XTtcbiAgICB2YXIgcmVmcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlW2ldO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbal07XG4gICAgICAgICAgICB2YXIgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmIHJlZnMuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goeyBvYmo6IG9iaiwgcHJvcDoga2V5IH0pO1xuICAgICAgICAgICAgICAgIHJlZnMucHVzaCh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcGFjdFF1ZXVlKHF1ZXVlKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBpc1JlZ0V4cCA9IGZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59O1xuXG52YXIgaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhKG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpO1xufTtcblxudmFyIGNvbWJpbmUgPSBmdW5jdGlvbiBjb21iaW5lKGEsIGIpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KGEsIGIpO1xufTtcblxudmFyIG1heWJlTWFwID0gZnVuY3Rpb24gbWF5YmVNYXAodmFsLCBmbikge1xuICAgIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFyIG1hcHBlZCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgbWFwcGVkLnB1c2goZm4odmFsW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG4gICAgcmV0dXJuIGZuKHZhbCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBhcnJheVRvT2JqZWN0OiBhcnJheVRvT2JqZWN0LFxuICAgIGFzc2lnbjogYXNzaWduLFxuICAgIGNvbWJpbmU6IGNvbWJpbmUsXG4gICAgY29tcGFjdDogY29tcGFjdCxcbiAgICBkZWNvZGU6IGRlY29kZSxcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gICAgaXNSZWdFeHA6IGlzUmVnRXhwLFxuICAgIG1heWJlTWFwOiBtYXliZU1hcCxcbiAgICBtZXJnZTogbWVyZ2Vcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnZXRTaWRlQ2hhbm5lbCA9IHJlcXVpcmUoJ3NpZGUtY2hhbm5lbCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgYXJyYXlQcmVmaXhHZW5lcmF0b3JzID0ge1xuICAgIGJyYWNrZXRzOiBmdW5jdGlvbiBicmFja2V0cyhwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbXSc7XG4gICAgfSxcbiAgICBjb21tYTogJ2NvbW1hJyxcbiAgICBpbmRpY2VzOiBmdW5jdGlvbiBpbmRpY2VzKHByZWZpeCwga2V5KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnWycgKyBrZXkgKyAnXSc7XG4gICAgfSxcbiAgICByZXBlYXQ6IGZ1bmN0aW9uIHJlcGVhdChwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG52YXIgcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoO1xudmFyIHB1c2hUb0FycmF5ID0gZnVuY3Rpb24gKGFyciwgdmFsdWVPckFycmF5KSB7XG4gICAgcHVzaC5hcHBseShhcnIsIGlzQXJyYXkodmFsdWVPckFycmF5KSA/IHZhbHVlT3JBcnJheSA6IFt2YWx1ZU9yQXJyYXldKTtcbn07XG5cbnZhciB0b0lTTyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgZGVmYXVsdEZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhZGRRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBhbGxvd0VtcHR5QXJyYXlzOiBmYWxzZSxcbiAgICBhcnJheUZvcm1hdDogJ2luZGljZXMnLFxuICAgIGNoYXJzZXQ6ICd1dGYtOCcsXG4gICAgY2hhcnNldFNlbnRpbmVsOiBmYWxzZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBlbmNvZGU6IHRydWUsXG4gICAgZW5jb2RlRG90SW5LZXlzOiBmYWxzZSxcbiAgICBlbmNvZGVyOiB1dGlscy5lbmNvZGUsXG4gICAgZW5jb2RlVmFsdWVzT25seTogZmFsc2UsXG4gICAgZm9ybWF0OiBkZWZhdWx0Rm9ybWF0LFxuICAgIGZvcm1hdHRlcjogZm9ybWF0cy5mb3JtYXR0ZXJzW2RlZmF1bHRGb3JtYXRdLFxuICAgIC8vIGRlcHJlY2F0ZWRcbiAgICBpbmRpY2VzOiBmYWxzZSxcbiAgICBzZXJpYWxpemVEYXRlOiBmdW5jdGlvbiBzZXJpYWxpemVEYXRlKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRvSVNPLmNhbGwoZGF0ZSk7XG4gICAgfSxcbiAgICBza2lwTnVsbHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBpc05vbk51bGxpc2hQcmltaXRpdmUgPSBmdW5jdGlvbiBpc05vbk51bGxpc2hQcmltaXRpdmUodikge1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ3N0cmluZydcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdudW1iZXInXG4gICAgICAgIHx8IHR5cGVvZiB2ID09PSAnYm9vbGVhbidcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdzeW1ib2wnXG4gICAgICAgIHx8IHR5cGVvZiB2ID09PSAnYmlnaW50Jztcbn07XG5cbnZhciBzZW50aW5lbCA9IHt9O1xuXG52YXIgc3RyaW5naWZ5ID0gZnVuY3Rpb24gc3RyaW5naWZ5KFxuICAgIG9iamVjdCxcbiAgICBwcmVmaXgsXG4gICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICBjb21tYVJvdW5kVHJpcCxcbiAgICBhbGxvd0VtcHR5QXJyYXlzLFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlRG90SW5LZXlzLFxuICAgIGVuY29kZXIsXG4gICAgZmlsdGVyLFxuICAgIHNvcnQsXG4gICAgYWxsb3dEb3RzLFxuICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgZm9ybWF0LFxuICAgIGZvcm1hdHRlcixcbiAgICBlbmNvZGVWYWx1ZXNPbmx5LFxuICAgIGNoYXJzZXQsXG4gICAgc2lkZUNoYW5uZWxcbikge1xuICAgIHZhciBvYmogPSBvYmplY3Q7XG5cbiAgICB2YXIgdG1wU2MgPSBzaWRlQ2hhbm5lbDtcbiAgICB2YXIgc3RlcCA9IDA7XG4gICAgdmFyIGZpbmRGbGFnID0gZmFsc2U7XG4gICAgd2hpbGUgKCh0bXBTYyA9IHRtcFNjLmdldChzZW50aW5lbCkpICE9PSB2b2lkIHVuZGVmaW5lZCAmJiAhZmluZEZsYWcpIHtcbiAgICAgICAgLy8gV2hlcmUgb2JqZWN0IGxhc3QgYXBwZWFyZWQgaW4gdGhlIHJlZiB0cmVlXG4gICAgICAgIHZhciBwb3MgPSB0bXBTYy5nZXQob2JqZWN0KTtcbiAgICAgICAgc3RlcCArPSAxO1xuICAgICAgICBpZiAodHlwZW9mIHBvcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChwb3MgPT09IHN0ZXApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQ3ljbGljIG9iamVjdCB2YWx1ZScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5kRmxhZyA9IHRydWU7IC8vIEJyZWFrIHdoaWxlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0bXBTYy5nZXQoc2VudGluZWwpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc3RlcCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmogPSBmaWx0ZXIocHJlZml4LCBvYmopO1xuICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBvYmogPSBzZXJpYWxpemVEYXRlKG9iaik7XG4gICAgfSBlbHNlIGlmIChnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIGlzQXJyYXkob2JqKSkge1xuICAgICAgICBvYmogPSB1dGlscy5tYXliZU1hcChvYmosIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVEYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWN0TnVsbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlciAmJiAhZW5jb2RlVmFsdWVzT25seSA/IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0LCAna2V5JywgZm9ybWF0KSA6IHByZWZpeDtcbiAgICAgICAgfVxuXG4gICAgICAgIG9iaiA9ICcnO1xuICAgIH1cblxuICAgIGlmIChpc05vbk51bGxpc2hQcmltaXRpdmUob2JqKSB8fCB1dGlscy5pc0J1ZmZlcihvYmopKSB7XG4gICAgICAgIGlmIChlbmNvZGVyKSB7XG4gICAgICAgICAgICB2YXIga2V5VmFsdWUgPSBlbmNvZGVWYWx1ZXNPbmx5ID8gcHJlZml4IDogZW5jb2RlcihwcmVmaXgsIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICdrZXknLCBmb3JtYXQpO1xuICAgICAgICAgICAgcmV0dXJuIFtmb3JtYXR0ZXIoa2V5VmFsdWUpICsgJz0nICsgZm9ybWF0dGVyKGVuY29kZXIob2JqLCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0LCAndmFsdWUnLCBmb3JtYXQpKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtmb3JtYXR0ZXIocHJlZml4KSArICc9JyArIGZvcm1hdHRlcihTdHJpbmcob2JqKSldO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIHZhciBvYmpLZXlzO1xuICAgIGlmIChnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIGlzQXJyYXkob2JqKSkge1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIGpvaW4gZWxlbWVudHMgaW5cbiAgICAgICAgaWYgKGVuY29kZVZhbHVlc09ubHkgJiYgZW5jb2Rlcikge1xuICAgICAgICAgICAgb2JqID0gdXRpbHMubWF5YmVNYXAob2JqLCBlbmNvZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBvYmpLZXlzID0gW3sgdmFsdWU6IG9iai5sZW5ndGggPiAwID8gb2JqLmpvaW4oJywnKSB8fCBudWxsIDogdm9pZCB1bmRlZmluZWQgfV07XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgb2JqS2V5cyA9IGZpbHRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIG9iaktleXMgPSBzb3J0ID8ga2V5cy5zb3J0KHNvcnQpIDoga2V5cztcbiAgICB9XG5cbiAgICB2YXIgZW5jb2RlZFByZWZpeCA9IGVuY29kZURvdEluS2V5cyA/IHByZWZpeC5yZXBsYWNlKC9cXC4vZywgJyUyRScpIDogcHJlZml4O1xuXG4gICAgdmFyIGFkanVzdGVkUHJlZml4ID0gY29tbWFSb3VuZFRyaXAgJiYgaXNBcnJheShvYmopICYmIG9iai5sZW5ndGggPT09IDEgPyBlbmNvZGVkUHJlZml4ICsgJ1tdJyA6IGVuY29kZWRQcmVmaXg7XG5cbiAgICBpZiAoYWxsb3dFbXB0eUFycmF5cyAmJiBpc0FycmF5KG9iaikgJiYgb2JqLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYWRqdXN0ZWRQcmVmaXggKyAnW10nO1xuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqS2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tqXTtcbiAgICAgICAgdmFyIHZhbHVlID0gdHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGtleS52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyBrZXkudmFsdWUgOiBvYmpba2V5XTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBlbmNvZGVkS2V5ID0gYWxsb3dEb3RzICYmIGVuY29kZURvdEluS2V5cyA/IGtleS5yZXBsYWNlKC9cXC4vZywgJyUyRScpIDoga2V5O1xuICAgICAgICB2YXIga2V5UHJlZml4ID0gaXNBcnJheShvYmopXG4gICAgICAgICAgICA/IHR5cGVvZiBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnZnVuY3Rpb24nID8gZ2VuZXJhdGVBcnJheVByZWZpeChhZGp1c3RlZFByZWZpeCwgZW5jb2RlZEtleSkgOiBhZGp1c3RlZFByZWZpeFxuICAgICAgICAgICAgOiBhZGp1c3RlZFByZWZpeCArIChhbGxvd0RvdHMgPyAnLicgKyBlbmNvZGVkS2V5IDogJ1snICsgZW5jb2RlZEtleSArICddJyk7XG5cbiAgICAgICAgc2lkZUNoYW5uZWwuc2V0KG9iamVjdCwgc3RlcCk7XG4gICAgICAgIHZhciB2YWx1ZVNpZGVDaGFubmVsID0gZ2V0U2lkZUNoYW5uZWwoKTtcbiAgICAgICAgdmFsdWVTaWRlQ2hhbm5lbC5zZXQoc2VudGluZWwsIHNpZGVDaGFubmVsKTtcbiAgICAgICAgcHVzaFRvQXJyYXkodmFsdWVzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGtleVByZWZpeCxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBjb21tYVJvdW5kVHJpcCxcbiAgICAgICAgICAgIGFsbG93RW1wdHlBcnJheXMsXG4gICAgICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICBlbmNvZGVEb3RJbktleXMsXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIGVuY29kZVZhbHVlc09ubHkgJiYgaXNBcnJheShvYmopID8gbnVsbCA6IGVuY29kZXIsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgYWxsb3dEb3RzLFxuICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBjaGFyc2V0LFxuICAgICAgICAgICAgdmFsdWVTaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxudmFyIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGFsbG93RW1wdHlBcnJheXNgIG9wdGlvbiBjYW4gb25seSBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2hlbiBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5lbmNvZGVEb3RJbktleXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmVuY29kZURvdEluS2V5cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BlbmNvZGVEb3RJbktleXNgIG9wdGlvbiBjYW4gb25seSBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2hlbiBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmVuY29kZXIgIT09IG51bGwgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBjaGFyc2V0ID0gb3B0cy5jaGFyc2V0IHx8IGRlZmF1bHRzLmNoYXJzZXQ7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzWydkZWZhdWx0J107XG4gICAgaWYgKHR5cGVvZiBvcHRzLmZvcm1hdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKCFoYXMuY2FsbChmb3JtYXRzLmZvcm1hdHRlcnMsIG9wdHMuZm9ybWF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBmb3JtYXQgb3B0aW9uIHByb3ZpZGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1hdCA9IG9wdHMuZm9ybWF0O1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cbiAgICB2YXIgZmlsdGVyID0gZGVmYXVsdHMuZmlsdGVyO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdmdW5jdGlvbicgfHwgaXNBcnJheShvcHRzLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0cy5maWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGFycmF5Rm9ybWF0O1xuICAgIGlmIChvcHRzLmFycmF5Rm9ybWF0IGluIGFycmF5UHJlZml4R2VuZXJhdG9ycykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuYXJyYXlGb3JtYXQ7XG4gICAgfSBlbHNlIGlmICgnaW5kaWNlcycgaW4gb3B0cykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuaW5kaWNlcyA/ICdpbmRpY2VzJyA6ICdyZXBlYXQnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gZGVmYXVsdHMuYXJyYXlGb3JtYXQ7XG4gICAgfVxuXG4gICAgaWYgKCdjb21tYVJvdW5kVHJpcCcgaW4gb3B0cyAmJiB0eXBlb2Ygb3B0cy5jb21tYVJvdW5kVHJpcCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Bjb21tYVJvdW5kVHJpcGAgbXVzdCBiZSBhIGJvb2xlYW4sIG9yIGFic2VudCcpO1xuICAgIH1cblxuICAgIHZhciBhbGxvd0RvdHMgPSB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gb3B0cy5lbmNvZGVEb3RJbktleXMgPT09IHRydWUgPyB0cnVlIDogZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cztcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFkZFF1ZXJ5UHJlZml4OiB0eXBlb2Ygb3B0cy5hZGRRdWVyeVByZWZpeCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hZGRRdWVyeVByZWZpeCA6IGRlZmF1bHRzLmFkZFF1ZXJ5UHJlZml4LFxuICAgICAgICBhbGxvd0RvdHM6IGFsbG93RG90cyxcbiAgICAgICAgYWxsb3dFbXB0eUFycmF5czogdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyA9PT0gJ2Jvb2xlYW4nID8gISFvcHRzLmFsbG93RW1wdHlBcnJheXMgOiBkZWZhdWx0cy5hbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICBhcnJheUZvcm1hdDogYXJyYXlGb3JtYXQsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgY29tbWFSb3VuZFRyaXA6IG9wdHMuY29tbWFSb3VuZFRyaXAsXG4gICAgICAgIGRlbGltaXRlcjogdHlwZW9mIG9wdHMuZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmRlbGltaXRlciA6IG9wdHMuZGVsaW1pdGVyLFxuICAgICAgICBlbmNvZGU6IHR5cGVvZiBvcHRzLmVuY29kZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGUgOiBkZWZhdWx0cy5lbmNvZGUsXG4gICAgICAgIGVuY29kZURvdEluS2V5czogdHlwZW9mIG9wdHMuZW5jb2RlRG90SW5LZXlzID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZURvdEluS2V5cyA6IGRlZmF1bHRzLmVuY29kZURvdEluS2V5cyxcbiAgICAgICAgZW5jb2RlcjogdHlwZW9mIG9wdHMuZW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZW5jb2RlciA6IGRlZmF1bHRzLmVuY29kZXIsXG4gICAgICAgIGVuY29kZVZhbHVlc09ubHk6IHR5cGVvZiBvcHRzLmVuY29kZVZhbHVlc09ubHkgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlVmFsdWVzT25seSA6IGRlZmF1bHRzLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIsXG4gICAgICAgIHNlcmlhbGl6ZURhdGU6IHR5cGVvZiBvcHRzLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlLFxuICAgICAgICBza2lwTnVsbHM6IHR5cGVvZiBvcHRzLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHMsXG4gICAgICAgIHNvcnQ6IHR5cGVvZiBvcHRzLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNvcnQgOiBudWxsLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmdcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRzKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cyk7XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBnZW5lcmF0ZUFycmF5UHJlZml4ID0gYXJyYXlQcmVmaXhHZW5lcmF0b3JzW29wdGlvbnMuYXJyYXlGb3JtYXRdO1xuICAgIHZhciBjb21tYVJvdW5kVHJpcCA9IGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgb3B0aW9ucy5jb21tYVJvdW5kVHJpcDtcblxuICAgIGlmICghb2JqS2V5cykge1xuICAgICAgICBvYmpLZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgICAgIG9iaktleXMuc29ydChvcHRpb25zLnNvcnQpO1xuICAgIH1cblxuICAgIHZhciBzaWRlQ2hhbm5lbCA9IGdldFNpZGVDaGFubmVsKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpLZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpLZXlzW2ldO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnNraXBOdWxscyAmJiBvYmpba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVzaFRvQXJyYXkoa2V5cywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgb2JqW2tleV0sXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgY29tbWFSb3VuZFRyaXAsXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RW1wdHlBcnJheXMsXG4gICAgICAgICAgICBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2tpcE51bGxzLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGVEb3RJbktleXMsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZSA/IG9wdGlvbnMuZW5jb2RlciA6IG51bGwsXG4gICAgICAgICAgICBvcHRpb25zLmZpbHRlcixcbiAgICAgICAgICAgIG9wdGlvbnMuc29ydCxcbiAgICAgICAgICAgIG9wdGlvbnMuYWxsb3dEb3RzLFxuICAgICAgICAgICAgb3B0aW9ucy5zZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXQsXG4gICAgICAgICAgICBvcHRpb25zLmZvcm1hdHRlcixcbiAgICAgICAgICAgIG9wdGlvbnMuZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgICAgIG9wdGlvbnMuY2hhcnNldCxcbiAgICAgICAgICAgIHNpZGVDaGFubmVsXG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIHZhciBqb2luZWQgPSBrZXlzLmpvaW4ob3B0aW9ucy5kZWxpbWl0ZXIpO1xuICAgIHZhciBwcmVmaXggPSBvcHRpb25zLmFkZFF1ZXJ5UHJlZml4ID09PSB0cnVlID8gJz8nIDogJyc7XG5cbiAgICBpZiAob3B0aW9ucy5jaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgICAgICAvLyBlbmNvZGVVUklDb21wb25lbnQoJyYjMTAwMDM7JyksIHRoZSBcIm51bWVyaWMgZW50aXR5XCIgcmVwcmVzZW50YXRpb24gb2YgYSBjaGVja21hcmtcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lMjYlMjMxMDAwMyUzQiYnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCfinJMnKVxuICAgICAgICAgICAgcHJlZml4ICs9ICd1dGY4PSVFMiU5QyU5MyYnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGpvaW5lZC5sZW5ndGggPiAwID8gcHJlZml4ICsgam9pbmVkIDogJyc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBhbGxvd0VtcHR5QXJyYXlzOiBmYWxzZSxcbiAgICBhbGxvd1Byb3RvdHlwZXM6IGZhbHNlLFxuICAgIGFsbG93U3BhcnNlOiBmYWxzZSxcbiAgICBhcnJheUxpbWl0OiAyMCxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgY29tbWE6IGZhbHNlLFxuICAgIGRlY29kZURvdEluS2V5czogZmFsc2UsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIGR1cGxpY2F0ZXM6ICdjb21iaW5lJyxcbiAgICBpZ25vcmVRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiBmYWxzZSxcbiAgICBwYXJhbWV0ZXJMaW1pdDogMTAwMCxcbiAgICBwYXJzZUFycmF5czogdHJ1ZSxcbiAgICBwbGFpbk9iamVjdHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBpbnRlcnByZXROdW1lcmljRW50aXRpZXMgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8mIyhcXGQrKTsvZywgZnVuY3Rpb24gKCQwLCBudW1iZXJTdHIpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobnVtYmVyU3RyLCAxMCkpO1xuICAgIH0pO1xufTtcblxudmFyIHBhcnNlQXJyYXlWYWx1ZSA9IGZ1bmN0aW9uICh2YWwsIG9wdGlvbnMpIHtcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIG9wdGlvbnMuY29tbWEgJiYgdmFsLmluZGV4T2YoJywnKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB2YWwuc3BsaXQoJywnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xufTtcblxuLy8gVGhpcyBpcyB3aGF0IGJyb3dzZXJzIHdpbGwgc3VibWl0IHdoZW4gdGhlIOKckyBjaGFyYWN0ZXIgb2NjdXJzIGluIGFuXG4vLyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgYm9keSBhbmQgdGhlIGVuY29kaW5nIG9mIHRoZSBwYWdlIGNvbnRhaW5pbmdcbi8vIHRoZSBmb3JtIGlzIGlzby04ODU5LTEsIG9yIHdoZW4gdGhlIHN1Ym1pdHRlZCBmb3JtIGhhcyBhbiBhY2NlcHQtY2hhcnNldFxuLy8gYXR0cmlidXRlIG9mIGlzby04ODU5LTEuIFByZXN1bWFibHkgYWxzbyB3aXRoIG90aGVyIGNoYXJzZXRzIHRoYXQgZG8gbm90IGNvbnRhaW5cbi8vIHRoZSDinJMgY2hhcmFjdGVyLCBzdWNoIGFzIHVzLWFzY2lpLlxudmFyIGlzb1NlbnRpbmVsID0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0InOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJyYjMTAwMDM7JylcblxuLy8gVGhlc2UgYXJlIHRoZSBwZXJjZW50LWVuY29kZWQgdXRmLTggb2N0ZXRzIHJlcHJlc2VudGluZyBhIGNoZWNrbWFyaywgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0IGFjdHVhbGx5IGlzIHV0Zi04IGVuY29kZWQuXG52YXIgY2hhcnNldFNlbnRpbmVsID0gJ3V0Zjg9JUUyJTlDJTkzJzsgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCfinJMnKVxuXG52YXIgcGFyc2VWYWx1ZXMgPSBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nVmFsdWVzKHN0ciwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuXG4gICAgdmFyIGNsZWFuU3RyID0gb3B0aW9ucy5pZ25vcmVRdWVyeVByZWZpeCA/IHN0ci5yZXBsYWNlKC9eXFw/LywgJycpIDogc3RyO1xuICAgIGNsZWFuU3RyID0gY2xlYW5TdHIucmVwbGFjZSgvJTVCL2dpLCAnWycpLnJlcGxhY2UoLyU1RC9naSwgJ10nKTtcbiAgICB2YXIgbGltaXQgPSBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID09PSBJbmZpbml0eSA/IHVuZGVmaW5lZCA6IG9wdGlvbnMucGFyYW1ldGVyTGltaXQ7XG4gICAgdmFyIHBhcnRzID0gY2xlYW5TdHIuc3BsaXQob3B0aW9ucy5kZWxpbWl0ZXIsIGxpbWl0KTtcbiAgICB2YXIgc2tpcEluZGV4ID0gLTE7IC8vIEtlZXAgdHJhY2sgb2Ygd2hlcmUgdGhlIHV0Zjggc2VudGluZWwgd2FzIGZvdW5kXG4gICAgdmFyIGk7XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdGlvbnMuY2hhcnNldDtcbiAgICBpZiAob3B0aW9ucy5jaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocGFydHNbaV0uaW5kZXhPZigndXRmOD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0c1tpXSA9PT0gY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAndXRmLTgnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydHNbaV0gPT09IGlzb1NlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAnaXNvLTg4NTktMSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXBJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgaSA9IHBhcnRzLmxlbmd0aDsgLy8gVGhlIGVzbGludCBzZXR0aW5ncyBkbyBub3QgYWxsb3cgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGkgPT09IHNraXBJbmRleCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcblxuICAgICAgICB2YXIgYnJhY2tldEVxdWFsc1BvcyA9IHBhcnQuaW5kZXhPZignXT0nKTtcbiAgICAgICAgdmFyIHBvcyA9IGJyYWNrZXRFcXVhbHNQb3MgPT09IC0xID8gcGFydC5pbmRleE9mKCc9JykgOiBicmFja2V0RXF1YWxzUG9zICsgMTtcblxuICAgICAgICB2YXIga2V5LCB2YWw7XG4gICAgICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydCwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCwgJ2tleScpO1xuICAgICAgICAgICAgdmFsID0gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPyBudWxsIDogJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZSgwLCBwb3MpLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAna2V5Jyk7XG4gICAgICAgICAgICB2YWwgPSB1dGlscy5tYXliZU1hcChcbiAgICAgICAgICAgICAgICBwYXJzZUFycmF5VmFsdWUocGFydC5zbGljZShwb3MgKyAxKSwgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVuY29kZWRWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZGVjb2RlcihlbmNvZGVkVmFsLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAndmFsdWUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCAmJiBvcHRpb25zLmludGVycHJldE51bWVyaWNFbnRpdGllcyAmJiBjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIHZhbCA9IGludGVycHJldE51bWVyaWNFbnRpdGllcyh2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnQuaW5kZXhPZignW109JykgPiAtMSkge1xuICAgICAgICAgICAgdmFsID0gaXNBcnJheSh2YWwpID8gW3ZhbF0gOiB2YWw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXhpc3RpbmcgPSBoYXMuY2FsbChvYmosIGtleSk7XG4gICAgICAgIGlmIChleGlzdGluZyAmJiBvcHRpb25zLmR1cGxpY2F0ZXMgPT09ICdjb21iaW5lJykge1xuICAgICAgICAgICAgb2JqW2tleV0gPSB1dGlscy5jb21iaW5lKG9ialtrZXldLCB2YWwpO1xuICAgICAgICB9IGVsc2UgaWYgKCFleGlzdGluZyB8fCBvcHRpb25zLmR1cGxpY2F0ZXMgPT09ICdsYXN0Jykge1xuICAgICAgICAgICAgb2JqW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxudmFyIHBhcnNlT2JqZWN0ID0gZnVuY3Rpb24gKGNoYWluLCB2YWwsIG9wdGlvbnMsIHZhbHVlc1BhcnNlZCkge1xuICAgIHZhciBsZWFmID0gdmFsdWVzUGFyc2VkID8gdmFsIDogcGFyc2VBcnJheVZhbHVlKHZhbCwgb3B0aW9ucyk7XG5cbiAgICBmb3IgKHZhciBpID0gY2hhaW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIG9iajtcbiAgICAgICAgdmFyIHJvb3QgPSBjaGFpbltpXTtcblxuICAgICAgICBpZiAocm9vdCA9PT0gJ1tdJyAmJiBvcHRpb25zLnBhcnNlQXJyYXlzKSB7XG4gICAgICAgICAgICBvYmogPSBvcHRpb25zLmFsbG93RW1wdHlBcnJheXMgJiYgbGVhZiA9PT0gJycgPyBbXSA6IFtdLmNvbmNhdChsZWFmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgICAgICAgdmFyIGNsZWFuUm9vdCA9IHJvb3QuY2hhckF0KDApID09PSAnWycgJiYgcm9vdC5jaGFyQXQocm9vdC5sZW5ndGggLSAxKSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCAtMSkgOiByb290O1xuICAgICAgICAgICAgdmFyIGRlY29kZWRSb290ID0gb3B0aW9ucy5kZWNvZGVEb3RJbktleXMgPyBjbGVhblJvb3QucmVwbGFjZSgvJTJFL2csICcuJykgOiBjbGVhblJvb3Q7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZUludChkZWNvZGVkUm9vdCwgMTApO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBhcnNlQXJyYXlzICYmIGRlY29kZWRSb290ID09PSAnJykge1xuICAgICAgICAgICAgICAgIG9iaiA9IHsgMDogbGVhZiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gZGVjb2RlZFJvb3RcbiAgICAgICAgICAgICAgICAmJiBTdHJpbmcoaW5kZXgpID09PSBkZWNvZGVkUm9vdFxuICAgICAgICAgICAgICAgICYmIGluZGV4ID49IDBcbiAgICAgICAgICAgICAgICAmJiAob3B0aW9ucy5wYXJzZUFycmF5cyAmJiBpbmRleCA8PSBvcHRpb25zLmFycmF5TGltaXQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvYmogPSBbXTtcbiAgICAgICAgICAgICAgICBvYmpbaW5kZXhdID0gbGVhZjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlZFJvb3QgIT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgb2JqW2RlY29kZWRSb290XSA9IGxlYWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZWFmID0gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiBsZWFmO1xufTtcblxudmFyIHBhcnNlS2V5cyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdLZXlzKGdpdmVuS2V5LCB2YWwsIG9wdGlvbnMsIHZhbHVlc1BhcnNlZCkge1xuICAgIGlmICghZ2l2ZW5LZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBkb3Qgbm90YXRpb24gdG8gYnJhY2tldCBub3RhdGlvblxuICAgIHZhciBrZXkgPSBvcHRpb25zLmFsbG93RG90cyA/IGdpdmVuS2V5LnJlcGxhY2UoL1xcLihbXi5bXSspL2csICdbJDFdJykgOiBnaXZlbktleTtcblxuICAgIC8vIFRoZSByZWdleCBjaHVua3NcblxuICAgIHZhciBicmFja2V0cyA9IC8oXFxbW15bXFxdXSpdKS87XG4gICAgdmFyIGNoaWxkID0gLyhcXFtbXltcXF1dKl0pL2c7XG5cbiAgICAvLyBHZXQgdGhlIHBhcmVudFxuXG4gICAgdmFyIHNlZ21lbnQgPSBvcHRpb25zLmRlcHRoID4gMCAmJiBicmFja2V0cy5leGVjKGtleSk7XG4gICAgdmFyIHBhcmVudCA9IHNlZ21lbnQgPyBrZXkuc2xpY2UoMCwgc2VnbWVudC5pbmRleCkgOiBrZXk7XG5cbiAgICAvLyBTdGFzaCB0aGUgcGFyZW50IGlmIGl0IGV4aXN0c1xuXG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGFyZW4ndCB1c2luZyBwbGFpbiBvYmplY3RzLCBvcHRpb25hbGx5IHByZWZpeCBrZXlzIHRoYXQgd291bGQgb3ZlcndyaXRlIG9iamVjdCBwcm90b3R5cGUgcHJvcGVydGllc1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHBhcmVudCkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrZXlzLnB1c2gocGFyZW50KTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggY2hpbGRyZW4gYXBwZW5kaW5nIHRvIHRoZSBhcnJheSB1bnRpbCB3ZSBoaXQgZGVwdGhcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAob3B0aW9ucy5kZXB0aCA+IDAgJiYgKHNlZ21lbnQgPSBjaGlsZC5leGVjKGtleSkpICE9PSBudWxsICYmIGkgPCBvcHRpb25zLmRlcHRoKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzZWdtZW50WzFdLnNsaWNlKDEsIC0xKSkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKHNlZ21lbnRbMV0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlJ3MgYSByZW1haW5kZXIsIGp1c3QgYWRkIHdoYXRldmVyIGlzIGxlZnRcblxuICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgIGtleXMucHVzaCgnWycgKyBrZXkuc2xpY2Uoc2VnbWVudC5pbmRleCkgKyAnXScpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZU9iamVjdChrZXlzLCB2YWwsIG9wdGlvbnMsIHZhbHVlc1BhcnNlZCk7XG59O1xuXG52YXIgbm9ybWFsaXplUGFyc2VPcHRpb25zID0gZnVuY3Rpb24gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGFsbG93RW1wdHlBcnJheXNgIG9wdGlvbiBjYW4gb25seSBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2hlbiBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5kZWNvZGVEb3RJbktleXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmRlY29kZURvdEluS2V5cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BkZWNvZGVEb3RJbktleXNgIG9wdGlvbiBjYW4gb25seSBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2hlbiBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmRlY29kZXIgIT09IG51bGwgJiYgdHlwZW9mIG9wdHMuZGVjb2RlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZGVjb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdEZWNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5jaGFyc2V0ICE9PSAndW5kZWZpbmVkJyAmJiBvcHRzLmNoYXJzZXQgIT09ICd1dGYtOCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNoYXJzZXQgb3B0aW9uIG11c3QgYmUgZWl0aGVyIHV0Zi04LCBpc28tODg1OS0xLCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgdmFyIGNoYXJzZXQgPSB0eXBlb2Ygb3B0cy5jaGFyc2V0ID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmNoYXJzZXQgOiBvcHRzLmNoYXJzZXQ7XG5cbiAgICB2YXIgZHVwbGljYXRlcyA9IHR5cGVvZiBvcHRzLmR1cGxpY2F0ZXMgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZHVwbGljYXRlcyA6IG9wdHMuZHVwbGljYXRlcztcblxuICAgIGlmIChkdXBsaWNhdGVzICE9PSAnY29tYmluZScgJiYgZHVwbGljYXRlcyAhPT0gJ2ZpcnN0JyAmJiBkdXBsaWNhdGVzICE9PSAnbGFzdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGR1cGxpY2F0ZXMgb3B0aW9uIG11c3QgYmUgZWl0aGVyIGNvbWJpbmUsIGZpcnN0LCBvciBsYXN0Jyk7XG4gICAgfVxuXG4gICAgdmFyIGFsbG93RG90cyA9IHR5cGVvZiBvcHRzLmFsbG93RG90cyA9PT0gJ3VuZGVmaW5lZCcgPyBvcHRzLmRlY29kZURvdEluS2V5cyA9PT0gdHJ1ZSA/IHRydWUgOiBkZWZhdWx0cy5hbGxvd0RvdHMgOiAhIW9wdHMuYWxsb3dEb3RzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dEb3RzOiBhbGxvd0RvdHMsXG4gICAgICAgIGFsbG93RW1wdHlBcnJheXM6IHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgPT09ICdib29sZWFuJyA/ICEhb3B0cy5hbGxvd0VtcHR5QXJyYXlzIDogZGVmYXVsdHMuYWxsb3dFbXB0eUFycmF5cyxcbiAgICAgICAgYWxsb3dQcm90b3R5cGVzOiB0eXBlb2Ygb3B0cy5hbGxvd1Byb3RvdHlwZXMgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dQcm90b3R5cGVzIDogZGVmYXVsdHMuYWxsb3dQcm90b3R5cGVzLFxuICAgICAgICBhbGxvd1NwYXJzZTogdHlwZW9mIG9wdHMuYWxsb3dTcGFyc2UgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dTcGFyc2UgOiBkZWZhdWx0cy5hbGxvd1NwYXJzZSxcbiAgICAgICAgYXJyYXlMaW1pdDogdHlwZW9mIG9wdHMuYXJyYXlMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLmFycmF5TGltaXQgOiBkZWZhdWx0cy5hcnJheUxpbWl0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hOiB0eXBlb2Ygb3B0cy5jb21tYSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jb21tYSA6IGRlZmF1bHRzLmNvbW1hLFxuICAgICAgICBkZWNvZGVEb3RJbktleXM6IHR5cGVvZiBvcHRzLmRlY29kZURvdEluS2V5cyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5kZWNvZGVEb3RJbktleXMgOiBkZWZhdWx0cy5kZWNvZGVEb3RJbktleXMsXG4gICAgICAgIGRlY29kZXI6IHR5cGVvZiBvcHRzLmRlY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRzLmRlY29kZXIgOiBkZWZhdWx0cy5kZWNvZGVyLFxuICAgICAgICBkZWxpbWl0ZXI6IHR5cGVvZiBvcHRzLmRlbGltaXRlciA9PT0gJ3N0cmluZycgfHwgdXRpbHMuaXNSZWdFeHAob3B0cy5kZWxpbWl0ZXIpID8gb3B0cy5kZWxpbWl0ZXIgOiBkZWZhdWx0cy5kZWxpbWl0ZXIsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbXBsaWNpdC1jb2VyY2lvbiwgbm8tZXh0cmEtcGFyZW5zXG4gICAgICAgIGRlcHRoOiAodHlwZW9mIG9wdHMuZGVwdGggPT09ICdudW1iZXInIHx8IG9wdHMuZGVwdGggPT09IGZhbHNlKSA/ICtvcHRzLmRlcHRoIDogZGVmYXVsdHMuZGVwdGgsXG4gICAgICAgIGR1cGxpY2F0ZXM6IGR1cGxpY2F0ZXMsXG4gICAgICAgIGlnbm9yZVF1ZXJ5UHJlZml4OiBvcHRzLmlnbm9yZVF1ZXJ5UHJlZml4ID09PSB0cnVlLFxuICAgICAgICBpbnRlcnByZXROdW1lcmljRW50aXRpZXM6IHR5cGVvZiBvcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgOiBkZWZhdWx0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMsXG4gICAgICAgIHBhcmFtZXRlckxpbWl0OiB0eXBlb2Ygb3B0cy5wYXJhbWV0ZXJMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLnBhcmFtZXRlckxpbWl0IDogZGVmYXVsdHMucGFyYW1ldGVyTGltaXQsXG4gICAgICAgIHBhcnNlQXJyYXlzOiBvcHRzLnBhcnNlQXJyYXlzICE9PSBmYWxzZSxcbiAgICAgICAgcGxhaW5PYmplY3RzOiB0eXBlb2Ygb3B0cy5wbGFpbk9iamVjdHMgPT09ICdib29sZWFuJyA/IG9wdHMucGxhaW5PYmplY3RzIDogZGVmYXVsdHMucGxhaW5PYmplY3RzLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmdcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyLCBvcHRzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBub3JtYWxpemVQYXJzZU9wdGlvbnMob3B0cyk7XG5cbiAgICBpZiAoc3RyID09PSAnJyB8fCBzdHIgPT09IG51bGwgfHwgdHlwZW9mIHN0ciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIH1cblxuICAgIHZhciB0ZW1wT2JqID0gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgPyBwYXJzZVZhbHVlcyhzdHIsIG9wdGlvbnMpIDogc3RyO1xuICAgIHZhciBvYmogPSBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUga2V5cyBhbmQgc2V0dXAgdGhlIG5ldyBvYmplY3RcblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGVtcE9iaik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICB2YXIgbmV3T2JqID0gcGFyc2VLZXlzKGtleSwgdGVtcE9ialtrZXldLCBvcHRpb25zLCB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyk7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1lcmdlKG9iaiwgbmV3T2JqLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbGxvd1NwYXJzZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiB1dGlscy5jb21wYWN0KG9iaik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcbnZhciBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZvcm1hdHM6IGZvcm1hdHMsXG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5XG59O1xuIiwiLy9cbi8vIFRISVMgRklMRSBJUyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCEgRE8gTk9UIEVESVQgQlkgSEFORCFcbi8vXG47XG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpXG4gICAgICAgIDogdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kXG4gICAgICAgICAgICA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL2RhbmtvZ2FpL2pzLWJhc2U2NC9pc3N1ZXMvMTE5XG4gICAgICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHZlcnNpb24gZm9yIG5vQ29uZmxpY3QoKVxuICAgICAgICAgICAgICAgIHZhciBfQmFzZTY0ID0gZ2xvYmFsLkJhc2U2NDtcbiAgICAgICAgICAgICAgICB2YXIgZ0Jhc2U2NCA9IGZhY3RvcnkoKTtcbiAgICAgICAgICAgICAgICBnQmFzZTY0Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5CYXNlNjQgPSBfQmFzZTY0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ0Jhc2U2NDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChnbG9iYWwuTWV0ZW9yKSB7IC8vIE1ldGVvci5qc1xuICAgICAgICAgICAgICAgICAgICBCYXNlNjQgPSBnQmFzZTY0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBnbG9iYWwuQmFzZTY0ID0gZ0Jhc2U2NDtcbiAgICAgICAgICAgIH0pKCk7XG59KCh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmXG4gICAgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvd1xuICAgICAgICA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsXG4gICAgICAgICAgICA6IHRoaXMpLCBmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIC8qKlxuICAgICAqICBiYXNlNjQudHNcbiAgICAgKlxuICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgQlNEIDMtQ2xhdXNlIExpY2Vuc2UuXG4gICAgICogICAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICAgICAqXG4gICAgICogIFJlZmVyZW5jZXM6XG4gICAgICogICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjRcbiAgICAgKlxuICAgICAqIEBhdXRob3IgRGFuIEtvZ2FpIChodHRwczovL2dpdGh1Yi5jb20vZGFua29nYWkpXG4gICAgICovXG4gICAgdmFyIHZlcnNpb24gPSAnMy43LjcnO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBsb3dlcmNhc2UgYHZlcnNpb25gLlxuICAgICAqL1xuICAgIHZhciBWRVJTSU9OID0gdmVyc2lvbjtcbiAgICB2YXIgX2hhc0J1ZmZlciA9IHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbic7XG4gICAgdmFyIF9URCA9IHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBUZXh0RGVjb2RlcigpIDogdW5kZWZpbmVkO1xuICAgIHZhciBfVEUgPSB0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicgPyBuZXcgVGV4dEVuY29kZXIoKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgYjY0Y2ggPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nO1xuICAgIHZhciBiNjRjaHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChiNjRjaCk7XG4gICAgdmFyIGI2NHRhYiA9IChmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgdGFiID0ge307XG4gICAgICAgIGEuZm9yRWFjaChmdW5jdGlvbiAoYywgaSkgeyByZXR1cm4gdGFiW2NdID0gaTsgfSk7XG4gICAgICAgIHJldHVybiB0YWI7XG4gICAgfSkoYjY0Y2hzKTtcbiAgICB2YXIgYjY0cmUgPSAvXig/OltBLVphLXpcXGQrXFwvXXs0fSkqPyg/OltBLVphLXpcXGQrXFwvXXsyfSg/Oj09KT98W0EtWmEtelxcZCtcXC9dezN9PT8pPyQvO1xuICAgIHZhciBfZnJvbUNDID0gU3RyaW5nLmZyb21DaGFyQ29kZS5iaW5kKFN0cmluZyk7XG4gICAgdmFyIF9VOEFmcm9tID0gdHlwZW9mIFVpbnQ4QXJyYXkuZnJvbSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IFVpbnQ4QXJyYXkuZnJvbS5iaW5kKFVpbnQ4QXJyYXkpXG4gICAgICAgIDogZnVuY3Rpb24gKGl0KSB7IHJldHVybiBuZXcgVWludDhBcnJheShBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpdCwgMCkpOyB9O1xuICAgIHZhciBfbWtVcmlTYWZlID0gZnVuY3Rpb24gKHNyYykgeyByZXR1cm4gc3JjXG4gICAgICAgIC5yZXBsYWNlKC89L2csICcnKS5yZXBsYWNlKC9bK1xcL10vZywgZnVuY3Rpb24gKG0wKSB7IHJldHVybiBtMCA9PSAnKycgPyAnLScgOiAnXyc7IH0pOyB9O1xuICAgIHZhciBfdGlkeUI2NCA9IGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXS9nLCAnJyk7IH07XG4gICAgLyoqXG4gICAgICogcG9seWZpbGwgdmVyc2lvbiBvZiBgYnRvYWBcbiAgICAgKi9cbiAgICB2YXIgYnRvYVBvbHlmaWxsID0gZnVuY3Rpb24gKGJpbikge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygncG9seWZpbGxlZCcpO1xuICAgICAgICB2YXIgdTMyLCBjMCwgYzEsIGMyLCBhc2MgPSAnJztcbiAgICAgICAgdmFyIHBhZCA9IGJpbi5sZW5ndGggJSAzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbi5sZW5ndGg7KSB7XG4gICAgICAgICAgICBpZiAoKGMwID0gYmluLmNoYXJDb2RlQXQoaSsrKSkgPiAyNTUgfHxcbiAgICAgICAgICAgICAgICAoYzEgPSBiaW4uY2hhckNvZGVBdChpKyspKSA+IDI1NSB8fFxuICAgICAgICAgICAgICAgIChjMiA9IGJpbi5jaGFyQ29kZUF0KGkrKykpID4gMjU1KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgY2hhcmFjdGVyIGZvdW5kJyk7XG4gICAgICAgICAgICB1MzIgPSAoYzAgPDwgMTYpIHwgKGMxIDw8IDgpIHwgYzI7XG4gICAgICAgICAgICBhc2MgKz0gYjY0Y2hzW3UzMiA+PiAxOCAmIDYzXVxuICAgICAgICAgICAgICAgICsgYjY0Y2hzW3UzMiA+PiAxMiAmIDYzXVxuICAgICAgICAgICAgICAgICsgYjY0Y2hzW3UzMiA+PiA2ICYgNjNdXG4gICAgICAgICAgICAgICAgKyBiNjRjaHNbdTMyICYgNjNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWQgPyBhc2Muc2xpY2UoMCwgcGFkIC0gMykgKyBcIj09PVwiLnN1YnN0cmluZyhwYWQpIDogYXNjO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogZG9lcyB3aGF0IGB3aW5kb3cuYnRvYWAgb2Ygd2ViIGJyb3dzZXJzIGRvLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBiaW4gYmluYXJ5IHN0cmluZ1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NC1lbmNvZGVkIHN0cmluZ1xuICAgICAqL1xuICAgIHZhciBfYnRvYSA9IHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gKGJpbikgeyByZXR1cm4gYnRvYShiaW4pOyB9XG4gICAgICAgIDogX2hhc0J1ZmZlciA/IGZ1bmN0aW9uIChiaW4pIHsgcmV0dXJuIEJ1ZmZlci5mcm9tKGJpbiwgJ2JpbmFyeScpLnRvU3RyaW5nKCdiYXNlNjQnKTsgfVxuICAgICAgICAgICAgOiBidG9hUG9seWZpbGw7XG4gICAgdmFyIF9mcm9tVWludDhBcnJheSA9IF9oYXNCdWZmZXJcbiAgICAgICAgPyBmdW5jdGlvbiAodThhKSB7IHJldHVybiBCdWZmZXIuZnJvbSh1OGEpLnRvU3RyaW5nKCdiYXNlNjQnKTsgfVxuICAgICAgICA6IGZ1bmN0aW9uICh1OGEpIHtcbiAgICAgICAgICAgIC8vIGNmLiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjcxMDAwMS9ob3ctdG8tY29udmVydC11aW50OC1hcnJheS10by1iYXNlNjQtZW5jb2RlZC1zdHJpbmcvMTI3MTMzMjYjMTI3MTMzMjZcbiAgICAgICAgICAgIHZhciBtYXhhcmdzID0gMHgxMDAwO1xuICAgICAgICAgICAgdmFyIHN0cnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdThhLmxlbmd0aDsgaSA8IGw7IGkgKz0gbWF4YXJncykge1xuICAgICAgICAgICAgICAgIHN0cnMucHVzaChfZnJvbUNDLmFwcGx5KG51bGwsIHU4YS5zdWJhcnJheShpLCBpICsgbWF4YXJncykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfYnRvYShzdHJzLmpvaW4oJycpKTtcbiAgICAgICAgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBCYXNlNjQgc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VybHNhZmVdIFVSTC1hbmQtZmlsZW5hbWUtc2FmZSBhIGxhIFJGQzQ2NDggwqc1XG4gICAgICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IHN0cmluZ1xuICAgICAqL1xuICAgIHZhciBmcm9tVWludDhBcnJheSA9IGZ1bmN0aW9uICh1OGEsIHVybHNhZmUpIHtcbiAgICAgICAgaWYgKHVybHNhZmUgPT09IHZvaWQgMCkgeyB1cmxzYWZlID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIHVybHNhZmUgPyBfbWtVcmlTYWZlKF9mcm9tVWludDhBcnJheSh1OGEpKSA6IF9mcm9tVWludDhBcnJheSh1OGEpO1xuICAgIH07XG4gICAgLy8gVGhpcyB0cmljayBpcyBmb3VuZCBicm9rZW4gaHR0cHM6Ly9naXRodWIuY29tL2RhbmtvZ2FpL2pzLWJhc2U2NC9pc3N1ZXMvMTMwXG4gICAgLy8gY29uc3QgdXRvYiA9IChzcmM6IHN0cmluZykgPT4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHNyYykpO1xuICAgIC8vIHJldmVydGluZyBnb29kIG9sZCBmYXRpb25lZCByZWdleHBcbiAgICB2YXIgY2JfdXRvYiA9IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGlmIChjLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHZhciBjYyA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgIHJldHVybiBjYyA8IDB4ODAgPyBjXG4gICAgICAgICAgICAgICAgOiBjYyA8IDB4ODAwID8gKF9mcm9tQ0MoMHhjMCB8IChjYyA+Pj4gNikpXG4gICAgICAgICAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKGNjICYgMHgzZikpKVxuICAgICAgICAgICAgICAgICAgICA6IChfZnJvbUNDKDB4ZTAgfCAoKGNjID4+PiAxMikgJiAweDBmKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKChjYyA+Pj4gNikgJiAweDNmKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKGNjICYgMHgzZikpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjYyA9IDB4MTAwMDBcbiAgICAgICAgICAgICAgICArIChjLmNoYXJDb2RlQXQoMCkgLSAweEQ4MDApICogMHg0MDBcbiAgICAgICAgICAgICAgICArIChjLmNoYXJDb2RlQXQoMSkgLSAweERDMDApO1xuICAgICAgICAgICAgcmV0dXJuIChfZnJvbUNDKDB4ZjAgfCAoKGNjID4+PiAxOCkgJiAweDA3KSlcbiAgICAgICAgICAgICAgICArIF9mcm9tQ0MoMHg4MCB8ICgoY2MgPj4+IDEyKSAmIDB4M2YpKVxuICAgICAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKChjYyA+Pj4gNikgJiAweDNmKSlcbiAgICAgICAgICAgICAgICArIF9mcm9tQ0MoMHg4MCB8IChjYyAmIDB4M2YpKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHZhciByZV91dG9iID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRkZdfFteXFx4MDAtXFx4N0ZdL2c7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcm5hbCB1c2Ugb25seS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjIFVURi04IHN0cmluZ1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFVURi0xNiBzdHJpbmdcbiAgICAgKi9cbiAgICB2YXIgdXRvYiA9IGZ1bmN0aW9uICh1KSB7IHJldHVybiB1LnJlcGxhY2UocmVfdXRvYiwgY2JfdXRvYik7IH07XG4gICAgLy9cbiAgICB2YXIgX2VuY29kZSA9IF9oYXNCdWZmZXJcbiAgICAgICAgPyBmdW5jdGlvbiAocykgeyByZXR1cm4gQnVmZmVyLmZyb20ocywgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0Jyk7IH1cbiAgICAgICAgOiBfVEVcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKHMpIHsgcmV0dXJuIF9mcm9tVWludDhBcnJheShfVEUuZW5jb2RlKHMpKTsgfVxuICAgICAgICAgICAgOiBmdW5jdGlvbiAocykgeyByZXR1cm4gX2J0b2EodXRvYihzKSk7IH07XG4gICAgLyoqXG4gICAgICogY29udmVydHMgYSBVVEYtOC1lbmNvZGVkIHN0cmluZyB0byBhIEJhc2U2NCBzdHJpbmcuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXJsc2FmZV0gaWYgYHRydWVgIG1ha2UgdGhlIHJlc3VsdCBVUkwtc2FmZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NCBzdHJpbmdcbiAgICAgKi9cbiAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKHNyYywgdXJsc2FmZSkge1xuICAgICAgICBpZiAodXJsc2FmZSA9PT0gdm9pZCAwKSB7IHVybHNhZmUgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gdXJsc2FmZVxuICAgICAgICAgICAgPyBfbWtVcmlTYWZlKF9lbmNvZGUoc3JjKSlcbiAgICAgICAgICAgIDogX2VuY29kZShzcmMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogY29udmVydHMgYSBVVEYtOC1lbmNvZGVkIHN0cmluZyB0byBVUkwtc2FmZSBCYXNlNjQgUkZDNDY0OCDCpzUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IHN0cmluZ1xuICAgICAqL1xuICAgIHZhciBlbmNvZGVVUkkgPSBmdW5jdGlvbiAoc3JjKSB7IHJldHVybiBlbmNvZGUoc3JjLCB0cnVlKTsgfTtcbiAgICAvLyBUaGlzIHRyaWNrIGlzIGZvdW5kIGJyb2tlbiBodHRwczovL2dpdGh1Yi5jb20vZGFua29nYWkvanMtYmFzZTY0L2lzc3Vlcy8xMzBcbiAgICAvLyBjb25zdCBidG91ID0gKHNyYzogc3RyaW5nKSA9PiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHNyYykpO1xuICAgIC8vIHJldmVydGluZyBnb29kIG9sZCBmYXRpb25lZCByZWdleHBcbiAgICB2YXIgcmVfYnRvdSA9IC9bXFx4QzAtXFx4REZdW1xceDgwLVxceEJGXXxbXFx4RTAtXFx4RUZdW1xceDgwLVxceEJGXXsyfXxbXFx4RjAtXFx4RjddW1xceDgwLVxceEJGXXszfS9nO1xuICAgIHZhciBjYl9idG91ID0gZnVuY3Rpb24gKGNjY2MpIHtcbiAgICAgICAgc3dpdGNoIChjY2NjLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIHZhciBjcCA9ICgoMHgwNyAmIGNjY2MuY2hhckNvZGVBdCgwKSkgPDwgMTgpXG4gICAgICAgICAgICAgICAgICAgIHwgKCgweDNmICYgY2NjYy5jaGFyQ29kZUF0KDEpKSA8PCAxMilcbiAgICAgICAgICAgICAgICAgICAgfCAoKDB4M2YgJiBjY2NjLmNoYXJDb2RlQXQoMikpIDw8IDYpXG4gICAgICAgICAgICAgICAgICAgIHwgKDB4M2YgJiBjY2NjLmNoYXJDb2RlQXQoMykpLCBvZmZzZXQgPSBjcCAtIDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChfZnJvbUNDKChvZmZzZXQgPj4+IDEwKSArIDB4RDgwMClcbiAgICAgICAgICAgICAgICAgICAgKyBfZnJvbUNDKChvZmZzZXQgJiAweDNGRikgKyAweERDMDApKTtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Zyb21DQygoKDB4MGYgJiBjY2NjLmNoYXJDb2RlQXQoMCkpIDw8IDEyKVxuICAgICAgICAgICAgICAgICAgICB8ICgoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgxKSkgPDwgNilcbiAgICAgICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgyKSkpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Zyb21DQygoKDB4MWYgJiBjY2NjLmNoYXJDb2RlQXQoMCkpIDw8IDYpXG4gICAgICAgICAgICAgICAgICAgIHwgKDB4M2YgJiBjY2NjLmNoYXJDb2RlQXQoMSkpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcm5hbCB1c2Ugb25seS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjIFVURi0xNiBzdHJpbmdcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBVVEYtOCBzdHJpbmdcbiAgICAgKi9cbiAgICB2YXIgYnRvdSA9IGZ1bmN0aW9uIChiKSB7IHJldHVybiBiLnJlcGxhY2UocmVfYnRvdSwgY2JfYnRvdSk7IH07XG4gICAgLyoqXG4gICAgICogcG9seWZpbGwgdmVyc2lvbiBvZiBgYXRvYmBcbiAgICAgKi9cbiAgICB2YXIgYXRvYlBvbHlmaWxsID0gZnVuY3Rpb24gKGFzYykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygncG9seWZpbGxlZCcpO1xuICAgICAgICBhc2MgPSBhc2MucmVwbGFjZSgvXFxzKy9nLCAnJyk7XG4gICAgICAgIGlmICghYjY0cmUudGVzdChhc2MpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWFsZm9ybWVkIGJhc2U2NC4nKTtcbiAgICAgICAgYXNjICs9ICc9PScuc2xpY2UoMiAtIChhc2MubGVuZ3RoICYgMykpO1xuICAgICAgICB2YXIgdTI0LCBiaW4gPSAnJywgcjEsIHIyO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFzYy5sZW5ndGg7KSB7XG4gICAgICAgICAgICB1MjQgPSBiNjR0YWJbYXNjLmNoYXJBdChpKyspXSA8PCAxOFxuICAgICAgICAgICAgICAgIHwgYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0gPDwgMTJcbiAgICAgICAgICAgICAgICB8IChyMSA9IGI2NHRhYlthc2MuY2hhckF0KGkrKyldKSA8PCA2XG4gICAgICAgICAgICAgICAgfCAocjIgPSBiNjR0YWJbYXNjLmNoYXJBdChpKyspXSk7XG4gICAgICAgICAgICBiaW4gKz0gcjEgPT09IDY0ID8gX2Zyb21DQyh1MjQgPj4gMTYgJiAyNTUpXG4gICAgICAgICAgICAgICAgOiByMiA9PT0gNjQgPyBfZnJvbUNDKHUyNCA+PiAxNiAmIDI1NSwgdTI0ID4+IDggJiAyNTUpXG4gICAgICAgICAgICAgICAgICAgIDogX2Zyb21DQyh1MjQgPj4gMTYgJiAyNTUsIHUyNCA+PiA4ICYgMjU1LCB1MjQgJiAyNTUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiaW47XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBkb2VzIHdoYXQgYHdpbmRvdy5hdG9iYCBvZiB3ZWIgYnJvd3NlcnMgZG8uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGFzYyBCYXNlNjQtZW5jb2RlZCBzdHJpbmdcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBiaW5hcnkgc3RyaW5nXG4gICAgICovXG4gICAgdmFyIF9hdG9iID0gdHlwZW9mIGF0b2IgPT09ICdmdW5jdGlvbicgPyBmdW5jdGlvbiAoYXNjKSB7IHJldHVybiBhdG9iKF90aWR5QjY0KGFzYykpOyB9XG4gICAgICAgIDogX2hhc0J1ZmZlciA/IGZ1bmN0aW9uIChhc2MpIHsgcmV0dXJuIEJ1ZmZlci5mcm9tKGFzYywgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdiaW5hcnknKTsgfVxuICAgICAgICAgICAgOiBhdG9iUG9seWZpbGw7XG4gICAgLy9cbiAgICB2YXIgX3RvVWludDhBcnJheSA9IF9oYXNCdWZmZXJcbiAgICAgICAgPyBmdW5jdGlvbiAoYSkgeyByZXR1cm4gX1U4QWZyb20oQnVmZmVyLmZyb20oYSwgJ2Jhc2U2NCcpKTsgfVxuICAgICAgICA6IGZ1bmN0aW9uIChhKSB7IHJldHVybiBfVThBZnJvbShfYXRvYihhKS5zcGxpdCgnJykubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLmNoYXJDb2RlQXQoMCk7IH0pKTsgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBhIEJhc2U2NCBzdHJpbmcgdG8gYSBVaW50OEFycmF5LlxuICAgICAqL1xuICAgIHZhciB0b1VpbnQ4QXJyYXkgPSBmdW5jdGlvbiAoYSkgeyByZXR1cm4gX3RvVWludDhBcnJheShfdW5VUkkoYSkpOyB9O1xuICAgIC8vXG4gICAgdmFyIF9kZWNvZGUgPSBfaGFzQnVmZmVyXG4gICAgICAgID8gZnVuY3Rpb24gKGEpIHsgcmV0dXJuIEJ1ZmZlci5mcm9tKGEsICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpOyB9XG4gICAgICAgIDogX1REXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChhKSB7IHJldHVybiBfVEQuZGVjb2RlKF90b1VpbnQ4QXJyYXkoYSkpOyB9XG4gICAgICAgICAgICA6IGZ1bmN0aW9uIChhKSB7IHJldHVybiBidG91KF9hdG9iKGEpKTsgfTtcbiAgICB2YXIgX3VuVVJJID0gZnVuY3Rpb24gKGEpIHsgcmV0dXJuIF90aWR5QjY0KGEucmVwbGFjZSgvWy1fXS9nLCBmdW5jdGlvbiAobTApIHsgcmV0dXJuIG0wID09ICctJyA/ICcrJyA6ICcvJzsgfSkpOyB9O1xuICAgIC8qKlxuICAgICAqIGNvbnZlcnRzIGEgQmFzZTY0IHN0cmluZyB0byBhIFVURi04IHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjIEJhc2U2NCBzdHJpbmcuICBCb3RoIG5vcm1hbCBhbmQgVVJMLXNhZmUgYXJlIHN1cHBvcnRlZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFVURi04IHN0cmluZ1xuICAgICAqL1xuICAgIHZhciBkZWNvZGUgPSBmdW5jdGlvbiAoc3JjKSB7IHJldHVybiBfZGVjb2RlKF91blVSSShzcmMpKTsgfTtcbiAgICAvKipcbiAgICAgKiBjaGVjayBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgQmFzZTY0IHN0cmluZ1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgYSB2YWx1ZSB0byBjaGVja1xuICAgICAgKi9cbiAgICB2YXIgaXNWYWxpZCA9IGZ1bmN0aW9uIChzcmMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzcmMgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgcyA9IHNyYy5yZXBsYWNlKC9cXHMrL2csICcnKS5yZXBsYWNlKC89ezAsMn0kLywgJycpO1xuICAgICAgICByZXR1cm4gIS9bXlxcczAtOWEtekEtWlxcKy9dLy50ZXN0KHMpIHx8ICEvW15cXHMwLTlhLXpBLVpcXC1fXS8udGVzdChzKTtcbiAgICB9O1xuICAgIC8vXG4gICAgdmFyIF9ub0VudW0gPSBmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHYsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBleHRlbmQgU3RyaW5nLnByb3RvdHlwZSB3aXRoIHJlbGV2YW50IG1ldGhvZHNcbiAgICAgKi9cbiAgICB2YXIgZXh0ZW5kU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2FkZCA9IGZ1bmN0aW9uIChuYW1lLCBib2R5KSB7IHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyaW5nLnByb3RvdHlwZSwgbmFtZSwgX25vRW51bShib2R5KSk7IH07XG4gICAgICAgIF9hZGQoJ2Zyb21CYXNlNjQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBkZWNvZGUodGhpcyk7IH0pO1xuICAgICAgICBfYWRkKCd0b0Jhc2U2NCcsIGZ1bmN0aW9uICh1cmxzYWZlKSB7IHJldHVybiBlbmNvZGUodGhpcywgdXJsc2FmZSk7IH0pO1xuICAgICAgICBfYWRkKCd0b0Jhc2U2NFVSSScsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVuY29kZSh0aGlzLCB0cnVlKTsgfSk7XG4gICAgICAgIF9hZGQoJ3RvQmFzZTY0VVJMJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZW5jb2RlKHRoaXMsIHRydWUpOyB9KTtcbiAgICAgICAgX2FkZCgndG9VaW50OEFycmF5JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdG9VaW50OEFycmF5KHRoaXMpOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGV4dGVuZCBVaW50OEFycmF5LnByb3RvdHlwZSB3aXRoIHJlbGV2YW50IG1ldGhvZHNcbiAgICAgKi9cbiAgICB2YXIgZXh0ZW5kVWludDhBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hZGQgPSBmdW5jdGlvbiAobmFtZSwgYm9keSkgeyByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQ4QXJyYXkucHJvdG90eXBlLCBuYW1lLCBfbm9FbnVtKGJvZHkpKTsgfTtcbiAgICAgICAgX2FkZCgndG9CYXNlNjQnLCBmdW5jdGlvbiAodXJsc2FmZSkgeyByZXR1cm4gZnJvbVVpbnQ4QXJyYXkodGhpcywgdXJsc2FmZSk7IH0pO1xuICAgICAgICBfYWRkKCd0b0Jhc2U2NFVSSScsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZyb21VaW50OEFycmF5KHRoaXMsIHRydWUpOyB9KTtcbiAgICAgICAgX2FkZCgndG9CYXNlNjRVUkwnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmcm9tVWludDhBcnJheSh0aGlzLCB0cnVlKTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBleHRlbmQgQnVpbHRpbiBwcm90b3R5cGVzIHdpdGggcmVsZXZhbnQgbWV0aG9kc1xuICAgICAqL1xuICAgIHZhciBleHRlbmRCdWlsdGlucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXh0ZW5kU3RyaW5nKCk7XG4gICAgICAgIGV4dGVuZFVpbnQ4QXJyYXkoKTtcbiAgICB9O1xuICAgIHZhciBnQmFzZTY0ID0ge1xuICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICAgICAgICBWRVJTSU9OOiBWRVJTSU9OLFxuICAgICAgICBhdG9iOiBfYXRvYixcbiAgICAgICAgYXRvYlBvbHlmaWxsOiBhdG9iUG9seWZpbGwsXG4gICAgICAgIGJ0b2E6IF9idG9hLFxuICAgICAgICBidG9hUG9seWZpbGw6IGJ0b2FQb2x5ZmlsbCxcbiAgICAgICAgZnJvbUJhc2U2NDogZGVjb2RlLFxuICAgICAgICB0b0Jhc2U2NDogZW5jb2RlLFxuICAgICAgICBlbmNvZGU6IGVuY29kZSxcbiAgICAgICAgZW5jb2RlVVJJOiBlbmNvZGVVUkksXG4gICAgICAgIGVuY29kZVVSTDogZW5jb2RlVVJJLFxuICAgICAgICB1dG9iOiB1dG9iLFxuICAgICAgICBidG91OiBidG91LFxuICAgICAgICBkZWNvZGU6IGRlY29kZSxcbiAgICAgICAgaXNWYWxpZDogaXNWYWxpZCxcbiAgICAgICAgZnJvbVVpbnQ4QXJyYXk6IGZyb21VaW50OEFycmF5LFxuICAgICAgICB0b1VpbnQ4QXJyYXk6IHRvVWludDhBcnJheSxcbiAgICAgICAgZXh0ZW5kU3RyaW5nOiBleHRlbmRTdHJpbmcsXG4gICAgICAgIGV4dGVuZFVpbnQ4QXJyYXk6IGV4dGVuZFVpbnQ4QXJyYXksXG4gICAgICAgIGV4dGVuZEJ1aWx0aW5zOiBleHRlbmRCdWlsdGluc1xuICAgIH07XG4gICAgLy9cbiAgICAvLyBleHBvcnQgQmFzZTY0IHRvIHRoZSBuYW1lc3BhY2VcbiAgICAvL1xuICAgIC8vIEVTNSBpcyB5ZXQgdG8gaGF2ZSBPYmplY3QuYXNzaWduKCkgdGhhdCBtYXkgbWFrZSB0cmFuc3BpbGVycyB1bmhhcHB5LlxuICAgIC8vIGdCYXNlNjQuQmFzZTY0ID0gT2JqZWN0LmFzc2lnbih7fSwgZ0Jhc2U2NCk7XG4gICAgZ0Jhc2U2NC5CYXNlNjQgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhnQmFzZTY0KS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IHJldHVybiBnQmFzZTY0LkJhc2U2NFtrXSA9IGdCYXNlNjRba107IH0pO1xuICAgIHJldHVybiBnQmFzZTY0O1xufSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5LaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIgPSB2b2lkIDA7XG52YXIgZm9ybV9kYXRhXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImZvcm0tZGF0YVwiKSk7XG52YXIgcXNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicXNcIikpO1xudmFyIGpzX2Jhc2U2NF8xID0gcmVxdWlyZShcImpzLWJhc2U2NFwiKTtcbnZhciBwbGF0Zm9ybV8xID0gcmVxdWlyZShcIi4vcGxhdGZvcm0vXCIpO1xudmFyIERFRkFVTFRfUFJPWFlfUFJPVE9DT0wgPSBcImh0dHBcIjtcbnZhciBUSFJFU0hPTERfQVZPSURfUkVRVUVTVF9VUkxfVE9PX0xBUkdFID0gNDA5NjtcbnZhciBLaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgICAgICB0aGlzLmF1dGggPSBvcHRpb25zLmF1dGg7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKHtcbiAgICAgICAgICAgIGJhc2ljQXV0aDogb3B0aW9ucy5iYXNpY0F1dGgsXG4gICAgICAgICAgICB1c2VyQWdlbnQ6IG9wdGlvbnMudXNlckFnZW50LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKFwiaHR0cHNBZ2VudFwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChcImNsaWVudENlcnRBdXRoXCIgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGNsaWVudENlcnRBdXRoIGFsb25nIHdpdGggaHR0cHNBZ2VudC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmh0dHBzQWdlbnQgPSBvcHRpb25zLmh0dHBzQWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXCJjbGllbnRDZXJ0QXV0aFwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Q2VydEF1dGggPSBvcHRpb25zLmNsaWVudENlcnRBdXRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJveHkgPSBvcHRpb25zLnByb3h5O1xuICAgICAgICB0aGlzLnJlcXVlc3RUb2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuc29ja2V0VGltZW91dCA9IG9wdGlvbnMuc29ja2V0VGltZW91dDtcbiAgICB9XG4gICAgS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uIChtZXRob2QsIHBhdGgsIHBhcmFtcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdENvbmZpZywgX2EsIHJlcXVlc3RVcmwsIF9iLCBmb3JtRGF0YSwgX2MsIF9kLCByZXF1ZXN0VXJsLCBfZSwgX2Y7XG4gICAgICAgICAgICB2YXIgX2csIF9oLCBfajtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2spIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9rLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb25maWcgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7IG1ldGhvZDogbWV0aG9kLCBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsIHVybDogXCJcIi5jb25jYXQodGhpcy5iYXNlVXJsKS5jb25jYXQocGF0aCkgfSwgKG9wdGlvbnMgPyBvcHRpb25zIDoge30pKSwgcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHNBZ2VudDogdGhpcy5odHRwc0FnZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudENlcnRBdXRoOiB0aGlzLmNsaWVudENlcnRBdXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldFRpbWVvdXQ6IHRoaXMuc29ja2V0VGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgeyBwcm94eTogdGhpcy5idWlsZFByb3h5Q29uZmlnKHRoaXMucHJveHkpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBtZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImdldFwiOiByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicG9zdFwiOiByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicHV0XCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVcIjogcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJsID0gdGhpcy5idWlsZFJlcXVlc3RVcmwocGF0aCwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHJlcXVlc3RVcmwubGVuZ3RoID4gVEhSRVNIT0xEX0FWT0lEX1JFUVVFU1RfVVJMX1RPT19MQVJHRSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBbX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9nID0geyBtZXRob2Q6IFwicG9zdFwiLCBoZWFkZXJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5oZWFkZXJzKSwgeyBcIlgtSFRUUC1NZXRob2QtT3ZlcnJpZGVcIjogXCJHRVRcIiB9KSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWlsZERhdGEocGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9fYXNzaWduLmFwcGx5KHZvaWQgMCwgX2IuY29uY2F0KFsoX2cuZGF0YSA9IF9rLnNlbnQoKSwgX2cpXSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24oX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpLCB7IHVybDogcmVxdWVzdFVybCB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHBhcmFtcyBpbnN0YW5jZW9mIGZvcm1fZGF0YV8xLmRlZmF1bHQpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnVpbGREYXRhKHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IF9rLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVxdWVzdENvbmZpZyksIHsgaGVhZGVyczogXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGZvcm1EYXRhLmdldEhlYWRlcnMgZG9lcyBub3QgZXhpc3QgaW4gYSBicm93c2VyIGVudmlyb25tZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZm9ybURhdGEuZ2V0SGVhZGVycyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLmhlYWRlcnMpLCBmb3JtRGF0YS5nZXRIZWFkZXJzKCkpIDogdGhpcy5oZWFkZXJzLCBkYXRhOiBmb3JtRGF0YSB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jID0gW19fYXNzaWduKHt9LCByZXF1ZXN0Q29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfaCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWlsZERhdGEocGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9fYXNzaWduLmFwcGx5KHZvaWQgMCwgX2MuY29uY2F0KFsoX2guZGF0YSA9IF9rLnNlbnQoKSwgX2gpXSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QgPSBbX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9qID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJ1aWxkRGF0YShwYXJhbXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24uYXBwbHkodm9pZCAwLCBfZC5jb25jYXQoWyhfai5kYXRhID0gX2suc2VudCgpLCBfaildKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UgPSB0aGlzLmJ1aWxkUmVxdWVzdFVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9mID0gW3BhdGhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWlsZERhdGEocGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJsID0gX2UuYXBwbHkodGhpcywgX2YuY29uY2F0KFtfay5zZW50KCldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24oX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpLCB7IHVybDogcmVxdWVzdFVybCB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIuY29uY2F0KG1ldGhvZCwgXCIgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2subGFiZWwgPSAxMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXF1ZXN0Q29uZmlnQnVpbGRlci5wcm90b3R5cGUuYnVpbGRQcm94eUNvbmZpZyA9IGZ1bmN0aW9uIChwcm94eUNvbmZpZykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChwcm94eUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm94eUNvbmZpZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJveHkgPSBwcm94eUNvbmZpZztcbiAgICAgICAgaWYgKHByb3h5LmF1dGggJiZcbiAgICAgICAgICAgIChwcm94eS5hdXRoLnVzZXJuYW1lLmxlbmd0aCA9PT0gMCB8fCBwcm94eS5hdXRoLnBhc3N3b3JkLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHByb3h5LmF1dGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcHJveHkucHJvdG9jb2wgPSAoX2EgPSBwcm94eS5wcm90b2NvbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogREVGQVVMVF9QUk9YWV9QUk9UT0NPTDtcbiAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgIH07XG4gICAgS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyLnByb3RvdHlwZS5idWlsZFJlcXVlc3RVcmwgPSBmdW5jdGlvbiAocGF0aCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdCh0aGlzLmJhc2VVcmwpLmNvbmNhdChwYXRoLCBcIj9cIikuY29uY2F0KHFzXzEuZGVmYXVsdC5zdHJpbmdpZnkocGFyYW1zKSk7XG4gICAgfTtcbiAgICBLaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIucHJvdG90eXBlLmJ1aWxkRGF0YSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RUb2tlbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuYXV0aC50eXBlID09PSBcInNlc3Npb25cIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSZXF1ZXN0VG9rZW4oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBmb3JtX2RhdGFfMS5kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZChcIl9fUkVRVUVTVF9UT0tFTl9fXCIsIHJlcXVlc3RUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHBhcmFtc107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24oeyBfX1JFUVVFU1RfVE9LRU5fXzogcmVxdWVzdFRva2VuIH0sIHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCBwYXJhbXNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXF1ZXN0Q29uZmlnQnVpbGRlci5wcm90b3R5cGUuYnVpbGRIZWFkZXJzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgYmFzaWNBdXRoID0gcGFyYW1zLmJhc2ljQXV0aCwgdXNlckFnZW50ID0gcGFyYW1zLnVzZXJBZ2VudDtcbiAgICAgICAgdmFyIGJhc2ljQXV0aEhlYWRlcnMgPSBiYXNpY0F1dGhcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IFwiQmFzaWMgXCIuY29uY2F0KGpzX2Jhc2U2NF8xLkJhc2U2NC5lbmNvZGUoXCJcIi5jb25jYXQoYmFzaWNBdXRoLnVzZXJuYW1lLCBcIjpcIikuY29uY2F0KGJhc2ljQXV0aC5wYXNzd29yZCkpKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge307XG4gICAgICAgIHZhciBwbGF0Zm9ybURlcHNIZWFkZXJzID0gcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuYnVpbGRIZWFkZXJzKHsgdXNlckFnZW50OiB1c2VyQWdlbnQgfSk7XG4gICAgICAgIHZhciBjb21tb25IZWFkZXJzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHBsYXRmb3JtRGVwc0hlYWRlcnMpLCBiYXNpY0F1dGhIZWFkZXJzKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmF1dGgudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInBhc3N3b3JkXCI6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1DeWJvenUtQXV0aG9yaXphdGlvblwiOiBqc19iYXNlNjRfMS5CYXNlNjQuZW5jb2RlKFwiXCIuY29uY2F0KHRoaXMuYXV0aC51c2VybmFtZSwgXCI6XCIpLmNvbmNhdCh0aGlzLmF1dGgucGFzc3dvcmQpKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJhcGlUb2tlblwiOiB7XG4gICAgICAgICAgICAgICAgdmFyIGFwaVRva2VuID0gdGhpcy5hdXRoLmFwaVRva2VuO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFwaVRva2VuKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1DeWJvenUtQVBJLVRva2VuXCI6IGFwaVRva2VuLmpvaW4oXCIsXCIpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1DeWJvenUtQVBJLVRva2VuXCI6IGFwaVRva2VuIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcIm9BdXRoVG9rZW5cIjoge1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29tbW9uSGVhZGVycyksIHsgQXV0aG9yaXphdGlvbjogXCJCZWFyZXIgXCIuY29uY2F0KHRoaXMuYXV0aC5vQXV0aFRva2VuKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1SZXF1ZXN0ZWQtV2l0aFwiOiBcIlhNTEh0dHBSZXF1ZXN0XCIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEtpbnRvbmVSZXF1ZXN0Q29uZmlnQnVpbGRlci5wcm90b3R5cGUuZ2V0UmVxdWVzdFRva2VuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnJlcXVlc3RUb2tlbiA9PT0gbnVsbCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuZ2V0UmVxdWVzdFRva2VuKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5yZXF1ZXN0VG9rZW4gPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMucmVxdWVzdFRva2VuXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyO1xufSgpKTtcbmV4cG9ydHMuS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyID0gS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9S2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuS2ludG9uZVJlc3BvbnNlSGFuZGxlciA9IHZvaWQgMDtcbnZhciBlcnJvcl8xID0gcmVxdWlyZShcIi4vZXJyb3JcIik7XG52YXIgS2ludG9uZVJlc3BvbnNlSGFuZGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBLaW50b25lUmVzcG9uc2VIYW5kbGVyKF9hKSB7XG4gICAgICAgIHZhciBlbmFibGVBYm9ydFNlYXJjaEVycm9yID0gX2EuZW5hYmxlQWJvcnRTZWFyY2hFcnJvcjtcbiAgICAgICAgdGhpcy5lbmFibGVBYm9ydFNlYXJjaEVycm9yID0gZW5hYmxlQWJvcnRTZWFyY2hFcnJvcjtcbiAgICB9XG4gICAgS2ludG9uZVJlc3BvbnNlSGFuZGxlci5wcm90b3R5cGUuaGFuZGxlID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiByZXNwb25zZS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIF90aGlzLmhhbmRsZVN1Y2Nlc3NSZXNwb25zZShyZXMpOyB9LCBmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIF90aGlzLmhhbmRsZUVycm9yUmVzcG9uc2UoZXJyb3IpOyB9KTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXNwb25zZUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZVN1Y2Nlc3NSZXNwb25zZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5lbmFibGVBYm9ydFNlYXJjaEVycm9yICYmXG4gICAgICAgICAgICAvRmlsdGVyIGFib3J0ZWQgYmVjYXVzZSBvZiB0b28gbWFueSBzZWFyY2ggcmVzdWx0cy8udGVzdChyZXNwb25zZS5oZWFkZXJzW1wieC1jeWJvenUtd2FybmluZ1wiXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcl8xLktpbnRvbmVBYm9ydFNlYXJjaEVycm9yKHJlc3BvbnNlLmhlYWRlcnNbXCJ4LWN5Ym96dS13YXJuaW5nXCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXNwb25zZUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZUVycm9yUmVzcG9uc2UgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFlcnJvci5yZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gRklYTUU6IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzIGVycm9yXG4gICAgICAgICAgICBpZiAoL21hYyB2ZXJpZnkgZmFpbHVyZS8udGVzdChlcnJvci50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2xpZW50Q2VydEF1dGggc2V0dGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvclJlc3BvbnNlID0gZXJyb3IucmVzcG9uc2U7XG4gICAgICAgIHZhciBkYXRhID0gZXJyb3JSZXNwb25zZS5kYXRhLCByZXN0ID0gX19yZXN0KGVycm9yUmVzcG9uc2UsIFtcImRhdGFcIl0pO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChyZXN0LnN0YXR1cywgXCI6IFwiKS5jb25jYXQocmVzdC5zdGF0dXNUZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IGVycm9yXzEuS2ludG9uZVJlc3RBUElFcnJvcihfX2Fzc2lnbih7IGRhdGE6IGRhdGEgfSwgcmVzdCkpO1xuICAgIH07XG4gICAgcmV0dXJuIEtpbnRvbmVSZXNwb25zZUhhbmRsZXI7XG59KCkpO1xuZXhwb3J0cy5LaW50b25lUmVzcG9uc2VIYW5kbGVyID0gS2ludG9uZVJlc3BvbnNlSGFuZGxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtpbnRvbmVSZXNwb25zZUhhbmRsZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5LaW50b25lUmVzdEFQSUNsaWVudCA9IHZvaWQgMDtcbnZhciBCdWxrUmVxdWVzdENsaWVudF8xID0gcmVxdWlyZShcIi4vY2xpZW50L0J1bGtSZXF1ZXN0Q2xpZW50XCIpO1xudmFyIEFwcENsaWVudF8xID0gcmVxdWlyZShcIi4vY2xpZW50L0FwcENsaWVudFwiKTtcbnZhciBSZWNvcmRDbGllbnRfMSA9IHJlcXVpcmUoXCIuL2NsaWVudC9SZWNvcmRDbGllbnRcIik7XG52YXIgU3BhY2VDbGllbnRfMSA9IHJlcXVpcmUoXCIuL2NsaWVudC9TcGFjZUNsaWVudFwiKTtcbnZhciBGaWxlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9jbGllbnQvRmlsZUNsaWVudFwiKTtcbnZhciBodHRwXzEgPSByZXF1aXJlKFwiLi9odHRwL1wiKTtcbnZhciBLaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL0tpbnRvbmVSZXF1ZXN0Q29uZmlnQnVpbGRlclwiKTtcbnZhciBLaW50b25lUmVzcG9uc2VIYW5kbGVyXzEgPSByZXF1aXJlKFwiLi9LaW50b25lUmVzcG9uc2VIYW5kbGVyXCIpO1xudmFyIHBsYXRmb3JtXzEgPSByZXF1aXJlKFwiLi9wbGF0Zm9ybVwiKTtcbnZhciBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JfMSA9IHJlcXVpcmUoXCIuL3BsYXRmb3JtL1Vuc3VwcG9ydGVkUGxhdGZvcm1FcnJvclwiKTtcbnZhciBidWlsZERpc2NyaW1pbmF0ZWRBdXRoID0gZnVuY3Rpb24gKGF1dGgpIHtcbiAgICBpZiAoXCJ1c2VybmFtZVwiIGluIGF1dGgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKHsgdHlwZTogXCJwYXNzd29yZFwiIH0sIGF1dGgpO1xuICAgIH1cbiAgICBpZiAoXCJhcGlUb2tlblwiIGluIGF1dGgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKHsgdHlwZTogXCJhcGlUb2tlblwiIH0sIGF1dGgpO1xuICAgIH1cbiAgICBpZiAoXCJvQXV0aFRva2VuXCIgaW4gYXV0aCkge1xuICAgICAgICByZXR1cm4gX19hc3NpZ24oeyB0eXBlOiBcIm9BdXRoVG9rZW5cIiB9LCBhdXRoKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHBsYXRmb3JtXzEucGxhdGZvcm1EZXBzLmdldERlZmF1bHRBdXRoKCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yXzEuVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXNzaW9uIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gXCIuY29uY2F0KGUucGxhdGZvcm0sIFwiIGVudmlyb25tZW50LlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG59O1xudmFyIEtpbnRvbmVSZXN0QVBJQ2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEtpbnRvbmVSZXN0QVBJQ2xpZW50KG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHNcbiAgICAgICAgICAgIC5idWlsZEJhc2VVcmwob3B0aW9ucy5iYXNlVXJsKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLyskLywgXCJcIik7IC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaFxuICAgICAgICB2YXIgYXV0aCA9IGJ1aWxkRGlzY3JpbWluYXRlZEF1dGgoKF9hID0gb3B0aW9ucy5hdXRoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fSk7XG4gICAgICAgIHZhciByZXF1ZXN0Q29uZmlnQnVpbGRlciA9IG5ldyBLaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXJfMS5LaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIoX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGJhc2VVcmw6IHRoaXMuYmFzZVVybCwgYXV0aDogYXV0aCB9KSk7XG4gICAgICAgIHZhciByZXNwb25zZUhhbmRsZXIgPSBuZXcgS2ludG9uZVJlc3BvbnNlSGFuZGxlcl8xLktpbnRvbmVSZXNwb25zZUhhbmRsZXIoe1xuICAgICAgICAgICAgZW5hYmxlQWJvcnRTZWFyY2hFcnJvcjogKF9jID0gKF9iID0gb3B0aW9ucy5mZWF0dXJlRmxhZ3MpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5lbmFibGVBYm9ydFNlYXJjaEVycm9yKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBodHRwQ2xpZW50ID0gbmV3IGh0dHBfMS5EZWZhdWx0SHR0cENsaWVudCh7XG4gICAgICAgICAgICByZXNwb25zZUhhbmRsZXI6IHJlc3BvbnNlSGFuZGxlcixcbiAgICAgICAgICAgIHJlcXVlc3RDb25maWdCdWlsZGVyOiByZXF1ZXN0Q29uZmlnQnVpbGRlcixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBndWVzdFNwYWNlSWQgPSBvcHRpb25zLmd1ZXN0U3BhY2VJZDtcbiAgICAgICAgdGhpcy5idWxrUmVxdWVzdF8gPSBuZXcgQnVsa1JlcXVlc3RDbGllbnRfMS5CdWxrUmVxdWVzdENsaWVudChodHRwQ2xpZW50LCBndWVzdFNwYWNlSWQpO1xuICAgICAgICB0aGlzLnJlY29yZCA9IG5ldyBSZWNvcmRDbGllbnRfMS5SZWNvcmRDbGllbnQoaHR0cENsaWVudCwgdGhpcy5idWxrUmVxdWVzdF8sIGd1ZXN0U3BhY2VJZCk7XG4gICAgICAgIHRoaXMuYXBwID0gbmV3IEFwcENsaWVudF8xLkFwcENsaWVudChodHRwQ2xpZW50LCBndWVzdFNwYWNlSWQpO1xuICAgICAgICB0aGlzLnNwYWNlID0gbmV3IFNwYWNlQ2xpZW50XzEuU3BhY2VDbGllbnQoaHR0cENsaWVudCwgZ3Vlc3RTcGFjZUlkKTtcbiAgICAgICAgdGhpcy5maWxlID0gbmV3IEZpbGVDbGllbnRfMS5GaWxlQ2xpZW50KGh0dHBDbGllbnQsIGd1ZXN0U3BhY2VJZCk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShLaW50b25lUmVzdEFQSUNsaWVudCwgXCJ2ZXJzaW9uXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuZ2V0VmVyc2lvbigpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgS2ludG9uZVJlc3RBUElDbGllbnQucHJvdG90eXBlLmdldEJhc2VVcmwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VVcmw7XG4gICAgfTtcbiAgICBLaW50b25lUmVzdEFQSUNsaWVudC5wcm90b3R5cGUuYnVsa1JlcXVlc3QgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1bGtSZXF1ZXN0Xy5zZW5kKHBhcmFtcyk7XG4gICAgfTtcbiAgICByZXR1cm4gS2ludG9uZVJlc3RBUElDbGllbnQ7XG59KCkpO1xuZXhwb3J0cy5LaW50b25lUmVzdEFQSUNsaWVudCA9IEtpbnRvbmVSZXN0QVBJQ2xpZW50O1xudmFyIHZhbGlkYXRlT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFsaWRhdGVCYXNlVXJsKG9wdGlvbnMuYmFzZVVybCk7XG4gICAgdmFsaWRhdGVHdWVzdFNwYWNlSWQob3B0aW9ucy5ndWVzdFNwYWNlSWQpO1xuICAgIHZhbGlkYXRlU29ja2V0VGltZW91dChvcHRpb25zLnNvY2tldFRpbWVvdXQpO1xufTtcbnZhciB2YWxpZGF0ZUJhc2VVcmwgPSBmdW5jdGlvbiAoYmFzZVVybCkge1xuICAgIGlmIChiYXNlVXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdXJsID0gbmV3IFVSTChiYXNlVXJsKTtcbiAgICBpZiAodXJsLmhvc3RuYW1lICE9PSBcImxvY2FsaG9zdFwiICYmIHVybC5wcm90b2NvbCAhPT0gXCJodHRwczpcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm90b2NvbCBvZiBiYXNlVXJsIG11c3QgYmUgXCJodHRwc1wiLicpO1xuICAgIH1cbn07XG52YXIgdmFsaWRhdGVHdWVzdFNwYWNlSWQgPSBmdW5jdGlvbiAoZ3Vlc3RTcGFjZUlkKSB7XG4gICAgaWYgKGd1ZXN0U3BhY2VJZCA9PT0gXCJcIiB8fCBndWVzdFNwYWNlSWQgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBndWVzdFNwYWNlSWQ6IGdvdCBbXCIuY29uY2F0KGd1ZXN0U3BhY2VJZCwgXCJdXCIpKTtcbiAgICB9XG59O1xudmFyIHZhbGlkYXRlU29ja2V0VGltZW91dCA9IGZ1bmN0aW9uIChzb2NrZXRUaW1lb3V0KSB7XG4gICAgaWYgKHNvY2tldFRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBudW1iZXIgPSBwYXJzZUZsb2F0KHNvY2tldFRpbWVvdXQudG9TdHJpbmcoKSk7XG4gICAgaWYgKGlzTmFOKG51bWJlcikgfHwgbnVtYmVyIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHNvY2tldFRpbWVvdXQuIE11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuXCIpO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1LaW50b25lUmVzdEFQSUNsaWVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuS2ludG9uZVJlc3RBUElDbGllbnQgPSB2b2lkIDA7XG52YXIgcGxhdGZvcm1fMSA9IHJlcXVpcmUoXCIuL3BsYXRmb3JtL1wiKTtcbnZhciBicm93c2VyRGVwcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wbGF0Zm9ybS9icm93c2VyXCIpKTtcbigwLCBwbGF0Zm9ybV8xLmluamVjdFBsYXRmb3JtRGVwcykoYnJvd3NlckRlcHMpO1xudmFyIEtpbnRvbmVSZXN0QVBJQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9LaW50b25lUmVzdEFQSUNsaWVudFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIktpbnRvbmVSZXN0QVBJQ2xpZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBLaW50b25lUmVzdEFQSUNsaWVudF8xLktpbnRvbmVSZXN0QVBJQ2xpZW50OyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2Vycm9yXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmJyb3dzZXIuanMubWFwIiwiLy8gc3JjL3R5cGVzL2ZpZWxkLmQudHNcclxuXHJcbmV4cG9ydCBlbnVtIEZpZWxkVHlwZSB7XHJcbiAgICBDQUxDID0gXCJDQUxDXCIsXHJcbiAgICBDQVRFR09SWSA9IFwiQ0FURUdPUllcIixcclxuICAgIENIRUNLX0JPWCA9IFwiQ0hFQ0tfQk9YXCIsXHJcbiAgICBDUkVBVEVEX1RJTUUgPSBcIkNSRUFURURfVElNRVwiLFxyXG4gICAgQ1JFQVRPUiA9IFwiQ1JFQVRPUlwiLFxyXG4gICAgREFURSA9IFwiREFURVwiLFxyXG4gICAgREFURVRJTUUgPSBcIkRBVEVUSU1FXCIsXHJcbiAgICBEUk9QX0RPV04gPSBcIkRST1BfRE9XTlwiLFxyXG4gICAgRklMRSA9IFwiRklMRVwiLFxyXG4gICAgR1JPVVAgPSBcIkdST1VQXCIsXHJcbiAgICBHUk9VUF9TRUxFQ1QgPSBcIkdST1VQX1NFTEVDVFwiLFxyXG4gICAgTElOSyA9IFwiTElOS1wiLFxyXG4gICAgTU9ESUZJRVIgPSBcIk1PRElGSUVSXCIsXHJcbiAgICBNVUxUSV9MSU5FX1RFWFQgPSBcIk1VTFRJX0xJTkVfVEVYVFwiLFxyXG4gICAgTVVMVElfU0VMRUNUID0gXCJNVUxUSV9TRUxFQ1RcIixcclxuICAgIE5VTUJFUiA9IFwiTlVNQkVSXCIsXHJcbiAgICBPUkdBTklaQVRJT05fU0VMRUNUID0gXCJPUkdBTklaQVRJT05fU0VMRUNUXCIsXHJcbiAgICBSQURJT19CVVRUT04gPSBcIlJBRElPX0JVVFRPTlwiLFxyXG4gICAgUkVDT1JEX05VTUJFUiA9IFwiUkVDT1JEX05VTUJFUlwiLFxyXG4gICAgUkVGRVJFTkNFX1RBQkxFID0gXCJSRUZFUkVOQ0VfVEFCTEVcIixcclxuICAgIFJJQ0hfVEVYVCA9IFwiUklDSF9URVhUXCIsXHJcbiAgICBTSU5HTEVfTElORV9URVhUID0gXCJTSU5HTEVfTElORV9URVhUXCIsXHJcbiAgICBTVEFUVVMgPSBcIlNUQVRVU1wiLFxyXG4gICAgU1RBVFVTX0FTU0lHTkVFID0gXCJTVEFUVVNfQVNTSUdORUVcIixcclxuICAgIFNVQlRBQkxFID0gXCJTVUJUQUJMRVwiLFxyXG4gICAgVElNRSA9IFwiVElNRVwiLFxyXG4gICAgVVBEQVRFRF9USU1FID0gXCJVUERBVEVEX1RJTUVcIixcclxuICAgIFVTRVJfU0VMRUNUID0gXCJVU0VSX1NFTEVDVFwiXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIENhbGNGb3JtYXR7XHJcbiAgICBOVU1CRVIgPSBcIk5VTUJFUlwiLFxyXG4gICAgTlVNQkVSX0RJR0lUID0gXCJOVU1CRVJfRElHSVRcIixcclxuICAgIERBVEVUSU1FID0gXCJEQVRFVElNRVwiLFxyXG4gICAgREFURSA9IFwiREFURVwiLFxyXG4gICAgVElNRSA9IFwiVElNRVwiLFxyXG4gICAgSE9VUl9NSU5VVEU9IFwiSE9VUl9NSU5VVEVcIixcclxuICAgIERBWV9IT1VSX01JTlVURT0gXCJEQVlfSE9VUl9NSU5VVEVcIlxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkRm9ybSB7XHJcbiAgICBjb2RlOiBzdHJpbmc7XHJcbiAgICB0eXBlOiBGaWVsZFR5cGU7XHJcbiAgICByZXF1aXJlZD86IGJvb2xlYW47XHJcbiAgICBub0xhYmVsPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25Gb3Jte1xyXG4gICAgaW5kZXg6IHN0cmluZztcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5Rm9ybSB7XHJcbiAgICBjb2RlOiBzdHJpbmc7XHJcbiAgICB0eXBlOiAnVVNFUicgfCAnT1JHQU5JWkFUSU9OJyB8ICdHUk9VUCcgfCAnRlVOQ1RJT04nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENhbGNGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xyXG4gICAgdW5pdD86IHN0cmluZztcclxuICAgIGV4cHJlc3Npb24/OiBzdHJpbmc7XHJcbiAgICBmb3JtYXQ/OkNhbGNGb3JtYXQ7XHJcbiAgICB1bml0UG9zaXRpb24/OiAnQkVGT1JFJyB8ICdBRlRFUic7XHJcbiAgICBkaXNwbGF5U2NhbGU/OiBzdHJpbmc7XHJcbiAgICBoaWRlRXhwcmVzc2lvbj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xyXG4gICAgZW5hYmxlZD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZUZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7XHJcbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmc7XHJcbiAgICB1bmlxdWU/OiBib29sZWFuO1xyXG4gICAgZGVmYXVsdE5vd1ZhbHVlPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXRldGltZUZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7XHJcbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmc7XHJcbiAgICB1bmlxdWU/OiBib29sZWFuO1xyXG4gICAgZGVmYXVsdE5vd1ZhbHVlPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEZWNpbWFsRmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcclxuICAgIG1heFZhbHVlPzogc3RyaW5nO1xyXG4gICAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xyXG4gICAgdW5pdFBvc2l0aW9uPzogJ0JFRk9SRScgfCAnQUZURVInO1xyXG4gICAgbWluVmFsdWU/OiBzdHJpbmc7XHJcbiAgICB1bml0Pzogc3RyaW5nO1xyXG4gICAgdW5pcXVlPzogYm9vbGVhbjtcclxuICAgIGRpc3BsYXlTY2FsZT86IHN0cmluZztcclxuICAgIGRpZ2l0PzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFZGl0b3JGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xyXG4gICAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUZvcm0ge1xyXG4gICAgY29kZTogc3RyaW5nO1xyXG4gICAgdHlwZTogJ1VTRVInIHwgJ09SR0FOSVpBVElPTicgfCAnR1JPVVAnIHwgJ0ZVTkNUSU9OJztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGaWVsZE1hcHBpbmdGb3JtIHtcclxuICAgIHJlbGF0ZWRGaWVsZDogc3RyaW5nO1xyXG4gICAgZmllbGQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGaWxlRmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcclxuICAgIHRodW1ibmFpbFNpemU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xyXG4gICAgb3Blbkdyb3VwPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHcm91cFNlbGVjdEZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7XHJcbiAgICBlbnRpdGllczogRW50aXR5Rm9ybVtdO1xyXG4gICAgZGVmYXVsdFZhbHVlPzogRW50aXR5Rm9ybVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExpbmtGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xyXG4gICAgcHJvdG9jb2w/OiAnV0VCJyB8ICdDQUxMJyB8ICdNQUlMJztcclxuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcclxuICAgIG1pbkxlbmd0aD86IHN0cmluZztcclxuICAgIHVuaXF1ZT86IGJvb2xlYW47XHJcbiAgICBtYXhMZW5ndGg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwRmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcclxuICAgIGxvb2t1cDoge1xyXG4gICAgICAgIGxvb2t1cFBpY2tlckZpZWxkczogc3RyaW5nW107XHJcbiAgICAgICAgcmVsYXRlZEtleUZpZWxkOiBzdHJpbmc7XHJcbiAgICAgICAgcmVsYXRlZEFwcDoge1xyXG4gICAgICAgICAgICBhcHA6IHN0cmluZztcclxuICAgICAgICAgICAgY29kZTogc3RyaW5nO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgZmllbGRNYXBwaW5nczogRmllbGRNYXBwaW5nRm9ybVtdO1xyXG4gICAgICAgIHNvcnQ/OiBzdHJpbmc7XHJcbiAgICAgICAgZmlsdGVyQ29uZD86IHN0cmluZztcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZWRBdEZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7fVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNb2RpZmllckZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7fVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNdWx0aXBsZUNoZWNrRmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcclxuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZ1tdO1xyXG4gICAgb3B0aW9uczoge1xyXG4gICAgICAgIFtrZXk6IHN0cmluZ106IE9wdGlvbkZvcm07XHJcbiAgICB9O1xyXG4gICAgYWxpZ24/OiAnSE9SSVpPTlRBTCcgfCAnVkVSVElDQUwnO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpcGxlTGluZVRleHRGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xyXG4gICAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpcGxlU2VsZWN0RmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcclxuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZ1tdO1xyXG4gICAgb3B0aW9uczoge1xyXG4gICAgICAgIFtrZXk6IHN0cmluZ106IE9wdGlvbkZvcm07XHJcbiAgICB9O1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6YXRpb25TZWxlY3RGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xyXG4gICAgZW50aXRpZXM6IEVudGl0eUZvcm1bXTtcclxuICAgIGRlZmF1bHRWYWx1ZT86IEVudGl0eUZvcm1bXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRJZEZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7fVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZWZlcmVuY2VUYWJsZUZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7XHJcbiAgICByZWZlcmVuY2VUYWJsZToge1xyXG4gICAgICAgIGNvbmRpdGlvbjoge1xyXG4gICAgICAgICAgICByZWxhdGVkRmllbGQ6IHN0cmluZztcclxuICAgICAgICAgICAgZmllbGQ6IHN0cmluZztcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNpemU/OiBzdHJpbmc7XHJcbiAgICAgICAgcmVsYXRlZEFwcDoge1xyXG4gICAgICAgICAgICBhcHA6IHN0cmluZztcclxuICAgICAgICAgICAgY29kZTogc3RyaW5nO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgc29ydD86IHN0cmluZztcclxuICAgICAgICBmaWx0ZXJDb25kPzogc3RyaW5nO1xyXG4gICAgICAgIGRpc3BsYXlGaWVsZHM6IHN0cmluZ1tdO1xyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTaW5nbGVDaGVja0ZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7XHJcbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmc7XHJcbiAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgW2tleTogc3RyaW5nXTogT3B0aW9uRm9ybTtcclxuICAgIH07XHJcbiAgICBhbGlnbj86ICdIT1JJWk9OVEFMJyB8ICdWRVJUSUNBTCc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlTGluZVRleHRGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xyXG4gICAgZXhwcmVzc2lvbj86IHN0cmluZztcclxuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcclxuICAgIG1pbkxlbmd0aD86IHN0cmluZztcclxuICAgIHVuaXF1ZT86IGJvb2xlYW47XHJcbiAgICBtYXhMZW5ndGg/OiBzdHJpbmc7XHJcbiAgICBoaWRlRXhwcmVzc2lvbj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlU2VsZWN0RmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcclxuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcclxuICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBba2V5OiBzdHJpbmddOiBPcHRpb25Gb3JtO1xyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdGF0dXNBc3NpZ25lZUZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7XHJcbiAgICBlbmFibGVkPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdGF0dXNGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xyXG4gICAgZW5hYmxlZD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcclxuICAgIGZpZWxkczoge1xyXG4gICAgICAgIFtrZXk6IHN0cmluZ106IENhbGNGaWVsZEZvcm0gfCBDYXRlZ29yeUZpZWxkRm9ybSB8IERhdGVGaWVsZEZvcm0gfCBEYXRldGltZUZpZWxkRm9ybSB8IERlY2ltYWxGaWVsZEZvcm0gfCBFZGl0b3JGaWVsZEZvcm0gfCBGaWxlRmllbGRGb3JtIHwgR3JvdXBGaWVsZEZvcm0gfCBHcm91cFNlbGVjdEZpZWxkRm9ybSB8IExpbmtGaWVsZEZvcm0gfCBMb29rdXBGaWVsZEZvcm0gfCBNb2RpZmllZEF0RmllbGRGb3JtIHwgTW9kaWZpZXJGaWVsZEZvcm0gfCBNdWx0aXBsZUNoZWNrRmllbGRGb3JtIHwgTXVsdGlwbGVMaW5lVGV4dEZpZWxkRm9ybSB8IE11bHRpcGxlU2VsZWN0RmllbGRGb3JtIHwgT3JnYW5pemF0aW9uU2VsZWN0RmllbGRGb3JtIHwgUmVjb3JkSWRGaWVsZEZvcm0gfCBSZWZlcmVuY2VUYWJsZUZpZWxkRm9ybSB8IFNpbmdsZUNoZWNrRmllbGRGb3JtIHwgU2luZ2xlTGluZVRleHRGaWVsZEZvcm0gfCBTaW5nbGVTZWxlY3RGaWVsZEZvcm0gfCBTdGF0dXNBc3NpZ25lZUZpZWxkRm9ybSB8IFN0YXR1c0ZpZWxkRm9ybSB8IFRhYmxlRm9ybSB8IFRpbWVGaWVsZEZvcm0gfCBVc2VyU2VsZWN0RmllbGRGb3JtO1xyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUaW1lRmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcclxuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcclxuICAgIGRlZmF1bHROb3dWYWx1ZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXNlclNlbGVjdEZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7XHJcbiAgICBlbnRpdGllczogRW50aXR5Rm9ybVtdO1xyXG4gICAgZGVmYXVsdFZhbHVlPzogRW50aXR5Rm9ybVtdO1xyXG59IiwiaW1wb3J0IHsgRmllbGRGb3JtLENhbGNGaWVsZEZvcm0sRmllbGRUeXBlLCBDYWxjRm9ybWF0fSBmcm9tIFwiLi4vdHlwZXMvRmllbGRMYXlvdXRcIjtcclxuXHJcbi8qKlxyXG4gKiDpm4boqIjmk43kvZzlrZBcclxuICovXHJcbmV4cG9ydCBlbnVtIE9wZXJhdG9yIHtcclxuICAgIFNVTSA9IFwiU1VNXCIsXHJcbiAgICBBVkcgPSBcIkFWR1wiLFxyXG4gICAgTUFYID0gXCJNQVhcIixcclxuICAgIE1JTiA9IFwiTUlOXCIsXHJcbiAgICBDT1VOVCA9IFwiQ09VTlRcIixcclxuICAgIEZJUlNUID0gXCJGSVJTVFwiLFxyXG4gICAgTEFTVCA9IFwiTEFTVFwiXHJcbn1cclxuXHJcbi8qKlxyXG4gKiDpm4boqIjplqLmlbBcclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQWdncmVnYXRvciB7XHJcbiAgICBwcml2YXRlIGRhdGE6IHN0cmluZ1tdO1xyXG4gICAgcHJpdmF0ZSBmaWVsZDogRmllbGRGb3JtO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IHN0cmluZ1tdLCBmaWVsZDogRmllbGRGb3JtKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0b051bWJlckFycmF5KCk6IG51bWJlcltdIHtcclxuICAgICAgICBjb25zdCBudW1iZXJBcnJheSA9IHRoaXMuZGF0YS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihpdGVtKTtcclxuICAgICAgICAgICAgaWYgKGlzTmFOKG51bSkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg44OV44Kj44O844Or44OJ44CMJHt0aGlzLmZpZWxkLmNvZGV9IOOAjeOBr+aVsOWApOOBq+WkieaPm+OBp+OBjeOBquOBhOOBn+OCgeOAgeioiOeul+OCkuWun+ihjOOBp+OBjeOBvuOBm+OCk+OAgmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudW07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBudW1iZXJBcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN1bSgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgICAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgY29uc3QgbnVtYmVyQXJyYXkgPSB0aGlzLnRvTnVtYmVyQXJyYXkoKTtcclxuICAgICAgICByZXR1cm4gbnVtYmVyQXJyYXkucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGF2ZygpOiBudW1iZXIgfCBudWxsIHtcclxuICAgICAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgY29uc3QgbnVtYmVyQXJyYXkgPSB0aGlzLnRvTnVtYmVyQXJyYXkoKTtcclxuICAgICAgICBjb25zdCB0b3RhbCA9IG51bWJlckFycmF5LnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbCwgMCk7XHJcbiAgICAgICAgcmV0dXJuIHRvdGFsIC8gbnVtYmVyQXJyYXkubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWF4KCk6IG51bWJlciB8IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSBGaWVsZFR5cGUuTlVNQkVSICkge1xyXG4gICAgICAgICAgICBjb25zdCBudW1iZXJBcnJheSA9IHRoaXMudG9OdW1iZXJBcnJheSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoLi4ubnVtYmVyQXJyYXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLmZpZWxkLnR5cGU9PT1GaWVsZFR5cGUuQ0FMQyl7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGNGaWVsZCA9IHRoaXMuZmllbGQgYXMgQ2FsY0ZpZWxkRm9ybTtcclxuICAgICAgICAgICAgaWYoY2FsY0ZpZWxkLmZvcm1hdD09PUNhbGNGb3JtYXQuTlVNQkVSIHx8IGNhbGNGaWVsZC5mb3JtYXQ9PT1DYWxjRm9ybWF0Lk5VTUJFUl9ESUdJVCl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJBcnJheSA9IHRoaXMudG9OdW1iZXJBcnJheSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KC4uLm51bWJlckFycmF5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnJlZHVjZSgobWF4LCBpdGVtKSA9PiAoaXRlbSA+IG1heCA/IGl0ZW0gOiBtYXgpLCB0aGlzLmRhdGFbMF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWluKCk6IG51bWJlciB8IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSBGaWVsZFR5cGUuTlVNQkVSICkge1xyXG4gICAgICAgICAgICBjb25zdCBudW1iZXJBcnJheSA9IHRoaXMudG9OdW1iZXJBcnJheSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oLi4ubnVtYmVyQXJyYXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLmZpZWxkLnR5cGU9PT1GaWVsZFR5cGUuQ0FMQyl7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGNGaWVsZCA9IHRoaXMuZmllbGQgYXMgQ2FsY0ZpZWxkRm9ybTtcclxuICAgICAgICAgICAgaWYoY2FsY0ZpZWxkLmZvcm1hdD09PUNhbGNGb3JtYXQuTlVNQkVSIHx8IGNhbGNGaWVsZC5mb3JtYXQ9PT1DYWxjRm9ybWF0Lk5VTUJFUl9ESUdJVCl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJBcnJheSA9IHRoaXMudG9OdW1iZXJBcnJheSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKC4uLm51bWJlckFycmF5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLmRhdGE9PT1udWxsIHx8IHRoaXMuZGF0YS5sZW5ndGg9PT0wKXtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEucmVkdWNlKChtaW4sIGl0ZW0pID0+IChpdGVtIDwgbWluID8gaXRlbSA6IG1pbiksIHRoaXMuZGF0YVswXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmlyc3QoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGggPyB0aGlzLmRhdGFbMF0gOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbGFzdCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA/IHRoaXMuZGF0YVt0aGlzLmRhdGEubGVuZ3RoIC0gMV0gOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjYWxjdWxhdGUob3BlcmF0b3I6IE9wZXJhdG9yKTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuU1VNOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdW0oKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuQVZHOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hdmcoKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuTUFYOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1heCgpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5NSU46XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWluKCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkNPVU5UOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50KCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkZJUlNUOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcnN0KCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkxBU1Q6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFzdCgpO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtcclxuICBJQWN0aW9uLFxyXG4gIElBY3Rpb25SZXN1bHQsXHJcbiAgSUFjdGlvbk5vZGUsXHJcbiAgSUFjdGlvblByb3BlcnR5LFxyXG4gIElDb250ZXh0LFxyXG59IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xyXG5pbXBvcnQge0tpbnRvbmVSZXN0QVBJQ2xpZW50fSBmcm9tICdAa2ludG9uZS9yZXN0LWFwaS1jbGllbnQnO1xyXG5pbXBvcnQgeyBBZ2dyZWdhdG9yLE9wZXJhdG9yfSBmcm9tICcuLi91dGlsL2FnZ3JlZ2F0ZXMnO1xyXG5pbXBvcnQgeyBGaWVsZEZvcm0gfSBmcm9tIFwiLi4vdHlwZXMvRmllbGRMYXlvdXRcIjtcclxuXHJcbmludGVyZmFjZSBJRGF0YVByb2Nlc3NpbmdQcm9wcyB7XHJcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcclxuICBzb3VyY2VzOiBTb3VyY2VzO1xyXG4gIGNvbmRpdGlvbjogc3RyaW5nO1xyXG4gIHZlck5hbWU/OiBWZXJOYW1lO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ29uZGl0aW9uIHtcclxuICBxdWVyeVN0cmluZzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVmVyTmFtZSB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGFjdGlvbk5hbWU6IHN0cmluZztcclxuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xyXG4gIHZhcnM6IFZhcltdO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVmFyIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGZpZWxkOiBGaWVsZEZvcm07XHJcbiAgbG9naWNhbE9wZXJhdG9yOiBDYWxjT3BlcmF0b3I7XHJcbiAgdk5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIENhbGNPcGVyYXRvciB7XHJcbiAgb3BlcmF0b3I6IE9wZXJhdG9yO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBTb3VyY2VzIHtcclxuICBhcHA6IEFwcDtcclxuICBmaWVsZHM6IEZpZWxkRm9ybVtdO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQXBwIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbnR5cGUgUmVzdWx0ID0ge1xyXG4gIFtrZXk6IHN0cmluZ106IHtcclxuICAgIHR5cGU6IHN0cmluZztcclxuICAgIHZhbHVlOiBhbnlbXTtcclxuICB9O1xyXG59O1xyXG5cclxudHlwZSBBbnlPYmplY3QgPSB7XHJcbiAgW2tleTogc3RyaW5nXTogYW55O1xyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIERhdGFQcm9jZXNzaW5nQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICBwcm9wczogSURhdGFQcm9jZXNzaW5nUHJvcHMgO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMubmFtZSA9IFwi44OH44O844K/5Yem55CGXCI7XHJcbiAgICB0aGlzLmFjdGlvblByb3BzID0gW107XHJcbiAgICB0aGlzLnByb3BzID0ge1xyXG4gICAgICBkaXNwbGF5TmFtZTonJyxcclxuICAgICAgY29uZGl0aW9uOicnLFxyXG4gICAgICBzb3VyY2VzOntcclxuICAgICAgICBhcHA6e1xyXG4gICAgICAgICAgaWQ6XCJcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZmllbGRzOltdXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcHJvY2VzcyhcclxuICAgIG5vZGVzOiBJQWN0aW9uTm9kZSxcclxuICAgIGV2ZW50OiBhbnksXHJcbiAgICBjb250ZXh0OiBJQ29udGV4dFxyXG4gICk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IG5vZGVzLmFjdGlvblByb3BzO1xyXG5cclxuICAgIHRoaXMucHJvcHMgPSBub2Rlcy5BY3Rpb25WYWx1ZSBhcyBJRGF0YVByb2Nlc3NpbmdQcm9wcztcclxuICAgIGNvbnN0IGNvbmRpdGlvbiA9IEpTT04ucGFyc2UodGhpcy5wcm9wcy5jb25kaXRpb24pIGFzIENvbmRpdGlvbjtcclxuICAgIGxldCByZXN1bHQgPSB7XHJcbiAgICAgIGNhbk5leHQ6IHRydWUsXHJcbiAgICAgIHJlc3VsdDogXCJcIixcclxuICAgIH0gYXMgSUFjdGlvblJlc3VsdDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICghdGhpcy5wcm9wcykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5nZXRRdWVyeShjb25kaXRpb24ucXVlcnlTdHJpbmcsY29udGV4dC52YXJpYWJsZXMpO1xyXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5zZWxlY3REYXRhKHF1ZXJ5KTtcclxuICAgICAgXHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZGF0YSBcIiwgZGF0YSk7XHJcblxyXG4gICAgICBpZih0aGlzLnByb3BzLnZlck5hbWUpe1xyXG4gICAgICAgICBjb25zdCB2YXJWYWx1ZXM9IHRoaXMucHJvcHMudmVyTmFtZS52YXJzLnJlZHVjZSgoYWNjLCBmKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFzPWRhdGFbZi5maWVsZC5jb2RlXS52YWx1ZTtcclxuICAgICAgICAgICAgY29uc3QgYWdnID0gbmV3IEFnZ3JlZ2F0b3IoZGF0YXMsZi5maWVsZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGFnZy5jYWxjdWxhdGUoZi5sb2dpY2FsT3BlcmF0b3Iub3BlcmF0b3IpXHJcbiAgICAgICAgICAgIGFjY1tmLnZOYW1lXT1yZXN1bHQ7XHJcbiAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICB9LCB7fSBhcyBBbnlPYmplY3QpO1xyXG4gICAgICAgICAgY29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdPXZhclZhbHVlcztcclxuICAgICAgICBjb25zb2xlLmxvZyhcImNvbnRleHQgXCIsIGNvbnRleHQpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwi44OH44O844K/6ZuG6KiI5Lit5L6L5aSW44GM55m655Sf44GX44G+44GX44Gf44CCXCIsIGVycm9yKTtcclxuICAgICAgaWYoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcil7XHJcbiAgICAgICAgZXZlbnQuZXJyb3IgPSBg44OH44O844K/6ZuG6KiI5Lit5L6L5aSW44GM55m655Sf44GX44G+44GX44Gf44CCICR7ZXJyb3IubWVzc2FnZX1gO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBldmVudC5lcnJvciA9IFwi44OH44O844K/6ZuG6KiI5Lit5L6L5aSW44GM55m655Sf44GX44G+44GX44Gf44CCXCI7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBzdHIgXHJcbiAgICogQHBhcmFtIHZhcnMgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZ2V0UXVlcnkgPSAoc3RyOiBzdHJpbmcsIHZhcnM6IGFueSkgPT4ge1xyXG4gICAgY29uc29sZS5sb2coc3RyKTtcclxuICAgIGNvbnN0IHJlZ2V4ID0gL3ZhclxcKCguKj8pXFwpL2c7XHJcbiAgICBsZXQgbWF0Y2g7XHJcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCB2YXJOYW1lID0gbWF0Y2hbMV07XHJcbiAgICAgIGlmICh2YXJOYW1lIGluIHZhcnMpIHtcclxuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShtYXRjaFswXSwgdmFyc1t2YXJOYW1lXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDlpInmlbAke3Zhck5hbWV944GM6KaL44Gk44GL44KK44G+44Gb44KTYCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKHN0cik7XHJcbiAgICByZXR1cm4gc3RyO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIOODh+ODvOOCv+OCkuWPluW+l+OBmeOCi1xyXG4gICAqIEBwYXJhbSBxdWVyeSBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBzZWxlY3REYXRhID0gYXN5bmMgKCBxdWVyeT86IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3QgYXBpID0gbmV3IEtpbnRvbmVSZXN0QVBJQ2xpZW50KCk7XHJcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnByb3BzLnNvdXJjZXMuZmllbGRzLm1hcCgoZmllbGQpPT5maWVsZC5jb2RlKTtcclxuICAgIGNvbnN0IHJlc3AgPSAgYXdhaXQgYXBpLnJlY29yZC5nZXRBbGxSZWNvcmRzKHtcclxuICAgICAgICBhcHA6IHRoaXMucHJvcHMuc291cmNlcy5hcHAuaWQsXHJcbiAgICAgICAgZmllbGRzOmZpZWxkcyxcclxuICAgICAgICBjb25kaXRpb246cXVlcnlcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogUmVzdWx0ID0ge307XHJcbiAgICAgIHJlc3AuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW1lbnQpKSB7XHJcbiAgICAgICAgICBpZiAoIXJlc3VsdFtrZXldKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0geyB0eXBlOiB2YWx1ZS50eXBlLCB2YWx1ZTogW10gfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJlc3VsdFtrZXldLnZhbHVlLnB1c2godmFsdWUudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgXHJcbiAgfTtcclxuXHJcbiAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XHJcbiAgfVxyXG59XHJcblxyXG5uZXcgRGF0YVByb2Nlc3NpbmdBY3Rpb24oKTsiLCJpbXBvcnQge1xyXG4gIElBY3Rpb24sXHJcbiAgSUFjdGlvblJlc3VsdCxcclxuICBJQWN0aW9uTm9kZSxcclxuICBJQWN0aW9uUHJvcGVydHksXHJcbiAgSUNvbnRleHQsXHJcbn0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XHJcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7IEtpbnRvbmVSZXN0QVBJQ2xpZW50IH0gZnJvbSBcIkBraW50b25lL3Jlc3QtYXBpLWNsaWVudFwiO1xyXG5pbXBvcnQgeyBMb29rdXAgfSBmcm9tIFwiQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvS2ludG9uZUZpZWxkcy90eXBlcy9wcm9wZXJ0eVwiO1xyXG5pbXBvcnQgeyBGaWVsZEZvcm0sIEZpZWxkVHlwZSB9IGZyb20gXCIuLi90eXBlcy9GaWVsZExheW91dFwiO1xyXG5pbnRlcmZhY2UgUHJvcHMge1xyXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XHJcbiAgc291cmNlczogU291cmNlcztcclxuICBkYXRhTWFwcGluZzogRGF0YU1hcHBpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBEYXRhTWFwcGluZyB7XHJcbiAgZGF0YTogTWFwcGluZ1tdO1xyXG4gIGNyZWF0ZVdpdGhOdWxsOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTWFwcGluZyB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBmcm9tOiBGcm9tO1xyXG4gIHRvOiBUbztcclxuICBpc0tleTogYm9vbGVhbjtcclxufVxyXG5cclxuXHJcblxyXG5pbnRlcmZhY2UgVG8ge1xyXG4gIGFwcDogQXBwO1xyXG4gIGZpZWxkczpGaWVsZEZvcm1bXTtcclxuICBpc0RpYWxvZ1Zpc2libGU6IGJvb2xlYW47XHJcbn1cclxuXHJcblxyXG5pbnRlcmZhY2UgRnJvbSB7XHJcbiAgc2hhcmVkVGV4dDogc3RyaW5nO1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgb2JqZWN0VHlwZTogJ3ZhcmlhYmxlJ3wnZmllbGQnfCd0ZXh0JztcclxufVxyXG5cclxuaW50ZXJmYWNlIElWYXIgZXh0ZW5kcyBGcm9te1xyXG4gIG5hbWU6e1xyXG4gICAgbmFtZTpzdHJpbmc7XHJcbiAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgSUZyb21GaWVsZCBleHRlbmRzIEZyb20sRmllbGRGb3Jte1xyXG5cclxufVxyXG5pbnRlcmZhY2UgU291cmNlcyB7XHJcbiAgYXBwOiBBcHA7XHJcbn1cclxuXHJcbmludGVyZmFjZSBBcHAge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgY3JlYXRlZGF0ZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRGF0YVVwZGF0ZUFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb24ge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XHJcbiAgZGF0YU1hcHBpbmdQcm9wczogUHJvcHM7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLm5hbWUgPSBcIuODh+ODvOOCv+abtOaWsFwiO1xyXG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xyXG4gICAgdGhpcy5kYXRhTWFwcGluZ1Byb3BzID0ge30gYXMgUHJvcHM7XHJcbiAgICB0aGlzLnJlZ2lzdGVyKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwcm9jZXNzKFxyXG4gICAgcHJvcDogSUFjdGlvbk5vZGUsXHJcbiAgICBldmVudDogYW55LFxyXG4gICAgY29udGV4dDogSUNvbnRleHRcclxuICApOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBwcm9wLmFjdGlvblByb3BzO1xyXG4gICAgdGhpcy5kYXRhTWFwcGluZ1Byb3BzID0gcHJvcC5BY3Rpb25WYWx1ZSBhcyBQcm9wcztcclxuICAgIGNvbnNvbGUubG9nKGNvbnRleHQpO1xyXG4gICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgY2FuTmV4dDogdHJ1ZSxcclxuICAgICAgcmVzdWx0OiBcIlwiLFxyXG4gICAgfSBhcyBJQWN0aW9uUmVzdWx0O1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbG9va3VwRml4ZWRGaWVsZENvZGVzID0gYXdhaXQgZ2V0TG9va3VwRml4ZWRGaWVsZENvZGVzKFxyXG4gICAgICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcy5zb3VyY2VzLmFwcC5pZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gY3JlYXRlV2l0aE51bGwg44GM5pyJ5Yq544Gq5aC05ZCI44Gv44CBNCDnlarnm67jga7jg5Hjg6njg6Hjg7zjgr/jg7zjgpIgdHJ1ZSDjgavjgZfjgaYgZG9VcGRhdGUg6Zai5pWw44OW44Op44Oz44OB44KS5a6f6KGM44GX44G+44GZ44CCXHJcbiAgICAgIGlmICh0aGlzLmRhdGFNYXBwaW5nUHJvcHMuZGF0YU1hcHBpbmcuY3JlYXRlV2l0aE51bGwpIHtcclxuICAgICAgICBhd2FpdCBkb1VwZGF0ZShcclxuICAgICAgICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcy5kYXRhTWFwcGluZy5kYXRhLFxyXG4gICAgICAgICAgdGhpcy5kYXRhTWFwcGluZ1Byb3BzLnNvdXJjZXMuYXBwLmlkLFxyXG4gICAgICAgICAgY29udGV4dCxcclxuICAgICAgICAgIHRydWUsIC8vIOOCreODvOOBjOOBquOBhOWgtOWQiOOAgeOBvuOBn+OBr+OCreODvOOBp+OCv+ODvOOCsuODg+ODiOOBjOimi+OBpOOBi+OCieOBquOBhOWgtOWQiOOBq+OAgeODnuODg+ODlOODs+OCsOadoeS7tuOBq+OCiOOBo+OBpuaWsOOBl+OBhOODrOOCs+ODvOODieOCkuS9nOaIkOOBmeOCi+OBi+OBqeOBhuOBi+OCkuaxuuWumuOBmeOCi+OBn+OCgeOBq+S9v+eUqOOBleOCjOOBvuOBmeOAglxyXG4gICAgICAgICAgbG9va3VwRml4ZWRGaWVsZENvZGVzXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAvLyDjgq3jg7zjgYzjgarjgYTjgajmm7TmlrDlr77osaHjgpLlj5blvpfjgafjgY3jgarjgYTjgZ/jgoHjgIHjgZPjga7mmYLngrnjgafjga7jgb/mm7TmlrDjgYzooYzjgo/jgozjgb7jgZnjgIIgZG9VcGRhdGUg6Zai5pWw44GuIDQg55Wq55uu44Gu44OR44Op44Oh44O844K/44O844GvIGZhbHNlIOOBp+OBmeOAglxyXG4gICAgICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcy5kYXRhTWFwcGluZy5kYXRhXHJcbiAgICAgICAgICAubWFwKChtKSA9PiBtLmlzS2V5KVxyXG4gICAgICAgICAgLmZpbmQoKGlzS2V5KSA9PiBpc0tleSA9PT0gdHJ1ZSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgYXdhaXQgZG9VcGRhdGUoXHJcbiAgICAgICAgICB0aGlzLmRhdGFNYXBwaW5nUHJvcHMuZGF0YU1hcHBpbmcuZGF0YSxcclxuICAgICAgICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcy5zb3VyY2VzLmFwcC5pZCxcclxuICAgICAgICAgIGNvbnRleHQsXHJcbiAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgIGxvb2t1cEZpeGVkRmllbGRDb2Rlc1xyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgZG9DcmVhdGUoXHJcbiAgICAgICAgICB0aGlzLmRhdGFNYXBwaW5nUHJvcHMuZGF0YU1hcHBpbmcuZGF0YSxcclxuICAgICAgICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcy5zb3VyY2VzLmFwcC5pZCxcclxuICAgICAgICAgIGNvbnRleHQsXHJcbiAgICAgICAgICBsb29rdXBGaXhlZEZpZWxkQ29kZXNcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRGF0YU1hcHBpbmdBY3Rpb24gZXJyb3JcIiwgZXJyb3IpO1xyXG4gICAgICByZXN1bHQuY2FuTmV4dCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXCJkYXRhTWFwcGluZ1Byb3BzXCIsIHRoaXMuZGF0YU1hcHBpbmdQcm9wcyk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyKCk6IHZvaWQge1xyXG4gICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xyXG4gIH1cclxufVxyXG5cclxubmV3IERhdGFVcGRhdGVBY3Rpb24oKTtcclxuXHJcbmNvbnN0IGdldENvbnRleHRWYXJCeVBhdGggPSAob2JqOiBhbnksIHBhdGg6IHN0cmluZykgPT4ge1xyXG4gIHJldHVybiBwYXRoLnNwbGl0KFwiLlwiKS5yZWR1Y2UoKG8sIGspID0+IChvIHx8IHt9KVtrXSwgb2JqKTtcclxufTtcclxuXHJcbmludGVyZmFjZSBVcGRhdGVSZWNvcmQge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgcmVjb3JkOiB7XHJcbiAgICBba2V5OiBzdHJpbmddOiB7XHJcbiAgICAgIHZhbHVlOiBhbnk7XHJcbiAgICB9O1xyXG4gIH07XHJcbn1cclxuXHJcbmNvbnN0IGNsaWVudCA9IG5ldyBLaW50b25lUmVzdEFQSUNsaWVudCgpO1xyXG5cclxuY29uc3QgZ2V0RnJvbVZhbHVlPShpdGVtOk1hcHBpbmcsY29udGV4dDpJQ29udGV4dCk9PntcclxuICBpZiAoaXRlbS5mcm9tLm9iamVjdFR5cGUgPT09IFwidmFyaWFibGVcIikge1xyXG4gICAgY29uc3QgcmZyb20gPWl0ZW0uZnJvbSBhcyBJVmFyO1xyXG4gICAgcmV0dXJuICBnZXRDb250ZXh0VmFyQnlQYXRoKGNvbnRleHQudmFyaWFibGVzLHJmcm9tLm5hbWUubmFtZSk7XHJcbiAgfWVsc2UgaWYoaXRlbS5mcm9tLm9iamVjdFR5cGUgPT09IFwiZmllbGRcIil7XHJcbiAgICBjb25zdCBmaWVsZCA9IGl0ZW0uZnJvbSBhcyBJRnJvbUZpZWxkO1xyXG4gICAgcmV0dXJuIGNvbnRleHQucmVjb3JkW2ZpZWxkLmNvZGVdLnZhbHVlO1xyXG4gIH1cclxuICBlbHNlIHtcclxuICAgIHJldHVybiBpdGVtLmZyb20uc2hhcmVkVGV4dDtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGRvVXBkYXRlID0gYXN5bmMgKFxyXG4gIG1hcHBpbmdEYXRhOiBNYXBwaW5nW10sXHJcbiAgYXBwSWQ6IHN0cmluZyxcclxuICBjb250ZXh0OiBJQ29udGV4dCxcclxuICBuZWVkQ3JlYXRlOiBib29sZWFuLFxyXG4gIGxvb2t1cEZpeGVkRmllbGRDb2Rlczogc3RyaW5nW11cclxuKSA9PiB7XHJcbiAgY29uc3QgdGFyZ2V0RmllbGQgPSBhd2FpdCBmaW5kVXBkYXRlRmllbGQobWFwcGluZ0RhdGEsIGFwcElkLCBjb250ZXh0KTtcclxuICBjb25zb2xlLmxvZyh0YXJnZXRGaWVsZCk7XHJcbiAgaWYgKHRhcmdldEZpZWxkLnJlY29yZHMubGVuZ3RoID09PSAwICYmIG5lZWRDcmVhdGUpIHtcclxuICAgIGF3YWl0IGRvQ3JlYXRlKG1hcHBpbmdEYXRhLCBhcHBJZCwgY29udGV4dCwgbG9va3VwRml4ZWRGaWVsZENvZGVzKTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8g44Oe44OD44OU44Oz44Kw44OH44O844K/44KS5Y2Y57SU44Gq44Kq44OW44K444Kn44Kv44OI44Gr5Yem55CG44GX44CB44K944O844K55YCk44GM5aSJ5pWw44Gu5aC05ZCI44Gv5aSJ5pWw44KS572u44GN5o+b44GI44G+44GZ44CCXHJcbiAgICBjb25zdCBtYXBwaW5nUnVsZXMgPSBtYXBwaW5nRGF0YVxyXG4gICAgICAuZmlsdGVyKFxyXG4gICAgICAgIChtKSA9PlxyXG4gICAgICAgICAgT2JqZWN0LmtleXMobS5mcm9tKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAhbG9va3VwRml4ZWRGaWVsZENvZGVzLmluY2x1ZGVzKG0udG8uZmllbGRzWzBdLmNvZGUpXHJcbiAgICAgIClcclxuICAgICAgLm1hcCgobSkgPT4ge1xyXG4gICAgICAgIGlmIChtLmZyb20ub2JqZWN0VHlwZSA9PT0gXCJ2YXJpYWJsZVwiKSB7XHJcbiAgICAgICAgICBjb25zdCByZnJvbSA9bS5mcm9tIGFzIElWYXI7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2YWx1ZTogZ2V0Q29udGV4dFZhckJ5UGF0aChjb250ZXh0LnZhcmlhYmxlcyxyZnJvbS5uYW1lLm5hbWUpLFxyXG4gICAgICAgICAgICBjb2RlOiBtLnRvLmZpZWxkc1swXS5jb2RlLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9ZWxzZSBpZihtLmZyb20ub2JqZWN0VHlwZSA9PT0gXCJmaWVsZFwiKXtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkID0gbS5mcm9tIGFzIElGcm9tRmllbGQ7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2YWx1ZTogY29udGV4dC5yZWNvcmRbZmllbGQuY29kZV0udmFsdWUsXHJcbiAgICAgICAgICAgIGNvZGU6IG0udG8uZmllbGRzWzBdLmNvZGUsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBtLmZyb20uc2hhcmVkVGV4dCxcclxuICAgICAgICAgICAgY29kZTogbS50by5maWVsZHNbMF0uY29kZSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVSZWNvcmRzOiBVcGRhdGVSZWNvcmRbXSA9IHRhcmdldEZpZWxkLnJlY29yZHMubWFwKFxyXG4gICAgICAodGFyZ2V0UmVjb3JkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXBkYXRlUmVjb3JkOiBVcGRhdGVSZWNvcmRbXCJyZWNvcmRcIl0gPSB7fTtcclxuXHJcbiAgICAgICAgLy8g44Oe44OD44OU44Oz44Kw5YaF44Gu44Or44O844Or44Gr44OS44OD44OI44GX44Gf44OV44Kj44O844Or44OJ44Gu44G/44GM5pu05paw44GV44KM44G+44GZ44CCXHJcbiAgICAgICAgZm9yIChjb25zdCBtYXBwaW5nIG9mIG1hcHBpbmdSdWxlcykge1xyXG4gICAgICAgICAgaWYgKHRhcmdldFJlY29yZFttYXBwaW5nLmNvZGVdKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZVJlY29yZFttYXBwaW5nLmNvZGVdID0ge1xyXG4gICAgICAgICAgICAgIHZhbHVlOiBtYXBwaW5nLnZhbHVlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGlkOiB0YXJnZXRSZWNvcmQuJGlkLnZhbHVlIGFzIHN0cmluZyxcclxuICAgICAgICAgIHJlY29yZDogdXBkYXRlUmVjb3JkLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgY29uc29sZS5sb2codXBkYXRlUmVjb3Jkcyk7XHJcbiAgICBhd2FpdCBjbGllbnQucmVjb3JkLnVwZGF0ZVJlY29yZHMoe1xyXG4gICAgICBhcHA6IGFwcElkLFxyXG4gICAgICByZWNvcmRzOiB1cGRhdGVSZWNvcmRzLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgbWFrZVF1ZXJ5PShmaWVsZDpGaWVsZEZvcm0sa2V5OmFueSk9PntcclxuICBpZihmaWVsZC50eXBlPT09RmllbGRUeXBlLk5VTUJFUiB8fCBmaWVsZC50eXBlPT09RmllbGRUeXBlLlJFQ09SRF9OVU1CRVIpe1xyXG4gICAgcmV0dXJuIGAke2ZpZWxkLmNvZGV9ID0gJHtOdW1iZXIoa2V5KX1gXHJcbiAgfVxyXG4gIGlmKHR5cGVvZiBrZXk9PT0nc3RyaW5nJyl7XHJcbiAgICByZXR1cm4gYCR7ZmllbGQuY29kZX0gPSBcIiR7a2V5fVwiYFxyXG4gIH1cclxufVxyXG5cclxuXHJcbmNvbnN0IGZpbmRVcGRhdGVGaWVsZCA9IGFzeW5jIChcclxuICBtYXBwaW5nRGF0YTogTWFwcGluZ1tdLFxyXG4gIGFwcElkOiBzdHJpbmcsXHJcbiAgY29udGV4dDogSUNvbnRleHRcclxuKSA9PiB7XHJcbiAgY29uc3QgcXVlcnlTdHIgPSBtYXBwaW5nRGF0YVxyXG4gICAgLmZpbHRlcigobSkgPT4gbS50by5hcHAgJiYgbS50by5maWVsZHMgJiYgbS50by5maWVsZHMubGVuZ3RoID4gMCAmJiBtLmlzS2V5KVxyXG4gICAgLm1hcCgobSkgPT4ge1xyXG4gICAgICBpZiAobS5mcm9tLm9iamVjdFR5cGUgPT09IFwidmFyaWFibGVcIikge1xyXG4gICAgICAgIGNvbnN0IHZmcm9tID0gbS5mcm9tIGFzIElWYXI7XHJcbiAgICAgICAgcmV0dXJuIG1ha2VRdWVyeShtLnRvLmZpZWxkc1swXSxnZXRDb250ZXh0VmFyQnlQYXRoKGNvbnRleHQudmFyaWFibGVzICwgdmZyb20ubmFtZS5uYW1lKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihtLmZyb20ub2JqZWN0VHlwZSA9PT0gXCJmaWVsZFwiKXtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IG0uZnJvbSBhcyBJRnJvbUZpZWxkO1xyXG4gICAgICAgIHJldHVybiBtYWtlUXVlcnkobS50by5maWVsZHNbMF0sY29udGV4dC5yZWNvcmRbZmllbGQuY29kZV0udmFsdWUpO1xyXG4gICAgICB9IFxyXG4gICAgICBlbHNle1xyXG4gICAgICAgIHJldHVybiBtYWtlUXVlcnkobS50by5maWVsZHNbMF0sbS5mcm9tLnNoYXJlZFRleHQpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgLmpvaW4oXCImXCIpO1xyXG4gIC8vIOaknOe0ouadoeS7tuOBjOepuuOBruWgtOWQiOOBr+WFqOODrOOCs+ODvOODieOCkui/lOOBmeOBn+OCgeOAgeaknOe0ouWvvuixoeOBjOimi+OBpOOBi+OCieOBquOBhOWgtOWQiOOBr+aknOe0ouOBr+ihjOOCj+OCjOOBvuOBm+OCk+OAglxyXG4gIGlmIChxdWVyeVN0ci5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlY29yZHM6IFtdLFxyXG4gICAgfTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGF3YWl0IGNsaWVudC5yZWNvcmQuZ2V0UmVjb3Jkcyh7XHJcbiAgICAgIGFwcDogYXBwSWQsXHJcbiAgICAgIC8vIHF1ZXJ5OiB1bmRlZmluZWRcclxuICAgICAgcXVlcnk6IHF1ZXJ5U3RyLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgZG9DcmVhdGUgPSBhc3luYyAoXHJcbiAgbWFwcGluZ0RhdGE6IE1hcHBpbmdbXSxcclxuICBhcHBJZDogc3RyaW5nLFxyXG4gIGNvbnRleHQ6IElDb250ZXh0LFxyXG4gIGxvb2t1cEZpeGVkRmllbGRDb2Rlczogc3RyaW5nW11cclxuKSA9PiB7XHJcbiAgY29uc3QgZmlsdGVySGFuZGxlciA9ICAoaXRlbTpNYXBwaW5nKT0+e1xyXG4gICAgaWYoIWl0ZW0udG8uZmllbGRzIHx8IGl0ZW0udG8uZmllbGRzLmxlbmd0aD09PTApe1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZihpdGVtLmZyb20ub2JqZWN0VHlwZSA9PT0gXCJ2YXJpYWJsZVwiICYmIChpdGVtLmZyb20gYXMgSVZhcikubmFtZS5uYW1lICApe1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmKGl0ZW0uZnJvbS5vYmplY3RUeXBlID09PSBcImZpZWxkXCIgJiYgKGl0ZW0uZnJvbSBhcyBJRnJvbUZpZWxkKS5jb2RlKXtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZihpdGVtLmZyb20ub2JqZWN0VHlwZSA9PT0gXCJ0ZXh0XCIgJiYgaXRlbS5mcm9tLnNoYXJlZFRleHQhPT1udWxsKXtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGNvbnN0IHJlY29yZCA9IG1hcHBpbmdEYXRhXHJcbiAgICAuZmlsdGVyKGZpbHRlckhhbmRsZXIpXHJcbiAgICAuZmlsdGVyKChpdGVtKSA9PiAhbG9va3VwRml4ZWRGaWVsZENvZGVzLmluY2x1ZGVzKGl0ZW0udG8uZmllbGRzWzBdLmNvZGUpKVxyXG4gICAgLnJlZHVjZSgoYWNjdW11bGF0b3IsIGl0ZW0pID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5hY2N1bXVsYXRvcixcclxuICAgICAgICBbaXRlbS50by5maWVsZHNbMF0uY29kZV06IHtcclxuICAgICAgICAgIHZhbHVlOiBnZXRGcm9tVmFsdWUoaXRlbSxjb250ZXh0KSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG4gICAgfSwge30pO1xyXG4gIGlmIChyZWNvcmQgJiYgT2JqZWN0LmtleXMocmVjb3JkKS5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zb2xlLmxvZyhyZWNvcmQpO1xyXG4gICAgYXdhaXQgY2xpZW50LnJlY29yZC5hZGRSZWNvcmQoe1xyXG4gICAgICBhcHA6YXBwSWQsXHJcbiAgICAgIHJlY29yZDpyZWNvcmRcclxuICAgIH0pO1xyXG4gICAgLy8gYXdhaXQga2ludG9uZS5hcGkoa2ludG9uZS5hcGkudXJsKFwiL2svdjEvcmVjb3JkLmpzb25cIiwgdHJ1ZSksIFwiUE9TVFwiLCB7XHJcbiAgICAvLyAgIGFwcDogYXBwSWQsXHJcbiAgICAvLyAgIHJlY29yZDogcmVjb3JkLFxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgZ2V0TG9va3VwRml4ZWRGaWVsZENvZGVzID0gYXN5bmMgKGFwcElkOiBzdHJpbmcpID0+IHtcclxuICByZXR1cm4gYXdhaXQgY2xpZW50LmFwcFxyXG4gICAgLmdldEZvcm1GaWVsZHMoeyBhcHA6IGFwcElkIH0pXHJcbiAgICAudGhlbigocmVzcCkgPT5cclxuICAgICAgT2JqZWN0LnZhbHVlcyhyZXNwLnByb3BlcnRpZXMpXHJcbiAgICAgICAgLmZpbHRlcigoZikgPT4gKGYgYXMgTG9va3VwKS5sb29rdXAgIT09IHVuZGVmaW5lZClcclxuICAgICAgICAuZmxhdE1hcCgoZikgPT4gKGYgYXMgTG9va3VwKS5sb29rdXAuZmllbGRNYXBwaW5ncy5tYXAoKG0pID0+IG0uZmllbGQpKVxyXG4gICAgKTtcclxufTtcclxuIiwiaW1wb3J0IHtcclxuICBJQWN0aW9uLFxyXG4gIElBY3Rpb25SZXN1bHQsXHJcbiAgSUFjdGlvbk5vZGUsXHJcbiAgSUFjdGlvblByb3BlcnR5LFxyXG4gIElDb250ZXh0LFxyXG59IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xyXG5cclxuXHJcbmludGVyZmFjZSBQcm9wcyB7XHJcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcclxuICBmaWVsZDogRmllbGQ7XHJcbiAgdmVyTmFtZTogVmVyTmFtZTtcclxufVxyXG5cclxuaW50ZXJmYWNlIFZlck5hbWUge1xyXG4gIG5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIEZpZWxkIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIGNvZGU6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIG5vTGFiZWw6IGJvb2xlYW47XHJcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XHJcbiAgbWluTGVuZ3RoOiBzdHJpbmc7XHJcbiAgbWF4TGVuZ3RoOiBzdHJpbmc7XHJcbiAgZXhwcmVzc2lvbjogc3RyaW5nO1xyXG4gIGhpZGVFeHByZXNzaW9uOiBib29sZWFuO1xyXG4gIHVuaXF1ZTogYm9vbGVhbjtcclxuICBkZWZhdWx0VmFsdWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEN1cnJlbnRGaWVsZEdldEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb24ge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XHJcbiAgY3VycmVudEZpZWxkR2V0UHJvcHM6IFByb3BzO1xyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5uYW1lID0gXCLjg5XjgqPjg7zjg6vjg4njga7lgKTjgpLlj5blvpfjgZnjgotcIjtcclxuICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBbXTtcclxuICAgIHRoaXMuY3VycmVudEZpZWxkR2V0UHJvcHMgPSB7fSBhcyBQcm9wcztcclxuICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHByb2Nlc3MoXHJcbiAgICBwcm9wOiBJQWN0aW9uTm9kZSxcclxuICAgIGV2ZW50OiBhbnksXHJcbiAgICBjb250ZXh0OiBJQ29udGV4dFxyXG4gICk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgdGhpcy5jdXJyZW50RmllbGRHZXRQcm9wcyA9IHByb3AuQWN0aW9uVmFsdWUgYXMgUHJvcHM7XHJcbiAgICB0aGlzLmFjdGlvblByb3BzID0gcHJvcC5hY3Rpb25Qcm9wcztcclxuXHJcbiAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICBjYW5OZXh0OiB0cnVlLFxyXG4gICAgICByZXN1bHQ6IFwiXCIsXHJcbiAgICB9IGFzIElBY3Rpb25SZXN1bHQ7XHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMuY3VycmVudEZpZWxkR2V0UHJvcHMudmVyTmFtZS5uYW1lXSA9IGNvbnRleHQucmVjb3JkW3RoaXMuY3VycmVudEZpZWxkR2V0UHJvcHMuZmllbGQuY29kZV0udmFsdWU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiQ3VycmVudEZpZWxkR2V0QWN0aW9uIGVycm9yXCIsIGVycm9yKTtcclxuICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICByZWdpc3RlcigpOiB2b2lkIHtcclxuICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdID0gdGhpcztcclxuICB9XHJcbn1cclxuXHJcbm5ldyBDdXJyZW50RmllbGRHZXRBY3Rpb24oKTtcclxuIiwiaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcclxuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuLyoqXHJcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxyXG4gKi9cclxuaW50ZXJmYWNlIElSZWd1bGFyQ2hlY2tQcm9wc3tcclxuICAgIGZpZWxkOklGaWVsZDsvL+ODgeOCp+ODg+OCr+OBmeOCi+ODleOCo+ODvOODq+ODieOBruWvvuixoVxyXG4gICAgbWVzc2FnZTpzdHJpbmc7Ly/jgqjjg6njg7zjg6Hjg4Pjgrvjg7zjgrhcclxuICAgIHJlZ0V4cHJlc3Npb246c3RyaW5nOy8v5q2j6KaP6KGo54++5byPXHJcbn1cclxuLyoqXHJcbiAqIOato+imj+ihqOePvuODgeOCp+ODg+OCr+OCouOCr+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJlZ3VsYXJDaGVja0FjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb257XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XHJcbiAgICBwcm9wczpJUmVndWxhckNoZWNrUHJvcHM7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMubmFtZT1cIuato+imj+ihqOePvuODgeOCp+ODg+OCr1wiO1xyXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XHJcbiAgICAgICAgdGhpcy5wcm9wcz17XHJcbiAgICAgICAgICAgIGZpZWxkOntjb2RlOicnfSxcclxuICAgICAgICAgICAgbWVzc2FnZTonJyxcclxuICAgICAgICAgICAgcmVnRXhwcmVzc2lvbjonJ1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL+OCouOCr+OCt+ODp+ODs+OCkueZu+mMsuOBmeOCi1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcclxuICAgICAqIEBwYXJhbSBldmVudCBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuICAgICAgICBsZXQgcmVzdWx0PXtcclxuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ21lc3NhZ2UnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ3JlZ0V4cHJlc3Npb24naW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJUmVndWxhckNoZWNrUHJvcHM7XHJcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXHJcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGV2ZW50LnJlY29yZDtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS52YWx1ZTtcclxuICAgICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHRoaXMucHJvcHMucmVnRXhwcmVzc2lvbik7XHJcbiAgICAgICAgICAgIGlmKCFyZWdleC50ZXN0KHZhbHVlKSl7XHJcbiAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvcj10aGlzLnByb3BzLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0PSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDp0cnVlXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1jYXRjaChlcnJvcil7XHJcbiAgICAgICAgICAgIGV2ZW50LmVycm9yPWVycm9yO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9ZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XHJcbiAgICB9XHJcbiAgICBcclxufVxyXG5uZXcgUmVndWxhckNoZWNrQWN0aW9uKCk7XHJcbiIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7IElBY3Rpb24sIElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElGaWVsZCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG4vKipcclxuICog44Ki44Kv44K344On44Oz44Gu5bGe5oCn5a6a576pXHJcbiAqL1xyXG5pbnRlcmZhY2UgSU1haWxDaGVja1Byb3BzIHtcclxuICAgIGZpZWxkOiBJRmllbGQ7Ly/jg4Hjgqfjg4Pjgq/jgZnjgovjg5XjgqPjg7zjg6vjg4njga7lr77osaFcclxuICAgIG1lc3NhZ2U6IHN0cmluZzsvL+OCqOODqeODvOODoeODg+OCu+ODvOOCuFxyXG4gICAgZW1haWxDaGVjazpzdHJpbmc7XHJcbn1cclxuLyoqXHJcbiAqIOODoeODvOODq+OCouODieODrOOCueODgeOCp+ODg+OCr+OCouOCr+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1haWxDaGVja0FjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb24ge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xyXG4gICAgcHJvcHM6IElNYWlsQ2hlY2tQcm9wcztcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwi44Oh44O844Or44Ki44OJ44Os44K544OB44Kn44OD44KvXCI7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xyXG4gICAgICAgIHRoaXMucHJvcHMgPSB7XHJcbiAgICAgICAgICAgIGZpZWxkOiB7IGNvZGU6ICcnIH0sXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICcnLFxyXG4gICAgICAgICAgICBlbWFpbENoZWNrOicnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcclxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlIFxyXG4gICAgICogQHBhcmFtIGV2ZW50IFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTogSUFjdGlvbk5vZGUsIGV2ZW50OiBhbnkpOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICBjYW5OZXh0OiB0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XHJcblxyXG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ21lc3NhZ2UnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ2VtYWlsQ2hlY2snIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSU1haWxDaGVja1Byb3BzO1xyXG4gICAgICAgICAgICAvL+adoeS7tuW8j+OBruioiOeul+e1kOaenOOCkuWPluW+l1xyXG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0udmFsdWU7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5lbWFpbENoZWNrID09PSAn5Y6z5qC8Jykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEvXlthLXpBLVowLTlfLV0rQFthLXpBLVowLTlfLV0rKFxcLlthLXpBLVowLTlfLV0rKSskLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yID0gdGhpcy5wcm9wcy5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZW1haWxDaGVjayA9PT0gJ+OChuOCi+OCgScpIHtcclxuICAgICAgICAgICAgICAgIGlmICghL15bXkBdK0BbXkBdKyQvLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0uZXJyb3IgPSB0aGlzLnByb3BzLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuTmV4dDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHRydWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LmVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICByZWdpc3RlcigpOiB2b2lkIHtcclxuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG59XHJcbm5ldyBNYWlsQ2hlY2tBY3Rpb24oKTtcclxuIiwiaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcclxuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuLyoqXHJcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxyXG4gKi9cclxuaW50ZXJmYWNlIElTdHJDb3VudENoZWNrUHJvcHN7XHJcbiAgICBmaWVsZDpJRmllbGQ7Ly/jg4Hjgqfjg4Pjgq/jgZnjgovjg5XjgqPjg7zjg6vjg4njga7lr77osaFcclxuICAgIG1lc3NhZ2U6c3RyaW5nOy8v44Ko44Op44O844Oh44OD44K744O844K4XHJcbiAgICBtYXhMZW5ndGg6bnVtYmVyOy8vXHJcbn1cclxuLyoqXHJcbiAqIOato+imj+ihqOePvuODgeOCp+ODg+OCr+OCouOCr+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN0ckNvdW50Q2hlY2tBY2l0b24gaW1wbGVtZW50cyBJQWN0aW9ue1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xyXG4gICAgcHJvcHM6SVN0ckNvdW50Q2hlY2tQcm9wcztcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5uYW1lPVwi5paH5a2X5pWw44OB44Kn44OD44KvXCI7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcclxuICAgICAgICB0aGlzLnByb3BzPXtcclxuICAgICAgICAgICAgZmllbGQ6e2NvZGU6Jyd9LFxyXG4gICAgICAgICAgICBtZXNzYWdlOicnLFxyXG4gICAgICAgICAgICBtYXhMZW5ndGg6MFxyXG4gICAgICAgIH1cclxuICAgICAgICAvL+OCouOCr+OCt+ODp+ODs+OCkueZu+mMsuOBmeOCi1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcclxuICAgICAqIEBwYXJhbSBldmVudCBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuICAgICAgICBsZXQgcmVzdWx0PXtcclxuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ21lc3NhZ2UnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ3N0ckV4cHJlc3Npb24naW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSVN0ckNvdW50Q2hlY2tQcm9wcztcclxuICAgICAgICAgICAgLy/mnaHku7blvI/jga7oqIjnrpfntZDmnpzjgpLlj5blvpdcclxuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBtYXhMZW5ndGggPSB0aGlzLnByb3BzLm1heExlbmd0aDtcclxuICAgICAgICAgICAgaWYodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycgKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKG1heExlbmd0aCA8IHZhbHVlLmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvciA9IHRoaXMucHJvcHMubWVzc2FnZTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQ9IHtcclxuICAgICAgICAgICAgICAgICAgICBjYW5OZXh0OnRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OnRydWVcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcclxuICAgICAgICAgICAgZXZlbnQuZXJyb3I9ZXJyb3I7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcclxuICAgIH1cclxuICAgIFxyXG59XHJcbm5ldyBTdHJDb3VudENoZWNrQWNpdG9uKCk7XHJcbiIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7IElBY3Rpb24sIElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElGaWVsZCAsSUNvbnRleHQsIElWYXJOYW1lfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuLyoqXHJcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxyXG4gKi9cclxuaW50ZXJmYWNlIElEYXRldGltZUdldHRlclByb3BzIHtcclxuICAgIC8qKuWkieaVsOOBruWQjeWJjSAqL1xyXG4gICAgdmVyTmFtZTpJVmFyTmFtZTtcclxufVxyXG4vKipcclxuICog54++5Zyo5pel5pmC44KS5Y+W5b6X44GZ44KL44Ki44Kv44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0ZXRpbWVHZXR0ZXJBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIHByb3BzOiBJRGF0ZXRpbWVHZXR0ZXJQcm9wcztcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwi54++5Zyo5pel5pmCXCI7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xyXG4gICAgICAgIHRoaXMucHJvcHMgPSB7XHJcbiAgICAgICAgICAgIHZlck5hbWU6e25hbWU6Jyd9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcclxuICAgICAqIEBwYXJhbSBldmVudCBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlLCBldmVudDogYW55LGNvbnRleHQ6SUNvbnRleHQpOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICBjYW5OZXh0OiB0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XHJcblxyXG4gICAgICAgICAgICBpZiAoISgndmVyTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSURhdGV0aW1lR2V0dGVyUHJvcHM7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSAmJiB0aGlzLnByb3BzLnZlck5hbWUubmFtZSE9PScnKXtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXT10b2RheS50b0lTT1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBldmVudC5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xyXG4gICAgfVxyXG5cclxufVxyXG5uZXcgRGF0ZXRpbWVHZXR0ZXJBY3Rpb24oKTtcclxuIiwiXHJcblxyXG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xyXG5pbXBvcnQgeyAgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQsIElDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XHJcbmltcG9ydCB7IENvbmRpdGlvblRyZWUgfSBmcm9tICcuLi90eXBlcy9Db25kaXRpb25zJztcclxuXHJcblxyXG5cclxuLyoqXHJcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxyXG4gKi9cclxuaW50ZXJmYWNlIElJbnNlcnRWYWx1ZVByb3Bze1xyXG4gICAgZmllbGQ6SUZpZWxkO1xyXG4gICAgY29uZGl0aW9uOnN0cmluZztcclxuICAgIHZhbHVlOnN0cmluZztcclxuICAgIHNob3c6c3RyaW5nO1xyXG59XHJcbi8qKlxyXG4gKlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEluc2VydFZhbHVlQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIHByb3BzOklJbnNlcnRWYWx1ZVByb3BzO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLm5hbWU9XCLlgKTjgpLmjL/lhaXjgZnjgotcIjsvLyBEQuOBq+eZu+mMsuOBl+OBn+OCouOCr+OCt+ODp+ODs+WQjVxyXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XHJcbiAgICAgICAgLy/jg5fjg63jg5Hjg4bjgqPlsZ7mgKfjga7liJ3mnJ/ljJZcclxuICAgICAgICB0aGlzLnByb3BzPXtcclxuICAgICAgICAgICAgZmllbGQ6e2NvZGU6Jyd9LFxyXG4gICAgICAgICAgICBjb25kaXRpb246JycsXHJcbiAgICAgICAgICAgIHZhbHVlOicnLFxyXG4gICAgICAgICAgICBzaG93OicnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56m655m95paH5a2X44KS56m655m95paH5a2X44GM6Z2e5a++5b+c44Gu44OV44Kj44O844Or44OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gm44GE44Gq44GE44GL44CB5b+F6aCI6aCF55uu44OV44Kj44O844Or44OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gm44GE44Gq44GE44GL44OB44Kn44OD44Kv44GZ44KLXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRWYWx1ZSAtIOaMv+WFpeOBmeOCi+WApFxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gLeWFpeWKm+WApOOBjOacieWKueOBquaXpeS7mOW9ouW8j+OBruWgtOWQiOOBr3RydWXjgpLov5TjgZfjgIHjgZ3jgYbjgafjgarjgYTloLTlkIjjga/kvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcclxuICAgICAqL1xyXG4gICAgY2hlY2tJbnB1dEJsYW5rKGZpZWxkVHlwZSA6c3RyaW5nIHwgdW5kZWZpbmVkLGlucHV0VmFsdWUgOnN0cmluZyxmaWVsZENvZGUgOnN0cmluZyxmaWVsZFJlcXVpcmVkIDpib29sZWFuIHwgdW5kZWZpbmVkLGV2ZW50IDphbnkpOiBib29sZWFue1xyXG4gICAgICAgIC8v5q2j6KaP6KGo54++44OB44Kn44OD44KvXHJcbiAgICAgICAgbGV0IGJsYW5rQ2hlY2s9IGlucHV0VmFsdWUubWF0Y2goL14oXFxzfOOAgCkrPyQvKTsvL+WNiuinkuOCueODmuODvOOCueODu+OCv+ODluaWh+Wtl+ODu+aUueihjOODu+aUueODmuODvOOCuOODu+WFqOinkuOCueODmuODvOOCuVxyXG5cclxuICAgICAgICBpZihibGFua0NoZWNrICE9PSBudWxsKXtcclxuICAgICAgICAgICAgLy/nqbrnmb3mloflrZfjgpLnqbrnmb3mloflrZfjgYzpnZ7lr77lv5zjga7jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgovloLTlkIjjgIHkvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcclxuICAgICAgICAgICAgaWYoZmllbGRUeXBlID09PSBcIk5VTUJFUlwiIHx8IGZpZWxkVHlwZSA9PT0gXCJEQVRFXCIgfHwgZmllbGRUeXBlID09PSBcIkRBVEVUSU1FXCIgfHwgZmllbGRUeXBlID09PSBcIlRJTUVcIiB8fCBmaWVsZFR5cGUgPT09IFwiVVNFUl9TRUxFQ1RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWVsZFR5cGUgPT09IFwiT1JHQU5JWkFUSU9OX1NFTEVDVFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJHUk9VUF9TRUxFQ1RcIiB8fCBmaWVsZFR5cGUgPT09IFwiUkFESU9fQlVUVE9OXCIgfHwgZmllbGRUeXBlID09PSBcIkRST1BfRE9XTlwiIHx8IGZpZWxkVHlwZSA9PT0gXCJDSEVDS19CT1hcIiB8fCBmaWVsZFR5cGUgPT09IFwiTVVMVElfU0VMRUNUXCIpe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ10gPSBcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr44Gv44CB56m655m95paH5a2X44Gv5oy/5YWl44Gn44GN44G+44Gb44KT44CCXCI7IC8v44Os44Kz44O844OJ44Gr44Ko44Op44O844KS6KGo56S6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+OBr+OAgeepuueZveaWh+Wtl+OBr+aMv+WFpeOBp+OBjeOBvuOBm+OCk+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcclxuXHJcbiAgICAgICAgICAgIC8v56m655m95paH5a2X44KS5b+F6aCI6aCF55uu44OV44Kj44O844Or44OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gm44GE44KL5aC05ZCI44CB5L6L5aSW44KS55m655Sf44GV44Gb44KLXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGZpZWxkUmVxdWlyZWQpe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ10gPSBcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gv5b+F6aCI6aCF55uu44Gu44Gf44KB44CB56m655m95paH5a2X44Gv5oy/5YWl44Gn44GN44G+44Gb44KT44CCXCI7IC8v44Os44Kz44O844OJ44Gr44Ko44Op44O844KS6KGo56S6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBr+W/hemgiOmgheebruOBruOBn+OCgeOAgeepuueZveaWh+Wtl+OBr+aMv+WFpeOBp+OBjeOBvuOBm+OCk+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlhaXlipvlgKTjgYzljYrop5LmlbDlrZfjgYvjg4Hjgqfjg4Pjgq/jgZnjgovplqLmlbBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC0g5oy/5YWl44GZ44KL5YCkXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAt5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5pWw5YCk44Gu5aC05ZCI44GvdHJ1ZeOCkui/lOOBl+OAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr+S+i+WkluOCkueZuueUn+OBleOBm+OCi1xyXG4gICAgICovXHJcbiAgICBjaGVja0lucHV0TnVtYmVyKGlucHV0VmFsdWUgOnN0cmluZyxmaWVsZENvZGUgOnN0cmluZyxldmVudCA6YW55KTogYm9vbGVhbntcclxuICAgICAgICBsZXQgaW5wdXROdW1iZXJWYWx1ZSA9IE51bWJlcihpbnB1dFZhbHVlKTsvL+aVsOWApOWei+OBq+WkieaPm1xyXG5cclxuICAgICAgICAvL+aciemZkOaVsOOBi+OBqeOBhuOBi+WIpOWumnNcclxuICAgICAgICBpZighaXNGaW5pdGUoaW5wdXROdW1iZXJWYWx1ZSkpe1xyXG4gICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXSA9IFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavlhaXjgozjgojjgYbjgajjgZfjgZ/lgKTjga/jgIHnhKHlirnjgarml6Xku5jlvaLlvI/jgafjgZnjgIJcIjsgLy/jg6zjgrPjg7zjg4njgavjgqjjg6njg7zjgpLooajnpLpcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavlhaXjgozjgojjgYbjgajjgZfjgZ/lgKTjga/jgIHmnInlirnjgarmlbDlgKTjgafjga/jgYLjgorjgb7jgZvjgpPjgILjgIzlgKTjgpLmjL/lhaXjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiDlhaXlipvlgKTjgYzmnInlirnjgarml6Xku5jlvaLlvI/jgYvjg4Hjgqfjg4Pjgq/jgZnjgovplqLmlbBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC0g5oy/5YWl44GZ44KL5YCkXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAt5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5pel5LuY5b2i5byP44Gu5aC05ZCI44GvdHJ1ZeOCkui/lOOBl+OAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr+S+i+WkluOCkueZuueUn+OBleOBm+OCi1xyXG4gICAgICovXHJcbiAgICBjaGVja0lucHV0RGF0ZShpbnB1dFZhbHVlIDpzdHJpbmcsZmllbGRDb2RlIDpzdHJpbmcsZXZlbnQgOmFueSk6IGJvb2xlYW57XHJcbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cclxuICAgICAgICBsZXQgdHdvRGlnaXRNb250aERheSA9IGlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pJC8pOy8vNOahgeOBruaVsOWtly0y5qGB44Gu5pWw5a2XLTLmoYHjga7mlbDlrZdcclxuICAgICAgICBsZXQgc2luZ2xlRGlnaXRNb250aERheSA9IGlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7MX0pLShcXGR7MX0pJC8pOy8vNOahgeOBruaVsOWtly0x5qGB44Gu5pWw5a2XLTLmoYHjga7mlbDlrZdcclxuICAgICAgICBsZXQgc2luZ2xlRGlnaXRNb250aCA9IGlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7MX0pLShcXGR7Mn0pJC8pOy8vNOahgeOBruaVsOWtly0x5qGB44Gu5pWw5a2XLTLmoYHjga7mlbDlrZdcclxuICAgICAgICBsZXQgc2luZ2xlRGlnaXREYXkgPSBpbnB1dFZhbHVlLm1hdGNoKC8oXFxkezR9KS0oXFxkezJ9KS0oXFxkezF9KSQvKTsvLzTmoYHjga7mlbDlrZctMuahgeOBruaVsOWtly0x5qGB44Gu5pWw5a2XXHJcbiAgICAgICAgbGV0IGRhdGVUaW1lID0gaW5wdXRWYWx1ZS5tYXRjaCgvKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSlUKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSkuMDAwWi8pOy8v5pmC5Yi75YWl44KK44GuVVRD44Gu5pel5LuY5b2i5byPXHJcbiAgICAgICAgbGV0IGRhdGU7XHJcbiAgICAgICAgLy9kYXRl5Z6L44Gr5aSJ5o+bXHJcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGlucHV0VmFsdWUpO1xyXG5cclxuICAgICAgICAvL2RhdGXlnovlpInmj5vjgafjgY3jgZ/jgYvnorroqo1cclxuICAgICAgICBpZihkYXRlICE9PSB1bmRlZmluZWQgJiYgIWlzTmFOKGRhdGUuZ2V0RGF0ZSgpKSl7XHJcbiAgICAgICAgICAgIC8v5q2j6KaP6KGo54++44OB44Kn44OD44Kv56K66KqNXHJcbiAgICAgICAgICAgIGlmKHR3b0RpZ2l0TW9udGhEYXkgPT09IG51bGwgJiYgc2luZ2xlRGlnaXRNb250aCA9PT0gbnVsbCAmJiBzaW5nbGVEaWdpdERheSA9PT0gbnVsbCAmJiBzaW5nbGVEaWdpdE1vbnRoRGF5ID09PSBudWxsICYmIGRhdGVUaW1lID09PSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXSA9IFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavlhaXjgozjgojjgYbjgajjgZfjgZ/lgKTjga/jgIHnhKHlirnjgarml6Xku5jlvaLlvI/jgafjgZnjgIJcIjsgLy/jg6zjgrPjg7zjg4njgavjgqjjg6njg7zjgpLooajnpLpcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+WFpeOCjOOCiOOBhuOBqOOBl+OBn+WApOOBr+OAgeeEoeWKueOBquaXpeS7mOW9ouW8j+OBp+OBmeOAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiog5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5pmC5Yi75b2i5byP44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRWYWx1ZSAtIOaMv+WFpeOBmeOCi+WApFxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gLeWFpeWKm+WApOOBjOacieWKueOBquaXpeS7mOW9ouW8j+OBruWgtOWQiOOBr3RydWXjgpLov5TjgZfjgIHjgZ3jgYbjgafjgarjgYTloLTlkIjjga/kvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcclxuICAgICAqL1xyXG4gICAgY2hlY2tJbnB1dFRpbWUoaW5wdXRWYWx1ZSA6c3RyaW5nLGZpZWxkQ29kZSA6c3RyaW5nLGV2ZW50IDphbnkpOiBib29sZWFue1xyXG4gICAgICAgIC8v5q2j6KaP6KGo54++44OB44Kn44OD44KvXHJcbiAgICAgICAgbGV0IHRpbWVGb3JtYXQgPWlucHV0VmFsdWUubWF0Y2goL14oWzAtOV18MVswLTldfDJbMC0zXSk6WzAtNV1bMC05XSQvKTtcclxuXHJcbiAgICAgICAgICAgIC8v5q2j6KaP6KGo54++44OB44Kn44OD44Kv56K66KqNXHJcbiAgICAgICAgICAgIGlmKHRpbWVGb3JtYXQgPT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnJlY29yZFtmaWVsZENvZGVdWydlcnJvciddID0gXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+WFpeOCjOOCiOOBhuOBqOOBl+OBn+WApOOBr+OAgeeEoeWKueOBquaZguWIu+W9ouW8j+OBp+OBmeOAglwiOyAvL+ODrOOCs+ODvOODieOBq+OCqOODqeODvOOCkuihqOekulxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5YWl44KM44KI44GG44Go44GX44Gf5YCk44Gv44CB54Sh5Yq544Gq5pmC5Yi75b2i5byP44Gn44GZ44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlhaXlipvlgKTjga7jg5XjgqPjg7zjg6vjg4njgr/jgqTjg5fjgYxEQVRFVElNReOBp+OBguOCjOOBsOOAgeaZguWIu+OBguOCiuOBruaXpeS7mOW9ouW8j+WkieaPm+OBl+OAgURBVEXjgafjgYLjgozjgbDmmYLliLvjgarjgZfjga7ml6Xku5jlvaLlvI/lpInmj5vjgZnjgovplqLmlbBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC3mjL/lhaXjgZnjgovlgKRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZFR5cGUgIC3jg5XjgqPjg7zjg6vjg4njgr/jgqTjg5dcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gLeWFpeWKm+WApOOBjOaXpeS7mOW9ouW8j+OBq+WkieaPm+OBp+OBjeOBn+WgtOWQiOOBr+aWh+Wtl+WIl+OCkui/lOOBl+OAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr+S+i+WkluOCkueZuueUn+OBleOBm+OCi1xyXG4gICAgICovXHJcbiAgICBjaGFuZ2VEYXRlRm9ybWF0KGlucHV0VmFsdWUgOnN0cmluZywgZmllbGRUeXBlIDpzdHJpbmcsZmllbGRDb2RlIDpzdHJpbmcsZXZlbnQgOmFueSk6IHN0cmluZ3tcclxuICAgICAgICBsZXQgZGF0ZVRpbWU7XHJcbiAgICAgICAgbGV0IGRhdGU7XHJcblxyXG4gICAgICAgIC8v5oy/5YWl44GZ44KL5YCk44KSZGF0ZeWei+OBq+WkieaPm1xyXG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShpbnB1dFZhbHVlKTtcclxuICAgICAgICAvL2RhdGXlnovlpInmj5vjgafjgY3jgZ/jgYvnorroqo1cclxuICAgICAgICBpZihkYXRlICE9PSB1bmRlZmluZWQgJiYgIWlzTmFOKGRhdGUuZ2V0RGF0ZSgpKSl7XHJcblxyXG4gICAgICAgICAgICAvL+aXpeaZguODleOCo+ODvOODq+ODieOBruWgtOWQiOOAgeaZguWIu+OBguOCiuOBruaXpeS7mOW9ouW8j+WkieaPm1xyXG4gICAgICAgICAgICBpZihmaWVsZFR5cGUgPT09IFwiREFURVRJTUVcIil7XHJcbiAgICAgICAgICAgICAgICBkYXRlVGltZSA9ZGF0ZS50b0lTT1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVUaW1lO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL+aXpeS7mOODleOCo+ODvOODq+ODieOBruWgtOWQiOOAgeaZguWIu+OBquOBl+OBruaXpeS7mOW9ouW8j+WkieaPm1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUFycmF5PWlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7MSwyfSktKFxcZHsxLDJ9KSQvKTsvLzTmoYHjga7mlbDlrZctMe+9njLmoYHjga7mlbDlrZctMe+9njLmoYHjga7mlbDlrZdcclxuICAgICAgICAgICAgaWYoZGF0ZUFycmF5ICE9PSBudWxsKXtcclxuICAgICAgICAgICAgICAgIGxldCB5ZWFySW5kZXggPSAxO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1vbnRoSW5kZXggPSAyO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRheUluZGV4ID0gMztcclxuICAgICAgICAgICAgICAgIGxldCBkYXRlRm9ybWF0dGVkPWAke2RhdGVBcnJheVt5ZWFySW5kZXhdfS0ke2RhdGVBcnJheVttb250aEluZGV4XX0tJHtkYXRlQXJyYXlbZGF5SW5kZXhdfWBcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlRm9ybWF0dGVkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ10gPSBcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5YWl44KM44KI44GG44Go44GX44Gf5YCk44Gv44CB54Sh5Yq544Gq5pel5LuY5b2i5byP44Gn44GZ44CCXCI7IC8v44Os44Kz44O844OJ44Gr44Ko44Op44O844KS6KGo56S6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavlhaXjgozjgojjgYbjgajjgZfjgZ/lgKTjga/jgIHnhKHlirnjgarml6Xku5jlvaLlvI/jgafjgZnjgILjgIzlgKTjgpLmjL/lhaXjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlhaXlipvlgKTjgYzjg5XjgqPjg7zjg6vjg4njgr/jgqTjg5co44Op44K444Kq44Oc44K/44Oz44O744OJ44Ot44OD44OX44OA44Km44Oz44O76KSH5pWw6YG45oqe44O744OJ44Ot44OD44OX44OA44Km44OzKeOBrumBuOaKnuiCouOBq+WtmOWcqOOBmeOCi+WApOOBi+ODgeOCp+ODg+OCr+OBmeOCi+mWouaVsFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC3lhaXlipvlgKTjgYzmnInlirnjgarlgKTjga7loLTlkIjjga90cnVl44KS6L+U44GX44CB44Gd44GG44Gn44Gq44GE5aC05ZCI44Gv5L6L5aSW44KS55m655Sf44GV44Gb44KLXHJcbiAgICAgKi9cclxuICAgIGNoZWNrSW5wdXRPcHRpb24oaW5wdXRWYWx1ZSA6c3RyaW5nLGZpZWxkT3B0aW9ucyA6c3RyaW5nIHwgdW5kZWZpbmVkLGZpZWxkQ29kZSA6c3RyaW5nLGV2ZW50IDphbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgLy/lhaXlipvlgKTjgYzpgbjmip7ogqLjgavlrZjlnKjjgZnjgovlgKTjgYvjg4Hjgqfjg4Pjgq/jgZfjgIHlrZjlnKjjgZfjgZ/jgol0cnVl44KS6L+U44GZXHJcbiAgICAgICAgaWYoZmllbGRPcHRpb25zICE9PSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IE9iamVjdC5rZXlzKGZpZWxkT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGZvcih2YXIgb3B0aW9uc0luZGV4IGluIG9wdGlvbnMpe1xyXG4gICAgICAgICAgICAgICAgaWYob3B0aW9uc1tvcHRpb25zSW5kZXhdID09PSBpbnB1dFZhbHVlKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ109XCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuOBq+OBr+OAgeWtmOWcqOOBl+OBquOBhOWApOOCkuaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+OBn+OCgeOAgeWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44Gr44Gv44CB5a2Y5Zyo44GX44Gq44GE5YCk44KS5oy/5YWl44GX44KI44GG44Go44GX44Gf44Gf44KB44CB5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YWl5Yqb5YCk44GM44OV44Kj44O844Or44OJ44K/44Kk44OXKOODpuODvOOCtuODvOmBuOaKninjgafjgIHjg6bjg7zjgrbjg7zmg4XloLHjgavlrZjlnKjjgZnjgovlgKTjgYvjg4Hjgqfjg4Pjgq/jgZnjgovplqLmlbBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC0g5oy/5YWl44GZ44KL5YCkXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBib29sZWFufSDlhaXlipvlgKTjgYznmbvpjLLjgZXjgozjgabjgYTjgovjg6bjg7zjgrbjg7zmg4XloLHjgYvjgonopovjgaTjgYvjgaPjgZ/loLTlkIjjgIF0cnVl44KS6L+U44GX44CB6KaL44Gk44GL44KJ44Gq44GL44Gj44Gf5aC05ZCI44CBZmFsc2XjgpLov5TjgZlcclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2V0SW5wdXRVc2VyKGlucHV0VmFsdWUgOnN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgYm9vbGVhbj57XHJcblxyXG4gICAgICAgIC8v44Om44O844K244O85ZCN44KS5qC857SN44GZ44KL5aSJ5pWwXHJcbiAgICAgICAgbGV0IHVzZXJzTmFtZTtcclxuICAgICAgICBjb25zdCB1c2Vyc0luZm9Db2x1bW5JbmRleD0wO1xyXG5cclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIC8vQVBJ44Gn44Om44O844K244O85oOF5aCx44KS5Y+W5b6X44GZ44KLXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3AgPWF3YWl0IGtpbnRvbmUuYXBpKGtpbnRvbmUuYXBpLnVybCgnL3YxL3VzZXJzJywgdHJ1ZSksICdHRVQnLCB7Y29kZXM6W2lucHV0VmFsdWUgXX0pXHJcblxyXG4gICAgICAgICAgICAvL+WFpeWKm+OBleOCjOOBn+ODreOCsOOCpOODs+WQjSjjg6Hjg7zjg6vjgqLjg4njg6zjgrkp44GM44Om44O844K244O85oOF5aCx44Gr55m76Yyy44GV44KM44Gm44GE44KL5aC05ZCI44CB44Gd44Gu44Om44O844K244O85ZCN44KS5Y+W5b6X44GZ44KLXHJcbiAgICAgICAgICAgIGlmIChyZXNwLnVzZXJzW3VzZXJzSW5mb0NvbHVtbkluZGV4XS5jb2RlID09PSBpbnB1dFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB1c2Vyc05hbWU9cmVzcC51c2Vyc1t1c2Vyc0luZm9Db2x1bW5JbmRleF0ubmFtZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/jg6bjg7zjgrbjg7zlkI3jgYzlj5blvpfjgafjgY3jgZ/loLTlkIjjgIHjg63jgrDjgqTjg7PlkI3jgajjg6bjg7zjgrbjg7zlkI3jgpLjg5XjgqPjg7zjg6vjg4njgavjgrvjg4Pjg4jjgZnjgotcclxuICAgICAgICAgICAgaWYodXNlcnNOYW1lID09PSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9Y2F0Y2h7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB1c2Vyc05hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlhaXlipvlgKTjgYzjg5XjgqPjg7zjg6vjg4njgr/jgqTjg5co57WE57mU6YG45oqeKeOBp+OAgee1hOe5lOaDheWgseOBq+WtmOWcqOOBmeOCi+WApOOBi+ODgeOCp+ODg+OCr+OBmeOCi+mWouaVsFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcclxuICAgICAqIEByZXR1cm4ge3N0cmluZyB8IGJvb2xlYW59IOWFpeWKm+WApOOBjOeZu+mMsuOBleOCjOOBpuOBhOOCi+e1hOe5lOaDheWgseOBi+OCieimi+OBpOOBi+OBo+OBn+WgtOWQiOOAgXRydWXjgpLov5TjgZfjgIHopovjgaTjgYvjgonjgarjgYvjgaPjgZ/loLTlkIjjgIFmYWxzZeOCkui/lOOBmVxyXG4gICAgICovXHJcbiAgICBhc3luYyBzZXRJbnB1dE9yZ2FuaXphdGlvbihpbnB1dFZhbHVlIDpzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IGJvb2xlYW4+e1xyXG5cclxuICAgICAgICAvL+e1hOe5lOWQjeOCkuagvOe0jeOBmeOCi+WkieaVsFxyXG4gICAgICAgIGxldCBvcmdhbml6YXRpb25OYW1lO1xyXG4gICAgICAgIGNvbnN0IG9yZ2FuaXphdGlvbnNJbmZvQ29sdW1uSW5kZXg9MDtcclxuXHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAvL0FQSeOBp+e1hOe5lOaDheWgseOCkuWPluW+l+OBmeOCi1xyXG4gICAgICAgICAgICBjb25zdCByZXNwID1hd2FpdCBraW50b25lLmFwaShraW50b25lLmFwaS51cmwoJy92MS9vcmdhbml6YXRpb25zLmpzb24nLCB0cnVlKSwgJ0dFVCcsIHtjb2RlczpbaW5wdXRWYWx1ZSBdfSlcclxuXHJcbiAgICAgICAgICAgIC8v5YWl5Yqb44GV44KM44Gf57WE57mU44Kz44O844OJ44GM57WE57mU5oOF5aCx44Gr55m76Yyy44GV44KM44Gm44GE44KL5aC05ZCI44CB44Gd44Gu57WE57mU5ZCN44KS5Y+W5b6X44GZ44KLXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcC5vcmdhbml6YXRpb25zW29yZ2FuaXphdGlvbnNJbmZvQ29sdW1uSW5kZXhdLmNvZGUgPT09IGlucHV0VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25OYW1lPXJlc3Aub3JnYW5pemF0aW9uc1tvcmdhbml6YXRpb25zSW5mb0NvbHVtbkluZGV4XS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/ntYTnuZTlkI3jgYzlj5blvpfjgafjgY3jgZ/loLTlkIjjgIHntYTnuZTjgrPjg7zjg4njgajntYTnuZTlkI3jgpLjg5XjgqPjg7zjg6vjg4njgavjgrvjg4Pjg4jjgZnjgotcclxuICAgICAgICAgICAgaWYob3JnYW5pemF0aW9uTmFtZSA9PT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWNhdGNoe1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3JnYW5pemF0aW9uTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWFpeWKm+WApOOBjOODleOCo+ODvOODq+ODieOCv+OCpOODlyjjgrDjg6vjg7zjg5fpgbjmip4p44Gn44CB44Kw44Or44O844OX5oOF5aCx44Gr5a2Y5Zyo44GZ44KL5YCk44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRWYWx1ZSAtIOaMv+WFpeOBmeOCi+WApFxyXG4gICAgICogQHJldHVybiB7c3RyaW5nIHwgYm9vbGVhbn0g5YWl5Yqb5YCk44GM55m76Yyy44GV44KM44Gm44GE44KL44Kw44Or44O844OX5oOF5aCx44GL44KJ6KaL44Gk44GL44Gj44Gf5aC05ZCI44CBdHJ1ZeOCkui/lOOBl+OAgeimi+OBpOOBi+OCieOBquOBi+OBo+OBn+WgtOWQiOOAgWZhbHNl44KS6L+U44GZXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNldElucHV0R3JvdXAoaW5wdXRWYWx1ZSA6c3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBib29sZWFuPntcclxuXHJcbiAgICAgICAgLy/jgrDjg6vjg7zjg5flkI3jgpLmoLzntI3jgZnjgovlpInmlbBcclxuICAgICAgICBsZXQgZ3JvdXBzTmFtZTtcclxuICAgICAgICBjb25zdCBncm91cHNJbmZvQ29sdW1uSW5kZXg9MDtcclxuXHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAvL0FQSeOBp+OCsOODq+ODvOODl+aDheWgseOCkuWPluW+l+OBmeOCi1xyXG4gICAgICAgICAgICBjb25zdCByZXNwID1hd2FpdCBraW50b25lLmFwaShraW50b25lLmFwaS51cmwoJy92MS9ncm91cHMuanNvbicsIHRydWUpLCAnR0VUJywge2NvZGVzOltpbnB1dFZhbHVlIF19KVxyXG5cclxuICAgICAgICAgICAgLy/lhaXlipvjgZXjgozjgZ/jgrDjg6vjg7zjg5fjgrPjg7zjg4njgYzjgrDjg6vjg7zjg5fmg4XloLHjgavnmbvpjLLjgZXjgozjgabjgYTjgovloLTlkIjjgIHjgZ3jga7jgrDjg6vjg7zjg5flkI3jgpLlj5blvpfjgZnjgotcclxuICAgICAgICAgICAgaWYgKHJlc3AuZ3JvdXBzW2dyb3Vwc0luZm9Db2x1bW5JbmRleF0uY29kZSA9PT0gaW5wdXRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBzTmFtZT1yZXNwLmdyb3Vwc1tncm91cHNJbmZvQ29sdW1uSW5kZXhdLm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8v44Kw44Or44O844OX5ZCN44GM5Y+W5b6X44Gn44GN44Gf5aC05ZCI44CB44Kw44Or44O844OX44Kz44O844OJ44Go44Kw44Or44O844OX5ZCN44KS44OV44Kj44O844Or44OJ44Gr44K744OD44OI44GZ44KLXHJcbiAgICAgICAgICAgIGlmKGdyb3Vwc05hbWUgPT09IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1jYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGdyb3Vwc05hbWU7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxyXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGVcclxuICAgICAqIEBwYXJhbSBldmVudFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdD17XHJcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcclxuICAgICAgICAgICAgcmVzdWx0OmZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIC8v5bGe5oCn6Kit5a6a44KS5Y+W5b6X44GZ44KLXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ3ZhbHVlJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaWVsZENvbHVtbkluZGV4PTE7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQ29sdW1uSW5kZXg9MztcclxuXHJcbiAgICAgICAgICAgIC8v44OX44Ot44OR44OG44Kj44Gn6YG45oqe44GV44KM44Gf44OV44Kj44O844Or44OJXHJcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkPXRoaXMuYWN0aW9uUHJvcHNbZmllbGRDb2x1bW5JbmRleF0ucHJvcHMubW9kZWxWYWx1ZS50eXBlO1xyXG4gICAgICAgICAgICAvL+ODl+ODreODkeODhuOCo+OBruaMv+WFpeOBmeOCi+WApFxyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZT10aGlzLmFjdGlvblByb3BzW3ZhbHVlQ29sdW1uSW5kZXhdLnByb3BzLm1vZGVsVmFsdWU7XHJcblxyXG4gICAgICAgICAgICAvL+adoeS7tuW8j+OBrue1kOaenOOCkuWPluW+l1xyXG4gICAgICAgICAgICBjb25zdCBjb25kaXRpb25SZXN1bHQgPSB0aGlzLmdldENvbmRpdGlvblJlc3VsdChjb250ZXh0KTtcclxuICAgICAgICAgICAgaWYoIWNvbmRpdGlvblJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL+ODl+ODreODkeODhuOCo+OBruWApOOCkuaMv+WFpeOBmeOCi+ODleOCo+ODvOODq+ODieOBjOacqumBuOaKnuOBruWgtOWQiOOAgeS+i+WkluOCkueZuueUn+OBleOBm+OCi1xyXG4gICAgICAgICAgICBpZihmaWVsZCA9PT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIzlgKTjgpLmjL/lhaXjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgIHlgKTjgpLmjL/lhaXjgZnjgovjg5XjgqPjg7zjg6vjg4njgYzmjIflrprjgZXjgozjgabjgYTjgarjgYvjgaPjgZ/jgZ/jgoHjgIHlh6bnkIbjgYzkuK3mlq3jgZXjgozjgb7jgZfjgZ/jgIJcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8v44OX44Ot44OR44OG44Kj44Gu5YCk44KS5oy/5YWl44GZ44KL44OV44Kj44O844Or44OJ44GM6Z2e5a++5b+c44OV44Kj44O844Or44OJ44Gu5aC05ZCI44CB5L6L5aSW44KS55m655Sf44GV44Gb44KLXHJcbiAgICAgICAgICAgIC8v5re75LuY44OV44Kh44Kk44Or44O744OG44O844OW44Or44O744Kr44OG44K044Oq44O844O744K544OG44O844K/44K544O75L2c5oiQ6ICF44O75pu05paw6ICF44O75L2c5qWt6ICF44O744Oq44OT44K444On44Oz55Wq5Y+344O744Os44Kz44O844OJ55Wq5Y+344O744Os44Kz44O844OJSUTjg7voqIjnrpfjg7vkvZzmiJDml6XmmYLjg7vmm7TmlrDml6XmmYLjg5XjgqPjg7zjg6vjg4njgYzpgbjmip7jgZXjgozjgabjgYTjgovloLTlkIjjgIHkvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcclxuICAgICAgICAgICAgaWYoZmllbGQgPT09IFwiRklMRVwiIHx8IGZpZWxkID09PSBcIlNVQlRBQkxFXCIgfHwgZmllbGQgPT09IFwiQ0FURUdPUllcIiB8fCBmaWVsZCA9PT0gXCJTVEFUVVNcIlxyXG4gICAgICAgICAgICAgICAgICAgIHx8IGZpZWxkID09PSBcIlNUQVRVU19BU1NJR05FRVwiIHx8IGZpZWxkID09PSBcIkNSRUFUT1JcIiB8fCBmaWVsZCA9PT0gXCJNT0RJRklFUlwiIHx8IGZpZWxkID09PSBcIl9fUkVWSVNJT05fX1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZpZWxkID09PSBcIlJFQ09SRF9OVU1CRVJcInx8IGZpZWxkID09PSBcIl9fSURfX1wiIHx8IGZpZWxkID09PVwiQ0FMQ1wiIHx8IGZpZWxkID09PSBcIkNSRUFURURfVElNRVwiIHx8IGZpZWxkID09PSBcIlVQREFURURfVElNRVwiICl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIzlgKTjgpLmjL/lhaXjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgIHpgbjmip7jgZXjgozjgZ/jg5XjgqPjg7zjg6vjg4njga/jgIHlgKTjgpLmjL/lhaXjgZnjgovjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjga/pnZ7lr77lv5zjga7jg5XjgqPjg7zjg6vjg4njga7jgZ/jgoHjgIHlh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8v44OX44Ot44OR44OG44Kj44Gu5oy/5YWl44GZ44KL5YCk44GM5pyq5YWl5Yqb44Gu5aC05ZCI44CB5L6L5aSW44KS55m655Sf44GV44Gb44KLXHJcbiAgICAgICAgICAgIGlmKHZhbHVlID09PSBcIlwiKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBp+OAgeODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBmeOCi+WApOOBjOaMh+WumuOBleOCjOOBpuOBhOOBquOBi+OBo+OBn+OBn+OCgeOAgeWHpueQhuOBjOS4reaWreOBleOCjOOBvuOBl+OBn+OAglwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/ml6Llrprjga7jg5fjg63jg5Hjg4bjgqPjga7jgqTjg7Pjgr/jg7zjg5Xjgqfjg7zjgrnjgbjlpInmj5vjgZnjgotcclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSUluc2VydFZhbHVlUHJvcHM7XHJcblxyXG4gICAgICAgICAgICAvL+aMv+WFpeOBmeOCi+WApOOCkuWPluW+l1xyXG4gICAgICAgICAgICBsZXQgZmllbGRWYWx1ZSA9IHRoaXMucHJvcHMudmFsdWU7XHJcbiAgICAgICAgICAgIC8v44OV44Kj44O844Or44OJ44Gu56iu6aGe44KS5Y+W5b6XXHJcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHRoaXMucHJvcHMuZmllbGQudHlwZTtcclxuICAgICAgICAgICAgLy/jg5XjgqPjg7zjg6vjg4njgYzlv4XpoIjpoIXnm67jgarjga7jgYvlj5blvpdcclxuICAgICAgICAgICAgY29uc3QgZmllbGRSZXF1aXJlZD10aGlzLnByb3BzLmZpZWxkLnJlcXVpcmVkO1xyXG4gICAgICAgICAgICAvL+aMv+WFpeOBmeOCi+ODleOCo+ODvOODq+ODieOBruOCs+ODvOODieOCkuWPluW+l1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZENvZGU9dGhpcy5wcm9wcy5maWVsZC5jb2RlO1xyXG4gICAgICAgICAgICAvL+aMv+WFpeOBmeOCi+WApOOBruW9ouW8j++8iOaJi+WFpeWKm+OBi+WkieaVsO+8ieOCkuWPluW+l1xyXG4gICAgICAgICAgICBjb25zdCBpbnNlcnRWYWx1ZVR5cGU9dGhpcy5wcm9wcy5zaG93O1xyXG4gICAgICAgICAgICAvL+ODqeOCuOOCquODnOOCv+ODs+ODu+ODgeOCp+ODg+OCr+ODnOODg+OCr+OCueODu+ikh+aVsOmBuOaKnuODu+ODieODreODg+ODl+ODgOOCpuODs+OBrumBuOaKnuiCouOCkuWPluW+l1xyXG4gICAgICAgICAgICBsZXQgZmllbGRPcHRpb25zID10aGlzLnByb3BzLmZpZWxkLm9wdGlvbnM7XHJcbiAgICAgICAgICAgIC8v5aSJ5pWw44Gu5YCk44KS5qC857SN44GZ44KLXHJcbiAgICAgICAgICAgIGxldCB2YXJpYWJsZVZhbHVlO1xyXG5cclxuICAgICAgICAgICAgLy/lpInmlbDjga7loLTlkIjjgIHlgKTjgYzlj5blvpfjgafjgY3jgovjgYvjg4Hjgqfjg4Pjgq9cclxuICAgICAgICAgICAgaWYoaW5zZXJ0VmFsdWVUeXBlID09PSBcIuWkieaVsFwiICYmIGNvbmRpdGlvblJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICB2YXJpYWJsZVZhbHVlID0gY29udGV4dC52YXJpYWJsZXNbZmllbGRWYWx1ZV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYodmFyaWFibGVWYWx1ZSA9PT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+WFpeOCjOOCiOOBhuOBqOOBl+OBn+WkieaVsOOBr+OAgeeEoeWKueOBquWFpeWKm+W9ouW8j+OBp+OBmeOAglwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSB2YXJpYWJsZVZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL+WFpeWKm+WApOODgeOCp+ODg+OCr+W+jOOAgeW9ouW8j+WkieaPm+OAgeWei+WkieaPm+OBl+OBn+WApOOCkuagvOe0jeOBmeOCi+WkieaVsFxyXG4gICAgICAgICAgICBsZXQgY29ycmVjdEZvcm1hdHRlZFZhbHVlO1xyXG4gICAgICAgICAgICAvL+WFpeWKm+WApOODgeOCp+ODg+OCr+W+jOOAgeW9ouW8j+WkieaPm+OAgeWei+WkieaPm+OBl+OBn+WApOOCkuagvOe0jeOBmeOCi+mFjeWIl1xyXG4gICAgICAgICAgICBsZXQgY29ycmVjdFZhbHVlcyA6c3RyaW5nW10gPSBbXTtcclxuICAgICAgICAgICAgLy/lhaXlipvjgqjjg6njg7zvvIjnqbrnmb3mloflrZfjga7mt7flhaXvvInjgYzjgarjgYTjgZPjgajjgpLjg4Hjgqfjg4Pjgq9cclxuICAgICAgICAgICAgbGV0IG5vdElucHV0RXJyb3I9dGhpcy5jaGVja0lucHV0QmxhbmsoZmllbGRUeXBlLGZpZWxkVmFsdWUsZmllbGRDb2RlLGZpZWxkUmVxdWlyZWQsZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgLy/mnaHku7blvI/jga7ntZDmnpzjgYx0cnVl44CB5YWl5Yqb44Ko44Op44O877yI56m655m95paH5a2X44Gu5re35YWl77yJ44GM44Gq44GE5aC05ZCI44CB5oy/5YWl44GZ44KL5YCk44KS44OV44Kj44O844Or44OJ44K/44Kk44OX5Yil44Gr44OB44Kn44OD44Kv44GZ44KLXHJcbiAgICAgICAgICAgIGlmKGNvbmRpdGlvblJlc3VsdCAmJiBub3RJbnB1dEVycm9yKXtcclxuXHJcbiAgICAgICAgICAgICAgICAvL+aWh+Wtl+WIl+Wei+OBruODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBpuOBhOOCi+WApOOBjOmBqeWIh+OBruWgtOWQiOOAgWNvcnJlY3RGb3JtYXR0ZWRWYWx1ZeOBq+S7o+WFpeOBmeOCi1xyXG4gICAgICAgICAgICAgICAgaWYoZmllbGRUeXBlID09PSBcIlNJTkdMRV9MSU5FX1RFWFRcIiB8fCBmaWVsZFR5cGUgPT09IFwiTVVMVElfTElORV9URVhUXCIgfHwgZmllbGRUeXBlID09PSBcIlJJQ0hfVEVYVFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJMSU5LXCIgKXtcclxuICAgICAgICAgICAgICAgICAgICBjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgPSBmaWVsZFZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgIC8v5pWw5YCk5Z6L44Gu44OV44Kj44O844Or44OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gm44GE44KL5YCk44GM6YGp5YiH44Gu5aC05ZCI44CB5pWw5YCk5Z6L44Gr5Z6L5aSJ5o+b44GX44GmY29ycmVjdEZvcm1hdHRlZFZhbHVl44Gr5Luj5YWl44GZ44KLXHJcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiTlVNQkVSXCIgKXtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNoZWNrSW5wdXROdW1iZXIoZmllbGRWYWx1ZSxmaWVsZENvZGUsZXZlbnQpKXsvL+WFpeWKm+WApOODgeOCp+ODg+OCr1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgPSBOdW1iZXIoZmllbGRWYWx1ZSk7Ly/lnovlpInmj5tcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy/ml6Xku5jjg7vml6XmmYLlnovjga7jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgovlgKTjgYzpganliIfjga7loLTlkIjjgIHmjIflrprjga7ml6Xku5jjg7vml6XmmYLjgavlvaLlvI/lpInmj5vjgZfjgaZjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKGZpZWxkVHlwZSA9PT0gXCJEQVRFXCIgfHwgZmllbGRUeXBlID09PSBcIkRBVEVUSU1FXCIgKXtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNoZWNrSW5wdXREYXRlKGZpZWxkVmFsdWUsZmllbGRDb2RlLGV2ZW50KSl7Ly/lhaXlipvlgKTjg4Hjgqfjg4Pjgq9cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvcm1hdHRlZERhdGUgPSB0aGlzLmNoYW5nZURhdGVGb3JtYXQoZmllbGRWYWx1ZSxmaWVsZFR5cGUsZmllbGRDb2RlLGV2ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtYXR0ZWREYXRlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSA9IGZvcm1hdHRlZERhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL+aZguWIu+ODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBpuOBhOOCi+WApOOBjOmBqeWIh+OBruWgtOWQiOOAgWNvcnJlY3RGb3JtYXR0ZWRWYWx1ZeOBq+S7o+WFpeOBmeOCi1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZmllbGRUeXBlID09PSBcIlRJTUVcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jaGVja0lucHV0VGltZShmaWVsZFZhbHVlLGZpZWxkQ29kZSxldmVudCkpey8v5YWl5Yqb5YCk44OB44Kn44OD44KvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSA9IGZpZWxkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8v44Op44K444Kq44Oc44K/44Oz44O744OJ44Ot44OD44OX44OA44Km44Oz44Gu44OV44Kj44O844Or44OJ44Gu6YG45oqe6IKi44Go5YWl5Yqb5YCk44GM5LiA6Ie044GX44Gf5aC05ZCI44CBY29ycmVjdEZvcm1hdHRlZFZhbHVl44Gr5Luj5YWl44GZ44KLXHJcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiUkFESU9fQlVUVE9OXCIgfHwgZmllbGRUeXBlID09PSBcIkRST1BfRE9XTlwiKXtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNoZWNrSW5wdXRPcHRpb24oZmllbGRWYWx1ZSxmaWVsZE9wdGlvbnMsZmllbGRDb2RlLGV2ZW50KSl7Ly/lhaXlipvlgKTjg4Hjgqfjg4Pjgq9cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdEZvcm1hdHRlZFZhbHVlID0gZmllbGRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy/jg4Hjgqfjg4Pjgq/jg5zjg4Pjgq/jgrnjg7vopIfmlbDpgbjmip7jga7jg5XjgqPjg7zjg6vjg4njga7pgbjmip7ogqLjgajlhaXlipvlgKTjgYzkuIDoh7TjgZfjgZ/loLTlkIjjgIFjb3JyZWN0VmFsdWVz44Gu6YWN5YiX44Gr5Luj5YWl44GZ44KLXHJcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiQ0hFQ0tfQk9YXCIgfHwgZmllbGRUeXBlID09PSBcIk1VTFRJX1NFTEVDVFwiICl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jaGVja0lucHV0T3B0aW9uKGZpZWxkVmFsdWUsZmllbGRPcHRpb25zLGZpZWxkQ29kZSxldmVudCkpey8v5YWl5Yqb5YCk44OB44Kn44OD44KvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RWYWx1ZXNbMF0gPSBmaWVsZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL+ODpuODvOOCtuODvOaDheWgseODleOCo+ODvOODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+WApOOBjOmBqeWIh+OBquWgtOWQiOOAgWNvcnJlY3RGb3JtYXR0ZWRWYWx1ZeOBq+S7o+WFpeOBmeOCi1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZmllbGRUeXBlID09PSBcIlVTRVJfU0VMRUNUXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgIC8v5oy/5YWl44GZ44KL5YCk44GM44Om44O844K244O85oOF5aCx44GL44KJ6KaL44Gk44GL44KM44Gw44CB44Om44O844K244O85ZCN44KS5qC857SNXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXJzPWF3YWl0IHRoaXMuc2V0SW5wdXRVc2VyKGZpZWxkVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL+ODpuODvOOCtuODvOWQjeOBjOagvOe0jeOBp+OBjeOBpuOBhOOCi+WgtOWQiOOAgeODreOCsOOCpOODs+WQjeOBqOODpuODvOOCtuODvOWQjeOCkmNvcnJlY3RGb3JtYXR0ZWRWYWx1ZeOBq+S7o+WFpeOBmeOCi1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2Vycyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnJlY29yZFtmaWVsZENvZGVdWydlcnJvciddPVwi44Om44O844K244O86YG45oqe44Gr44CB5oy/5YWl44GX44KI44GG44Go44GX44Gf44Om44O844K244O85oOF5aCx44Gv6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44Gf44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuODpuODvOOCtuODvOmBuOaKnuOBq+OAgeaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+ODpuODvOOCtuODvOaDheWgseOBr+imi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdEZvcm1hdHRlZFZhbHVlPVt7IGNvZGU6IGZpZWxkVmFsdWUsIG5hbWU6IHVzZXJzIH1dO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL+e1hOe5lOaDheWgseODleOCo+ODvOODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+WApOOBjOmBqeWIh+OBquWgtOWQiOOAgWNvcnJlY3RGb3JtYXR0ZWRWYWx1ZeOBq+S7o+WFpeOBmeOCi1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZmllbGRUeXBlID09PSBcIk9SR0FOSVpBVElPTl9TRUxFQ1RcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgLy/mjL/lhaXjgZnjgovlgKTjgYzntYTnuZTmg4XloLHjgYvjgonopovjgaTjgYvjgozjgbDjgIHntYTnuZTlkI3jgpLmoLzntI1cclxuICAgICAgICAgICAgICAgICAgICBsZXQgb3JnYW5pemF0aW9ucz1hd2FpdCB0aGlzLnNldElucHV0T3JnYW5pemF0aW9uKGZpZWxkVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL+e1hOe5lOWQjeOBjOagvOe0jeOBp+OBjeOBpuOBhOOCi+WgtOWQiOOAgee1hOe5lOOCs+ODvOODieOBqOe1hOe5lOWQjeOCkmNvcnJlY3RGb3JtYXR0ZWRWYWx1ZeOBq+S7o+WFpeOBmeOCi1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCFvcmdhbml6YXRpb25zKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ109XCLntYTnuZTpgbjmip7jg5XjgqPjg7zjg6vjg4njgavjgIHmjL/lhaXjgZfjgojjgYbjgajjgZfjgZ/ntYTnuZTmg4XloLHjga/opovjgaTjgYvjgorjgb7jgZvjgpPjgafjgZfjgZ/jgILjgIzlgKTjgpLmjL/lhaXjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi57WE57mU6YG45oqe44OV44Kj44O844Or44OJ44Gr44CB5oy/5YWl44GX44KI44GG44Go44GX44Gf57WE57mU5oOF5aCx44Gv6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44Gf44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0Rm9ybWF0dGVkVmFsdWU9W3sgY29kZTogZmllbGRWYWx1ZSwgbmFtZTogb3JnYW5pemF0aW9uc31dO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL+OCsOODq+ODvOODl+aDheWgseODleOCo+ODvOODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+WApOOBjOmBqeWIh+OBquWgtOWQiOOAgWNvcnJlY3RGb3JtYXR0ZWRWYWx1ZeOBq+S7o+WFpeOBmeOCi1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZmllbGRUeXBlID09PSBcIkdST1VQX1NFTEVDVFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAvL+aMv+WFpeOBmeOCi+WApOOBjOOCsOODq+ODvOODl+aDheWgseOBi+OCieimi+OBpOOBi+OCjOOBsOOAgeOCsOODq+ODvOODl+WQjeOCkuagvOe0jVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBncm91cHM9YXdhaXQgdGhpcy5zZXRJbnB1dEdyb3VwKGZpZWxkVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL+OCsOODq+ODvOODl+WQjeOBjOagvOe0jeOBp+OBjeOBpuOBhOOCi+WgtOWQiOOAgeOCsOODq+ODvOODl+OCs+ODvOODieOBqOOCsOODq+ODvOODl+WQjeOCkmNvcnJlY3RGb3JtYXR0ZWRWYWx1ZeOBq+S7o+WFpeOBmeOCi1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCFncm91cHMpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXT1cIuOCsOODq+ODvOODl+mBuOaKnuODleOCo+ODvOODq+ODieOBq+OAgeaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+OCsOODq+ODvOODl+aDheWgseOBr+imi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgrDjg6vjg7zjg5fpgbjmip7jg5XjgqPjg7zjg6vjg4njgavjgIHmjL/lhaXjgZfjgojjgYbjgajjgZfjgZ/jgrDjg6vjg7zjg5fmg4XloLHjga/opovjgaTjgYvjgorjgb7jgZvjgpPjgafjgZfjgZ/jgILjgIzlgKTjgpLmjL/lhaXjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZT1beyBjb2RlOiBmaWVsZFZhbHVlLCBuYW1lOiBncm91cHN9XTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu57WQ5p6c44GMdHJ1ZeOBi+OBpOaMv+WFpeOBmeOCi+WApOOBjOWkieaPm+OBp+OBjeOBn+WgtOWQiOOAgeODleOCo+ODvOODq+ODie+8iOODqeOCuOOCquODnOOCv+ODs+ODu+ODieODreODg+ODl+ODgOOCpuODs+ODu+ODgeOCp+ODg+OCr+ODnOODg+OCr+OCueODu+ikh+aVsOmBuOaKnuODu+aWh+Wtl+WIl+S4gOihjOODu+aWh+Wtl+WIl+ikh+aVsOihjOODu+ODquODg+ODgeOCqOODh+OCo+OCv+ODu+aVsOWApOODu+aXpeS7mOODu+aXpeaZguODu+aZguWIu++8ieOBq+OCu+ODg+ODiFxyXG4gICAgICAgICAgICBpZihjb25kaXRpb25SZXN1bHQgJiYgKGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSB8fCBjb3JyZWN0VmFsdWVzKSl7XHJcbiAgICAgICAgICAgICAgICAvL+adoeS7tuW8j+OBrue1kOaenOOBjHR1cmXjgYvjgaTjgIHlgKTjgpLmraPjgZfjgYTlvaLlvI/jgavlpInmj5vjgafjgY3jgZ/loLTlkIjjgIHjg5XjgqPjg7zjg6vjg4njgavlgKTjgpLjgrvjg4Pjg4jjgZnjgotcclxuICAgICAgICAgICAgICAgIGlmKGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0udmFsdWUgPSBjb3JyZWN0Rm9ybWF0dGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAvL+adoeS7tuW8j+OBrue1kOaenOOBjHR1cmXjgYvjgaTjgIHlgKTjgpLmraPjgZfjgYTlvaLlvI/vvIjphY3liJfvvInjgavlpInmj5vjgafjgY3jgZ/loLTlkIjjgIHjg5XjgqPjg7zjg6vjg4njgavlgKTvvIjphY3liJfvvInjgpLjgrvjg4Pjg4jjgZnjgotcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKGNvcnJlY3RWYWx1ZXMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0udmFsdWUgPSBjb3JyZWN0VmFsdWVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXN1bHQ9IHtcclxuICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDp0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9Y2F0Y2goZXJyb3I6YW55KXtcclxuICAgICAgICAgICAgZXZlbnQucmVjb3JkO1xyXG4gICAgICAgICAgICBldmVudC5lcnJvcj1lcnJvci5tZXNzYWdlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9dHJ1ZTsvL+asoeOBruODjuODvOODieOBr+WHpueQhuOCkue2muOBkeOCi1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbnRleHQg5p2h5Lu25byP44KS5a6f6KGM44GZ44KLXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBnZXRDb25kaXRpb25SZXN1bHQoY29udGV4dDphbnkpOmJvb2xlYW57XHJcbiAgICAgICAgLy/jg5fjg63jg5Hjg4bjgqNgY29uZGl0aW9uYOOBi+OCieadoeS7tuODhOODquODvOOCkuWPluW+l+OBmeOCi1xyXG4gICAgICAgIGNvbnN0IHRyZWUgPXRoaXMuZ2V0Q29uZGl0aW9uKHRoaXMucHJvcHMuY29uZGl0aW9uKTtcclxuICAgICAgICBpZighdHJlZSl7XHJcbiAgICAgICAgICAgIC8v5p2h5Lu244KS6Kit5a6a44GV44KM44Gm44GE44G+44Gb44KTXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJlZS5ldmFsdWF0ZSh0cmVlLnJvb3QsY29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uIOadoeS7tuW8j+ODhOODquODvOOCkuWPluW+l+OBmeOCi1xyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgZ2V0Q29uZGl0aW9uKGNvbmRpdGlvbjpzdHJpbmcpOkNvbmRpdGlvblRyZWV8bnVsbHtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyZWUgPSBuZXcgQ29uZGl0aW9uVHJlZSgpO1xyXG4gICAgICAgICAgICB0cmVlLmZyb21Kc29uKGNvbmRpdGlvbik7XHJcbiAgICAgICAgICAgIGlmKHRyZWUuZ2V0Q29uZGl0aW9ucyh0cmVlLnJvb3QpLmxlbmd0aD4wKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cmVlO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XHJcbiAgICB9XHJcblxyXG59XHJcbm5ldyBJbnNlcnRWYWx1ZUFjdGlvbigpOyIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7ICBJQWN0aW9uLElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElGaWVsZCwgSUNvbnRleHQsIElWYXJOYW1lfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuLyoqXHJcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxyXG4gKi9cclxuaW50ZXJmYWNlIElHZXRWYWx1ZVByb3Bze1xyXG4gICAgZmllbGQ6SUZpZWxkOy8v44OB44Kn44OD44Kv44GZ44KL44OV44Kj44O844Or44OJ44Gu5a++6LGhXHJcbiAgICB2ZXJOYW1lOklWYXJOYW1lO1xyXG59XHJcbi8qKlxyXG4gKiDmraPopo/ooajnj77jg4Hjgqfjg4Pjgq/jgqLjgq/jgrfjg6fjg7NcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZXRWYWx1ZUFjaXRvbiBpbXBsZW1lbnRzIElBY3Rpb257XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XHJcbiAgICBwcm9wczpJR2V0VmFsdWVQcm9wcztcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5uYW1lPVwi5YCk44KS5Y+W5b6X44GZ44KLXCI7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcclxuICAgICAgICB0aGlzLnByb3BzPXtcclxuICAgICAgICAgICAgZmllbGQ6e2NvZGU6Jyd9LFxyXG4gICAgICAgICAgICB2ZXJOYW1lOntuYW1lOicnfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL+OCouOCr+OCt+ODp+ODs+OCkueZu+mMsuOBmeOCi1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcclxuICAgICAqIEBwYXJhbSBldmVudCBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgICAgIGxldCByZXN1bHQ9e1xyXG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXHJcbiAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xyXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XHJcbiAgICAgICAgICAgIGlmICghKCdmaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgndmVyTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSUdldFZhbHVlUHJvcHM7XHJcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXHJcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGV2ZW50LnJlY29yZDtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS52YWx1ZTtcclxuICAgICAgICAgICAgaWYodGhpcy5wcm9wcy52ZXJOYW1lICYmIHRoaXMucHJvcHMudmVyTmFtZS5uYW1lIT09Jycpe1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0OnRydWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcclxuICAgICAgICAgICAgZXZlbnQuZXJyb3I9ZXJyb3I7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcclxuICAgIH1cclxuICAgIFxyXG59XHJcbm5ldyBHZXRWYWx1ZUFjaXRvbigpO1xyXG4iLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xyXG5pbXBvcnQgeyBJRmllbGQsIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG5pbXBvcnQgeyBGb3JtYXR0ZXIgfSBmcm9tIFwiLi4vdXRpbC9mb3JtYXRcIjtcclxuXHJcbi8v5Y+zVUnnlLvpnaJwcm9wZXJ0eeOBrm5hbWU65Z6L77yaXHJcbmludGVyZmFjZSBJU3RyaW5nSm9pblByb3Bze1xyXG4gICAgLy/kv53lrZjlhYjjg5XjgqPjg7zjg6vjg4lcclxuICAgIHNhdmVGaWVsZDpJRmllbGQ7XHJcbiAgICAvL+e1kOWQiOWFg+ODleOCo+ODvOODq+ODiTFcclxuICAgIGpvaW5GaWVsZDE6SUZpZWxkO1xyXG4gICAgLy/ntZDlkIjlhYPjg5XjgqPjg7zjg6vjg4kyXHJcbiAgICBqb2luRmllbGQyOklGaWVsZDtcclxuICAgIC8v5Yy65YiH44KK5paH5a2XXHJcbiAgICBkZWxpbWl0ZXI6c3RyaW5nO1xyXG59XHJcblxyXG4vL0lBY3Rpb27jgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjgpLlrp/oo4XjgZnjgovmlrDjgZfjgYTjgq/jg6njgrlBY3Rpb27jgpLkvZzmiJDvvJpcclxuZXhwb3J0IGNsYXNzIFN0cmluZ0pvaW5BY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9ue1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgLy9pbXBvcnTjgYvjgonlsI7lhaXpoZXnpLrlrprnvqlcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIC8v5LiK5pa544GuaW50ZXJmYWNlIFByb3Bz44GL44KJ44CBcHJvcHPlj5fjgZHjgovlsZ7mgKfjgpLlrprnvqnvvJpcclxuICAgIHByb3BzOklTdHJpbmdKb2luUHJvcHM7XHJcbiAgICAvL+mWouaVsOWumue+qeOBq+W/heimgeOBqumhnuWQjeOCkuani+evie+8mlxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICAvL3BnQWRtaW5EQuOBq+eZu+mMsuOBl+OBn+OCouOCr+OCt+ODp+ODs+WQjShuYW1lL3N1YnRpdGxlKeS4gOiHtOOBmeOCi+W/heimgeOBjOOBguOCi++8mlxyXG4gICAgICAgIHRoaXMubmFtZT1cIuaWh+Wtl+e1kOWQiFwiO1xyXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgICAgIC8v44OX44Ot44OR44OG44Kj5bGe5oCn5Yid5pyf5YyW77yaXHJcbiAgICAgICAgdGhpcy5wcm9wcz17XHJcbiAgICAgICAgICAgIHNhdmVGaWVsZDp7Y29kZTonJ30sXHJcbiAgICAgICAgICAgIGpvaW5GaWVsZDE6e2NvZGU6Jyd9LFxyXG4gICAgICAgICAgICBqb2luRmllbGQyOntjb2RlOicnfSxcclxuICAgICAgICAgICAgZGVsaW1pdGVyOicnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v44Oq44K744OD44OI5LiK6KiY55m76Yyy6KGo77yaXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgfVxyXG4vKipcclxuICog44Ki44Kv44K344On44Oz44Gu5Yem55CG44KS5a6f6KOF44GZ44KLXHJcbiAqIEBwYXJhbSBhY3Rpb25Ob2RlIOOCouOCr+OCt+ODp+ODs+ODjuODvOODiVxyXG4gKiBAcGFyYW0gZXZlbnQgS2ludG9uZeOBruOCpOODmeODs+ODiFxyXG4gKiBAcGFyYW0gY29udGV4dCDjgrPjg7Pjg4bjgq3jgrnjg4jvvIjjg6zjgrPjg7zjg4njgIHlpInmlbDmg4XloLHjgpLmjIHjgaPjgabjgYTjgovvvIlcclxuICogQHJldHVybnMgXHJcbiAqL1xyXG4gICAgLy/pnZ7lkIzmnJ/lh6bnkIbjgYLjgovplqLmlbDkuIvjga7jgYLjgovlsZ7mgKfvvJpcclxuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnkpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgICAgIGxldCByZXN1bHQ9e1xyXG4gICAgICAgICAgICAvL+W+jOe2meWHpueQhuS4jeWPr++8mlxyXG4gICAgICAgICAgICBjYW5OZXh0OmZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgovvvJpcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICAvL+ODl+ODreODkeODhuOCo+ioreWumuOBruODh+ODvOOCv+Wei+OBr+W/heimgeOBquaDheWgseWQq+OCgeOBvuOBmeOBi++8n+WFqOmDqOS4jeWtmOWcqOaZgnJldHVybjpcclxuICAgICAgICAgICAgaWYgKCEoJ3NhdmVGaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnam9pbkZpZWxkMScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnam9pbkZpZWxkMicgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/ml6Llrprjga7jg5fjg63jg5Hjg4bjgqPjga7jgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjgbjlpInmj5vvvJpcclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSVN0cmluZ0pvaW5Qcm9wcztcclxuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xyXG5cclxuICAgICAgICAgICAgLy9raW50b25l44OV44Kj44O844Or44OJ44K/44Kk44OX5Y+W5b6X77yaXHJcbiAgICAgICAgICAgIGNvbnN0IGpvaW5GaWVsZDF0eXBlPXRoaXMucHJvcHMuam9pbkZpZWxkMS50eXBlO1xyXG4gICAgICAgICAgICBjb25zdCBqb2luRmllbGQydHlwZT10aGlzLnByb3BzLmpvaW5GaWVsZDIudHlwZTtcclxuICAgICAgICAgICAgY29uc3Qgc2F2ZUZpZWxkdHlwZT10aGlzLnByb3BzLnNhdmVGaWVsZC50eXBlO1xyXG5cclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAgIC8vIC8v5L+d5a2Y5YWI44OV44Kj44O844Or44OJ44Gv5paH5a2X5YiX44OV44Kj44O844Or44OJ44Gn44Gv44Gq44GE5aC05ZCI44CB44Ko44Op44O855m655Sf77yaXHJcbiAgICAgICAgICAgIGlmKCEoc2F2ZUZpZWxkdHlwZT09PSdTSU5HTEVfTElORV9URVhUJ3x8c2F2ZUZpZWxkdHlwZT09PSdNVUxUSV9MSU5FX1RFWFQnfHxzYXZlRmllbGR0eXBlPT09J1JJQ0hfVEVYVCcpKXtcclxuICAgICAgICAgICAgICAgIGV2ZW50LmVycm9yPSdb44Ko44Op44O844Oh44OD44K744O844K4Xe+8mue1kOWQiOS/neWtmOWFiOWvvuW/nOS4jeWPr+OAgue1kOWQiOOBl+OBvuOBm+OCkyc7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZS5pbmNsdWRlcygnc3VjY2VzcycpKXtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoXCJbd2luZG93cyBhbGVydF3vvJpcIitldmVudC5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuTmV4dDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8v5YCk5Y+W5b6X5pa55rOV5a6a576p77yaXHJcbiAgICBmdW5jdGlvbiBnZXRWYWx1ZSh2YWx1ZTpzdHJpbmcsdHlwZTpzdHJpbmd8dW5kZWZpbmVkLGZpZWxkQ29kZTpzdHJpbmcsZXZlbnQ6YW55KXtcclxuICAgICAgICBpZihldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU9PT11bmRlZmluZWR8fGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZT09PW51bGwpe1xyXG4gICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXS52YWx1ZT0nJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/kvZzmiJDogIXjgIHmm7TmlrDogIXvvJpcclxuICAgICAgICBpZih0eXBlPT09J0NSRUFUT1InfHx0eXBlPT09J01PRElGSUVSJyl7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlLm5hbWU7XHJcbiAgICAgICAgLy/ml6XmmYLjgIHkvZzmiJDml6XmmYLjgIHmm7TmlrDml6XmmYLvvJpcclxuICAgICAgICB9ZWxzZSBpZih0eXBlPT09J0RBVEVUSU1FJ3x8dHlwZT09PSdDUkVBVEVEX1RJTUUnfHx0eXBlPT09J1VQREFURURfVElNRScpe1xyXG4gICAgICAgICAgICBpZihldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWUhPT11bmRlZmluZWQgJiYgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlIT09Jycpe1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBGb3JtYXR0ZXIuZGF0ZUZvcm1hdChuZXcgRGF0ZShldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWUpLCd5eXl5LU1NLWRkIEhIOm1tJyk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT1ldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy/jg6bjg7zjgrbpgbjmip7jgIHntYTnuZTpgbjmip7jgIHjgrDjg6vjg7zjg5fpgbjmip7jgIHmt7vku5jjg5XjgqHjgqTjg6vlkI3jgIHkvZzmpa3ogIXjgIHjgqvjg4bjgrTjg6rjg7zvvJpcclxuICAgICAgICB9ZWxzZSBpZih0eXBlPT09J1VTRVJfU0VMRUNUJ3x8dHlwZT09PSdPUkdBTklaQVRJT05fU0VMRUNUJ3x8dHlwZT09PSdHUk9VUF9TRUxFQ1QnfHx0eXBlPT09J0ZJTEUnfHx0eXBlPT09J1NUQVRVU19BU1NJR05FRScpe1xyXG4gICAgICAgICAgICBpZihldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU9PT11bmRlZmluZWQgfHwgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlPT09Jycpe1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW90b3RleHQ9ZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGFycj1bXTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8bW90b3RleHQubGVuZ3RoO2krKyl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2gobW90b3RleHRbaV0ubmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL+mFjeWIl+imgee0oOOCkizjgafpgKPntZDjgZfjgabmloflrZfliJfjgpLkvZzmiJDvvJpcclxuICAgICAgICAgICAgICAgIHZhbHVlPWFyci5qb2luKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAvL+OCq+ODhuOCtOODquODvOOAgeODgeOCp+ODg+OCr+ODnOODg+OCr+OCueOAgeikh+aVsOmBuOaKnu+8mlxyXG4gICAgICAgIH1lbHNlIGlmKHR5cGU9PT0nQ0FURUdPUlknfHx0eXBlPT09J0NIRUNLX0JPWCd8fHR5cGU9PT0nTVVMVElfU0VMRUNUJyl7XHJcbiAgICAgICAgICAgIGlmKGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZT09PXVuZGVmaW5lZCB8fCBldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU9PT0nJyl7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb3RvdGV4dD1ldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXJyPVtdO1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxtb3RvdGV4dC5sZW5ndGg7aSsrKXtcclxuICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChtb3RvdGV4dFtpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL+mFjeWIl+imgee0oOOCkizjgafpgKPntZDjgZfjgabmloflrZfliJfjgpLkvZzmiJDvvJpcclxuICAgICAgICAgICAgICAgIHZhbHVlPWFyci5qb2luKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAvL+ips+e0sOeUu+mdouODl+ODreOCu+OCueWun+ihjOW+jOOBruOCueODhuODvOOCv+OCue+8mlxyXG4gICAgICAgIH1lbHNlIGlmKHR5cGU9PT0nU1RBVFVTJyYmZXZlbnQudHlwZS5pbmNsdWRlcygncHJvY2VzcycpKXtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudC5uZXh0U3RhdHVzLnZhbHVlO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlPT09dW5kZWZpbmVkIHx8IHZhbHVlPT09bnVsbCl7XHJcbiAgICAgICAgICAgIHZhbHVlPScnO1xyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB2YWx1ZTsgICAgIFxyXG4gICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAgIC8v5YCk5Y+W5b6X5pa55rOV5ZG85Ye677yaXHJcbiAgICAgICAgICAgIGxldCBqb2luVmFsdWUxOnN0cmluZz0nJztcclxuICAgICAgICAgICAgam9pblZhbHVlMT1nZXRWYWx1ZShqb2luVmFsdWUxLGpvaW5GaWVsZDF0eXBlLHRoaXMucHJvcHMuam9pbkZpZWxkMS5jb2RlLGV2ZW50KTtcclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgICAgICBsZXQgam9pblZhbHVlMjpzdHJpbmc9Jyc7XHJcbiAgICAgICAgICAgIGpvaW5WYWx1ZTI9Z2V0VmFsdWUoam9pblZhbHVlMixqb2luRmllbGQydHlwZSx0aGlzLnByb3BzLmpvaW5GaWVsZDIuY29kZSxldmVudCk7XHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgY29uc3QgY29uU3RyaW5nID0gdGhpcy5wcm9wcy5kZWxpbWl0ZXI7XHJcbiAgICAgICAgICAgIGxldCBzYXZlVmFsdWU6c3RyaW5nPScnO1xyXG4gICAgICAgICAgICAvL+WJjeW+jOe1kOWQiOWFg+OBjOepuueZveOBquOCieWMuuWIh+OCiuaWh+Wtl+OCguepuueZveOBq+OBmeOCiyjkvos6MS0444GuOOeEoeOBhOOBquOCiTHjgIIxLTjjga4x54Sh44GE44Gq44KJOOOAgjHnqbrnmb0444GuOOeEoeOBhOOBquOCiTHjgILntZDlkIjlhYPlhajpg6jnqbrnmb3jgarjgonlhajpg6jnqbrnmb0pOlxyXG4gICAgICAgICAgICBpZihqb2luVmFsdWUxPT09JycmJmpvaW5WYWx1ZTI9PT0nJyl7XHJcbiAgICAgICAgICAgICAgICBzYXZlVmFsdWU9Jyc7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGpvaW5WYWx1ZTE9PT0nJyYmam9pblZhbHVlMiE9PScnKXtcclxuICAgICAgICAgICAgICAgIHNhdmVWYWx1ZT1qb2luVmFsdWUyO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihqb2luVmFsdWUyPT09JycmJmpvaW5WYWx1ZTEhPT0nJyl7XHJcbiAgICAgICAgICAgICAgICBzYXZlVmFsdWU9am9pblZhbHVlMTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoam9pblZhbHVlMSE9PScnJiZqb2luVmFsdWUyIT09Jycpe1xyXG4gICAgICAgICAgICAgICAgc2F2ZVZhbHVlPWAke2pvaW5WYWx1ZTF9JHtjb25TdHJpbmd9JHtqb2luVmFsdWUyfWBcclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgLy/mlrDopo8v5pu05pawL+S4gOimp+S/neWtmOaIkOWKn+W+jOOBruS7peWkluOBrmV2ZW5044GnUFVU5L2/55So44GX44Gq44GE77yaXHJcbiAgICAgICAgICAgIGlmICghZXZlbnQudHlwZS5pbmNsdWRlcygnc3VjY2VzcycpKXtcclxuICAgICAgICAgICAgICAgICAvL+S/neWtmOWFiOODleOCo+ODvOODq+ODieOBq+WApOOCu+ODg+ODiO+8mlxyXG4gICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLnNhdmVGaWVsZC5jb2RlXS52YWx1ZT1zYXZlVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgd2luZG93LmFsZXJ0KFwi5paH5a2X57WQ5ZCI6KGM44GE44G+44GX44Gf44CCXCIrdGhpcy5wcm9wcy5qb2luRmllbGQxLm5hbWUrXCI6XCIram9pblZhbHVlMStcIixcIit0aGlzLnByb3BzLmpvaW5GaWVsZDIubmFtZStcIjpcIitqb2luVmFsdWUyK1wi44CCXCIpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcz17XHJcbiAgICAgICAgICAgICAgICAgICAgXCJhcHBcIjpldmVudC5hcHBJZCxcclxuICAgICAgICAgICAgICAgICAgICBcImlkXCI6ZXZlbnQucmVjb3JkSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJyZWNvcmRcIjp7W3RoaXMucHJvcHMuc2F2ZUZpZWxkLmNvZGVdOntcInZhbHVlXCI6c2F2ZVZhbHVlfX1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQga2ludG9uZS5hcGkoa2ludG9uZS5hcGkudXJsKCcvay92MS9yZWNvcmQnLHRydWUpLCdQVVQnLHBhcmFtcykudGhlbigocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8va2ludG9uZeS/neWtmOWFiOODleOCo+ODvOODq+ODieWtmOWcqOeiuuiqje+8mlxyXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLnNhdmVGaWVsZC5jb2RlXS52YWx1ZT1zYXZlVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUuaW5jbHVkZXMoJ2luZGV4Jykpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoXCLmloflrZfntZDlkIjooYzjgYTjgb7jgZfjgZ/jgIJcIit0aGlzLnByb3BzLmpvaW5GaWVsZDEubmFtZStcIjpcIitqb2luVmFsdWUxK1wiLFwiK3RoaXMucHJvcHMuam9pbkZpZWxkMi5uYW1lK1wiOlwiK2pvaW5WYWx1ZTIrXCLjgILkuIDopqfnlLvpnaLmm7TmlrDmiJDlip/lvozoh6rli5Xjg6rjg63jg7zjg4njgZfjgb7jgZvjgpPjgILlv4XopoHjgavlv5zjgZjjgabmiYvli5Xjg6rjg63jg7zjg4njgY/jgaDjgZXjgYTjgIJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hbGVydChcIuaWh+Wtl+e1kOWQiOihjOOBhOOBvuOBl+OBn+OAglwiK3RoaXMucHJvcHMuam9pbkZpZWxkMS5uYW1lK1wiOlwiK2pvaW5WYWx1ZTErXCIsXCIrdGhpcy5wcm9wcy5qb2luRmllbGQyLm5hbWUrXCI6XCIram9pblZhbHVlMitcIuOAglwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8v5LiA6Kan55S76Z2i5pu05paw5oiQ5Yqf5b6M44Oq44Ot44O844OJ77yaXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGV2ZW50LnR5cGUuaW5jbHVkZXMoJ2luZGV4Jykpe1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBldmVudC51cmwgPSBsb2NhdGlvbi5ocmVmLmVuZHNXaXRoKCcvJykgfHwgbG9jYXRpb24uaHJlZi5lbmRzV2l0aCgnJicpID9cclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgbG9jYXRpb24uaHJlZi5zbGljZSgwLCAtMSkgOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBsb2NhdGlvbi5ocmVmICsgKGxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICcvJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuZXJyb3IgPSAn44Ko44Op44O844GM55m655Sf44GX44G+44GX44Gf44CC57WQ5ZCI44GX44G+44Gb44KT44CC44K344K544OG44Og566h55CG6ICF44G444GK5ZWP5ZCI44Gb44GP44Gg44GV44GEJztcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoZXZlbnQuZXJyb3IrXCJlcnJvciBtZXNzYWdl77yaXCIrZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgICAgICByZXN1bHQ9IHtcclxuICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDp0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9Y2F0Y2goZXJyb3IpeztcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUuaW5jbHVkZXMoJ3N1Y2Nlc3MnKSl7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoXCJbd2luZG93cyBhbGVydF3vvJrlh6bnkIbkuK3nlbDluLjjgYznmbrnlJ/jgZfjgb7jgZfjgZ/jgILntZDlkIjjgZfjgb7jgZvjgpPjgILjgrfjgrnjg4bjg6Dmi4XlvZPogIXjgbjjgYrllY/lkIjjgZvjgY/jgaDjgZXjgYTjgIJlcnJvcuODoeODg+OCu+ODvOOCuO+8mlwiK2Vycm9yKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGV2ZW50LmVycm9yPVwiW+OCqOODqeODvOODoeODg+OCu+ODvOOCuF3vvJrlh6bnkIbkuK3nlbDluLjjgYznmbrnlJ/jgZfjgb7jgZfjgZ/jgILntZDlkIjjgZfjgb7jgZvjgpPjgILjgrfjgrnjg4bjg6Dmi4XlvZPogIXjgbjjgYrllY/lkIjjgZvjgY/jgaDjgZXjgYTjgIJlcnJvcuODoeODg+OCu+ODvOOCuO+8mlwiK2Vycm9yO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgY2FuTmV4dDpmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcclxuICAgIH1cclxufVxyXG5uZXcgU3RyaW5nSm9pbkFjdGlvbigpOyIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7ICBJQWN0aW9uLElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElGaWVsZCwgSUNvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuXHJcbi8v44Kv44Op44K55ZCN44KS6Kit6KiI5pu444Gr5o+D44GI44KLXHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcclxuICovXHJcbiAgICBpbnRlcmZhY2UgRnVsbFdpZHRoUHJvcHN7XHJcbiAgICAgICAgLy9jaGVja09wdGlvbjpBcnJheTxzdHJpbmc+LFxyXG4gICAgICAgIGZpZWxkOklGaWVsZFxyXG4gICAgfVxyXG4vKipcclxuICog5YWo6KeS44OB44Kn44OD44Kv44Ki44Kv44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRnVsbFdpZHRoQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIHByb3BzOkZ1bGxXaWR0aFByb3BzO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLm5hbWU9XCLlhajop5Ljg4Hjgqfjg4Pjgq9cIjsgLyogcGdhZG1pbuOBrm5hbWXjgajlkIzmp5ggICovXHJcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcclxuICAgICAgICB0aGlzLnByb3BzPXtcclxuICAgICAgICAgICAgLy9jaGVja09wdGlvbjpbXSxcclxuICAgICAgICAgICAgZmllbGQ6e2NvZGU6Jyd9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcclxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdD17XHJcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcclxuICAgICAgICAgICAgcmVzdWx0OmZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIC8v5bGe5oCn6Kit5a6a44KS5Y+W5b6X44GZ44KLXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9YWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcclxuICAgICAgICAgICAgaWYgKCEoJ2ZpZWxkJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBGdWxsV2lkdGhQcm9wcztcclxuICAgICAgICAgICAgLy/mnaHku7blvI/jga7oqIjnrpfntZDmnpzjgpLlj5blvpdcclxuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdPy52YWx1ZTtcclxuICAgICAgICAgICAgLy/mnaHku7bliIblspBcclxuICAgICAgICAgICAgLy/mnKrlhaXlipvmmYLjga/kvZXjgoLlh6bnkIbjgpLjgZvjgZrntYLkuoZcclxuICAgICAgICAgICAgaWYodmFsdWU9PT11bmRlZmluZWQgfHwgdmFsdWU9PT0nJyl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8v5Y2K6KeS44GM5ZCr44G+44KM44Gm44GE44Gf5aC05ZCIcmVzdWx044GMZmFsc2VcclxuICAgICAgICAgICAgaWYoIXRoaXMuY29udGFpbnNGdWxsV2lkdGhDaGFycyh2YWx1ZSkpe1xyXG4gICAgICAgICAgICAgICAgLy/jgqjjg6njg7zmmYLjgavlh7rlipvjgZXjgozjgovmloflrZfoqK3lrppcclxuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yPVwi5Y2K6KeS44GM5ZCr44G+44KM44Gm44GE44G+44GZXCI7XHJcbiAgICAgICAgICAgICAgICAvL+asoeOBruWHpueQhuOCkuS4reatouOBmeOCi+WApOioreWumlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vcmVzdWx044OX44Ot44OR44OG44Kj5oyH5a6aXHJcbiAgICAgICAgICAgIHJlc3VsdD0ge1xyXG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXHJcbiAgICAgICAgICAgIHJlc3VsdDp0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbiAgICAgICAgLy/kvovlpJblh6bnkIZcclxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xyXG4gICAgICAgICAgICBldmVudC5lcnJvcj1lcnJvcjtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIOWFqOOBpuWFqOinkuOBruaWh+Wtl+WIl+OBruWgtOWQiOOBr3RydWXjgIHjgZ3jgYbjgafjgarjgYTloLTlkIjjga9mYWxzZVxyXG4gICAgY29udGFpbnNGdWxsV2lkdGhDaGFycyh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgLy8g5Y2K6KeS6Iux5pWw5a2X44Kr44OK6KiY5Y+344KS6Zmk5aSWXHJcbiAgICAgICAgY29uc3QgY2hlY2tSZWdleD1cIl5bXlxceDAxLVxceDdFXFx1RkY2MS1cXHVGRjlGXSskXCI7XHJcblxyXG4gICAgICAgIC8v5q2j6KaP6KGo54++44Kq44OW44K444Kn44Kv44OI55Sf5oiQXHJcbiAgICAgICAgY29uc3QgZnVsbFdpZHRoUmVnZXggPSBuZXcgUmVnRXhwKGNoZWNrUmVnZXgpO1xyXG5cclxuICAgICAgICAvL+ato+imj+ihqOePvuODgeOCp+ODg+OCr1xyXG4gICAgICAgIHJldHVybiBmdWxsV2lkdGhSZWdleC50ZXN0KHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5oi744KK5YCk44KS5oyB44Gf44Gq44GE44Gf44KBdm9pZOWei1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcclxuICAgIH1cclxufVxyXG5uZXcgRnVsbFdpZHRoQWN0aW9uKCk7IiwiaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcclxuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG5cclxuLyoqXHJcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxyXG4gKi9cclxuICAgIGludGVyZmFjZSBIYWxmV2lkdGhQcm9wc3tcclxuICAgICAgICBmaWVsZDpJRmllbGRcclxuICAgIH1cclxuLyoqXHJcbiAqIOWNiuinkuODgeOCp+ODg+OCr+OCouOCr+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEhhbGZXaWR0aEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb257XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XHJcbiAgICBwcm9wczpIYWxmV2lkdGhQcm9wcztcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5uYW1lPVwi5Y2K6KeS44OB44Kn44OD44KvXCI7IC8qIHBnYWRtaW7jga5uYW1l44Go5ZCM5qeYICAqL1xyXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XHJcbiAgICAgICAgdGhpcy5wcm9wcz17XHJcbiAgICAgICAgICAgIGZpZWxkOntjb2RlOicnfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL+OCouOCr+OCt+ODp+ODs+OCkueZu+mMsuOBmeOCi1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZVxyXG4gICAgICogQHBhcmFtIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgICAgIGxldCByZXN1bHQ9e1xyXG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXHJcbiAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xyXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XHJcbiAgICAgICAgICAgIGlmICghKCdmaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSGFsZldpZHRoUHJvcHM7XHJcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXHJcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGV2ZW50LnJlY29yZDtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXT8udmFsdWU7XHJcbiAgICAgICAgICAgIC8v5p2h5Lu25YiG5bKQXHJcbiAgICAgICAgICAgIC8v5pyq5YWl5Yqb5pmC44Gv5L2V44KC5Yem55CG44KS44Gb44Ga57WC5LqGXHJcbiAgICAgICAgICAgIGlmKHZhbHVlPT09dW5kZWZpbmVkIHx8IHZhbHVlPT09Jycpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL+WFqOinkuOBjOWQq+OBvuOCjOOBpuOBhOOBn+WgtOWQiOS/neWtmOWHpueQhuS4reatoijjgqjjg6njg7zlh6bnkIYpXHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmNvbnRhaW5zSGFsZldpZHRoQ2hhcnModmFsdWUpKXtcclxuICAgICAgICAgICAgICAgIC8v44Ko44Op44O85pmC44Gr5Ye65Yqb44GV44KM44KL5paH5a2X6Kit5a6aXHJcbiAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvcj1cIuWFqOinkuOBjOWQq+OBvuOCjOOBpuOBhOOBvuOBmVwiO1xyXG4gICAgICAgICAgICAgICAgLy/mrKHjga7lh6bnkIbjgpLkuK3mraLjgZnjgovlgKToqK3lrppcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL+WNiuinkuOBruWgtOWQiOWVj+mhjOOBquOBj+Wun+ihjFxyXG4gICAgICAgICAgICAvL3Jlc3VsdOODl+ODreODkeODhuOCo+aMh+WumlxyXG4gICAgICAgICAgICByZXN1bHQ9IHtcclxuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6dHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgLy/kvovlpJblh6bnkIZcclxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xyXG4gICAgICAgICAgICBldmVudC5lcnJvcj1lcnJvcjtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIOWFqOOBpuWFqOinkuOBruaWh+Wtl+WIl+OBruWgtOWQiOOBr3RydWXjgIHjgZ3jgYbjgafjgarjgYTloLTlkIjjga9mYWxzZVxyXG4gICAgY29udGFpbnNIYWxmV2lkdGhDaGFycyh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgY29uc3QgY2hlY2tSZWdleCA9IFwiXltcXHgwMS1cXHg3RVxcdUZGNjEtXFx1RkY5Rl0rJFwiO1xyXG4gICAgICAgIC8v5q2j6KaP6KGo54++44Kq44OW44K444Kn44Kv44OI55Sf5oiQXHJcbiAgICAgICAgY29uc3QgaGFsZldpZHRoUmVnZXggPSBuZXcgUmVnRXhwKGNoZWNrUmVnZXgpO1xyXG5cclxuICAgICAgICAvL+ato+imj+ihqOePvuODgeOCp+ODg+OCr1xyXG4gICAgICAgIHJldHVybiBoYWxmV2lkdGhSZWdleC50ZXN0KHRleHQpO1xyXG4gICAgfVxyXG4gICAgLy/miLvjgorlgKTjgpLmjIHjgZ/jgarjgYTjgZ/jgoF2b2lk5Z6LXHJcbiAgICByZWdpc3RlcigpOiB2b2lkIHtcclxuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXT10aGlzO1xyXG4gICAgfVxyXG59XHJcbm5ldyBIYWxmV2lkdGhBY3Rpb24oKTsiLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xyXG5pbXBvcnQgeyBJRmllbGQsSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LElDb250ZXh0LElWYXJOYW1lfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuLy/lj7NVSeeUu+mdonByb3BlcnR544GubmFtZTrlnovvvJpcclxuaW50ZXJmYWNlIElMb2dpblVzZXJHZXR0ZXJQcm9wc3tcclxuICAgIC8v5aSJ5pWw5ZCN44Gr44K744OD44OI77ya5YCk44GM44Kq44OW44K444Kn44Kv44OI44Gu5b2i5byPXHJcbiAgICB2ZXJOYW1lOklWYXJOYW1lO1xyXG59XHJcbi8vSUFjdGlvbuOCpOODs+OCv+ODleOCp+ODvOOCueOCkuWun+ijheOBmeOCi+aWsOOBl+OBhOOCr+ODqeOCuUFjdGlvbuOCkuS9nOaIkO+8mlxyXG5leHBvcnQgY2xhc3MgTG9naW5Vc2VyR2V0dGVyQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIC8vaW1wb3J044GL44KJ5bCO5YWl6aGV56S65a6a576pXHJcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XHJcbiAgICAvL+S4iuaWueOBrmludGVyZmFjZSBQcm9wc+OBi+OCieOAgXByb3Bz5Y+X44GR44KL5bGe5oCn44KS5a6a576p77yaXHJcbiAgICBwcm9wczpJTG9naW5Vc2VyR2V0dGVyUHJvcHM7XHJcbiAgICAvL+mWouaVsOWumue+qeOBq+W/heimgeOBqumhnuWQjeOCkuani+evie+8mlxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICAvL3BnQWRtaW5EQuOBq+eZu+mMsuOBl+OBn+OCouOCr+OCt+ODp+ODs+WQjShuYW1lL3N1YnRpdGxlKeS4gOiHtOOBmeOCi+W/heimgeOBjOOBguOCi++8mlxyXG4gICAgICAgIHRoaXMubmFtZT1cIuODreOCsOOCpOODs+ODpuODvOOCtuODvOWPluW+l1wiO1xyXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgICAgIC8v44OX44Ot44OR44OG44Kj5bGe5oCn5Yid5pyf5YyW77yaXHJcbiAgICAgICAgdGhpcy5wcm9wcz17XHJcbiAgICAgICAgICAgIHZlck5hbWU6e25hbWU6Jyd9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v44Oq44K744OD44OI5LiK6KiY55m76Yyy6KGo77yaXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgfVxyXG4vKipcclxuICog44Ki44Kv44K344On44Oz44Gu5Yem55CG44KS5a6f6KOF44GZ44KLXHJcbiAqIEBwYXJhbSBhY3Rpb25Ob2RlIOOCouOCr+OCt+ODp+ODs+ODjuODvOODiVxyXG4gKiBAcGFyYW0gZXZlbnQgS2ludG9uZeOBruOCpOODmeODs+ODiFxyXG4gKiBAcGFyYW0gY29udGV4dCDjgrPjg7Pjg4bjgq3jgrnjg4jvvIjjg6zjgrPjg7zjg4njgIHlpInmlbDmg4XloLHjgpLmjIHjgaPjgabjgYTjgovvvIlcclxuICogQHJldHVybnMgXHJcbiAqL1xyXG7jgIDjgIAvL+mdnuWQjOacn+WHpueQhuOBguOCi+mWouaVsOS4i+OBruOBguOCi+WxnuaAp++8mlxyXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuICAgICAgICBsZXQgcmVzdWx0PXtcclxuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgovvvJpcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICAvL+ODl+ODreODkeODhuOCo+ioreWumuOBruODh+ODvOOCv+Wei+OBr+W/heimgeOBquaDheWgseWQq+OCgeOBvuOBmeOBi++8n+WFqOmDqOS4jeWtmOWcqOaZgnJldHVybjpcclxuICAgICAgICAgICAgaWYgKCEoJ3Zlck5hbWUnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy/ml6Llrprjga7jg5fjg63jg5Hjg4bjgqPjga7jgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjgbjlpInmj5vvvJpcclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSUxvZ2luVXNlckdldHRlclByb3BzO1xyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgICAgICBpZih0aGlzLnByb3BzLnZlck5hbWUmJnRoaXMucHJvcHMudmVyTmFtZS5uYW1lIT09Jycpe1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdPWtpbnRvbmUuZ2V0TG9naW5Vc2VyKCk7XHJcbiAgICAgICAgICAgICAgICAvLyB3aW5kb3cuYWxlcnQoXCLlpInmlbDlkI1cIit0aGlzLnByb3BzLnZlck5hbWUubmFtZStcIuOBruWApOOBr1wiK2NvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXStcIuOBp+OBmVwiKTtcclxuICAgICAgICAgICAgICAgIC8vIGV2ZW50LnJlY29yZFtcIuWkieaVsOmBi+eUqOWFiOOBruODpuODvOOCtumBuOaKnuODleOCo+ODvOODq+ODiVwiXS52YWx1ZT0gW3tjb2RlOmNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXS5jb2RlfV07XHJcbiAgICAgICAgICAgIH1cclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgcmVzdWx0PSB7XHJcbiAgICAgICAgICAgICAgICBjYW5OZXh0OnRydWUsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgfWNhdGNoKGVycm9yOmFueSl7O1xyXG4gICAgICAgICAgICBldmVudC5lcnJvcj1lcnJvci5tZXNzYWdlO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgY2FuTmV4dDpmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcclxuICAgIH1cclxufVxyXG5uZXcgTG9naW5Vc2VyR2V0dGVyQWN0aW9uKCk7IiwiLyohXG4gICogQm9vdHN0cmFwIGRhdGEuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkRhdGEgPSBmYWN0b3J5KCkpO1xufSkodGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgZG9tL2RhdGEuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICovXG5cbiAgY29uc3QgZWxlbWVudE1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgZGF0YSA9IHtcbiAgICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICBlbGVtZW50TWFwLnNldChlbGVtZW50LCBuZXcgTWFwKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KTtcblxuICAgICAgLy8gbWFrZSBpdCBjbGVhciB3ZSBvbmx5IHdhbnQgb25lIGluc3RhbmNlIHBlciBlbGVtZW50XG4gICAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgICAgaWYgKCFpbnN0YW5jZU1hcC5oYXMoa2V5KSAmJiBpbnN0YW5jZU1hcC5zaXplICE9PSAwKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKTtcbiAgICB9LFxuICAgIGdldChlbGVtZW50LCBrZXkpIHtcbiAgICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudE1hcC5nZXQoZWxlbWVudCkuZ2V0KGtleSkgfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcmVtb3ZlKGVsZW1lbnQsIGtleSkge1xuICAgICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpO1xuICAgICAgaW5zdGFuY2VNYXAuZGVsZXRlKGtleSk7XG5cbiAgICAgIC8vIGZyZWUgdXAgZWxlbWVudCByZWZlcmVuY2VzIGlmIHRoZXJlIGFyZSBubyBpbnN0YW5jZXMgbGVmdCBmb3IgYW4gZWxlbWVudFxuICAgICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgZWxlbWVudE1hcC5kZWxldGUoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBkYXRhO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhLmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGluZGV4LmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLkluZGV4ID0ge30pKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCB1dGlsL2luZGV4LmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICBjb25zdCBNQVhfVUlEID0gMTAwMDAwMDtcbiAgY29uc3QgTUlMTElTRUNPTkRTX01VTFRJUExJRVIgPSAxMDAwO1xuICBjb25zdCBUUkFOU0lUSU9OX0VORCA9ICd0cmFuc2l0aW9uZW5kJztcblxuICAvKipcbiAgICogUHJvcGVybHkgZXNjYXBlIElEcyBzZWxlY3RvcnMgdG8gaGFuZGxlIHdlaXJkIElEc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGNvbnN0IHBhcnNlU2VsZWN0b3IgPSBzZWxlY3RvciA9PiB7XG4gICAgaWYgKHNlbGVjdG9yICYmIHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5lc2NhcGUpIHtcbiAgICAgIC8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgbmVlZHMgZXNjYXBpbmcgdG8gaGFuZGxlIElEcyAoaHRtbDUrKSBjb250YWluaW5nIGZvciBpbnN0YW5jZSAvXG4gICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoLyMoW15cXHNcIiMnXSspL2csIChtYXRjaCwgaWQpID0+IGAjJHtDU1MuZXNjYXBlKGlkKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9O1xuXG4gIC8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuICBjb25zdCB0b1R5cGUgPSBvYmplY3QgPT4ge1xuICAgIGlmIChvYmplY3QgPT09IG51bGwgfHwgb2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBgJHtvYmplY3R9YDtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpLm1hdGNoKC9cXHMoW2Etel0rKS9pKVsxXS50b0xvd2VyQ2FzZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgVXRpbCBBUElcbiAgICovXG5cbiAgY29uc3QgZ2V0VUlEID0gcHJlZml4ID0+IHtcbiAgICBkbyB7XG4gICAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7XG4gICAgfSB3aGlsZSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHJlZml4KSk7XG4gICAgcmV0dXJuIHByZWZpeDtcbiAgfTtcbiAgY29uc3QgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQgPSBlbGVtZW50ID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIEdldCB0cmFuc2l0aW9uLWR1cmF0aW9uIG9mIHRoZSBlbGVtZW50XG4gICAgbGV0IHtcbiAgICAgIHRyYW5zaXRpb25EdXJhdGlvbixcbiAgICAgIHRyYW5zaXRpb25EZWxheVxuICAgIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICBjb25zdCBmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRGVsYXkgPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpO1xuXG4gICAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICAgIGlmICghZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gJiYgIWZsb2F0VHJhbnNpdGlvbkRlbGF5KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBJZiBtdWx0aXBsZSBkdXJhdGlvbnMgYXJlIGRlZmluZWQsIHRha2UgdGhlIGZpcnN0XG4gICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uLnNwbGl0KCcsJylbMF07XG4gICAgdHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5LnNwbGl0KCcsJylbMF07XG4gICAgcmV0dXJuIChOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pICsgTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkRlbGF5KSkgKiBNSUxMSVNFQ09ORFNfTVVMVElQTElFUjtcbiAgfTtcbiAgY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFRSQU5TSVRJT05fRU5EKSk7XG4gIH07XG4gIGNvbnN0IGlzRWxlbWVudCA9IG9iamVjdCA9PiB7XG4gICAgaWYgKCFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmplY3QuanF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgb2JqZWN0ID0gb2JqZWN0WzBdO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdC5ub2RlVHlwZSAhPT0gJ3VuZGVmaW5lZCc7XG4gIH07XG4gIGNvbnN0IGdldEVsZW1lbnQgPSBvYmplY3QgPT4ge1xuICAgIC8vIGl0J3MgYSBqUXVlcnkgb2JqZWN0IG9yIGEgbm9kZSBlbGVtZW50XG4gICAgaWYgKGlzRWxlbWVudChvYmplY3QpKSB7XG4gICAgICByZXR1cm4gb2JqZWN0LmpxdWVyeSA/IG9iamVjdFswXSA6IG9iamVjdDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnICYmIG9iamVjdC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJzZVNlbGVjdG9yKG9iamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgY29uc3QgaXNWaXNpYmxlID0gZWxlbWVudCA9PiB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlbWVudCkgfHwgZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50SXNWaXNpYmxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICd2aXNpYmxlJztcbiAgICAvLyBIYW5kbGUgYGRldGFpbHNgIGVsZW1lbnQgYXMgaXRzIGNvbnRlbnQgbWF5IGZhbHNpZSBhcHBlYXIgdmlzaWJsZSB3aGVuIGl0IGlzIGNsb3NlZFxuICAgIGNvbnN0IGNsb3NlZERldGFpbHMgPSBlbGVtZW50LmNsb3Nlc3QoJ2RldGFpbHM6bm90KFtvcGVuXSknKTtcbiAgICBpZiAoIWNsb3NlZERldGFpbHMpIHtcbiAgICAgIHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xuICAgIH1cbiAgICBpZiAoY2xvc2VkRGV0YWlscyAhPT0gZWxlbWVudCkge1xuICAgICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpO1xuICAgICAgaWYgKHN1bW1hcnkgJiYgc3VtbWFyeS5wYXJlbnROb2RlICE9PSBjbG9zZWREZXRhaWxzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChzdW1tYXJ5ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRJc1Zpc2libGU7XG4gIH07XG4gIGNvbnN0IGlzRGlzYWJsZWQgPSBlbGVtZW50ID0+IHtcbiAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVsZW1lbnQuZGlzYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5kaXNhYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpICE9PSAnZmFsc2UnO1xuICB9O1xuICBjb25zdCBmaW5kU2hhZG93Um9vdCA9IGVsZW1lbnQgPT4ge1xuICAgIGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmF0dGFjaFNoYWRvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ2FuIGZpbmQgdGhlIHNoYWRvdyByb290IG90aGVyd2lzZSBpdCdsbCByZXR1cm4gdGhlIGRvY3VtZW50XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50LmdldFJvb3ROb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCByb290ID0gZWxlbWVudC5nZXRSb290Tm9kZSgpO1xuICAgICAgcmV0dXJuIHJvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290ID8gcm9vdCA6IG51bGw7XG4gICAgfVxuICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gd2hlbiB3ZSBkb24ndCBmaW5kIGEgc2hhZG93IHJvb3RcbiAgICBpZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaW5kU2hhZG93Um9vdChlbGVtZW50LnBhcmVudE5vZGUpO1xuICB9O1xuICBjb25zdCBub29wID0gKCkgPT4ge307XG5cbiAgLyoqXG4gICAqIFRyaWNrIHRvIHJlc3RhcnQgYW4gZWxlbWVudCdzIGFuaW1hdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4gdm9pZFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LmNoYXJpc3RoZW8uaW8vYmxvZy8yMDIxLzAyL3Jlc3RhcnQtYS1jc3MtYW5pbWF0aW9uLXdpdGgtamF2YXNjcmlwdC8jcmVzdGFydGluZy1hLWNzcy1hbmltYXRpb25cbiAgICovXG4gIGNvbnN0IHJlZmxvdyA9IGVsZW1lbnQgPT4ge1xuICAgIGVsZW1lbnQub2Zmc2V0SGVpZ2h0OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICB9O1xuICBjb25zdCBnZXRqUXVlcnkgPSAoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5qUXVlcnkgJiYgIWRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCdkYXRhLWJzLW5vLWpxdWVyeScpKSB7XG4gICAgICByZXR1cm4gd2luZG93LmpRdWVyeTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIGNvbnN0IERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MgPSBbXTtcbiAgY29uc3Qgb25ET01Db250ZW50TG9hZGVkID0gY2FsbGJhY2sgPT4ge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgIC8vIGFkZCBsaXN0ZW5lciBvbiB0aGUgZmlyc3QgY2FsbCB3aGVuIHRoZSBkb2N1bWVudCBpcyBpbiBsb2FkaW5nIHN0YXRlXG4gICAgICBpZiAoIURPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaXNSVEwgPSAoKSA9PiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGlyID09PSAncnRsJztcbiAgY29uc3QgZGVmaW5lSlF1ZXJ5UGx1Z2luID0gcGx1Z2luID0+IHtcbiAgICBvbkRPTUNvbnRlbnRMb2FkZWQoKCkgPT4ge1xuICAgICAgY29uc3QgJCA9IGdldGpRdWVyeSgpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoJCkge1xuICAgICAgICBjb25zdCBuYW1lID0gcGx1Z2luLk5BTUU7XG4gICAgICAgIGNvbnN0IEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bbmFtZV07XG4gICAgICAgICQuZm5bbmFtZV0gPSBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlO1xuICAgICAgICAkLmZuW25hbWVdLkNvbnN0cnVjdG9yID0gcGx1Z2luO1xuICAgICAgICAkLmZuW25hbWVdLm5vQ29uZmxpY3QgPSAoKSA9PiB7XG4gICAgICAgICAgJC5mbltuYW1lXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICAgICAgICByZXR1cm4gcGx1Z2luLmpRdWVyeUludGVyZmFjZTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgZXhlY3V0ZSA9IChwb3NzaWJsZUNhbGxiYWNrLCBhcmdzID0gW10sIGRlZmF1bHRWYWx1ZSA9IHBvc3NpYmxlQ2FsbGJhY2spID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHBvc3NpYmxlQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBwb3NzaWJsZUNhbGxiYWNrKC4uLmFyZ3MpIDogZGVmYXVsdFZhbHVlO1xuICB9O1xuICBjb25zdCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uID0gKGNhbGxiYWNrLCB0cmFuc2l0aW9uRWxlbWVudCwgd2FpdEZvclRyYW5zaXRpb24gPSB0cnVlKSA9PiB7XG4gICAgaWYgKCF3YWl0Rm9yVHJhbnNpdGlvbikge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGR1cmF0aW9uUGFkZGluZyA9IDU7XG4gICAgY29uc3QgZW11bGF0ZWREdXJhdGlvbiA9IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRyYW5zaXRpb25FbGVtZW50KSArIGR1cmF0aW9uUGFkZGluZztcbiAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgaGFuZGxlciA9ICh7XG4gICAgICB0YXJnZXRcbiAgICB9KSA9PiB7XG4gICAgICBpZiAodGFyZ2V0ICE9PSB0cmFuc2l0aW9uRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgdHJhbnNpdGlvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcik7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIHRyYW5zaXRpb25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0sIGVtdWxhdGVkRHVyYXRpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHByZXZpb3VzL25leHQgZWxlbWVudCBvZiBhIGxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IGxpc3QgICAgVGhlIGxpc3Qgb2YgZWxlbWVudHNcbiAgICogQHBhcmFtIGFjdGl2ZUVsZW1lbnQgICBUaGUgYWN0aXZlIGVsZW1lbnRcbiAgICogQHBhcmFtIHNob3VsZEdldE5leHQgICBDaG9vc2UgdG8gZ2V0IG5leHQgb3IgcHJldmlvdXMgZWxlbWVudFxuICAgKiBAcGFyYW0gaXNDeWNsZUFsbG93ZWRcbiAgICogQHJldHVybiB7RWxlbWVudHxlbGVtfSBUaGUgcHJvcGVyIGVsZW1lbnRcbiAgICovXG4gIGNvbnN0IGdldE5leHRBY3RpdmVFbGVtZW50ID0gKGxpc3QsIGFjdGl2ZUVsZW1lbnQsIHNob3VsZEdldE5leHQsIGlzQ3ljbGVBbGxvd2VkKSA9PiB7XG4gICAgY29uc3QgbGlzdExlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICAgIGxldCBpbmRleCA9IGxpc3QuaW5kZXhPZihhY3RpdmVFbGVtZW50KTtcblxuICAgIC8vIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBsaXN0IHJldHVybiBhbiBlbGVtZW50XG4gICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24gYW5kIGlmIGN5Y2xlIGlzIGFsbG93ZWRcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gIXNob3VsZEdldE5leHQgJiYgaXNDeWNsZUFsbG93ZWQgPyBsaXN0W2xpc3RMZW5ndGggLSAxXSA6IGxpc3RbMF07XG4gICAgfVxuICAgIGluZGV4ICs9IHNob3VsZEdldE5leHQgPyAxIDogLTE7XG4gICAgaWYgKGlzQ3ljbGVBbGxvd2VkKSB7XG4gICAgICBpbmRleCA9IChpbmRleCArIGxpc3RMZW5ndGgpICUgbGlzdExlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3RbTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIGxpc3RMZW5ndGggLSAxKSldO1xuICB9O1xuXG4gIGV4cG9ydHMuZGVmaW5lSlF1ZXJ5UGx1Z2luID0gZGVmaW5lSlF1ZXJ5UGx1Z2luO1xuICBleHBvcnRzLmV4ZWN1dGUgPSBleGVjdXRlO1xuICBleHBvcnRzLmV4ZWN1dGVBZnRlclRyYW5zaXRpb24gPSBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uO1xuICBleHBvcnRzLmZpbmRTaGFkb3dSb290ID0gZmluZFNoYWRvd1Jvb3Q7XG4gIGV4cG9ydHMuZ2V0RWxlbWVudCA9IGdldEVsZW1lbnQ7XG4gIGV4cG9ydHMuZ2V0TmV4dEFjdGl2ZUVsZW1lbnQgPSBnZXROZXh0QWN0aXZlRWxlbWVudDtcbiAgZXhwb3J0cy5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCA9IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50O1xuICBleHBvcnRzLmdldFVJRCA9IGdldFVJRDtcbiAgZXhwb3J0cy5nZXRqUXVlcnkgPSBnZXRqUXVlcnk7XG4gIGV4cG9ydHMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIGV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuICBleHBvcnRzLmlzUlRMID0gaXNSVEw7XG4gIGV4cG9ydHMuaXNWaXNpYmxlID0gaXNWaXNpYmxlO1xuICBleHBvcnRzLm5vb3AgPSBub29wO1xuICBleHBvcnRzLm9uRE9NQ29udGVudExvYWRlZCA9IG9uRE9NQ29udGVudExvYWRlZDtcbiAgZXhwb3J0cy5wYXJzZVNlbGVjdG9yID0gcGFyc2VTZWxlY3RvcjtcbiAgZXhwb3J0cy5yZWZsb3cgPSByZWZsb3c7XG4gIGV4cG9ydHMudG9UeXBlID0gdG9UeXBlO1xuICBleHBvcnRzLnRyaWdnZXJUcmFuc2l0aW9uRW5kID0gdHJpZ2dlclRyYW5zaXRpb25FbmQ7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGV2ZW50LWhhbmRsZXIuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi91dGlsL2luZGV4LmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vdXRpbC9pbmRleCddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5FdmVudEhhbmRsZXIgPSBmYWN0b3J5KGdsb2JhbC5JbmRleCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChpbmRleF9qcykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCBkb20vZXZlbnQtaGFuZGxlci5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqL1xuXG4gIGNvbnN0IG5hbWVzcGFjZVJlZ2V4ID0gL1teLl0qKD89XFwuLiopXFwufC4qLztcbiAgY29uc3Qgc3RyaXBOYW1lUmVnZXggPSAvXFwuLiovO1xuICBjb25zdCBzdHJpcFVpZFJlZ2V4ID0gLzo6XFxkKyQvO1xuICBjb25zdCBldmVudFJlZ2lzdHJ5ID0ge307IC8vIEV2ZW50cyBzdG9yYWdlXG4gIGxldCB1aWRFdmVudCA9IDE7XG4gIGNvbnN0IGN1c3RvbUV2ZW50cyA9IHtcbiAgICBtb3VzZWVudGVyOiAnbW91c2VvdmVyJyxcbiAgICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG4gIH07XG4gIGNvbnN0IG5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoWydjbGljaycsICdkYmxjbGljaycsICdtb3VzZXVwJywgJ21vdXNlZG93bicsICdjb250ZXh0bWVudScsICdtb3VzZXdoZWVsJywgJ0RPTU1vdXNlU2Nyb2xsJywgJ21vdXNlb3ZlcicsICdtb3VzZW91dCcsICdtb3VzZW1vdmUnLCAnc2VsZWN0c3RhcnQnLCAnc2VsZWN0ZW5kJywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnb3JpZW50YXRpb25jaGFuZ2UnLCAndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnLCAndG91Y2hjYW5jZWwnLCAncG9pbnRlcmRvd24nLCAncG9pbnRlcm1vdmUnLCAncG9pbnRlcnVwJywgJ3BvaW50ZXJsZWF2ZScsICdwb2ludGVyY2FuY2VsJywgJ2dlc3R1cmVzdGFydCcsICdnZXN0dXJlY2hhbmdlJywgJ2dlc3R1cmVlbmQnLCAnZm9jdXMnLCAnYmx1cicsICdjaGFuZ2UnLCAncmVzZXQnLCAnc2VsZWN0JywgJ3N1Ym1pdCcsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2xvYWQnLCAndW5sb2FkJywgJ2JlZm9yZXVubG9hZCcsICdyZXNpemUnLCAnbW92ZScsICdET01Db250ZW50TG9hZGVkJywgJ3JlYWR5c3RhdGVjaGFuZ2UnLCAnZXJyb3InLCAnYWJvcnQnLCAnc2Nyb2xsJ10pO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIG1ldGhvZHNcbiAgICovXG5cbiAgZnVuY3Rpb24gbWFrZUV2ZW50VWlkKGVsZW1lbnQsIHVpZCkge1xuICAgIHJldHVybiB1aWQgJiYgYCR7dWlkfTo6JHt1aWRFdmVudCsrfWAgfHwgZWxlbWVudC51aWRFdmVudCB8fCB1aWRFdmVudCsrO1xuICB9XG4gIGZ1bmN0aW9uIGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCkge1xuICAgIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChlbGVtZW50KTtcbiAgICBlbGVtZW50LnVpZEV2ZW50ID0gdWlkO1xuICAgIGV2ZW50UmVnaXN0cnlbdWlkXSA9IGV2ZW50UmVnaXN0cnlbdWlkXSB8fCB7fTtcbiAgICByZXR1cm4gZXZlbnRSZWdpc3RyeVt1aWRdO1xuICB9XG4gIGZ1bmN0aW9uIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAgaHlkcmF0ZU9iaihldmVudCwge1xuICAgICAgICBkZWxlZ2F0ZVRhcmdldDogZWxlbWVudFxuICAgICAgfSk7XG4gICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm4uYXBwbHkoZWxlbWVudCwgW2V2ZW50XSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlcihlbGVtZW50LCBzZWxlY3RvciwgZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAgY29uc3QgZG9tRWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgZm9yIChsZXQge1xuICAgICAgICB0YXJnZXRcbiAgICAgIH0gPSBldmVudDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gdGhpczsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBkb21FbGVtZW50IG9mIGRvbUVsZW1lbnRzKSB7XG4gICAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT09IHRhcmdldCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGh5ZHJhdGVPYmooZXZlbnQsIHtcbiAgICAgICAgICAgIGRlbGVnYXRlVGFyZ2V0OiB0YXJnZXRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgc2VsZWN0b3IsIGZuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRIYW5kbGVyKGV2ZW50cywgY2FsbGFibGUsIGRlbGVnYXRpb25TZWxlY3RvciA9IG51bGwpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhldmVudHMpLmZpbmQoZXZlbnQgPT4gZXZlbnQuY2FsbGFibGUgPT09IGNhbGxhYmxlICYmIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvciA9PT0gZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgfVxuICBmdW5jdGlvbiBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBjb25zdCBpc0RlbGVnYXRlZCA9IHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJztcbiAgICAvLyBUT0RPOiB0b29sdGlwIHBhc3NlcyBgZmFsc2VgIGluc3RlYWQgb2Ygc2VsZWN0b3IsIHNvIHdlIG5lZWQgdG8gY2hlY2tcbiAgICBjb25zdCBjYWxsYWJsZSA9IGlzRGVsZWdhdGVkID8gZGVsZWdhdGlvbkZ1bmN0aW9uIDogaGFuZGxlciB8fCBkZWxlZ2F0aW9uRnVuY3Rpb247XG4gICAgbGV0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChvcmlnaW5hbFR5cGVFdmVudCk7XG4gICAgaWYgKCFuYXRpdmVFdmVudHMuaGFzKHR5cGVFdmVudCkpIHtcbiAgICAgIHR5cGVFdmVudCA9IG9yaWdpbmFsVHlwZUV2ZW50O1xuICAgIH1cbiAgICByZXR1cm4gW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XTtcbiAgfVxuICBmdW5jdGlvbiBhZGRIYW5kbGVyKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIG9uZU9mZikge1xuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKTtcblxuICAgIC8vIGluIGNhc2Ugb2YgbW91c2VlbnRlciBvciBtb3VzZWxlYXZlIHdyYXAgdGhlIGhhbmRsZXIgd2l0aGluIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGl0cyBET00gcG9zaXRpb25cbiAgICAvLyB0aGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0aGUgc2FtZSB3YXkgYXMgbW91c2VvdmVyIG9yIG1vdXNlb3V0IGRvZXNcbiAgICBpZiAob3JpZ2luYWxUeXBlRXZlbnQgaW4gY3VzdG9tRXZlbnRzKSB7XG4gICAgICBjb25zdCB3cmFwRnVuY3Rpb24gPSBmbiA9PiB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgIWV2ZW50LmRlbGVnYXRlVGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIGNhbGxhYmxlID0gd3JhcEZ1bmN0aW9uKGNhbGxhYmxlKTtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KTtcbiAgICBjb25zdCBoYW5kbGVycyA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IChldmVudHNbdHlwZUV2ZW50XSA9IHt9KTtcbiAgICBjb25zdCBwcmV2aW91c0Z1bmN0aW9uID0gZmluZEhhbmRsZXIoaGFuZGxlcnMsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKTtcbiAgICBpZiAocHJldmlvdXNGdW5jdGlvbikge1xuICAgICAgcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgPSBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiAmJiBvbmVPZmY7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChjYWxsYWJsZSwgb3JpZ2luYWxUeXBlRXZlbnQucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKTtcbiAgICBjb25zdCBmbiA9IGlzRGVsZWdhdGVkID8gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY2FsbGFibGUpIDogYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBjYWxsYWJsZSk7XG4gICAgZm4uZGVsZWdhdGlvblNlbGVjdG9yID0gaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbDtcbiAgICBmbi5jYWxsYWJsZSA9IGNhbGxhYmxlO1xuICAgIGZuLm9uZU9mZiA9IG9uZU9mZjtcbiAgICBmbi51aWRFdmVudCA9IHVpZDtcbiAgICBoYW5kbGVyc1t1aWRdID0gZm47XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIGlzRGVsZWdhdGVkKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpIHtcbiAgICBjb25zdCBmbiA9IGZpbmRIYW5kbGVyKGV2ZW50c1t0eXBlRXZlbnRdLCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpO1xuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIEJvb2xlYW4oZGVsZWdhdGlvblNlbGVjdG9yKSk7XG4gICAgZGVsZXRlIGV2ZW50c1t0eXBlRXZlbnRdW2ZuLnVpZEV2ZW50XTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIG5hbWVzcGFjZSkge1xuICAgIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge307XG4gICAgZm9yIChjb25zdCBbaGFuZGxlcktleSwgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgICAgaWYgKGhhbmRsZXJLZXkuaW5jbHVkZXMobmFtZXNwYWNlKSkge1xuICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0VHlwZUV2ZW50KGV2ZW50KSB7XG4gICAgLy8gYWxsb3cgdG8gZ2V0IHRoZSBuYXRpdmUgZXZlbnRzIGZyb20gbmFtZXNwYWNlZCBldmVudHMgKCdjbGljay5icy5idXR0b24nIC0tPiAnY2xpY2snKVxuICAgIGV2ZW50ID0gZXZlbnQucmVwbGFjZShzdHJpcE5hbWVSZWdleCwgJycpO1xuICAgIHJldHVybiBjdXN0b21FdmVudHNbZXZlbnRdIHx8IGV2ZW50O1xuICB9XG4gIGNvbnN0IEV2ZW50SGFuZGxlciA9IHtcbiAgICBvbihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIGZhbHNlKTtcbiAgICB9LFxuICAgIG9uZShlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIHRydWUpO1xuICAgIH0sXG4gICAgb2ZmKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pO1xuICAgICAgY29uc3QgaW5OYW1lc3BhY2UgPSB0eXBlRXZlbnQgIT09IG9yaWdpbmFsVHlwZUV2ZW50O1xuICAgICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KTtcbiAgICAgIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge307XG4gICAgICBjb25zdCBpc05hbWVzcGFjZSA9IG9yaWdpbmFsVHlwZUV2ZW50LnN0YXJ0c1dpdGgoJy4nKTtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFNpbXBsZXN0IGNhc2U6IGhhbmRsZXIgaXMgcGFzc2VkLCByZW1vdmUgdGhhdCBsaXN0ZW5lciBPTkxZLlxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKHN0b3JlRWxlbWVudEV2ZW50KS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNOYW1lc3BhY2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50RXZlbnQgb2YgT2JqZWN0LmtleXMoZXZlbnRzKSkge1xuICAgICAgICAgIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIGVsZW1lbnRFdmVudCwgb3JpZ2luYWxUeXBlRXZlbnQuc2xpY2UoMSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXlIYW5kbGVycywgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyS2V5ID0ga2V5SGFuZGxlcnMucmVwbGFjZShzdHJpcFVpZFJlZ2V4LCAnJyk7XG4gICAgICAgIGlmICghaW5OYW1lc3BhY2UgfHwgb3JpZ2luYWxUeXBlRXZlbnQuaW5jbHVkZXMoaGFuZGxlcktleSkpIHtcbiAgICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgdHJpZ2dlcihlbGVtZW50LCBldmVudCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCAkID0gaW5kZXhfanMuZ2V0alF1ZXJ5KCk7XG4gICAgICBjb25zdCB0eXBlRXZlbnQgPSBnZXRUeXBlRXZlbnQoZXZlbnQpO1xuICAgICAgY29uc3QgaW5OYW1lc3BhY2UgPSBldmVudCAhPT0gdHlwZUV2ZW50O1xuICAgICAgbGV0IGpRdWVyeUV2ZW50ID0gbnVsbDtcbiAgICAgIGxldCBidWJibGVzID0gdHJ1ZTtcbiAgICAgIGxldCBuYXRpdmVEaXNwYXRjaCA9IHRydWU7XG4gICAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGluTmFtZXNwYWNlICYmICQpIHtcbiAgICAgICAgalF1ZXJ5RXZlbnQgPSAkLkV2ZW50KGV2ZW50LCBhcmdzKTtcbiAgICAgICAgJChlbGVtZW50KS50cmlnZ2VyKGpRdWVyeUV2ZW50KTtcbiAgICAgICAgYnViYmxlcyA9ICFqUXVlcnlFdmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO1xuICAgICAgICBuYXRpdmVEaXNwYXRjaCA9ICFqUXVlcnlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO1xuICAgICAgICBkZWZhdWx0UHJldmVudGVkID0galF1ZXJ5RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBldnQgPSBoeWRyYXRlT2JqKG5ldyBFdmVudChldmVudCwge1xuICAgICAgICBidWJibGVzLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICB9KSwgYXJncyk7XG4gICAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYXRpdmVEaXNwYXRjaCkge1xuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCAmJiBqUXVlcnlFdmVudCkge1xuICAgICAgICBqUXVlcnlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV2dDtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGh5ZHJhdGVPYmoob2JqLCBtZXRhID0ge30pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gY2F0Y2ggKF91bnVzZWQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIEV2ZW50SGFuZGxlcjtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXZlbnQtaGFuZGxlci5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBtYW5pcHVsYXRvci5qcyB2NS4zLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyNCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuTWFuaXB1bGF0b3IgPSBmYWN0b3J5KCkpO1xufSkodGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgZG9tL21hbmlwdWxhdG9yLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICBmdW5jdGlvbiBub3JtYWxpemVEYXRhKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBOdW1iZXIodmFsdWUpLnRvU3RyaW5nKCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG4gICAgfSBjYXRjaCAoX3VudXNlZCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBub3JtYWxpemVEYXRhS2V5KGtleSkge1xuICAgIHJldHVybiBrZXkucmVwbGFjZSgvW0EtWl0vZywgY2hyID0+IGAtJHtjaHIudG9Mb3dlckNhc2UoKX1gKTtcbiAgfVxuICBjb25zdCBNYW5pcHVsYXRvciA9IHtcbiAgICBzZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSwgdmFsdWUpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWAsIHZhbHVlKTtcbiAgICB9LFxuICAgIHJlbW92ZURhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKTtcbiAgICB9LFxuICAgIGdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgICBjb25zdCBic0tleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50LmRhdGFzZXQpLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJ2JzJykgJiYgIWtleS5zdGFydHNXaXRoKCdic0NvbmZpZycpKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGJzS2V5cykge1xuICAgICAgICBsZXQgcHVyZUtleSA9IGtleS5yZXBsYWNlKC9eYnMvLCAnJyk7XG4gICAgICAgIHB1cmVLZXkgPSBwdXJlS2V5LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcHVyZUtleS5zbGljZSgxLCBwdXJlS2V5Lmxlbmd0aCk7XG4gICAgICAgIGF0dHJpYnV0ZXNbcHVyZUtleV0gPSBub3JtYWxpemVEYXRhKGVsZW1lbnQuZGF0YXNldFtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH0sXG4gICAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVEYXRhKGVsZW1lbnQuZ2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIE1hbmlwdWxhdG9yO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYW5pcHVsYXRvci5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBjb25maWcuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi9kb20vbWFuaXB1bGF0b3IuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL2RvbS9tYW5pcHVsYXRvcicsICcuL2luZGV4J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkNvbmZpZyA9IGZhY3RvcnkoZ2xvYmFsLk1hbmlwdWxhdG9yLCBnbG9iYWwuSW5kZXgpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoTWFuaXB1bGF0b3IsIGluZGV4X2pzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIHV0aWwvY29uZmlnLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIENvbmZpZyB7XG4gICAgLy8gR2V0dGVyc1xuICAgIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIHN0YXRpYyBtZXRob2QgXCJOQU1FXCIsIGZvciBlYWNoIGNvbXBvbmVudCEnKTtcbiAgICB9XG4gICAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZyk7XG4gICAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZyk7XG4gICAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gICAgX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgZWxlbWVudCkge1xuICAgICAgY29uc3QganNvbkNvbmZpZyA9IGluZGV4X2pzLmlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgJ2NvbmZpZycpIDoge307IC8vIHRyeSB0byBwYXJzZVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQsXG4gICAgICAgIC4uLih0eXBlb2YganNvbkNvbmZpZyA9PT0gJ29iamVjdCcgPyBqc29uQ29uZmlnIDoge30pLFxuICAgICAgICAuLi4oaW5kZXhfanMuaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkgOiB7fSksXG4gICAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IHt9KVxuICAgICAgfTtcbiAgICB9XG4gICAgX3R5cGVDaGVja0NvbmZpZyhjb25maWcsIGNvbmZpZ1R5cGVzID0gdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSkge1xuICAgICAgZm9yIChjb25zdCBbcHJvcGVydHksIGV4cGVjdGVkVHlwZXNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ1R5cGVzKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV07XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGluZGV4X2pzLmlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiBpbmRleF9qcy50b1R5cGUodmFsdWUpO1xuICAgICAgICBpZiAoIW5ldyBSZWdFeHAoZXhwZWN0ZWRUeXBlcykudGVzdCh2YWx1ZVR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcIiR7cHJvcGVydHl9XCIgcHJvdmlkZWQgdHlwZSBcIiR7dmFsdWVUeXBlfVwiIGJ1dCBleHBlY3RlZCB0eXBlIFwiJHtleHBlY3RlZFR5cGVzfVwiLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIENvbmZpZztcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZmlnLmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGJhc2UtY29tcG9uZW50LmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi9kb20vZGF0YS5qcycpLCByZXF1aXJlKCcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9jb25maWcuanMnKSwgcmVxdWlyZSgnLi91dGlsL2luZGV4LmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi9kb20vZGF0YScsICcuL2RvbS9ldmVudC1oYW5kbGVyJywgJy4vdXRpbC9jb25maWcnLCAnLi91dGlsL2luZGV4J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkJhc2VDb21wb25lbnQgPSBmYWN0b3J5KGdsb2JhbC5EYXRhLCBnbG9iYWwuRXZlbnRIYW5kbGVyLCBnbG9iYWwuQ29uZmlnLCBnbG9iYWwuSW5kZXgpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoRGF0YSwgRXZlbnRIYW5kbGVyLCBDb25maWcsIGluZGV4X2pzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIGJhc2UtY29tcG9uZW50LmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICovXG5cbiAgY29uc3QgVkVSU0lPTiA9ICc1LjMuMyc7XG5cbiAgLyoqXG4gICAqIENsYXNzIGRlZmluaXRpb25cbiAgICovXG5cbiAgY2xhc3MgQmFzZUNvbXBvbmVudCBleHRlbmRzIENvbmZpZyB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgZWxlbWVudCA9IGluZGV4X2pzLmdldEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIERhdGEuc2V0KHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIFB1YmxpY1xuICAgIGRpc3Bvc2UoKSB7XG4gICAgICBEYXRhLnJlbW92ZSh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKTtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpO1xuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcbiAgICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgX3F1ZXVlQ2FsbGJhY2soY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQgPSB0cnVlKSB7XG4gICAgICBpbmRleF9qcy5leGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkKTtcbiAgICB9XG4gICAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgdGhpcy5fZWxlbWVudCk7XG4gICAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZyk7XG4gICAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgLy8gU3RhdGljXG4gICAgc3RhdGljIGdldEluc3RhbmNlKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBEYXRhLmdldChpbmRleF9qcy5nZXRFbGVtZW50KGVsZW1lbnQpLCB0aGlzLkRBVEFfS0VZKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgY29uZmlnID0ge30pIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKGVsZW1lbnQpIHx8IG5ldyB0aGlzKGVsZW1lbnQsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbCk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgVkVSU0lPTigpIHtcbiAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IERBVEFfS0VZKCkge1xuICAgICAgcmV0dXJuIGBicy4ke3RoaXMuTkFNRX1gO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEVWRU5UX0tFWSgpIHtcbiAgICAgIHJldHVybiBgLiR7dGhpcy5EQVRBX0tFWX1gO1xuICAgIH1cbiAgICBzdGF0aWMgZXZlbnROYW1lKG5hbWUpIHtcbiAgICAgIHJldHVybiBgJHtuYW1lfSR7dGhpcy5FVkVOVF9LRVl9YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gQmFzZUNvbXBvbmVudDtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS1jb21wb25lbnQuanMubWFwXG4iLCIvKiFcbiAgKiBCb290c3RyYXAgc2VsZWN0b3ItZW5naW5lLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi4vdXRpbC9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL3V0aWwvaW5kZXgnXSwgZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuU2VsZWN0b3JFbmdpbmUgPSBmYWN0b3J5KGdsb2JhbC5JbmRleCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChpbmRleF9qcykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCBkb20vc2VsZWN0b3ItZW5naW5lLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICBjb25zdCBnZXRTZWxlY3RvciA9IGVsZW1lbnQgPT4ge1xuICAgIGxldCBzZWxlY3RvciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXRhcmdldCcpO1xuICAgIGlmICghc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICcjJykge1xuICAgICAgbGV0IGhyZWZBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgICAvLyBUaGUgb25seSB2YWxpZCBjb250ZW50IHRoYXQgY291bGQgZG91YmxlIGFzIGEgc2VsZWN0b3IgYXJlIElEcyBvciBjbGFzc2VzLFxuICAgICAgLy8gc28gZXZlcnl0aGluZyBzdGFydGluZyB3aXRoIGAjYCBvciBgLmAuIElmIGEgXCJyZWFsXCIgVVJMIGlzIHVzZWQgYXMgdGhlIHNlbGVjdG9yLFxuICAgICAgLy8gYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgIHdpbGwgcmlnaHRmdWxseSBjb21wbGFpbiBpdCBpcyBpbnZhbGlkLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMzIyNzNcbiAgICAgIGlmICghaHJlZkF0dHJpYnV0ZSB8fCAhaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gSnVzdCBpbiBjYXNlIHNvbWUgQ01TIHB1dHMgb3V0IGEgZnVsbCBVUkwgd2l0aCB0aGUgYW5jaG9yIGFwcGVuZGVkXG4gICAgICBpZiAoaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICBocmVmQXR0cmlidXRlID0gYCMke2hyZWZBdHRyaWJ1dGUuc3BsaXQoJyMnKVsxXX1gO1xuICAgICAgfVxuICAgICAgc2VsZWN0b3IgPSBocmVmQXR0cmlidXRlICYmIGhyZWZBdHRyaWJ1dGUgIT09ICcjJyA/IGhyZWZBdHRyaWJ1dGUudHJpbSgpIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdG9yID8gc2VsZWN0b3Iuc3BsaXQoJywnKS5tYXAoc2VsID0+IGluZGV4X2pzLnBhcnNlU2VsZWN0b3Ioc2VsKSkuam9pbignLCcpIDogbnVsbDtcbiAgfTtcbiAgY29uc3QgU2VsZWN0b3JFbmdpbmUgPSB7XG4gICAgZmluZChzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKTtcbiAgICB9LFxuICAgIGZpbmRPbmUoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICAgIH0sXG4gICAgY2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoLi4uZWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGNoaWxkID0+IGNoaWxkLm1hdGNoZXMoc2VsZWN0b3IpKTtcbiAgICB9LFxuICAgIHBhcmVudHMoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcbiAgICAgIGxldCBhbmNlc3RvciA9IGVsZW1lbnQucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKTtcbiAgICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgICBwYXJlbnRzLnB1c2goYW5jZXN0b3IpO1xuICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9LFxuICAgIHByZXYoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIGxldCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgIHdoaWxlIChwcmV2aW91cykge1xuICAgICAgICBpZiAocHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gW3ByZXZpb3VzXTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91cyA9IHByZXZpb3VzLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSxcbiAgICAvLyBUT0RPOiB0aGlzIGlzIG5vdyB1bnVzZWQ7IHJlbW92ZSBsYXRlciBhbG9uZyB3aXRoIHByZXYoKVxuICAgIG5leHQoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIGxldCBuZXh0ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICB3aGlsZSAobmV4dCkge1xuICAgICAgICBpZiAobmV4dC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBbbmV4dF07XG4gICAgICAgIH1cbiAgICAgICAgbmV4dCA9IG5leHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG4gICAgZm9jdXNhYmxlQ2hpbGRyZW4oZWxlbWVudCkge1xuICAgICAgY29uc3QgZm9jdXNhYmxlcyA9IFsnYScsICdidXR0b24nLCAnaW5wdXQnLCAndGV4dGFyZWEnLCAnc2VsZWN0JywgJ2RldGFpbHMnLCAnW3RhYmluZGV4XScsICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSddLm1hcChzZWxlY3RvciA9PiBgJHtzZWxlY3Rvcn06bm90KFt0YWJpbmRleF49XCItXCJdKWApLmpvaW4oJywnKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmQoZm9jdXNhYmxlcywgZWxlbWVudCkuZmlsdGVyKGVsID0+ICFpbmRleF9qcy5pc0Rpc2FibGVkKGVsKSAmJiBpbmRleF9qcy5pc1Zpc2libGUoZWwpKTtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IpIDogbnVsbDtcbiAgICB9LFxuICAgIGdldE11bHRpcGxlRWxlbWVudHNGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpIDogW107XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTZWxlY3RvckVuZ2luZTtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsZWN0b3ItZW5naW5lLmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGJhY2tkcm9wLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnKSwgcmVxdWlyZSgnLi9jb25maWcuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL2RvbS9ldmVudC1oYW5kbGVyJywgJy4vY29uZmlnJywgJy4vaW5kZXgnXSwgZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuQmFja2Ryb3AgPSBmYWN0b3J5KGdsb2JhbC5FdmVudEhhbmRsZXIsIGdsb2JhbC5Db25maWcsIGdsb2JhbC5JbmRleCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChFdmVudEhhbmRsZXIsIENvbmZpZywgaW5kZXhfanMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgdXRpbC9iYWNrZHJvcC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqL1xuXG4gIGNvbnN0IE5BTUUgPSAnYmFja2Ryb3AnO1xuICBjb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSc7XG4gIGNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93JztcbiAgY29uc3QgRVZFTlRfTU9VU0VET1dOID0gYG1vdXNlZG93bi5icy4ke05BTUV9YDtcbiAgY29uc3QgRGVmYXVsdCA9IHtcbiAgICBjbGFzc05hbWU6ICdtb2RhbC1iYWNrZHJvcCcsXG4gICAgY2xpY2tDYWxsYmFjazogbnVsbCxcbiAgICBpc0FuaW1hdGVkOiBmYWxzZSxcbiAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgLy8gaWYgZmFsc2UsIHdlIHVzZSB0aGUgYmFja2Ryb3AgaGVscGVyIHdpdGhvdXQgYWRkaW5nIGFueSBlbGVtZW50IHRvIHRoZSBkb21cbiAgICByb290RWxlbWVudDogJ2JvZHknIC8vIGdpdmUgdGhlIGNob2ljZSB0byBwbGFjZSBiYWNrZHJvcCB1bmRlciBkaWZmZXJlbnQgZWxlbWVudHNcbiAgfTtcbiAgY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICBjbGlja0NhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgICBpc0FuaW1hdGVkOiAnYm9vbGVhbicsXG4gICAgaXNWaXNpYmxlOiAnYm9vbGVhbicsXG4gICAgcm9vdEVsZW1lbnQ6ICcoZWxlbWVudHxzdHJpbmcpJ1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIEJhY2tkcm9wIGV4dGVuZHMgQ29uZmlnIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEdldHRlcnNcbiAgICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgICByZXR1cm4gRGVmYXVsdDtcbiAgICB9XG4gICAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgICAgcmV0dXJuIE5BTUU7XG4gICAgfVxuXG4gICAgLy8gUHVibGljXG4gICAgc2hvdyhjYWxsYmFjaykge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICAgIGluZGV4X2pzLmV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9hcHBlbmQoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50KCk7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpIHtcbiAgICAgICAgaW5kZXhfanMucmVmbG93KGVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyk7XG4gICAgICB0aGlzLl9lbXVsYXRlQW5pbWF0aW9uKCgpID0+IHtcbiAgICAgICAgaW5kZXhfanMuZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaGlkZShjYWxsYmFjaykge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICAgIGluZGV4X2pzLmV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9nZXRFbGVtZW50KCkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xuICAgICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgICAgICBpbmRleF9qcy5leGVjdXRlKGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgaWYgKCF0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLl9pc0FwcGVuZGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUHJpdmF0ZVxuICAgIF9nZXRFbGVtZW50KCkge1xuICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJhY2tkcm9wLmNsYXNzTmFtZSA9IHRoaXMuX2NvbmZpZy5jbGFzc05hbWU7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgICAgIGJhY2tkcm9wLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9GQURFKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gYmFja2Ryb3A7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgICB9XG4gICAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgICAvLyB1c2UgZ2V0RWxlbWVudCgpIHdpdGggdGhlIGRlZmF1bHQgXCJib2R5XCIgdG8gZ2V0IGEgZnJlc2ggRWxlbWVudCBvbiBlYWNoIGluc3RhbnRpYXRpb25cbiAgICAgIGNvbmZpZy5yb290RWxlbWVudCA9IGluZGV4X2pzLmdldEVsZW1lbnQoY29uZmlnLnJvb3RFbGVtZW50KTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIF9hcHBlbmQoKSB7XG4gICAgICBpZiAodGhpcy5faXNBcHBlbmRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpO1xuICAgICAgdGhpcy5fY29uZmlnLnJvb3RFbGVtZW50LmFwcGVuZChlbGVtZW50KTtcbiAgICAgIEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCBFVkVOVF9NT1VTRURPV04sICgpID0+IHtcbiAgICAgICAgaW5kZXhfanMuZXhlY3V0ZSh0aGlzLl9jb25maWcuY2xpY2tDYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2lzQXBwZW5kZWQgPSB0cnVlO1xuICAgIH1cbiAgICBfZW11bGF0ZUFuaW1hdGlvbihjYWxsYmFjaykge1xuICAgICAgaW5kZXhfanMuZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgdGhpcy5fZ2V0RWxlbWVudCgpLCB0aGlzLl9jb25maWcuaXNBbmltYXRlZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEJhY2tkcm9wO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZHJvcC5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBjb21wb25lbnQtZnVuY3Rpb25zLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJy4uL2RvbS9ldmVudC1oYW5kbGVyLmpzJyksIHJlcXVpcmUoJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnLi4vZG9tL2V2ZW50LWhhbmRsZXInLCAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZScsICcuL2luZGV4J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuQ29tcG9uZW50RnVuY3Rpb25zID0ge30sIGdsb2JhbC5FdmVudEhhbmRsZXIsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkluZGV4KSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsIEV2ZW50SGFuZGxlciwgU2VsZWN0b3JFbmdpbmUsIGluZGV4X2pzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIHV0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgY29uc3QgZW5hYmxlRGlzbWlzc1RyaWdnZXIgPSAoY29tcG9uZW50LCBtZXRob2QgPSAnaGlkZScpID0+IHtcbiAgICBjb25zdCBjbGlja0V2ZW50ID0gYGNsaWNrLmRpc21pc3Mke2NvbXBvbmVudC5FVkVOVF9LRVl9YDtcbiAgICBjb25zdCBuYW1lID0gY29tcG9uZW50Lk5BTUU7XG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBjbGlja0V2ZW50LCBgW2RhdGEtYnMtZGlzbWlzcz1cIiR7bmFtZX1cIl1gLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleF9qcy5pc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcykgfHwgdGhpcy5jbG9zZXN0KGAuJHtuYW1lfWApO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnQuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpO1xuXG4gICAgICAvLyBNZXRob2QgYXJndW1lbnQgaXMgbGVmdCwgZm9yIEFsZXJ0IGFuZCBvbmx5LCBhcyBpdCBkb2Vzbid0IGltcGxlbWVudCB0aGUgJ2hpZGUnIG1ldGhvZFxuICAgICAgaW5zdGFuY2VbbWV0aG9kXSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIGV4cG9ydHMuZW5hYmxlRGlzbWlzc1RyaWdnZXIgPSBlbmFibGVEaXNtaXNzVHJpZ2dlcjtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcG9uZW50LWZ1bmN0aW9ucy5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBmb2N1c3RyYXAuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi9kb20vZXZlbnQtaGFuZGxlci5qcycpLCByZXF1aXJlKCcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJyksIHJlcXVpcmUoJy4vY29uZmlnLmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vZG9tL2V2ZW50LWhhbmRsZXInLCAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZScsICcuL2NvbmZpZyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Gb2N1c3RyYXAgPSBmYWN0b3J5KGdsb2JhbC5FdmVudEhhbmRsZXIsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkNvbmZpZykpO1xufSkodGhpcywgKGZ1bmN0aW9uIChFdmVudEhhbmRsZXIsIFNlbGVjdG9yRW5naW5lLCBDb25maWcpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgdXRpbC9mb2N1c3RyYXAuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBOQU1FID0gJ2ZvY3VzdHJhcCc7XG4gIGNvbnN0IERBVEFfS0VZID0gJ2JzLmZvY3VzdHJhcCc7XG4gIGNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gO1xuICBjb25zdCBFVkVOVF9GT0NVU0lOID0gYGZvY3VzaW4ke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9LRVlET1dOX1RBQiA9IGBrZXlkb3duLnRhYiR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IFRBQl9LRVkgPSAnVGFiJztcbiAgY29uc3QgVEFCX05BVl9GT1JXQVJEID0gJ2ZvcndhcmQnO1xuICBjb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJztcbiAgY29uc3QgRGVmYXVsdCA9IHtcbiAgICBhdXRvZm9jdXM6IHRydWUsXG4gICAgdHJhcEVsZW1lbnQ6IG51bGwgLy8gVGhlIGVsZW1lbnQgdG8gdHJhcCBmb2N1cyBpbnNpZGUgb2ZcbiAgfTtcbiAgY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gICAgYXV0b2ZvY3VzOiAnYm9vbGVhbicsXG4gICAgdHJhcEVsZW1lbnQ6ICdlbGVtZW50J1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIEZvY3VzVHJhcCBleHRlbmRzIENvbmZpZyB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gR2V0dGVyc1xuICAgIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRUeXBlO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgICByZXR1cm4gTkFNRTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICBhY3RpdmF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgICB0aGlzLl9jb25maWcudHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSk7IC8vIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9oYW5kbGVGb2N1c2luKGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fVEFCLCBldmVudCA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGV2ZW50KSk7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIGRlYWN0aXZhdGUoKSB7XG4gICAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKGRvY3VtZW50LCBFVkVOVF9LRVkpO1xuICAgIH1cblxuICAgIC8vIFByaXZhdGVcbiAgICBfaGFuZGxlRm9jdXNpbihldmVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB0cmFwRWxlbWVudFxuICAgICAgfSA9IHRoaXMuX2NvbmZpZztcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGRvY3VtZW50IHx8IGV2ZW50LnRhcmdldCA9PT0gdHJhcEVsZW1lbnQgfHwgdHJhcEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50cyA9IFNlbGVjdG9yRW5naW5lLmZvY3VzYWJsZUNoaWxkcmVuKHRyYXBFbGVtZW50KTtcbiAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9PT0gVEFCX05BVl9CQUNLV0FSRCkge1xuICAgICAgICBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXS5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudHNbMF0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgX2hhbmRsZUtleWRvd24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IFRBQl9LRVkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gVEFCX05BVl9CQUNLV0FSRCA6IFRBQl9OQVZfRk9SV0FSRDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRm9jdXNUcmFwO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb2N1c3RyYXAuanMubWFwXG4iLCIvKiFcbiAgKiBCb290c3RyYXAgc2Nyb2xsYmFyLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi4vZG9tL21hbmlwdWxhdG9yLmpzJyksIHJlcXVpcmUoJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL2RvbS9tYW5pcHVsYXRvcicsICcuLi9kb20vc2VsZWN0b3ItZW5naW5lJywgJy4vaW5kZXgnXSwgZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuU2Nyb2xsYmFyID0gZmFjdG9yeShnbG9iYWwuTWFuaXB1bGF0b3IsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkluZGV4KSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKE1hbmlwdWxhdG9yLCBTZWxlY3RvckVuZ2luZSwgaW5kZXhfanMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgdXRpbC9zY3JvbGxCYXIuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBTRUxFQ1RPUl9GSVhFRF9DT05URU5UID0gJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnO1xuICBjb25zdCBTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCA9ICcuc3RpY2t5LXRvcCc7XG4gIGNvbnN0IFBST1BFUlRZX1BBRERJTkcgPSAncGFkZGluZy1yaWdodCc7XG4gIGNvbnN0IFBST1BFUlRZX01BUkdJTiA9ICdtYXJnaW4tcmlnaHQnO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIFNjcm9sbEJhckhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICBnZXRXaWR0aCgpIHtcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvaW5uZXJXaWR0aCN1c2FnZV9ub3Rlc1xuICAgICAgY29uc3QgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50V2lkdGgpO1xuICAgIH1cbiAgICBoaWRlKCkge1xuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgICB0aGlzLl9kaXNhYmxlT3ZlckZsb3coKTtcbiAgICAgIC8vIGdpdmUgcGFkZGluZyB0byBlbGVtZW50IHRvIGJhbGFuY2UgdGhlIGhpZGRlbiBzY3JvbGxiYXIgd2lkdGhcbiAgICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aCk7XG4gICAgICAvLyB0cmljazogV2UgYWRqdXN0IHBvc2l0aXZlIHBhZGRpbmdSaWdodCBhbmQgbmVnYXRpdmUgbWFyZ2luUmlnaHQgdG8gc3RpY2t5LXRvcCBlbGVtZW50cyB0byBrZWVwIHNob3dpbmcgZnVsbHdpZHRoXG4gICAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpO1xuICAgICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTiwgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSAtIHdpZHRoKTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpO1xuICAgICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCBQUk9QRVJUWV9QQURESU5HKTtcbiAgICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORyk7XG4gICAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4pO1xuICAgIH1cbiAgICBpc092ZXJmbG93aW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDA7XG4gICAgfVxuXG4gICAgLy8gUHJpdmF0ZVxuICAgIF9kaXNhYmxlT3ZlckZsb3coKSB7XG4gICAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZSh0aGlzLl9lbGVtZW50LCAnb3ZlcmZsb3cnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICB9XG4gICAgX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5LCBjYWxsYmFjaykge1xuICAgICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA+IGVsZW1lbnQuY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCBgJHtjYWxsYmFjayhOdW1iZXIucGFyc2VGbG9hdChjYWxjdWxhdGVkVmFsdWUpKX1weGApO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKTtcbiAgICB9XG4gICAgX3NhdmVJbml0aWFsQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpIHtcbiAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gZWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICAgICAgaWYgKGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSwgYWN0dWFsVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBfcmVzZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSkge1xuICAgICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gcmVtb3ZlIHRoZSBwcm9wZXJ0eSBpZiB0aGUgdmFsdWUgaXMgYG51bGxgOyB0aGUgdmFsdWUgY2FuIGFsc28gYmUgemVyb1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHN0eWxlUHJvcGVydHkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHN0eWxlUHJvcGVydHksIHZhbHVlKTtcbiAgICAgIH07XG4gICAgICB0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjayk7XG4gICAgfVxuICAgIF9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBjYWxsQmFjaykge1xuICAgICAgaWYgKGluZGV4X2pzLmlzRWxlbWVudChzZWxlY3RvcikpIHtcbiAgICAgICAgY2FsbEJhY2soc2VsZWN0b3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHNlbCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgICBjYWxsQmFjayhzZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTY3JvbGxCYXJIZWxwZXI7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjcm9sbGJhci5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBtb2RhbC5qcyB2NS4zLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyNCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoJy4vYmFzZS1jb21wb25lbnQuanMnKSwgcmVxdWlyZSgnLi9kb20vZXZlbnQtaGFuZGxlci5qcycpLCByZXF1aXJlKCcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnKSwgcmVxdWlyZSgnLi91dGlsL2JhY2tkcm9wLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9mb2N1c3RyYXAuanMnKSwgcmVxdWlyZSgnLi91dGlsL2luZGV4LmpzJyksIHJlcXVpcmUoJy4vdXRpbC9zY3JvbGxiYXIuanMnKSkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuL2Jhc2UtY29tcG9uZW50JywgJy4vZG9tL2V2ZW50LWhhbmRsZXInLCAnLi9kb20vc2VsZWN0b3ItZW5naW5lJywgJy4vdXRpbC9iYWNrZHJvcCcsICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucycsICcuL3V0aWwvZm9jdXN0cmFwJywgJy4vdXRpbC9pbmRleCcsICcuL3V0aWwvc2Nyb2xsYmFyJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLk1vZGFsID0gZmFjdG9yeShnbG9iYWwuQmFzZUNvbXBvbmVudCwgZ2xvYmFsLkV2ZW50SGFuZGxlciwgZ2xvYmFsLlNlbGVjdG9yRW5naW5lLCBnbG9iYWwuQmFja2Ryb3AsIGdsb2JhbC5Db21wb25lbnRGdW5jdGlvbnMsIGdsb2JhbC5Gb2N1c3RyYXAsIGdsb2JhbC5JbmRleCwgZ2xvYmFsLlNjcm9sbGJhcikpO1xufSkodGhpcywgKGZ1bmN0aW9uIChCYXNlQ29tcG9uZW50LCBFdmVudEhhbmRsZXIsIFNlbGVjdG9yRW5naW5lLCBCYWNrZHJvcCwgY29tcG9uZW50RnVuY3Rpb25zX2pzLCBGb2N1c1RyYXAsIGluZGV4X2pzLCBTY3JvbGxCYXJIZWxwZXIpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgbW9kYWwuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBOQU1FID0gJ21vZGFsJztcbiAgY29uc3QgREFUQV9LRVkgPSAnYnMubW9kYWwnO1xuICBjb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YDtcbiAgY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSc7XG4gIGNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJztcbiAgY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YDtcbiAgY29uc3QgRVZFTlRfSElERV9QUkVWRU5URUQgPSBgaGlkZVByZXZlbnRlZCR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IEVWRU5UX1JFU0laRSA9IGByZXNpemUke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9DTElDS19ESVNNSVNTID0gYGNsaWNrLmRpc21pc3Mke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9NT1VTRURPV05fRElTTUlTUyA9IGBtb3VzZWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IEVWRU5UX0tFWURPV05fRElTTUlTUyA9IGBrZXlkb3duLmRpc21pc3Mke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWA7XG4gIGNvbnN0IENMQVNTX05BTUVfT1BFTiA9ICdtb2RhbC1vcGVuJztcbiAgY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnO1xuICBjb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdyc7XG4gIGNvbnN0IENMQVNTX05BTUVfU1RBVElDID0gJ21vZGFsLXN0YXRpYyc7XG4gIGNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLm1vZGFsLnNob3cnO1xuICBjb25zdCBTRUxFQ1RPUl9ESUFMT0cgPSAnLm1vZGFsLWRpYWxvZyc7XG4gIGNvbnN0IFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLm1vZGFsLWJvZHknO1xuICBjb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXSc7XG4gIGNvbnN0IERlZmF1bHQgPSB7XG4gICAgYmFja2Ryb3A6IHRydWUsXG4gICAgZm9jdXM6IHRydWUsXG4gICAga2V5Ym9hcmQ6IHRydWVcbiAgfTtcbiAgY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gICAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgICBmb2N1czogJ2Jvb2xlYW4nLFxuICAgIGtleWJvYXJkOiAnYm9vbGVhbidcbiAgfTtcblxuICAvKipcbiAgICogQ2xhc3MgZGVmaW5pdGlvblxuICAgKi9cblxuICBjbGFzcyBNb2RhbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICAgIHRoaXMuX2RpYWxvZyA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfRElBTE9HLCB0aGlzLl9lbGVtZW50KTtcbiAgICAgIHRoaXMuX2JhY2tkcm9wID0gdGhpcy5faW5pdGlhbGl6ZUJhY2tEcm9wKCk7XG4gICAgICB0aGlzLl9mb2N1c3RyYXAgPSB0aGlzLl9pbml0aWFsaXplRm9jdXNUcmFwKCk7XG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3Njcm9sbEJhciA9IG5ldyBTY3JvbGxCYXJIZWxwZXIoKTtcbiAgICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gR2V0dGVyc1xuICAgIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRUeXBlO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgICByZXR1cm4gTkFNRTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcbiAgICB9XG4gICAgc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICBpZiAodGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVywge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KTtcbiAgICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICB0aGlzLl9zY3JvbGxCYXIuaGlkZSgpO1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BFTik7XG4gICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICAgIHRoaXMuX2JhY2tkcm9wLnNob3coKCkgPT4gdGhpcy5fc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkpO1xuICAgIH1cbiAgICBoaWRlKCkge1xuICAgICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKTtcbiAgICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xuICAgICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB0aGlzLl9oaWRlTW9kYWwoKSwgdGhpcy5fZWxlbWVudCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYod2luZG93LCBFVkVOVF9LRVkpO1xuICAgICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9kaWFsb2csIEVWRU5UX0tFWSk7XG4gICAgICB0aGlzLl9iYWNrZHJvcC5kaXNwb3NlKCk7XG4gICAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpO1xuICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBoYW5kbGVVcGRhdGUoKSB7XG4gICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICB9XG5cbiAgICAvLyBQcml2YXRlXG4gICAgX2luaXRpYWxpemVCYWNrRHJvcCgpIHtcbiAgICAgIHJldHVybiBuZXcgQmFja2Ryb3Aoe1xuICAgICAgICBpc1Zpc2libGU6IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKSxcbiAgICAgICAgLy8gJ3N0YXRpYycgb3B0aW9uIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0cnVlLCBhbmQgYm9vbGVhbnMgd2lsbCBrZWVwIHRoZWlyIHZhbHVlLFxuICAgICAgICBpc0FuaW1hdGVkOiB0aGlzLl9pc0FuaW1hdGVkKClcbiAgICAgIH0pO1xuICAgIH1cbiAgICBfaW5pdGlhbGl6ZUZvY3VzVHJhcCgpIHtcbiAgICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBfc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkge1xuICAgICAgLy8gdHJ5IHRvIGFwcGVuZCBkeW5hbWljIG1vZGFsXG4gICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fZWxlbWVudCkpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQodGhpcy5fZWxlbWVudCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcsIHRydWUpO1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XG4gICAgICB0aGlzLl9lbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICBjb25zdCBtb2RhbEJvZHkgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01PREFMX0JPRFksIHRoaXMuX2RpYWxvZyk7XG4gICAgICBpZiAobW9kYWxCb2R5KSB7XG4gICAgICAgIG1vZGFsQm9keS5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuICAgICAgaW5kZXhfanMucmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyk7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuZm9jdXMpIHtcbiAgICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04sIHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2sodHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzLl9kaWFsb2csIHRoaXMuX2lzQW5pbWF0ZWQoKSk7XG4gICAgfVxuICAgIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSAhPT0gRVNDQVBFX0tFWSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICAgIH0pO1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmICF0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgICAgLy8gYSBiYWQgdHJpY2sgdG8gc2VncmVnYXRlIGNsaWNrcyB0aGF0IG1heSBzdGFydCBpbnNpZGUgZGlhbG9nIGJ1dCBlbmQgb3V0c2lkZSwgYW5kIGF2b2lkIGxpc3RlbiB0byBzY3JvbGxiYXIgY2xpY2tzXG4gICAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xJQ0tfRElTTUlTUywgZXZlbnQyID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0IHx8IHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50Mi50YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBfaGlkZU1vZGFsKCkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fYmFja2Ryb3AuaGlkZSgoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX09QRU4pO1xuICAgICAgICB0aGlzLl9yZXNldEFkanVzdG1lbnRzKCk7XG4gICAgICAgIHRoaXMuX3Njcm9sbEJhci5yZXNldCgpO1xuICAgICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIF9pc0FuaW1hdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSk7XG4gICAgfVxuICAgIF90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCkge1xuICAgICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERV9QUkVWRU5URUQpO1xuICAgICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IGluaXRpYWxPdmVyZmxvd1kgPSB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WTtcbiAgICAgIC8vIHJldHVybiBpZiB0aGUgZm9sbG93aW5nIGJhY2tncm91bmQgdHJhbnNpdGlvbiBoYXNuJ3QgeWV0IGNvbXBsZXRlZFxuICAgICAgaWYgKGluaXRpYWxPdmVyZmxvd1kgPT09ICdoaWRkZW4nIHx8IHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU1RBVElDKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU1RBVElDKTtcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TVEFUSUMpO1xuICAgICAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGluaXRpYWxPdmVyZmxvd1k7XG4gICAgICAgIH0sIHRoaXMuX2RpYWxvZyk7XG4gICAgICB9LCB0aGlzLl9kaWFsb2cpO1xuICAgICAgdGhpcy5fZWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBoYW5kbGUgb3ZlcmZsb3dpbmcgbW9kYWxzXG4gICAgICovXG5cbiAgICBfYWRqdXN0RGlhbG9nKCkge1xuICAgICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl9zY3JvbGxCYXIuZ2V0V2lkdGgoKTtcbiAgICAgIGNvbnN0IGlzQm9keU92ZXJmbG93aW5nID0gc2Nyb2xsYmFyV2lkdGggPiAwO1xuICAgICAgaWYgKGlzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSBpbmRleF9qcy5pc1JUTCgpID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGAke3Njcm9sbGJhcldpZHRofXB4YDtcbiAgICAgIH1cbiAgICAgIGlmICghaXNCb2R5T3ZlcmZsb3dpbmcgJiYgaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gaW5kZXhfanMuaXNSVEwoKSA/ICdwYWRkaW5nUmlnaHQnIDogJ3BhZGRpbmdMZWZ0JztcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGA7XG4gICAgICB9XG4gICAgfVxuICAgIF9yZXNldEFkanVzdG1lbnRzKCkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJztcbiAgICB9XG5cbiAgICAvLyBTdGF0aWNcbiAgICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZywgcmVsYXRlZFRhcmdldCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbY29uZmlnXShyZWxhdGVkVGFyZ2V0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICAgKi9cblxuICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKTtcbiAgICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfU0hPVywgc2hvd0V2ZW50ID0+IHtcbiAgICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAvLyBvbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4sICgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4X2pzLmlzVmlzaWJsZSh0aGlzKSkge1xuICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIG1vZGFsIHRvZ2dsZXIgd2hpbGUgYW5vdGhlciBvbmUgaXMgb3BlblxuICAgIGNvbnN0IGFscmVhZHlPcGVuID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShPUEVOX1NFTEVDVE9SKTtcbiAgICBpZiAoYWxyZWFkeU9wZW4pIHtcbiAgICAgIE1vZGFsLmdldEluc3RhbmNlKGFscmVhZHlPcGVuKS5oaWRlKCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG4gICAgZGF0YS50b2dnbGUodGhpcyk7XG4gIH0pO1xuICBjb21wb25lbnRGdW5jdGlvbnNfanMuZW5hYmxlRGlzbWlzc1RyaWdnZXIoTW9kYWwpO1xuXG4gIC8qKlxuICAgKiBqUXVlcnlcbiAgICovXG5cbiAgaW5kZXhfanMuZGVmaW5lSlF1ZXJ5UGx1Z2luKE1vZGFsKTtcblxuICByZXR1cm4gTW9kYWw7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZGFsLmpzLm1hcFxuIiwiZXhwb3J0IHZhciB0b3AgPSAndG9wJztcbmV4cG9ydCB2YXIgYm90dG9tID0gJ2JvdHRvbSc7XG5leHBvcnQgdmFyIHJpZ2h0ID0gJ3JpZ2h0JztcbmV4cG9ydCB2YXIgbGVmdCA9ICdsZWZ0JztcbmV4cG9ydCB2YXIgYXV0byA9ICdhdXRvJztcbmV4cG9ydCB2YXIgYmFzZVBsYWNlbWVudHMgPSBbdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0XTtcbmV4cG9ydCB2YXIgc3RhcnQgPSAnc3RhcnQnO1xuZXhwb3J0IHZhciBlbmQgPSAnZW5kJztcbmV4cG9ydCB2YXIgY2xpcHBpbmdQYXJlbnRzID0gJ2NsaXBwaW5nUGFyZW50cyc7XG5leHBvcnQgdmFyIHZpZXdwb3J0ID0gJ3ZpZXdwb3J0JztcbmV4cG9ydCB2YXIgcG9wcGVyID0gJ3BvcHBlcic7XG5leHBvcnQgdmFyIHJlZmVyZW5jZSA9ICdyZWZlcmVuY2UnO1xuZXhwb3J0IHZhciB2YXJpYXRpb25QbGFjZW1lbnRzID0gLyojX19QVVJFX18qL2Jhc2VQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7XG5leHBvcnQgdmFyIHBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovW10uY29uY2F0KGJhc2VQbGFjZW1lbnRzLCBbYXV0b10pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCwgcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTsgLy8gbW9kaWZpZXJzIHRoYXQgbmVlZCB0byByZWFkIHRoZSBET01cblxuZXhwb3J0IHZhciBiZWZvcmVSZWFkID0gJ2JlZm9yZVJlYWQnO1xuZXhwb3J0IHZhciByZWFkID0gJ3JlYWQnO1xuZXhwb3J0IHZhciBhZnRlclJlYWQgPSAnYWZ0ZXJSZWFkJzsgLy8gcHVyZS1sb2dpYyBtb2RpZmllcnNcblxuZXhwb3J0IHZhciBiZWZvcmVNYWluID0gJ2JlZm9yZU1haW4nO1xuZXhwb3J0IHZhciBtYWluID0gJ21haW4nO1xuZXhwb3J0IHZhciBhZnRlck1haW4gPSAnYWZ0ZXJNYWluJzsgLy8gbW9kaWZpZXIgd2l0aCB0aGUgcHVycG9zZSB0byB3cml0ZSB0byB0aGUgRE9NIChvciB3cml0ZSBpbnRvIGEgZnJhbWV3b3JrIHN0YXRlKVxuXG5leHBvcnQgdmFyIGJlZm9yZVdyaXRlID0gJ2JlZm9yZVdyaXRlJztcbmV4cG9ydCB2YXIgd3JpdGUgPSAnd3JpdGUnO1xuZXhwb3J0IHZhciBhZnRlcldyaXRlID0gJ2FmdGVyV3JpdGUnO1xuZXhwb3J0IHZhciBtb2RpZmllclBoYXNlcyA9IFtiZWZvcmVSZWFkLCByZWFkLCBhZnRlclJlYWQsIGJlZm9yZU1haW4sIG1haW4sIGFmdGVyTWFpbiwgYmVmb3JlV3JpdGUsIHdyaXRlLCBhZnRlcldyaXRlXTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlTmFtZShlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gKGVsZW1lbnQubm9kZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIGlmIChub2RlID09IG51bGwpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgaWYgKG5vZGUudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgV2luZG93XScpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuSFRNTEVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlKSB7XG4gIC8vIElFIDExIGhhcyBubyBTaGFkb3dSb290XG4gIGlmICh0eXBlb2YgU2hhZG93Um9vdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5TaGFkb3dSb290O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q7XG59XG5cbmV4cG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH07IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gVGhpcyBtb2RpZmllciB0YWtlcyB0aGUgc3R5bGVzIHByZXBhcmVkIGJ5IHRoZSBgY29tcHV0ZVN0eWxlc2AgbW9kaWZpZXJcbi8vIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIEhUTUxFbGVtZW50cyBzdWNoIGFzIHBvcHBlciBhbmQgYXJyb3dcblxuZnVuY3Rpb24gYXBwbHlTdHlsZXMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuXG5cbiAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUgPT09IHRydWUgPyAnJyA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZTtcbiAgdmFyIGluaXRpYWxTdHlsZXMgPSB7XG4gICAgcG9wcGVyOiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fVxuICB9O1xuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBzdGF0ZS5zdHlsZXNbbmFtZV0gOiBpbml0aWFsU3R5bGVzW25hbWVdKTsgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cblxuICAgICAgdmFyIHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAoc3R5bGUsIHByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddXG59OyIsImltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbn0iLCJleHBvcnQgdmFyIG1heCA9IE1hdGgubWF4O1xuZXhwb3J0IHZhciBtaW4gPSBNYXRoLm1pbjtcbmV4cG9ydCB2YXIgcm91bmQgPSBNYXRoLnJvdW5kOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVBU3RyaW5nKCkge1xuICB2YXIgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG5cbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5icmFuZHMgJiYgQXJyYXkuaXNBcnJheSh1YURhdGEuYnJhbmRzKSkge1xuICAgIHJldHVybiB1YURhdGEuYnJhbmRzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uYnJhbmQgKyBcIi9cIiArIGl0ZW0udmVyc2lvbjtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cblxuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbn0iLCJpbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNMYXlvdXRWaWV3cG9ydCgpIHtcbiAgcmV0dXJuICEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xufSIsImltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNMYXlvdXRWaWV3cG9ydCBmcm9tIFwiLi9pc0xheW91dFZpZXdwb3J0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgaW5jbHVkZVNjYWxlLCBpc0ZpeGVkU3RyYXRlZ3kpIHtcbiAgaWYgKGluY2x1ZGVTY2FsZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZVNjYWxlID0gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNGaXhlZFN0cmF0ZWd5ID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkU3RyYXRlZ3kgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBjbGllbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IDE7XG4gIHZhciBzY2FsZVkgPSAxO1xuXG4gIGlmIChpbmNsdWRlU2NhbGUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIHNjYWxlWCA9IGVsZW1lbnQub2Zmc2V0V2lkdGggPiAwID8gcm91bmQoY2xpZW50UmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDEgOiAxO1xuICAgIHNjYWxlWSA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gMCA/IHJvdW5kKGNsaWVudFJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDEgOiAxO1xuICB9XG5cbiAgdmFyIF9yZWYgPSBpc0VsZW1lbnQoZWxlbWVudCkgPyBnZXRXaW5kb3coZWxlbWVudCkgOiB3aW5kb3csXG4gICAgICB2aXN1YWxWaWV3cG9ydCA9IF9yZWYudmlzdWFsVmlld3BvcnQ7XG5cbiAgdmFyIGFkZFZpc3VhbE9mZnNldHMgPSAhaXNMYXlvdXRWaWV3cG9ydCgpICYmIGlzRml4ZWRTdHJhdGVneTtcbiAgdmFyIHggPSAoY2xpZW50UmVjdC5sZWZ0ICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0IDogMCkpIC8gc2NhbGVYO1xuICB2YXIgeSA9IChjbGllbnRSZWN0LnRvcCArIChhZGRWaXN1YWxPZmZzZXRzICYmIHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wIDogMCkpIC8gc2NhbGVZO1xuICB2YXIgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoIC8gc2NhbGVYO1xuICB2YXIgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQgLyBzY2FsZVk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHRvcDogeSxcbiAgICByaWdodDogeCArIHdpZHRoLFxuICAgIGJvdHRvbTogeSArIGhlaWdodCxcbiAgICBsZWZ0OiB4LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ106IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG5cblxuICAgICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICAgIH0gd2hpbGUgKG5leHQpO1xuICAgIH0gLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufSIsImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwiaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgZWxlbWVudC5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8ICggLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWRcbiAgICBpc1NoYWRvd1Jvb3QoZWxlbWVudCkgPyBlbGVtZW50Lmhvc3QgOiBudWxsKSB8fCAvLyBTaGFkb3dSb290IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gXCIuL2lzVGFibGVFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBpc0ZpcmVmb3ggPSAvZmlyZWZveC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG4gIHZhciBpc0lFID0gL1RyaWRlbnQvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xuXG4gIGlmIChpc0lFICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBJbiBJRSA5LCAxMCBhbmQgMTEgZml4ZWQgZWxlbWVudHMgY29udGFpbmluZyBibG9jayBpcyBhbHdheXMgZXN0YWJsaXNoZWQgYnkgdGhlIHZpZXdwb3J0XG4gICAgdmFyIGVsZW1lbnRDc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuXG4gICAgaWYgKGVsZW1lbnRDc3MucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgaWYgKGlzU2hhZG93Um9vdChjdXJyZW50Tm9kZSkpIHtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmhvc3Q7XG4gIH1cblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG5cbiAgICBpZiAoY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIGNzcy5maWx0ZXIgJiYgY3NzLmZpbHRlciAhPT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufSIsImltcG9ydCB7IG1heCBhcyBtYXRoTWF4LCBtaW4gYXMgbWF0aE1pbiB9IGZyb20gXCIuL21hdGguanNcIjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KSB7XG4gIHJldHVybiBtYXRoTWF4KG1pbiwgbWF0aE1pbih2YWx1ZSwgbWF4KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gd2l0aGluTWF4Q2xhbXAobWluLCB2YWx1ZSwgbWF4KSB7XG4gIHZhciB2ID0gd2l0aGluKG1pbiwgdmFsdWUsIG1heCk7XG4gIHJldHVybiB2ID4gbWF4ID8gbWF4IDogdjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGcmVzaFNpZGVPYmplY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwXG4gIH07XG59IiwiaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlUGFkZGluZ09iamVjdChwYWRkaW5nT2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBnZXRGcmVzaFNpZGVPYmplY3QoKSwgcGFkZGluZ09iamVjdCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn0iLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4uL2RvbS11dGlscy9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4gfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuLi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4uL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qc1wiO1xuaW1wb3J0IHsgbGVmdCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB0b3AsIGJvdHRvbSB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB0b1BhZGRpbmdPYmplY3QgPSBmdW5jdGlvbiB0b1BhZGRpbmdPYmplY3QocGFkZGluZywgc3RhdGUpIHtcbiAgcGFkZGluZyA9IHR5cGVvZiBwYWRkaW5nID09PSAnZnVuY3Rpb24nID8gcGFkZGluZyhPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHBhZGRpbmc7XG4gIHJldHVybiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwO1xuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBpZiAoIWFycm93RWxlbWVudCB8fCAhcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICB2YXIgYXJyb3dSZWN0ID0gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpO1xuICB2YXIgbWluUHJvcCA9IGF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gIHZhciBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gIHZhciBlbmREaWZmID0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gKyBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIHZhciBzdGFydERpZmYgPSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgdmFyIGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG4gIHZhciBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjsgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBwb3BwZXIgaWYgdGhlIGNlbnRlciBwb2ludCBpc1xuICAvLyBvdXRzaWRlIG9mIHRoZSBwb3BwZXIgYm91bmRzXG5cbiAgdmFyIG1pbiA9IHBhZGRpbmdPYmplY3RbbWluUHJvcF07XG4gIHZhciBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dSZWN0W2xlbl0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICB2YXIgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgdmFyIG9mZnNldCA9IHdpdGhpbihtaW4sIGNlbnRlciwgbWF4KTsgLy8gUHJldmVudHMgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy4uLlxuXG4gIHZhciBheGlzUHJvcCA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSAoX3N0YXRlJG1vZGlmaWVyc0RhdGEkID0ge30sIF9zdGF0ZSRtb2RpZmllcnNEYXRhJFtheGlzUHJvcF0gPSBvZmZzZXQsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJC5jZW50ZXJPZmZzZXQgPSBvZmZzZXQgLSBjZW50ZXIsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJCk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQ7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250YWlucyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIsIGFycm93RWxlbWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5lbGVtZW50cy5hcnJvdyA9IGFycm93RWxlbWVudDtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGFycm93LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddXG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xufSIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdW5zZXRTaWRlcyA9IHtcbiAgdG9wOiAnYXV0bycsXG4gIHJpZ2h0OiAnYXV0bycsXG4gIGJvdHRvbTogJ2F1dG8nLFxuICBsZWZ0OiAnYXV0bydcbn07IC8vIFJvdW5kIHRoZSBvZmZzZXRzIHRvIHRoZSBuZWFyZXN0IHN1aXRhYmxlIHN1YnBpeGVsIGJhc2VkIG9uIHRoZSBEUFIuXG4vLyBab29taW5nIGNhbiBjaGFuZ2UgdGhlIERQUiwgYnV0IGl0IHNlZW1zIHRvIHJlcG9ydCBhIHZhbHVlIHRoYXQgd2lsbFxuLy8gY2xlYW5seSBkaXZpZGUgdGhlIHZhbHVlcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdWJwaXhlbHMuXG5cbmZ1bmN0aW9uIHJvdW5kT2Zmc2V0c0J5RFBSKF9yZWYsIHdpbikge1xuICB2YXIgeCA9IF9yZWYueCxcbiAgICAgIHkgPSBfcmVmLnk7XG4gIHZhciBkcHIgPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICByZXR1cm4ge1xuICAgIHg6IHJvdW5kKHggKiBkcHIpIC8gZHByIHx8IDAsXG4gICAgeTogcm91bmQoeSAqIGRwcikgLyBkcHIgfHwgMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9TdHlsZXMoX3JlZjIpIHtcbiAgdmFyIF9PYmplY3QkYXNzaWduMjtcblxuICB2YXIgcG9wcGVyID0gX3JlZjIucG9wcGVyLFxuICAgICAgcG9wcGVyUmVjdCA9IF9yZWYyLnBvcHBlclJlY3QsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmMi5wbGFjZW1lbnQsXG4gICAgICB2YXJpYXRpb24gPSBfcmVmMi52YXJpYXRpb24sXG4gICAgICBvZmZzZXRzID0gX3JlZjIub2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uID0gX3JlZjIucG9zaXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfcmVmMi5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBhZGFwdGl2ZSA9IF9yZWYyLmFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzID0gX3JlZjIucm91bmRPZmZzZXRzLFxuICAgICAgaXNGaXhlZCA9IF9yZWYyLmlzRml4ZWQ7XG4gIHZhciBfb2Zmc2V0cyR4ID0gb2Zmc2V0cy54LFxuICAgICAgeCA9IF9vZmZzZXRzJHggPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR4LFxuICAgICAgX29mZnNldHMkeSA9IG9mZnNldHMueSxcbiAgICAgIHkgPSBfb2Zmc2V0cyR5ID09PSB2b2lkIDAgPyAwIDogX29mZnNldHMkeTtcblxuICB2YXIgX3JlZjMgPSB0eXBlb2Ygcm91bmRPZmZzZXRzID09PSAnZnVuY3Rpb24nID8gcm91bmRPZmZzZXRzKHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfSkgOiB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG5cbiAgeCA9IF9yZWYzLng7XG4gIHkgPSBfcmVmMy55O1xuICB2YXIgaGFzWCA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3gnKTtcbiAgdmFyIGhhc1kgPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd5Jyk7XG4gIHZhciBzaWRlWCA9IGxlZnQ7XG4gIHZhciBzaWRlWSA9IHRvcDtcbiAgdmFyIHdpbiA9IHdpbmRvdztcblxuICBpZiAoYWRhcHRpdmUpIHtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KHBvcHBlcik7XG4gICAgdmFyIGhlaWdodFByb3AgPSAnY2xpZW50SGVpZ2h0JztcbiAgICB2YXIgd2lkdGhQcm9wID0gJ2NsaWVudFdpZHRoJztcblxuICAgIGlmIChvZmZzZXRQYXJlbnQgPT09IGdldFdpbmRvdyhwb3BwZXIpKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBnZXREb2N1bWVudEVsZW1lbnQocG9wcGVyKTtcblxuICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiAhPT0gJ3N0YXRpYycgJiYgcG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHtcbiAgICAgICAgaGVpZ2h0UHJvcCA9ICdzY3JvbGxIZWlnaHQnO1xuICAgICAgICB3aWR0aFByb3AgPSAnc2Nyb2xsV2lkdGgnO1xuICAgICAgfVxuICAgIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FzdF06IGZvcmNlIHR5cGUgcmVmaW5lbWVudCwgd2UgY29tcGFyZSBvZmZzZXRQYXJlbnQgd2l0aCB3aW5kb3cgYWJvdmUsIGJ1dCBGbG93IGRvZXNuJ3QgZGV0ZWN0IGl0XG5cblxuICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudDtcblxuICAgIGlmIChwbGFjZW1lbnQgPT09IHRvcCB8fCAocGxhY2VtZW50ID09PSBsZWZ0IHx8IHBsYWNlbWVudCA9PT0gcmlnaHQpICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWSA9IGJvdHRvbTtcbiAgICAgIHZhciBvZmZzZXRZID0gaXNGaXhlZCAmJiBvZmZzZXRQYXJlbnQgPT09IHdpbiAmJiB3aW4udmlzdWFsVmlld3BvcnQgPyB3aW4udmlzdWFsVmlld3BvcnQuaGVpZ2h0IDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICBvZmZzZXRQYXJlbnRbaGVpZ2h0UHJvcF07XG4gICAgICB5IC09IG9mZnNldFkgLSBwb3BwZXJSZWN0LmhlaWdodDtcbiAgICAgIHkgKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cblxuICAgIGlmIChwbGFjZW1lbnQgPT09IGxlZnQgfHwgKHBsYWNlbWVudCA9PT0gdG9wIHx8IHBsYWNlbWVudCA9PT0gYm90dG9tKSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVggPSByaWdodDtcbiAgICAgIHZhciBvZmZzZXRYID0gaXNGaXhlZCAmJiBvZmZzZXRQYXJlbnQgPT09IHdpbiAmJiB3aW4udmlzdWFsVmlld3BvcnQgPyB3aW4udmlzdWFsVmlld3BvcnQud2lkdGggOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFt3aWR0aFByb3BdO1xuICAgICAgeCAtPSBvZmZzZXRYIC0gcG9wcGVyUmVjdC53aWR0aDtcbiAgICAgIHggKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb21tb25TdHlsZXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgfSwgYWRhcHRpdmUgJiYgdW5zZXRTaWRlcyk7XG5cbiAgdmFyIF9yZWY0ID0gcm91bmRPZmZzZXRzID09PSB0cnVlID8gcm91bmRPZmZzZXRzQnlEUFIoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9LCBnZXRXaW5kb3cocG9wcGVyKSkgOiB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG5cbiAgeCA9IF9yZWY0Lng7XG4gIHkgPSBfcmVmNC55O1xuXG4gIGlmIChncHVBY2NlbGVyYXRpb24pIHtcbiAgICB2YXIgX09iamVjdCRhc3NpZ247XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24gPSB7fSwgX09iamVjdCRhc3NpZ25bc2lkZVldID0gaGFzWSA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbltzaWRlWF0gPSBoYXNYID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduLnRyYW5zZm9ybSA9ICh3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA8PSAxID8gXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIiA6IFwidHJhbnNsYXRlM2QoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweCwgMClcIiwgX09iamVjdCRhc3NpZ24pKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbjIgPSB7fSwgX09iamVjdCRhc3NpZ24yW3NpZGVZXSA9IGhhc1kgPyB5ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMltzaWRlWF0gPSBoYXNYID8geCArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjIudHJhbnNmb3JtID0gJycsIF9PYmplY3QkYXNzaWduMikpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKF9yZWY1KSB7XG4gIHZhciBzdGF0ZSA9IF9yZWY1LnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWY1Lm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPSBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGdwdUFjY2VsZXJhdCxcbiAgICAgIF9vcHRpb25zJGFkYXB0aXZlID0gb3B0aW9ucy5hZGFwdGl2ZSxcbiAgICAgIGFkYXB0aXZlID0gX29wdGlvbnMkYWRhcHRpdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhZGFwdGl2ZSxcbiAgICAgIF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9IG9wdGlvbnMucm91bmRPZmZzZXRzLFxuICAgICAgcm91bmRPZmZzZXRzID0gX29wdGlvbnMkcm91bmRPZmZzZXRzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcm91bmRPZmZzZXRzO1xuICB2YXIgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHZhcmlhdGlvbjogZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCksXG4gICAgcG9wcGVyOiBzdGF0ZS5lbGVtZW50cy5wb3BwZXIsXG4gICAgcG9wcGVyUmVjdDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIGdwdUFjY2VsZXJhdGlvbjogZ3B1QWNjZWxlcmF0aW9uLFxuICAgIGlzRml4ZWQ6IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCdcbiAgfTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLnBvcHBlciwgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsXG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGFkYXB0aXZlOiBhZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93ICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMuYXJyb3cgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMuYXJyb3csIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgYWRhcHRpdmU6IGZhbHNlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1wbGFjZW1lbnQnOiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdjb21wdXRlU3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gIGZuOiBjb21wdXRlU3R5bGVzLFxuICBkYXRhOiB7fVxufTsiLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTsiLCJ2YXIgaGFzaCA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCJ2YXIgaGFzaCA9IHtcbiAgc3RhcnQ6ICdlbmQnLFxuICBlbmQ6ICdzdGFydCdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9zdGFydHxlbmQvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgLy8gUG9wcGVyIDEgaXMgYnJva2VuIGluIHRoaXMgY2FzZSBhbmQgbmV2ZXIgaGFkIGEgYnVnIHJlcG9ydCBzbyBsZXQncyBhc3N1bWVcbiAgLy8gaXQncyBub3QgYW4gaXNzdWUuIEkgZG9uJ3QgdGhpbmsgYW55b25lIGV2ZXIgc3BlY2lmaWVzIHdpZHRoIG9uIDxodG1sPlxuICAvLyBhbnl3YXkuXG4gIC8vIEJyb3dzZXJzIHdoZXJlIHRoZSBsZWZ0IHNjcm9sbGJhciBkb2Vzbid0IGNhdXNlIGFuIGlzc3VlIHJlcG9ydCBgMGAgZm9yXG4gIC8vIHRoaXMgKGUuZy4gRWRnZSAyMDE5LCBJRTExLCBTYWZhcmkpXG4gIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICsgZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgaXNMYXlvdXRWaWV3cG9ydCBmcm9tIFwiLi9pc0xheW91dFZpZXdwb3J0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB2aXN1YWxWaWV3cG9ydCA9IHdpbi52aXN1YWxWaWV3cG9ydDtcbiAgdmFyIHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICB2YXIgeCA9IDA7XG4gIHZhciB5ID0gMDtcblxuICBpZiAodmlzdWFsVmlld3BvcnQpIHtcbiAgICB3aWR0aCA9IHZpc3VhbFZpZXdwb3J0LndpZHRoO1xuICAgIGhlaWdodCA9IHZpc3VhbFZpZXdwb3J0LmhlaWdodDtcbiAgICB2YXIgbGF5b3V0Vmlld3BvcnQgPSBpc0xheW91dFZpZXdwb3J0KCk7XG5cbiAgICBpZiAobGF5b3V0Vmlld3BvcnQgfHwgIWxheW91dFZpZXdwb3J0ICYmIHN0cmF0ZWd5ID09PSAnZml4ZWQnKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeTogeVxuICB9O1xufSIsImltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IHsgbWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gR2V0cyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgZG9jdW1lbnQgYXJlYSwgZXZlbiBleHRlbmRpbmcgb3V0c2lkZVxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgd2luU2Nyb2xsID0gZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpO1xuICB2YXIgYm9keSA9IChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keTtcbiAgdmFyIHdpZHRoID0gbWF4KGh0bWwuc2Nyb2xsV2lkdGgsIGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LnNjcm9sbFdpZHRoIDogMCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKTtcbiAgdmFyIGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkgPyBib2R5LnNjcm9sbEhlaWdodCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudEhlaWdodCA6IDApO1xuICB2YXIgeCA9IC13aW5TY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIHZhciB5ID0gLXdpblNjcm9sbC5zY3JvbGxUb3A7XG5cbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSB8fCBodG1sKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKSAtIHdpZHRoO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dZO1xuXG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufSIsImltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KG5vZGUpIHtcbiAgaWYgKFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUobm9kZSkpID49IDApIHtcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZSkgJiYgaXNTY3JvbGxQYXJlbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSk7XG59IiwiaW1wb3J0IGdldFNjcm9sbFBhcmVudCBmcm9tIFwiLi9nZXRTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbi8qXG5naXZlbiBhIERPTSBlbGVtZW50LCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHNjcm9sbCBwYXJlbnRzLCB1cCB0aGUgbGlzdCBvZiBhbmNlc29yc1xudW50aWwgd2UgZ2V0IHRvIHRoZSB0b3Agd2luZG93IG9iamVjdC4gVGhpcyBsaXN0IGlzIHdoYXQgd2UgYXR0YWNoIHNjcm9sbCBsaXN0ZW5lcnNcbnRvLCBiZWNhdXNlIGlmIGFueSBvZiB0aGVzZSBwYXJlbnQgZWxlbWVudHMgc2Nyb2xsLCB3ZSdsbCBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGVcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaXN0U2Nyb2xsUGFyZW50cyhlbGVtZW50LCBsaXN0KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgaWYgKGxpc3QgPT09IHZvaWQgMCkge1xuICAgIGxpc3QgPSBbXTtcbiAgfVxuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIHZhciBpc0JvZHkgPSBzY3JvbGxQYXJlbnQgPT09ICgoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHkpO1xuICB2YXIgd2luID0gZ2V0V2luZG93KHNjcm9sbFBhcmVudCk7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBbd2luXS5jb25jYXQod2luLnZpc3VhbFZpZXdwb3J0IHx8IFtdLCBpc1Njcm9sbFBhcmVudChzY3JvbGxQYXJlbnQpID8gc2Nyb2xsUGFyZW50IDogW10pIDogc2Nyb2xsUGFyZW50O1xuICB2YXIgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogaXNCb2R5IHRlbGxzIHVzIHRhcmdldCB3aWxsIGJlIGFuIEhUTUxFbGVtZW50IGhlcmVcbiAgdXBkYXRlZExpc3QuY29uY2F0KGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUodGFyZ2V0KSkpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlY3RUb0NsaWVudFJlY3QocmVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVjdCwge1xuICAgIGxlZnQ6IHJlY3QueCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICByaWdodDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH0pO1xufSIsImltcG9ydCB7IHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0Vmlld3BvcnRSZWN0IGZyb20gXCIuL2dldFZpZXdwb3J0UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50UmVjdCBmcm9tIFwiLi9nZXREb2N1bWVudFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuLi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBtYXgsIG1pbiB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGZhbHNlLCBzdHJhdGVneSA9PT0gJ2ZpeGVkJyk7XG4gIHJlY3QudG9wID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgcmVjdC5sZWZ0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LndpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC5oZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC54ID0gcmVjdC5sZWZ0O1xuICByZWN0LnkgPSByZWN0LnRvcDtcbiAgcmV0dXJuIHJlY3Q7XG59XG5cbmZ1bmN0aW9uIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkge1xuICByZXR1cm4gY2xpcHBpbmdQYXJlbnQgPT09IHZpZXdwb3J0ID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpKSA6IGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgPyBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpIDogcmVjdFRvQ2xpZW50UmVjdChnZXREb2N1bWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKSk7XG59IC8vIEEgXCJjbGlwcGluZyBwYXJlbnRcIiBpcyBhbiBvdmVyZmxvd2FibGUgY29udGFpbmVyIHdpdGggdGhlIGNoYXJhY3RlcmlzdGljIG9mXG4vLyBjbGlwcGluZyAob3IgaGlkaW5nKSBvdmVyZmxvd2luZyBlbGVtZW50cyB3aXRoIGEgcG9zaXRpb24gZGlmZmVyZW50IGZyb21cbi8vIGBpbml0aWFsYFxuXG5cbmZ1bmN0aW9uIGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSB7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKGVsZW1lbnQpKTtcbiAgdmFyIGNhbkVzY2FwZUNsaXBwaW5nID0gWydhYnNvbHV0ZScsICdmaXhlZCddLmluZGV4T2YoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbikgPj0gMDtcbiAgdmFyIGNsaXBwZXJFbGVtZW50ID0gY2FuRXNjYXBlQ2xpcHBpbmcgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSA/IGdldE9mZnNldFBhcmVudChlbGVtZW50KSA6IGVsZW1lbnQ7XG5cbiAgaWYgKCFpc0VsZW1lbnQoY2xpcHBlckVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xNDE0XG5cblxuICByZXR1cm4gY2xpcHBpbmdQYXJlbnRzLmZpbHRlcihmdW5jdGlvbiAoY2xpcHBpbmdQYXJlbnQpIHtcbiAgICByZXR1cm4gaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSAmJiBjb250YWlucyhjbGlwcGluZ1BhcmVudCwgY2xpcHBlckVsZW1lbnQpICYmIGdldE5vZGVOYW1lKGNsaXBwaW5nUGFyZW50KSAhPT0gJ2JvZHknO1xuICB9KTtcbn0gLy8gR2V0cyB0aGUgbWF4aW11bSBhcmVhIHRoYXQgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiBkdWUgdG8gYW55IG51bWJlciBvZlxuLy8gY2xpcHBpbmcgcGFyZW50c1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENsaXBwaW5nUmVjdChlbGVtZW50LCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5LCBzdHJhdGVneSkge1xuICB2YXIgbWFpbkNsaXBwaW5nUGFyZW50cyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJyA/IGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBbXS5jb25jYXQobWFpbkNsaXBwaW5nUGFyZW50cywgW3Jvb3RCb3VuZGFyeV0pO1xuICB2YXIgZmlyc3RDbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c1swXTtcbiAgdmFyIGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nUGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjY1JlY3QsIGNsaXBwaW5nUGFyZW50KSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpO1xuICAgIGFjY1JlY3QudG9wID0gbWF4KHJlY3QudG9wLCBhY2NSZWN0LnRvcCk7XG4gICAgYWNjUmVjdC5yaWdodCA9IG1pbihyZWN0LnJpZ2h0LCBhY2NSZWN0LnJpZ2h0KTtcbiAgICBhY2NSZWN0LmJvdHRvbSA9IG1pbihyZWN0LmJvdHRvbSwgYWNjUmVjdC5ib3R0b20pO1xuICAgIGFjY1JlY3QubGVmdCA9IG1heChyZWN0LmxlZnQsIGFjY1JlY3QubGVmdCk7XG4gICAgcmV0dXJuIGFjY1JlY3Q7XG4gIH0sIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGZpcnN0Q2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSk7XG4gIGNsaXBwaW5nUmVjdC53aWR0aCA9IGNsaXBwaW5nUmVjdC5yaWdodCAtIGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QuaGVpZ2h0ID0gY2xpcHBpbmdSZWN0LmJvdHRvbSAtIGNsaXBwaW5nUmVjdC50b3A7XG4gIGNsaXBwaW5nUmVjdC54ID0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC55ID0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgcmV0dXJuIGNsaXBwaW5nUmVjdDtcbn0iLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgc3RhcnQsIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZU9mZnNldHMoX3JlZikge1xuICB2YXIgcmVmZXJlbmNlID0gX3JlZi5yZWZlcmVuY2UsXG4gICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50ID8gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBlbGVtZW50LndpZHRoIC8gMjtcbiAgdmFyIGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZWxlbWVudC5oZWlnaHQgLyAyO1xuICB2YXIgb2Zmc2V0cztcblxuICBzd2l0Y2ggKGJhc2VQbGFjZW1lbnQpIHtcbiAgICBjYXNlIHRvcDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZWxlbWVudC5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHJpZ2h0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVmdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54IC0gZWxlbWVudC53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuXG4gIHZhciBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnQgPyBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCkgOiBudWxsO1xuXG4gIGlmIChtYWluQXhpcyAhPSBudWxsKSB7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSAtIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgZW5kOlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdICsgKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn0iLCJpbXBvcnQgZ2V0Q2xpcHBpbmdSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4vY29tcHV0ZU9mZnNldHMuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IGNsaXBwaW5nUGFyZW50cywgcmVmZXJlbmNlLCBwb3BwZXIsIGJvdHRvbSwgdG9wLCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4vbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuL2V4cGFuZFRvSGFzaE1hcC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdE92ZXJmbG93KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgX29wdGlvbnMkcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyBzdGF0ZS5wbGFjZW1lbnQgOiBfb3B0aW9ucyRwbGFjZW1lbnQsXG4gICAgICBfb3B0aW9ucyRzdHJhdGVneSA9IF9vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgc3RyYXRlZ3kgPSBfb3B0aW9ucyRzdHJhdGVneSA9PT0gdm9pZCAwID8gc3RhdGUuc3RyYXRlZ3kgOiBfb3B0aW9ucyRzdHJhdGVneSxcbiAgICAgIF9vcHRpb25zJGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zJGJvdW5kYXJ5ID09PSB2b2lkIDAgPyBjbGlwcGluZ1BhcmVudHMgOiBfb3B0aW9ucyRib3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9PT0gdm9pZCAwID8gdmlld3BvcnQgOiBfb3B0aW9ucyRyb290Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRlbGVtZW50Q29udGUgPSBfb3B0aW9ucy5lbGVtZW50Q29udGV4dCxcbiAgICAgIGVsZW1lbnRDb250ZXh0ID0gX29wdGlvbnMkZWxlbWVudENvbnRlID09PSB2b2lkIDAgPyBwb3BwZXIgOiBfb3B0aW9ucyRlbGVtZW50Q29udGUsXG4gICAgICBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9IF9vcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zJHBhZGRpbmcgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRwYWRkaW5nO1xuICB2YXIgcGFkZGluZ09iamVjdCA9IG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG4gIHZhciBhbHRDb250ZXh0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHJlZmVyZW5jZSA6IHBvcHBlcjtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICB2YXIgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IGdldERvY3VtZW50RWxlbWVudChzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5LCBzdHJhdGVneSk7XG4gIHZhciByZWZlcmVuY2VDbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHN0YXRlLmVsZW1lbnRzLnJlZmVyZW5jZSk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICBlbGVtZW50OiBwb3BwZXJSZWN0LFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pO1xuICB2YXIgcG9wcGVyQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCwgcG9wcGVyT2Zmc2V0cykpO1xuICB2YXIgZWxlbWVudENsaWVudFJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcG9wcGVyQ2xpZW50UmVjdCA6IHJlZmVyZW5jZUNsaWVudFJlY3Q7IC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuXG4gIHZhciBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbiAgdmFyIG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDsgLy8gT2Zmc2V0cyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBwb3BwZXIgZWxlbWVudFxuXG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0RGF0YVtwbGFjZW1lbnRdO1xuICAgIE9iamVjdC5rZXlzKG92ZXJmbG93T2Zmc2V0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICB2YXIgYXhpcyA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAneScgOiAneCc7XG4gICAgICBvdmVyZmxvd09mZnNldHNba2V5XSArPSBvZmZzZXRbYXhpc10gKiBtdWx0aXBseTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdmVyZmxvd09mZnNldHM7XG59IiwiaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCB7IHZhcmlhdGlvblBsYWNlbWVudHMsIGJhc2VQbGFjZW1lbnRzLCBwbGFjZW1lbnRzIGFzIGFsbFBsYWNlbWVudHMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4vZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9ucyA9IF9vcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgX29wdGlvbnMkYWxsb3dlZEF1dG9QID0gX29wdGlvbnMuYWxsb3dlZEF1dG9QbGFjZW1lbnRzLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gX29wdGlvbnMkYWxsb3dlZEF1dG9QID09PSB2b2lkIDAgPyBhbGxQbGFjZW1lbnRzIDogX29wdGlvbnMkYWxsb3dlZEF1dG9QO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCk7XG4gIHZhciBwbGFjZW1lbnRzID0gdmFyaWF0aW9uID8gZmxpcFZhcmlhdGlvbnMgPyB2YXJpYXRpb25QbGFjZW1lbnRzIDogdmFyaWF0aW9uUGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gdmFyaWF0aW9uO1xuICB9KSA6IGJhc2VQbGFjZW1lbnRzO1xuICB2YXIgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFsbG93ZWRBdXRvUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGFsbG93ZWRQbGFjZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cztcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS10eXBlXTogRmxvdyBzZWVtcyB0byBoYXZlIHByb2JsZW1zIHdpdGggdHdvIGFycmF5IHVuaW9ucy4uLlxuXG5cbiAgdmFyIG92ZXJmbG93cyA9IGFsbG93ZWRQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pW2dldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KV07XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICByZXR1cm4gT2JqZWN0LmtleXMob3ZlcmZsb3dzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93c1thXSAtIG92ZXJmbG93c1tiXTtcbiAgfSk7XG59IiwiaW1wb3J0IGdldE9wcG9zaXRlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBjb21wdXRlQXV0b1BsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IGJvdHRvbSwgdG9wLCBzdGFydCwgcmlnaHQsIGxlZnQsIGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmZ1bmN0aW9uIGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBpZiAoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgcmV0dXJuIFtnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpLCBvcHBvc2l0ZVBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpXTtcbn1cblxuZnVuY3Rpb24gZmxpcChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyA9IG9wdGlvbnMuZmFsbGJhY2tQbGFjZW1lbnRzLFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZmxpcFZhcmlhdGlvID0gb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMkZmxpcFZhcmlhdGlvID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZmxpcFZhcmlhdGlvLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHM7XG4gIHZhciBwcmVmZXJyZWRQbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSBiYXNlUGxhY2VtZW50ID09PSBwcmVmZXJyZWRQbGFjZW1lbnQ7XG4gIHZhciBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcFZhcmlhdGlvbnMgPyBbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwcmVmZXJyZWRQbGFjZW1lbnQpKTtcbiAgdmFyIHBsYWNlbWVudHMgPSBbcHJlZmVycmVkUGxhY2VtZW50XS5jb25jYXQoZmFsbGJhY2tQbGFjZW1lbnRzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvID8gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnM6IGZsaXBWYXJpYXRpb25zLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBhbGxvd2VkQXV0b1BsYWNlbWVudHNcbiAgICB9KSA6IHBsYWNlbWVudCk7XG4gIH0sIFtdKTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgY2hlY2tzTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbWFrZUZhbGxiYWNrQ2hlY2tzID0gdHJ1ZTtcbiAgdmFyIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHNbMF07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG5cbiAgICB2YXIgX2Jhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgaXNTdGFydFZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSBzdGFydDtcbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihfYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KTtcbiAgICB2YXIgbWFpblZhcmlhdGlvblNpZGUgPSBpc1ZlcnRpY2FsID8gaXNTdGFydFZhcmlhdGlvbiA/IHJpZ2h0IDogbGVmdCA6IGlzU3RhcnRWYXJpYXRpb24gPyBib3R0b20gOiB0b3A7XG5cbiAgICBpZiAocmVmZXJlbmNlUmVjdFtsZW5dID4gcG9wcGVyUmVjdFtsZW5dKSB7XG4gICAgICBtYWluVmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB9XG5cbiAgICB2YXIgYWx0VmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB2YXIgY2hlY2tzID0gW107XG5cbiAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbX2Jhc2VQbGFjZW1lbnRdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W21haW5WYXJpYXRpb25TaWRlXSA8PSAwLCBvdmVyZmxvd1thbHRWYXJpYXRpb25TaWRlXSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tzLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH0pKSB7XG4gICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICBtYWtlRmFsbGJhY2tDaGVja3MgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNoZWNrc01hcC5zZXQocGxhY2VtZW50LCBjaGVja3MpO1xuICB9XG5cbiAgaWYgKG1ha2VGYWxsYmFja0NoZWNrcykge1xuICAgIC8vIGAyYCBtYXkgYmUgZGVzaXJlZCBpbiBzb21lIGNhc2VzIOKAkyByZXNlYXJjaCBsYXRlclxuICAgIHZhciBudW1iZXJPZkNoZWNrcyA9IGZsaXBWYXJpYXRpb25zID8gMyA6IDE7XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfaSkge1xuICAgICAgdmFyIGZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzLmZpbmQoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gY2hlY2tzTWFwLmdldChwbGFjZW1lbnQpO1xuXG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tzLnNsaWNlKDAsIF9pKS5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBjaGVjaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IGZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gbnVtYmVyT2ZDaGVja3M7IF9pID4gMDsgX2ktLSkge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcChfaSk7XG5cbiAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5wbGFjZW1lbnQgIT09IGZpcnN0Rml0dGluZ1BsYWNlbWVudCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXAgPSB0cnVlO1xuICAgIHN0YXRlLnBsYWNlbWVudCA9IGZpcnN0Rml0dGluZ1BsYWNlbWVudDtcbiAgICBzdGF0ZS5yZXNldCA9IHRydWU7XG4gIH1cbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YToge1xuICAgIF9za2lwOiBmYWxzZVxuICB9XG59OyIsImltcG9ydCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCwgcHJldmVudGVkT2Zmc2V0cykge1xuICBpZiAocHJldmVudGVkT2Zmc2V0cyA9PT0gdm9pZCAwKSB7XG4gICAgcHJldmVudGVkT2Zmc2V0cyA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvdmVyZmxvdy50b3AgLSByZWN0LmhlaWdodCAtIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICByaWdodDogb3ZlcmZsb3cucmlnaHQgLSByZWN0LndpZHRoICsgcHJldmVudGVkT2Zmc2V0cy54LFxuICAgIGJvdHRvbTogb3ZlcmZsb3cuYm90dG9tIC0gcmVjdC5oZWlnaHQgKyBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgbGVmdDogb3ZlcmZsb3cubGVmdCAtIHJlY3Qud2lkdGggLSBwcmV2ZW50ZWRPZmZzZXRzLnhcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKGZ1bmN0aW9uIChzaWRlKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93W3NpZGVdID49IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoaWRlKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcbiAgdmFyIHJlZmVyZW5jZU92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgfSk7XG4gIHZhciBwb3BwZXJBbHRPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgfSk7XG4gIHZhciByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhyZWZlcmVuY2VPdmVyZmxvdywgcmVmZXJlbmNlUmVjdCk7XG4gIHZhciBwb3BwZXJFc2NhcGVPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocG9wcGVyQWx0T3ZlcmZsb3csIHBvcHBlclJlY3QsIHByZXZlbnRlZE9mZnNldHMpO1xuICB2YXIgaXNSZWZlcmVuY2VIaWRkZW4gPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzKTtcbiAgdmFyIGhhc1BvcHBlckVzY2FwZWQgPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocG9wcGVyRXNjYXBlT2Zmc2V0cyk7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzOiByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMsXG4gICAgcG9wcGVyRXNjYXBlT2Zmc2V0czogcG9wcGVyRXNjYXBlT2Zmc2V0cyxcbiAgICBpc1JlZmVyZW5jZUhpZGRlbjogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZDogaGFzUG9wcGVyRXNjYXBlZFxuICB9O1xuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXJlZmVyZW5jZS1oaWRkZW4nOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICAnZGF0YS1wb3BwZXItZXNjYXBlZCc6IGhhc1BvcHBlckVzY2FwZWRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdoaWRlJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXSxcbiAgZm46IGhpZGVcbn07IiwiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIHBsYWNlbWVudHMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCByZWN0cywgb2Zmc2V0KSB7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICB2YXIgaW52ZXJ0RGlzdGFuY2UgPSBbbGVmdCwgdG9wXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyAtMSA6IDE7XG5cbiAgdmFyIF9yZWYgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gb2Zmc2V0KE9iamVjdC5hc3NpZ24oe30sIHJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSkpIDogb2Zmc2V0LFxuICAgICAgc2tpZGRpbmcgPSBfcmVmWzBdLFxuICAgICAgZGlzdGFuY2UgPSBfcmVmWzFdO1xuXG4gIHNraWRkaW5nID0gc2tpZGRpbmcgfHwgMDtcbiAgZGlzdGFuY2UgPSAoZGlzdGFuY2UgfHwgMCkgKiBpbnZlcnREaXN0YW5jZTtcbiAgcmV0dXJuIFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8ge1xuICAgIHg6IGRpc3RhbmNlLFxuICAgIHk6IHNraWRkaW5nXG4gIH0gOiB7XG4gICAgeDogc2tpZGRpbmcsXG4gICAgeTogZGlzdGFuY2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZjIubmFtZTtcbiAgdmFyIF9vcHRpb25zJG9mZnNldCA9IG9wdGlvbnMub2Zmc2V0LFxuICAgICAgb2Zmc2V0ID0gX29wdGlvbnMkb2Zmc2V0ID09PSB2b2lkIDAgPyBbMCwgMF0gOiBfb3B0aW9ucyRvZmZzZXQ7XG4gIHZhciBkYXRhID0gcGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHN0YXRlLnJlY3RzLCBvZmZzZXQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgdmFyIF9kYXRhJHN0YXRlJHBsYWNlbWVudCA9IGRhdGFbc3RhdGUucGxhY2VtZW50XSxcbiAgICAgIHggPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueCxcbiAgICAgIHkgPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueCArPSB4O1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy55ICs9IHk7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ29mZnNldCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgZm46IG9mZnNldFxufTsiLCJpbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5cbmZ1bmN0aW9uIHBvcHBlck9mZnNldHMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgLy8gT2Zmc2V0cyBhcmUgdGhlIGFjdHVhbCBwb3NpdGlvbiB0aGUgcG9wcGVyIG5lZWRzIHRvIGhhdmUgdG8gYmVcbiAgLy8gcHJvcGVybHkgcG9zaXRpb25lZCBuZWFyIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHBsYWNlbWVudCwgYW5kIHdpbGwgYmUgYWRqdXN0ZWQgYnlcbiAgLy8gdGhlIG1vZGlmaWVycyBpbiB0aGUgbmV4dCBzdGVwXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiBzdGF0ZS5yZWN0cy5yZWZlcmVuY2UsXG4gICAgZWxlbWVudDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncG9wcGVyT2Zmc2V0cycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAncmVhZCcsXG4gIGZuOiBwb3BwZXJPZmZzZXRzLFxuICBkYXRhOiB7fVxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn0iLCJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHN0YXJ0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QWx0QXhpcyBmcm9tIFwiLi4vdXRpbHMvZ2V0QWx0QXhpcy5qc1wiO1xuaW1wb3J0IHsgd2l0aGluLCB3aXRoaW5NYXhDbGFtcCB9IGZyb20gXCIuLi91dGlscy93aXRoaW4uanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuLi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmltcG9ydCB7IG1pbiBhcyBtYXRoTWluLCBtYXggYXMgbWF0aE1heCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIHByZXZlbnRPdmVyZmxvdyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIF9vcHRpb25zJHRldGhlciA9IG9wdGlvbnMudGV0aGVyLFxuICAgICAgdGV0aGVyID0gX29wdGlvbnMkdGV0aGVyID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkdGV0aGVyLFxuICAgICAgX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID0gb3B0aW9ucy50ZXRoZXJPZmZzZXQsXG4gICAgICB0ZXRoZXJPZmZzZXQgPSBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQ7XG4gIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5XG4gIH0pO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgaXNCYXNlUGxhY2VtZW50ID0gIXZhcmlhdGlvbjtcbiAgdmFyIG1haW5BeGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgYWx0QXhpcyA9IGdldEFsdEF4aXMobWFpbkF4aXMpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgdGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gdGV0aGVyT2Zmc2V0KE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSkpIDogdGV0aGVyT2Zmc2V0O1xuICB2YXIgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldFZhbHVlID09PSAnbnVtYmVyJyA/IHtcbiAgICBtYWluQXhpczogdGV0aGVyT2Zmc2V0VmFsdWUsXG4gICAgYWx0QXhpczogdGV0aGVyT2Zmc2V0VmFsdWVcbiAgfSA6IE9iamVjdC5hc3NpZ24oe1xuICAgIG1haW5BeGlzOiAwLFxuICAgIGFsdEF4aXM6IDBcbiAgfSwgdGV0aGVyT2Zmc2V0VmFsdWUpO1xuICB2YXIgb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0ID8gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXRbc3RhdGUucGxhY2VtZW50XSA6IG51bGw7XG4gIHZhciBkYXRhID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmICghcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDtcblxuICAgIHZhciBtYWluU2lkZSA9IG1haW5BeGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICAgIHZhciBhbHRTaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICAgIHZhciBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgIHZhciBvZmZzZXQgPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXTtcbiAgICB2YXIgbWluID0gb2Zmc2V0ICsgb3ZlcmZsb3dbbWFpblNpZGVdO1xuICAgIHZhciBtYXggPSBvZmZzZXQgLSBvdmVyZmxvd1thbHRTaWRlXTtcbiAgICB2YXIgYWRkaXRpdmUgPSB0ZXRoZXIgPyAtcG9wcGVyUmVjdFtsZW5dIC8gMiA6IDA7XG4gICAgdmFyIG1pbkxlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gOiBwb3BwZXJSZWN0W2xlbl07XG4gICAgdmFyIG1heExlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyAtcG9wcGVyUmVjdFtsZW5dIDogLXJlZmVyZW5jZVJlY3RbbGVuXTsgLy8gV2UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcnJvdyBpbiB0aGUgY2FsY3VsYXRpb24gc28gdGhlIGFycm93IGRvZXNuJ3QgZ29cbiAgICAvLyBvdXRzaWRlIHRoZSByZWZlcmVuY2UgYm91bmRzXG5cbiAgICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gICAgdmFyIGFycm93UmVjdCA9IHRldGhlciAmJiBhcnJvd0VsZW1lbnQgPyBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCkgOiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gICAgdmFyIGFycm93UGFkZGluZ09iamVjdCA9IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXSA/IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXS5wYWRkaW5nIDogZ2V0RnJlc2hTaWRlT2JqZWN0KCk7XG4gICAgdmFyIGFycm93UGFkZGluZ01pbiA9IGFycm93UGFkZGluZ09iamVjdFttYWluU2lkZV07XG4gICAgdmFyIGFycm93UGFkZGluZ01heCA9IGFycm93UGFkZGluZ09iamVjdFthbHRTaWRlXTsgLy8gSWYgdGhlIHJlZmVyZW5jZSBsZW5ndGggaXMgc21hbGxlciB0aGFuIHRoZSBhcnJvdyBsZW5ndGgsIHdlIGRvbid0IHdhbnRcbiAgICAvLyB0byBpbmNsdWRlIGl0cyBmdWxsIHNpemUgaW4gdGhlIGNhbGN1bGF0aW9uLiBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsXG4gICAgLy8gYW5kIG5lYXIgdGhlIGVkZ2Ugb2YgYSBib3VuZGFyeSwgdGhlIHBvcHBlciBjYW4gb3ZlcmZsb3cgZXZlbiBpZiB0aGVcbiAgICAvLyByZWZlcmVuY2UgaXMgbm90IG92ZXJmbG93aW5nIGFzIHdlbGwgKGUuZy4gdmlydHVhbCBlbGVtZW50cyB3aXRoIG5vXG4gICAgLy8gd2lkdGggb3IgaGVpZ2h0KVxuXG4gICAgdmFyIGFycm93TGVuID0gd2l0aGluKDAsIHJlZmVyZW5jZVJlY3RbbGVuXSwgYXJyb3dSZWN0W2xlbl0pO1xuICAgIHZhciBtaW5PZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gLyAyIC0gYWRkaXRpdmUgLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1pbkxlbiAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBtYXhPZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyAtcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiArIGFkZGl0aXZlICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXMgOiBtYXhMZW4gKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcztcbiAgICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdyAmJiBnZXRPZmZzZXRQYXJlbnQoc3RhdGUuZWxlbWVudHMuYXJyb3cpO1xuICAgIHZhciBjbGllbnRPZmZzZXQgPSBhcnJvd09mZnNldFBhcmVudCA/IG1haW5BeGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRUb3AgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudExlZnQgfHwgMCA6IDA7XG4gICAgdmFyIG9mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogb2Zmc2V0TW9kaWZpZXJTdGF0ZVttYWluQXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgOiAwO1xuICAgIHZhciB0ZXRoZXJNaW4gPSBvZmZzZXQgKyBtaW5PZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlIC0gY2xpZW50T2Zmc2V0O1xuICAgIHZhciB0ZXRoZXJNYXggPSBvZmZzZXQgKyBtYXhPZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlO1xuICAgIHZhciBwcmV2ZW50ZWRPZmZzZXQgPSB3aXRoaW4odGV0aGVyID8gbWF0aE1pbihtaW4sIHRldGhlck1pbikgOiBtaW4sIG9mZnNldCwgdGV0aGVyID8gbWF0aE1heChtYXgsIHRldGhlck1heCkgOiBtYXgpO1xuICAgIHBvcHBlck9mZnNldHNbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0IC0gb2Zmc2V0O1xuICB9XG5cbiAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyO1xuXG4gICAgdmFyIF9tYWluU2lkZSA9IG1haW5BeGlzID09PSAneCcgPyB0b3AgOiBsZWZ0O1xuXG4gICAgdmFyIF9hbHRTaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IGJvdHRvbSA6IHJpZ2h0O1xuXG4gICAgdmFyIF9vZmZzZXQgPSBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdO1xuXG4gICAgdmFyIF9sZW4gPSBhbHRBeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICB2YXIgX21pbiA9IF9vZmZzZXQgKyBvdmVyZmxvd1tfbWFpblNpZGVdO1xuXG4gICAgdmFyIF9tYXggPSBfb2Zmc2V0IC0gb3ZlcmZsb3dbX2FsdFNpZGVdO1xuXG4gICAgdmFyIGlzT3JpZ2luU2lkZSA9IFt0b3AsIGxlZnRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuXG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclZhbHVlID0gKF9vZmZzZXRNb2RpZmllclN0YXRlJDIgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW2FsdEF4aXNdKSAhPSBudWxsID8gX29mZnNldE1vZGlmaWVyU3RhdGUkMiA6IDA7XG5cbiAgICB2YXIgX3RldGhlck1pbiA9IGlzT3JpZ2luU2lkZSA/IF9taW4gOiBfb2Zmc2V0IC0gcmVmZXJlbmNlUmVjdFtfbGVuXSAtIHBvcHBlclJlY3RbX2xlbl0gLSBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5hbHRBeGlzO1xuXG4gICAgdmFyIF90ZXRoZXJNYXggPSBpc09yaWdpblNpZGUgPyBfb2Zmc2V0ICsgcmVmZXJlbmNlUmVjdFtfbGVuXSArIHBvcHBlclJlY3RbX2xlbl0gLSBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5hbHRBeGlzIDogX21heDtcblxuICAgIHZhciBfcHJldmVudGVkT2Zmc2V0ID0gdGV0aGVyICYmIGlzT3JpZ2luU2lkZSA/IHdpdGhpbk1heENsYW1wKF90ZXRoZXJNaW4sIF9vZmZzZXQsIF90ZXRoZXJNYXgpIDogd2l0aGluKHRldGhlciA/IF90ZXRoZXJNaW4gOiBfbWluLCBfb2Zmc2V0LCB0ZXRoZXIgPyBfdGV0aGVyTWF4IDogX21heCk7XG5cbiAgICBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldCAtIF9vZmZzZXQ7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBwcmV2ZW50T3ZlcmZsb3csXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J11cbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0SFRNTEVsZW1lbnRTY3JvbGwoZWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wXG4gIH07XG59IiwiaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEhUTUxFbGVtZW50U2Nyb2xsIGZyb20gXCIuL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlU2Nyb2xsKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IGdldFdpbmRvdyhub2RlKSB8fCAhaXNIVE1MRWxlbWVudChub2RlKSkge1xuICAgIHJldHVybiBnZXRXaW5kb3dTY3JvbGwobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldEhUTUxFbGVtZW50U2Nyb2xsKG5vZGUpO1xuICB9XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXROb2RlU2Nyb2xsIGZyb20gXCIuL2dldE5vZGVTY3JvbGwuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50U2NhbGVkKGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gcm91bmQocmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE7XG4gIHZhciBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBlbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxO1xuICByZXR1cm4gc2NhbGVYICE9PSAxIHx8IHNjYWxlWSAhPT0gMTtcbn0gLy8gUmV0dXJucyB0aGUgY29tcG9zaXRlIHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LlxuLy8gQ29tcG9zaXRlIG1lYW5zIGl0IHRha2VzIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zIGFzIHdlbGwgYXMgbGF5b3V0LlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXBvc2l0ZVJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudCwgaXNGaXhlZCkge1xuICBpZiAoaXNGaXhlZCA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50SXNTY2FsZWQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgaXNFbGVtZW50U2NhbGVkKG9mZnNldFBhcmVudCk7XG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudElzU2NhbGVkLCBpc0ZpeGVkKTtcbiAgdmFyIHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICB2YXIgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEwNzhcbiAgICBpc1Njcm9sbFBhcmVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgb2Zmc2V0cyA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ICs9IG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ICs9IG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIG9mZnNldHMueCA9IGdldFdpbmRvd1Njcm9sbEJhclgoZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IHJlY3QubGVmdCArIHNjcm9sbC5zY3JvbGxMZWZ0IC0gb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QudG9wICsgc2Nyb2xsLnNjcm9sbFRvcCAtIG9mZnNldHMueSxcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gIH07XG59IiwiaW1wb3J0IHsgbW9kaWZpZXJQaGFzZXMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTg3NTI1NVxuXG5mdW5jdGlvbiBvcmRlcihtb2RpZmllcnMpIHtcbiAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgbWFwLnNldChtb2RpZmllci5uYW1lLCBtb2RpZmllcik7XG4gIH0pOyAvLyBPbiB2aXNpdGluZyBvYmplY3QsIGNoZWNrIGZvciBpdHMgZGVwZW5kZW5jaWVzIGFuZCB2aXNpdCB0aGVtIHJlY3Vyc2l2ZWx5XG5cbiAgZnVuY3Rpb24gc29ydChtb2RpZmllcikge1xuICAgIHZpc2l0ZWQuYWRkKG1vZGlmaWVyLm5hbWUpO1xuICAgIHZhciByZXF1aXJlcyA9IFtdLmNvbmNhdChtb2RpZmllci5yZXF1aXJlcyB8fCBbXSwgbW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cyB8fCBbXSk7XG4gICAgcmVxdWlyZXMuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgdmFyIGRlcE1vZGlmaWVyID0gbWFwLmdldChkZXApO1xuXG4gICAgICAgIGlmIChkZXBNb2RpZmllcikge1xuICAgICAgICAgIHNvcnQoZGVwTW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVzdWx0LnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKCF2aXNpdGVkLmhhcyhtb2RpZmllci5uYW1lKSkge1xuICAgICAgLy8gY2hlY2sgZm9yIHZpc2l0ZWQgb2JqZWN0XG4gICAgICBzb3J0KG1vZGlmaWVyKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvcmRlck1vZGlmaWVycyhtb2RpZmllcnMpIHtcbiAgLy8gb3JkZXIgYmFzZWQgb24gZGVwZW5kZW5jaWVzXG4gIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXIobW9kaWZpZXJzKTsgLy8gb3JkZXIgYmFzZWQgb24gcGhhc2VcblxuICByZXR1cm4gbW9kaWZpZXJQaGFzZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBoYXNlKSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQob3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICByZXR1cm4gbW9kaWZpZXIucGhhc2UgPT09IHBoYXNlO1xuICAgIH0pKTtcbiAgfSwgW10pO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlYm91bmNlKGZuKSB7XG4gIHZhciBwZW5kaW5nO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmVzb2x2ZShmbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUJ5TmFtZShtb2RpZmllcnMpIHtcbiAgdmFyIG1lcmdlZCA9IG1vZGlmaWVycy5yZWR1Y2UoZnVuY3Rpb24gKG1lcmdlZCwgY3VycmVudCkge1xuICAgIHZhciBleGlzdGluZyA9IG1lcmdlZFtjdXJyZW50Lm5hbWVdO1xuICAgIG1lcmdlZFtjdXJyZW50Lm5hbWVdID0gZXhpc3RpbmcgPyBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZywgY3VycmVudCwge1xuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3Rpbmcub3B0aW9ucywgY3VycmVudC5vcHRpb25zKSxcbiAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLmRhdGEsIGN1cnJlbnQuZGF0YSlcbiAgICB9KSA6IGN1cnJlbnQ7XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfSwge30pOyAvLyBJRTExIGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LnZhbHVlc1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXJnZWQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIG1lcmdlZFtrZXldO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0Q29tcG9zaXRlUmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcIi4vdXRpbHMvZGVib3VuY2UuanNcIjtcbmltcG9ydCBtZXJnZUJ5TmFtZSBmcm9tIFwiLi91dGlscy9tZXJnZUJ5TmFtZS5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3BwZXJHZW5lcmF0b3IoZ2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoZ2VuZXJhdG9yT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgZ2VuZXJhdG9yT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9nZW5lcmF0b3JPcHRpb25zID0gZ2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRNb2RpZmllcnMsXG4gICAgICBkZWZhdWx0TW9kaWZpZXJzID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmID09PSB2b2lkIDAgPyBbXSA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZixcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHRPcHRpb25zID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9PT0gdm9pZCAwID8gREVGQVVMVF9PUFRJT05TIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmMjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICAgICAgb3JkZXJlZE1vZGlmaWVyczogW10sXG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIGRlZmF1bHRPcHRpb25zKSxcbiAgICAgIG1vZGlmaWVyc0RhdGE6IHt9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcjogcG9wcGVyXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBzdHlsZXM6IHt9XG4gICAgfTtcbiAgICB2YXIgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzZXRPcHRpb25zQWN0aW9uID09PSAnZnVuY3Rpb24nID8gc2V0T3B0aW9uc0FjdGlvbihzdGF0ZS5vcHRpb25zKSA6IHNldE9wdGlvbnNBY3Rpb247XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBydW5Nb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIC8vIFN5bmMgdXBkYXRlIOKAkyBpdCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCwgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LiBUaGlzXG4gICAgICAvLyBpcyB1c2VmdWwgZm9yIGxvdyBmcmVxdWVuY3kgdXBkYXRlcyB3aGVyZSBzeW5jIGJlaGF2aW9yIHNpbXBsaWZpZXMgdGhlXG4gICAgICAvLyBsb2dpYy5cbiAgICAgIC8vIEZvciBoaWdoIGZyZXF1ZW5jeSB1cGRhdGVzIChlLmcuIGByZXNpemVgIGFuZCBgc2Nyb2xsYCBldmVudHMpLCBhbHdheXNcbiAgICAgIC8vIHByZWZlciB0aGUgYXN5bmMgUG9wcGVyI3VwZGF0ZSBtZXRob2RcbiAgICAgIGZvcmNlVXBkYXRlOiBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9zdGF0ZSRlbGVtZW50cyA9IHN0YXRlLmVsZW1lbnRzLFxuICAgICAgICAgICAgcmVmZXJlbmNlID0gX3N0YXRlJGVsZW1lbnRzLnJlZmVyZW5jZSxcbiAgICAgICAgICAgIHBvcHBlciA9IF9zdGF0ZSRlbGVtZW50cy5wb3BwZXI7IC8vIERvbid0IHByb2NlZWQgaWYgYHJlZmVyZW5jZWAgb3IgYHBvcHBlcmAgYXJlIG5vdCB2YWxpZCBlbGVtZW50c1xuICAgICAgICAvLyBhbnltb3JlXG5cbiAgICAgICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBpZiAoc3RhdGUucmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZSA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnNbaW5kZXhdLFxuICAgICAgICAgICAgICBmbiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5mbixcbiAgICAgICAgICAgICAgX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5vcHRpb25zLFxuICAgICAgICAgICAgICBfb3B0aW9ucyA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPT09IHZvaWQgMCA/IHt9IDogX3N0YXRlJG9yZGVyZWRNb2RpZmllMixcbiAgICAgICAgICAgICAgbmFtZSA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5uYW1lO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RhdGUgPSBmbih7XG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgICAgb3B0aW9uczogX29wdGlvbnMsXG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICAgICAgfSkgfHwgc3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gQXN5bmMgYW5kIG9wdGltaXN0aWNhbGx5IG9wdGltaXplZCB1cGRhdGUg4oCTIGl0IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmXG4gICAgICAvLyBub3QgbmVjZXNzYXJ5IChkZWJvdW5jZWQgdG8gcnVuIGF0IG1vc3Qgb25jZS1wZXItdGljaylcbiAgICAgIHVwZGF0ZTogZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zZXRPcHRpb25zKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAoIWlzRGVzdHJveWVkICYmIG9wdGlvbnMub25GaXJzdFVwZGF0ZSkge1xuICAgICAgICBvcHRpb25zLm9uRmlyc3RVcGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH0pOyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICAvLyB1cGRhdGUgY3ljbGUgcnVucy4gVGhleSB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSB1cGRhdGVcbiAgICAvLyBjeWNsZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIG1vZGlmaWVyIGFkZHMgc29tZSBwZXJzaXN0ZW50IGRhdGEgdGhhdFxuICAgIC8vIG90aGVyIG1vZGlmaWVycyBuZWVkIHRvIHVzZSwgYnV0IHRoZSBtb2RpZmllciBpcyBydW4gYWZ0ZXIgdGhlIGRlcGVuZGVudFxuICAgIC8vIG9uZS5cblxuICAgIGZ1bmN0aW9uIHJ1bk1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgICAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRvcHRpb25zLFxuICAgICAgICAgICAgZWZmZWN0ID0gX3JlZi5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCJpbXBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93IH0gZnJvbSBcIi4vY3JlYXRlUG9wcGVyLmpzXCI7XG5pbXBvcnQgZXZlbnRMaXN0ZW5lcnMgZnJvbSBcIi4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzXCI7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tIFwiLi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanNcIjtcbmltcG9ydCBhcHBseVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanNcIjtcbnZhciBkZWZhdWx0TW9kaWZpZXJzID0gW2V2ZW50TGlzdGVuZXJzLCBwb3BwZXJPZmZzZXRzLCBjb21wdXRlU3R5bGVzLCBhcHBseVN0eWxlc107XG52YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IGRlZmF1bHRNb2RpZmllcnNcbn0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZWZhdWx0TW9kaWZpZXJzLCBkZXRlY3RPdmVyZmxvdyB9OyIsImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xuaW1wb3J0IG9mZnNldCBmcm9tIFwiLi9tb2RpZmllcnMvb2Zmc2V0LmpzXCI7XG5pbXBvcnQgZmxpcCBmcm9tIFwiLi9tb2RpZmllcnMvZmxpcC5qc1wiO1xuaW1wb3J0IHByZXZlbnRPdmVyZmxvdyBmcm9tIFwiLi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgYXJyb3cgZnJvbSBcIi4vbW9kaWZpZXJzL2Fycm93LmpzXCI7XG5pbXBvcnQgaGlkZSBmcm9tIFwiLi9tb2RpZmllcnMvaGlkZS5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzLCBvZmZzZXQsIGZsaXAsIHByZXZlbnRPdmVyZmxvdywgYXJyb3csIGhpZGVdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGVmYXVsdE1vZGlmaWVycywgZGV0ZWN0T3ZlcmZsb3cgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IiwiLyohXG4gICogQm9vdHN0cmFwIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2RhdGEuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IGVsZW1lbnRNYXAgPSBuZXcgTWFwKCk7XG5jb25zdCBEYXRhID0ge1xuICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnRNYXAuc2V0KGVsZW1lbnQsIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7XG5cbiAgICAvLyBtYWtlIGl0IGNsZWFyIHdlIG9ubHkgd2FudCBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnRcbiAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgIGlmICghaW5zdGFuY2VNYXAuaGFzKGtleSkgJiYgaW5zdGFuY2VNYXAuc2l6ZSAhPT0gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKTtcbiAgfSxcbiAgZ2V0KGVsZW1lbnQsIGtleSkge1xuICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpLmdldChrZXkpIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICByZW1vdmUoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpO1xuICAgIGluc3RhbmNlTWFwLmRlbGV0ZShrZXkpO1xuXG4gICAgLy8gZnJlZSB1cCBlbGVtZW50IHJlZmVyZW5jZXMgaWYgdGhlcmUgYXJlIG5vIGluc3RhbmNlcyBsZWZ0IGZvciBhbiBlbGVtZW50XG4gICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgIGVsZW1lbnRNYXAuZGVsZXRlKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvaW5kZXguanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBNQVhfVUlEID0gMTAwMDAwMDtcbmNvbnN0IE1JTExJU0VDT05EU19NVUxUSVBMSUVSID0gMTAwMDtcbmNvbnN0IFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnO1xuXG4vKipcbiAqIFByb3Blcmx5IGVzY2FwZSBJRHMgc2VsZWN0b3JzIHRvIGhhbmRsZSB3ZWlyZCBJRHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcGFyc2VTZWxlY3RvciA9IHNlbGVjdG9yID0+IHtcbiAgaWYgKHNlbGVjdG9yICYmIHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5lc2NhcGUpIHtcbiAgICAvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yIG5lZWRzIGVzY2FwaW5nIHRvIGhhbmRsZSBJRHMgKGh0bWw1KykgY29udGFpbmluZyBmb3IgaW5zdGFuY2UgL1xuICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSgvIyhbXlxcc1wiIyddKykvZywgKG1hdGNoLCBpZCkgPT4gYCMke0NTUy5lc2NhcGUoaWQpfWApO1xuICB9XG4gIHJldHVybiBzZWxlY3Rvcjtcbn07XG5cbi8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuY29uc3QgdG9UeXBlID0gb2JqZWN0ID0+IHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgJHtvYmplY3R9YDtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKCk7XG59O1xuXG4vKipcbiAqIFB1YmxpYyBVdGlsIEFQSVxuICovXG5cbmNvbnN0IGdldFVJRCA9IHByZWZpeCA9PiB7XG4gIGRvIHtcbiAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7XG4gIH0gd2hpbGUgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZWZpeCkpO1xuICByZXR1cm4gcHJlZml4O1xufTtcbmNvbnN0IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgbGV0IHtcbiAgICB0cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgdHJhbnNpdGlvbkRlbGF5XG4gIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EZWxheSA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSk7XG5cbiAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICBpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uICYmICFmbG9hdFRyYW5zaXRpb25EZWxheSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gSWYgbXVsdGlwbGUgZHVyYXRpb25zIGFyZSBkZWZpbmVkLCB0YWtlIHRoZSBmaXJzdFxuICB0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXTtcbiAgdHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5LnNwbGl0KCcsJylbMF07XG4gIHJldHVybiAoTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKSArIE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSkpICogTUlMTElTRUNPTkRTX01VTFRJUExJRVI7XG59O1xuY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChUUkFOU0lUSU9OX0VORCkpO1xufTtcbmNvbnN0IGlzRWxlbWVudCA9IG9iamVjdCA9PiB7XG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2Ygb2JqZWN0LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbMF07XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgIT09ICd1bmRlZmluZWQnO1xufTtcbmNvbnN0IGdldEVsZW1lbnQgPSBvYmplY3QgPT4ge1xuICAvLyBpdCdzIGEgalF1ZXJ5IG9iamVjdCBvciBhIG5vZGUgZWxlbWVudFxuICBpZiAoaXNFbGVtZW50KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LmpxdWVyeSA/IG9iamVjdFswXSA6IG9iamVjdDtcbiAgfVxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJzZVNlbGVjdG9yKG9iamVjdCkpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbmNvbnN0IGlzVmlzaWJsZSA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWlzRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGVsZW1lbnRJc1Zpc2libGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ3Zpc2libGUnO1xuICAvLyBIYW5kbGUgYGRldGFpbHNgIGVsZW1lbnQgYXMgaXRzIGNvbnRlbnQgbWF5IGZhbHNpZSBhcHBlYXIgdmlzaWJsZSB3aGVuIGl0IGlzIGNsb3NlZFxuICBjb25zdCBjbG9zZWREZXRhaWxzID0gZWxlbWVudC5jbG9zZXN0KCdkZXRhaWxzOm5vdChbb3Blbl0pJyk7XG4gIGlmICghY2xvc2VkRGV0YWlscykge1xuICAgIHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xuICB9XG4gIGlmIChjbG9zZWREZXRhaWxzICE9PSBlbGVtZW50KSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpO1xuICAgIGlmIChzdW1tYXJ5ICYmIHN1bW1hcnkucGFyZW50Tm9kZSAhPT0gY2xvc2VkRGV0YWlscykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3VtbWFyeSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWxlbWVudElzVmlzaWJsZTtcbn07XG5jb25zdCBpc0Rpc2FibGVkID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCB8fCBlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgZWxlbWVudC5kaXNhYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZWxlbWVudC5kaXNhYmxlZDtcbiAgfVxuICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgIT09ICdmYWxzZSc7XG59O1xuY29uc3QgZmluZFNoYWRvd1Jvb3QgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcbiAgaWYgKHR5cGVvZiBlbGVtZW50LmdldFJvb3ROb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICByZXR1cm4gcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QgPyByb290IDogbnVsbDtcbiAgfVxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgZG9uJ3QgZmluZCBhIHNoYWRvdyByb290XG4gIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSk7XG59O1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG4vKipcbiAqIFRyaWNrIHRvIHJlc3RhcnQgYW4gZWxlbWVudCdzIGFuaW1hdGlvblxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4gdm9pZFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93d3cuY2hhcmlzdGhlby5pby9ibG9nLzIwMjEvMDIvcmVzdGFydC1hLWNzcy1hbmltYXRpb24td2l0aC1qYXZhc2NyaXB0LyNyZXN0YXJ0aW5nLWEtY3NzLWFuaW1hdGlvblxuICovXG5jb25zdCByZWZsb3cgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG59O1xuY29uc3QgZ2V0alF1ZXJ5ID0gKCkgPT4ge1xuICBpZiAod2luZG93LmpRdWVyeSAmJiAhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtYnMtbm8tanF1ZXJ5JykpIHtcbiAgICByZXR1cm4gd2luZG93LmpRdWVyeTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5jb25zdCBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzID0gW107XG5jb25zdCBvbkRPTUNvbnRlbnRMb2FkZWQgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAvLyBhZGQgbGlzdGVuZXIgb24gdGhlIGZpcnN0IGNhbGwgd2hlbiB0aGUgZG9jdW1lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZVxuICAgIGlmICghRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbn07XG5jb25zdCBpc1JUTCA9ICgpID0+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIgPT09ICdydGwnO1xuY29uc3QgZGVmaW5lSlF1ZXJ5UGx1Z2luID0gcGx1Z2luID0+IHtcbiAgb25ET01Db250ZW50TG9hZGVkKCgpID0+IHtcbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCQpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBwbHVnaW4uTkFNRTtcbiAgICAgIGNvbnN0IEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bbmFtZV07XG4gICAgICAkLmZuW25hbWVdID0gcGx1Z2luLmpRdWVyeUludGVyZmFjZTtcbiAgICAgICQuZm5bbmFtZV0uQ29uc3RydWN0b3IgPSBwbHVnaW47XG4gICAgICAkLmZuW25hbWVdLm5vQ29uZmxpY3QgPSAoKSA9PiB7XG4gICAgICAgICQuZm5bbmFtZV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICAgIHJldHVybiBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufTtcbmNvbnN0IGV4ZWN1dGUgPSAocG9zc2libGVDYWxsYmFjaywgYXJncyA9IFtdLCBkZWZhdWx0VmFsdWUgPSBwb3NzaWJsZUNhbGxiYWNrKSA9PiB7XG4gIHJldHVybiB0eXBlb2YgcG9zc2libGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IHBvc3NpYmxlQ2FsbGJhY2soLi4uYXJncykgOiBkZWZhdWx0VmFsdWU7XG59O1xuY29uc3QgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiA9IChjYWxsYmFjaywgdHJhbnNpdGlvbkVsZW1lbnQsIHdhaXRGb3JUcmFuc2l0aW9uID0gdHJ1ZSkgPT4ge1xuICBpZiAoIXdhaXRGb3JUcmFuc2l0aW9uKSB7XG4gICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGR1cmF0aW9uUGFkZGluZyA9IDU7XG4gIGNvbnN0IGVtdWxhdGVkRHVyYXRpb24gPSBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0cmFuc2l0aW9uRWxlbWVudCkgKyBkdXJhdGlvblBhZGRpbmc7XG4gIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgY29uc3QgaGFuZGxlciA9ICh7XG4gICAgdGFyZ2V0XG4gIH0pID0+IHtcbiAgICBpZiAodGFyZ2V0ICE9PSB0cmFuc2l0aW9uRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIHRyYW5zaXRpb25FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpO1xuICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICB9O1xuICB0cmFuc2l0aW9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKTtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgIHRyaWdnZXJUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25FbGVtZW50KTtcbiAgICB9XG4gIH0sIGVtdWxhdGVkRHVyYXRpb24pO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHByZXZpb3VzL25leHQgZWxlbWVudCBvZiBhIGxpc3QuXG4gKlxuICogQHBhcmFtIHthcnJheX0gbGlzdCAgICBUaGUgbGlzdCBvZiBlbGVtZW50c1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnQgICBUaGUgYWN0aXZlIGVsZW1lbnRcbiAqIEBwYXJhbSBzaG91bGRHZXROZXh0ICAgQ2hvb3NlIHRvIGdldCBuZXh0IG9yIHByZXZpb3VzIGVsZW1lbnRcbiAqIEBwYXJhbSBpc0N5Y2xlQWxsb3dlZFxuICogQHJldHVybiB7RWxlbWVudHxlbGVtfSBUaGUgcHJvcGVyIGVsZW1lbnRcbiAqL1xuY29uc3QgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQgPSAobGlzdCwgYWN0aXZlRWxlbWVudCwgc2hvdWxkR2V0TmV4dCwgaXNDeWNsZUFsbG93ZWQpID0+IHtcbiAgY29uc3QgbGlzdExlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBsZXQgaW5kZXggPSBsaXN0LmluZGV4T2YoYWN0aXZlRWxlbWVudCk7XG5cbiAgLy8gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGxpc3QgcmV0dXJuIGFuIGVsZW1lbnRcbiAgLy8gZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24gYW5kIGlmIGN5Y2xlIGlzIGFsbG93ZWRcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAhc2hvdWxkR2V0TmV4dCAmJiBpc0N5Y2xlQWxsb3dlZCA/IGxpc3RbbGlzdExlbmd0aCAtIDFdIDogbGlzdFswXTtcbiAgfVxuICBpbmRleCArPSBzaG91bGRHZXROZXh0ID8gMSA6IC0xO1xuICBpZiAoaXNDeWNsZUFsbG93ZWQpIHtcbiAgICBpbmRleCA9IChpbmRleCArIGxpc3RMZW5ndGgpICUgbGlzdExlbmd0aDtcbiAgfVxuICByZXR1cm4gbGlzdFtNYXRoLm1heCgwLCBNYXRoLm1pbihpbmRleCwgbGlzdExlbmd0aCAtIDEpKV07XG59O1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2V2ZW50LWhhbmRsZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgbmFtZXNwYWNlUmVnZXggPSAvW14uXSooPz1cXC4uKilcXC58LiovO1xuY29uc3Qgc3RyaXBOYW1lUmVnZXggPSAvXFwuLiovO1xuY29uc3Qgc3RyaXBVaWRSZWdleCA9IC86OlxcZCskLztcbmNvbnN0IGV2ZW50UmVnaXN0cnkgPSB7fTsgLy8gRXZlbnRzIHN0b3JhZ2VcbmxldCB1aWRFdmVudCA9IDE7XG5jb25zdCBjdXN0b21FdmVudHMgPSB7XG4gIG1vdXNlZW50ZXI6ICdtb3VzZW92ZXInLFxuICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG59O1xuY29uc3QgbmF0aXZlRXZlbnRzID0gbmV3IFNldChbJ2NsaWNrJywgJ2RibGNsaWNrJywgJ21vdXNldXAnLCAnbW91c2Vkb3duJywgJ2NvbnRleHRtZW51JywgJ21vdXNld2hlZWwnLCAnRE9NTW91c2VTY3JvbGwnLCAnbW91c2VvdmVyJywgJ21vdXNlb3V0JywgJ21vdXNlbW92ZScsICdzZWxlY3RzdGFydCcsICdzZWxlY3RlbmQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdvcmllbnRhdGlvbmNoYW5nZScsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCcsICd0b3VjaGNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVybW92ZScsICdwb2ludGVydXAnLCAncG9pbnRlcmxlYXZlJywgJ3BvaW50ZXJjYW5jZWwnLCAnZ2VzdHVyZXN0YXJ0JywgJ2dlc3R1cmVjaGFuZ2UnLCAnZ2VzdHVyZWVuZCcsICdmb2N1cycsICdibHVyJywgJ2NoYW5nZScsICdyZXNldCcsICdzZWxlY3QnLCAnc3VibWl0JywgJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnLCAnbG9hZCcsICd1bmxvYWQnLCAnYmVmb3JldW5sb2FkJywgJ3Jlc2l6ZScsICdtb3ZlJywgJ0RPTUNvbnRlbnRMb2FkZWQnLCAncmVhZHlzdGF0ZWNoYW5nZScsICdlcnJvcicsICdhYm9ydCcsICdzY3JvbGwnXSk7XG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RzXG4gKi9cblxuZnVuY3Rpb24gbWFrZUV2ZW50VWlkKGVsZW1lbnQsIHVpZCkge1xuICByZXR1cm4gdWlkICYmIGAke3VpZH06OiR7dWlkRXZlbnQrK31gIHx8IGVsZW1lbnQudWlkRXZlbnQgfHwgdWlkRXZlbnQrKztcbn1cbmZ1bmN0aW9uIGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCkge1xuICBjb25zdCB1aWQgPSBtYWtlRXZlbnRVaWQoZWxlbWVudCk7XG4gIGVsZW1lbnQudWlkRXZlbnQgPSB1aWQ7XG4gIGV2ZW50UmVnaXN0cnlbdWlkXSA9IGV2ZW50UmVnaXN0cnlbdWlkXSB8fCB7fTtcbiAgcmV0dXJuIGV2ZW50UmVnaXN0cnlbdWlkXTtcbn1cbmZ1bmN0aW9uIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICBoeWRyYXRlT2JqKGV2ZW50LCB7XG4gICAgICBkZWxlZ2F0ZVRhcmdldDogZWxlbWVudFxuICAgIH0pO1xuICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBmbik7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseShlbGVtZW50LCBbZXZlbnRdKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIHNlbGVjdG9yLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgIGNvbnN0IGRvbUVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICBmb3IgKGxldCB7XG4gICAgICB0YXJnZXRcbiAgICB9ID0gZXZlbnQ7IHRhcmdldCAmJiB0YXJnZXQgIT09IHRoaXM7IHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlKSB7XG4gICAgICBmb3IgKGNvbnN0IGRvbUVsZW1lbnQgb2YgZG9tRWxlbWVudHMpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT09IHRhcmdldCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGh5ZHJhdGVPYmooZXZlbnQsIHtcbiAgICAgICAgICBkZWxlZ2F0ZVRhcmdldDogdGFyZ2V0XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIHNlbGVjdG9yLCBmbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZmluZEhhbmRsZXIoZXZlbnRzLCBjYWxsYWJsZSwgZGVsZWdhdGlvblNlbGVjdG9yID0gbnVsbCkge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhldmVudHMpLmZpbmQoZXZlbnQgPT4gZXZlbnQuY2FsbGFibGUgPT09IGNhbGxhYmxlICYmIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvciA9PT0gZGVsZWdhdGlvblNlbGVjdG9yKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICBjb25zdCBpc0RlbGVnYXRlZCA9IHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJztcbiAgLy8gVE9ETzogdG9vbHRpcCBwYXNzZXMgYGZhbHNlYCBpbnN0ZWFkIG9mIHNlbGVjdG9yLCBzbyB3ZSBuZWVkIHRvIGNoZWNrXG4gIGNvbnN0IGNhbGxhYmxlID0gaXNEZWxlZ2F0ZWQgPyBkZWxlZ2F0aW9uRnVuY3Rpb24gOiBoYW5kbGVyIHx8IGRlbGVnYXRpb25GdW5jdGlvbjtcbiAgbGV0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChvcmlnaW5hbFR5cGVFdmVudCk7XG4gIGlmICghbmF0aXZlRXZlbnRzLmhhcyh0eXBlRXZlbnQpKSB7XG4gICAgdHlwZUV2ZW50ID0gb3JpZ2luYWxUeXBlRXZlbnQ7XG4gIH1cbiAgcmV0dXJuIFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF07XG59XG5mdW5jdGlvbiBhZGRIYW5kbGVyKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIG9uZU9mZikge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsVHlwZUV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbik7XG5cbiAgLy8gaW4gY2FzZSBvZiBtb3VzZWVudGVyIG9yIG1vdXNlbGVhdmUgd3JhcCB0aGUgaGFuZGxlciB3aXRoaW4gYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgaXRzIERPTSBwb3NpdGlvblxuICAvLyB0aGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0aGUgc2FtZSB3YXkgYXMgbW91c2VvdmVyIG9yIG1vdXNlb3V0IGRvZXNcbiAgaWYgKG9yaWdpbmFsVHlwZUV2ZW50IGluIGN1c3RvbUV2ZW50cykge1xuICAgIGNvbnN0IHdyYXBGdW5jdGlvbiA9IGZuID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudC5yZWxhdGVkVGFyZ2V0IHx8IGV2ZW50LnJlbGF0ZWRUYXJnZXQgIT09IGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmICFldmVudC5kZWxlZ2F0ZVRhcmdldC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGNhbGxhYmxlID0gd3JhcEZ1bmN0aW9uKGNhbGxhYmxlKTtcbiAgfVxuICBjb25zdCBldmVudHMgPSBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpO1xuICBjb25zdCBoYW5kbGVycyA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IChldmVudHNbdHlwZUV2ZW50XSA9IHt9KTtcbiAgY29uc3QgcHJldmlvdXNGdW5jdGlvbiA9IGZpbmRIYW5kbGVyKGhhbmRsZXJzLCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbCk7XG4gIGlmIChwcmV2aW91c0Z1bmN0aW9uKSB7XG4gICAgcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgPSBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiAmJiBvbmVPZmY7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChjYWxsYWJsZSwgb3JpZ2luYWxUeXBlRXZlbnQucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKTtcbiAgY29uc3QgZm4gPSBpc0RlbGVnYXRlZCA/IGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIGNhbGxhYmxlKSA6IGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgY2FsbGFibGUpO1xuICBmbi5kZWxlZ2F0aW9uU2VsZWN0b3IgPSBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsO1xuICBmbi5jYWxsYWJsZSA9IGNhbGxhYmxlO1xuICBmbi5vbmVPZmYgPSBvbmVPZmY7XG4gIGZuLnVpZEV2ZW50ID0gdWlkO1xuICBoYW5kbGVyc1t1aWRdID0gZm47XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBpc0RlbGVnYXRlZCk7XG59XG5mdW5jdGlvbiByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpIHtcbiAgY29uc3QgZm4gPSBmaW5kSGFuZGxlcihldmVudHNbdHlwZUV2ZW50XSwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgaWYgKCFmbikge1xuICAgIHJldHVybjtcbiAgfVxuICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZUV2ZW50LCBmbiwgQm9vbGVhbihkZWxlZ2F0aW9uU2VsZWN0b3IpKTtcbiAgZGVsZXRlIGV2ZW50c1t0eXBlRXZlbnRdW2ZuLnVpZEV2ZW50XTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgbmFtZXNwYWNlKSB7XG4gIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge307XG4gIGZvciAoY29uc3QgW2hhbmRsZXJLZXksIGV2ZW50XSBvZiBPYmplY3QuZW50cmllcyhzdG9yZUVsZW1lbnRFdmVudCkpIHtcbiAgICBpZiAoaGFuZGxlcktleS5pbmNsdWRlcyhuYW1lc3BhY2UpKSB7XG4gICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFR5cGVFdmVudChldmVudCkge1xuICAvLyBhbGxvdyB0byBnZXQgdGhlIG5hdGl2ZSBldmVudHMgZnJvbSBuYW1lc3BhY2VkIGV2ZW50cyAoJ2NsaWNrLmJzLmJ1dHRvbicgLS0+ICdjbGljaycpXG4gIGV2ZW50ID0gZXZlbnQucmVwbGFjZShzdHJpcE5hbWVSZWdleCwgJycpO1xuICByZXR1cm4gY3VzdG9tRXZlbnRzW2V2ZW50XSB8fCBldmVudDtcbn1cbmNvbnN0IEV2ZW50SGFuZGxlciA9IHtcbiAgb24oZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgZmFsc2UpO1xuICB9LFxuICBvbmUoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgdHJ1ZSk7XG4gIH0sXG4gIG9mZihlbGVtZW50LCBvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbik7XG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSB0eXBlRXZlbnQgIT09IG9yaWdpbmFsVHlwZUV2ZW50O1xuICAgIGNvbnN0IGV2ZW50cyA9IGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCk7XG4gICAgY29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fTtcbiAgICBjb25zdCBpc05hbWVzcGFjZSA9IG9yaWdpbmFsVHlwZUV2ZW50LnN0YXJ0c1dpdGgoJy4nKTtcbiAgICBpZiAodHlwZW9mIGNhbGxhYmxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2ltcGxlc3QgY2FzZTogaGFuZGxlciBpcyBwYXNzZWQsIHJlbW92ZSB0aGF0IGxpc3RlbmVyIE9OTFkuXG4gICAgICBpZiAoIU9iamVjdC5rZXlzKHN0b3JlRWxlbWVudEV2ZW50KS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNOYW1lc3BhY2UpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudEV2ZW50IG9mIE9iamVjdC5rZXlzKGV2ZW50cykpIHtcbiAgICAgICAgcmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzKGVsZW1lbnQsIGV2ZW50cywgZWxlbWVudEV2ZW50LCBvcmlnaW5hbFR5cGVFdmVudC5zbGljZSgxKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleUhhbmRsZXJzLCBldmVudF0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVFbGVtZW50RXZlbnQpKSB7XG4gICAgICBjb25zdCBoYW5kbGVyS2V5ID0ga2V5SGFuZGxlcnMucmVwbGFjZShzdHJpcFVpZFJlZ2V4LCAnJyk7XG4gICAgICBpZiAoIWluTmFtZXNwYWNlIHx8IG9yaWdpbmFsVHlwZUV2ZW50LmluY2x1ZGVzKGhhbmRsZXJLZXkpKSB7XG4gICAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50LmNhbGxhYmxlLCBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgdHJpZ2dlcihlbGVtZW50LCBldmVudCwgYXJncykge1xuICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgJCA9IGdldGpRdWVyeSgpO1xuICAgIGNvbnN0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChldmVudCk7XG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSBldmVudCAhPT0gdHlwZUV2ZW50O1xuICAgIGxldCBqUXVlcnlFdmVudCA9IG51bGw7XG4gICAgbGV0IGJ1YmJsZXMgPSB0cnVlO1xuICAgIGxldCBuYXRpdmVEaXNwYXRjaCA9IHRydWU7XG4gICAgbGV0IGRlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICBpZiAoaW5OYW1lc3BhY2UgJiYgJCkge1xuICAgICAgalF1ZXJ5RXZlbnQgPSAkLkV2ZW50KGV2ZW50LCBhcmdzKTtcbiAgICAgICQoZWxlbWVudCkudHJpZ2dlcihqUXVlcnlFdmVudCk7XG4gICAgICBidWJibGVzID0gIWpRdWVyeUV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7XG4gICAgICBuYXRpdmVEaXNwYXRjaCA9ICFqUXVlcnlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO1xuICAgICAgZGVmYXVsdFByZXZlbnRlZCA9IGpRdWVyeUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpO1xuICAgIH1cbiAgICBjb25zdCBldnQgPSBoeWRyYXRlT2JqKG5ldyBFdmVudChldmVudCwge1xuICAgICAgYnViYmxlcyxcbiAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICB9KSwgYXJncyk7XG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAobmF0aXZlRGlzcGF0Y2gpIHtcbiAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgIH1cbiAgICBpZiAoZXZ0LmRlZmF1bHRQcmV2ZW50ZWQgJiYgalF1ZXJ5RXZlbnQpIHtcbiAgICAgIGpRdWVyeUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIHJldHVybiBldnQ7XG4gIH1cbn07XG5mdW5jdGlvbiBoeWRyYXRlT2JqKG9iaiwgbWV0YSA9IHt9KSB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGEpKSB7XG4gICAgdHJ5IHtcbiAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfSBjYXRjaCAoX3VudXNlZCkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vbWFuaXB1bGF0b3IuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVEYXRhKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gTnVtYmVyKHZhbHVlKS50b1N0cmluZygpKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gIH1cbiAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ251bGwnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcbiAgfSBjYXRjaCAoX3VudXNlZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YUtleShrZXkpIHtcbiAgcmV0dXJuIGtleS5yZXBsYWNlKC9bQS1aXS9nLCBjaHIgPT4gYC0ke2Noci50b0xvd2VyQ2FzZSgpfWApO1xufVxuY29uc3QgTWFuaXB1bGF0b3IgPSB7XG4gIHNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5LCB2YWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWAsIHZhbHVlKTtcbiAgfSxcbiAgcmVtb3ZlRGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKTtcbiAgfSxcbiAgZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgY29uc3QgYnNLZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudC5kYXRhc2V0KS5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKCdicycpICYmICFrZXkuc3RhcnRzV2l0aCgnYnNDb25maWcnKSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgYnNLZXlzKSB7XG4gICAgICBsZXQgcHVyZUtleSA9IGtleS5yZXBsYWNlKC9eYnMvLCAnJyk7XG4gICAgICBwdXJlS2V5ID0gcHVyZUtleS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHB1cmVLZXkuc2xpY2UoMSwgcHVyZUtleS5sZW5ndGgpO1xuICAgICAgYXR0cmlidXRlc1twdXJlS2V5XSA9IG5vcm1hbGl6ZURhdGEoZWxlbWVudC5kYXRhc2V0W2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgfSxcbiAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRGF0YShlbGVtZW50LmdldEF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKSk7XG4gIH1cbn07XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2NvbmZpZy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ29uZmlnIHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUgc3RhdGljIG1ldGhvZCBcIk5BTUVcIiwgZm9yIGVhY2ggY29tcG9uZW50IScpO1xuICB9XG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnKTtcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZyk7XG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIF9tZXJnZUNvbmZpZ09iaihjb25maWcsIGVsZW1lbnQpIHtcbiAgICBjb25zdCBqc29uQ29uZmlnID0gaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCAnY29uZmlnJykgOiB7fTsgLy8gdHJ5IHRvIHBhcnNlXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LFxuICAgICAgLi4uKHR5cGVvZiBqc29uQ29uZmlnID09PSAnb2JqZWN0JyA/IGpzb25Db25maWcgOiB7fSksXG4gICAgICAuLi4oaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkgOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiB7fSlcbiAgICB9O1xuICB9XG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnLCBjb25maWdUeXBlcyA9IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpIHtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgZXhwZWN0ZWRUeXBlc10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnVHlwZXMpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV07XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSBpc0VsZW1lbnQodmFsdWUpID8gJ2VsZW1lbnQnIDogdG9UeXBlKHZhbHVlKTtcbiAgICAgIGlmICghbmV3IFJlZ0V4cChleHBlY3RlZFR5cGVzKS50ZXN0KHZhbHVlVHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcIiR7cHJvcGVydHl9XCIgcHJvdmlkZWQgdHlwZSBcIiR7dmFsdWVUeXBlfVwiIGJ1dCBleHBlY3RlZCB0eXBlIFwiJHtleHBlY3RlZFR5cGVzfVwiLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYmFzZS1jb21wb25lbnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgVkVSU0lPTiA9ICc1LjMuMyc7XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJhc2VDb21wb25lbnQgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIGVsZW1lbnQgPSBnZXRFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICBEYXRhLnNldCh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZLCB0aGlzKTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBkaXNwb3NlKCkge1xuICAgIERhdGEucmVtb3ZlKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpO1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG4gICAgICB0aGlzW3Byb3BlcnR5TmFtZV0gPSBudWxsO1xuICAgIH1cbiAgfVxuICBfcXVldWVDYWxsYmFjayhjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZCA9IHRydWUpIHtcbiAgICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkKTtcbiAgfVxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgdGhpcy5fZWxlbWVudCk7XG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpO1xuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGdldEluc3RhbmNlKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gRGF0YS5nZXQoZ2V0RWxlbWVudChlbGVtZW50KSwgdGhpcy5EQVRBX0tFWSk7XG4gIH1cbiAgc3RhdGljIGdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJbnN0YW5jZShlbGVtZW50KSB8fCBuZXcgdGhpcyhlbGVtZW50LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGwpO1xuICB9XG4gIHN0YXRpYyBnZXQgVkVSU0lPTigpIHtcbiAgICByZXR1cm4gVkVSU0lPTjtcbiAgfVxuICBzdGF0aWMgZ2V0IERBVEFfS0VZKCkge1xuICAgIHJldHVybiBgYnMuJHt0aGlzLk5BTUV9YDtcbiAgfVxuICBzdGF0aWMgZ2V0IEVWRU5UX0tFWSgpIHtcbiAgICByZXR1cm4gYC4ke3RoaXMuREFUQV9LRVl9YDtcbiAgfVxuICBzdGF0aWMgZXZlbnROYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ke3RoaXMuRVZFTlRfS0VZfWA7XG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9zZWxlY3Rvci1lbmdpbmUuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBnZXRTZWxlY3RvciA9IGVsZW1lbnQgPT4ge1xuICBsZXQgc2VsZWN0b3IgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy10YXJnZXQnKTtcbiAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgbGV0IGhyZWZBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgLy8gVGhlIG9ubHkgdmFsaWQgY29udGVudCB0aGF0IGNvdWxkIGRvdWJsZSBhcyBhIHNlbGVjdG9yIGFyZSBJRHMgb3IgY2xhc3NlcyxcbiAgICAvLyBzbyBldmVyeXRoaW5nIHN0YXJ0aW5nIHdpdGggYCNgIG9yIGAuYC4gSWYgYSBcInJlYWxcIiBVUkwgaXMgdXNlZCBhcyB0aGUgc2VsZWN0b3IsXG4gICAgLy8gYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgIHdpbGwgcmlnaHRmdWxseSBjb21wbGFpbiBpdCBpcyBpbnZhbGlkLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzMyMjczXG4gICAgaWYgKCFocmVmQXR0cmlidXRlIHx8ICFocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBKdXN0IGluIGNhc2Ugc29tZSBDTVMgcHV0cyBvdXQgYSBmdWxsIFVSTCB3aXRoIHRoZSBhbmNob3IgYXBwZW5kZWRcbiAgICBpZiAoaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgaHJlZkF0dHJpYnV0ZSA9IGAjJHtocmVmQXR0cmlidXRlLnNwbGl0KCcjJylbMV19YDtcbiAgICB9XG4gICAgc2VsZWN0b3IgPSBocmVmQXR0cmlidXRlICYmIGhyZWZBdHRyaWJ1dGUgIT09ICcjJyA/IGhyZWZBdHRyaWJ1dGUudHJpbSgpIDogbnVsbDtcbiAgfVxuICByZXR1cm4gc2VsZWN0b3IgPyBzZWxlY3Rvci5zcGxpdCgnLCcpLm1hcChzZWwgPT4gcGFyc2VTZWxlY3RvcihzZWwpKS5qb2luKCcsJykgOiBudWxsO1xufTtcbmNvbnN0IFNlbGVjdG9yRW5naW5lID0ge1xuICBmaW5kKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKTtcbiAgfSxcbiAgZmluZE9uZShzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgIHJldHVybiBFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICB9LFxuICBjaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBbXS5jb25jYXQoLi4uZWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGNoaWxkID0+IGNoaWxkLm1hdGNoZXMoc2VsZWN0b3IpKTtcbiAgfSxcbiAgcGFyZW50cyhlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcbiAgICBsZXQgYW5jZXN0b3IgPSBlbGVtZW50LnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgd2hpbGUgKGFuY2VzdG9yKSB7XG4gICAgICBwYXJlbnRzLnB1c2goYW5jZXN0b3IpO1xuICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlLmNsb3Nlc3Qoc2VsZWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50cztcbiAgfSxcbiAgcHJldihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGxldCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICB3aGlsZSAocHJldmlvdXMpIHtcbiAgICAgIGlmIChwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICByZXR1cm4gW3ByZXZpb3VzXTtcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzID0gcHJldmlvdXMucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9LFxuICAvLyBUT0RPOiB0aGlzIGlzIG5vdyB1bnVzZWQ7IHJlbW92ZSBsYXRlciBhbG9uZyB3aXRoIHByZXYoKVxuICBuZXh0KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IG5leHQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICB3aGlsZSAobmV4dCkge1xuICAgICAgaWYgKG5leHQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIFtuZXh0XTtcbiAgICAgIH1cbiAgICAgIG5leHQgPSBuZXh0Lm5leHRFbGVtZW50U2libGluZztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9LFxuICBmb2N1c2FibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgY29uc3QgZm9jdXNhYmxlcyA9IFsnYScsICdidXR0b24nLCAnaW5wdXQnLCAndGV4dGFyZWEnLCAnc2VsZWN0JywgJ2RldGFpbHMnLCAnW3RhYmluZGV4XScsICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSddLm1hcChzZWxlY3RvciA9PiBgJHtzZWxlY3Rvcn06bm90KFt0YWJpbmRleF49XCItXCJdKWApLmpvaW4oJywnKTtcbiAgICByZXR1cm4gdGhpcy5maW5kKGZvY3VzYWJsZXMsIGVsZW1lbnQpLmZpbHRlcihlbCA9PiAhaXNEaXNhYmxlZChlbCkgJiYgaXNWaXNpYmxlKGVsKSk7XG4gIH0sXG4gIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudCk7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICBnZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpO1xuICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IpIDogbnVsbDtcbiAgfSxcbiAgZ2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3RvcihlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICByZXR1cm4gc2VsZWN0b3IgPyBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKSA6IFtdO1xuICB9XG59O1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY29uc3QgZW5hYmxlRGlzbWlzc1RyaWdnZXIgPSAoY29tcG9uZW50LCBtZXRob2QgPSAnaGlkZScpID0+IHtcbiAgY29uc3QgY2xpY2tFdmVudCA9IGBjbGljay5kaXNtaXNzJHtjb21wb25lbnQuRVZFTlRfS0VZfWA7XG4gIGNvbnN0IG5hbWUgPSBjb21wb25lbnQuTkFNRTtcbiAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBjbGlja0V2ZW50LCBgW2RhdGEtYnMtZGlzbWlzcz1cIiR7bmFtZX1cIl1gLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpIHx8IHRoaXMuY2xvc2VzdChgLiR7bmFtZX1gKTtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG5cbiAgICAvLyBNZXRob2QgYXJndW1lbnQgaXMgbGVmdCwgZm9yIEFsZXJ0IGFuZCBvbmx5LCBhcyBpdCBkb2Vzbid0IGltcGxlbWVudCB0aGUgJ2hpZGUnIG1ldGhvZFxuICAgIGluc3RhbmNlW21ldGhvZF0oKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYWxlcnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSRmID0gJ2FsZXJ0JztcbmNvbnN0IERBVEFfS0VZJGEgPSAnYnMuYWxlcnQnO1xuY29uc3QgRVZFTlRfS0VZJGIgPSBgLiR7REFUQV9LRVkkYX1gO1xuY29uc3QgRVZFTlRfQ0xPU0UgPSBgY2xvc2Uke0VWRU5UX0tFWSRifWA7XG5jb25zdCBFVkVOVF9DTE9TRUQgPSBgY2xvc2VkJHtFVkVOVF9LRVkkYn1gO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDUgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckOCA9ICdzaG93JztcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQWxlcnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkZjtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBjbG9zZSgpIHtcbiAgICBjb25zdCBjbG9zZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xPU0UpO1xuICAgIGlmIChjbG9zZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ4KTtcbiAgICBjb25zdCBpc0FuaW1hdGVkID0gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDUpO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5fZGVzdHJveUVsZW1lbnQoKSwgdGhpcy5fZWxlbWVudCwgaXNBbmltYXRlZCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9kZXN0cm95RWxlbWVudCgpIHtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0NMT1NFRCk7XG4gICAgdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBBbGVydC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihBbGVydCwgJ2Nsb3NlJyk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKEFsZXJ0KTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGJ1dHRvbi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGUgPSAnYnV0dG9uJztcbmNvbnN0IERBVEFfS0VZJDkgPSAnYnMuYnV0dG9uJztcbmNvbnN0IEVWRU5UX0tFWSRhID0gYC4ke0RBVEFfS0VZJDl9YDtcbmNvbnN0IERBVEFfQVBJX0tFWSQ2ID0gJy5kYXRhLWFwaSc7XG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSQzID0gJ2FjdGl2ZSc7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ1ID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImJ1dHRvblwiXSc7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQ2ID0gYGNsaWNrJHtFVkVOVF9LRVkkYX0ke0RBVEFfQVBJX0tFWSQ2fWA7XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJ1dHRvbiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRlO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICAvLyBUb2dnbGUgY2xhc3MgYW5kIHN5bmMgdGhlIGBhcmlhLXByZXNzZWRgIGF0dHJpYnV0ZSB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGAudG9nZ2xlKClgIG1ldGhvZFxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9BQ1RJVkUkMykpO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQnV0dG9uLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcyk7XG4gICAgICBpZiAoY29uZmlnID09PSAndG9nZ2xlJykge1xuICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQ2LCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ1LCBldmVudCA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGNvbnN0IGJ1dHRvbiA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KFNFTEVDVE9SX0RBVEFfVE9HR0xFJDUpO1xuICBjb25zdCBkYXRhID0gQnV0dG9uLmdldE9yQ3JlYXRlSW5zdGFuY2UoYnV0dG9uKTtcbiAgZGF0YS50b2dnbGUoKTtcbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihCdXR0b24pO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zd2lwZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGQgPSAnc3dpcGUnO1xuY29uc3QgRVZFTlRfS0VZJDkgPSAnLmJzLnN3aXBlJztcbmNvbnN0IEVWRU5UX1RPVUNIU1RBUlQgPSBgdG91Y2hzdGFydCR7RVZFTlRfS0VZJDl9YDtcbmNvbnN0IEVWRU5UX1RPVUNITU9WRSA9IGB0b3VjaG1vdmUke0VWRU5UX0tFWSQ5fWA7XG5jb25zdCBFVkVOVF9UT1VDSEVORCA9IGB0b3VjaGVuZCR7RVZFTlRfS0VZJDl9YDtcbmNvbnN0IEVWRU5UX1BPSU5URVJET1dOID0gYHBvaW50ZXJkb3duJHtFVkVOVF9LRVkkOX1gO1xuY29uc3QgRVZFTlRfUE9JTlRFUlVQID0gYHBvaW50ZXJ1cCR7RVZFTlRfS0VZJDl9YDtcbmNvbnN0IFBPSU5URVJfVFlQRV9UT1VDSCA9ICd0b3VjaCc7XG5jb25zdCBQT0lOVEVSX1RZUEVfUEVOID0gJ3Blbic7XG5jb25zdCBDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQgPSAncG9pbnRlci1ldmVudCc7XG5jb25zdCBTV0lQRV9USFJFU0hPTEQgPSA0MDtcbmNvbnN0IERlZmF1bHQkYyA9IHtcbiAgZW5kQ2FsbGJhY2s6IG51bGwsXG4gIGxlZnRDYWxsYmFjazogbnVsbCxcbiAgcmlnaHRDYWxsYmFjazogbnVsbFxufTtcbmNvbnN0IERlZmF1bHRUeXBlJGMgPSB7XG4gIGVuZENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgbGVmdENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgcmlnaHRDYWxsYmFjazogJyhmdW5jdGlvbnxudWxsKSdcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFN3aXBlIGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICBpZiAoIWVsZW1lbnQgfHwgIVN3aXBlLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgdGhpcy5fZGVsdGFYID0gMDtcbiAgICB0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cyA9IEJvb2xlYW4od2luZG93LlBvaW50ZXJFdmVudCk7XG4gICAgdGhpcy5faW5pdEV2ZW50cygpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkYztcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSRjO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRkO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIGRpc3Bvc2UoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVkkOSk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9zdGFydChldmVudCkge1xuICAgIGlmICghdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC5jbGllbnRYO1xuICAgIH1cbiAgfVxuICBfZW5kKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5fZGVsdGFYO1xuICAgIH1cbiAgICB0aGlzLl9oYW5kbGVTd2lwZSgpO1xuICAgIGV4ZWN1dGUodGhpcy5fY29uZmlnLmVuZENhbGxiYWNrKTtcbiAgfVxuICBfbW92ZShldmVudCkge1xuICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPiAxID8gMCA6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX2RlbHRhWDtcbiAgfVxuICBfaGFuZGxlU3dpcGUoKSB7XG4gICAgY29uc3QgYWJzRGVsdGFYID0gTWF0aC5hYnModGhpcy5fZGVsdGFYKTtcbiAgICBpZiAoYWJzRGVsdGFYIDw9IFNXSVBFX1RIUkVTSE9MRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBhYnNEZWx0YVggLyB0aGlzLl9kZWx0YVg7XG4gICAgdGhpcy5fZGVsdGFYID0gMDtcbiAgICBpZiAoIWRpcmVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBleGVjdXRlKGRpcmVjdGlvbiA+IDAgPyB0aGlzLl9jb25maWcucmlnaHRDYWxsYmFjayA6IHRoaXMuX2NvbmZpZy5sZWZ0Q2FsbGJhY2spO1xuICB9XG4gIF9pbml0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJET1dOLCBldmVudCA9PiB0aGlzLl9zdGFydChldmVudCkpO1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJVUCwgZXZlbnQgPT4gdGhpcy5fZW5kKGV2ZW50KSk7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9QT0lOVEVSX0VWRU5UKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNIU1RBUlQsIGV2ZW50ID0+IHRoaXMuX3N0YXJ0KGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hNT1ZFLCBldmVudCA9PiB0aGlzLl9tb3ZlKGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hFTkQsIGV2ZW50ID0+IHRoaXMuX2VuZChldmVudCkpO1xuICAgIH1cbiAgfVxuICBfZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkge1xuICAgIHJldHVybiB0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cyAmJiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9QRU4gfHwgZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9UT1VDSCk7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMDtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgY2Fyb3VzZWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSRjID0gJ2Nhcm91c2VsJztcbmNvbnN0IERBVEFfS0VZJDggPSAnYnMuY2Fyb3VzZWwnO1xuY29uc3QgRVZFTlRfS0VZJDggPSBgLiR7REFUQV9LRVkkOH1gO1xuY29uc3QgREFUQV9BUElfS0VZJDUgPSAnLmRhdGEtYXBpJztcbmNvbnN0IEFSUk9XX0xFRlRfS0VZJDEgPSAnQXJyb3dMZWZ0JztcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSQxID0gJ0Fycm93UmlnaHQnO1xuY29uc3QgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCA9IDUwMDsgLy8gVGltZSBmb3IgbW91c2UgY29tcGF0IGV2ZW50cyB0byBmaXJlIGFmdGVyIHRvdWNoXG5cbmNvbnN0IE9SREVSX05FWFQgPSAnbmV4dCc7XG5jb25zdCBPUkRFUl9QUkVWID0gJ3ByZXYnO1xuY29uc3QgRElSRUNUSU9OX0xFRlQgPSAnbGVmdCc7XG5jb25zdCBESVJFQ1RJT05fUklHSFQgPSAncmlnaHQnO1xuY29uc3QgRVZFTlRfU0xJREUgPSBgc2xpZGUke0VWRU5UX0tFWSQ4fWA7XG5jb25zdCBFVkVOVF9TTElEID0gYHNsaWQke0VWRU5UX0tFWSQ4fWA7XG5jb25zdCBFVkVOVF9LRVlET1dOJDEgPSBga2V5ZG93biR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX01PVVNFRU5URVIkMSA9IGBtb3VzZWVudGVyJHtFVkVOVF9LRVkkOH1gO1xuY29uc3QgRVZFTlRfTU9VU0VMRUFWRSQxID0gYG1vdXNlbGVhdmUke0VWRU5UX0tFWSQ4fWA7XG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gYGRyYWdzdGFydCR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkkMyA9IGBsb2FkJHtFVkVOVF9LRVkkOH0ke0RBVEFfQVBJX0tFWSQ1fWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQ1ID0gYGNsaWNrJHtFVkVOVF9LRVkkOH0ke0RBVEFfQVBJX0tFWSQ1fWA7XG5jb25zdCBDTEFTU19OQU1FX0NBUk9VU0VMID0gJ2Nhcm91c2VsJztcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFJDIgPSAnYWN0aXZlJztcbmNvbnN0IENMQVNTX05BTUVfU0xJREUgPSAnc2xpZGUnO1xuY29uc3QgQ0xBU1NfTkFNRV9FTkQgPSAnY2Fyb3VzZWwtaXRlbS1lbmQnO1xuY29uc3QgQ0xBU1NfTkFNRV9TVEFSVCA9ICdjYXJvdXNlbC1pdGVtLXN0YXJ0JztcbmNvbnN0IENMQVNTX05BTUVfTkVYVCA9ICdjYXJvdXNlbC1pdGVtLW5leHQnO1xuY29uc3QgQ0xBU1NfTkFNRV9QUkVWID0gJ2Nhcm91c2VsLWl0ZW0tcHJldic7XG5jb25zdCBTRUxFQ1RPUl9BQ1RJVkUgPSAnLmFjdGl2ZSc7XG5jb25zdCBTRUxFQ1RPUl9JVEVNID0gJy5jYXJvdXNlbC1pdGVtJztcbmNvbnN0IFNFTEVDVE9SX0FDVElWRV9JVEVNID0gU0VMRUNUT1JfQUNUSVZFICsgU0VMRUNUT1JfSVRFTTtcbmNvbnN0IFNFTEVDVE9SX0lURU1fSU1HID0gJy5jYXJvdXNlbC1pdGVtIGltZyc7XG5jb25zdCBTRUxFQ1RPUl9JTkRJQ0FUT1JTID0gJy5jYXJvdXNlbC1pbmRpY2F0b3JzJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU0xJREUgPSAnW2RhdGEtYnMtc2xpZGVdLCBbZGF0YS1icy1zbGlkZS10b10nO1xuY29uc3QgU0VMRUNUT1JfREFUQV9SSURFID0gJ1tkYXRhLWJzLXJpZGU9XCJjYXJvdXNlbFwiXSc7XG5jb25zdCBLRVlfVE9fRElSRUNUSU9OID0ge1xuICBbQVJST1dfTEVGVF9LRVkkMV06IERJUkVDVElPTl9SSUdIVCxcbiAgW0FSUk9XX1JJR0hUX0tFWSQxXTogRElSRUNUSU9OX0xFRlRcbn07XG5jb25zdCBEZWZhdWx0JGIgPSB7XG4gIGludGVydmFsOiA1MDAwLFxuICBrZXlib2FyZDogdHJ1ZSxcbiAgcGF1c2U6ICdob3ZlcicsXG4gIHJpZGU6IGZhbHNlLFxuICB0b3VjaDogdHJ1ZSxcbiAgd3JhcDogdHJ1ZVxufTtcbmNvbnN0IERlZmF1bHRUeXBlJGIgPSB7XG4gIGludGVydmFsOiAnKG51bWJlcnxib29sZWFuKScsXG4gIC8vIFRPRE86djYgcmVtb3ZlIGJvb2xlYW4gc3VwcG9ydFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBwYXVzZTogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICByaWRlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIHRvdWNoOiAnYm9vbGVhbicsXG4gIHdyYXA6ICdib29sZWFuJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ2Fyb3VzZWwgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50b3VjaFRpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuX3N3aXBlSGVscGVyID0gbnVsbDtcbiAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ESUNBVE9SUywgdGhpcy5fZWxlbWVudCk7XG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICBpZiAodGhpcy5fY29uZmlnLnJpZGUgPT09IENMQVNTX05BTUVfQ0FST1VTRUwpIHtcbiAgICAgIHRoaXMuY3ljbGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCRiO1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJGI7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJGM7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgbmV4dCgpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9ORVhUKTtcbiAgfVxuICBuZXh0V2hlblZpc2libGUoKSB7XG4gICAgLy8gRklYTUUgVE9ETyB1c2UgYGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZWBcbiAgICAvLyBEb24ndCBjYWxsIG5leHQgd2hlbiB0aGUgcGFnZSBpc24ndCB2aXNpYmxlXG4gICAgLy8gb3IgdGhlIGNhcm91c2VsIG9yIGl0cyBwYXJlbnQgaXNuJ3QgdmlzaWJsZVxuICAgIGlmICghZG9jdW1lbnQuaGlkZGVuICYmIGlzVmlzaWJsZSh0aGlzLl9lbGVtZW50KSkge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICB9XG4gIHByZXYoKSB7XG4gICAgdGhpcy5fc2xpZGUoT1JERVJfUFJFVik7XG4gIH1cbiAgcGF1c2UoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodGhpcy5fZWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwoKTtcbiAgfVxuICBjeWNsZSgpIHtcbiAgICB0aGlzLl9jbGVhckludGVydmFsKCk7XG4gICAgdGhpcy5fdXBkYXRlSW50ZXJ2YWwoKTtcbiAgICB0aGlzLl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHRoaXMubmV4dFdoZW5WaXNpYmxlKCksIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCk7XG4gIH1cbiAgX21heWJlRW5hYmxlQ3ljbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucmlkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NMSUQsICgpID0+IHRoaXMuY3ljbGUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3ljbGUoKTtcbiAgfVxuICB0byhpbmRleCkge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXMoKTtcbiAgICBpZiAoaW5kZXggPiBpdGVtcy5sZW5ndGggLSAxIHx8IGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NMSUQsICgpID0+IHRoaXMudG8oaW5kZXgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgodGhpcy5fZ2V0QWN0aXZlKCkpO1xuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3JkZXIgPSBpbmRleCA+IGFjdGl2ZUluZGV4ID8gT1JERVJfTkVYVCA6IE9SREVSX1BSRVY7XG4gICAgdGhpcy5fc2xpZGUob3JkZXIsIGl0ZW1zW2luZGV4XSk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fc3dpcGVIZWxwZXIpIHtcbiAgICAgIHRoaXMuX3N3aXBlSGVscGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICBjb25maWcuZGVmYXVsdEludGVydmFsID0gY29uZmlnLmludGVydmFsO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOJDEsIGV2ZW50ID0+IHRoaXMuX2tleWRvd24oZXZlbnQpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRU5URVIkMSwgKCkgPT4gdGhpcy5wYXVzZSgpKTtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRUxFQVZFJDEsICgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb25maWcudG91Y2ggJiYgU3dpcGUuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgdGhpcy5fYWRkVG91Y2hFdmVudExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuICBfYWRkVG91Y2hFdmVudExpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU1fSU1HLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKGltZywgRVZFTlRfRFJBR19TVEFSVCwgZXZlbnQgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSk7XG4gICAgfVxuICAgIGNvbnN0IGVuZENhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSAhPT0gJ2hvdmVyJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgIC8vIHBhcnQgb2YgdGhlIG1vdXNlIGNvbXBhdGliaWxpdHkgZXZlbnRzIG9uIGZpcnN0IHRhcCAtIHRoZSBjYXJvdXNlbFxuICAgICAgLy8gd291bGQgc3RvcCBjeWNsaW5nIHVudGlsIHVzZXIgdGFwcGVkIG91dCBvZiBpdDtcbiAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAvLyAoYXMgaWYgaXQncyB0aGUgc2Vjb25kIHRpbWUgd2UgdGFwIG9uIGl0LCBtb3VzZWVudGVyIGNvbXBhdCBldmVudFxuICAgICAgLy8gaXMgTk9UIGZpcmVkKSBhbmQgYWZ0ZXIgYSB0aW1lb3V0ICh0byBhbGxvdyBmb3IgbW91c2UgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG5cbiAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50b3VjaFRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgdGhpcy50b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSwgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCArIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCk7XG4gICAgfTtcbiAgICBjb25zdCBzd2lwZUNvbmZpZyA9IHtcbiAgICAgIGxlZnRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fTEVGVCkpLFxuICAgICAgcmlnaHRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fUklHSFQpKSxcbiAgICAgIGVuZENhbGxiYWNrOiBlbmRDYWxsQmFja1xuICAgIH07XG4gICAgdGhpcy5fc3dpcGVIZWxwZXIgPSBuZXcgU3dpcGUodGhpcy5fZWxlbWVudCwgc3dpcGVDb25maWcpO1xuICB9XG4gIF9rZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IEtFWV9UT19ESVJFQ1RJT05bZXZlbnQua2V5XTtcbiAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihkaXJlY3Rpb24pKTtcbiAgICB9XG4gIH1cbiAgX2dldEl0ZW1JbmRleChlbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEl0ZW1zKCkuaW5kZXhPZihlbGVtZW50KTtcbiAgfVxuICBfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChpbmRleCkge1xuICAgIGlmICghdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlSW5kaWNhdG9yID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkUsIHRoaXMuX2luZGljYXRvcnNFbGVtZW50KTtcbiAgICBhY3RpdmVJbmRpY2F0b3IuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQyKTtcbiAgICBhY3RpdmVJbmRpY2F0b3IucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnKTtcbiAgICBjb25zdCBuZXdBY3RpdmVJbmRpY2F0b3IgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKGBbZGF0YS1icy1zbGlkZS10bz1cIiR7aW5kZXh9XCJdYCwgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpO1xuICAgIGlmIChuZXdBY3RpdmVJbmRpY2F0b3IpIHtcbiAgICAgIG5ld0FjdGl2ZUluZGljYXRvci5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgbmV3QWN0aXZlSW5kaWNhdG9yLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ3RydWUnKTtcbiAgICB9XG4gIH1cbiAgX3VwZGF0ZUludGVydmFsKCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9hY3RpdmVFbGVtZW50IHx8IHRoaXMuX2dldEFjdGl2ZSgpO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50SW50ZXJ2YWwgPSBOdW1iZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtaW50ZXJ2YWwnKSwgMTApO1xuICAgIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCA9IGVsZW1lbnRJbnRlcnZhbCB8fCB0aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsO1xuICB9XG4gIF9zbGlkZShvcmRlciwgZWxlbWVudCA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9nZXRBY3RpdmUoKTtcbiAgICBjb25zdCBpc05leHQgPSBvcmRlciA9PT0gT1JERVJfTkVYVDtcbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGVsZW1lbnQgfHwgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQodGhpcy5fZ2V0SXRlbXMoKSwgYWN0aXZlRWxlbWVudCwgaXNOZXh0LCB0aGlzLl9jb25maWcud3JhcCk7XG4gICAgaWYgKG5leHRFbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHRFbGVtZW50SW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgobmV4dEVsZW1lbnQpO1xuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IGV2ZW50TmFtZSA9PiB7XG4gICAgICByZXR1cm4gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgZXZlbnROYW1lLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IG5leHRFbGVtZW50LFxuICAgICAgICBkaXJlY3Rpb246IHRoaXMuX29yZGVyVG9EaXJlY3Rpb24ob3JkZXIpLFxuICAgICAgICBmcm9tOiB0aGlzLl9nZXRJdGVtSW5kZXgoYWN0aXZlRWxlbWVudCksXG4gICAgICAgIHRvOiBuZXh0RWxlbWVudEluZGV4XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHNsaWRlRXZlbnQgPSB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJREUpO1xuICAgIGlmIChzbGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFhY3RpdmVFbGVtZW50IHx8ICFuZXh0RWxlbWVudCkge1xuICAgICAgLy8gU29tZSB3ZWlyZG5lc3MgaXMgaGFwcGVuaW5nLCBzbyB3ZSBiYWlsXG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgdGVzdHMgdGhhdCB1c2UgZW1wdHkgZGl2cyB0byBhdm9pZCB0aGlzIGNoZWNrXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzQ3ljbGluZyA9IEJvb2xlYW4odGhpcy5faW50ZXJ2YWwpO1xuICAgIHRoaXMucGF1c2UoKTtcbiAgICB0aGlzLl9pc1NsaWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQobmV4dEVsZW1lbnRJbmRleCk7XG4gICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgIGNvbnN0IGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9TVEFSVCA6IENMQVNTX05BTUVfRU5EO1xuICAgIGNvbnN0IG9yZGVyQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9ORVhUIDogQ0xBU1NfTkFNRV9QUkVWO1xuICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQob3JkZXJDbGFzc05hbWUpO1xuICAgIHJlZmxvdyhuZXh0RWxlbWVudCk7XG4gICAgYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QuYWRkKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICBjb25zdCBjb21wbGV0ZUNhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShkaXJlY3Rpb25hbENsYXNzTmFtZSwgb3JkZXJDbGFzc05hbWUpO1xuICAgICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSQyKTtcbiAgICAgIGFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQyLCBvcmRlckNsYXNzTmFtZSwgZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJRCk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIGFjdGl2ZUVsZW1lbnQsIHRoaXMuX2lzQW5pbWF0ZWQoKSk7XG4gICAgaWYgKGlzQ3ljbGluZykge1xuICAgICAgdGhpcy5jeWNsZSgpO1xuICAgIH1cbiAgfVxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TTElERSk7XG4gIH1cbiAgX2dldEFjdGl2ZSgpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkVfSVRFTSwgdGhpcy5fZWxlbWVudCk7XG4gIH1cbiAgX2dldEl0ZW1zKCkge1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU0sIHRoaXMuX2VsZW1lbnQpO1xuICB9XG4gIF9jbGVhckludGVydmFsKCkge1xuICAgIGlmICh0aGlzLl9pbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG4gIF9kaXJlY3Rpb25Ub09yZGVyKGRpcmVjdGlvbikge1xuICAgIGlmIChpc1JUTCgpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX1BSRVYgOiBPUkRFUl9ORVhUO1xuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX05FWFQgOiBPUkRFUl9QUkVWO1xuICB9XG4gIF9vcmRlclRvRGlyZWN0aW9uKG9yZGVyKSB7XG4gICAgaWYgKGlzUlRMKCkpIHtcbiAgICAgIHJldHVybiBvcmRlciA9PT0gT1JERVJfUFJFViA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cbiAgICByZXR1cm4gb3JkZXIgPT09IE9SREVSX1BSRVYgPyBESVJFQ1RJT05fUklHSFQgOiBESVJFQ1RJT05fTEVGVDtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnbnVtYmVyJykge1xuICAgICAgICBkYXRhLnRvKGNvbmZpZyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDUsIFNFTEVDVE9SX0RBVEFfU0xJREUsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpO1xuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0NBUk9VU0VMKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBjb25zdCBjYXJvdXNlbCA9IENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KTtcbiAgY29uc3Qgc2xpZGVJbmRleCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXNsaWRlLXRvJyk7XG4gIGlmIChzbGlkZUluZGV4KSB7XG4gICAgY2Fyb3VzZWwudG8oc2xpZGVJbmRleCk7XG4gICAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUodGhpcywgJ3NsaWRlJykgPT09ICduZXh0Jykge1xuICAgIGNhcm91c2VsLm5leHQoKTtcbiAgICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjYXJvdXNlbC5wcmV2KCk7XG4gIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKCk7XG59KTtcbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEkkMywgKCkgPT4ge1xuICBjb25zdCBjYXJvdXNlbHMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfUklERSk7XG4gIGZvciAoY29uc3QgY2Fyb3VzZWwgb2YgY2Fyb3VzZWxzKSB7XG4gICAgQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZShjYXJvdXNlbCk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihDYXJvdXNlbCk7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBjb2xsYXBzZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGIgPSAnY29sbGFwc2UnO1xuY29uc3QgREFUQV9LRVkkNyA9ICdicy5jb2xsYXBzZSc7XG5jb25zdCBFVkVOVF9LRVkkNyA9IGAuJHtEQVRBX0tFWSQ3fWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkNCA9ICcuZGF0YS1hcGknO1xuY29uc3QgRVZFTlRfU0hPVyQ2ID0gYHNob3cke0VWRU5UX0tFWSQ3fWA7XG5jb25zdCBFVkVOVF9TSE9XTiQ2ID0gYHNob3duJHtFVkVOVF9LRVkkN31gO1xuY29uc3QgRVZFTlRfSElERSQ2ID0gYGhpZGUke0VWRU5UX0tFWSQ3fWA7XG5jb25zdCBFVkVOVF9ISURERU4kNiA9IGBoaWRkZW4ke0VWRU5UX0tFWSQ3fWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQ0ID0gYGNsaWNrJHtFVkVOVF9LRVkkN30ke0RBVEFfQVBJX0tFWSQ0fWA7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckNyA9ICdzaG93JztcbmNvbnN0IENMQVNTX05BTUVfQ09MTEFQU0UgPSAnY29sbGFwc2UnO1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTSU5HID0gJ2NvbGxhcHNpbmcnO1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTRUQgPSAnY29sbGFwc2VkJztcbmNvbnN0IENMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOID0gYDpzY29wZSAuJHtDTEFTU19OQU1FX0NPTExBUFNFfSAuJHtDTEFTU19OQU1FX0NPTExBUFNFfWA7XG5jb25zdCBDTEFTU19OQU1FX0hPUklaT05UQUwgPSAnY29sbGFwc2UtaG9yaXpvbnRhbCc7XG5jb25zdCBXSURUSCA9ICd3aWR0aCc7XG5jb25zdCBIRUlHSFQgPSAnaGVpZ2h0JztcbmNvbnN0IFNFTEVDVE9SX0FDVElWRVMgPSAnLmNvbGxhcHNlLnNob3csIC5jb2xsYXBzZS5jb2xsYXBzaW5nJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDQgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIl0nO1xuY29uc3QgRGVmYXVsdCRhID0ge1xuICBwYXJlbnQ6IG51bGwsXG4gIHRvZ2dsZTogdHJ1ZVxufTtcbmNvbnN0IERlZmF1bHRUeXBlJGEgPSB7XG4gIHBhcmVudDogJyhudWxsfGVsZW1lbnQpJyxcbiAgdG9nZ2xlOiAnYm9vbGVhbidcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIENvbGxhcHNlIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gW107XG4gICAgY29uc3QgdG9nZ2xlTGlzdCA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEUkNCk7XG4gICAgZm9yIChjb25zdCBlbGVtIG9mIHRvZ2dsZUxpc3QpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gU2VsZWN0b3JFbmdpbmUuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtKTtcbiAgICAgIGNvbnN0IGZpbHRlckVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKS5maWx0ZXIoZm91bmRFbGVtZW50ID0+IGZvdW5kRWxlbWVudCA9PT0gdGhpcy5fZWxlbWVudCk7XG4gICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwgJiYgZmlsdGVyRWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5LnB1c2goZWxlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxpemVDaGlsZHJlbigpO1xuICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdGhpcy5faXNTaG93bigpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b2dnbGUpIHtcbiAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkYTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSRhO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRiO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfVxuICB9XG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCB0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGFjdGl2ZUNoaWxkcmVuID0gW107XG5cbiAgICAvLyBmaW5kIGFjdGl2ZSBjaGlsZHJlblxuICAgIGlmICh0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICBhY3RpdmVDaGlsZHJlbiA9IHRoaXMuX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihTRUxFQ1RPUl9BQ1RJVkVTKS5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KS5tYXAoZWxlbWVudCA9PiBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHtcbiAgICAgICAgdG9nZ2xlOiBmYWxzZVxuICAgICAgfSkpO1xuICAgIH1cbiAgICBpZiAoYWN0aXZlQ2hpbGRyZW4ubGVuZ3RoICYmIGFjdGl2ZUNoaWxkcmVuWzBdLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1ckNik7XG4gICAgaWYgKHN0YXJ0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGFjdGl2ZUluc3RhbmNlIG9mIGFjdGl2ZUNoaWxkcmVuKSB7XG4gICAgICBhY3RpdmVJbnN0YW5jZS5oaWRlKCk7XG4gICAgfVxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNFKTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKTtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAwO1xuICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksIHRydWUpO1xuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNJTkcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVyQ3KTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04kNik7XG4gICAgfTtcbiAgICBjb25zdCBjYXBpdGFsaXplZERpbWVuc2lvbiA9IGRpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKDEpO1xuICAgIGNvbnN0IHNjcm9sbFNpemUgPSBgc2Nyb2xsJHtjYXBpdGFsaXplZERpbWVuc2lvbn1gO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRydWUpO1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IGAke3RoaXMuX2VsZW1lbnRbc2Nyb2xsU2l6ZV19cHhgO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFJDYpO1xuICAgIGlmIChzdGFydEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKCk7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gYCR7dGhpcy5fZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkaW1lbnNpb25dfXB4YDtcbiAgICByZWZsb3codGhpcy5fZWxlbWVudCk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVyQ3KTtcbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdGhpcy5fdHJpZ2dlckFycmF5KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0cmlnZ2VyKTtcbiAgICAgIGlmIChlbGVtZW50ICYmICF0aGlzLl9pc1Nob3duKGVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbdHJpZ2dlcl0sIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTRSk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4kNik7XG4gICAgfTtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJztcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKTtcbiAgfVxuICBfaXNTaG93bihlbGVtZW50ID0gdGhpcy5fZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1ckNyk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpOyAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuICAgIGNvbmZpZy5wYXJlbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5wYXJlbnQpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX2dldERpbWVuc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9IT1JJWk9OVEFMKSA/IFdJRFRIIDogSEVJR0hUO1xuICB9XG4gIF9pbml0aWFsaXplQ2hpbGRyZW4oKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDQpO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBjaGlsZHJlbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbZWxlbWVudF0sIHRoaXMuX2lzU2hvd24oc2VsZWN0ZWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihzZWxlY3Rvcikge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gU2VsZWN0b3JFbmdpbmUuZmluZChDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiwgdGhpcy5fY29uZmlnLnBhcmVudCk7XG4gICAgLy8gcmVtb3ZlIGNoaWxkcmVuIGlmIGdyZWF0ZXIgZGVwdGhcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvciwgdGhpcy5fY29uZmlnLnBhcmVudCkuZmlsdGVyKGVsZW1lbnQgPT4gIWNoaWxkcmVuLmluY2x1ZGVzKGVsZW1lbnQpKTtcbiAgfVxuICBfYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRyaWdnZXJBcnJheSwgaXNPcGVuKSB7XG4gICAgaWYgKCF0cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0cmlnZ2VyQXJyYXkpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShDTEFTU19OQU1FX0NPTExBUFNFRCwgIWlzT3Blbik7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGlzT3Blbik7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgY29uc3QgX2NvbmZpZyA9IHt9O1xuICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyAmJiAvc2hvd3xoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgIF9jb25maWcudG9nZ2xlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgX2NvbmZpZyk7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQ0LCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ0LCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgLy8gcHJldmVudERlZmF1bHQgb25seSBmb3IgPGE+IGVsZW1lbnRzICh3aGljaCBjaGFuZ2UgdGhlIFVSTCkgbm90IGluc2lkZSB0aGUgY29sbGFwc2libGUgZWxlbWVudFxuICBpZiAoZXZlbnQudGFyZ2V0LnRhZ05hbWUgPT09ICdBJyB8fCBldmVudC5kZWxlZ2F0ZVRhcmdldCAmJiBldmVudC5kZWxlZ2F0ZVRhcmdldC50YWdOYW1lID09PSAnQScpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5nZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yKHRoaXMpKSB7XG4gICAgQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCB7XG4gICAgICB0b2dnbGU6IGZhbHNlXG4gICAgfSkudG9nZ2xlKCk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihDb2xsYXBzZSk7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkcm9wZG93bi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGEgPSAnZHJvcGRvd24nO1xuY29uc3QgREFUQV9LRVkkNiA9ICdicy5kcm9wZG93bic7XG5jb25zdCBFVkVOVF9LRVkkNiA9IGAuJHtEQVRBX0tFWSQ2fWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkMyA9ICcuZGF0YS1hcGknO1xuY29uc3QgRVNDQVBFX0tFWSQyID0gJ0VzY2FwZSc7XG5jb25zdCBUQUJfS0VZJDEgPSAnVGFiJztcbmNvbnN0IEFSUk9XX1VQX0tFWSQxID0gJ0Fycm93VXAnO1xuY29uc3QgQVJST1dfRE9XTl9LRVkkMSA9ICdBcnJvd0Rvd24nO1xuY29uc3QgUklHSFRfTU9VU0VfQlVUVE9OID0gMjsgLy8gTW91c2VFdmVudC5idXR0b24gdmFsdWUgZm9yIHRoZSBzZWNvbmRhcnkgYnV0dG9uLCB1c3VhbGx5IHRoZSByaWdodCBidXR0b25cblxuY29uc3QgRVZFTlRfSElERSQ1ID0gYGhpZGUke0VWRU5UX0tFWSQ2fWA7XG5jb25zdCBFVkVOVF9ISURERU4kNSA9IGBoaWRkZW4ke0VWRU5UX0tFWSQ2fWA7XG5jb25zdCBFVkVOVF9TSE9XJDUgPSBgc2hvdyR7RVZFTlRfS0VZJDZ9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDUgPSBgc2hvd24ke0VWRU5UX0tFWSQ2fWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQzID0gYGNsaWNrJHtFVkVOVF9LRVkkNn0ke0RBVEFfQVBJX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJID0gYGtleWRvd24ke0VWRU5UX0tFWSQ2fSR7REFUQV9BUElfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX0tFWVVQX0RBVEFfQVBJID0gYGtleXVwJHtFVkVOVF9LRVkkNn0ke0RBVEFfQVBJX0tFWSQzfWA7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckNiA9ICdzaG93JztcbmNvbnN0IENMQVNTX05BTUVfRFJPUFVQID0gJ2Ryb3B1cCc7XG5jb25zdCBDTEFTU19OQU1FX0RST1BFTkQgPSAnZHJvcGVuZCc7XG5jb25zdCBDTEFTU19OQU1FX0RST1BTVEFSVCA9ICdkcm9wc3RhcnQnO1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QVVBfQ0VOVEVSID0gJ2Ryb3B1cC1jZW50ZXInO1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QRE9XTl9DRU5URVIgPSAnZHJvcGRvd24tY2VudGVyJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIl06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04gPSBgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzfS4ke0NMQVNTX05BTUVfU0hPVyQ2fWA7XG5jb25zdCBTRUxFQ1RPUl9NRU5VID0gJy5kcm9wZG93bi1tZW51JztcbmNvbnN0IFNFTEVDVE9SX05BVkJBUiA9ICcubmF2YmFyJztcbmNvbnN0IFNFTEVDVE9SX05BVkJBUl9OQVYgPSAnLm5hdmJhci1uYXYnO1xuY29uc3QgU0VMRUNUT1JfVklTSUJMRV9JVEVNUyA9ICcuZHJvcGRvd24tbWVudSAuZHJvcGRvd24taXRlbTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKSc7XG5jb25zdCBQTEFDRU1FTlRfVE9QID0gaXNSVEwoKSA/ICd0b3AtZW5kJyA6ICd0b3Atc3RhcnQnO1xuY29uc3QgUExBQ0VNRU5UX1RPUEVORCA9IGlzUlRMKCkgPyAndG9wLXN0YXJ0JyA6ICd0b3AtZW5kJztcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT00gPSBpc1JUTCgpID8gJ2JvdHRvbS1lbmQnIDogJ2JvdHRvbS1zdGFydCc7XG5jb25zdCBQTEFDRU1FTlRfQk9UVE9NRU5EID0gaXNSVEwoKSA/ICdib3R0b20tc3RhcnQnIDogJ2JvdHRvbS1lbmQnO1xuY29uc3QgUExBQ0VNRU5UX1JJR0hUID0gaXNSVEwoKSA/ICdsZWZ0LXN0YXJ0JyA6ICdyaWdodC1zdGFydCc7XG5jb25zdCBQTEFDRU1FTlRfTEVGVCA9IGlzUlRMKCkgPyAncmlnaHQtc3RhcnQnIDogJ2xlZnQtc3RhcnQnO1xuY29uc3QgUExBQ0VNRU5UX1RPUENFTlRFUiA9ICd0b3AnO1xuY29uc3QgUExBQ0VNRU5UX0JPVFRPTUNFTlRFUiA9ICdib3R0b20nO1xuY29uc3QgRGVmYXVsdCQ5ID0ge1xuICBhdXRvQ2xvc2U6IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgZGlzcGxheTogJ2R5bmFtaWMnLFxuICBvZmZzZXQ6IFswLCAyXSxcbiAgcG9wcGVyQ29uZmlnOiBudWxsLFxuICByZWZlcmVuY2U6ICd0b2dnbGUnXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkOSA9IHtcbiAgYXV0b0Nsb3NlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KScsXG4gIGRpc3BsYXk6ICdzdHJpbmcnLFxuICBvZmZzZXQ6ICcoYXJyYXl8c3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBvcHBlckNvbmZpZzogJyhudWxsfG9iamVjdHxmdW5jdGlvbiknLFxuICByZWZlcmVuY2U6ICcoc3RyaW5nfGVsZW1lbnR8b2JqZWN0KSdcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIERyb3Bkb3duIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICB0aGlzLl9wYXJlbnQgPSB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGU7IC8vIGRyb3Bkb3duIHdyYXBwZXJcbiAgICAvLyBUT0RPOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjMvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgdGhpcy5fbWVudSA9IFNlbGVjdG9yRW5naW5lLm5leHQodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF0gfHwgU2VsZWN0b3JFbmdpbmUucHJldih0aGlzLl9lbGVtZW50LCBTRUxFQ1RPUl9NRU5VKVswXSB8fCBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01FTlUsIHRoaXMuX3BhcmVudCk7XG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKTtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDk7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkOTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkYTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24oKSA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KCk7XG4gIH1cbiAgc2hvdygpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCB0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9O1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1ckNSwgcmVsYXRlZFRhcmdldCk7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NyZWF0ZVBvcHBlcigpO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICF0aGlzLl9wYXJlbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVJfTkFWKSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICB0aGlzLl9tZW51LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckNik7XG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04kNSwgcmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiB0aGlzLl9lbGVtZW50XG4gICAgfTtcbiAgICB0aGlzLl9jb21wbGV0ZUhpZGUocmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbiAgdXBkYXRlKCkge1xuICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKCk7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSQ1LCByZWxhdGVkVGFyZ2V0KTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5fbWVudS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ2KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZSh0aGlzLl9tZW51LCAncG9wcGVyJyk7XG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOJDUsIHJlbGF0ZWRUYXJnZXQpO1xuICB9XG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gc3VwZXIuX2dldENvbmZpZyhjb25maWcpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcgJiYgIWlzRWxlbWVudChjb25maWcucmVmZXJlbmNlKSAmJiB0eXBlb2YgY29uZmlnLnJlZmVyZW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFBvcHBlciB2aXJ0dWFsIGVsZW1lbnRzIHJlcXVpcmUgYSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgbWV0aG9kXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke05BTUUkYS50b1VwcGVyQ2FzZSgpfTogT3B0aW9uIFwicmVmZXJlbmNlXCIgcHJvdmlkZWQgdHlwZSBcIm9iamVjdFwiIHdpdGhvdXQgYSByZXF1aXJlZCBcImdldEJvdW5kaW5nQ2xpZW50UmVjdFwiIG1ldGhvZC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfY3JlYXRlUG9wcGVyKCkge1xuICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyBkcm9wZG93bnMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKTtcbiAgICB9XG4gICAgbGV0IHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIGlmICh0aGlzLl9jb25maWcucmVmZXJlbmNlID09PSAncGFyZW50Jykge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX3BhcmVudDtcbiAgICB9IGVsc2UgaWYgKGlzRWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKSkge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IGdldEVsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlO1xuICAgIH1cbiAgICBjb25zdCBwb3BwZXJDb25maWcgPSB0aGlzLl9nZXRQb3BwZXJDb25maWcoKTtcbiAgICB0aGlzLl9wb3BwZXIgPSBQb3BwZXIuY3JlYXRlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHRoaXMuX21lbnUsIHBvcHBlckNvbmZpZyk7XG4gIH1cbiAgX2lzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVyQ2KTtcbiAgfVxuICBfZ2V0UGxhY2VtZW50KCkge1xuICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5fcGFyZW50O1xuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRU5EKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9SSUdIVDtcbiAgICB9XG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BTVEFSVCkpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfTEVGVDtcbiAgICB9XG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUF9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX1RPUENFTlRFUjtcbiAgICB9XG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUikpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSO1xuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHJpbSB0aGUgdmFsdWUgYmVjYXVzZSBjdXN0b20gcHJvcGVydGllcyBjYW4gYWxzbyBpbmNsdWRlIHNwYWNlc1xuICAgIGNvbnN0IGlzRW5kID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9tZW51KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWJzLXBvc2l0aW9uJykudHJpbSgpID09PSAnZW5kJztcbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFVQKSkge1xuICAgICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX1RPUEVORCA6IFBMQUNFTUVOVF9UT1A7XG4gICAgfVxuICAgIHJldHVybiBpc0VuZCA/IFBMQUNFTUVOVF9CT1RUT01FTkQgOiBQTEFDRU1FTlRfQk9UVE9NO1xuICB9XG4gIF9kZXRlY3ROYXZiYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVIpICE9PSBudWxsO1xuICB9XG4gIF9nZXRPZmZzZXQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgb2Zmc2V0XG4gICAgfSA9IHRoaXMuX2NvbmZpZztcbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBvZmZzZXQuc3BsaXQoJywnKS5tYXAodmFsdWUgPT4gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHBvcHBlckRhdGEgPT4gb2Zmc2V0KHBvcHBlckRhdGEsIHRoaXMuX2VsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG4gIF9nZXRQb3BwZXJDb25maWcoKSB7XG4gICAgY29uc3QgZGVmYXVsdEJzUG9wcGVyQ29uZmlnID0ge1xuICAgICAgcGxhY2VtZW50OiB0aGlzLl9nZXRQbGFjZW1lbnQoKSxcbiAgICAgIG1vZGlmaWVyczogW3tcbiAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBib3VuZGFyeTogdGhpcy5fY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfTtcblxuICAgIC8vIERpc2FibGUgUG9wcGVyIGlmIHdlIGhhdmUgYSBzdGF0aWMgZGlzcGxheSBvciBEcm9wZG93biBpcyBpbiBOYXZiYXJcbiAgICBpZiAodGhpcy5faW5OYXZiYXIgfHwgdGhpcy5fY29uZmlnLmRpc3BsYXkgPT09ICdzdGF0aWMnKSB7XG4gICAgICBNYW5pcHVsYXRvci5zZXREYXRhQXR0cmlidXRlKHRoaXMuX21lbnUsICdwb3BwZXInLCAnc3RhdGljJyk7IC8vIFRPRE86IHY2IHJlbW92ZVxuICAgICAgZGVmYXVsdEJzUG9wcGVyQ29uZmlnLm1vZGlmaWVycyA9IFt7XG4gICAgICAgIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICB9XTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRCc1BvcHBlckNvbmZpZyxcbiAgICAgIC4uLmV4ZWN1dGUodGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZywgW2RlZmF1bHRCc1BvcHBlckNvbmZpZ10pXG4gICAgfTtcbiAgfVxuICBfc2VsZWN0TWVudUl0ZW0oe1xuICAgIGtleSxcbiAgICB0YXJnZXRcbiAgfSkge1xuICAgIGNvbnN0IGl0ZW1zID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9WSVNJQkxFX0lURU1TLCB0aGlzLl9tZW51KS5maWx0ZXIoZWxlbWVudCA9PiBpc1Zpc2libGUoZWxlbWVudCkpO1xuICAgIGlmICghaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgdGFyZ2V0IGlzbid0IGluY2x1ZGVkIGluIGl0ZW1zIChlLmcuIHdoZW4gZXhwYW5kaW5nIHRoZSBkcm9wZG93bilcbiAgICAvLyBhbGxvdyBjeWNsaW5nIHRvIGdldCB0aGUgbGFzdCBpdGVtIGluIGNhc2Uga2V5IGVxdWFscyBBUlJPV19VUF9LRVlcbiAgICBnZXROZXh0QWN0aXZlRWxlbWVudChpdGVtcywgdGFyZ2V0LCBrZXkgPT09IEFSUk9XX0RPV05fS0VZJDEsICFpdGVtcy5pbmNsdWRlcyh0YXJnZXQpKS5mb2N1cygpO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbiAgc3RhdGljIGNsZWFyTWVudXMoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSBSSUdIVF9NT1VTRV9CVVRUT04gfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgIT09IFRBQl9LRVkkMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcGVuVG9nZ2xlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04pO1xuICAgIGZvciAoY29uc3QgdG9nZ2xlIG9mIG9wZW5Ub2dnbGVzKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gRHJvcGRvd24uZ2V0SW5zdGFuY2UodG9nZ2xlKTtcbiAgICAgIGlmICghY29udGV4dCB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXBvc2VkUGF0aCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpO1xuICAgICAgY29uc3QgaXNNZW51VGFyZ2V0ID0gY29tcG9zZWRQYXRoLmluY2x1ZGVzKGNvbnRleHQuX21lbnUpO1xuICAgICAgaWYgKGNvbXBvc2VkUGF0aC5pbmNsdWRlcyhjb250ZXh0Ll9lbGVtZW50KSB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnaW5zaWRlJyAmJiAhaXNNZW51VGFyZ2V0IHx8IGNvbnRleHQuX2NvbmZpZy5hdXRvQ2xvc2UgPT09ICdvdXRzaWRlJyAmJiBpc01lbnVUYXJnZXQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRhYiBuYXZpZ2F0aW9uIHRocm91Z2ggdGhlIGRyb3Bkb3duIG1lbnUgb3IgZXZlbnRzIGZyb20gY29udGFpbmVkIGlucHV0cyBzaG91bGRuJ3QgY2xvc2UgdGhlIG1lbnVcbiAgICAgIGlmIChjb250ZXh0Ll9tZW51LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQua2V5ID09PSBUQUJfS0VZJDEgfHwgL2lucHV0fHNlbGVjdHxvcHRpb258dGV4dGFyZWF8Zm9ybS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IGNvbnRleHQuX2VsZW1lbnRcbiAgICAgIH07XG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICByZWxhdGVkVGFyZ2V0LmNsaWNrRXZlbnQgPSBldmVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGRhdGFBcGlLZXlkb3duSGFuZGxlcihldmVudCkge1xuICAgIC8vIElmIG5vdCBhbiBVUCB8IERPV04gfCBFU0NBUEUga2V5ID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAvLyBJZiBpbnB1dC90ZXh0YXJlYSAmJiBpZiBrZXkgaXMgb3RoZXIgdGhhbiBFU0NBUEUgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuXG4gICAgY29uc3QgaXNJbnB1dCA9IC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpO1xuICAgIGNvbnN0IGlzRXNjYXBlRXZlbnQgPSBldmVudC5rZXkgPT09IEVTQ0FQRV9LRVkkMjtcbiAgICBjb25zdCBpc1VwT3JEb3duRXZlbnQgPSBbQVJST1dfVVBfS0VZJDEsIEFSUk9XX0RPV05fS0VZJDFdLmluY2x1ZGVzKGV2ZW50LmtleSk7XG4gICAgaWYgKCFpc1VwT3JEb3duRXZlbnQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzSW5wdXQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIFRPRE86IHY2IHJldmVydCAjMzcwMTEgJiBjaGFuZ2UgbWFya3VwIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzUuMy9mb3Jtcy9pbnB1dC1ncm91cC9cbiAgICBjb25zdCBnZXRUb2dnbGVCdXR0b24gPSB0aGlzLm1hdGNoZXMoU0VMRUNUT1JfREFUQV9UT0dHTEUkMykgPyB0aGlzIDogU2VsZWN0b3JFbmdpbmUucHJldih0aGlzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzKVswXSB8fCBTZWxlY3RvckVuZ2luZS5uZXh0KHRoaXMsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMpWzBdIHx8IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfREFUQV9UT0dHTEUkMywgZXZlbnQuZGVsZWdhdGVUYXJnZXQucGFyZW50Tm9kZSk7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBEcm9wZG93bi5nZXRPckNyZWF0ZUluc3RhbmNlKGdldFRvZ2dsZUJ1dHRvbik7XG4gICAgaWYgKGlzVXBPckRvd25FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpbnN0YW5jZS5zaG93KCk7XG4gICAgICBpbnN0YW5jZS5fc2VsZWN0TWVudUl0ZW0oZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2UuX2lzU2hvd24oKSkge1xuICAgICAgLy8gZWxzZSBpcyBlc2NhcGUgYW5kIHdlIGNoZWNrIGlmIGl0IGlzIHNob3duXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGluc3RhbmNlLmhpZGUoKTtcbiAgICAgIGdldFRvZ2dsZUJ1dHRvbi5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpO1xuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9NRU5VLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpO1xuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQzLCBEcm9wZG93bi5jbGVhck1lbnVzKTtcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZVVBfREFUQV9BUEksIERyb3Bkb3duLmNsZWFyTWVudXMpO1xuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKS50b2dnbGUoKTtcbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihEcm9wZG93bik7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2JhY2tkcm9wLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkOSA9ICdiYWNrZHJvcCc7XG5jb25zdCBDTEFTU19OQU1FX0ZBREUkNCA9ICdmYWRlJztcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQ1ID0gJ3Nob3cnO1xuY29uc3QgRVZFTlRfTU9VU0VET1dOID0gYG1vdXNlZG93bi5icy4ke05BTUUkOX1gO1xuY29uc3QgRGVmYXVsdCQ4ID0ge1xuICBjbGFzc05hbWU6ICdtb2RhbC1iYWNrZHJvcCcsXG4gIGNsaWNrQ2FsbGJhY2s6IG51bGwsXG4gIGlzQW5pbWF0ZWQ6IGZhbHNlLFxuICBpc1Zpc2libGU6IHRydWUsXG4gIC8vIGlmIGZhbHNlLCB3ZSB1c2UgdGhlIGJhY2tkcm9wIGhlbHBlciB3aXRob3V0IGFkZGluZyBhbnkgZWxlbWVudCB0byB0aGUgZG9tXG4gIHJvb3RFbGVtZW50OiAnYm9keScgLy8gZ2l2ZSB0aGUgY2hvaWNlIHRvIHBsYWNlIGJhY2tkcm9wIHVuZGVyIGRpZmZlcmVudCBlbGVtZW50c1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDggPSB7XG4gIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gIGNsaWNrQ2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICBpc0FuaW1hdGVkOiAnYm9vbGVhbicsXG4gIGlzVmlzaWJsZTogJ2Jvb2xlYW4nLFxuICByb290RWxlbWVudDogJyhlbGVtZW50fHN0cmluZyknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYWNrZHJvcCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkODtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQ4O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQ5O1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHNob3coY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5pc1Zpc2libGUpIHtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9hcHBlbmQoKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpO1xuICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgcmVmbG93KGVsZW1lbnQpO1xuICAgIH1cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XJDUpO1xuICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cbiAgaGlkZShjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2dldEVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ1KTtcbiAgICB0aGlzLl9lbXVsYXRlQW5pbWF0aW9uKCgpID0+IHtcbiAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQXBwZW5kZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRURPV04pO1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IGZhbHNlO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZ2V0RWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBiYWNrZHJvcC5jbGFzc05hbWUgPSB0aGlzLl9jb25maWcuY2xhc3NOYW1lO1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKSB7XG4gICAgICAgIGJhY2tkcm9wLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9GQURFJDQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudCA9IGJhY2tkcm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgfVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyB1c2UgZ2V0RWxlbWVudCgpIHdpdGggdGhlIGRlZmF1bHQgXCJib2R5XCIgdG8gZ2V0IGEgZnJlc2ggRWxlbWVudCBvbiBlYWNoIGluc3RhbnRpYXRpb25cbiAgICBjb25maWcucm9vdEVsZW1lbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5yb290RWxlbWVudCk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfYXBwZW5kKCkge1xuICAgIGlmICh0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50KCk7XG4gICAgdGhpcy5fY29uZmlnLnJvb3RFbGVtZW50LmFwcGVuZChlbGVtZW50KTtcbiAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOLCAoKSA9PiB7XG4gICAgICBleGVjdXRlKHRoaXMuX2NvbmZpZy5jbGlja0NhbGxiYWNrKTtcbiAgICB9KTtcbiAgICB0aGlzLl9pc0FwcGVuZGVkID0gdHJ1ZTtcbiAgfVxuICBfZW11bGF0ZUFuaW1hdGlvbihjYWxsYmFjaykge1xuICAgIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24oY2FsbGJhY2ssIHRoaXMuX2dldEVsZW1lbnQoKSwgdGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpO1xuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2ZvY3VzdHJhcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDggPSAnZm9jdXN0cmFwJztcbmNvbnN0IERBVEFfS0VZJDUgPSAnYnMuZm9jdXN0cmFwJztcbmNvbnN0IEVWRU5UX0tFWSQ1ID0gYC4ke0RBVEFfS0VZJDV9YDtcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4kMiA9IGBmb2N1c2luJHtFVkVOVF9LRVkkNX1gO1xuY29uc3QgRVZFTlRfS0VZRE9XTl9UQUIgPSBga2V5ZG93bi50YWIke0VWRU5UX0tFWSQ1fWA7XG5jb25zdCBUQUJfS0VZID0gJ1RhYic7XG5jb25zdCBUQUJfTkFWX0ZPUldBUkQgPSAnZm9yd2FyZCc7XG5jb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJztcbmNvbnN0IERlZmF1bHQkNyA9IHtcbiAgYXV0b2ZvY3VzOiB0cnVlLFxuICB0cmFwRWxlbWVudDogbnVsbCAvLyBUaGUgZWxlbWVudCB0byB0cmFwIGZvY3VzIGluc2lkZSBvZlxufTtcbmNvbnN0IERlZmF1bHRUeXBlJDcgPSB7XG4gIGF1dG9mb2N1czogJ2Jvb2xlYW4nLFxuICB0cmFwRWxlbWVudDogJ2VsZW1lbnQnXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBGb2N1c1RyYXAgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IG51bGw7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCQ3O1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJDc7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJDg7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgYWN0aXZhdGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb25maWcuYXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLl9jb25maWcudHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgRXZlbnRIYW5kbGVyLm9mZihkb2N1bWVudCwgRVZFTlRfS0VZJDUpOyAvLyBndWFyZCBhZ2FpbnN0IGluZmluaXRlIGZvY3VzIGxvb3BcbiAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0ZPQ1VTSU4kMiwgZXZlbnQgPT4gdGhpcy5faGFuZGxlRm9jdXNpbihldmVudCkpO1xuICAgIEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZRE9XTl9UQUIsIGV2ZW50ID0+IHRoaXMuX2hhbmRsZUtleWRvd24oZXZlbnQpKTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gIH1cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgRXZlbnRIYW5kbGVyLm9mZihkb2N1bWVudCwgRVZFTlRfS0VZJDUpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaGFuZGxlRm9jdXNpbihldmVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHRyYXBFbGVtZW50XG4gICAgfSA9IHRoaXMuX2NvbmZpZztcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBkb2N1bWVudCB8fCBldmVudC50YXJnZXQgPT09IHRyYXBFbGVtZW50IHx8IHRyYXBFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudHMgPSBTZWxlY3RvckVuZ2luZS5mb2N1c2FibGVDaGlsZHJlbih0cmFwRWxlbWVudCk7XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2xhc3RUYWJOYXZEaXJlY3Rpb24gPT09IFRBQl9OQVZfQkFDS1dBUkQpIHtcbiAgICAgIGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRzWzBdLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIF9oYW5kbGVLZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gVEFCX0tFWSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID0gZXZlbnQuc2hpZnRLZXkgPyBUQUJfTkFWX0JBQ0tXQVJEIDogVEFCX05BVl9GT1JXQVJEO1xuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3Njcm9sbEJhci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBTRUxFQ1RPUl9GSVhFRF9DT05URU5UID0gJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnO1xuY29uc3QgU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQgPSAnLnN0aWNreS10b3AnO1xuY29uc3QgUFJPUEVSVFlfUEFERElORyA9ICdwYWRkaW5nLXJpZ2h0JztcbmNvbnN0IFBST1BFUlRZX01BUkdJTiA9ICdtYXJnaW4tcmlnaHQnO1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxCYXJIZWxwZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBnZXRXaWR0aCgpIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2lubmVyV2lkdGgjdXNhZ2Vfbm90ZXNcbiAgICBjb25zdCBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50V2lkdGgpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgdGhpcy5fZGlzYWJsZU92ZXJGbG93KCk7XG4gICAgLy8gZ2l2ZSBwYWRkaW5nIHRvIGVsZW1lbnQgdG8gYmFsYW5jZSB0aGUgaGlkZGVuIHNjcm9sbGJhciB3aWR0aFxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aCk7XG4gICAgLy8gdHJpY2s6IFdlIGFkanVzdCBwb3NpdGl2ZSBwYWRkaW5nUmlnaHQgYW5kIG5lZ2F0aXZlIG1hcmdpblJpZ2h0IHRvIHN0aWNreS10b3AgZWxlbWVudHMgdG8ga2VlcCBzaG93aW5nIGZ1bGx3aWR0aFxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aCk7XG4gICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTiwgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSAtIHdpZHRoKTtcbiAgfVxuICByZXNldCgpIHtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpO1xuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcy5fZWxlbWVudCwgUFJPUEVSVFlfUEFERElORyk7XG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HKTtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4pO1xuICB9XG4gIGlzT3ZlcmZsb3dpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDA7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9kaXNhYmxlT3ZlckZsb3coKSB7XG4gICAgdGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUodGhpcy5fZWxlbWVudCwgJ292ZXJmbG93Jyk7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICB9XG4gIF9zZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IHRoaXMuZ2V0V2lkdGgoKTtcbiAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQgJiYgd2luZG93LmlubmVyV2lkdGggPiBlbGVtZW50LmNsaWVudFdpZHRoICsgc2Nyb2xsYmFyV2lkdGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSk7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkVmFsdWUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCBgJHtjYWxsYmFjayhOdW1iZXIucGFyc2VGbG9hdChjYWxjdWxhdGVkVmFsdWUpKX1weGApO1xuICAgIH07XG4gICAgdGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spO1xuICB9XG4gIF9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KSB7XG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wZXJ0eSk7XG4gICAgaWYgKGFjdHVhbFZhbHVlKSB7XG4gICAgICBNYW5pcHVsYXRvci5zZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHksIGFjdHVhbFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoc2VsZWN0b3IsIHN0eWxlUHJvcGVydHkpIHtcbiAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHJlbW92ZSB0aGUgcHJvcGVydHkgaWYgdGhlIHZhbHVlIGlzIGBudWxsYDsgdGhlIHZhbHVlIGNhbiBhbHNvIGJlIHplcm9cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHN0eWxlUHJvcGVydHkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCB2YWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjayk7XG4gIH1cbiAgX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxCYWNrKSB7XG4gICAgaWYgKGlzRWxlbWVudChzZWxlY3RvcikpIHtcbiAgICAgIGNhbGxCYWNrKHNlbGVjdG9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzZWwgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvciwgdGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGNhbGxCYWNrKHNlbCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBtb2RhbC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDcgPSAnbW9kYWwnO1xuY29uc3QgREFUQV9LRVkkNCA9ICdicy5tb2RhbCc7XG5jb25zdCBFVkVOVF9LRVkkNCA9IGAuJHtEQVRBX0tFWSQ0fWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkMiA9ICcuZGF0YS1hcGknO1xuY29uc3QgRVNDQVBFX0tFWSQxID0gJ0VzY2FwZSc7XG5jb25zdCBFVkVOVF9ISURFJDQgPSBgaGlkZSR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEJDEgPSBgaGlkZVByZXZlbnRlZCR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0hJRERFTiQ0ID0gYGhpZGRlbiR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX1NIT1ckNCA9IGBzaG93JHtFVkVOVF9LRVkkNH1gO1xuY29uc3QgRVZFTlRfU0hPV04kNCA9IGBzaG93biR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX1JFU0laRSQxID0gYHJlc2l6ZSR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RJU01JU1MgPSBgY2xpY2suZGlzbWlzcyR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTID0gYG1vdXNlZG93bi5kaXNtaXNzJHtFVkVOVF9LRVkkNH1gO1xuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTJDEgPSBga2V5ZG93bi5kaXNtaXNzJHtFVkVOVF9LRVkkNH1gO1xuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMiA9IGBjbGljayR7RVZFTlRfS0VZJDR9JHtEQVRBX0FQSV9LRVkkMn1gO1xuY29uc3QgQ0xBU1NfTkFNRV9PUEVOID0gJ21vZGFsLW9wZW4nO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDMgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckNCA9ICdzaG93JztcbmNvbnN0IENMQVNTX05BTUVfU1RBVElDID0gJ21vZGFsLXN0YXRpYyc7XG5jb25zdCBPUEVOX1NFTEVDVE9SJDEgPSAnLm1vZGFsLnNob3cnO1xuY29uc3QgU0VMRUNUT1JfRElBTE9HID0gJy5tb2RhbC1kaWFsb2cnO1xuY29uc3QgU0VMRUNUT1JfTU9EQUxfQk9EWSA9ICcubW9kYWwtYm9keSc7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyID0gJ1tkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCJdJztcbmNvbnN0IERlZmF1bHQkNiA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGZvY3VzOiB0cnVlLFxuICBrZXlib2FyZDogdHJ1ZVxufTtcbmNvbnN0IERlZmF1bHRUeXBlJDYgPSB7XG4gIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGZvY3VzOiAnYm9vbGVhbicsXG4gIGtleWJvYXJkOiAnYm9vbGVhbidcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE1vZGFsIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgdGhpcy5fZGlhbG9nID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9ESUFMT0csIHRoaXMuX2VsZW1lbnQpO1xuICAgIHRoaXMuX2JhY2tkcm9wID0gdGhpcy5faW5pdGlhbGl6ZUJhY2tEcm9wKCk7XG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpO1xuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9zY3JvbGxCYXIgPSBuZXcgU2Nyb2xsQmFySGVscGVyKCk7XG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDY7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkNjtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkNztcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1ckNCwge1xuICAgICAgcmVsYXRlZFRhcmdldFxuICAgIH0pO1xuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3Njcm9sbEJhci5oaWRlKCk7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BFTik7XG4gICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygoKSA9PiB0aGlzLl9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSk7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUkNCk7XG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKCk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ0KTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHRoaXMuX2hpZGVNb2RhbCgpLCB0aGlzLl9lbGVtZW50LCB0aGlzLl9pc0FuaW1hdGVkKCkpO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih3aW5kb3csIEVWRU5UX0tFWSQ0KTtcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2RpYWxvZywgRVZFTlRfS0VZJDQpO1xuICAgIHRoaXMuX2JhY2tkcm9wLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxuICBoYW5kbGVVcGRhdGUoKSB7XG4gICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplQmFja0Ryb3AoKSB7XG4gICAgcmV0dXJuIG5ldyBCYWNrZHJvcCh7XG4gICAgICBpc1Zpc2libGU6IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKSxcbiAgICAgIC8vICdzdGF0aWMnIG9wdGlvbiB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdHJ1ZSwgYW5kIGJvb2xlYW5zIHdpbGwga2VlcCB0aGVpciB2YWx1ZSxcbiAgICAgIGlzQW5pbWF0ZWQ6IHRoaXMuX2lzQW5pbWF0ZWQoKVxuICAgIH0pO1xuICB9XG4gIF9pbml0aWFsaXplRm9jdXNUcmFwKCkge1xuICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgIHRyYXBFbGVtZW50OiB0aGlzLl9lbGVtZW50XG4gICAgfSk7XG4gIH1cbiAgX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAvLyB0cnkgdG8gYXBwZW5kIGR5bmFtaWMgbW9kYWxcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHRoaXMuX2VsZW1lbnQpO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XG4gICAgdGhpcy5fZWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIGNvbnN0IG1vZGFsQm9keSA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTU9EQUxfQk9EWSwgdGhpcy5fZGlhbG9nKTtcbiAgICBpZiAobW9kYWxCb2R5KSB7XG4gICAgICBtb2RhbEJvZHkuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckNCk7XG4gICAgY29uc3QgdHJhbnNpdGlvbkNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5mb2N1cykge1xuICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04kNCwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2sodHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzLl9kaWFsb2csIHRoaXMuX2lzQW5pbWF0ZWQoKSk7XG4gIH1cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MkMSwgZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSAhPT0gRVNDQVBFX0tFWSQxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICB9KTtcbiAgICBFdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUkMSwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzU2hvd24gJiYgIXRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgIC8vIGEgYmFkIHRyaWNrIHRvIHNlZ3JlZ2F0ZSBjbGlja3MgdGhhdCBtYXkgc3RhcnQgaW5zaWRlIGRpYWxvZyBidXQgZW5kIG91dHNpZGUsIGFuZCBhdm9pZCBsaXN0ZW4gdG8gc2Nyb2xsYmFyIGNsaWNrc1xuICAgICAgRXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9DTElDS19ESVNNSVNTLCBldmVudDIgPT4ge1xuICAgICAgICBpZiAodGhpcy5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0IHx8IHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50Mi50YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgX2hpZGVNb2RhbCgpIHtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKTtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpO1xuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfT1BFTik7XG4gICAgICB0aGlzLl9yZXNldEFkanVzdG1lbnRzKCk7XG4gICAgICB0aGlzLl9zY3JvbGxCYXIucmVzZXQoKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTiQ0KTtcbiAgICB9KTtcbiAgfVxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDMpO1xuICB9XG4gIF90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCkge1xuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEJDEpO1xuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgaW5pdGlhbE92ZXJmbG93WSA9IHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZO1xuICAgIC8vIHJldHVybiBpZiB0aGUgZm9sbG93aW5nIGJhY2tncm91bmQgdHJhbnNpdGlvbiBoYXNuJ3QgeWV0IGNvbXBsZXRlZFxuICAgIGlmIChpbml0aWFsT3ZlcmZsb3dZID09PSAnaGlkZGVuJyB8fCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NUQVRJQykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NUQVRJQyk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TVEFUSUMpO1xuICAgICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaW5pdGlhbE92ZXJmbG93WTtcbiAgICAgIH0sIHRoaXMuX2RpYWxvZyk7XG4gICAgfSwgdGhpcy5fZGlhbG9nKTtcbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcbiAgICovXG5cbiAgX2FkanVzdERpYWxvZygpIHtcbiAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl9zY3JvbGxCYXIuZ2V0V2lkdGgoKTtcbiAgICBjb25zdCBpc0JvZHlPdmVyZmxvd2luZyA9IHNjcm9sbGJhcldpZHRoID4gMDtcbiAgICBpZiAoaXNCb2R5T3ZlcmZsb3dpbmcgJiYgIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGA7XG4gICAgfVxuICAgIGlmICghaXNCb2R5T3ZlcmZsb3dpbmcgJiYgaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IGlzUlRMKCkgPyAncGFkZGluZ1JpZ2h0JyA6ICdwYWRkaW5nTGVmdCc7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGAke3Njcm9sbGJhcldpZHRofXB4YDtcbiAgICB9XG4gIH1cbiAgX3Jlc2V0QWRqdXN0bWVudHMoKSB7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcnO1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJyc7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcsIHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZyk7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICB9XG4gICAgICBkYXRhW2NvbmZpZ10ocmVsYXRlZFRhcmdldCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMiwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcyk7XG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9TSE9XJDQsIHNob3dFdmVudCA9PiB7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAvLyBvbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4kNCwgKCkgPT4ge1xuICAgICAgaWYgKGlzVmlzaWJsZSh0aGlzKSkge1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGF2b2lkIGNvbmZsaWN0IHdoZW4gY2xpY2tpbmcgbW9kYWwgdG9nZ2xlciB3aGlsZSBhbm90aGVyIG9uZSBpcyBvcGVuXG4gIGNvbnN0IGFscmVhZHlPcGVuID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShPUEVOX1NFTEVDVE9SJDEpO1xuICBpZiAoYWxyZWFkeU9wZW4pIHtcbiAgICBNb2RhbC5nZXRJbnN0YW5jZShhbHJlYWR5T3BlbikuaGlkZSgpO1xuICB9XG4gIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG4gIGRhdGEudG9nZ2xlKHRoaXMpO1xufSk7XG5lbmFibGVEaXNtaXNzVHJpZ2dlcihNb2RhbCk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKE1vZGFsKTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIG9mZmNhbnZhcy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDYgPSAnb2ZmY2FudmFzJztcbmNvbnN0IERBVEFfS0VZJDMgPSAnYnMub2ZmY2FudmFzJztcbmNvbnN0IEVWRU5UX0tFWSQzID0gYC4ke0RBVEFfS0VZJDN9YDtcbmNvbnN0IERBVEFfQVBJX0tFWSQxID0gJy5kYXRhLWFwaSc7XG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJJDIgPSBgbG9hZCR7RVZFTlRfS0VZJDN9JHtEQVRBX0FQSV9LRVkkMX1gO1xuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnO1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XJDMgPSAnc2hvdyc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkckMSA9ICdzaG93aW5nJztcbmNvbnN0IENMQVNTX05BTUVfSElESU5HID0gJ2hpZGluZyc7XG5jb25zdCBDTEFTU19OQU1FX0JBQ0tEUk9QID0gJ29mZmNhbnZhcy1iYWNrZHJvcCc7XG5jb25zdCBPUEVOX1NFTEVDVE9SID0gJy5vZmZjYW52YXMuc2hvdyc7XG5jb25zdCBFVkVOVF9TSE9XJDMgPSBgc2hvdyR7RVZFTlRfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDMgPSBgc2hvd24ke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9ISURFJDMgPSBgaGlkZSR7RVZFTlRfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9ISURERU4kMyA9IGBoaWRkZW4ke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9SRVNJWkUgPSBgcmVzaXplJHtFVkVOVF9LRVkkM31gO1xuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMSA9IGBjbGljayR7RVZFTlRfS0VZJDN9JHtEQVRBX0FQSV9LRVkkMX1gO1xuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZJDN9YDtcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDEgPSAnW2RhdGEtYnMtdG9nZ2xlPVwib2ZmY2FudmFzXCJdJztcbmNvbnN0IERlZmF1bHQkNSA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBzY3JvbGw6IGZhbHNlXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkNSA9IHtcbiAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAga2V5Ym9hcmQ6ICdib29sZWFuJyxcbiAgc2Nyb2xsOiAnYm9vbGVhbidcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE9mZmNhbnZhcyBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpO1xuICAgIHRoaXMuX2ZvY3VzdHJhcCA9IHRoaXMuX2luaXRpYWxpemVGb2N1c1RyYXAoKTtcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkNTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQ1O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQ2O1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcbiAgfVxuICBzaG93KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XJDMsIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICB9KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNTaG93biA9IHRydWU7XG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygpO1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCkge1xuICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLmhpZGUoKTtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCB0cnVlKTtcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XSU5HJDEpO1xuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwgfHwgdGhpcy5fY29uZmlnLmJhY2tkcm9wKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzdHJhcC5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQzKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkckMSk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiQzLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZUNhbGxCYWNrLCB0aGlzLl9lbGVtZW50LCB0cnVlKTtcbiAgfVxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFJDMpO1xuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpO1xuICAgIHRoaXMuX2VsZW1lbnQuYmx1cigpO1xuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURJTkcpO1xuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKTtcbiAgICBjb25zdCBjb21wbGV0ZUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQzLCBDTEFTU19OQU1FX0hJRElORyk7XG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCkge1xuICAgICAgICBuZXcgU2Nyb2xsQmFySGVscGVyKCkucmVzZXQoKTtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTiQzKTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsYmFjaywgdGhpcy5fZWxlbWVudCwgdHJ1ZSk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9iYWNrZHJvcC5kaXNwb3NlKCk7XG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplQmFja0Ryb3AoKSB7XG4gICAgY29uc3QgY2xpY2tDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3AgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfTtcblxuICAgIC8vICdzdGF0aWMnIG9wdGlvbiB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdHJ1ZSwgYW5kIGJvb2xlYW5zIHdpbGwga2VlcCB0aGVpciB2YWx1ZVxuICAgIGNvbnN0IGlzVmlzaWJsZSA9IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKTtcbiAgICByZXR1cm4gbmV3IEJhY2tkcm9wKHtcbiAgICAgIGNsYXNzTmFtZTogQ0xBU1NfTkFNRV9CQUNLRFJPUCxcbiAgICAgIGlzVmlzaWJsZSxcbiAgICAgIGlzQW5pbWF0ZWQ6IHRydWUsXG4gICAgICByb290RWxlbWVudDogdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLFxuICAgICAgY2xpY2tDYWxsYmFjazogaXNWaXNpYmxlID8gY2xpY2tDYWxsYmFjayA6IG51bGxcbiAgICB9KTtcbiAgfVxuICBfaW5pdGlhbGl6ZUZvY3VzVHJhcCgpIHtcbiAgICByZXR1cm4gbmV3IEZvY3VzVHJhcCh7XG4gICAgICB0cmFwRWxlbWVudDogdGhpcy5fZWxlbWVudFxuICAgIH0pO1xuICB9XG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ICE9PSBFU0NBUEVfS0VZKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZyk7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICB9XG4gICAgICBkYXRhW2NvbmZpZ10odGhpcyk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMSwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcyk7XG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4kMywgKCkgPT4ge1xuICAgIC8vIGZvY3VzIG9uIHRyaWdnZXIgd2hlbiBpdCBpcyBjbG9zZWRcbiAgICBpZiAoaXNWaXNpYmxlKHRoaXMpKSB7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIGEgdG9nZ2xlciBvZiBhbiBvZmZjYW52YXMsIHdoaWxlIGFub3RoZXIgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUik7XG4gIGlmIChhbHJlYWR5T3BlbiAmJiBhbHJlYWR5T3BlbiAhPT0gdGFyZ2V0KSB7XG4gICAgT2ZmY2FudmFzLmdldEluc3RhbmNlKGFscmVhZHlPcGVuKS5oaWRlKCk7XG4gIH1cbiAgY29uc3QgZGF0YSA9IE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG4gIGRhdGEudG9nZ2xlKHRoaXMpO1xufSk7XG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJJDIsICgpID0+IHtcbiAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBTZWxlY3RvckVuZ2luZS5maW5kKE9QRU5fU0VMRUNUT1IpKSB7XG4gICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2Uoc2VsZWN0b3IpLnNob3coKTtcbiAgfVxufSk7XG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUsICgpID0+IHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoJ1thcmlhLW1vZGFsXVtjbGFzcyo9c2hvd11bY2xhc3MqPW9mZmNhbnZhcy1dJykpIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJykge1xuICAgICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCkuaGlkZSgpO1xuICAgIH1cbiAgfVxufSk7XG5lbmFibGVEaXNtaXNzVHJpZ2dlcihPZmZjYW52YXMpO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihPZmZjYW52YXMpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zYW5pdGl6ZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vLyBqcy1kb2NzLXN0YXJ0IGFsbG93LWxpc3RcbmNvbnN0IEFSSUFfQVRUUklCVVRFX1BBVFRFUk4gPSAvXmFyaWEtW1xcdy1dKiQvaTtcbmNvbnN0IERlZmF1bHRBbGxvd2xpc3QgPSB7XG4gIC8vIEdsb2JhbCBhdHRyaWJ1dGVzIGFsbG93ZWQgb24gYW55IHN1cHBsaWVkIGVsZW1lbnQgYmVsb3cuXG4gICcqJzogWydjbGFzcycsICdkaXInLCAnaWQnLCAnbGFuZycsICdyb2xlJywgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTl0sXG4gIGE6IFsndGFyZ2V0JywgJ2hyZWYnLCAndGl0bGUnLCAncmVsJ10sXG4gIGFyZWE6IFtdLFxuICBiOiBbXSxcbiAgYnI6IFtdLFxuICBjb2w6IFtdLFxuICBjb2RlOiBbXSxcbiAgZGQ6IFtdLFxuICBkaXY6IFtdLFxuICBkbDogW10sXG4gIGR0OiBbXSxcbiAgZW06IFtdLFxuICBocjogW10sXG4gIGgxOiBbXSxcbiAgaDI6IFtdLFxuICBoMzogW10sXG4gIGg0OiBbXSxcbiAgaDU6IFtdLFxuICBoNjogW10sXG4gIGk6IFtdLFxuICBpbWc6IFsnc3JjJywgJ3NyY3NldCcsICdhbHQnLCAndGl0bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gIGxpOiBbXSxcbiAgb2w6IFtdLFxuICBwOiBbXSxcbiAgcHJlOiBbXSxcbiAgczogW10sXG4gIHNtYWxsOiBbXSxcbiAgc3BhbjogW10sXG4gIHN1YjogW10sXG4gIHN1cDogW10sXG4gIHN0cm9uZzogW10sXG4gIHU6IFtdLFxuICB1bDogW11cbn07XG4vLyBqcy1kb2NzLWVuZCBhbGxvdy1saXN0XG5cbmNvbnN0IHVyaUF0dHJpYnV0ZXMgPSBuZXcgU2V0KFsnYmFja2dyb3VuZCcsICdjaXRlJywgJ2hyZWYnLCAnaXRlbXR5cGUnLCAnbG9uZ2Rlc2MnLCAncG9zdGVyJywgJ3NyYycsICd4bGluazpocmVmJ10pO1xuXG4vKipcbiAqIEEgcGF0dGVybiB0aGF0IHJlY29nbml6ZXMgVVJMcyB0aGF0IGFyZSBzYWZlIHdydC4gWFNTIGluIFVSTCBuYXZpZ2F0aW9uXG4gKiBjb250ZXh0cy5cbiAqXG4gKiBTaG91dC1vdXQgdG8gQW5ndWxhciBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvMTUuMi44L3BhY2thZ2VzL2NvcmUvc3JjL3Nhbml0aXphdGlvbi91cmxfc2FuaXRpemVyLnRzI0wzOFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9iZXR0ZXItcmVnZXhcbmNvbnN0IFNBRkVfVVJMX1BBVFRFUk4gPSAvXig/IWphdmFzY3JpcHQ6KSg/OlthLXowLTkrLi1dKzp8W14mOi8/I10qKD86Wy8/I118JCkpL2k7XG5jb25zdCBhbGxvd2VkQXR0cmlidXRlID0gKGF0dHJpYnV0ZSwgYWxsb3dlZEF0dHJpYnV0ZUxpc3QpID0+IHtcbiAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoYWxsb3dlZEF0dHJpYnV0ZUxpc3QuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICBpZiAodXJpQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKFNBRkVfVVJMX1BBVFRFUk4udGVzdChhdHRyaWJ1dGUubm9kZVZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGVzIHRoZSBhdHRyaWJ1dGUuXG4gIHJldHVybiBhbGxvd2VkQXR0cmlidXRlTGlzdC5maWx0ZXIoYXR0cmlidXRlUmVnZXggPT4gYXR0cmlidXRlUmVnZXggaW5zdGFuY2VvZiBSZWdFeHApLnNvbWUocmVnZXggPT4gcmVnZXgudGVzdChhdHRyaWJ1dGVOYW1lKSk7XG59O1xuZnVuY3Rpb24gc2FuaXRpemVIdG1sKHVuc2FmZUh0bWwsIGFsbG93TGlzdCwgc2FuaXRpemVGdW5jdGlvbikge1xuICBpZiAoIXVuc2FmZUh0bWwubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuc2FmZUh0bWw7XG4gIH1cbiAgaWYgKHNhbml0aXplRnVuY3Rpb24gJiYgdHlwZW9mIHNhbml0aXplRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2FuaXRpemVGdW5jdGlvbih1bnNhZmVIdG1sKTtcbiAgfVxuICBjb25zdCBkb21QYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuICBjb25zdCBjcmVhdGVkRG9jdW1lbnQgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHVuc2FmZUh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgY29uc3QgZWxlbWVudHMgPSBbXS5jb25jYXQoLi4uY3JlYXRlZERvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbCgnKicpKTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFPYmplY3Qua2V5cyhhbGxvd0xpc3QpLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVMaXN0ID0gW10uY29uY2F0KC4uLmVsZW1lbnQuYXR0cmlidXRlcyk7XG4gICAgY29uc3QgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXS5jb25jYXQoYWxsb3dMaXN0WycqJ10gfHwgW10sIGFsbG93TGlzdFtlbGVtZW50TmFtZV0gfHwgW10pO1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUxpc3QpIHtcbiAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGFsbG93ZWRBdHRyaWJ1dGVzKSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUubm9kZU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY3JlYXRlZERvY3VtZW50LmJvZHkuaW5uZXJIVE1MO1xufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC90ZW1wbGF0ZS1mYWN0b3J5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkNSA9ICdUZW1wbGF0ZUZhY3RvcnknO1xuY29uc3QgRGVmYXVsdCQ0ID0ge1xuICBhbGxvd0xpc3Q6IERlZmF1bHRBbGxvd2xpc3QsXG4gIGNvbnRlbnQ6IHt9LFxuICAvLyB7IHNlbGVjdG9yIDogdGV4dCAsICBzZWxlY3RvcjIgOiB0ZXh0MiAsIH1cbiAgZXh0cmFDbGFzczogJycsXG4gIGh0bWw6IGZhbHNlLFxuICBzYW5pdGl6ZTogdHJ1ZSxcbiAgc2FuaXRpemVGbjogbnVsbCxcbiAgdGVtcGxhdGU6ICc8ZGl2PjwvZGl2Pidcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQ0ID0ge1xuICBhbGxvd0xpc3Q6ICdvYmplY3QnLFxuICBjb250ZW50OiAnb2JqZWN0JyxcbiAgZXh0cmFDbGFzczogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgaHRtbDogJ2Jvb2xlYW4nLFxuICBzYW5pdGl6ZTogJ2Jvb2xlYW4nLFxuICBzYW5pdGl6ZUZuOiAnKG51bGx8ZnVuY3Rpb24pJyxcbiAgdGVtcGxhdGU6ICdzdHJpbmcnXG59O1xuY29uc3QgRGVmYXVsdENvbnRlbnRUeXBlID0ge1xuICBlbnRyeTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbnxudWxsKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xlbGVtZW50KSdcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRlbXBsYXRlRmFjdG9yeSBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCQ0O1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJDQ7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJDU7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZ2V0Q29udGVudCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9jb25maWcuY29udGVudCkubWFwKGNvbmZpZyA9PiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb25maWcpKS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cbiAgaGFzQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb250ZW50KCkubGVuZ3RoID4gMDtcbiAgfVxuICBjaGFuZ2VDb250ZW50KGNvbnRlbnQpIHtcbiAgICB0aGlzLl9jaGVja0NvbnRlbnQoY29udGVudCk7XG4gICAgdGhpcy5fY29uZmlnLmNvbnRlbnQgPSB7XG4gICAgICAuLi50aGlzLl9jb25maWcuY29udGVudCxcbiAgICAgIC4uLmNvbnRlbnRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRvSHRtbCgpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZVdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0ZW1wbGF0ZVdyYXBwZXIuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZSh0aGlzLl9jb25maWcudGVtcGxhdGUpO1xuICAgIGZvciAoY29uc3QgW3NlbGVjdG9yLCB0ZXh0XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9jb25maWcuY29udGVudCkpIHtcbiAgICAgIHRoaXMuX3NldENvbnRlbnQodGVtcGxhdGVXcmFwcGVyLCB0ZXh0LCBzZWxlY3Rvcik7XG4gICAgfVxuICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVXcmFwcGVyLmNoaWxkcmVuWzBdO1xuICAgIGNvbnN0IGV4dHJhQ2xhc3MgPSB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcuZXh0cmFDbGFzcyk7XG4gICAgaWYgKGV4dHJhQ2xhc3MpIHtcbiAgICAgIHRlbXBsYXRlLmNsYXNzTGlzdC5hZGQoLi4uZXh0cmFDbGFzcy5zcGxpdCgnICcpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZykge1xuICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9jaGVja0NvbnRlbnQoY29uZmlnLmNvbnRlbnQpO1xuICB9XG4gIF9jaGVja0NvbnRlbnQoYXJnKSB7XG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGFyZykpIHtcbiAgICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoe1xuICAgICAgICBzZWxlY3RvcixcbiAgICAgICAgZW50cnk6IGNvbnRlbnRcbiAgICAgIH0sIERlZmF1bHRDb250ZW50VHlwZSk7XG4gICAgfVxuICB9XG4gIF9zZXRDb250ZW50KHRlbXBsYXRlLCBjb250ZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIHRlbXBsYXRlKTtcbiAgICBpZiAoIXRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250ZW50ID0gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oY29udGVudCk7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0VsZW1lbnQoY29udGVudCkpIHtcbiAgICAgIHRoaXMuX3B1dEVsZW1lbnRJblRlbXBsYXRlKGdldEVsZW1lbnQoY29udGVudCksIHRlbXBsYXRlRWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb25maWcuaHRtbCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuX21heWJlU2FuaXRpemUoY29udGVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gIH1cbiAgX21heWJlU2FuaXRpemUoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZSA/IHNhbml0aXplSHRtbChhcmcsIHRoaXMuX2NvbmZpZy5hbGxvd0xpc3QsIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZUZuKSA6IGFyZztcbiAgfVxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGUoYXJnLCBbdGhpc10pO1xuICB9XG4gIF9wdXRFbGVtZW50SW5UZW1wbGF0ZShlbGVtZW50LCB0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmh0bWwpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5hcHBlbmQoZWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHRvb2x0aXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQ0ID0gJ3Rvb2x0aXAnO1xuY29uc3QgRElTQUxMT1dFRF9BVFRSSUJVVEVTID0gbmV3IFNldChbJ3Nhbml0aXplJywgJ2FsbG93TGlzdCcsICdzYW5pdGl6ZUZuJ10pO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDIgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX01PREFMID0gJ21vZGFsJztcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQyID0gJ3Nob3cnO1xuY29uc3QgU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiA9ICcudG9vbHRpcC1pbm5lcic7XG5jb25zdCBTRUxFQ1RPUl9NT0RBTCA9IGAuJHtDTEFTU19OQU1FX01PREFMfWA7XG5jb25zdCBFVkVOVF9NT0RBTF9ISURFID0gJ2hpZGUuYnMubW9kYWwnO1xuY29uc3QgVFJJR0dFUl9IT1ZFUiA9ICdob3Zlcic7XG5jb25zdCBUUklHR0VSX0ZPQ1VTID0gJ2ZvY3VzJztcbmNvbnN0IFRSSUdHRVJfQ0xJQ0sgPSAnY2xpY2snO1xuY29uc3QgVFJJR0dFUl9NQU5VQUwgPSAnbWFudWFsJztcbmNvbnN0IEVWRU5UX0hJREUkMiA9ICdoaWRlJztcbmNvbnN0IEVWRU5UX0hJRERFTiQyID0gJ2hpZGRlbic7XG5jb25zdCBFVkVOVF9TSE9XJDIgPSAnc2hvdyc7XG5jb25zdCBFVkVOVF9TSE9XTiQyID0gJ3Nob3duJztcbmNvbnN0IEVWRU5UX0lOU0VSVEVEID0gJ2luc2VydGVkJztcbmNvbnN0IEVWRU5UX0NMSUNLJDEgPSAnY2xpY2snO1xuY29uc3QgRVZFTlRfRk9DVVNJTiQxID0gJ2ZvY3VzaW4nO1xuY29uc3QgRVZFTlRfRk9DVVNPVVQkMSA9ICdmb2N1c291dCc7XG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gJ21vdXNlZW50ZXInO1xuY29uc3QgRVZFTlRfTU9VU0VMRUFWRSA9ICdtb3VzZWxlYXZlJztcbmNvbnN0IEF0dGFjaG1lbnRNYXAgPSB7XG4gIEFVVE86ICdhdXRvJyxcbiAgVE9QOiAndG9wJyxcbiAgUklHSFQ6IGlzUlRMKCkgPyAnbGVmdCcgOiAncmlnaHQnLFxuICBCT1RUT006ICdib3R0b20nLFxuICBMRUZUOiBpc1JUTCgpID8gJ3JpZ2h0JyA6ICdsZWZ0J1xufTtcbmNvbnN0IERlZmF1bHQkMyA9IHtcbiAgYWxsb3dMaXN0OiBEZWZhdWx0QWxsb3dsaXN0LFxuICBhbmltYXRpb246IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgY29udGFpbmVyOiBmYWxzZSxcbiAgY3VzdG9tQ2xhc3M6ICcnLFxuICBkZWxheTogMCxcbiAgZmFsbGJhY2tQbGFjZW1lbnRzOiBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLFxuICBodG1sOiBmYWxzZSxcbiAgb2Zmc2V0OiBbMCwgNl0sXG4gIHBsYWNlbWVudDogJ3RvcCcsXG4gIHBvcHBlckNvbmZpZzogbnVsbCxcbiAgc2FuaXRpemU6IHRydWUsXG4gIHNhbml0aXplRm46IG51bGwsXG4gIHNlbGVjdG9yOiBmYWxzZSxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwidG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1hcnJvd1wiPjwvZGl2PicgKyAnPGRpdiBjbGFzcz1cInRvb2x0aXAtaW5uZXJcIj48L2Rpdj4nICsgJzwvZGl2PicsXG4gIHRpdGxlOiAnJyxcbiAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJ1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDMgPSB7XG4gIGFsbG93TGlzdDogJ29iamVjdCcsXG4gIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICBib3VuZGFyeTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICBjb250YWluZXI6ICcoc3RyaW5nfGVsZW1lbnR8Ym9vbGVhbiknLFxuICBjdXN0b21DbGFzczogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgZGVsYXk6ICcobnVtYmVyfG9iamVjdCknLFxuICBmYWxsYmFja1BsYWNlbWVudHM6ICdhcnJheScsXG4gIGh0bWw6ICdib29sZWFuJyxcbiAgb2Zmc2V0OiAnKGFycmF5fHN0cmluZ3xmdW5jdGlvbiknLFxuICBwbGFjZW1lbnQ6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBvcHBlckNvbmZpZzogJyhudWxsfG9iamVjdHxmdW5jdGlvbiknLFxuICBzYW5pdGl6ZTogJ2Jvb2xlYW4nLFxuICBzYW5pdGl6ZUZuOiAnKG51bGx8ZnVuY3Rpb24pJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGJvb2xlYW4pJyxcbiAgdGVtcGxhdGU6ICdzdHJpbmcnLFxuICB0aXRsZTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknLFxuICB0cmlnZ2VyOiAnc3RyaW5nJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVG9vbHRpcCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBpZiAodHlwZW9mIFBvcHBlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgdG9vbHRpcHMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKTtcbiAgICB9XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuX3RpbWVvdXQgPSAwO1xuICAgIHRoaXMuX2lzSG92ZXJlZCA9IG51bGw7XG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlciA9IHt9O1xuICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5ID0gbnVsbDtcbiAgICB0aGlzLl9uZXdDb250ZW50ID0gbnVsbDtcblxuICAgIC8vIFByb3RlY3RlZFxuICAgIHRoaXMudGlwID0gbnVsbDtcbiAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKTtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zZWxlY3Rvcikge1xuICAgICAgdGhpcy5fZml4VGl0bGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCQzO1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJDM7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJDQ7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZW5hYmxlKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gIH1cbiAgZGlzYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuICB0b2dnbGVFbmFibGVkKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9ICF0aGlzLl9pc0VuYWJsZWQ7XG4gIH1cbiAgdG9nZ2xlKCkge1xuICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhdGhpcy5fYWN0aXZlVHJpZ2dlci5jbGljaztcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLl9sZWF2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9lbnRlcigpO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcik7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpO1xuICAgIH1cbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJyk7XG4gICAgfVxuICAgIGlmICghKHRoaXMuX2lzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1ckMikpO1xuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBmaW5kU2hhZG93Um9vdCh0aGlzLl9lbGVtZW50KTtcbiAgICBjb25zdCBpc0luVGhlRG9tID0gKHNoYWRvd1Jvb3QgfHwgdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuY29udGFpbnModGhpcy5fZWxlbWVudCk7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFpc0luVGhlRG9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVE9ETzogdjYgcmVtb3ZlIHRoaXMgb3IgbWFrZSBpdCBvcHRpb25hbFxuICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKTtcbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUaXBFbGVtZW50KCk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXAuZ2V0QXR0cmlidXRlKCdpZCcpKTtcbiAgICBjb25zdCB7XG4gICAgICBjb250YWluZXJcbiAgICB9ID0gdGhpcy5fY29uZmlnO1xuICAgIGlmICghdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0aGlzLnRpcCkpIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmQodGlwKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0lOU0VSVEVEKSk7XG4gICAgfVxuICAgIHRoaXMuX3BvcHBlciA9IHRoaXMuX2NyZWF0ZVBvcHBlcih0aXApO1xuICAgIHRpcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQyKTtcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1dOJDIpKTtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2xlYXZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMudGlwLCB0aGlzLl9pc0FuaW1hdGVkKCkpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfSElERSQyKSk7XG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKTtcbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckMik7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0NMSUNLXSA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9GT0NVU10gPSBmYWxzZTtcbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfSE9WRVJdID0gZmFsc2U7XG4gICAgdGhpcy5faXNIb3ZlcmVkID0gbnVsbDsgLy8gaXQgaXMgYSB0cmljayB0byBzdXBwb3J0IG1hbnVhbCB0cmlnZ2VyaW5nXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0hJRERFTiQyKSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgfVxuICB1cGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb3RlY3RlZFxuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9nZXRUaXRsZSgpKTtcbiAgfVxuICBfZ2V0VGlwRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMuX2NyZWF0ZVRpcEVsZW1lbnQodGhpcy5fbmV3Q29udGVudCB8fCB0aGlzLl9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRpcDtcbiAgfVxuICBfY3JlYXRlVGlwRWxlbWVudChjb250ZW50KSB7XG4gICAgY29uc3QgdGlwID0gdGhpcy5fZ2V0VGVtcGxhdGVGYWN0b3J5KGNvbnRlbnQpLnRvSHRtbCgpO1xuXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgY2hlY2sgaW4gdjZcbiAgICBpZiAoIXRpcCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfRkFERSQyLCBDTEFTU19OQU1FX1NIT1ckMik7XG4gICAgLy8gVE9ETzogdjYgdGhlIGZvbGxvd2luZyBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBDU1Mgb25seVxuICAgIHRpcC5jbGFzc0xpc3QuYWRkKGBicy0ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXV0b2ApO1xuICAgIGNvbnN0IHRpcElkID0gZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSkudG9TdHJpbmcoKTtcbiAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKTtcbiAgICBpZiAodGhpcy5faXNBbmltYXRlZCgpKSB7XG4gICAgICB0aXAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUkMik7XG4gICAgfVxuICAgIHJldHVybiB0aXA7XG4gIH1cbiAgc2V0Q29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fbmV3Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpO1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfVxuICB9XG4gIF9nZXRUZW1wbGF0ZUZhY3RvcnkoY29udGVudCkge1xuICAgIGlmICh0aGlzLl90ZW1wbGF0ZUZhY3RvcnkpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeS5jaGFuZ2VDb250ZW50KGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkgPSBuZXcgVGVtcGxhdGVGYWN0b3J5KHtcbiAgICAgICAgLi4udGhpcy5fY29uZmlnLFxuICAgICAgICAvLyB0aGUgYGNvbnRlbnRgIHZhciBoYXMgdG8gYmUgYWZ0ZXIgYHRoaXMuX2NvbmZpZ2BcbiAgICAgICAgLy8gdG8gb3ZlcnJpZGUgY29uZmlnLmNvbnRlbnQgaW4gY2FzZSBvZiBwb3BvdmVyXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGV4dHJhQ2xhc3M6IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jdXN0b21DbGFzcylcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVGYWN0b3J5O1xuICB9XG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9UT09MVElQX0lOTkVSXTogdGhpcy5fZ2V0VGl0bGUoKVxuICAgIH07XG4gIH1cbiAgX2dldFRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcudGl0bGUpIHx8IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJyk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRPckNyZWF0ZUluc3RhbmNlKGV2ZW50LmRlbGVnYXRlVGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgfVxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmFuaW1hdGlvbiB8fCB0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDIpO1xuICB9XG4gIF9pc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XJDIpO1xuICB9XG4gIF9jcmVhdGVQb3BwZXIodGlwKSB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gZXhlY3V0ZSh0aGlzLl9jb25maWcucGxhY2VtZW50LCBbdGhpcywgdGlwLCB0aGlzLl9lbGVtZW50XSk7XG4gICAgY29uc3QgYXR0YWNobWVudCA9IEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgIHJldHVybiBQb3BwZXIuY3JlYXRlUG9wcGVyKHRoaXMuX2VsZW1lbnQsIHRpcCwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpKTtcbiAgfVxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9mZnNldFxuICAgIH0gPSB0aGlzLl9jb25maWc7XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0LnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBwb3BwZXJEYXRhID0+IG9mZnNldChwb3BwZXJEYXRhLCB0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGUoYXJnLCBbdGhpcy5fZWxlbWVudF0pO1xuICB9XG4gIF9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkge1xuICAgIGNvbnN0IGRlZmF1bHRCc1BvcHBlckNvbmZpZyA9IHtcbiAgICAgIHBsYWNlbWVudDogYXR0YWNobWVudCxcbiAgICAgIG1vZGlmaWVyczogW3tcbiAgICAgICAgbmFtZTogJ2ZsaXAnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiB0aGlzLl9jb25maWcuZmFsbGJhY2tQbGFjZW1lbnRzXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBib3VuZGFyeTogdGhpcy5fY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVsZW1lbnQ6IGAuJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWFycm93YFxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIG5hbWU6ICdwcmVTZXRQbGFjZW1lbnQnLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBwaGFzZTogJ2JlZm9yZU1haW4nLFxuICAgICAgICBmbjogZGF0YSA9PiB7XG4gICAgICAgICAgLy8gUHJlLXNldCBQb3BwZXIncyBwbGFjZW1lbnQgYXR0cmlidXRlIGluIG9yZGVyIHRvIHJlYWQgdGhlIGFycm93IHNpemVzIHByb3Blcmx5LlxuICAgICAgICAgIC8vIE90aGVyd2lzZSwgUG9wcGVyIG1peGVzIHVwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRpbWVuc2lvbnMgc2luY2UgdGhlIGluaXRpYWwgYXJyb3cgc3R5bGUgaXMgZm9yIHRvcCBwbGFjZW1lbnRcbiAgICAgICAgICB0aGlzLl9nZXRUaXBFbGVtZW50KCkuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHBlci1wbGFjZW1lbnQnLCBkYXRhLnN0YXRlLnBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbZGVmYXVsdEJzUG9wcGVyQ29uZmlnXSlcbiAgICB9O1xuICB9XG4gIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzLl9jb25maWcudHJpZ2dlci5zcGxpdCgnICcpO1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2Vycykge1xuICAgICAgaWYgKHRyaWdnZXIgPT09ICdjbGljaycpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0NMSUNLJDEpLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgICBjb250ZXh0LnRvZ2dsZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPT0gVFJJR0dFUl9NQU5VQUwpIHtcbiAgICAgICAgY29uc3QgZXZlbnRJbiA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgPyB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9NT1VTRUVOVEVSKSA6IHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTSU4kMSk7XG4gICAgICAgIGNvbnN0IGV2ZW50T3V0ID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/IHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX01PVVNFTEVBVkUpIDogdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfRk9DVVNPVVQkMSk7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudEluLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c2luJyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9IHRydWU7XG4gICAgICAgICAgY29udGV4dC5fZW50ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudE91dCwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudCk7XG4gICAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNvdXQnID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID0gY29udGV4dC5fZWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faGlkZU1vZGFsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9NT0RBTCksIEVWRU5UX01PREFMX0hJREUsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpO1xuICB9XG4gIF9maXhUaXRsZSgpIHtcbiAgICBjb25zdCB0aXRsZSA9IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpICYmICF0aGlzLl9lbGVtZW50LnRleHRDb250ZW50LnRyaW0oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSk7XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJywgdGl0bGUpOyAvLyBETyBOT1QgVVNFIElULiBJcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpO1xuICB9XG4gIF9lbnRlcigpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpIHx8IHRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LnNob3cpO1xuICB9XG4gIF9sZWF2ZSgpIHtcbiAgICBpZiAodGhpcy5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3NldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LmhpZGUpO1xuICB9XG4gIF9zZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dCk7XG4gIH1cbiAgX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fYWN0aXZlVHJpZ2dlcikuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25zdCBkYXRhQXR0cmlidXRlcyA9IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgZGF0YUF0dHJpYnV0ZSBvZiBPYmplY3Qua2V5cyhkYXRhQXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChESVNBTExPV0VEX0FUVFJJQlVURVMuaGFzKGRhdGFBdHRyaWJ1dGUpKSB7XG4gICAgICAgIGRlbGV0ZSBkYXRhQXR0cmlidXRlc1tkYXRhQXR0cmlidXRlXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uZGF0YUF0dHJpYnV0ZXMsXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pXG4gICAgfTtcbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpO1xuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKTtcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy5jb250YWluZXIgPSBjb25maWcuY29udGFpbmVyID09PSBmYWxzZSA/IGRvY3VtZW50LmJvZHkgOiBnZXRFbGVtZW50KGNvbmZpZy5jb250YWluZXIpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLmRlbGF5ID0ge1xuICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgIGhpZGU6IGNvbmZpZy5kZWxheVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcuY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy5jb250ZW50ID0gY29uZmlnLmNvbnRlbnQudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnKSkge1xuICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtrZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBjb25maWdba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25maWcuc2VsZWN0b3IgPSBmYWxzZTtcbiAgICBjb25maWcudHJpZ2dlciA9ICdtYW51YWwnO1xuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgcmVwbGFjZWQgd2l0aDpcbiAgICAvLyBjb25zdCBrZXlzV2l0aERpZmZlcmVudFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykuZmlsdGVyKGVudHJ5ID0+IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlbnRyeVswXV0gIT09IHRoaXMuX2NvbmZpZ1tlbnRyeVswXV0pXG4gICAgLy8gYE9iamVjdC5mcm9tRW50cmllcyhrZXlzV2l0aERpZmZlcmVudFZhbHVlcylgXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZGlzcG9zZVBvcHBlcigpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcC5yZW1vdmUoKTtcbiAgICAgIHRoaXMudGlwID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUb29sdGlwLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKTtcbiAgICAgIH1cbiAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvb2x0aXApO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgcG9wb3Zlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDMgPSAncG9wb3Zlcic7XG5jb25zdCBTRUxFQ1RPUl9USVRMRSA9ICcucG9wb3Zlci1oZWFkZXInO1xuY29uc3QgU0VMRUNUT1JfQ09OVEVOVCA9ICcucG9wb3Zlci1ib2R5JztcbmNvbnN0IERlZmF1bHQkMiA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0LFxuICBjb250ZW50OiAnJyxcbiAgb2Zmc2V0OiBbMCwgOF0sXG4gIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1hcnJvd1wiPjwvZGl2PicgKyAnPGgzIGNsYXNzPVwicG9wb3Zlci1oZWFkZXJcIj48L2gzPicgKyAnPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPjwvZGl2PicgKyAnPC9kaXY+JyxcbiAgdHJpZ2dlcjogJ2NsaWNrJ1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDIgPSB7XG4gIC4uLlRvb2x0aXAuRGVmYXVsdFR5cGUsXG4gIGNvbnRlbnQ6ICcobnVsbHxzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBQb3BvdmVyIGV4dGVuZHMgVG9vbHRpcCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDI7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkMjtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkMztcbiAgfVxuXG4gIC8vIE92ZXJyaWRlc1xuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VGl0bGUoKSB8fCB0aGlzLl9nZXRDb250ZW50KCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9USVRMRV06IHRoaXMuX2dldFRpdGxlKCksXG4gICAgICBbU0VMRUNUT1JfQ09OVEVOVF06IHRoaXMuX2dldENvbnRlbnQoKVxuICAgIH07XG4gIH1cbiAgX2dldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jb250ZW50KTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFBvcG92ZXIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oUG9wb3Zlcik7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBzY3JvbGxzcHkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQyID0gJ3Njcm9sbHNweSc7XG5jb25zdCBEQVRBX0tFWSQyID0gJ2JzLnNjcm9sbHNweSc7XG5jb25zdCBFVkVOVF9LRVkkMiA9IGAuJHtEQVRBX0tFWSQyfWA7XG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbmNvbnN0IEVWRU5UX0FDVElWQVRFID0gYGFjdGl2YXRlJHtFVkVOVF9LRVkkMn1gO1xuY29uc3QgRVZFTlRfQ0xJQ0sgPSBgY2xpY2ske0VWRU5UX0tFWSQyfWA7XG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJJDEgPSBgbG9hZCR7RVZFTlRfS0VZJDJ9JHtEQVRBX0FQSV9LRVl9YDtcbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fSVRFTSA9ICdkcm9wZG93bi1pdGVtJztcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFJDEgPSAnYWN0aXZlJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU1BZID0gJ1tkYXRhLWJzLXNweT1cInNjcm9sbFwiXSc7XG5jb25zdCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MgPSAnW2hyZWZdJztcbmNvbnN0IFNFTEVDVE9SX05BVl9MSVNUX0dST1VQID0gJy5uYXYsIC5saXN0LWdyb3VwJztcbmNvbnN0IFNFTEVDVE9SX05BVl9MSU5LUyA9ICcubmF2LWxpbmsnO1xuY29uc3QgU0VMRUNUT1JfTkFWX0lURU1TID0gJy5uYXYtaXRlbSc7XG5jb25zdCBTRUxFQ1RPUl9MSVNUX0lURU1TID0gJy5saXN0LWdyb3VwLWl0ZW0nO1xuY29uc3QgU0VMRUNUT1JfTElOS19JVEVNUyA9IGAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTkFWX0lURU1TfSA+ICR7U0VMRUNUT1JfTkFWX0xJTktTfSwgJHtTRUxFQ1RPUl9MSVNUX0lURU1TfWA7XG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTiA9ICcuZHJvcGRvd24nO1xuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFJDEgPSAnLmRyb3Bkb3duLXRvZ2dsZSc7XG5jb25zdCBEZWZhdWx0JDEgPSB7XG4gIG9mZnNldDogbnVsbCxcbiAgLy8gVE9ETzogdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJzBweCAwcHggLTI1JScsXG4gIHNtb290aFNjcm9sbDogZmFsc2UsXG4gIHRhcmdldDogbnVsbCxcbiAgdGhyZXNob2xkOiBbMC4xLCAwLjUsIDFdXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkMSA9IHtcbiAgb2Zmc2V0OiAnKG51bWJlcnxudWxsKScsXG4gIC8vIFRPRE8gdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJ3N0cmluZycsXG4gIHNtb290aFNjcm9sbDogJ2Jvb2xlYW4nLFxuICB0YXJnZXQ6ICdlbGVtZW50JyxcbiAgdGhyZXNob2xkOiAnYXJyYXknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxTcHkgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcblxuICAgIC8vIHRoaXMuX2VsZW1lbnQgaXMgdGhlIG9ic2VydmFibGVzQ29udGFpbmVyIGFuZCBjb25maWcudGFyZ2V0IHRoZSBtZW51IGxpbmtzIHdyYXBwZXJcbiAgICB0aGlzLl90YXJnZXRMaW5rcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX2VsZW1lbnQpLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnID8gbnVsbCA6IHRoaXMuX2VsZW1lbnQ7XG4gICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLl9vYnNlcnZlciA9IG51bGw7XG4gICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhID0ge1xuICAgICAgdmlzaWJsZUVudHJ5VG9wOiAwLFxuICAgICAgcGFyZW50U2Nyb2xsVG9wOiAwXG4gICAgfTtcbiAgICB0aGlzLnJlZnJlc2goKTsgLy8gaW5pdGlhbGl6ZVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkMTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQxO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQyO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcygpO1xuICAgIHRoaXMuX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCk7XG4gICAgaWYgKHRoaXMuX29ic2VydmVyKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29ic2VydmVyID0gdGhpcy5fZ2V0TmV3T2JzZXJ2ZXIoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZShzZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyBUT0RPOiBvbiB2NiB0YXJnZXQgc2hvdWxkIGJlIGdpdmVuIGV4cGxpY2l0bHkgJiByZW1vdmUgdGhlIHt0YXJnZXQ6ICdzcy10YXJnZXQnfSBjYXNlXG4gICAgY29uZmlnLnRhcmdldCA9IGdldEVsZW1lbnQoY29uZmlnLnRhcmdldCkgfHwgZG9jdW1lbnQuYm9keTtcblxuICAgIC8vIFRPRE86IHY2IE9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIFVzZSByb290TWFyZ2luIG9ubHlcbiAgICBjb25maWcucm9vdE1hcmdpbiA9IGNvbmZpZy5vZmZzZXQgPyBgJHtjb25maWcub2Zmc2V0fXB4IDBweCAtMzAlYCA6IGNvbmZpZy5yb290TWFyZ2luO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnRocmVzaG9sZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZy50aHJlc2hvbGQgPSBjb25maWcudGhyZXNob2xkLnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNtb290aFNjcm9sbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVucmVnaXN0ZXIgYW55IHByZXZpb3VzIGxpc3RlbmVyc1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fY29uZmlnLnRhcmdldCwgRVZFTlRfQ0xJQ0spO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSywgU0VMRUNUT1JfVEFSR0VUX0xJTktTLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5nZXQoZXZlbnQudGFyZ2V0Lmhhc2gpO1xuICAgICAgaWYgKG9ic2VydmFibGVTZWN0aW9uKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290RWxlbWVudCB8fCB3aW5kb3c7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG9ic2VydmFibGVTZWN0aW9uLm9mZnNldFRvcCAtIHRoaXMuX2VsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICBpZiAocm9vdC5zY3JvbGxUbykge1xuICAgICAgICAgIHJvb3Quc2Nyb2xsVG8oe1xuICAgICAgICAgICAgdG9wOiBoZWlnaHQsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaHJvbWUgNjAgZG9lc24ndCBzdXBwb3J0IGBzY3JvbGxUb2BcbiAgICAgICAgcm9vdC5zY3JvbGxUb3AgPSBoZWlnaHQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgX2dldE5ld09ic2VydmVyKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290OiB0aGlzLl9yb290RWxlbWVudCxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fY29uZmlnLnRocmVzaG9sZCxcbiAgICAgIHJvb3RNYXJnaW46IHRoaXMuX2NvbmZpZy5yb290TWFyZ2luXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4gdGhpcy5fb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBUaGUgbG9naWMgb2Ygc2VsZWN0aW9uXG4gIF9vYnNlcnZlckNhbGxiYWNrKGVudHJpZXMpIHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZW50cnkgPT4gdGhpcy5fdGFyZ2V0TGlua3MuZ2V0KGAjJHtlbnRyeS50YXJnZXQuaWR9YCk7XG4gICAgY29uc3QgYWN0aXZhdGUgPSBlbnRyeSA9PiB7XG4gICAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcDtcbiAgICAgIHRoaXMuX3Byb2Nlc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpO1xuICAgIH07XG4gICAgY29uc3QgcGFyZW50U2Nyb2xsVG9wID0gKHRoaXMuX3Jvb3RFbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHVzZXJTY3JvbGxzRG93biA9IHBhcmVudFNjcm9sbFRvcCA+PSB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEucGFyZW50U2Nyb2xsVG9wO1xuICAgIHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3AgPSBwYXJlbnRTY3JvbGxUb3A7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NsZWFyQWN0aXZlQ2xhc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cyA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcDtcbiAgICAgIC8vIGlmIHdlIGFyZSBzY3JvbGxpbmcgZG93biwgcGljayB0aGUgYmlnZ2VyIG9mZnNldFRvcFxuICAgICAgaWYgKHVzZXJTY3JvbGxzRG93biAmJiBlbnRyeUlzTG93ZXJUaGFuUHJldmlvdXMpIHtcbiAgICAgICAgYWN0aXZhdGUoZW50cnkpO1xuICAgICAgICAvLyBpZiBwYXJlbnQgaXNuJ3Qgc2Nyb2xsZWQsIGxldCdzIGtlZXAgdGhlIGZpcnN0IHZpc2libGUgaXRlbSwgYnJlYWtpbmcgdGhlIGl0ZXJhdGlvblxuICAgICAgICBpZiAoIXBhcmVudFNjcm9sbFRvcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyB1cCwgcGljayB0aGUgc21hbGxlc3Qgb2Zmc2V0VG9wXG4gICAgICBpZiAoIXVzZXJTY3JvbGxzRG93biAmJiAhZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2luaXRpYWxpemVUYXJnZXRzQW5kT2JzZXJ2YWJsZXMoKSB7XG4gICAgdGhpcy5fdGFyZ2V0TGlua3MgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IHRhcmdldExpbmtzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9UQVJHRVRfTElOS1MsIHRoaXMuX2NvbmZpZy50YXJnZXQpO1xuICAgIGZvciAoY29uc3QgYW5jaG9yIG9mIHRhcmdldExpbmtzKSB7XG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgYW5jaG9yIGhhcyBhbiBpZCBhbmQgaXMgbm90IGRpc2FibGVkXG4gICAgICBpZiAoIWFuY2hvci5oYXNoIHx8IGlzRGlzYWJsZWQoYW5jaG9yKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmFibGVTZWN0aW9uID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCB0aGlzLl9lbGVtZW50KTtcblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG9ic2VydmFibGVTZWN0aW9uIGV4aXN0cyAmIGlzIHZpc2libGVcbiAgICAgIGlmIChpc1Zpc2libGUob2JzZXJ2YWJsZVNlY3Rpb24pKSB7XG4gICAgICAgIHRoaXMuX3RhcmdldExpbmtzLnNldChkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCBhbmNob3IpO1xuICAgICAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMuc2V0KGFuY2hvci5oYXNoLCBvYnNlcnZhYmxlU2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9wcm9jZXNzKHRhcmdldCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRoaXMuX2NvbmZpZy50YXJnZXQpO1xuICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IHRhcmdldDtcbiAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICB0aGlzLl9hY3RpdmF0ZVBhcmVudHModGFyZ2V0KTtcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9BQ1RJVkFURSwge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG4gIH1cbiAgX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpIHtcbiAgICAvLyBBY3RpdmF0ZSBkcm9wZG93biBwYXJlbnRzXG4gICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUkMSwgdGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfRFJPUERPV04pKS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxpc3RHcm91cCBvZiBTZWxlY3RvckVuZ2luZS5wYXJlbnRzKHRhcmdldCwgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApKSB7XG4gICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAvLyBXaXRoIGJvdGggPHVsPiBhbmQgPG5hdj4gbWFya3VwIGEgcGFyZW50IGlzIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGFueSBuYXYgYW5jZXN0b3JcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBTZWxlY3RvckVuZ2luZS5wcmV2KGxpc3RHcm91cCwgU0VMRUNUT1JfTElOS19JVEVNUykpIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfY2xlYXJBY3RpdmVDbGFzcyhwYXJlbnQpIHtcbiAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICBjb25zdCBhY3RpdmVOb2RlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoYCR7U0VMRUNUT1JfVEFSR0VUX0xJTktTfS4ke0NMQVNTX05BTUVfQUNUSVZFJDF9YCwgcGFyZW50KTtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgYWN0aXZlTm9kZXMpIHtcbiAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBTY3JvbGxTcHkuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEkkMSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHNweSBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfU1BZKSkge1xuICAgIFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHNweSk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihTY3JvbGxTcHkpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdGFiLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkMSA9ICd0YWInO1xuY29uc3QgREFUQV9LRVkkMSA9ICdicy50YWInO1xuY29uc3QgRVZFTlRfS0VZJDEgPSBgLiR7REFUQV9LRVkkMX1gO1xuY29uc3QgRVZFTlRfSElERSQxID0gYGhpZGUke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9ISURERU4kMSA9IGBoaWRkZW4ke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9TSE9XJDEgPSBgc2hvdyR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDEgPSBgc2hvd24ke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0tFWURPV04gPSBga2V5ZG93biR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCc7XG5jb25zdCBBUlJPV19SSUdIVF9LRVkgPSAnQXJyb3dSaWdodCc7XG5jb25zdCBBUlJPV19VUF9LRVkgPSAnQXJyb3dVcCc7XG5jb25zdCBBUlJPV19ET1dOX0tFWSA9ICdBcnJvd0Rvd24nO1xuY29uc3QgSE9NRV9LRVkgPSAnSG9tZSc7XG5jb25zdCBFTkRfS0VZID0gJ0VuZCc7XG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDEgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckMSA9ICdzaG93JztcbmNvbnN0IENMQVNTX0RST1BET1dOID0gJ2Ryb3Bkb3duJztcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJztcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnO1xuY29uc3QgTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9IGA6bm90KCR7U0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSlgO1xuY29uc3QgU0VMRUNUT1JfVEFCX1BBTkVMID0gJy5saXN0LWdyb3VwLCAubmF2LCBbcm9sZT1cInRhYmxpc3RcIl0nO1xuY29uc3QgU0VMRUNUT1JfT1VURVIgPSAnLm5hdi1pdGVtLCAubGlzdC1ncm91cC1pdGVtJztcbmNvbnN0IFNFTEVDVE9SX0lOTkVSID0gYC5uYXYtbGluayR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0sIC5saXN0LWdyb3VwLWl0ZW0ke05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9LCBbcm9sZT1cInRhYlwiXSR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX1gO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdLCBbZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCBbZGF0YS1icy10b2dnbGU9XCJsaXN0XCJdJzsgLy8gVE9ETzogY291bGQgb25seSBiZSBgdGFiYCBpbiB2NlxuY29uc3QgU0VMRUNUT1JfSU5ORVJfRUxFTSA9IGAke1NFTEVDVE9SX0lOTkVSfSwgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX1gO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfQUNUSVZFID0gYC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwicGlsbFwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXWA7XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRhYiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX1RBQl9QQU5FTCk7XG4gICAgaWYgKCF0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICAgIC8vIFRPRE86IHNob3VsZCB0aHJvdyBleGNlcHRpb24gaW4gdjZcbiAgICAgIC8vIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZWxlbWVudC5vdXRlckhUTUx9IGhhcyBub3QgYSB2YWxpZCBwYXJlbnQgJHtTRUxFQ1RPUl9JTk5FUl9FTEVNfWApXG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGluaXRpYWwgYXJpYSBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXModGhpcy5fcGFyZW50LCB0aGlzLl9nZXRDaGlsZHJlbigpKTtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkMTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkge1xuICAgIC8vIFNob3dzIHRoaXMgZWxlbSBhbmQgZGVhY3RpdmF0ZSB0aGUgYWN0aXZlIHNpYmxpbmcgaWYgZXhpc3RzXG4gICAgY29uc3QgaW5uZXJFbGVtID0gdGhpcy5fZWxlbWVudDtcbiAgICBpZiAodGhpcy5fZWxlbUlzQWN0aXZlKGlubmVyRWxlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZm9yIGFjdGl2ZSB0YWIgb24gc2FtZSBwYXJlbnQgdG8gZGVhY3RpdmF0ZSBpdFxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW0oKTtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBhY3RpdmUgPyBFdmVudEhhbmRsZXIudHJpZ2dlcihhY3RpdmUsIEVWRU5UX0hJREUkMSwge1xuICAgICAgcmVsYXRlZFRhcmdldDogaW5uZXJFbGVtXG4gICAgfSkgOiBudWxsO1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKGlubmVyRWxlbSwgRVZFTlRfU0hPVyQxLCB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiBhY3RpdmVcbiAgICB9KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgaGlkZUV2ZW50ICYmIGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2RlYWN0aXZhdGUoYWN0aXZlLCBpbm5lckVsZW0pO1xuICAgIHRoaXMuX2FjdGl2YXRlKGlubmVyRWxlbSwgYWN0aXZlKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2FjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgdGhpcy5fYWN0aXZhdGUoU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSk7IC8vIFNlYXJjaCBhbmQgYWN0aXZhdGUvc2hvdyB0aGUgcHJvcGVyIHNlY3Rpb25cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgIT09ICd0YWInKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCB0cnVlKTtcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIHRydWUpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoZWxlbWVudCwgRVZFTlRfU0hPV04kMSwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkRWxlbVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUkMSkpO1xuICB9XG4gIF9kZWFjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgZWxlbWVudC5ibHVyKCk7XG4gICAgdGhpcy5fZGVhY3RpdmF0ZShTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpKTsgLy8gU2VhcmNoIGFuZCBkZWFjdGl2YXRlIHRoZSBzaG93biBzZWN0aW9uIHRvb1xuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGVsZW1lbnQsIEVWRU5UX0hJRERFTiQxLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRFbGVtXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIGVsZW1lbnQsIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSQxKSk7XG4gIH1cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIVtBUlJPV19MRUZUX0tFWSwgQVJST1dfUklHSFRfS0VZLCBBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBIT01FX0tFWSwgRU5EX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gc3RvcFByb3BhZ2F0aW9uL3ByZXZlbnREZWZhdWx0IGJvdGggYWRkZWQgdG8gc3VwcG9ydCB1cC9kb3duIGtleXMgd2l0aG91dCBzY3JvbGxpbmcgdGhlIHBhZ2VcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maWx0ZXIoZWxlbWVudCA9PiAhaXNEaXNhYmxlZChlbGVtZW50KSk7XG4gICAgbGV0IG5leHRBY3RpdmVFbGVtZW50O1xuICAgIGlmIChbSE9NRV9LRVksIEVORF9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50ID0gY2hpbGRyZW5bZXZlbnQua2V5ID09PSBIT01FX0tFWSA/IDAgOiBjaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNOZXh0ID0gW0FSUk9XX1JJR0hUX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSk7XG4gICAgICBuZXh0QWN0aXZlRWxlbWVudCA9IGdldE5leHRBY3RpdmVFbGVtZW50KGNoaWxkcmVuLCBldmVudC50YXJnZXQsIGlzTmV4dCwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChuZXh0QWN0aXZlRWxlbWVudCkge1xuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKG5leHRBY3RpdmVFbGVtZW50KS5zaG93KCk7XG4gICAgfVxuICB9XG4gIF9nZXRDaGlsZHJlbigpIHtcbiAgICAvLyBjb2xsZWN0aW9uIG9mIGlubmVyIGVsZW1lbnRzXG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSU5ORVJfRUxFTSwgdGhpcy5fcGFyZW50KTtcbiAgfVxuICBfZ2V0QWN0aXZlRWxlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maW5kKGNoaWxkID0+IHRoaXMuX2VsZW1Jc0FjdGl2ZShjaGlsZCkpIHx8IG51bGw7XG4gIH1cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzKHBhcmVudCwgY2hpbGRyZW4pIHtcbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhwYXJlbnQsICdyb2xlJywgJ3RhYmxpc3QnKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpO1xuICAgIH1cbiAgfVxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkKGNoaWxkKSB7XG4gICAgY2hpbGQgPSB0aGlzLl9nZXRJbm5lckVsZW1lbnQoY2hpbGQpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKTtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoY2hpbGQpO1xuICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIGlzQWN0aXZlKTtcbiAgICBpZiAob3V0ZXJFbGVtICE9PSBjaGlsZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMob3V0ZXJFbGVtLCAncm9sZScsICdwcmVzZW50YXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhjaGlsZCwgJ3JvbGUnLCAndGFiJyk7XG5cbiAgICAvLyBzZXQgYXR0cmlidXRlcyB0byB0aGUgcmVsYXRlZCBwYW5lbCB0b29cbiAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpO1xuICB9XG4gIF9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGNoaWxkKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdyb2xlJywgJ3RhYnBhbmVsJyk7XG4gICAgaWYgKGNoaWxkLmlkKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdhcmlhLWxhYmVsbGVkYnknLCBgJHtjaGlsZC5pZH1gKTtcbiAgICB9XG4gIH1cbiAgX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIG9wZW4pIHtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKCFvdXRlckVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX0RST1BET1dOKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b2dnbGUgPSAoc2VsZWN0b3IsIGNsYXNzTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIG91dGVyRWxlbSk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lLCBvcGVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRvZ2dsZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICB0b2dnbGUoU0VMRUNUT1JfRFJPUERPV05fTUVOVSwgQ0xBU1NfTkFNRV9TSE9XJDEpO1xuICAgIG91dGVyRWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBvcGVuKTtcbiAgfVxuICBfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIF9lbGVtSXNBY3RpdmUoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSk7XG4gIH1cblxuICAvLyBUcnkgdG8gZ2V0IHRoZSBpbm5lciBlbGVtZW50ICh1c3VhbGx5IHRoZSAubmF2LWxpbmspXG4gIF9nZXRJbm5lckVsZW1lbnQoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLm1hdGNoZXMoU0VMRUNUT1JfSU5ORVJfRUxFTSkgPyBlbGVtIDogU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9JTk5FUl9FTEVNLCBlbGVtKTtcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIG91dGVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtaXRlbSlcbiAgX2dldE91dGVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xvc2VzdChTRUxFQ1RPUl9PVVRFUikgfHwgZWxlbTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgaWYgKGlzRGlzYWJsZWQodGhpcykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykuc2hvdygpO1xufSk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBvbiBmb2N1c1xuICovXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSkpIHtcbiAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50KTtcbiAgfVxufSk7XG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUYWIpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdG9hc3QuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICd0b2FzdCc7XG5jb25zdCBEQVRBX0tFWSA9ICdicy50b2FzdCc7XG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YDtcbmNvbnN0IEVWRU5UX01PVVNFT1ZFUiA9IGBtb3VzZW92ZXIke0VWRU5UX0tFWX1gO1xuY29uc3QgRVZFTlRfTU9VU0VPVVQgPSBgbW91c2VvdXQke0VWRU5UX0tFWX1gO1xuY29uc3QgRVZFTlRfRk9DVVNJTiA9IGBmb2N1c2luJHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gYGZvY3Vzb3V0JHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWA7XG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWA7XG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWA7XG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX0hJREUgPSAnaGlkZSc7IC8vIEBkZXByZWNhdGVkIC0ga2VwdCBoZXJlIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdyc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkcgPSAnc2hvd2luZyc7XG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gIGF1dG9oaWRlOiAnYm9vbGVhbicsXG4gIGRlbGF5OiAnbnVtYmVyJ1xufTtcbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgYXV0b2hpZGU6IHRydWUsXG4gIGRlbGF5OiA1MDAwXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUb2FzdCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5fc2V0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdDtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUU7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdygpIHtcbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XKTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0KCk7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpO1xuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04pO1xuICAgICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKTtcbiAgICB9O1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpOyAvLyBAZGVwcmVjYXRlZFxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XLCBDTEFTU19OQU1FX1NIT1dJTkcpO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2NvbmZpZy5hbmltYXRpb24pO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURFKTsgLy8gQGRlcHJlY2F0ZWRcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcsIENMQVNTX05BTUVfU0hPVyk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pO1xuICAgIH07XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPV0lORyk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbik7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcbiAgICBpZiAodGhpcy5pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xuICAgIH1cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbiAgaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfbWF5YmVTY2hlZHVsZUhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuYXV0b2hpZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gfHwgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9LCB0aGlzLl9jb25maWcuZGVsYXkpO1xuICB9XG4gIF9vbkludGVyYWN0aW9uKGV2ZW50LCBpc0ludGVyYWN0aW5nKSB7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAgY2FzZSAnbW91c2VvdXQnOlxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3Rpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3Rpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSW50ZXJhY3RpbmcpIHtcbiAgICAgIHRoaXMuX2NsZWFyVGltZW91dCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgPT09IG5leHRFbGVtZW50IHx8IHRoaXMuX2VsZW1lbnQuY29udGFpbnMobmV4dEVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX21heWJlU2NoZWR1bGVIaWRlKCk7XG4gIH1cbiAgX3NldExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VPVkVSLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFT1VULCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSkpO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0ZPQ1VTT1VULCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSkpO1xuICB9XG4gIF9jbGVhclRpbWVvdXQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVG9hc3QuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihUb2FzdCk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvYXN0KTtcblxuZXhwb3J0IHsgQWxlcnQsIEJ1dHRvbiwgQ2Fyb3VzZWwsIENvbGxhcHNlLCBEcm9wZG93biwgTW9kYWwsIE9mZmNhbnZhcywgUG9wb3ZlciwgU2Nyb2xsU3B5LCBUYWIsIFRvYXN0LCBUb29sdGlwIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ib290c3RyYXAuZXNtLmpzLm1hcFxuIiwiaW1wb3J0IHtcclxuICBJQWN0aW9uLFxyXG4gIElBY3Rpb25SZXN1bHQsXHJcbiAgSUFjdGlvbk5vZGUsXHJcbiAgSUFjdGlvblByb3BlcnR5LFxyXG4gIElDb250ZXh0LFxyXG4gIElGaWVsZCxcclxufSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuXHJcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB0eXBlIHsgUmVjb3JkfSBmcm9tIFwiQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvY2xpZW50L3R5cGVzXCI7XHJcbmltcG9ydCB7IEtpbnRvbmVSZXN0QVBJQ2xpZW50fSBmcm9tIFwiQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50XCI7XHJcbmltcG9ydCBcIi4vYXV0by1sb29rdXAuc2Nzc1wiO1xyXG5pbXBvcnQgXCJib290c3RyYXAvanMvZGlzdC9tb2RhbFwiO1xyXG4vLyBpbXBvcnQgXCJib290c3RyYXAvanMvZGlzdC9zcGlubmVyXCI7XHJcbmltcG9ydCB7TW9kYWx9IGZyb20gXCJib290c3RyYXBcIlxyXG5pbXBvcnQgJCBmcm9tIFwianF1ZXJ5XCI7XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMge1xyXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XHJcbiAgbG9va3VwRmllbGQ6IExvb2t1cEZpZWxkO1xyXG4gIGNvbmRpdGlvbjogQ29uZGl0aW9uO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ29uZGl0aW9uIHtcclxuICBxdWVyeVN0cmluZzogc3RyaW5nO1xyXG4gIGluZGV4OiBudW1iZXI7XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIGNoaWxkcmVuOiBDaGlsZFtdO1xyXG4gIHBhcmVudDogbnVsbDtcclxuICBsb2dpY2FsT3BlcmF0b3I6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIENoaWxkIHtcclxuICBpbmRleDogbnVtYmVyO1xyXG4gIHR5cGU6IHN0cmluZztcclxuICBwYXJlbnQ6IHN0cmluZztcclxuICBvYmplY3Q6IGFueTtcclxuICBvcGVyYXRvcjogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBMb29rdXBGaWVsZCB7XHJcbiAgYXBwOiBBcHA7XHJcbiAgZmllbGRzOiBGaWVsZFtdO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRmllbGQge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0eXBlOiBzdHJpbmc7XHJcbiAgY29kZTogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgbm9MYWJlbDogYm9vbGVhbjtcclxuICByZXF1aXJlZDogYm9vbGVhbjtcclxuICBsb29rdXA6IExvb2t1cDtcclxufSBcclxuXHJcbmludGVyZmFjZSBMb29rdXAge1xyXG4gIHJlbGF0ZWRBcHA6IFJlbGF0ZWRBcHA7XHJcbiAgcmVsYXRlZEtleUZpZWxkOiBzdHJpbmc7XHJcbiAgZmllbGRNYXBwaW5nczogRmllbGRNYXBwaW5nW107XHJcbiAgbG9va3VwUGlja2VyRmllbGRzOiBhbnlbXTtcclxuICBmaWx0ZXJDb25kOiBzdHJpbmc7XHJcbiAgc29ydDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRmllbGRNYXBwaW5nIHtcclxuICBmaWVsZDogc3RyaW5nO1xyXG4gIHJlbGF0ZWRGaWVsZDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUmVsYXRlZEFwcCB7XHJcbiAgYXBwOiBzdHJpbmc7XHJcbiAgY29kZTogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQXBwIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gIGNyZWF0ZWRhdGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEF1dG9Mb29rVXBBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xyXG4gIHByb3BzOiBQcm9wcztcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMubmFtZSA9IFwi44Or44OD44Kv44Ki44OD44OX5pu05pawXCI7XHJcbiAgICB0aGlzLmFjdGlvblByb3BzID0gW107XHJcbiAgICB0aGlzLnByb3BzID0ge30gYXMgUHJvcHM7XHJcbiAgICB0aGlzLnJlZ2lzdGVyKCk7XHJcbiAgfVxyXG5cclxuICAvKioqXHJcbiAgICog44Ki44Kv44K744K544Gu44Oh44Kk44Oz44Gu5Yem55CG6Zai5pWwXHJcbiAgICovXHJcbiAgYXN5bmMgcHJvY2VzcyhcclxuICAgIHByb3A6IElBY3Rpb25Ob2RlLFxyXG4gICAgZXZlbnQ6IGFueSxcclxuICAgIGNvbnRleHQ6IElDb250ZXh0XHJcbiAgKTogUHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XHJcbiAgICB0aGlzLmFjdGlvblByb3BzID0gcHJvcC5hY3Rpb25Qcm9wcztcclxuICAgIHRoaXMucHJvcHMgPSB7XHJcbiAgICAgIC4uLnByb3AuQWN0aW9uVmFsdWUsXHJcbiAgICAgIGNvbmRpdGlvbjogSlNPTi5wYXJzZSgocHJvcC5BY3Rpb25WYWx1ZSBhcyBhbnkpLmNvbmRpdGlvbiksXHJcbiAgICB9IGFzIFByb3BzO1xyXG4gICAgLy8gY29uc29sZS5sb2coY29udGV4dCk7XHJcblxyXG4gICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgY2FuTmV4dDogdHJ1ZSxcclxuICAgICAgcmVzdWx0OiBcIlwiLFxyXG4gICAgfSBhcyBJQWN0aW9uUmVzdWx0O1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbG9va1VwRmllbGRzID0gdGhpcy5wcm9wcy5sb29rdXBGaWVsZC5maWVsZHMuZmlsdGVyKFxyXG4gICAgICAgIChmKSA9PiBmLmxvb2t1cCAmJiBmLmxvb2t1cC5yZWxhdGVkQXBwLmFwcCA9PT0gU3RyaW5nKGtpbnRvbmUuYXBwLmdldElkKCkpXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICghbG9va1VwRmllbGRzIHx8IGxvb2tVcEZpZWxkcy5sZW5ndGg9PT0wKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgYOODq+ODg+OCr+OCouODg+ODl+OBruioreWumuOBr+S4jeato+OBp+OBmeOAgiR7dGhpcy5wcm9wcy5sb29rdXBGaWVsZC5maWVsZHNbMF0ubGFiZWx9IGBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGxvb2tVcEZpZWxkID0gdGhpcy5wcm9wcy5sb29rdXBGaWVsZC5maWVsZHNbMF07IFxyXG4gICAgICBjb25zdCBrZXkgPSBldmVudC5yZWNvcmRbbG9va1VwRmllbGQubG9va3VwLnJlbGF0ZWRLZXlGaWVsZF0udmFsdWU7XHJcbiAgICAgIGNvbnN0IHRhcmdldFJlY29yZHMgPSBhd2FpdCB0aGlzLmdldFVwZGF0ZVJlY29yZHMobG9va1VwRmllbGQsIGtleSk7XHJcbiAgICAgIC8v5pu05paw5a++6LGh44GM44Gq44GE5pmC44Gr44K544Kt44OD44OXXHJcbiAgICAgIGlmKHRhcmdldFJlY29yZHMubGVuZ3RoPT09MCl7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB1cGRhdGVSZWNvcmRzID0gdGhpcy5jb252ZXJ0Rm9yTG9va3VwKHRhcmdldFJlY29yZHMsbG9va1VwRmllbGQsa2V5KTtcclxuICAgICAgY29uc29sZS5sb2coXCJ1cGRhdGVSZWNvcmRzXCIsIHVwZGF0ZVJlY29yZHMpO1xyXG4gICAgICB0aGlzLnNob3dTcGlubmVyTW9kZWwodGhpcy5wcm9wcy5sb29rdXBGaWVsZC5hcHApO1xyXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZUxvb2t1cFRhcmdldCh1cGRhdGVSZWNvcmRzKTtcclxuICAgICAgdGhpcy5zaG93UmVzdWx0KHRoaXMucHJvcHMubG9va3VwRmllbGQuYXBwLHVwZGF0ZVJlY29yZHMubGVuZ3RoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIuODq+ODg+OCr+OCouODg+ODl+abtOaWsOS4reS+i+WkluOBjOeZuueUn+OBl+OBvuOBl+OBn+OAglwiLCBlcnJvcik7XHJcbiAgICAgICAgaWYoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcil7XHJcbiAgICAgICAgICBldmVudC5lcnJvciA9IGVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBldmVudC5lcnJvciA9IFwi44Or44OD44Kv44Ki44OD44OX5pu05paw5Lit5L6L5aSW44GM55m655Sf44GX44G+44GX44Gf44CCXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5jYW5OZXh0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcImF1dG9Mb29rdXBQcm9wc1wiLCB0aGlzLnByb3BzKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSRVNUIEFQSeeUqOOCr+OCqOODquS9nOaIkFxyXG4gICAqIFRPRE865YWx6YCa6Zai5pWw44Go44GX44Gm5L2c5oiQXHJcbiAgICogQHBhcmFtIGxvb2tVcEZpZWxkIFxyXG4gICAqIEBwYXJhbSBrZXkgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgbWFrZVF1ZXJ5PShsb29rVXBGaWVsZDpGaWVsZCxrZXk6YW55KT0+e1xyXG4gICAgaWYodHlwZW9mIGtleT09PSdudW1iZXInKXtcclxuICAgICAgcmV0dXJuIGAke2xvb2tVcEZpZWxkLmNvZGV9ID0gJHtrZXl9YFxyXG4gICAgfVxyXG4gICAgaWYodHlwZW9mIGtleT09PSdzdHJpbmcnKXtcclxuICAgICAgcmV0dXJuIGAke2xvb2tVcEZpZWxkLmNvZGV9ID0gXCIke2tleX1cImBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOabtOaWsOWvvuixoeOBruODrOOCs+ODvOODieOCkuWPluW+l+OBmeOCi1xyXG4gICAqL1xyXG4gIGdldFVwZGF0ZVJlY29yZHMgPSBhc3luYyAobG9va1VwRmllbGQ6RmllbGQsa2V5OmFueSk6UHJvbWlzZTwgUmVjb3JkW10+PT57XHJcbiAgICBjb25zdCBjbGllbnQ9bmV3IEtpbnRvbmVSZXN0QVBJQ2xpZW50KCk7XHJcbiAgICBjb25zdCByZXNwID0gYXdhaXQgY2xpZW50LnJlY29yZC5nZXRBbGxSZWNvcmRzKHtcclxuICAgICAgYXBwOnRoaXMucHJvcHMubG9va3VwRmllbGQuYXBwLmlkLFxyXG4gICAgICBmaWVsZHM6W1wiJGlkXCJdLFxyXG4gICAgICBjb25kaXRpb246dGhpcy5tYWtlUXVlcnkobG9va1VwRmllbGQsa2V5KVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzcDtcclxuICB9XHJcblxyXG4gLyoqXHJcbiAgKiDjg6vjg4Pjgq/jgqLjg4Pjg5fmm7TmlrDnlKjjg6zjgrPjg7zjg4njgavlpInmj5vjgZnjgotcclxuICAqIEBwYXJhbSB0YXJnZXRSZWNvcmRzIOabtOaWsOWvvuixoeODrOOCs+ODvOODiVxyXG4gICogQHBhcmFtIGxvb2tVcEZpZWxkIOODq+ODg+OCr+OCouODg+ODl+ODleOCo+ODvOODq+ODiVxyXG4gICogQHBhcmFtIGtleSDjg6vjg4Pjgq/jgqLjg4Pjg5fjg5XjgqPjg7zjg6vjg4njga7lgKRcclxuICAqIEByZXR1cm5zIFxyXG4gICovXHJcbiAgY29udmVydEZvckxvb2t1cCA9ICh0YXJnZXRSZWNvcmRzOlJlY29yZFtdLGxvb2tVcEZpZWxkOkZpZWxkLGtleTphbnkpOkFycmF5PGFueT49PntcclxuICAgIHJldHVybiB0YXJnZXRSZWNvcmRzLm1hcCgocikgPT4gKHtcclxuICAgICAgaWQ6IE51bWJlcihyW1wiJGlkXCJdLnZhbHVlKSxcclxuICAgICAgcmVjb3JkOiB7IFtsb29rVXBGaWVsZC5jb2RlXTogeyB2YWx1ZToga2V5IH0gfSxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOODq+ODg+OCr+OCouODg+ODl+WFiOOCkuabtOaWsOOBmeOCi1xyXG4gICAqIEBwYXJhbSB1cGRhdGVSZWNvcmRzIFxyXG4gICAqL1xyXG4gIHVwZGF0ZUxvb2t1cFRhcmdldCA9IGFzeW5jICh1cGRhdGVSZWNvcmRzOkFycmF5PGFueT4pPT57XHJcbiAgICBpZiAodXBkYXRlUmVjb3JkcyAmJiB1cGRhdGVSZWNvcmRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgY2xpZW50PW5ldyBLaW50b25lUmVzdEFQSUNsaWVudCgpO1xyXG4gICAgICBjbGllbnQucmVjb3JkLnVwZGF0ZUFsbFJlY29yZHMoe1xyXG4gICAgICAgIGFwcDp0aGlzLnByb3BzLmxvb2t1cEZpZWxkLmFwcC5pZCxcclxuICAgICAgICByZWNvcmRzOnVwZGF0ZVJlY29yZHNcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIGF3YWl0IGtpbnRvbmUuYXBpKGtpbnRvbmUuYXBpLnVybChcIi9rL3YxL3JlY29yZHMuanNvblwiLCB0cnVlKSwgXCJQVVRcIiwge1xyXG4gICAgICAvLyAgIGFwcDogdGhpcy5wcm9wcy5sb29rdXBGaWVsZC5hcHAuaWQsXHJcbiAgICAgIC8vICAgcmVjb3JkczogdXBkYXRlUmVjb3Jkc1xyXG4gICAgICAvLyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOabtOaWsOS4reOBruODgOOCpOOCouODreOCsOihqOekulxyXG4gICAqIEBwYXJhbSBhcHAgXHJcbiAgICovXHJcbiAgc2hvd1NwaW5uZXJNb2RlbCA9IChhcHA6QXBwKSA9PiB7XHJcbiAgICBsZXQgZGlhbG9nID0gJChcIiNhbGNMb29rdXBNb2RhbFwiKTtcclxuICAgIGlmKGRpYWxvZy5sZW5ndGg9PT0wKXtcclxuICAgICAgY29uc3QgbW9kYWxIVE1MID0gYFxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImFsY0xvb2t1cE1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cInN0YXRpY0JhY2tkcm9wTGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nLWNlbnRlcmVkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxoMSBjbGFzcz1cIm1vZGFsLXRpdGxlIGZzLTVcIiBpZD1cImFsY0xvb2t1cE1vZGFsTGFiZWxcIj7jg6vjg4Pjgq/jgqLjg4Pjg5flkIzmnJ/lh6bnkIY8L2gxPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIGlkPVwiYXBwJHthcHAuaWR9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXNlY29uZGFyeSBjb2wtMSBcIiByb2xlPVwiYWxlcnRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPiR7YXBwLm5hbWV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPk9LPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PmA7XHJcbiAgICAgIGRpYWxvZyA9ICQobW9kYWxIVE1MKS5hcHBlbmRUbyhcImJvZHlcIik7XHJcbiAgICAgIGRpYWxvZy5nZXQoKVswXS5hZGRFdmVudExpc3RlbmVyKCdoaWRkZW4uYnMubW9kYWwnLChldik9PntcclxuICAgICAgICBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKGRpYWxvZy5nZXQoKVswXSkuZGlzcG9zZSgpO1xyXG4gICAgICAgICQoXCIjYWxjTG9va3VwTW9kYWxcIikucmVtb3ZlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIGNvbnN0IGRpYWxvZ0JvZHk9JChcIiNhbGNMb29rdXBNb2RhbCAubW9kYWwtYm9keVwiKTtcclxuICAgICAgY29uc3QgaHRtbHJvdz1gIFxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIGlkPVwiYXBwJHthcHAuaWR9XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXNlY29uZGFyeSBjb2wtMSBcIiByb2xlPVwiYWxlcnRcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj4ke2FwcC5uYW1lfTwvZGl2PlxyXG4gICAgICAgICAgPGRpdj5gO1xyXG4gICAgICBkaWFsb2dCb2R5LmFwcGVuZChodG1scm93KTtcclxuICAgIH1cclxuICAgIE1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UoZGlhbG9nLmdldCgpWzBdKS5zaG93KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDmm7TmlrDntZDmnpzjgpLooajnpLrjgZnjgotcclxuICAgKiBAcGFyYW0gYXBwIOOAgOabtOaWsOWFiOOCouODl+ODquaDheWgsVxyXG4gICAqIEBwYXJhbSBjb3VudCDmm7TmlrDku7bmlbBcclxuICAgKi9cclxuICBzaG93UmVzdWx0PShhcHA6QXBwLGNvdW50Om51bWJlcik9PntcclxuICAgIGNvbnN0IGRpYWxvZ0JvZHk9JChgI2FsY0xvb2t1cE1vZGFsIC5tb2RhbC1ib2R5ICNhcHAke2FwcC5pZH1gKTtcclxuICAgIGNvbnN0IGh0bWw9YCAgICA8ZGl2IGNsYXNzPVwiY29sLTEgdGV4dC1zdWNjZXNzXCI+4pyUPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPiR7YXBwLm5hbWV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPuabtOaWsOS7tuaVsDoke2NvdW50feS7tjwvZGl2PmA7XHJcbiAgICBkaWFsb2dCb2R5Lmh0bWwoaHRtbCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3RlcigpOiB2b2lkIHtcclxuICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdID0gdGhpcztcclxuICB9XHJcbn1cclxuXHJcbm5ldyBBdXRvTG9va1VwQWN0aW9uKCk7IiwiXHJcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuLi9hY3Rpb25zXCI7XHJcbmltcG9ydCAnLi4vYWN0aW9ucy9tdXN0LWlucHV0JztcclxuaW1wb3J0ICcuLi9hY3Rpb25zL2F1dG8tbnVtYmVyaW5nJztcclxuaW1wb3J0ICcuLi9hY3Rpb25zL2ZpZWxkLXNob3duJztcclxuaW1wb3J0ICcuLi9hY3Rpb25zL2Vycm9yLXNob3cnO1xyXG5pbXBvcnQgJy4uL2FjdGlvbnMvYnV0dG9uLWFkZCc7XHJcbmltcG9ydCAnLi4vYWN0aW9ucy9jb25kaXRpb24tYWN0aW9uJztcclxuaW1wb3J0ICcuLi9hY3Rpb25zL2RhdGEtcHJvY2Vzc2luZyc7XHJcbmltcG9ydCAnLi4vYWN0aW9ucy9kYXRhLXVwZGF0ZSc7XHJcbmltcG9ydCAnLi4vYWN0aW9ucy9jdXJyZW50LWZpZWxkLWdldCc7XHJcbmltcG9ydCAnLi4vYWN0aW9ucy9yZWd1bGFyLWNoZWNrJztcclxuaW1wb3J0ICcuLi9hY3Rpb25zL21haWwtY2hlY2snO1xyXG5pbXBvcnQgJy4uL2FjdGlvbnMvY291bnRlci1jaGVjayc7XHJcbmltcG9ydCAnLi4vYWN0aW9ucy9kYXRldGltZS1nZXR0ZXInO1xyXG5pbXBvcnQgJy4uL2FjdGlvbnMvaW5zZXJ0LXZhbHVlJztcclxuaW1wb3J0ICcuLi9hY3Rpb25zL3ZhbHVlLWdldHRlcic7XHJcbmltcG9ydCAnLi4vYWN0aW9ucy9zdHJpbmctam9pbic7XHJcbmltcG9ydCAnLi4vYWN0aW9ucy92YWxpZGF0aW9uLWZ1bGx3aWR0aCc7XHJcbmltcG9ydCAnLi4vYWN0aW9ucy92YWxpZGF0aW9uLWhhbGZ3aWR0aCc7XHJcbmltcG9ydCAnLi4vYWN0aW9ucy9sb2dpbi11c2VyLWdldHRlcic7XHJcbmltcG9ydCAnLi4vYWN0aW9ucy9hdXRvLWxvb2t1cCc7XHJcblxyXG5pbXBvcnQgeyBBY3Rpb25GbG93LElBY3Rpb25GbG93LCBJQWN0aW9uUmVzdWx0LElDb250ZXh0IH0gZnJvbSBcIi4vQWN0aW9uVHlwZXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBY3Rpb25Qcm9jZXNze1xyXG4gICAgZXZlbnRJZDpzdHJpbmc7XHJcbiAgICBmbG93OklBY3Rpb25GbG93O1xyXG4gICAgZXZlbnQ6YW55O1xyXG4gICAgY29udGV4dDpJQ29udGV4dDtcclxuICAgIGNvbnN0cnVjdG9yKGV2ZW50SWQ6c3RyaW5nLGZsb3c6QWN0aW9uRmxvdyxldmVudDphbnkpe1xyXG4gICAgICAgIHRoaXMuZXZlbnRJZD1ldmVudElkO1xyXG4gICAgICAgIHRoaXMuZmxvdz1mbG93O1xyXG4gICAgICAgIHRoaXMuZXZlbnQ9ZXZlbnQ7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0PXtcclxuICAgICAgICAgICAgcmVjb3JkOnRoaXMuZXZlbnQucmVjb3JkLFxyXG4gICAgICAgICAgICB2YXJpYWJsZXM6e31cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZXhlYygpe1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLmZsb3cuZ2V0Um9vdCgpO1xyXG4gICAgICAgIGlmKHJvb3Q9PT11bmRlZmluZWQgfHwgcm9vdC5uZXh0Tm9kZUlkcy5zaXplPT09MCl7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGlkPXJvb3QubmV4dE5vZGVJZHMuZ2V0KCcnKTtcclxuICAgICAgICBpZihpZD09PXVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgIGxldCBuZXh0QWN0aW9uID0gdGhpcy5mbG93LmZpbmROb2RlQnlJZChpZCk7IFxyXG4gICAgICAgIGxldCByZXN1bHQ6SUFjdGlvblJlc3VsdD17XHJcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgd2hpbGUobmV4dEFjdGlvbiE9PXVuZGVmaW5lZCAmJiByZXN1bHQuY2FuTmV4dCl7XHJcbiAgICAgICAgICAgY29uc3QgYWN0aW9uID0gYWN0aW9uQWRkaW5zW25leHRBY3Rpb24ubmFtZV07XHJcbiAgICAgICAgICAgaWYoYWN0aW9uIT09dW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgYWN0aW9uLnByb2Nlc3MobmV4dEFjdGlvbix0aGlzLmV2ZW50LHRoaXMuY29udGV4dCk7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICAgIGxldCBuZXh0SW5wdXQgPSAnJztcclxuICAgICAgICAgICAvL291dHB1dFBvaW50c+S4gOOBpOS7peS4iuOBruWgtOWQiOOAgeasoeOBrklucHV0UG9pbnTjga/miLvjgorlgKTjgpLoqK3lrprjgZnjgotcclxuICAgICAgICAgICBpZihuZXh0QWN0aW9uLm91dHB1dFBvaW50cyAmJiBuZXh0QWN0aW9uLm91dHB1dFBvaW50cy5sZW5ndGg+MSl7XHJcbiAgICAgICAgICAgICBuZXh0SW5wdXQgPSByZXN1bHQucmVzdWx0fHwnJztcclxuICAgICAgICAgICB9XHJcbiAgICAgICAgICAgaWQ9bmV4dEFjdGlvbi5uZXh0Tm9kZUlkcy5nZXQobmV4dElucHV0KTtcclxuICAgICAgICAgICBpZihpZD09PXVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgICAgIG5leHRBY3Rpb24gPSB0aGlzLmZsb3cuZmluZE5vZGVCeUlkKGlkKTsgXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSIsIlxyXG4vKipcclxuICog44Ki44OX44Oq5oOF5aCxXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZm8ge1xyXG4gIGFwcElkOiBzdHJpbmc7XHJcbiAgY29kZT86IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4qIOOCouOCr+OCt+ODp+ODs+OBruODl+ODreODkeODhuOCo+Wumue+qVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uUHJvcGVydHkge1xyXG4gIGNvbXBvbmVudDogc3RyaW5nO1xyXG4gIHByb3BzOiB7XHJcbiAgICAvL+ODl+ODreODkeODhuOCo+WQjVxyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgLy/jg5fjg63jg5Hjg4bjgqPooajnpLrlkI1cclxuICAgIGRpc3BsYXlOYW1lOiBzdHJpbmc7XHJcbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gICAgLy/jg5fjg63jg5Hjg4bjgqPoqK3lrprlgKRcclxuICAgIG1vZGVsVmFsdWU6IGFueTtcclxuICB9O1xyXG59XHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjgr/jgqTjg5flrprnvqlcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGlvbk5vZGUge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgLy/jgqLjgq/jgrfjg6fjg7PlkI1cclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBzdWJUaXRsZTogc3RyaW5nO1xyXG4gIGlucHV0UG9pbnQ6IHN0cmluZztcclxuICAvL+WHuuWKm+ODneOCpOODs+ODiO+8iOadoeS7tuWIhuWykOS7peWkluacquS9v+eUqO+8iVxyXG4gIG91dHB1dFBvaW50czogQXJyYXk8c3RyaW5nPjtcclxuICAvL+ODq+ODvOODiOOCouOCr+OCt+ODp+ODs++8iEtpbnRvbmUgZXZlbnTvvIlcclxuICBpc1Jvb3Q6IGJvb2xlYW47XHJcbiAgLy/jgqLjgq/jgrfjg6fjg7Pjga7jg5fjg63jg5Hjg4bjgqPlrprnvqlcclxuICBhY3Rpb25Qcm9wczogQXJyYXk8SUFjdGlvblByb3BlcnR5PjtcclxuICAvL+OCouOCr+OCt+ODp+ODs+OBruODl+ODreODkeODhuOCo+ioreWumuWApOaKveWHulxyXG4gIEFjdGlvblZhbHVlOiBvYmplY3RcclxuICBwcmV2Tm9kZUlkPzogc3RyaW5nO1xyXG4gIG5leHROb2RlSWRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xyXG59XHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjg5Xjg63jg7zjga7lrprnvqlcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGlvbkZsb3cge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgYWN0aW9uTm9kZXM6IElBY3Rpb25Ob2RlW107XHJcbiAgZmluZE5vZGVCeUlkKGlkOiBzdHJpbmcpOiBJQWN0aW9uTm9kZSB8IHVuZGVmaW5lZDtcclxuICB0b0pTT04oKTogYW55O1xyXG4gIGdldFJvb3QoKTogSUFjdGlvbk5vZGUgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGlvblJlc3VsdHtcclxuICBjYW5OZXh0OmJvb2xlYW47XHJcbiAgcmVzdWx0Pzphbnk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDjgrPjg7Pjg4bjgq3jgrnjg4hcclxuICog44Os44Kz44O844OJ44Go44OV44Ot44O844Gu5aSJ5pWw44KS5oyB44GkXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElDb250ZXh0e1xyXG4gIHJlY29yZDphbnksXHJcbiAgdmFyaWFibGVzOmFueVxyXG59XHJcblxyXG4vKipcclxuICog44Ki44Kv44K344On44Oz44Gu44Kk44Oz44K/44O844OV44Kn44O844K5XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElBY3Rpb257XHJcbiAgLy/jgqLjgq/jgrfjg6fjg7Pjga7lkI3liY3vvIjjg6bjg7zjg4vjg4Pjgq/lkI3jgYzlv4XopoHvvIlcclxuICBuYW1lOnN0cmluZztcclxuICAvL+WxnuaAp+ioreWumuaDheWgsVxyXG4gIGFjdGlvblByb3BzOiBBcnJheTxJQWN0aW9uUHJvcGVydHk+O1xyXG4gIC8v44Ki44Kv44K344On44Oz44Gu44OX44Ot44K744K55a6f6KGM6Zai5pWwXHJcbiAgcHJvY2Vzcyhwcm9wOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+O1xyXG4gIC8v44Ki44Kv44K344On44Oz44Gu55m76Yyy6Zai5pWwXHJcbiAgcmVnaXN0ZXIoKTp2b2lkO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmllbGR7XHJcbiAgbmFtZT86c3RyaW5nO1xyXG4gIGNvZGU6c3RyaW5nO1xyXG4gIHR5cGU/OnN0cmluZztcclxuICByZXF1aXJlZD86Ym9vbGVhbjtcclxuICBvcHRpb25zPzpzdHJpbmc7XHJcbn1cclxuLy/lpInmlbDjga7jgqTjg7Pjgr/jg7zjg5Xjgqfjg7zjgrlcclxuZXhwb3J0IGludGVyZmFjZSBJVmFyTmFtZXtcclxuICBuYW1lOnN0cmluZztcclxuICBmaWVsZHM/OklWYXJOYW1lW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7jg5fjg63jg5Hjg4bjgqPlrprnvqnjgavln7rjgaXjgYTjgZ/jgq/jg6njgrlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBBY3Rpb25Qcm9wZXJ0eSBpbXBsZW1lbnRzIElBY3Rpb25Qcm9wZXJ0eSB7XHJcbiAgY29tcG9uZW50OiBzdHJpbmc7XHJcbiAgcHJvcHM6IHtcclxuICAgIC8vIOODl+ODreODkeODhuOCo+WQjVxyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgLy8g44OX44Ot44OR44OG44Kj6KGo56S65ZCNXHJcbiAgICBkaXNwbGF5TmFtZTogc3RyaW5nO1xyXG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuICAgIC8vIOODl+ODreODkeODhuOCo+ioreWumuWApFxyXG4gICAgbW9kZWxWYWx1ZTogYW55O1xyXG4gIH07XHJcblxyXG4gIHN0YXRpYyBkZWZhdWx0UHJvcGVydHkoKTogSUFjdGlvblByb3BlcnR5IHtcclxuICAgIHJldHVybiBuZXcgQWN0aW9uUHJvcGVydHkoJ0lucHV0VGV4dCcsICdkaXNwbGF5TmFtZScsICfooajnpLrlkI0nLCAn6KGo56S644KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GEJywgJycpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgY29tcG9uZW50OiBzdHJpbmcsXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICBkaXNwbGF5TmFtZTogc3RyaW5nLFxyXG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZyxcclxuICAgIG1vZGVsVmFsdWU6IGFueVxyXG4gICkge1xyXG4gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XHJcbiAgICB0aGlzLnByb3BzID0ge1xyXG4gICAgICBuYW1lOiBuYW1lLFxyXG4gICAgICBkaXNwbGF5TmFtZTogZGlzcGxheU5hbWUsXHJcbiAgICAgIHBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlcixcclxuICAgICAgbW9kZWxWYWx1ZTogbW9kZWxWYWx1ZVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJQWN0aW9uTm9kZeOBruWun+ijheOAgVJvb3RBY3Rpb25Ob2Rl5Lul5aSW44Gu44Ki44Kv44K344On44Oz5a6a576pXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQWN0aW9uTm9kZSBpbXBsZW1lbnRzIElBY3Rpb25Ob2RlIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBnZXQgdGl0bGUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHByb3AgPSB0aGlzLmFjdGlvblByb3BzLmZpbmQoKHByb3ApID0+IHByb3AucHJvcHMubmFtZSA9PT0gXCJkaXNwbGF5TmFtZVwiKTtcclxuICAgIHJldHVybiBwcm9wPy5wcm9wcy5tb2RlbFZhbHVlO1xyXG4gIH07XHJcbiAgZ2V0IHN1YlRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xyXG4gIH07XHJcbiAgaW5wdXRQb2ludDogc3RyaW5nO1xyXG4gIC8v5Ye65Yqb44Od44Kk44Oz44OI77yI5p2h5Lu25YiG5bKQ5Lul5aSW5pyq5L2/55So77yJXHJcbiAgb3V0cHV0UG9pbnRzOiBBcnJheTxzdHJpbmc+O1xyXG4gIGFjdGlvblByb3BzOiBBcnJheTxJQWN0aW9uUHJvcGVydHk+O1xyXG4gIGdldCBpc1Jvb3QoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfTtcclxuICBnZXQgQWN0aW9uVmFsdWUoKTogb2JqZWN0IHtcclxuICAgIGNvbnN0IHByb3BWYWx1ZTogYW55ID0ge307XHJcbiAgICB0aGlzLmFjdGlvblByb3BzLmZvckVhY2goKHZhbHVlKSA9PiB7XHJcbiAgICAgIHByb3BWYWx1ZVt2YWx1ZS5wcm9wcy5uYW1lXSA9IHZhbHVlLnByb3BzLm1vZGVsVmFsdWVcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb3BWYWx1ZTtcclxuICB9O1xyXG4gIHByZXZOb2RlSWQ/OiBzdHJpbmc7XHJcbiAgbmV4dE5vZGVJZHM6IE1hcDxzdHJpbmcsIHN0cmluZz47XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB7aWQsbmFtZSx0aXRsZSxpbnB1dFBvaW50LG91dHB1dFBvaW50cyxhY3Rpb25Qcm9wc306XHJcbiAgICB7XHJcbiAgICAgIGlkOnN0cmluZyxcclxuICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgICB0aXRsZTogc3RyaW5nLFxyXG4gICAgICBpbnB1dFBvaW50OiBzdHJpbmcsXHJcbiAgICAgIG91dHB1dFBvaW50czogQXJyYXk8c3RyaW5nPixcclxuICAgICAgYWN0aW9uUHJvcHM6IEFycmF5PElBY3Rpb25Qcm9wZXJ0eT59XHJcbiAgKSB7XHJcbiAgICB0aGlzLmlkPWlkO1xyXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgIHRoaXMuaW5wdXRQb2ludCA9IGlucHV0UG9pbnQ7XHJcbiAgICB0aGlzLm91dHB1dFBvaW50cyA9IG91dHB1dFBvaW50cztcclxuICAgIGNvbnN0IGRlZlByb3AgPSBBY3Rpb25Qcm9wZXJ0eS5kZWZhdWx0UHJvcGVydHkoKTtcclxuICAgIGRlZlByb3AucHJvcHMubW9kZWxWYWx1ZSA9IHRpdGxlO1xyXG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvblByb3BzO1xyXG4gICAgdGhpcy5uZXh0Tm9kZUlkcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgfVxyXG5cclxufVxyXG4vKipcclxuICog44Or44O844OI44Ki44Kv44K344On44Oz5a6a576pXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUm9vdEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb25Ob2RlIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHN1YlRpdGxlOiBzdHJpbmc7XHJcbiAgaW5wdXRQb2ludDogc3RyaW5nO1xyXG4gIC8v5Ye65Yqb44Od44Kk44Oz44OI77yI5p2h5Lu25YiG5bKQ5Lul5aSW5pyq5L2/55So77yJXHJcbiAgb3V0cHV0UG9pbnRzOiBBcnJheTxzdHJpbmc+O1xyXG4gIGlzUm9vdDogYm9vbGVhbjtcclxuICBhY3Rpb25Qcm9wczogQXJyYXk8SUFjdGlvblByb3BlcnR5PjtcclxuICBBY3Rpb25WYWx1ZTogb2JqZWN0O1xyXG4gIHByZXZOb2RlSWQ/OiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcbiAgbmV4dE5vZGVJZHM6IE1hcDxzdHJpbmcsIHN0cmluZz47XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB7aWQsbmFtZSx0aXRsZSxzdWJUaXRsZX06e1xyXG4gICAgICBpZDpzdHJpbmcsXHJcbiAgICAgIG5hbWU6IHN0cmluZyxcclxuICAgICAgdGl0bGU6IHN0cmluZyxcclxuICAgICAgc3ViVGl0bGU6IHN0cmluZ31cclxuICApIHtcclxuICAgIHRoaXMuaWQgPSBpZDtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB0aGlzLnRpdGxlID0gdGl0bGU7XHJcbiAgICB0aGlzLnN1YlRpdGxlID0gc3ViVGl0bGU7XHJcbiAgICB0aGlzLmlucHV0UG9pbnQgPSAnJztcclxuICAgIHRoaXMub3V0cHV0UG9pbnRzID0gW107XHJcbiAgICB0aGlzLmlzUm9vdCA9IHRydWU7XHJcbiAgICB0aGlzLmFjdGlvblByb3BzID0gW107XHJcbiAgICB0aGlzLkFjdGlvblZhbHVlID0ge307XHJcbiAgICB0aGlzLm5leHROb2RlSWRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjg5Xjg63jg7zjga7lrprnvqlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBBY3Rpb25GbG93IGltcGxlbWVudHMgSUFjdGlvbkZsb3cge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgYWN0aW9uTm9kZXM6IEFycmF5PElBY3Rpb25Ob2RlPjtcclxuICBjb25zdHJ1Y3RvcihhY3Rpb25Ob2RlczogQXJyYXk8SUFjdGlvbk5vZGU+IHwgUm9vdEFjdGlvbikge1xyXG4gICAgaWYgKGFjdGlvbk5vZGVzIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgdGhpcy5hY3Rpb25Ob2RlcyA9IGFjdGlvbk5vZGVzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3Rpb25Ob2RlcyA9IFthY3Rpb25Ob2Rlc107XHJcbiAgICB9XHJcbiAgICB0aGlzLmlkID0gJyc7XHJcbiAgfVxyXG4gIC8qKipcclxuICAgKiBJROOBp0FjdGlvbk5vZGXjgpLlj5blvpfjgZnjgotcclxuICAgKi9cclxuICBmaW5kTm9kZUJ5SWQoaWQ6IHN0cmluZyk6IElBY3Rpb25Ob2RlIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmFjdGlvbk5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IGlkKTtcclxuICB9XHJcblxyXG4gIHRvSlNPTigpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICBhY3Rpb25Ob2RlczogdGhpcy5hY3Rpb25Ob2Rlcy5tYXAobm9kZSA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBuZXh0Tm9kZUlkcywgLi4ucmVzdCB9ID0gbm9kZTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4ucmVzdCxcclxuICAgICAgICAgIG5leHROb2RlSWRzOiBBcnJheS5mcm9tKG5leHROb2RlSWRzLmVudHJpZXMoKSlcclxuICAgICAgICB9O1xyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldFJvb3QoKTogSUFjdGlvbk5vZGUgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aW9uTm9kZXMuZmluZChub2RlID0+IG5vZGUuaXNSb290KVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZyb21KU09OKGpzb246IHN0cmluZyk6IEFjdGlvbkZsb3cge1xyXG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uKTtcclxuXHJcbiAgICBjb25zdCBhY3Rpb25Ob2RlcyA9IHBhcnNlZE9iamVjdC5hY3Rpb25Ob2Rlcy5tYXAoKG5vZGU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlQ2xhc3MgPSAhbm9kZS5pc1Jvb3QgPyBuZXcgQWN0aW9uTm9kZShub2RlKVxyXG4gICAgICAgIDogbmV3IFJvb3RBY3Rpb24obm9kZSk7XHJcbiAgICAgIG5vZGVDbGFzcy5uZXh0Tm9kZUlkcyA9IG5ldyBNYXA8c3RyaW5nLHN0cmluZz4oT2JqZWN0LmVudHJpZXMobm9kZS5uZXh0Tm9kZUlkcykpO1xyXG4gICAgICBub2RlQ2xhc3MucHJldk5vZGVJZCA9IG5vZGUucHJldk5vZGVJZDtcclxuICAgICAgbm9kZUNsYXNzLmlkID0gbm9kZS5pZDtcclxuICAgICAgcmV0dXJuIG5vZGVDbGFzcztcclxuICAgIH0pO1xyXG4gICAgY29uc3QgYWN0aW9uRmxvdyA9IG5ldyBBY3Rpb25GbG93KGFjdGlvbk5vZGVzKTtcclxuICAgIGFjdGlvbkZsb3cuaWQgPSBwYXJzZWRPYmplY3QuaWQ7XHJcbiAgICByZXR1cm4gYWN0aW9uRmxvdztcclxuICB9XHJcbn1cclxuXHJcbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XHJcbmltcG9ydCB7IEFjdGlvblByb2Nlc3MgfSBmcm9tICcuL3R5cGVzL2FjdGlvbi1wcm9jZXNzJztcclxuaW1wb3J0IHsgQWN0aW9uRmxvdyB9IGZyb20gJy4vdHlwZXMvQWN0aW9uVHlwZXMnO1xyXG5pbXBvcnQgeyBGbG93SW5mbyB9IGZyb20gJy4vdHlwZXMvZmxvd1NldHRpbmcnO1xyXG5cclxuZGVjbGFyZSBjb25zdCBhbGNmbG93IDoge1xyXG4gIFtrZXk6c3RyaW5nXTpGbG93SW5mb1xyXG59O1xyXG5cclxuJChmdW5jdGlvbiAoKXtcclxuICAgIGNvbnN0IGdldENoYW5nZUV2ZW50cz0oZXZlbnRzOnN0cmluZ1tdKT0+e1xyXG4gICAgICByZXR1cm4gZXZlbnRzLmZpbHRlcigoZXZlbnQpPT5ldmVudC5pbmNsdWRlcyhcIi5jaGFuZ2UuXCIpKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGdldENsaWNrRXZlbnRzPShldmVudHM6c3RyaW5nW10pPT57XHJcbiAgICAgIHJldHVybiBldmVudHMuZmlsdGVyKChldmVudCk9PmV2ZW50LmluY2x1ZGVzKFwiLmN1c3RvbUJ1dHRvbkNsaWNrLlwiKSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBnZXRLaW50b25lRXZlbnRzPShldmVudHM6c3RyaW5nW10pPT57XHJcbiAgICAgIHJldHVybiBldmVudHMuZmlsdGVyKChldmVudCk9PntcclxuICAgICAgICByZXR1cm4gIWV2ZW50LmluY2x1ZGVzKFwiLmN1c3RvbUJ1dHRvbkNsaWNrLlwiKSAmJiAhZXZlbnQuaW5jbHVkZXMoXCIuY2hhbmdlLlwiKVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGV2ZW50cz1PYmplY3Qua2V5cyhhbGNmbG93KTtcclxuICAgIGNvbnN0IGNoYW5nZUV2ZW50cyA9IGdldENoYW5nZUV2ZW50cyhldmVudHMpO1xyXG4gICAgY29uc3QgY2xpY2tFdmVudHMgPSBnZXRDbGlja0V2ZW50cyhldmVudHMpO1xyXG4gICAgY29uc3Qga2ludG9uZUV2ZW50cyA9IGdldEtpbnRvbmVFdmVudHMoZXZlbnRzKTtcclxuICAgIGlmKGtpbnRvbmVFdmVudHMubGVuZ3RoPjAgKXtcclxuICAgICAgLy/pgJrluLhLaW50b25l44Kk44OZ44Oz44OI44KS44OQ44Oz44OJXHJcbiAgICAgIGtpbnRvbmUuZXZlbnRzLm9uKGtpbnRvbmVFdmVudHMsYXN5bmMgKGV2ZW50OmFueSk9PntcclxuICAgICAgICBjb25zdCBmbG93aW5mbyA9IGFsY2Zsb3dbZXZlbnQudHlwZV07XHJcbiAgICAgICAgY29uc3QgZmxvdz1BY3Rpb25GbG93LmZyb21KU09OKGZsb3dpbmZvLmNvbnRlbnQpO1xyXG4gICAgICAgIGlmKGZsb3chPT11bmRlZmluZWQpe1xyXG4gICAgICAgICAgY29uc3QgcHJvY2VzcyA9IG5ldyBBY3Rpb25Qcm9jZXNzKGV2ZW50LnR5cGUsZmxvdyxldmVudCk7XHJcbiAgICAgICAgICBhd2FpdCBwcm9jZXNzLmV4ZWMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmKGNoYW5nZUV2ZW50cy5sZW5ndGg+MCl7XHJcbiAgICAgIC8v5YCk5aSJ5pu044Kk44OZ44Oz44OI44KS44OQ44Oz44OJ44GZ44KLXHJcbiAgICAgIGtpbnRvbmUuZXZlbnRzLm9uKGNoYW5nZUV2ZW50cywoZXZlbnQ6YW55KT0+e1xyXG4gICAgICAgIGNvbnN0IGZsb3dpbmZvID0gYWxjZmxvd1tldmVudC50eXBlXTtcclxuICAgICAgICBjb25zdCBmbG93PUFjdGlvbkZsb3cuZnJvbUpTT04oZmxvd2luZm8uY29udGVudCk7XHJcbiAgICAgICAgaWYoZmxvdyE9PXVuZGVmaW5lZCl7XHJcbiAgICAgICAgICBjb25zdCBwcm9jZXNzID0gbmV3IEFjdGlvblByb2Nlc3MoZXZlbnQudHlwZSxmbG93LGV2ZW50KTtcclxuICAgICAgICAgIHByb2Nlc3MuZXhlYygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZXZlbnQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYoY2xpY2tFdmVudHMubGVuZ3RoPjApe1xyXG4gICAgICBjbGlja0V2ZW50cy5mb3JFYWNoKChldmVudE5hbWU6c3RyaW5nKT0+e1xyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKGV2ZW50TmFtZSxhc3luYyAoKT0+e1xyXG4gICAgICAgICAgY29uc3QgZXZlbnQ9a2ludG9uZS5hcHAucmVjb3JkLmdldCgpO1xyXG4gICAgICAgICAgY29uc3QgZmxvd2luZm8gPSBhbGNmbG93W2V2ZW50TmFtZV07XHJcbiAgICAgICAgICBjb25zdCBmbG93PUFjdGlvbkZsb3cuZnJvbUpTT04oZmxvd2luZm8uY29udGVudCk7XHJcbiAgICAgICAgICBpZihmbG93IT09dW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgY29uc3QgcHJvY2VzcyA9IG5ldyBBY3Rpb25Qcm9jZXNzKGV2ZW50TmFtZSxmbG93LGV2ZW50KTtcclxuICAgICAgICAgICAgYXdhaXQgcHJvY2Vzcy5leGVjKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XHJcbiAgICAgICAgICBraW50b25lLmFwcC5yZWNvcmQuc2V0KHtyZWNvcmR9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxufSk7Il0sIm5hbWVzIjpbImdsb2JhbCIsImZhY3RvcnkiLCJtb2R1bGUiLCJ3IiwidGhpcyIsIndpbmRvdyIsIm5vR2xvYmFsIiwiYXJyIiwiZ2V0UHJvdG8iLCJzbGljZSIsImZsYXQiLCJhcnJheSIsInB1c2giLCJpbmRleE9mIiwiY2xhc3MydHlwZSIsInRvU3RyaW5nIiwiaGFzT3duIiwiZm5Ub1N0cmluZyIsIk9iamVjdEZ1bmN0aW9uU3RyaW5nIiwic3VwcG9ydCIsImlzRnVuY3Rpb24iLCJvYmoiLCJpc1dpbmRvdyIsImRvY3VtZW50IiwicHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyIsIkRPTUV2YWwiLCJjb2RlIiwibm9kZSIsImRvYyIsImkiLCJ2YWwiLCJzY3JpcHQiLCJ0b1R5cGUiLCJ2ZXJzaW9uIiwicmh0bWxTdWZmaXgiLCJqUXVlcnkiLCJzZWxlY3RvciIsImNvbnRleHQiLCJudW0iLCJlbGVtcyIsInJldCIsImNhbGxiYWNrIiwiZWxlbSIsIl9lbGVtIiwibGVuIiwiaiIsIm9wdGlvbnMiLCJuYW1lIiwic3JjIiwiY29weSIsImNvcHlJc0FycmF5IiwiY2xvbmUiLCJ0YXJnZXQiLCJsZW5ndGgiLCJkZWVwIiwibXNnIiwicHJvdG8iLCJDdG9yIiwiaXNBcnJheUxpa2UiLCJub2RlVHlwZSIsInJlc3VsdHMiLCJuYW1lc3BhY2UiLCJkb2NFbGVtIiwiZmlyc3QiLCJzZWNvbmQiLCJpbnZlcnQiLCJjYWxsYmFja0ludmVyc2UiLCJtYXRjaGVzIiwiY2FsbGJhY2tFeHBlY3QiLCJhcmciLCJ2YWx1ZSIsIl9pIiwidHlwZSIsIm5vZGVOYW1lIiwicG9wIiwic29ydCIsInNwbGljZSIsIndoaXRlc3BhY2UiLCJydHJpbUNTUyIsImEiLCJiIiwiYnVwIiwicmNzc2VzY2FwZSIsImZjc3Nlc2NhcGUiLCJjaCIsImFzQ29kZVBvaW50Iiwic2VsIiwicHJlZmVycmVkRG9jIiwicHVzaE5hdGl2ZSIsIkV4cHIiLCJvdXRlcm1vc3RDb250ZXh0Iiwic29ydElucHV0IiwiaGFzRHVwbGljYXRlIiwiZG9jdW1lbnRFbGVtZW50IiwiZG9jdW1lbnRJc0hUTUwiLCJyYnVnZ3lRU0EiLCJleHBhbmRvIiwiZGlycnVucyIsImRvbmUiLCJjbGFzc0NhY2hlIiwiY3JlYXRlQ2FjaGUiLCJ0b2tlbkNhY2hlIiwiY29tcGlsZXJDYWNoZSIsIm5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUiLCJzb3J0T3JkZXIiLCJib29sZWFucyIsImlkZW50aWZpZXIiLCJhdHRyaWJ1dGVzIiwicHNldWRvcyIsInJ3aGl0ZXNwYWNlIiwicmNvbW1hIiwicmxlYWRpbmdDb21iaW5hdG9yIiwicmRlc2NlbmQiLCJycHNldWRvIiwicmlkZW50aWZpZXIiLCJtYXRjaEV4cHIiLCJyaW5wdXRzIiwicmhlYWRlciIsInJxdWlja0V4cHIiLCJyc2libGluZyIsInJ1bmVzY2FwZSIsImZ1bmVzY2FwZSIsImVzY2FwZSIsIm5vbkhleCIsImhpZ2giLCJ1bmxvYWRIYW5kbGVyIiwic2V0RG9jdW1lbnQiLCJpbkRpc2FibGVkRmllbGRzZXQiLCJhZGRDb21iaW5hdG9yIiwic2FmZUFjdGl2ZUVsZW1lbnQiLCJlbHMiLCJmaW5kIiwic2VlZCIsIm0iLCJuaWQiLCJtYXRjaCIsImdyb3VwcyIsIm5ld1NlbGVjdG9yIiwibmV3Q29udGV4dCIsInRlc3RDb250ZXh0IiwidG9rZW5pemUiLCJ0b1NlbGVjdG9yIiwic2VsZWN0Iiwia2V5cyIsImNhY2hlIiwia2V5IiwibWFya0Z1bmN0aW9uIiwiZm4iLCJhc3NlcnQiLCJlbCIsImNyZWF0ZUlucHV0UHNldWRvIiwiY3JlYXRlQnV0dG9uUHNldWRvIiwiY3JlYXRlRGlzYWJsZWRQc2V1ZG8iLCJkaXNhYmxlZCIsImNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8iLCJhcmd1bWVudCIsIm1hdGNoSW5kZXhlcyIsInN1YldpbmRvdyIsImlkIiwiYXR0cklkIiwidGFnIiwiY2xhc3NOYW1lIiwiaW5wdXQiLCJjb21wYXJlIiwiZXhwciIsImVsZW1lbnRzIiwiZHVwbGljYXRlcyIsImV4Y2VzcyIsInVucXVvdGVkIiwibm9kZU5hbWVTZWxlY3RvciIsImV4cGVjdGVkTm9kZU5hbWUiLCJwYXR0ZXJuIiwib3BlcmF0b3IiLCJjaGVjayIsInJlc3VsdCIsIndoYXQiLCJfYXJndW1lbnQiLCJsYXN0Iiwic2ltcGxlIiwiZm9yd2FyZCIsIm9mVHlwZSIsIl9jb250ZXh0IiwieG1sIiwib3V0ZXJDYWNoZSIsIm5vZGVJbmRleCIsInN0YXJ0IiwiZGlyIiwicGFyZW50IiwidXNlQ2FjaGUiLCJkaWZmIiwicHNldWRvIiwiYXJncyIsImlkeCIsIm1hdGNoZWQiLCJtYXRjaGVyIiwiY29tcGlsZSIsInVubWF0Y2hlZCIsInRleHQiLCJsYW5nIiwiZWxlbUxhbmciLCJoYXNoIiwiYXR0ciIsIl9tYXRjaEluZGV4ZXMiLCJzZXRGaWx0ZXJzIiwicGFyc2VPbmx5IiwidG9rZW5zIiwic29GYXIiLCJwcmVGaWx0ZXJzIiwiY2FjaGVkIiwiY29tYmluYXRvciIsImJhc2UiLCJza2lwIiwiY2hlY2tOb25FbGVtZW50cyIsImRvbmVOYW1lIiwib2xkQ2FjaGUiLCJuZXdDYWNoZSIsImVsZW1lbnRNYXRjaGVyIiwibWF0Y2hlcnMiLCJtdWx0aXBsZUNvbnRleHRzIiwiY29udGV4dHMiLCJjb25kZW5zZSIsIm1hcCIsImZpbHRlciIsIm5ld1VubWF0Y2hlZCIsIm1hcHBlZCIsInNldE1hdGNoZXIiLCJwcmVGaWx0ZXIiLCJwb3N0RmlsdGVyIiwicG9zdEZpbmRlciIsInBvc3RTZWxlY3RvciIsInRlbXAiLCJtYXRjaGVyT3V0IiwicHJlTWFwIiwicG9zdE1hcCIsInByZWV4aXN0aW5nIiwibWF0Y2hlckluIiwibWF0Y2hlckZyb21Ub2tlbnMiLCJjaGVja0NvbnRleHQiLCJsZWFkaW5nUmVsYXRpdmUiLCJpbXBsaWNpdFJlbGF0aXZlIiwibWF0Y2hDb250ZXh0IiwibWF0Y2hBbnlDb250ZXh0IiwibWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzIiwiZWxlbWVudE1hdGNoZXJzIiwic2V0TWF0Y2hlcnMiLCJieVNldCIsImJ5RWxlbWVudCIsInN1cGVyTWF0Y2hlciIsIm91dGVybW9zdCIsIm1hdGNoZWRDb3VudCIsInNldE1hdGNoZWQiLCJjb250ZXh0QmFja3VwIiwiZGlycnVuc1VuaXF1ZSIsInRva2VuIiwiY29tcGlsZWQiLCJ1bnRpbCIsInRydW5jYXRlIiwic2libGluZ3MiLCJuIiwicm5lZWRzQ29udGV4dCIsInJzaW5nbGVUYWciLCJ3aW5ub3ciLCJxdWFsaWZpZXIiLCJub3QiLCJzZWxmIiwicm9vdGpRdWVyeSIsImluaXQiLCJyb290IiwicnBhcmVudHNwcmV2IiwiZ3VhcmFudGVlZFVuaXF1ZSIsInRhcmdldHMiLCJsIiwic2VsZWN0b3JzIiwiY3VyIiwic2libGluZyIsInJub3RodG1sd2hpdGUiLCJjcmVhdGVPcHRpb25zIiwib2JqZWN0IiwiXyIsImZsYWciLCJmaXJpbmciLCJtZW1vcnkiLCJmaXJlZCIsImxvY2tlZCIsImxpc3QiLCJxdWV1ZSIsImZpcmluZ0luZGV4IiwiZmlyZSIsImFkZCIsImluZGV4IiwiSWRlbnRpdHkiLCJ2IiwiVGhyb3dlciIsImV4IiwiYWRvcHRWYWx1ZSIsInJlc29sdmUiLCJyZWplY3QiLCJub1ZhbHVlIiwibWV0aG9kIiwiZnVuYyIsInR1cGxlcyIsInN0YXRlIiwicHJvbWlzZSIsImRlZmVycmVkIiwiZm5zIiwibmV3RGVmZXIiLCJ0dXBsZSIsInJldHVybmVkIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwib25Qcm9ncmVzcyIsIm1heERlcHRoIiwiZGVwdGgiLCJoYW5kbGVyIiwic3BlY2lhbCIsInRoYXQiLCJtaWdodFRocm93IiwidGhlbiIsInByb2Nlc3MiLCJlIiwic3RhdGVTdHJpbmciLCJzaW5nbGVWYWx1ZSIsInJlbWFpbmluZyIsInJlc29sdmVDb250ZXh0cyIsInJlc29sdmVWYWx1ZXMiLCJwcmltYXJ5IiwidXBkYXRlRnVuYyIsInJlcnJvck5hbWVzIiwiZXJyb3IiLCJhc3luY0Vycm9yIiwicmVhZHlMaXN0Iiwid2FpdCIsImNvbXBsZXRlZCIsImFjY2VzcyIsImNoYWluYWJsZSIsImVtcHR5R2V0IiwicmF3IiwiYnVsayIsIl9rZXkiLCJybXNQcmVmaXgiLCJyZGFzaEFscGhhIiwiZmNhbWVsQ2FzZSIsIl9hbGwiLCJsZXR0ZXIiLCJjYW1lbENhc2UiLCJzdHJpbmciLCJhY2NlcHREYXRhIiwib3duZXIiLCJEYXRhIiwiZGF0YSIsInByb3AiLCJkYXRhUHJpdiIsImRhdGFVc2VyIiwicmJyYWNlIiwicm11bHRpRGFzaCIsImdldERhdGEiLCJkYXRhQXR0ciIsImF0dHJzIiwic3RhcnRMZW5ndGgiLCJob29rcyIsIm5leHQiLCJzZXR0ZXIiLCJ0bXAiLCJjb3VudCIsImRlZmVyIiwicG51bSIsInJjc3NOdW0iLCJjc3NFeHBhbmQiLCJpc0F0dGFjaGVkIiwiY29tcG9zZWQiLCJpc0hpZGRlbldpdGhpblRyZWUiLCJhZGp1c3RDU1MiLCJ2YWx1ZVBhcnRzIiwidHdlZW4iLCJhZGp1c3RlZCIsInNjYWxlIiwibWF4SXRlcmF0aW9ucyIsImN1cnJlbnRWYWx1ZSIsImluaXRpYWwiLCJ1bml0IiwiaW5pdGlhbEluVW5pdCIsImRlZmF1bHREaXNwbGF5TWFwIiwiZ2V0RGVmYXVsdERpc3BsYXkiLCJkaXNwbGF5Iiwic2hvd0hpZGUiLCJzaG93IiwidmFsdWVzIiwicmNoZWNrYWJsZVR5cGUiLCJydGFnTmFtZSIsInJzY3JpcHRUeXBlIiwiZnJhZ21lbnQiLCJkaXYiLCJ3cmFwTWFwIiwiZ2V0QWxsIiwic2V0R2xvYmFsRXZhbCIsInJlZkVsZW1lbnRzIiwicmh0bWwiLCJidWlsZEZyYWdtZW50Iiwic2NyaXB0cyIsInNlbGVjdGlvbiIsImlnbm9yZWQiLCJ3cmFwIiwiYXR0YWNoZWQiLCJub2RlcyIsInJ0eXBlbmFtZXNwYWNlIiwicmV0dXJuVHJ1ZSIsInJldHVybkZhbHNlIiwib24iLCJ0eXBlcyIsIm9uZSIsIm9yaWdGbiIsImV2ZW50IiwiaGFuZGxlT2JqSW4iLCJldmVudEhhbmRsZSIsImV2ZW50cyIsInQiLCJoYW5kbGVPYmoiLCJoYW5kbGVycyIsIm5hbWVzcGFjZXMiLCJvcmlnVHlwZSIsImVsZW1EYXRhIiwibWFwcGVkVHlwZXMiLCJvcmlnQ291bnQiLCJuYXRpdmVFdmVudCIsImhhbmRsZXJRdWV1ZSIsIm1hdGNoZWRIYW5kbGVycyIsIm1hdGNoZWRTZWxlY3RvcnMiLCJkZWxlZ2F0ZUNvdW50IiwiaG9vayIsIm9yaWdpbmFsRXZlbnQiLCJsZXZlcmFnZU5hdGl2ZSIsImlzU2V0dXAiLCJzYXZlZCIsImhhbmRsZSIsInByb3BzIiwiZGVsZWdhdGVUeXBlIiwiZm9jdXNNYXBwZWRIYW5kbGVyIiwiYXR0YWNoZXMiLCJkYXRhSG9sZGVyIiwib3JpZyIsImZpeCIsInJlbGF0ZWQiLCJybm9Jbm5lcmh0bWwiLCJyY2hlY2tlZCIsInJjbGVhblNjcmlwdCIsIm1hbmlwdWxhdGlvblRhcmdldCIsImNvbnRlbnQiLCJkaXNhYmxlU2NyaXB0IiwicmVzdG9yZVNjcmlwdCIsImNsb25lQ29weUV2ZW50IiwiZGVzdCIsInBkYXRhT2xkIiwidWRhdGFPbGQiLCJ1ZGF0YUN1ciIsImZpeElucHV0IiwiZG9tTWFuaXAiLCJjb2xsZWN0aW9uIiwiaGFzU2NyaXB0cyIsImlOb0Nsb25lIiwidmFsdWVJc0Z1bmN0aW9uIiwicmVtb3ZlIiwia2VlcERhdGEiLCJodG1sIiwiZGF0YUFuZEV2ZW50cyIsImRlZXBEYXRhQW5kRXZlbnRzIiwic3JjRWxlbWVudHMiLCJkZXN0RWxlbWVudHMiLCJpblBhZ2UiLCJvcmlnaW5hbCIsImluc2VydCIsInJudW1ub25weCIsInJjdXN0b21Qcm9wIiwiZ2V0U3R5bGVzIiwidmlldyIsInN3YXAiLCJvbGQiLCJyYm94U3R5bGUiLCJjb21wdXRlU3R5bGVUZXN0cyIsImNvbnRhaW5lciIsImRpdlN0eWxlIiwicGl4ZWxQb3NpdGlvblZhbCIsInJlbGlhYmxlTWFyZ2luTGVmdFZhbCIsInJvdW5kUGl4ZWxNZWFzdXJlcyIsInBpeGVsQm94U3R5bGVzVmFsIiwiYm94U2l6aW5nUmVsaWFibGVWYWwiLCJzY3JvbGxib3hTaXplVmFsIiwibWVhc3VyZSIsInJlbGlhYmxlVHJEaW1lbnNpb25zVmFsIiwidGFibGUiLCJ0ciIsInRyQ2hpbGQiLCJ0clN0eWxlIiwiY3VyQ1NTIiwiY29tcHV0ZWQiLCJ3aWR0aCIsIm1pbldpZHRoIiwibWF4V2lkdGgiLCJpc0N1c3RvbVByb3AiLCJzdHlsZSIsImFkZEdldEhvb2tJZiIsImNvbmRpdGlvbkZuIiwiaG9va0ZuIiwiY3NzUHJlZml4ZXMiLCJlbXB0eVN0eWxlIiwidmVuZG9yUHJvcHMiLCJ2ZW5kb3JQcm9wTmFtZSIsImNhcE5hbWUiLCJmaW5hbFByb3BOYW1lIiwiZmluYWwiLCJyZGlzcGxheXN3YXAiLCJjc3NTaG93IiwiY3NzTm9ybWFsVHJhbnNmb3JtIiwic2V0UG9zaXRpdmVOdW1iZXIiLCJzdWJ0cmFjdCIsImJveE1vZGVsQWRqdXN0bWVudCIsImRpbWVuc2lvbiIsImJveCIsImlzQm9yZGVyQm94Iiwic3R5bGVzIiwiY29tcHV0ZWRWYWwiLCJleHRyYSIsImRlbHRhIiwibWFyZ2luRGVsdGEiLCJnZXRXaWR0aE9ySGVpZ2h0IiwiYm94U2l6aW5nTmVlZGVkIiwidmFsdWVJc0JvcmRlckJveCIsIm9mZnNldFByb3AiLCJvcmlnTmFtZSIsInNjcm9sbGJveFNpemVCdWdneSIsInByZWZpeCIsInN1ZmZpeCIsImV4cGFuZGVkIiwicGFydHMiLCJUd2VlbiIsImVuZCIsImVhc2luZyIsInBlcmNlbnQiLCJlYXNlZCIsInAiLCJmeE5vdyIsImluUHJvZ3Jlc3MiLCJyZnh0eXBlcyIsInJydW4iLCJzY2hlZHVsZSIsImNyZWF0ZUZ4Tm93IiwiZ2VuRngiLCJpbmNsdWRlV2lkdGgiLCJ3aGljaCIsImNyZWF0ZVR3ZWVuIiwiYW5pbWF0aW9uIiwiQW5pbWF0aW9uIiwiZGVmYXVsdFByZWZpbHRlciIsIm9wdHMiLCJ0b2dnbGUiLCJvbGRmaXJlIiwicHJvcFR3ZWVuIiwicmVzdG9yZURpc3BsYXkiLCJpc0JveCIsImFuaW0iLCJoaWRkZW4iLCJkYXRhU2hvdyIsInByb3BGaWx0ZXIiLCJzcGVjaWFsRWFzaW5nIiwicHJvcGVydGllcyIsInN0b3BwZWQiLCJ0aWNrIiwiY3VycmVudFRpbWUiLCJnb3RvRW5kIiwicHJlcGVuZCIsInNwZWVkIiwib3B0IiwidG8iLCJlbXB0eSIsIm9wdGFsbCIsImRvQW5pbWF0aW9uIiwiY2xlYXJRdWV1ZSIsInN0b3BRdWV1ZSIsInN0b3AiLCJkZXF1ZXVlIiwidGltZXJzIiwiY3NzRm4iLCJ0aW1lciIsInRpbWUiLCJ0aW1lb3V0IiwiYm9vbEhvb2siLCJhdHRySGFuZGxlIiwiblR5cGUiLCJhdHRyTmFtZXMiLCJnZXR0ZXIiLCJpc1hNTCIsImxvd2VyY2FzZU5hbWUiLCJyZm9jdXNhYmxlIiwicmNsaWNrYWJsZSIsInRhYmluZGV4Iiwic3RyaXBBbmRDb2xsYXBzZSIsImdldENsYXNzIiwiY2xhc3Nlc1RvQXJyYXkiLCJjbGFzc05hbWVzIiwiY3VyVmFsdWUiLCJmaW5hbFZhbHVlIiwic3RhdGVWYWwiLCJpc1ZhbGlkVmFsdWUiLCJycmV0dXJuIiwib3B0aW9uIiwibWF4Iiwib3B0aW9uU2V0IiwibG9jYXRpb24iLCJub25jZSIsInJxdWVyeSIsInBhcnNlckVycm9yRWxlbSIsInJmb2N1c01vcnBoIiwic3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2siLCJvbmx5SGFuZGxlcnMiLCJidWJibGVUeXBlIiwib250eXBlIiwibGFzdEVsZW1lbnQiLCJldmVudFBhdGgiLCJyYnJhY2tldCIsInJDUkxGIiwicnN1Ym1pdHRlclR5cGVzIiwicnN1Ym1pdHRhYmxlIiwiYnVpbGRQYXJhbXMiLCJ0cmFkaXRpb25hbCIsInMiLCJ2YWx1ZU9yRnVuY3Rpb24iLCJyMjAiLCJyaGFzaCIsInJhbnRpQ2FjaGUiLCJyaGVhZGVycyIsInJsb2NhbFByb3RvY29sIiwicm5vQ29udGVudCIsInJwcm90b2NvbCIsInByZWZpbHRlcnMiLCJ0cmFuc3BvcnRzIiwiYWxsVHlwZXMiLCJvcmlnaW5BbmNob3IiLCJhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMiLCJzdHJ1Y3R1cmUiLCJkYXRhVHlwZUV4cHJlc3Npb24iLCJkYXRhVHlwZSIsImRhdGFUeXBlcyIsImluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzIiwib3JpZ2luYWxPcHRpb25zIiwianFYSFIiLCJpbnNwZWN0ZWQiLCJzZWVraW5nVHJhbnNwb3J0IiwiaW5zcGVjdCIsInNlbGVjdGVkIiwicHJlZmlsdGVyT3JGYWN0b3J5IiwiZGF0YVR5cGVPclRyYW5zcG9ydCIsImFqYXhFeHRlbmQiLCJmbGF0T3B0aW9ucyIsImFqYXhIYW5kbGVSZXNwb25zZXMiLCJyZXNwb25zZXMiLCJjdCIsImZpbmFsRGF0YVR5cGUiLCJmaXJzdERhdGFUeXBlIiwiY29udGVudHMiLCJhamF4Q29udmVydCIsInJlc3BvbnNlIiwiaXNTdWNjZXNzIiwiY29udjIiLCJjdXJyZW50IiwiY29udiIsInByZXYiLCJjb252ZXJ0ZXJzIiwic2V0dGluZ3MiLCJ1cmwiLCJ0cmFuc3BvcnQiLCJjYWNoZVVSTCIsInJlc3BvbnNlSGVhZGVyc1N0cmluZyIsInJlc3BvbnNlSGVhZGVycyIsInRpbWVvdXRUaW1lciIsInVybEFuY2hvciIsImZpcmVHbG9iYWxzIiwidW5jYWNoZWQiLCJjYWxsYmFja0NvbnRleHQiLCJnbG9iYWxFdmVudENvbnRleHQiLCJjb21wbGV0ZURlZmVycmVkIiwic3RhdHVzQ29kZSIsInJlcXVlc3RIZWFkZXJzIiwicmVxdWVzdEhlYWRlcnNOYW1lcyIsInN0ckFib3J0Iiwic3RhdHVzVGV4dCIsImZpbmFsVGV4dCIsInN0YXR1cyIsIm5hdGl2ZVN0YXR1c1RleHQiLCJoZWFkZXJzIiwic3VjY2VzcyIsIm1vZGlmaWVkIiwiaHRtbElzRnVuY3Rpb24iLCJ4aHJTdWNjZXNzU3RhdHVzIiwieGhyU3VwcG9ydGVkIiwiZXJyb3JDYWxsYmFjayIsImNvbXBsZXRlIiwieGhyIiwiZXZ0Iiwib2xkQ2FsbGJhY2tzIiwicmpzb25wIiwib3JpZ2luYWxTZXR0aW5ncyIsImNhbGxiYWNrTmFtZSIsIm92ZXJ3cml0dGVuIiwicmVzcG9uc2VDb250YWluZXIiLCJqc29uUHJvcCIsImJvZHkiLCJrZWVwU2NyaXB0cyIsInBhcnNlZCIsInBhcmFtcyIsIm9mZiIsInJlc3BvbnNlVGV4dCIsImN1clBvc2l0aW9uIiwiY3VyTGVmdCIsImN1ckNTU1RvcCIsImN1clRvcCIsImN1ck9mZnNldCIsImN1ckNTU0xlZnQiLCJjYWxjdWxhdGVQb3NpdGlvbiIsInBvc2l0aW9uIiwiY3VyRWxlbSIsInJlY3QiLCJ3aW4iLCJvZmZzZXRQYXJlbnQiLCJvZmZzZXQiLCJwYXJlbnRPZmZzZXQiLCJ0b3AiLCJkZWZhdWx0RXh0cmEiLCJmdW5jTmFtZSIsIm1hcmdpbiIsImZuT3ZlciIsImZuT3V0IiwicnRyaW0iLCJwcm94eSIsImhvbGQiLCJfalF1ZXJ5IiwiXyQiLCJfX3B1YmxpY0ZpZWxkIiwiYWN0aW9uTm9kZSIsInJlY29yZCIsIl9hIiwiZm9ybWF0IiwiaW50ZWdlclBhcnQiLCJmcmFjdGlvblBhcnQiLCJpc05lZ2F0aXZlIiwiaXNQZXJjZW50IiwiaW50ZWdlckZvcm1hdCIsImZyYWN0aW9uRm9ybWF0IiwiZGF0ZSIsInllYXIiLCJtb250aCIsImRheSIsImhvdXIiLCJtaW51dGUiLCJtaWxsaXNlY29uZCIsInRpbWVab25lT2Zmc2V0IiwicmVwbGFjZW1lbnRzIiwiZG9jTnVtIiwidGVtcGxhdGUiLCJyZWdleCIsIm5vdyIsIm51bWJlciIsIm5vIiwicmVjTm8iLCJhcHB1cmwiLCJyZXNwIiwibG9naWNPcCIsImpzb24iLCJjaGlsZEpzb24iLCJmb3VuZE5vZGUiLCJtYXhJbmRleCIsImNoaWxkIiwiY2hpbGRNYXgiLCJjb25kaXRpb25TdHJpbmciLCJncm91cE5vZGUiLCJjaGlsZENvbmRpdGlvblN0cmluZyIsImNvbmROb2RlIiwiY29uZGlOb2RlcyIsImpzb25TdHJpbmciLCJmaWVsZFZhbHVlIiwiY29uZGl0aW9uIiwidGFyZ2V0VmFsdWUiLCJjb25kaXRpb25WYWx1ZSIsImRhdGVWYWx1ZSIsIm51bWJlclZhbHVlIiwidHJlZSIsImJ1dHRvblNwYWNlIiwiYnV0dG9uIiwiY2xpY2tFdmVudE5hbWUiLCJjb25kaXRpb25SZXN1bHQiLCJleHBvcnRzIiwiaW5qZWN0UGxhdGZvcm1EZXBzIiwiZGVwcyIsIl9fZXh0ZW5kcyIsImV4dGVuZFN0YXRpY3MiLCJkIiwiX18iLCJVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JfMSIsIl9zdXBlciIsIlVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvciIsInBsYXRmb3JtIiwiX3RoaXMiLCJtZXNzYWdlIiwiTWltZSIsInR5cGVNYXAiLCJmb3JjZSIsImV4dGVuc2lvbnMiLCJleHQiLCJwYXRoIiwiaGFzUGF0aCIsInJlcXVpcmUkJDAiLCJyZXF1aXJlJCQxIiwiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiYWRvcHQiLCJmdWxmaWxsZWQiLCJzdGVwIiwicmVqZWN0ZWQiLCJfX2dlbmVyYXRvciIsImYiLCJ5IiwiZyIsInZlcmIiLCJvcCIsIl9faW1wb3J0RGVmYXVsdCIsIm1vZCIsImJyb3dzZXIiLCJmaWxlUGF0aCIsIl9iIiwiX2MiLCJmaWxlTmFtZSIsImJhc2VVcmwiLCJob3N0IiwicHJvdG9jb2wiLCJlbmRwb2ludE5hbWUiLCJndWVzdFNwYWNlSWQiLCJwcmV2aWV3IiwiZ3Vlc3RQYXRoIiwicHJldmlld1BhdGgiLCJfX2Fzc2lnbiIsIkJhc2VDbGllbnRfMSIsIkJhc2VDbGllbnQiLCJjbGllbnQiLCJfX3Jlc3QiLCJCdWxrUmVxdWVzdENsaWVudF8xIiwiQnVsa1JlcXVlc3RDbGllbnQiLCJyZXF1ZXN0c1BhcmFtIiwicmVxdWVzdHMiLCJyZXF1ZXN0IiwicmVzdCIsIkFwcENsaWVudF8xIiwiQXBwQ2xpZW50Iiwic3BhY2UiLCJzcGFjZVBhdGgiLCJkZWZhdWx0VGhyZWFkIiwiS2ludG9uZUFib3J0U2VhcmNoRXJyb3JfMSIsIktpbnRvbmVBYm9ydFNlYXJjaEVycm9yIiwiS2ludG9uZUFsbFJlY29yZHNFcnJvcl8xIiwiS2ludG9uZUFsbFJlY29yZHNFcnJvciIsInByb2Nlc3NlZFJlY29yZHNSZXN1bHQiLCJ1bnByb2Nlc3NlZFJlY29yZHMiLCJudW1PZkFsbFJlY29yZHMiLCJjaHVua0xlbmd0aCIsIm51bU9mUHJvY2Vzc2VkUmVjb3JkcyIsImVycm9ySW5kZXgiLCJlcnJvcnMiLCJlcnJvckluZGV4ZXMiLCJlcnJvcktleSIsImVycm9yUGFyc2VSZXN1bHQiLCJLaW50b25lUmVzdEFQSUVycm9yXzEiLCJLaW50b25lUmVzdEFQSUVycm9yIiwiYnVsa1JlcXVlc3RJbmRleCIsIl9fY3JlYXRlQmluZGluZyIsIm8iLCJrIiwiazIiLCJkZXNjIiwiX19leHBvcnRTdGFyIiwicmVxdWlyZSQkMiIsImZyb20iLCJwYWNrIiwiYXIiLCJSZWNvcmRDbGllbnRfMSIsImVycm9yXzEiLCJSZWNvcmRDbGllbnQiLCJidWxrUmVxdWVzdENsaWVudCIsImFwcCIsInVwZGF0ZUtleSIsInJlY29yZHMiLCJyZXZpc2lvbiIsInF1ZXJ5IiwicmVnZXhwIiwiaWRzIiwicmV2aXNpb25zIiwib3JkZXJCeSIsIndpdGhDdXJzb3IiLCJjb25kaXRpb25RdWVyeSIsIm9yaWdpbmFsRmllbGRzIiwiZmllbGRzIiwiYWxsUmVjb3JkcyIsImxhc3RJZCIsImxhc3RSZWNvcmQiLCJlcnJvcl8yIiwiQ0hVTktfTEVOR1RIIiwicmVjb3Jkc0NodW5rIiwibmV3UmVzdWx0cyIsImVfMSIsInNlcGFyYXRlZFJlY29yZHMiLCJhY2MiLCJlXzIiLCJlXzMiLCJzaXplIiwic2VwYXJhdGVkIiwiY2h1bmsiLCJTcGFjZUNsaWVudF8xIiwiU3BhY2VDbGllbnQiLCJGaWxlQ2xpZW50XzEiLCJmb3JtX2RhdGFfMSIsInBsYXRmb3JtXzEiLCJyZXF1aXJlJCQzIiwiRmlsZUNsaWVudCIsImZvcm1EYXRhIiwibmFtZV8xIiwibmFtZV8yIiwiZmlsZURhdGEiLCJiaW5kIiwidGhpbmciLCJzdHIiLCJpc0FycmF5IiwiaXNCdWZmZXIiLCJpc1N0cmluZyIsImlzTnVtYmVyIiwiaXNCb29sZWFuIiwicHJvdG90eXBlIiwiaXNEYXRlIiwia2luZCIsImFsbE93bktleXMiLCJtZXJnZSIsImNhc2VsZXNzIiwiYXNzaWduVmFsdWUiLCJ0YXJnZXRLZXkiLCJjb25zdHJ1Y3RvciIsInN1cGVyQ29uc3RydWN0b3IiLCJkZXNjcmlwdG9ycyIsInNvdXJjZU9iaiIsImRlc3RPYmoiLCJtZXJnZWQiLCJzZWFyY2hTdHJpbmciLCJsYXN0SW5kZXgiLCJUeXBlZEFycmF5IiwiaXRlcmF0b3IiLCJwYWlyIiwicmVnRXhwIiwicDEiLCJwMiIsImhhc093blByb3BlcnR5IiwiaXNSZWdFeHAiLCJyZWR1Y2VyIiwicmVkdWNlZERlc2NyaXB0b3JzIiwiZGVzY3JpcHRvciIsImFycmF5T3JTdHJpbmciLCJkZWxpbWl0ZXIiLCJkZWZpbmUiLCJub29wIiwiZGVmYXVsdFZhbHVlIiwiYWxwaGFiZXQiLCJzdGFjayIsInZpc2l0Iiwic291cmNlIiwicmVkdWNlZFZhbHVlIiwidXRpbHMkMSIsImNvbmZpZyIsInRvSlNPTiIsImN1c3RvbVByb3BzIiwiYXhpb3NFcnJvciIsImRvdHMiLCJtZXRhVG9rZW5zIiwidmlzaXRvciIsImRlZmF1bHRWaXNpdG9yIiwiaW5kZXhlcyIsInVzZUJsb2IiLCJjb252ZXJ0VmFsdWUiLCJleHBvc2VkSGVscGVycyIsImJ1aWxkIiwiY2hhck1hcCIsImFwcGVuZCIsImVuY29kZXIiLCJfZW5jb2RlIiwiZW5jb2RlIiwic2VyaWFsaXplRm4iLCJzZXJpYWxpemVkUGFyYW1zIiwiaGFzaG1hcmtJbmRleCIsImgiLCJwcm9kdWN0IiwidXRpbHMiLCJoZWxwZXJzIiwiYXJyYXlUb09iamVjdCIsImJ1aWxkUGF0aCIsImlzTnVtZXJpY0tleSIsImlzTGFzdCIsInJhd1ZhbHVlIiwicGFyc2VyIiwiZGVmYXVsdHMiLCJ0cmFuc2Zvcm1SZXF1ZXN0IiwiY29udGVudFR5cGUiLCJoYXNKU09OQ29udGVudFR5cGUiLCJpc09iamVjdFBheWxvYWQiLCJpc0ZpbGVMaXN0IiwiX0Zvcm1EYXRhIiwidHJhbnNmb3JtUmVzcG9uc2UiLCJ0cmFuc2l0aW9uYWwiLCJmb3JjZWRKU09OUGFyc2luZyIsIkpTT05SZXF1ZXN0ZWQiLCJzdHJpY3RKU09OUGFyc2luZyIsInZhbGlkYXRlU3RhdHVzIiwiZGVmYXVsdHMkMSIsInJhd0hlYWRlcnMiLCJsaW5lIiwiaGVhZGVyIiwidG9rZW5zUkUiLCJpc0hlYWRlck5hbWVGaWx0ZXIiLCJjaGFyIiwiYWNjZXNzb3JOYW1lIiwibWV0aG9kTmFtZSIsImFyZzEiLCJhcmcyIiwiYXJnMyIsInZhbHVlT3JSZXdyaXRlIiwicmV3cml0ZSIsInNldEhlYWRlciIsIl92YWx1ZSIsIl9oZWFkZXIiLCJfcmV3cml0ZSIsImxIZWFkZXIiLCJzZXRIZWFkZXJzIiwiZGVsZXRlZCIsImRlbGV0ZUhlYWRlciIsIm5vcm1hbGl6ZWQiLCJhc1N0cmluZ3MiLCJhY2Nlc3NvcnMiLCJkZWZpbmVBY2Nlc3NvciIsImhlYWRlclZhbHVlIiwic2FtcGxlc0NvdW50IiwibWluIiwiYnl0ZXMiLCJ0aW1lc3RhbXBzIiwiaGVhZCIsInRhaWwiLCJmaXJzdFNhbXBsZVRTIiwic3RhcnRlZEF0IiwiYnl0ZXNDb3VudCIsInBhc3NlZCIsImZyZXEiLCJ0aW1lc3RhbXAiLCJ0aHJlc2hvbGQiLCJsaXN0ZW5lciIsImlzRG93bmxvYWRTdHJlYW0iLCJieXRlc05vdGlmaWVkIiwiX3NwZWVkb21ldGVyIiwibG9hZGVkIiwidG90YWwiLCJwcm9ncmVzc0J5dGVzIiwicmF0ZSIsImluUmFuZ2UiLCJzdGFuZGFyZEJyb3dzZXJFbnYiLCJtc2llIiwidXJsUGFyc2luZ05vZGUiLCJvcmlnaW5VUkwiLCJyZXNvbHZlVVJMIiwiaHJlZiIsInJlcXVlc3RVUkwiLCJub25TdGFuZGFyZEJyb3dzZXJFbnYiLCJleHBpcmVzIiwiZG9tYWluIiwic2VjdXJlIiwiY29va2llIiwiYmFzZVVSTCIsInJlbGF0aXZlVVJMIiwicmVxdWVzdGVkVVJMIiwiY29uZmlnMSIsImNvbmZpZzIiLCJnZXRNZXJnZWRWYWx1ZSIsIm1lcmdlRGVlcFByb3BlcnRpZXMiLCJ2YWx1ZUZyb21Db25maWcyIiwiZGVmYXVsdFRvQ29uZmlnMiIsIm1lcmdlRGlyZWN0S2V5cyIsIm1lcmdlTWFwIiwiY29uZmlnVmFsdWUiLCJuZXdDb25maWciLCJ3aXRoWFNSRlRva2VuIiwieHNyZkhlYWRlck5hbWUiLCJ4c3JmQ29va2llTmFtZSIsImF1dGgiLCJ4c3JmVmFsdWUiLCJfY29uZmlnIiwicmVxdWVzdERhdGEiLCJyZXNwb25zZVR5cGUiLCJvbkNhbmNlbGVkIiwib25sb2FkZW5kIiwiZXJyIiwidGltZW91dEVycm9yTWVzc2FnZSIsImNhbmNlbCIsInNpZ25hbHMiLCJjb250cm9sbGVyIiwiYWJvcnRlZCIsIm9uYWJvcnQiLCJ1bnN1YnNjcmliZSIsInNpZ25hbCIsImNodW5rU2l6ZSIsInBvcyIsIml0ZXJhYmxlIiwic3RyZWFtIiwib25GaW5pc2giLCJyZWFzb24iLCJsZW5ndGhDb21wdXRhYmxlIiwiZHVwbGV4QWNjZXNzZWQiLCJoYXNDb250ZW50VHlwZSIsInJlcyIsImNhbmNlbFRva2VuIiwib25Eb3dubG9hZFByb2dyZXNzIiwib25VcGxvYWRQcm9ncmVzcyIsIndpdGhDcmVkZW50aWFscyIsImZldGNoT3B0aW9ucyIsImNvbXBvc2VkU2lnbmFsIiwic3RvcFRpbWVvdXQiLCJmaW5pc2hlZCIsInJlcXVlc3RDb250ZW50TGVuZ3RoIiwiX3JlcXVlc3QiLCJjb250ZW50VHlwZUhlYWRlciIsImlzU3RyZWFtUmVzcG9uc2UiLCJyZXNwb25zZUNvbnRlbnRMZW5ndGgiLCJyZXNwb25zZURhdGEiLCJhZGFwdGVyIiwiYWRhcHRlcnMiLCJuYW1lT3JBZGFwdGVyIiwicmVqZWN0ZWRSZWFzb25zIiwicmVhc29ucyIsIlZFUlNJT04iLCJ2YWxpZGF0b3IiLCJmb3JtYXRNZXNzYWdlIiwic2NoZW1hIiwiYWxsb3dVbmtub3duIiwiaW5zdGFuY2VDb25maWciLCJjb25maWdPclVybCIsImR1bW15IiwicGFyYW1zU2VyaWFsaXplciIsImNvbnRleHRIZWFkZXJzIiwicmVxdWVzdEludGVyY2VwdG9yQ2hhaW4iLCJzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMiLCJpbnRlcmNlcHRvciIsInJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbiIsImNoYWluIiwiZnVsbFBhdGgiLCJmb3JFYWNoTWV0aG9kTm9EYXRhIiwiZm9yRWFjaE1ldGhvZFdpdGhEYXRhIiwiZ2VuZXJhdGVIVFRQTWV0aG9kIiwiaXNGb3JtIiwiZXhlY3V0b3IiLCJyZXNvbHZlUHJvbWlzZSIsIm9uZnVsZmlsbGVkIiwiX3Jlc29sdmUiLCJjIiwicGF5bG9hZCIsImRlZmF1bHRDb25maWciLCJpbnN0YW5jZSIsImFsbCIsInByb21pc2VzIiwiYXhpb3NfMSIsIkF4aW9zQ2xpZW50XzEiLCJBeGlvc0NsaWVudCIsInJlc3BvbnNlSGFuZGxlciIsInJlcXVlc3RDb25maWdCdWlsZGVyIiwicmVxdWVzdENvbmZpZyIsImhhc1N5bWJvbHMiLCJzeW0iLCJzeW1PYmoiLCJzeW1WYWwiLCJzeW1zIiwiaGFzTmF0aXZlU3ltYm9scyIsImhhc1Byb3RvIiwidG9TdHIiLCJjb25jYXR0eSIsInNsaWN5IiwiYXJyTGlrZSIsImpvaW5lciIsImltcGxlbWVudGF0aW9uIiwiYm91bmQiLCJiaW5kZXIiLCJib3VuZExlbmd0aCIsImJvdW5kQXJncyIsIkVtcHR5IiwidW5kZWZpbmVkIiwiJFN5bnRheEVycm9yIiwicmVxdWlyZSQkNCIsIiRUeXBlRXJyb3IiLCJyZXF1aXJlJCQ1IiwicmVxdWlyZSQkNiIsImV4cHJlc3Npb25TeW50YXgiLCIkZ09QRCIsInJlcXVpcmUkJDciLCJyZXF1aXJlJCQ4IiwieCIsImRvRXZhbCIsImdlbiIsInJlcXVpcmUkJDkiLCJyZXF1aXJlJCQxMCIsIiRjb25jYXQiLCIkcmVwbGFjZSIsInN0cmluZ1RvUGF0aCIsInF1b3RlIiwic3ViU3RyaW5nIiwiZ2V0QmFzZUludHJpbnNpYyIsImFsbG93TWlzc2luZyIsImludHJpbnNpY05hbWUiLCJhbGlhcyIsIkdldEludHJpbnNpYyIsImludHJpbnNpY0Jhc2VOYW1lIiwiaW50cmluc2ljIiwiaW50cmluc2ljUmVhbE5hbWUiLCJza2lwRnVydGhlckNhY2hpbmciLCJpc093biIsInBhcnQiLCIkZGVmaW5lUHJvcGVydHkiLCJnb3BkIiwiZGVmaW5lRGF0YVByb3BlcnR5IiwicHJvcGVydHkiLCJub25FbnVtZXJhYmxlIiwibm9uV3JpdGFibGUiLCJub25Db25maWd1cmFibGUiLCJsb29zZSIsImhhc1Byb3BlcnR5RGVzY3JpcHRvcnMiLCJoYXNBcnJheUxlbmd0aERlZmluZUJ1ZyIsIiRmbG9vciIsInNldEZ1bmN0aW9uTGVuZ3RoIiwiZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZSIsImZ1bmN0aW9uTGVuZ3RoSXNXcml0YWJsZSIsIiRhcHBseSIsIiRjYWxsIiwiJHJlZmxlY3RBcHBseSIsIiRtYXgiLCJvcmlnaW5hbEZ1bmN0aW9uIiwiYXBwbHlCaW5kIiwiY2FsbEJvdW5kIiwiY2FsbEJvdW5kSW50cmluc2ljIiwiTyIsInNlcFJlZ2V4IiwiaW50IiwiaW50U3RyIiwiZGVjIiwiaW5zcGVjdF8iLCJzZWVuIiwiaGFzIiwiY3VzdG9tSW5zcGVjdCIsIm51bWVyaWNTZXBhcmF0b3IiLCJiaWdJbnRTdHIiLCJpbmRlbnQiLCJub0luZGVudCIsIm5ld09wdHMiLCJzeW1TdHJpbmciLCJpc0VsZW1lbnQiLCJ4cyIsIm1hcFBhcnRzIiwic2V0UGFydHMiLCJ5cyIsImlzUGxhaW5PYmplY3QiLCJwcm90b1RhZyIsInN0cmluZ1RhZyIsImNvbnN0cnVjdG9yVGFnIiwiZGVmYXVsdFN0eWxlIiwicXVvdGVDaGFyIiwidHJhaWxlciIsImVudHJpZXMiLCJqb2luZWRFbnRyaWVzIiwiYmFzZUluZGVudCIsImxpbmVKb2luZXIiLCJpc0FyciIsInN5bU1hcCIsImN1cnIiLCJvYmplY3RzIiwiZ2V0U2lkZUNoYW5uZWwiLCIkd20iLCIkbSIsIiRvIiwiY2hhbm5lbCIsImZvcm1hdHMiLCJjb21wYWN0UXVldWUiLCJpdGVtIiwiY29tcGFjdGVkIiwibWVyZ2VUYXJnZXQiLCJ0YXJnZXRJdGVtIiwiYXNzaWduU2luZ2xlU291cmNlIiwiZGVjb2RlciIsImNoYXJzZXQiLCJzdHJXaXRob3V0UGx1cyIsImRlZmF1bHRFbmNvZGVyIiwiJDAiLCJvdXQiLCJzZWdtZW50IiwiY29tcGFjdCIsInJlZnMiLCJjb21iaW5lIiwibWF5YmVNYXAiLCJicmFja2V0cyIsImluZGljZXMiLCJyZXBlYXQiLCJ2YWx1ZU9yQXJyYXkiLCJzZXJpYWxpemVEYXRlIiwiaXNOb25OdWxsaXNoUHJpbWl0aXZlIiwic3RyaW5naWZ5IiwiZ2VuZXJhdGVBcnJheVByZWZpeCIsImNvbW1hUm91bmRUcmlwIiwiYWxsb3dFbXB0eUFycmF5cyIsInN0cmljdE51bGxIYW5kbGluZyIsInNraXBOdWxscyIsImVuY29kZURvdEluS2V5cyIsImFsbG93RG90cyIsImZvcm1hdHRlciIsImVuY29kZVZhbHVlc09ubHkiLCJzaWRlQ2hhbm5lbCIsInRtcFNjIiwiZmluZEZsYWciLCJrZXlWYWx1ZSIsIm9iaktleXMiLCJlbmNvZGVkUHJlZml4IiwiYWRqdXN0ZWRQcmVmaXgiLCJlbmNvZGVkS2V5Iiwia2V5UHJlZml4IiwidmFsdWVTaWRlQ2hhbm5lbCIsIm5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMiLCJhcnJheUZvcm1hdCIsImpvaW5lZCIsIm51bWJlclN0ciIsInBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMiLCJjbGVhblN0ciIsImxpbWl0Iiwic2tpcEluZGV4IiwiYnJhY2tldEVxdWFsc1BvcyIsImVuY29kZWRWYWwiLCJleGlzdGluZyIsInZhbHVlc1BhcnNlZCIsImxlYWYiLCJjbGVhblJvb3QiLCJkZWNvZGVkUm9vdCIsInBhcnNlUXVlcnlTdHJpbmdLZXlzIiwiZ2l2ZW5LZXkiLCJub3JtYWxpemVQYXJzZU9wdGlvbnMiLCJwYXJzZSIsInRlbXBPYmoiLCJuZXdPYmoiLCJfaGFzQnVmZmVyIiwiX1REIiwiX1RFIiwiYjY0Y2giLCJiNjRjaHMiLCJiNjR0YWIiLCJ0YWIiLCJiNjRyZSIsIl9mcm9tQ0MiLCJfVThBZnJvbSIsIml0IiwiX21rVXJpU2FmZSIsIm0wIiwiX3RpZHlCNjQiLCJidG9hUG9seWZpbGwiLCJiaW4iLCJ1MzIiLCJjMCIsImMxIiwiYzIiLCJhc2MiLCJwYWQiLCJfYnRvYSIsIl9mcm9tVWludDhBcnJheSIsInU4YSIsIm1heGFyZ3MiLCJzdHJzIiwiZnJvbVVpbnQ4QXJyYXkiLCJ1cmxzYWZlIiwiY2JfdXRvYiIsImNjIiwicmVfdXRvYiIsInV0b2IiLCJ1IiwiZW5jb2RlVVJJIiwicmVfYnRvdSIsImNiX2J0b3UiLCJjY2NjIiwiY3AiLCJidG91IiwiYXRvYlBvbHlmaWxsIiwidTI0IiwicjEiLCJyMiIsIl9hdG9iIiwiX3RvVWludDhBcnJheSIsInRvVWludDhBcnJheSIsIl91blVSSSIsIl9kZWNvZGUiLCJkZWNvZGUiLCJpc1ZhbGlkIiwiX25vRW51bSIsImV4dGVuZFN0cmluZyIsIl9hZGQiLCJleHRlbmRVaW50OEFycmF5IiwiZXh0ZW5kQnVpbHRpbnMiLCJnQmFzZTY0IiwiS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyXzEiLCJLaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIiLCJyZXF1ZXN0VXJsIiwiX2QiLCJfZSIsIl9mIiwiX2ciLCJfaCIsIl9qIiwiX2siLCJwcm94eUNvbmZpZyIsInJlcXVlc3RUb2tlbiIsImJhc2ljQXV0aCIsInVzZXJBZ2VudCIsImJhc2ljQXV0aEhlYWRlcnMiLCJwbGF0Zm9ybURlcHNIZWFkZXJzIiwiY29tbW9uSGVhZGVycyIsImFwaVRva2VuIiwiS2ludG9uZVJlc3BvbnNlSGFuZGxlcl8xIiwiS2ludG9uZVJlc3BvbnNlSGFuZGxlciIsImVuYWJsZUFib3J0U2VhcmNoRXJyb3IiLCJlcnJvclJlc3BvbnNlIiwiS2ludG9uZVJlc3RBUElDbGllbnRfMSIsIktpbnRvbmVSZXN0QVBJQ2xpZW50IiwiaHR0cENsaWVudCIsInNvY2tldFRpbWVvdXQiLCJfX3NldE1vZHVsZURlZmF1bHQiLCJfX2ltcG9ydFN0YXIiLCJicm93c2VyRGVwcyIsIkZpZWxkVHlwZSIsIkNhbGNGb3JtYXQiLCJmaWVsZCIsIm51bWJlckFycmF5IiwiY2FsY0ZpZWxkIiwidmFycyIsInZhck5hbWUiLCJhcGkiLCJlbGVtZW50IiwidmFyVmFsdWVzIiwiZGF0YXMiLCJsb29rdXBGaXhlZEZpZWxkQ29kZXMiLCJpc0tleSIsInJmcm9tIiwibWFwcGluZ0RhdGEiLCJhcHBJZCIsIm5lZWRDcmVhdGUiLCJ0YXJnZXRGaWVsZCIsIm1hcHBpbmdSdWxlcyIsInVwZGF0ZVJlY29yZHMiLCJ0YXJnZXRSZWNvcmQiLCJ1cGRhdGVSZWNvcmQiLCJtYXBwaW5nIiwicXVlcnlTdHIiLCJ2ZnJvbSIsImZpbHRlckhhbmRsZXIiLCJhY2N1bXVsYXRvciIsIm1heExlbmd0aCIsInRvZGF5IiwiZmllbGRUeXBlIiwiaW5wdXRWYWx1ZSIsImZpZWxkQ29kZSIsImZpZWxkUmVxdWlyZWQiLCJpbnB1dE51bWJlclZhbHVlIiwidHdvRGlnaXRNb250aERheSIsInNpbmdsZURpZ2l0TW9udGhEYXkiLCJzaW5nbGVEaWdpdE1vbnRoIiwic2luZ2xlRGlnaXREYXkiLCJkYXRlVGltZSIsImRhdGVBcnJheSIsInllYXJJbmRleCIsIm1vbnRoSW5kZXgiLCJkYXlJbmRleCIsImZpZWxkT3B0aW9ucyIsIm9wdGlvbnNJbmRleCIsInVzZXJzTmFtZSIsIm9yZ2FuaXphdGlvbk5hbWUiLCJncm91cHNOYW1lIiwiZmllbGRDb2x1bW5JbmRleCIsInZhbHVlQ29sdW1uSW5kZXgiLCJpbnNlcnRWYWx1ZVR5cGUiLCJ2YXJpYWJsZVZhbHVlIiwiY29ycmVjdEZvcm1hdHRlZFZhbHVlIiwiY29ycmVjdFZhbHVlcyIsIm5vdElucHV0RXJyb3IiLCJmb3JtYXR0ZWREYXRlIiwidXNlcnMiLCJvcmdhbml6YXRpb25zIiwiZ2V0VmFsdWUiLCJtb3RvdGV4dCIsImpvaW5GaWVsZDF0eXBlIiwiam9pbkZpZWxkMnR5cGUiLCJzYXZlRmllbGR0eXBlIiwiam9pblZhbHVlMSIsImpvaW5WYWx1ZTIiLCJjb25TdHJpbmciLCJzYXZlVmFsdWUiLCJjaGVja1JlZ2V4IiwiZWxlbWVudE1hcCIsImluc3RhbmNlTWFwIiwiVFJBTlNJVElPTl9FTkQiLCJwYXJzZVNlbGVjdG9yIiwiZ2V0VUlEIiwiZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJ0cmFuc2l0aW9uRGVsYXkiLCJmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiIsImZsb2F0VHJhbnNpdGlvbkRlbGF5IiwidHJpZ2dlclRyYW5zaXRpb25FbmQiLCJnZXRFbGVtZW50IiwiaXNWaXNpYmxlIiwiZWxlbWVudElzVmlzaWJsZSIsImNsb3NlZERldGFpbHMiLCJzdW1tYXJ5IiwiaXNEaXNhYmxlZCIsImZpbmRTaGFkb3dSb290IiwicmVmbG93IiwiZ2V0alF1ZXJ5IiwiRE9NQ29udGVudExvYWRlZENhbGxiYWNrcyIsIm9uRE9NQ29udGVudExvYWRlZCIsImlzUlRMIiwiZGVmaW5lSlF1ZXJ5UGx1Z2luIiwicGx1Z2luIiwiJCIsIkpRVUVSWV9OT19DT05GTElDVCIsImV4ZWN1dGUiLCJwb3NzaWJsZUNhbGxiYWNrIiwiZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiIsInRyYW5zaXRpb25FbGVtZW50Iiwid2FpdEZvclRyYW5zaXRpb24iLCJkdXJhdGlvblBhZGRpbmciLCJlbXVsYXRlZER1cmF0aW9uIiwiY2FsbGVkIiwiZ2V0TmV4dEFjdGl2ZUVsZW1lbnQiLCJhY3RpdmVFbGVtZW50Iiwic2hvdWxkR2V0TmV4dCIsImlzQ3ljbGVBbGxvd2VkIiwibGlzdExlbmd0aCIsImluZGV4X2pzIiwibmFtZXNwYWNlUmVnZXgiLCJzdHJpcE5hbWVSZWdleCIsInN0cmlwVWlkUmVnZXgiLCJldmVudFJlZ2lzdHJ5IiwidWlkRXZlbnQiLCJjdXN0b21FdmVudHMiLCJuYXRpdmVFdmVudHMiLCJtYWtlRXZlbnRVaWQiLCJ1aWQiLCJnZXRFbGVtZW50RXZlbnRzIiwiYm9vdHN0cmFwSGFuZGxlciIsImh5ZHJhdGVPYmoiLCJFdmVudEhhbmRsZXIiLCJib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlciIsImRvbUVsZW1lbnRzIiwiZG9tRWxlbWVudCIsImZpbmRIYW5kbGVyIiwiY2FsbGFibGUiLCJkZWxlZ2F0aW9uU2VsZWN0b3IiLCJub3JtYWxpemVQYXJhbWV0ZXJzIiwib3JpZ2luYWxUeXBlRXZlbnQiLCJkZWxlZ2F0aW9uRnVuY3Rpb24iLCJpc0RlbGVnYXRlZCIsInR5cGVFdmVudCIsImdldFR5cGVFdmVudCIsImFkZEhhbmRsZXIiLCJvbmVPZmYiLCJwcmV2aW91c0Z1bmN0aW9uIiwicmVtb3ZlSGFuZGxlciIsInJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyIsInN0b3JlRWxlbWVudEV2ZW50IiwiaGFuZGxlcktleSIsImluTmFtZXNwYWNlIiwiaXNOYW1lc3BhY2UiLCJlbGVtZW50RXZlbnQiLCJrZXlIYW5kbGVycyIsImpRdWVyeUV2ZW50IiwiYnViYmxlcyIsIm5hdGl2ZURpc3BhdGNoIiwiZGVmYXVsdFByZXZlbnRlZCIsIm1ldGEiLCJub3JtYWxpemVEYXRhIiwibm9ybWFsaXplRGF0YUtleSIsImNociIsImJzS2V5cyIsInB1cmVLZXkiLCJNYW5pcHVsYXRvciIsIkNvbmZpZyIsImpzb25Db25maWciLCJjb25maWdUeXBlcyIsImV4cGVjdGVkVHlwZXMiLCJ2YWx1ZVR5cGUiLCJCYXNlQ29tcG9uZW50IiwicHJvcGVydHlOYW1lIiwiaXNBbmltYXRlZCIsImdldFNlbGVjdG9yIiwiaHJlZkF0dHJpYnV0ZSIsIlNlbGVjdG9yRW5naW5lIiwicGFyZW50cyIsImFuY2VzdG9yIiwicHJldmlvdXMiLCJmb2N1c2FibGVzIiwiTkFNRSIsIkNMQVNTX05BTUVfRkFERSIsIkNMQVNTX05BTUVfU0hPVyIsIkVWRU5UX01PVVNFRE9XTiIsIkRlZmF1bHQiLCJEZWZhdWx0VHlwZSIsIkJhY2tkcm9wIiwiYmFja2Ryb3AiLCJlbmFibGVEaXNtaXNzVHJpZ2dlciIsImNvbXBvbmVudCIsImNsaWNrRXZlbnQiLCJFVkVOVF9LRVkiLCJFVkVOVF9GT0NVU0lOIiwiRVZFTlRfS0VZRE9XTl9UQUIiLCJUQUJfS0VZIiwiVEFCX05BVl9GT1JXQVJEIiwiVEFCX05BVl9CQUNLV0FSRCIsIkZvY3VzVHJhcCIsInRyYXBFbGVtZW50IiwiU0VMRUNUT1JfRklYRURfQ09OVEVOVCIsIlNFTEVDVE9SX1NUSUNLWV9DT05URU5UIiwiUFJPUEVSVFlfUEFERElORyIsIlBST1BFUlRZX01BUkdJTiIsIlNjcm9sbEJhckhlbHBlciIsImRvY3VtZW50V2lkdGgiLCJjYWxjdWxhdGVkVmFsdWUiLCJzdHlsZVByb3BlcnR5Iiwic2Nyb2xsYmFyV2lkdGgiLCJtYW5pcHVsYXRpb25DYWxsQmFjayIsImFjdHVhbFZhbHVlIiwiY2FsbEJhY2siLCJjb21wb25lbnRGdW5jdGlvbnNfanMiLCJEQVRBX0FQSV9LRVkiLCJFU0NBUEVfS0VZIiwiRVZFTlRfSElERSIsIkVWRU5UX0hJREVfUFJFVkVOVEVEIiwiRVZFTlRfSElEREVOIiwiRVZFTlRfU0hPVyIsIkVWRU5UX1NIT1dOIiwiRVZFTlRfUkVTSVpFIiwiRVZFTlRfQ0xJQ0tfRElTTUlTUyIsIkVWRU5UX01PVVNFRE9XTl9ESVNNSVNTIiwiRVZFTlRfS0VZRE9XTl9ESVNNSVNTIiwiRVZFTlRfQ0xJQ0tfREFUQV9BUEkiLCJDTEFTU19OQU1FX09QRU4iLCJDTEFTU19OQU1FX1NUQVRJQyIsIk9QRU5fU0VMRUNUT1IiLCJTRUxFQ1RPUl9ESUFMT0ciLCJTRUxFQ1RPUl9NT0RBTF9CT0RZIiwiU0VMRUNUT1JfREFUQV9UT0dHTEUiLCJNb2RhbCIsInJlbGF0ZWRUYXJnZXQiLCJtb2RhbEJvZHkiLCJ0cmFuc2l0aW9uQ29tcGxldGUiLCJldmVudDIiLCJpc01vZGFsT3ZlcmZsb3dpbmciLCJpbml0aWFsT3ZlcmZsb3dZIiwiaXNCb2R5T3ZlcmZsb3dpbmciLCJzaG93RXZlbnQiLCJhbHJlYWR5T3BlbiIsInBsYWNlbWVudCIsIm93bmVyRG9jdW1lbnQiLCJPd25FbGVtZW50IiwiX3JlZiIsImVmZmVjdCIsIl9yZWYyIiwiaW5pdGlhbFN0eWxlcyIsInN0eWxlUHJvcGVydGllcyIsImF0dHJpYnV0ZSIsInVhRGF0YSIsImluY2x1ZGVTY2FsZSIsImlzRml4ZWRTdHJhdGVneSIsImNsaWVudFJlY3QiLCJzY2FsZVgiLCJzY2FsZVkiLCJ2aXN1YWxWaWV3cG9ydCIsImFkZFZpc3VhbE9mZnNldHMiLCJoZWlnaHQiLCJyb290Tm9kZSIsImdldENvbXB1dGVkU3R5bGUiLCJpc0ZpcmVmb3giLCJpc0lFIiwiZWxlbWVudENzcyIsImN1cnJlbnROb2RlIiwiY3NzIiwibWF0aE1heCIsIm1hdGhNaW4iLCJwYWRkaW5nT2JqZWN0IiwiaGFzaE1hcCIsInRvUGFkZGluZ09iamVjdCIsInBhZGRpbmciLCJfc3RhdGUkbW9kaWZpZXJzRGF0YSQiLCJhcnJvd0VsZW1lbnQiLCJwb3BwZXJPZmZzZXRzIiwiYmFzZVBsYWNlbWVudCIsImF4aXMiLCJpc1ZlcnRpY2FsIiwiYXJyb3dSZWN0IiwibWluUHJvcCIsIm1heFByb3AiLCJlbmREaWZmIiwic3RhcnREaWZmIiwiYXJyb3dPZmZzZXRQYXJlbnQiLCJjbGllbnRTaXplIiwiY2VudGVyVG9SZWZlcmVuY2UiLCJjZW50ZXIiLCJheGlzUHJvcCIsIl9vcHRpb25zJGVsZW1lbnQiLCJkcHIiLCJfT2JqZWN0JGFzc2lnbjIiLCJwb3BwZXIiLCJwb3BwZXJSZWN0IiwidmFyaWF0aW9uIiwib2Zmc2V0cyIsImdwdUFjY2VsZXJhdGlvbiIsImFkYXB0aXZlIiwicm91bmRPZmZzZXRzIiwiaXNGaXhlZCIsIl9vZmZzZXRzJHgiLCJfb2Zmc2V0cyR5IiwiX3JlZjMiLCJoYXNYIiwiaGFzWSIsInNpZGVYIiwic2lkZVkiLCJoZWlnaHRQcm9wIiwid2lkdGhQcm9wIiwib2Zmc2V0WSIsIm9mZnNldFgiLCJjb21tb25TdHlsZXMiLCJfcmVmNCIsIl9PYmplY3QkYXNzaWduIiwiX3JlZjUiLCJfb3B0aW9ucyRncHVBY2NlbGVyYXQiLCJfb3B0aW9ucyRhZGFwdGl2ZSIsIl9vcHRpb25zJHJvdW5kT2Zmc2V0cyIsIl9vcHRpb25zJHNjcm9sbCIsInNjcm9sbCIsIl9vcHRpb25zJHJlc2l6ZSIsInJlc2l6ZSIsInNjcm9sbFBhcmVudHMiLCJzY3JvbGxQYXJlbnQiLCJzY3JvbGxMZWZ0Iiwic2Nyb2xsVG9wIiwic3RyYXRlZ3kiLCJsYXlvdXRWaWV3cG9ydCIsIl9lbGVtZW50JG93bmVyRG9jdW1lbiIsIndpblNjcm9sbCIsIl9nZXRDb21wdXRlZFN0eWxlIiwib3ZlcmZsb3ciLCJvdmVyZmxvd1giLCJvdmVyZmxvd1kiLCJpc0JvZHkiLCJ1cGRhdGVkTGlzdCIsImNsaXBwaW5nUGFyZW50IiwiY2xpcHBpbmdQYXJlbnRzIiwiY2FuRXNjYXBlQ2xpcHBpbmciLCJjbGlwcGVyRWxlbWVudCIsImJvdW5kYXJ5Iiwicm9vdEJvdW5kYXJ5IiwibWFpbkNsaXBwaW5nUGFyZW50cyIsImZpcnN0Q2xpcHBpbmdQYXJlbnQiLCJjbGlwcGluZ1JlY3QiLCJhY2NSZWN0IiwicmVmZXJlbmNlIiwiY29tbW9uWCIsImNvbW1vblkiLCJtYWluQXhpcyIsIl9vcHRpb25zIiwiX29wdGlvbnMkcGxhY2VtZW50IiwiX29wdGlvbnMkc3RyYXRlZ3kiLCJfb3B0aW9ucyRib3VuZGFyeSIsIl9vcHRpb25zJHJvb3RCb3VuZGFyeSIsIl9vcHRpb25zJGVsZW1lbnRDb250ZSIsImVsZW1lbnRDb250ZXh0IiwiX29wdGlvbnMkYWx0Qm91bmRhcnkiLCJhbHRCb3VuZGFyeSIsIl9vcHRpb25zJHBhZGRpbmciLCJhbHRDb250ZXh0IiwiY2xpcHBpbmdDbGllbnRSZWN0IiwicmVmZXJlbmNlQ2xpZW50UmVjdCIsInBvcHBlckNsaWVudFJlY3QiLCJlbGVtZW50Q2xpZW50UmVjdCIsIm92ZXJmbG93T2Zmc2V0cyIsIm9mZnNldERhdGEiLCJtdWx0aXBseSIsImZsaXBWYXJpYXRpb25zIiwiX29wdGlvbnMkYWxsb3dlZEF1dG9QIiwiYWxsb3dlZEF1dG9QbGFjZW1lbnRzIiwiYWxsUGxhY2VtZW50cyIsInBsYWNlbWVudHMiLCJhbGxvd2VkUGxhY2VtZW50cyIsIm92ZXJmbG93cyIsIm9wcG9zaXRlUGxhY2VtZW50IiwiX29wdGlvbnMkbWFpbkF4aXMiLCJjaGVja01haW5BeGlzIiwiX29wdGlvbnMkYWx0QXhpcyIsImNoZWNrQWx0QXhpcyIsInNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyIsIl9vcHRpb25zJGZsaXBWYXJpYXRpbyIsInByZWZlcnJlZFBsYWNlbWVudCIsImlzQmFzZVBsYWNlbWVudCIsImZhbGxiYWNrUGxhY2VtZW50cyIsInJlZmVyZW5jZVJlY3QiLCJjaGVja3NNYXAiLCJtYWtlRmFsbGJhY2tDaGVja3MiLCJmaXJzdEZpdHRpbmdQbGFjZW1lbnQiLCJfYmFzZVBsYWNlbWVudCIsImlzU3RhcnRWYXJpYXRpb24iLCJtYWluVmFyaWF0aW9uU2lkZSIsImFsdFZhcmlhdGlvblNpZGUiLCJjaGVja3MiLCJudW1iZXJPZkNoZWNrcyIsIl9sb29wIiwiZml0dGluZ1BsYWNlbWVudCIsIl9yZXQiLCJwcmV2ZW50ZWRPZmZzZXRzIiwic2lkZSIsInJlZmVyZW5jZU92ZXJmbG93IiwicG9wcGVyQWx0T3ZlcmZsb3ciLCJyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMiLCJwb3BwZXJFc2NhcGVPZmZzZXRzIiwiaXNSZWZlcmVuY2VIaWRkZW4iLCJoYXNQb3BwZXJFc2NhcGVkIiwicmVjdHMiLCJpbnZlcnREaXN0YW5jZSIsInNraWRkaW5nIiwiZGlzdGFuY2UiLCJfb3B0aW9ucyRvZmZzZXQiLCJfZGF0YSRzdGF0ZSRwbGFjZW1lbnQiLCJfb3B0aW9ucyR0ZXRoZXIiLCJ0ZXRoZXIiLCJfb3B0aW9ucyR0ZXRoZXJPZmZzZXQiLCJ0ZXRoZXJPZmZzZXQiLCJhbHRBeGlzIiwidGV0aGVyT2Zmc2V0VmFsdWUiLCJub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUiLCJvZmZzZXRNb2RpZmllclN0YXRlIiwiX29mZnNldE1vZGlmaWVyU3RhdGUkIiwibWFpblNpZGUiLCJhbHRTaWRlIiwiYWRkaXRpdmUiLCJtaW5MZW4iLCJtYXhMZW4iLCJhcnJvd1BhZGRpbmdPYmplY3QiLCJhcnJvd1BhZGRpbmdNaW4iLCJhcnJvd1BhZGRpbmdNYXgiLCJhcnJvd0xlbiIsIm1pbk9mZnNldCIsIm1heE9mZnNldCIsImNsaWVudE9mZnNldCIsIm9mZnNldE1vZGlmaWVyVmFsdWUiLCJ0ZXRoZXJNaW4iLCJ0ZXRoZXJNYXgiLCJwcmV2ZW50ZWRPZmZzZXQiLCJfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIiwiX21haW5TaWRlIiwiX2FsdFNpZGUiLCJfb2Zmc2V0IiwiX2xlbiIsIl9taW4iLCJfbWF4IiwiaXNPcmlnaW5TaWRlIiwiX29mZnNldE1vZGlmaWVyVmFsdWUiLCJfdGV0aGVyTWluIiwiX3RldGhlck1heCIsIl9wcmV2ZW50ZWRPZmZzZXQiLCJlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCIsImlzT2Zmc2V0UGFyZW50QW5FbGVtZW50Iiwib2Zmc2V0UGFyZW50SXNTY2FsZWQiLCJtb2RpZmllcnMiLCJ2aXNpdGVkIiwibW9kaWZpZXIiLCJyZXF1aXJlcyIsImRlcCIsImRlcE1vZGlmaWVyIiwib3JkZXJlZE1vZGlmaWVycyIsInBoYXNlIiwicGVuZGluZyIsImdlbmVyYXRvck9wdGlvbnMiLCJfZ2VuZXJhdG9yT3B0aW9ucyIsIl9nZW5lcmF0b3JPcHRpb25zJGRlZiIsImRlZmF1bHRNb2RpZmllcnMiLCJfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyIiwiZGVmYXVsdE9wdGlvbnMiLCJlZmZlY3RDbGVhbnVwRm5zIiwiaXNEZXN0cm95ZWQiLCJzZXRPcHRpb25zQWN0aW9uIiwiY2xlYW51cE1vZGlmaWVyRWZmZWN0cyIsInJ1bk1vZGlmaWVyRWZmZWN0cyIsIl9zdGF0ZSRlbGVtZW50cyIsIl9zdGF0ZSRvcmRlcmVkTW9kaWZpZSIsIl9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIiLCJfcmVmJG9wdGlvbnMiLCJjbGVhbnVwRm4iLCJub29wRm4iLCJjcmVhdGVQb3BwZXIiLCJjb21wdXRlU3R5bGVzIiwiYXBwbHlTdHlsZXMiLCJmbGlwIiwicHJldmVudE92ZXJmbG93IiwiYXJyb3ciLCJoaWRlIiwiYWJzRGVsdGFYIiwiZGlyZWN0aW9uIiwiaXRlbXMiLCJhY3RpdmVJbmRleCIsIm9yZGVyIiwiaW1nIiwic3dpcGVDb25maWciLCJhY3RpdmVJbmRpY2F0b3IiLCJuZXdBY3RpdmVJbmRpY2F0b3IiLCJlbGVtZW50SW50ZXJ2YWwiLCJpc05leHQiLCJuZXh0RWxlbWVudCIsIm5leHRFbGVtZW50SW5kZXgiLCJ0cmlnZ2VyRXZlbnQiLCJldmVudE5hbWUiLCJpc0N5Y2xpbmciLCJkaXJlY3Rpb25hbENsYXNzTmFtZSIsIm9yZGVyQ2xhc3NOYW1lIiwiY29tcGxldGVDYWxsQmFjayIsImNhcm91c2VsIiwic2xpZGVJbmRleCIsImNhcm91c2VscyIsInRvZ2dsZUxpc3QiLCJmaWx0ZXJFbGVtZW50IiwiZm91bmRFbGVtZW50IiwiYWN0aXZlQ2hpbGRyZW4iLCJhY3RpdmVJbnN0YW5jZSIsInNjcm9sbFNpemUiLCJ0cmlnZ2VyIiwiY2hpbGRyZW4iLCJ0cmlnZ2VyQXJyYXkiLCJpc09wZW4iLCJyZWZlcmVuY2VFbGVtZW50IiwicG9wcGVyQ29uZmlnIiwiUG9wcGVyLmNyZWF0ZVBvcHBlciIsInBhcmVudERyb3Bkb3duIiwiaXNFbmQiLCJwb3BwZXJEYXRhIiwiZGVmYXVsdEJzUG9wcGVyQ29uZmlnIiwib3BlblRvZ2dsZXMiLCJjb21wb3NlZFBhdGgiLCJpc01lbnVUYXJnZXQiLCJpc0lucHV0IiwiaXNFc2NhcGVFdmVudCIsImlzVXBPckRvd25FdmVudCIsImdldFRvZ2dsZUJ1dHRvbiIsImNvbXBsZXRlQ2FsbGJhY2siLCJjbGlja0NhbGxiYWNrIiwiYWxsb3dlZEF0dHJpYnV0ZUxpc3QiLCJhdHRyaWJ1dGVOYW1lIiwiYXR0cmlidXRlUmVnZXgiLCJ1bnNhZmVIdG1sIiwiYWxsb3dMaXN0Iiwic2FuaXRpemVGdW5jdGlvbiIsImNyZWF0ZWREb2N1bWVudCIsImVsZW1lbnROYW1lIiwiYXR0cmlidXRlTGlzdCIsImFsbG93ZWRBdHRyaWJ1dGVzIiwidGVtcGxhdGVXcmFwcGVyIiwiZXh0cmFDbGFzcyIsInRlbXBsYXRlRWxlbWVudCIsImlzSW5UaGVEb20iLCJ0aXAiLCJ0aXBJZCIsImF0dGFjaG1lbnQiLCJ0cmlnZ2VycyIsImV2ZW50SW4iLCJldmVudE91dCIsInRpdGxlIiwiZGF0YUF0dHJpYnV0ZXMiLCJkYXRhQXR0cmlidXRlIiwic2VjdGlvbiIsIm9ic2VydmFibGVTZWN0aW9uIiwidGFyZ2V0RWxlbWVudCIsImVudHJ5IiwiYWN0aXZhdGUiLCJwYXJlbnRTY3JvbGxUb3AiLCJ1c2VyU2Nyb2xsc0Rvd24iLCJlbnRyeUlzTG93ZXJUaGFuUHJldmlvdXMiLCJ0YXJnZXRMaW5rcyIsImFuY2hvciIsImxpc3RHcm91cCIsImFjdGl2ZU5vZGVzIiwic3B5IiwiaW5uZXJFbGVtIiwiYWN0aXZlIiwiaGlkZUV2ZW50IiwicmVsYXRlZEVsZW0iLCJuZXh0QWN0aXZlRWxlbWVudCIsImlzQWN0aXZlIiwib3V0ZXJFbGVtIiwib3BlbiIsImlzSW50ZXJhY3RpbmciLCJsb29rVXBGaWVsZCIsInRhcmdldFJlY29yZHMiLCJyIiwiZGlhbG9nIiwibW9kYWxIVE1MIiwiZXYiLCJkaWFsb2dCb2R5IiwiaHRtbHJvdyIsImxvb2tVcEZpZWxkcyIsImV2ZW50SWQiLCJmbG93IiwibmV4dEFjdGlvbiIsImFjdGlvbiIsIm5leHRJbnB1dCIsImRpc3BsYXlOYW1lIiwicGxhY2Vob2xkZXIiLCJtb2RlbFZhbHVlIiwiaW5wdXRQb2ludCIsIm91dHB1dFBvaW50cyIsImFjdGlvblByb3BzIiwiZGVmUHJvcCIsInByb3BWYWx1ZSIsInN1YlRpdGxlIiwiYWN0aW9uTm9kZXMiLCJuZXh0Tm9kZUlkcyIsInBhcnNlZE9iamVjdCIsIm5vZGVDbGFzcyIsImFjdGlvbkZsb3ciLCJnZXRDaGFuZ2VFdmVudHMiLCJnZXRDbGlja0V2ZW50cyIsImdldEtpbnRvbmVFdmVudHMiLCJjaGFuZ2VFdmVudHMiLCJjbGlja0V2ZW50cyIsImtpbnRvbmVFdmVudHMiLCJmbG93aW5mbyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O2lCQVVFLFNBQVVBLEVBQVFDLEVBQVUsQ0FhNUJDLEVBQUEsUUFBaUJGLEVBQU8sU0FDdkJDLEVBQVNELEVBQVEsRUFBTSxFQUN2QixTQUFVRyxFQUFJLENBQ2IsR0FBSyxDQUFDQSxFQUFFLFNBQ1AsTUFBTSxJQUFJLE1BQU8sNENBRWxCLE9BQU9GLEVBQVNFLEVBQ3BCLENBTUEsR0FBSyxPQUFPLE9BQVcsSUFBYyxPQUFTQyxlQUFNLFNBQVVDLEVBQVFDLEVBQVcsQ0FRakYsSUFBSUMsRUFBTSxDQUFBLEVBRU5DLEVBQVcsT0FBTyxlQUVsQkMsRUFBUUYsRUFBSSxNQUVaRyxFQUFPSCxFQUFJLEtBQU8sU0FBVUksRUFBUSxDQUN2QyxPQUFPSixFQUFJLEtBQUssS0FBTUksQ0FBSyxDQUMzQixFQUFHLFNBQVVBLEVBQVEsQ0FDckIsT0FBT0osRUFBSSxPQUFPLE1BQU8sQ0FBRSxFQUFFSSxDQUFLLENBQ25DLEVBR0lDLEVBQU9MLEVBQUksS0FFWE0sRUFBVU4sRUFBSSxRQUVkTyxFQUFhLENBQUEsRUFF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LEVBQVN0VSxFQUFNLE9BQ3JCLFFBQVEsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFBc1UsQ0FBTyxDQUFBLENBQUEsQ0FDaEMsQ0FBQSxDQUNGLENBRVAsQ0FBQyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3XX0=