webcodecs-utils 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -299,7 +299,7 @@ class AudioCaptureProcessor extends AudioWorkletProcessor {
299
299
  }
300
300
 
301
301
  registerProcessor('audio-capture-processor', AudioCaptureProcessor);
302
- `;class un{constructor({track:e}){const i=e.getSettings();if(!i)throw new Error("track has no settings");if(e.kind==="video")this.readable=this.createVideoStream(e,i);else if(e.kind==="audio")this.readable=this.createAudioStream(e,i);else throw new Error(`Unsupported track kind: ${e.kind}`)}createVideoStream(e,i){let n,c;const o=i.frameRate??30;return new ReadableStream({async start(){n=document.createElement("video"),n.srcObject=new MediaStream([e]),await Promise.all([n.play(),new Promise(m=>{n.onloadedmetadata=m})]),c=performance.now()},async pull(m){for(;;){const h=performance.now();if(h-c<1e3/o){await new Promise(S=>requestAnimationFrame(S));continue}c=h,m.enqueue(new VideoFrame(n,{timestamp:c*1e3}));break}}})}createAudioStream(e,i){let n,c,o;return new ReadableStream({async start(m){n=new AudioContext({sampleRate:i.sampleRate||48e3});const h=new MediaStreamAudioSourceNode(n,{mediaStream:new MediaStream([e])}),S=new Blob([Ga],{type:"application/javascript"});o=URL.createObjectURL(S),await n.audioWorklet.addModule(o),c=new AudioWorkletNode(n,"audio-capture-processor",{numberOfInputs:1,numberOfOutputs:0,channelCount:i.channelCount||2}),h.connect(c),c.port.onmessage=T=>{const{timestamp:G,channels:f}=T.data,A=f,w=A[0].length,E=A.length,F=w*E,N=new Float32Array(F);for(let K=0;K<E;K++)N.set(A[K],K*w);try{const K=new AudioData({format:"f32-planar",sampleRate:n.sampleRate,numberOfFrames:w,numberOfChannels:E,timestamp:G,data:N});m.enqueue(K)}catch(K){console.error("Failed to create AudioData:",K)}}},cancel(){c&&(c.disconnect(),c.port.onmessage=null),n&&n.close(),o&&URL.revokeObjectURL(o)}})}}self.MediaStreamTrackProcessor||(self.MediaStreamTrackProcessor=un);const va=self.MediaStreamTrackProcessor||un;var Ia=Object.defineProperty,Va=(t,e,i)=>e in t?Ia(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,oi=(t,e,i)=>(Va(t,typeof e!="symbol"?e+"":e,i),i),I0=(t=>(t[t.AVMEDIA_TYPE_UNKNOWN=-1]="AVMEDIA_TYPE_UNKNOWN",t[t.AVMEDIA_TYPE_VIDEO=0]="AVMEDIA_TYPE_VIDEO",t[t.AVMEDIA_TYPE_AUDIO=1]="AVMEDIA_TYPE_AUDIO",t[t.AVMEDIA_TYPE_DATA=2]="AVMEDIA_TYPE_DATA",t[t.AVMEDIA_TYPE_SUBTITLE=3]="AVMEDIA_TYPE_SUBTITLE",t[t.AVMEDIA_TYPE_ATTACHMENT=4]="AVMEDIA_TYPE_ATTACHMENT",t[t.AVMEDIA_TYPE_NB=5]="AVMEDIA_TYPE_NB",t))(I0||{}),di=(t=>(t[t.AVSEEK_FLAG_BACKWARD=1]="AVSEEK_FLAG_BACKWARD",t[t.AVSEEK_FLAG_BYTE=2]="AVSEEK_FLAG_BYTE",t[t.AVSEEK_FLAG_ANY=4]="AVSEEK_FLAG_ANY",t[t.AVSEEK_FLAG_FRAME=8]="AVSEEK_FLAG_FRAME",t))(di||{}),rt=(t=>(t.WasmWorkerLoaded="WasmWorkerLoaded",t.WASMRuntimeInitialized="WASMRuntimeInitialized",t.LoadWASM="LoadWASM",t.GetAVPacket="GetAVPacket",t.GetAVPackets="GetAVPackets",t.GetAVStream="GetAVStream",t.GetAVStreams="GetAVStreams",t.GetMediaInfo="GetMediaInfo",t.ReadAVPacket="ReadAVPacket",t.AVPacketStream="AVPacketStream",t.ReadNextAVPacket="ReadNextAVPacket",t.StopReadAVPacket="StopReadAVPacket",t.SetAVLogLevel="SetAVLogLevel",t))(rt||{});const hn="video",Ra="audio",Ta="subtitle",ws={VIDEO:hn},Ci={[hn]:I0.AVMEDIA_TYPE_VIDEO,[Ra]:I0.AVMEDIA_TYPE_AUDIO,[Ta]:I0.AVMEDIA_TYPE_SUBTITLE},bn="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBBZT0oRT0+KEVbRS5BVk1FRElBX1RZUEVfVU5LTk9XTj0tMV09IkFWTUVESUFfVFlQRV9VTktOT1dOIixFW0UuQVZNRURJQV9UWVBFX1ZJREVPPTBdPSJBVk1FRElBX1RZUEVfVklERU8iLEVbRS5BVk1FRElBX1RZUEVfQVVESU89MV09IkFWTUVESUFfVFlQRV9BVURJTyIsRVtFLkFWTUVESUFfVFlQRV9EQVRBPTJdPSJBVk1FRElBX1RZUEVfREFUQSIsRVtFLkFWTUVESUFfVFlQRV9TVUJUSVRMRT0zXT0iQVZNRURJQV9UWVBFX1NVQlRJVExFIixFW0UuQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ9NF09IkFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UIixFW0UuQVZNRURJQV9UWVBFX05CPTVdPSJBVk1FRElBX1RZUEVfTkIiLEUpKShBZXx8e30pLEc9KEU9PihFLldhc21Xb3JrZXJMb2FkZWQ9Ildhc21Xb3JrZXJMb2FkZWQiLEUuV0FTTVJ1bnRpbWVJbml0aWFsaXplZD0iV0FTTVJ1bnRpbWVJbml0aWFsaXplZCIsRS5Mb2FkV0FTTT0iTG9hZFdBU00iLEUuR2V0QVZQYWNrZXQ9IkdldEFWUGFja2V0IixFLkdldEFWUGFja2V0cz0iR2V0QVZQYWNrZXRzIixFLkdldEFWU3RyZWFtPSJHZXRBVlN0cmVhbSIsRS5HZXRBVlN0cmVhbXM9IkdldEFWU3RyZWFtcyIsRS5HZXRNZWRpYUluZm89IkdldE1lZGlhSW5mbyIsRS5SZWFkQVZQYWNrZXQ9IlJlYWRBVlBhY2tldCIsRS5BVlBhY2tldFN0cmVhbT0iQVZQYWNrZXRTdHJlYW0iLEUuUmVhZE5leHRBVlBhY2tldD0iUmVhZE5leHRBVlBhY2tldCIsRS5TdG9wUmVhZEFWUGFja2V0PSJTdG9wUmVhZEFWUGFja2V0IixFLlNldEFWTG9nTGV2ZWw9IlNldEFWTG9nTGV2ZWwiLEUpKShHfHx7fSk7InZpZGVvIisiIixBZS5BVk1FRElBX1RZUEVfVklERU8sImF1ZGlvIisiIixBZS5BVk1FRElBX1RZUEVfQVVESU8sInN1YnRpdGxlIisiIixBZS5BVk1FRElBX1RZUEVfU1VCVElUTEU7dmFyIGl0PSgoKT0+e3ZhciBFPXNlbGYubG9jYXRpb24uaHJlZjtyZXR1cm4gZnVuY3Rpb24oUj17fSl7dmFyIEMsZj1PYmplY3QuYXNzaWduKHt9LFIpLFUsSCxuZT1uZXcgUHJvbWlzZSgoZSxyKT0+e1U9ZSxIPXJ9KSxhZT0hMCxEZT1PYmplY3QuYXNzaWduKHt9LGYpLGhyPSIuL3RoaXMucHJvZ3JhbSIscT0iIjtmdW5jdGlvbiBtdChlKXtyZXR1cm4gZi5sb2NhdGVGaWxlP2YubG9jYXRlRmlsZShlLHEpOnErZX12YXIgWWUsbXIsR2U7cT1zZWxmLmxvY2F0aW9uLmhyZWYsRSYmKHE9RSkscS5zdGFydHNXaXRoKCJibG9iOiIpP3E9IiI6cT1xLnN1YnN0cigwLHEucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKSxZZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5zZW5kKG51bGwpLHIucmVzcG9uc2VUZXh0fSxHZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkoci5yZXNwb25zZSl9LG1yPShlLHIsdCk9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PntpZihuLnN0YXR1cz09MjAwfHxuLnN0YXR1cz09MCYmbi5yZXNwb25zZSl7cihuLnJlc3BvbnNlKTtyZXR1cm59dCgpfSxuLm9uZXJyb3I9dCxuLnNlbmQobnVsbCl9O3ZhciBxZT1mLnByaW50fHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLGVlPWYucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGYsRGUpLERlPW51bGwsZi5hcmd1bWVudHMmJmYuYXJndW1lbnRzLGYudGhpc1Byb2dyYW0mJihocj1mLnRoaXNQcm9ncmFtKSxmLnF1aXQmJmYucXVpdDt2YXIgX2U7Zi53YXNtQmluYXJ5JiYoX2U9Zi53YXNtQmluYXJ5KTt2YXIgJGUscHI9ITE7ZnVuY3Rpb24gX3IoZSxyKXtlfHxpZShyKX12YXIgSSx4LFksQ2UsZyxBLGdyLHlyO2Z1bmN0aW9uIHdyKCl7dmFyIGU9JGUuYnVmZmVyO2YuSEVBUDg9ST1uZXcgSW50OEFycmF5KGUpLGYuSEVBUDE2PVk9bmV3IEludDE2QXJyYXkoZSksZi5IRUFQVTg9eD1uZXcgVWludDhBcnJheShlKSxmLkhFQVBVMTY9Q2U9bmV3IFVpbnQxNkFycmF5KGUpLGYuSEVBUDMyPWc9bmV3IEludDMyQXJyYXkoZSksZi5IRUFQVTMyPUE9bmV3IFVpbnQzMkFycmF5KGUpLGYuSEVBUEYzMj1ncj1uZXcgRmxvYXQzMkFycmF5KGUpLGYuSEVBUEY2ND15cj1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBFcj1bXSxicj1bXSxrcj1bXTtmdW5jdGlvbiBwdCgpe2lmKGYucHJlUnVuKWZvcih0eXBlb2YgZi5wcmVSdW49PSJmdW5jdGlvbiImJihmLnByZVJ1bj1bZi5wcmVSdW5dKTtmLnByZVJ1bi5sZW5ndGg7KXl0KGYucHJlUnVuLnNoaWZ0KCkpO0tlKEVyKX1mdW5jdGlvbiBfdCgpeyFmLm5vRlNJbml0JiYhby5pbml0LmluaXRpYWxpemVkJiZvLmluaXQoKSxvLmlnbm9yZVBlcm1pc3Npb25zPSExLEtlKGJyKX1mdW5jdGlvbiBndCgpe2lmKGYucG9zdFJ1bilmb3IodHlwZW9mIGYucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKGYucG9zdFJ1bj1bZi5wb3N0UnVuXSk7Zi5wb3N0UnVuLmxlbmd0aDspRXQoZi5wb3N0UnVuLnNoaWZ0KCkpO0tlKGtyKX1mdW5jdGlvbiB5dChlKXtFci51bnNoaWZ0KGUpfWZ1bmN0aW9uIHd0KGUpe2JyLnVuc2hpZnQoZSl9ZnVuY3Rpb24gRXQoZSl7a3IudW5zaGlmdChlKX12YXIgb2U9MCxnZT1udWxsO2Z1bmN0aW9uIEhhKGUpe3JldHVybiBlfWZ1bmN0aW9uIFhlKGUpe3ZhciByO29lKyssKHI9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8ci5jYWxsKGYsb2UpfWZ1bmN0aW9uIEZlKGUpe3ZhciB0O2lmKG9lLS0sKHQ9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8dC5jYWxsKGYsb2UpLG9lPT0wJiZnZSl7dmFyIHI9Z2U7Z2U9bnVsbCxyKCl9fWZ1bmN0aW9uIGllKGUpe3ZhciB0Oyh0PWYub25BYm9ydCk9PW51bGx8fHQuY2FsbChmLGUpLGU9IkFib3J0ZWQoIitlKyIpIixlZShlKSxwcj0hMCxlKz0iLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7dmFyIHI9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKTt0aHJvdyBIKHIpLHJ9dmFyIGJ0PSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIixQcj1lPT5lLnN0YXJ0c1dpdGgoYnQpO2Z1bmN0aW9uIGt0KCl7aWYoZi5sb2NhdGVGaWxlKXt2YXIgZT0id2ViLWRlbXV4ZXIud2FzbSI7cmV0dXJuIFByKGUpP2U6bXQoZSl9cmV0dXJuIG5ldyBVUkwoIndlYi1kZW11eGVyLndhc20iLHNlbGYubG9jYXRpb24uaHJlZikuaHJlZn12YXIgVGU7ZnVuY3Rpb24gQXIoZSl7aWYoZT09VGUmJl9lKXJldHVybiBuZXcgVWludDhBcnJheShfZSk7aWYoR2UpcmV0dXJuIEdlKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBQdChlKXtyZXR1cm4hX2UmJmFlJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4ocj0+e2lmKCFyLm9rKXRocm93YGZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyR7ZX0nYDtyZXR1cm4gci5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goKCk9PkFyKGUpKTpQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5BcihlKSl9ZnVuY3Rpb24gRHIoZSxyLHQpe3JldHVybiBQdChlKS50aGVuKG49PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG4scikpLnRoZW4odCxuPT57ZWUoYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7bn1gKSxpZShuKX0pfWZ1bmN0aW9uIEF0KGUscix0LG4pe3JldHVybiFlJiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PSJmdW5jdGlvbiImJiFQcihyKSYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKHIse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGE9Pnt2YXIgaT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhhLHQpO3JldHVybiBpLnRoZW4obixmdW5jdGlvbihzKXtyZXR1cm4gZWUoYHdhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAke3N9YCksZWUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksRHIocix0LG4pfSl9KTpEcihyLHQsbil9ZnVuY3Rpb24gRHQoKXtyZXR1cm57YTpDYX19ZnVuY3Rpb24gJHQoKXt2YXIgZT1EdCgpO2Z1bmN0aW9uIHIobixhKXtyZXR1cm4gej1uLmV4cG9ydHMsJGU9ei5iYSx3cigpLGpyPXouZWEsd3Qoei5jYSksRmUoKSx6fVhlKCk7ZnVuY3Rpb24gdChuKXtyKG4uaW5zdGFuY2UpfWlmKGYuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gZi5pbnN0YW50aWF0ZVdhc20oZSxyKX1jYXRjaChuKXtlZShgTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogJHtufWApLEgobil9cmV0dXJuIFRlfHwoVGU9a3QoKSksQXQoX2UsVGUsZSx0KS5jYXRjaChIKSx7fX12YXIgeSwkLEtlPWU9Pntmb3IoO2UubGVuZ3RoPjA7KWUuc2hpZnQoKShmKX07Zi5ub0V4aXRSdW50aW1lO3ZhciAkcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxjZT0oZSxyLHQpPT57Zm9yKHZhciBuPXIrdCxhPXI7ZVthXSYmIShhPj1uKTspKythO2lmKGEtcj4xNiYmZS5idWZmZXImJiRyKXJldHVybiAkci5kZWNvZGUoZS5zdWJhcnJheShyLGEpKTtmb3IodmFyIGk9IiI7cjxhOyl7dmFyIHM9ZVtyKytdO2lmKCEocyYxMjgpKXtpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpO2NvbnRpbnVlfXZhciBsPWVbcisrXSY2MztpZigocyYyMjQpPT0xOTIpe2krPVN0cmluZy5mcm9tQ2hhckNvZGUoKHMmMzEpPDw2fGwpO2NvbnRpbnVlfXZhciB1PWVbcisrXSY2MztpZigocyYyNDApPT0yMjQ/cz0ocyYxNSk8PDEyfGw8PDZ8dTpzPShzJjcpPDwxOHxsPDwxMnx1PDw2fGVbcisrXSY2MyxzPDY1NTM2KWkrPVN0cmluZy5mcm9tQ2hhckNvZGUocyk7ZWxzZXt2YXIgYz1zLTY1NTM2O2krPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Yz4+MTAsNTYzMjB8YyYxMDIzKX19cmV0dXJuIGl9LHNlPShlLHIpPT5lP2NlKHgsZSxyKToiIixDdD0oZSxyLHQsbik9PntpZShgQXNzZXJ0aW9uIGZhaWxlZDogJHtzZShlKX0sIGF0OiBgK1tyP3NlKHIpOiJ1bmtub3duIGZpbGVuYW1lIix0LG4/c2Uobik6InVua25vd24gZnVuY3Rpb24iXSl9O2NsYXNzIEZ0e2NvbnN0cnVjdG9yKHIpe3RoaXMuZXhjUHRyPXIsdGhpcy5wdHI9ci0yNH1zZXRfdHlwZShyKXtBW3RoaXMucHRyKzQ+PjJdPXJ9Z2V0X3R5cGUoKXtyZXR1cm4gQVt0aGlzLnB0cis0Pj4yXX1zZXRfZGVzdHJ1Y3RvcihyKXtBW3RoaXMucHRyKzg+PjJdPXJ9Z2V0X2Rlc3RydWN0b3IoKXtyZXR1cm4gQVt0aGlzLnB0cis4Pj4yXX1zZXRfY2F1Z2h0KHIpe3I9cj8xOjAsSVt0aGlzLnB0cisxMl09cn1nZXRfY2F1Z2h0KCl7cmV0dXJuIElbdGhpcy5wdHIrMTJdIT0wfXNldF9yZXRocm93bihyKXtyPXI/MTowLElbdGhpcy5wdHIrMTNdPXJ9Z2V0X3JldGhyb3duKCl7cmV0dXJuIElbdGhpcy5wdHIrMTNdIT0wfWluaXQocix0KXt0aGlzLnNldF9hZGp1c3RlZF9wdHIoMCksdGhpcy5zZXRfdHlwZShyKSx0aGlzLnNldF9kZXN0cnVjdG9yKHQpfXNldF9hZGp1c3RlZF9wdHIocil7QVt0aGlzLnB0cisxNj4+Ml09cn1nZXRfYWRqdXN0ZWRfcHRyKCl7cmV0dXJuIEFbdGhpcy5wdHIrMTY+PjJdfWdldF9leGNlcHRpb25fcHRyKCl7dmFyIHI9cnQodGhpcy5nZXRfdHlwZSgpKTtpZihyKXJldHVybiBBW3RoaXMuZXhjUHRyPj4yXTt2YXIgdD10aGlzLmdldF9hZGp1c3RlZF9wdHIoKTtyZXR1cm4gdCE9PTA/dDp0aGlzLmV4Y1B0cn19dmFyIENyPTAsVHQ9KGUscix0KT0+e3ZhciBuPW5ldyBGdChlKTt0aHJvdyBuLmluaXQocix0KSxDcj1lLENyfSxTPXtpc0FiczplPT5lLmNoYXJBdCgwKT09PSIvIixzcGxpdFBhdGg6ZT0+e3ZhciByPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gci5leGVjKGUpLnNsaWNlKDEpfSxub3JtYWxpemVBcnJheTooZSxyKT0+e2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIGE9ZVtuXTthPT09Ii4iP2Uuc3BsaWNlKG4sMSk6YT09PSIuLiI/KGUuc3BsaWNlKG4sMSksdCsrKTp0JiYoZS5zcGxpY2UobiwxKSx0LS0pfWlmKHIpZm9yKDt0O3QtLSllLnVuc2hpZnQoIi4uIik7cmV0dXJuIGV9LG5vcm1hbGl6ZTplPT57dmFyIHI9Uy5pc0FicyhlKSx0PWUuc3Vic3RyKC0xKT09PSIvIjtyZXR1cm4gZT1TLm5vcm1hbGl6ZUFycmF5KGUuc3BsaXQoIi8iKS5maWx0ZXIobj0+ISFuKSwhcikuam9pbigiLyIpLCFlJiYhciYmKGU9Ii4iKSxlJiZ0JiYoZSs9Ii8iKSwocj8iLyI6IiIpK2V9LGRpcm5hbWU6ZT0+e3ZhciByPVMuc3BsaXRQYXRoKGUpLHQ9clswXSxuPXJbMV07cmV0dXJuIXQmJiFuPyIuIjoobiYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSksdCtuKX0sYmFzZW5hbWU6ZT0+e2lmKGU9PT0iLyIpcmV0dXJuIi8iO2U9Uy5ub3JtYWxpemUoZSksZT1lLnJlcGxhY2UoL1wvJC8sIiIpO3ZhciByPWUubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gcj09PS0xP2U6ZS5zdWJzdHIocisxKX0sam9pbjooLi4uZSk9PlMubm9ybWFsaXplKGUuam9pbigiLyIpKSxqb2luMjooZSxyKT0+Uy5ub3JtYWxpemUoZSsiLyIrcil9LFN0PSgpPT57aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2llKCJpbml0UmFuZG9tRGV2aWNlIil9LEZyPWU9PihGcj1TdCgpKShlKSxYPXtyZXNvbHZlOiguLi5lKT0+e2Zvcih2YXIgcj0iIix0PSExLG49ZS5sZW5ndGgtMTtuPj0tMSYmIXQ7bi0tKXt2YXIgYT1uPj0wP2Vbbl06by5jd2QoKTtpZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKTtpZighYSlyZXR1cm4iIjtyPWErIi8iK3IsdD1TLmlzQWJzKGEpfXJldHVybiByPVMubm9ybWFsaXplQXJyYXkoci5zcGxpdCgiLyIpLmZpbHRlcihpPT4hIWkpLCF0KS5qb2luKCIvIiksKHQ/Ii8iOiIiKStyfHwiLiJ9LHJlbGF0aXZlOihlLHIpPT57ZT1YLnJlc29sdmUoZSkuc3Vic3RyKDEpLHI9WC5yZXNvbHZlKHIpLnN1YnN0cigxKTtmdW5jdGlvbiB0KGMpe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGgmJmNbZF09PT0iIjtkKyspO2Zvcih2YXIgbT1jLmxlbmd0aC0xO20+PTAmJmNbbV09PT0iIjttLS0pO3JldHVybiBkPm0/W106Yy5zbGljZShkLG0tZCsxKX1mb3IodmFyIG49dChlLnNwbGl0KCIvIikpLGE9dChyLnNwbGl0KCIvIikpLGk9TWF0aC5taW4obi5sZW5ndGgsYS5sZW5ndGgpLHM9aSxsPTA7bDxpO2wrKylpZihuW2xdIT09YVtsXSl7cz1sO2JyZWFrfWZvcih2YXIgdT1bXSxsPXM7bDxuLmxlbmd0aDtsKyspdS5wdXNoKCIuLiIpO3JldHVybiB1PXUuY29uY2F0KGEuc2xpY2UocykpLHUuam9pbigiLyIpfX0sSmU9W10sWmU9ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO248PTEyNz9yKys6bjw9MjA0Nz9yKz0yOm4+PTU1Mjk2JiZuPD01NzM0Mz8ocis9NCwrK3QpOnIrPTN9cmV0dXJuIHJ9LFFlPShlLHIsdCxuKT0+e2lmKCEobj4wKSlyZXR1cm4gMDtmb3IodmFyIGE9dCxpPXQrbi0xLHM9MDtzPGUubGVuZ3RoOysrcyl7dmFyIGw9ZS5jaGFyQ29kZUF0KHMpO2lmKGw+PTU1Mjk2JiZsPD01NzM0Myl7dmFyIHU9ZS5jaGFyQ29kZUF0KCsrcyk7bD02NTUzNisoKGwmMTAyMyk8PDEwKXx1JjEwMjN9aWYobDw9MTI3KXtpZih0Pj1pKWJyZWFrO3JbdCsrXT1sfWVsc2UgaWYobDw9MjA0Nyl7aWYodCsxPj1pKWJyZWFrO3JbdCsrXT0xOTJ8bD4+NixyW3QrK109MTI4fGwmNjN9ZWxzZSBpZihsPD02NTUzNSl7aWYodCsyPj1pKWJyZWFrO3JbdCsrXT0yMjR8bD4+MTIsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M31lbHNle2lmKHQrMz49aSlicmVhaztyW3QrK109MjQwfGw+PjE4LHJbdCsrXT0xMjh8bD4+MTImNjMsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M319cmV0dXJuIHJbdF09MCx0LWF9O2Z1bmN0aW9uIFNlKGUscix0KXt2YXIgbj1aZShlKSsxLGE9bmV3IEFycmF5KG4pLGk9UWUoZSxhLDAsYS5sZW5ndGgpO3JldHVybiByJiYoYS5sZW5ndGg9aSksYX12YXIgTXQ9KCk9PntpZighSmUubGVuZ3RoKXt2YXIgZT1udWxsO2lmKCFlKXJldHVybiBudWxsO0plPVNlKGUsITApfXJldHVybiBKZS5zaGlmdCgpfSxsZT17dHR5czpbXSxpbml0KCl7fSxzaHV0ZG93bigpe30scmVnaXN0ZXIoZSxyKXtsZS50dHlzW2VdPXtpbnB1dDpbXSxvdXRwdXQ6W10sb3BzOnJ9LG8ucmVnaXN0ZXJEZXZpY2UoZSxsZS5zdHJlYW1fb3BzKX0sc3RyZWFtX29wczp7b3BlbihlKXt2YXIgcj1sZS50dHlzW2Uubm9kZS5yZGV2XTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtlLnR0eT1yLGUuc2Vla2FibGU9ITF9LGNsb3NlKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LGZzeW5jKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LHJlYWQoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMuZ2V0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7Zm9yKHZhciBpPTAscz0wO3M8bjtzKyspe3ZhciBsO3RyeXtsPWUudHR5Lm9wcy5nZXRfY2hhcihlLnR0eSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9aWYobD09PXZvaWQgMCYmaT09PTApdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2KTtpZihsPT1udWxsKWJyZWFrO2krKyxyW3Qrc109bH1yZXR1cm4gaSYmKGUubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaX0sd3JpdGUoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMucHV0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7dHJ5e2Zvcih2YXIgaT0wO2k8bjtpKyspZS50dHkub3BzLnB1dF9jaGFyKGUudHR5LHJbdCtpXSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9cmV0dXJuIG4mJihlLm5vZGUudGltZXN0YW1wPURhdGUubm93KCkpLGl9fSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyKGUpe3JldHVybiBNdCgpfSxwdXRfY2hhcihlLHIpe3I9PT1udWxsfHxyPT09MTA/KHFlKGNlKGUub3V0cHV0LDApKSxlLm91dHB1dD1bXSk6ciE9MCYmZS5vdXRwdXQucHVzaChyKX0sZnN5bmMoZSl7ZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aD4wJiYocWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKX0saW9jdGxfdGNnZXRzKGUpe3JldHVybntjX2lmbGFnOjI1ODU2LGNfb2ZsYWc6NSxjX2NmbGFnOjE5MSxjX2xmbGFnOjM1Mzg3LGNfY2M6WzMsMjgsMTI3LDIxLDQsMCwxLDAsMTcsMTksMjYsMCwxOCwxNSwyMywyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXX19LGlvY3RsX3Rjc2V0cyhlLHIsdCl7cmV0dXJuIDB9LGlvY3RsX3Rpb2Nnd2luc3ooZSl7cmV0dXJuWzI0LDgwXX19LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyKGUscil7cj09PW51bGx8fHI9PT0xMD8oZWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKTpyIT0wJiZlLm91dHB1dC5wdXNoKHIpfSxmc3luYyhlKXtlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoPjAmJihlZShjZShlLm91dHB1dCwwKSksZS5vdXRwdXQ9W10pfX19LFRyPWU9PntpZSgpfSxiPXtvcHNfdGFibGU6bnVsbCxtb3VudChlKXtyZXR1cm4gYi5jcmVhdGVOb2RlKG51bGwsIi8iLDE2ODk1LDApfSxjcmVhdGVOb2RlKGUscix0LG4pe2lmKG8uaXNCbGtkZXYodCl8fG8uaXNGSUZPKHQpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Iub3BzX3RhYmxlfHwoYi5vcHNfdGFibGU9e2Rpcjp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIsbG9va3VwOmIubm9kZV9vcHMubG9va3VwLG1rbm9kOmIubm9kZV9vcHMubWtub2QscmVuYW1lOmIubm9kZV9vcHMucmVuYW1lLHVubGluazpiLm5vZGVfb3BzLnVubGluayxybWRpcjpiLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6Yi5ub2RlX29wcy5yZWFkZGlyLHN5bWxpbms6Yi5ub2RlX29wcy5zeW1saW5rfSxzdHJlYW06e2xsc2VlazpiLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTp7bGxzZWVrOmIuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpiLnN0cmVhbV9vcHMucmVhZCx3cml0ZTpiLnN0cmVhbV9vcHMud3JpdGUsYWxsb2NhdGU6Yi5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6Yi5zdHJlYW1fb3BzLm1tYXAsbXN5bmM6Yi5zdHJlYW1fb3BzLm1zeW5jfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIscmVhZGxpbms6Yi5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6Yi5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6Yi5ub2RlX29wcy5zZXRhdHRyfSxzdHJlYW06by5jaHJkZXZfc3RyZWFtX29wc319KTt2YXIgYT1vLmNyZWF0ZU5vZGUoZSxyLHQsbik7cmV0dXJuIG8uaXNEaXIoYS5tb2RlKT8oYS5ub2RlX29wcz1iLm9wc190YWJsZS5kaXIubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZGlyLnN0cmVhbSxhLmNvbnRlbnRzPXt9KTpvLmlzRmlsZShhLm1vZGUpPyhhLm5vZGVfb3BzPWIub3BzX3RhYmxlLmZpbGUubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZmlsZS5zdHJlYW0sYS51c2VkQnl0ZXM9MCxhLmNvbnRlbnRzPW51bGwpOm8uaXNMaW5rKGEubW9kZSk/KGEubm9kZV9vcHM9Yi5vcHNfdGFibGUubGluay5ub2RlLGEuc3RyZWFtX29wcz1iLm9wc190YWJsZS5saW5rLnN0cmVhbSk6by5pc0NocmRldihhLm1vZGUpJiYoYS5ub2RlX29wcz1iLm9wc190YWJsZS5jaHJkZXYubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbSksYS50aW1lc3RhbXA9RGF0ZS5ub3coKSxlJiYoZS5jb250ZW50c1tyXT1hLGUudGltZXN0YW1wPWEudGltZXN0YW1wKSxhfSxnZXRGaWxlRGF0YUFzVHlwZWRBcnJheShlKXtyZXR1cm4gZS5jb250ZW50cz9lLmNvbnRlbnRzLnN1YmFycmF5P2UuY29udGVudHMuc3ViYXJyYXkoMCxlLnVzZWRCeXRlcyk6bmV3IFVpbnQ4QXJyYXkoZS5jb250ZW50cyk6bmV3IFVpbnQ4QXJyYXkoMCl9LGV4cGFuZEZpbGVTdG9yYWdlKGUscil7dmFyIHQ9ZS5jb250ZW50cz9lLmNvbnRlbnRzLmxlbmd0aDowO2lmKCEodD49cikpe3ZhciBuPTEwMjQqMTAyNDtyPU1hdGgubWF4KHIsdCoodDxuPzI6MS4xMjUpPj4+MCksdCE9MCYmKHI9TWF0aC5tYXgociwyNTYpKTt2YXIgYT1lLmNvbnRlbnRzO2UuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkociksZS51c2VkQnl0ZXM+MCYmZS5jb250ZW50cy5zZXQoYS5zdWJhcnJheSgwLGUudXNlZEJ5dGVzKSwwKX19LHJlc2l6ZUZpbGVTdG9yYWdlKGUscil7aWYoZS51c2VkQnl0ZXMhPXIpaWYocj09MCllLmNvbnRlbnRzPW51bGwsZS51c2VkQnl0ZXM9MDtlbHNle3ZhciB0PWUuY29udGVudHM7ZS5jb250ZW50cz1uZXcgVWludDhBcnJheShyKSx0JiZlLmNvbnRlbnRzLnNldCh0LnN1YmFycmF5KDAsTWF0aC5taW4ocixlLnVzZWRCeXRlcykpKSxlLnVzZWRCeXRlcz1yfX0sbm9kZV9vcHM6e2dldGF0dHIoZSl7dmFyIHI9e307cmV0dXJuIHIuZGV2PW8uaXNDaHJkZXYoZS5tb2RlKT9lLmlkOjEsci5pbm89ZS5pZCxyLm1vZGU9ZS5tb2RlLHIubmxpbms9MSxyLnVpZD0wLHIuZ2lkPTAsci5yZGV2PWUucmRldixvLmlzRGlyKGUubW9kZSk/ci5zaXplPTQwOTY6by5pc0ZpbGUoZS5tb2RlKT9yLnNpemU9ZS51c2VkQnl0ZXM6by5pc0xpbmsoZS5tb2RlKT9yLnNpemU9ZS5saW5rLmxlbmd0aDpyLnNpemU9MCxyLmF0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLm10aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmN0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmJsa3NpemU9NDA5NixyLmJsb2Nrcz1NYXRoLmNlaWwoci5zaXplL3IuYmxrc2l6ZSkscn0sc2V0YXR0cihlLHIpe3IubW9kZSE9PXZvaWQgMCYmKGUubW9kZT1yLm1vZGUpLHIudGltZXN0YW1wIT09dm9pZCAwJiYoZS50aW1lc3RhbXA9ci50aW1lc3RhbXApLHIuc2l6ZSE9PXZvaWQgMCYmYi5yZXNpemVGaWxlU3RvcmFnZShlLHIuc2l6ZSl9LGxvb2t1cChlLHIpe3Rocm93IG8uZ2VuZXJpY0Vycm9yc1s0NF19LG1rbm9kKGUscix0LG4pe3JldHVybiBiLmNyZWF0ZU5vZGUoZSxyLHQsbil9LHJlbmFtZShlLHIsdCl7aWYoby5pc0RpcihlLm1vZGUpKXt2YXIgbjt0cnl7bj1vLmxvb2t1cE5vZGUocix0KX1jYXRjaHt9aWYobilmb3IodmFyIGEgaW4gbi5jb250ZW50cyl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU1KX1kZWxldGUgZS5wYXJlbnQuY29udGVudHNbZS5uYW1lXSxlLnBhcmVudC50aW1lc3RhbXA9RGF0ZS5ub3coKSxlLm5hbWU9dCxyLmNvbnRlbnRzW3RdPWUsci50aW1lc3RhbXA9ZS5wYXJlbnQudGltZXN0YW1wLGUucGFyZW50PXJ9LHVubGluayhlLHIpe2RlbGV0ZSBlLmNvbnRlbnRzW3JdLGUudGltZXN0YW1wPURhdGUubm93KCl9LHJtZGlyKGUscil7dmFyIHQ9by5sb29rdXBOb2RlKGUscik7Zm9yKHZhciBuIGluIHQuY29udGVudHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NSk7ZGVsZXRlIGUuY29udGVudHNbcl0sZS50aW1lc3RhbXA9RGF0ZS5ub3coKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3ZhciBuPWIuY3JlYXRlTm9kZShlLHIsNDE0NzEsMCk7cmV0dXJuIG4ubGluaz10LG59LHJlYWRsaW5rKGUpe2lmKCFvLmlzTGluayhlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO3JldHVybiBlLmxpbmt9fSxzdHJlYW1fb3BzOntyZWFkKGUscix0LG4sYSl7dmFyIGk9ZS5ub2RlLmNvbnRlbnRzO2lmKGE+PWUubm9kZS51c2VkQnl0ZXMpcmV0dXJuIDA7dmFyIHM9TWF0aC5taW4oZS5ub2RlLnVzZWRCeXRlcy1hLG4pO2lmKHM+OCYmaS5zdWJhcnJheSlyLnNldChpLnN1YmFycmF5KGEsYStzKSx0KTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspclt0K2xdPWlbYStsXTtyZXR1cm4gc30sd3JpdGUoZSxyLHQsbixhLGkpe2lmKHIuYnVmZmVyPT09SS5idWZmZXImJihpPSExKSwhbilyZXR1cm4gMDt2YXIgcz1lLm5vZGU7aWYocy50aW1lc3RhbXA9RGF0ZS5ub3coKSxyLnN1YmFycmF5JiYoIXMuY29udGVudHN8fHMuY29udGVudHMuc3ViYXJyYXkpKXtpZihpKXJldHVybiBzLmNvbnRlbnRzPXIuc3ViYXJyYXkodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihzLnVzZWRCeXRlcz09PTAmJmE9PT0wKXJldHVybiBzLmNvbnRlbnRzPXIuc2xpY2UodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihhK248PXMudXNlZEJ5dGVzKXJldHVybiBzLmNvbnRlbnRzLnNldChyLnN1YmFycmF5KHQsdCtuKSxhKSxufWlmKGIuZXhwYW5kRmlsZVN0b3JhZ2UocyxhK24pLHMuY29udGVudHMuc3ViYXJyYXkmJnIuc3ViYXJyYXkpcy5jb250ZW50cy5zZXQoci5zdWJhcnJheSh0LHQrbiksYSk7ZWxzZSBmb3IodmFyIGw9MDtsPG47bCsrKXMuY29udGVudHNbYStsXT1yW3QrbF07cmV0dXJuIHMudXNlZEJ5dGVzPU1hdGgubWF4KHMudXNlZEJ5dGVzLGErbiksbn0sbGxzZWVrKGUscix0KXt2YXIgbj1yO2lmKHQ9PT0xP24rPWUucG9zaXRpb246dD09PTImJm8uaXNGaWxlKGUubm9kZS5tb2RlKSYmKG4rPWUubm9kZS51c2VkQnl0ZXMpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn0sYWxsb2NhdGUoZSxyLHQpe2IuZXhwYW5kRmlsZVN0b3JhZ2UoZS5ub2RlLHIrdCksZS5ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChlLm5vZGUudXNlZEJ5dGVzLHIrdCl9LG1tYXAoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO3ZhciBpLHMsbD1lLm5vZGUuY29udGVudHM7aWYoIShhJjIpJiZsLmJ1ZmZlcj09PUkuYnVmZmVyKXM9ITEsaT1sLmJ5dGVPZmZzZXQ7ZWxzZXtpZigodD4wfHx0K3I8bC5sZW5ndGgpJiYobC5zdWJhcnJheT9sPWwuc3ViYXJyYXkodCx0K3IpOmw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobCx0LHQrcikpLHM9ITAsaT1UcigpLCFpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDgpO0kuc2V0KGwsaSl9cmV0dXJue3B0cjppLGFsbG9jYXRlZDpzfX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gYi5zdHJlYW1fb3BzLndyaXRlKGUsciwwLG4sdCwhMSksMH19fSxSdD0oZSxyLHQsbik9Pnt2YXIgYT1gYWwgJHtlfWA7bXIoZSxpPT57cihuZXcgVWludDhBcnJheShpKSksYSYmRmUoKX0saT0+e2lmKHQpdCgpO2Vsc2UgdGhyb3dgTG9hZGluZyBkYXRhIGZpbGUgIiR7ZX0iIGZhaWxlZC5gfSksYSYmWGUoKX0sT3Q9KGUscix0LG4sYSxpKT0+e28uY3JlYXRlRGF0YUZpbGUoZSxyLHQsbixhLGkpfSxJdD1mLnByZWxvYWRQbHVnaW5zfHxbXSxMdD0oZSxyLHQsbik9Pnt0eXBlb2YgQnJvd3NlcjwidSImJkJyb3dzZXIuaW5pdCgpO3ZhciBhPSExO3JldHVybiBJdC5mb3JFYWNoKGk9PnthfHxpLmNhbkhhbmRsZShyKSYmKGkuaGFuZGxlKGUscix0LG4pLGE9ITApfSksYX0sVnQ9KGUscix0LG4sYSxpLHMsbCx1LGMpPT57dmFyIGQ9cj9YLnJlc29sdmUoUy5qb2luMihlLHIpKTplO2Z1bmN0aW9uIG0oaCl7ZnVuY3Rpb24gcCh3KXtjPT1udWxsfHxjKCksbHx8T3QoZSxyLHcsbixhLHUpLGk9PW51bGx8fGkoKSxGZSgpfUx0KGgsZCxwLCgpPT57cz09bnVsbHx8cygpLEZlKCl9KXx8cChoKX1YZSgpLHR5cGVvZiB0PT0ic3RyaW5nIj9SdCh0LG0scyk6bSh0KX0sVXQ9ZT0+e3ZhciByPXtyOjAsInIrIjoyLHc6NTc3LCJ3KyI6NTc4LGE6MTA4OSwiYSsiOjEwOTB9LHQ9cltlXTtpZih0eXBlb2YgdD4idSIpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAke2V9YCk7cmV0dXJuIHR9LGVyPShlLHIpPT57dmFyIHQ9MDtyZXR1cm4gZSYmKHR8PTM2NSksciYmKHR8PTE0NiksdH0sVj17RElSX01PREU6MTY4OTUsRklMRV9NT0RFOjMzMjc5LHJlYWRlcjpudWxsLG1vdW50KGUpe19yKGFlKSxWLnJlYWRlcnx8KFYucmVhZGVyPW5ldyBGaWxlUmVhZGVyU3luYyk7dmFyIHI9Vi5jcmVhdGVOb2RlKG51bGwsIi8iLFYuRElSX01PREUsMCksdD17fTtmdW5jdGlvbiBuKGkpe2Zvcih2YXIgcz1pLnNwbGl0KCIvIiksbD1yLHU9MDt1PHMubGVuZ3RoLTE7dSsrKXt2YXIgYz1zLnNsaWNlKDAsdSsxKS5qb2luKCIvIik7dFtjXXx8KHRbY109Vi5jcmVhdGVOb2RlKGwsc1t1XSxWLkRJUl9NT0RFLDApKSxsPXRbY119cmV0dXJuIGx9ZnVuY3Rpb24gYShpKXt2YXIgcz1pLnNwbGl0KCIvIik7cmV0dXJuIHNbcy5sZW5ndGgtMV19cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5vcHRzLmZpbGVzfHxbXSxmdW5jdGlvbihpKXtWLmNyZWF0ZU5vZGUobihpLm5hbWUpLGEoaS5uYW1lKSxWLkZJTEVfTU9ERSwwLGksaS5sYXN0TW9kaWZpZWREYXRlKX0pLChlLm9wdHMuYmxvYnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe1YuY3JlYXRlTm9kZShuKGkubmFtZSksYShpLm5hbWUpLFYuRklMRV9NT0RFLDAsaS5kYXRhKX0pLChlLm9wdHMucGFja2FnZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubWV0YWRhdGEuZmlsZXMuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgbD1zLmZpbGVuYW1lLnN1YnN0cigxKTtWLmNyZWF0ZU5vZGUobihsKSxhKGwpLFYuRklMRV9NT0RFLDAsaS5ibG9iLnNsaWNlKHMuc3RhcnQscy5lbmQpKX0pfSkscn0sY3JlYXRlTm9kZShlLHIsdCxuLGEsaSl7dmFyIHM9by5jcmVhdGVOb2RlKGUscix0KTtyZXR1cm4gcy5tb2RlPXQscy5ub2RlX29wcz1WLm5vZGVfb3BzLHMuc3RyZWFtX29wcz1WLnN0cmVhbV9vcHMscy50aW1lc3RhbXA9KGl8fG5ldyBEYXRlKS5nZXRUaW1lKCksX3IoVi5GSUxFX01PREUhPT1WLkRJUl9NT0RFKSx0PT09Vi5GSUxFX01PREU/KHMuc2l6ZT1hLnNpemUscy5jb250ZW50cz1hKToocy5zaXplPTQwOTYscy5jb250ZW50cz17fSksZSYmKGUuY29udGVudHNbcl09cyksc30sbm9kZV9vcHM6e2dldGF0dHIoZSl7cmV0dXJue2RldjoxLGlubzplLmlkLG1vZGU6ZS5tb2RlLG5saW5rOjEsdWlkOjAsZ2lkOjAscmRldjowLHNpemU6ZS5zaXplLGF0aW1lOm5ldyBEYXRlKGUudGltZXN0YW1wKSxtdGltZTpuZXcgRGF0ZShlLnRpbWVzdGFtcCksY3RpbWU6bmV3IERhdGUoZS50aW1lc3RhbXApLGJsa3NpemU6NDA5NixibG9ja3M6TWF0aC5jZWlsKGUuc2l6ZS80MDk2KX19LHNldGF0dHIoZSxyKXtyLm1vZGUhPT12b2lkIDAmJihlLm1vZGU9ci5tb2RlKSxyLnRpbWVzdGFtcCE9PXZvaWQgMCYmKGUudGltZXN0YW1wPXIudGltZXN0YW1wKX0sbG9va3VwKGUscil7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCl9LG1rbm9kKGUscix0LG4pe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSxyZW5hbWUoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSx1bmxpbmsoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scm1kaXIoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfX0sc3RyZWFtX29wczp7cmVhZChlLHIsdCxuLGEpe2lmKGE+PWUubm9kZS5zaXplKXJldHVybiAwO3ZhciBpPWUubm9kZS5jb250ZW50cy5zbGljZShhLGErbikscz1WLnJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpKTtyZXR1cm4gci5zZXQobmV3IFVpbnQ4QXJyYXkocyksdCksaS5zaXplfSx3cml0ZShlLHIsdCxuLGEpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoMjkpfSxsbHNlZWsoZSxyLHQpe3ZhciBuPXI7aWYodD09PTE/bis9ZS5wb3NpdGlvbjp0PT09MiYmby5pc0ZpbGUoZS5ub2RlLm1vZGUpJiYobis9ZS5ub2RlLnNpemUpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn19fSxvPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6e30sc3RyZWFtczpbXSxuZXh0SW5vZGU6MSxuYW1lVGFibGU6bnVsbCxjdXJyZW50UGF0aDoiLyIsaW5pdGlhbGl6ZWQ6ITEsaWdub3JlUGVybWlzc2lvbnM6ITAsRXJybm9FcnJvcjpjbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWU9IkVycm5vRXJyb3IiLHRoaXMuZXJybm89ZX19LGdlbmVyaWNFcnJvcnM6e30sZmlsZXN5c3RlbXM6bnVsbCxzeW5jRlNSZXF1ZXN0czowLEZTU3RyZWFtOmNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zaGFyZWQ9e319Z2V0IG9iamVjdCgpe3JldHVybiB0aGlzLm5vZGV9c2V0IG9iamVjdChlKXt0aGlzLm5vZGU9ZX1nZXQgaXNSZWFkKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfWdldCBpc1dyaXRlKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0wfWdldCBpc0FwcGVuZCgpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9Z2V0IGZsYWdzKCl7cmV0dXJuIHRoaXMuc2hhcmVkLmZsYWdzfXNldCBmbGFncyhlKXt0aGlzLnNoYXJlZC5mbGFncz1lfWdldCBwb3NpdGlvbigpe3JldHVybiB0aGlzLnNoYXJlZC5wb3NpdGlvbn1zZXQgcG9zaXRpb24oZSl7dGhpcy5zaGFyZWQucG9zaXRpb249ZX19LEZTTm9kZTpjbGFzc3tjb25zdHJ1Y3RvcihlLHIsdCxuKXtlfHwoZT10aGlzKSx0aGlzLnBhcmVudD1lLHRoaXMubW91bnQ9ZS5tb3VudCx0aGlzLm1vdW50ZWQ9bnVsbCx0aGlzLmlkPW8ubmV4dElub2RlKyssdGhpcy5uYW1lPXIsdGhpcy5tb2RlPXQsdGhpcy5ub2RlX29wcz17fSx0aGlzLnN0cmVhbV9vcHM9e30sdGhpcy5yZGV2PW4sdGhpcy5yZWFkTW9kZT0zNjUsdGhpcy53cml0ZU1vZGU9MTQ2fWdldCByZWFkKCl7cmV0dXJuKHRoaXMubW9kZSZ0aGlzLnJlYWRNb2RlKT09PXRoaXMucmVhZE1vZGV9c2V0IHJlYWQoZSl7ZT90aGlzLm1vZGV8PXRoaXMucmVhZE1vZGU6dGhpcy5tb2RlJj1+dGhpcy5yZWFkTW9kZX1nZXQgd3JpdGUoKXtyZXR1cm4odGhpcy5tb2RlJnRoaXMud3JpdGVNb2RlKT09PXRoaXMud3JpdGVNb2RlfXNldCB3cml0ZShlKXtlP3RoaXMubW9kZXw9dGhpcy53cml0ZU1vZGU6dGhpcy5tb2RlJj1+dGhpcy53cml0ZU1vZGV9Z2V0IGlzRm9sZGVyKCl7cmV0dXJuIG8uaXNEaXIodGhpcy5tb2RlKX1nZXQgaXNEZXZpY2UoKXtyZXR1cm4gby5pc0NocmRldih0aGlzLm1vZGUpfX0sbG9va3VwUGF0aChlLHI9e30pe2lmKGU9WC5yZXNvbHZlKGUpLCFlKXJldHVybntwYXRoOiIiLG5vZGU6bnVsbH07dmFyIHQ9e2ZvbGxvd19tb3VudDohMCxyZWN1cnNlX2NvdW50OjB9O2lmKHI9T2JqZWN0LmFzc2lnbih0LHIpLHIucmVjdXJzZV9jb3VudD44KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzIpO2Zvcih2YXIgbj1lLnNwbGl0KCIvIikuZmlsdGVyKG09PiEhbSksYT1vLnJvb3QsaT0iLyIscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgbD1zPT09bi5sZW5ndGgtMTtpZihsJiZyLnBhcmVudClicmVhaztpZihhPW8ubG9va3VwTm9kZShhLG5bc10pLGk9Uy5qb2luMihpLG5bc10pLG8uaXNNb3VudHBvaW50KGEpJiYoIWx8fGwmJnIuZm9sbG93X21vdW50KSYmKGE9YS5tb3VudGVkLnJvb3QpLCFsfHxyLmZvbGxvdylmb3IodmFyIHU9MDtvLmlzTGluayhhLm1vZGUpOyl7dmFyIGM9by5yZWFkbGluayhpKTtpPVgucmVzb2x2ZShTLmRpcm5hbWUoaSksYyk7dmFyIGQ9by5sb29rdXBQYXRoKGkse3JlY3Vyc2VfY291bnQ6ci5yZWN1cnNlX2NvdW50KzF9KTtpZihhPWQubm9kZSx1Kys+NDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMil9fXJldHVybntwYXRoOmksbm9kZTphfX0sZ2V0UGF0aChlKXtmb3IodmFyIHI7Oyl7aWYoby5pc1Jvb3QoZSkpe3ZhciB0PWUubW91bnQubW91bnRwb2ludDtyZXR1cm4gcj90W3QubGVuZ3RoLTFdIT09Ii8iP2Ake3R9LyR7cn1gOnQrcjp0fXI9cj9gJHtlLm5hbWV9LyR7cn1gOmUubmFtZSxlPWUucGFyZW50fX0saGFzaE5hbWUoZSxyKXtmb3IodmFyIHQ9MCxuPTA7bjxyLmxlbmd0aDtuKyspdD0odDw8NSktdCtyLmNoYXJDb2RlQXQobil8MDtyZXR1cm4oZSt0Pj4+MCklby5uYW1lVGFibGUubGVuZ3RofSxoYXNoQWRkTm9kZShlKXt2YXIgcj1vLmhhc2hOYW1lKGUucGFyZW50LmlkLGUubmFtZSk7ZS5uYW1lX25leHQ9by5uYW1lVGFibGVbcl0sby5uYW1lVGFibGVbcl09ZX0saGFzaFJlbW92ZU5vZGUoZSl7dmFyIHI9by5oYXNoTmFtZShlLnBhcmVudC5pZCxlLm5hbWUpO2lmKG8ubmFtZVRhYmxlW3JdPT09ZSlvLm5hbWVUYWJsZVtyXT1lLm5hbWVfbmV4dDtlbHNlIGZvcih2YXIgdD1vLm5hbWVUYWJsZVtyXTt0Oyl7aWYodC5uYW1lX25leHQ9PT1lKXt0Lm5hbWVfbmV4dD1lLm5hbWVfbmV4dDticmVha310PXQubmFtZV9uZXh0fX0sbG9va3VwTm9kZShlLHIpe3ZhciB0PW8ubWF5TG9va3VwKGUpO2lmKHQpdGhyb3cgbmV3IG8uRXJybm9FcnJvcih0KTtmb3IodmFyIG49by5oYXNoTmFtZShlLmlkLHIpLGE9by5uYW1lVGFibGVbbl07YTthPWEubmFtZV9uZXh0KXt2YXIgaT1hLm5hbWU7aWYoYS5wYXJlbnQuaWQ9PT1lLmlkJiZpPT09cilyZXR1cm4gYX1yZXR1cm4gby5sb29rdXAoZSxyKX0sY3JlYXRlTm9kZShlLHIsdCxuKXt2YXIgYT1uZXcgby5GU05vZGUoZSxyLHQsbik7cmV0dXJuIG8uaGFzaEFkZE5vZGUoYSksYX0sZGVzdHJveU5vZGUoZSl7by5oYXNoUmVtb3ZlTm9kZShlKX0saXNSb290KGUpe3JldHVybiBlPT09ZS5wYXJlbnR9LGlzTW91bnRwb2ludChlKXtyZXR1cm4hIWUubW91bnRlZH0saXNGaWxlKGUpe3JldHVybihlJjYxNDQwKT09PTMyNzY4fSxpc0RpcihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0xNjM4NH0saXNMaW5rKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTYwfSxpc0NocmRldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT04MTkyfSxpc0Jsa2RldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0yNDU3Nn0saXNGSUZPKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTZ9LGlzU29ja2V0KGUpe3JldHVybihlJjQ5MTUyKT09PTQ5MTUyfSxmbGFnc1RvUGVybWlzc2lvblN0cmluZyhlKXt2YXIgcj1bInIiLCJ3IiwicnciXVtlJjNdO3JldHVybiBlJjUxMiYmKHIrPSJ3Iikscn0sbm9kZVBlcm1pc3Npb25zKGUscil7cmV0dXJuIG8uaWdub3JlUGVybWlzc2lvbnM/MDpyLmluY2x1ZGVzKCJyIikmJiEoZS5tb2RlJjI5Mil8fHIuaW5jbHVkZXMoInciKSYmIShlLm1vZGUmMTQ2KXx8ci5pbmNsdWRlcygieCIpJiYhKGUubW9kZSY3Myk/MjowfSxtYXlMb29rdXAoZSl7aWYoIW8uaXNEaXIoZS5tb2RlKSlyZXR1cm4gNTQ7dmFyIHI9by5ub2RlUGVybWlzc2lvbnMoZSwieCIpO3JldHVybiByfHwoZS5ub2RlX29wcy5sb29rdXA/MDoyKX0sbWF5Q3JlYXRlKGUscil7dHJ5e3ZhciB0PW8ubG9va3VwTm9kZShlLHIpO3JldHVybiAyMH1jYXRjaHt9cmV0dXJuIG8ubm9kZVBlcm1pc3Npb25zKGUsInd4Iil9LG1heURlbGV0ZShlLHIsdCl7dmFyIG47dHJ5e249by5sb29rdXBOb2RlKGUscil9Y2F0Y2goaSl7cmV0dXJuIGkuZXJybm99dmFyIGE9by5ub2RlUGVybWlzc2lvbnMoZSwid3giKTtpZihhKXJldHVybiBhO2lmKHQpe2lmKCFvLmlzRGlyKG4ubW9kZSkpcmV0dXJuIDU0O2lmKG8uaXNSb290KG4pfHxvLmdldFBhdGgobik9PT1vLmN3ZCgpKXJldHVybiAxMH1lbHNlIGlmKG8uaXNEaXIobi5tb2RlKSlyZXR1cm4gMzE7cmV0dXJuIDB9LG1heU9wZW4oZSxyKXtyZXR1cm4gZT9vLmlzTGluayhlLm1vZGUpPzMyOm8uaXNEaXIoZS5tb2RlKSYmKG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikhPT0iciJ8fHImNTEyKT8zMTpvLm5vZGVQZXJtaXNzaW9ucyhlLG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikpOjQ0fSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQoKXtmb3IodmFyIGU9MDtlPD1vLk1BWF9PUEVOX0ZEUztlKyspaWYoIW8uc3RyZWFtc1tlXSlyZXR1cm4gZTt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMzKX0sZ2V0U3RyZWFtQ2hlY2tlZChlKXt2YXIgcj1vLmdldFN0cmVhbShlKTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO3JldHVybiByfSxnZXRTdHJlYW06ZT0+by5zdHJlYW1zW2VdLGNyZWF0ZVN0cmVhbShlLHI9LTEpe3JldHVybiBlPU9iamVjdC5hc3NpZ24obmV3IG8uRlNTdHJlYW0sZSkscj09LTEmJihyPW8ubmV4dGZkKCkpLGUuZmQ9cixvLnN0cmVhbXNbcl09ZSxlfSxjbG9zZVN0cmVhbShlKXtvLnN0cmVhbXNbZV09bnVsbH0sZHVwU3RyZWFtKGUscj0tMSl7dmFyIG4sYTt2YXIgdD1vLmNyZWF0ZVN0cmVhbShlLHIpO3JldHVybihhPShuPXQuc3RyZWFtX29wcyk9PW51bGw/dm9pZCAwOm4uZHVwKT09bnVsbHx8YS5jYWxsKG4sdCksdH0sY2hyZGV2X3N0cmVhbV9vcHM6e29wZW4oZSl7dmFyIHQsbjt2YXIgcj1vLmdldERldmljZShlLm5vZGUucmRldik7ZS5zdHJlYW1fb3BzPXIuc3RyZWFtX29wcywobj0odD1lLnN0cmVhbV9vcHMpLm9wZW4pPT1udWxsfHxuLmNhbGwodCxlKX0sbGxzZWVrKCl7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCl9fSxtYWpvcjplPT5lPj44LG1pbm9yOmU9PmUmMjU1LG1ha2VkZXY6KGUscik9PmU8PDh8cixyZWdpc3RlckRldmljZShlLHIpe28uZGV2aWNlc1tlXT17c3RyZWFtX29wczpyfX0sZ2V0RGV2aWNlOmU9Pm8uZGV2aWNlc1tlXSxnZXRNb3VudHMoZSl7Zm9yKHZhciByPVtdLHQ9W2VdO3QubGVuZ3RoOyl7dmFyIG49dC5wb3AoKTtyLnB1c2gobiksdC5wdXNoKC4uLm4ubW91bnRzKX1yZXR1cm4gcn0sc3luY2ZzKGUscil7dHlwZW9mIGU9PSJmdW5jdGlvbiImJihyPWUsZT0hMSksby5zeW5jRlNSZXF1ZXN0cysrLG8uc3luY0ZTUmVxdWVzdHM+MSYmZWUoYHdhcm5pbmc6ICR7by5zeW5jRlNSZXF1ZXN0c30gRlMuc3luY2ZzIG9wZXJhdGlvbnMgaW4gZmxpZ2h0IGF0IG9uY2UsIHByb2JhYmx5IGp1c3QgZG9pbmcgZXh0cmEgd29ya2ApO3ZhciB0PW8uZ2V0TW91bnRzKG8ucm9vdC5tb3VudCksbj0wO2Z1bmN0aW9uIGEocyl7cmV0dXJuIG8uc3luY0ZTUmVxdWVzdHMtLSxyKHMpfWZ1bmN0aW9uIGkocyl7aWYocylyZXR1cm4gaS5lcnJvcmVkP3ZvaWQgMDooaS5lcnJvcmVkPSEwLGEocykpOysrbj49dC5sZW5ndGgmJmEobnVsbCl9dC5mb3JFYWNoKHM9PntpZighcy50eXBlLnN5bmNmcylyZXR1cm4gaShudWxsKTtzLnR5cGUuc3luY2ZzKHMsZSxpKX0pfSxtb3VudChlLHIsdCl7dmFyIG49dD09PSIvIixhPSF0LGk7aWYobiYmby5yb290KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFuJiYhYSl7dmFyIHM9by5sb29rdXBQYXRoKHQse2ZvbGxvd19tb3VudDohMX0pO2lmKHQ9cy5wYXRoLGk9cy5ub2RlLG8uaXNNb3VudHBvaW50KGkpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFvLmlzRGlyKGkubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCl9dmFyIGw9e3R5cGU6ZSxvcHRzOnIsbW91bnRwb2ludDp0LG1vdW50czpbXX0sdT1lLm1vdW50KGwpO3JldHVybiB1Lm1vdW50PWwsbC5yb290PXUsbj9vLnJvb3Q9dTppJiYoaS5tb3VudGVkPWwsaS5tb3VudCYmaS5tb3VudC5tb3VudHMucHVzaChsKSksdX0sdW5tb3VudChlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93X21vdW50OiExfSk7aWYoIW8uaXNNb3VudHBvaW50KHIubm9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7dmFyIHQ9ci5ub2RlLG49dC5tb3VudGVkLGE9by5nZXRNb3VudHMobik7T2JqZWN0LmtleXMoby5uYW1lVGFibGUpLmZvckVhY2gocz0+e2Zvcih2YXIgbD1vLm5hbWVUYWJsZVtzXTtsOyl7dmFyIHU9bC5uYW1lX25leHQ7YS5pbmNsdWRlcyhsLm1vdW50KSYmby5kZXN0cm95Tm9kZShsKSxsPXV9fSksdC5tb3VudGVkPW51bGw7dmFyIGk9dC5tb3VudC5tb3VudHMuaW5kZXhPZihuKTt0Lm1vdW50Lm1vdW50cy5zcGxpY2UoaSwxKX0sbG9va3VwKGUscil7cmV0dXJuIGUubm9kZV9vcHMubG9va3VwKGUscil9LG1rbm9kKGUscix0KXt2YXIgbj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksYT1uLm5vZGUsaT1TLmJhc2VuYW1lKGUpO2lmKCFpfHxpPT09Ii4ifHxpPT09Ii4uIil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgcz1vLm1heUNyZWF0ZShhLGkpO2lmKHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihzKTtpZighYS5ub2RlX29wcy5ta25vZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gYS5ub2RlX29wcy5ta25vZChhLGkscix0KX0sY3JlYXRlKGUscil7cmV0dXJuIHI9ciE9PXZvaWQgMD9yOjQzOCxyJj00MDk1LHJ8PTMyNzY4LG8ubWtub2QoZSxyLDApfSxta2RpcihlLHIpe3JldHVybiByPXIhPT12b2lkIDA/cjo1MTEsciY9MTAyMyxyfD0xNjM4NCxvLm1rbm9kKGUsciwwKX0sbWtkaXJUcmVlKGUscil7Zm9yKHZhciB0PWUuc3BsaXQoIi8iKSxuPSIiLGE9MDthPHQubGVuZ3RoOysrYSlpZih0W2FdKXtuKz0iLyIrdFthXTt0cnl7by5ta2RpcihuLHIpfWNhdGNoKGkpe2lmKGkuZXJybm8hPTIwKXRocm93IGl9fX0sbWtkZXYoZSxyLHQpe3JldHVybiB0eXBlb2YgdD4idSImJih0PXIscj00MzgpLHJ8PTgxOTIsby5ta25vZChlLHIsdCl9LHN5bWxpbmsoZSxyKXtpZighWC5yZXNvbHZlKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciB0PW8ubG9va3VwUGF0aChyLHtwYXJlbnQ6ITB9KSxuPXQubm9kZTtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTt2YXIgYT1TLmJhc2VuYW1lKHIpLGk9by5tYXlDcmVhdGUobixhKTtpZihpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoaSk7aWYoIW4ubm9kZV9vcHMuc3ltbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5zeW1saW5rKG4sYSxlKX0scmVuYW1lKGUscil7dmFyIHQ9Uy5kaXJuYW1lKGUpLG49Uy5kaXJuYW1lKHIpLGE9Uy5iYXNlbmFtZShlKSxpPVMuYmFzZW5hbWUocikscyxsLHU7aWYocz1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksbD1zLm5vZGUscz1vLmxvb2t1cFBhdGgocix7cGFyZW50OiEwfSksdT1zLm5vZGUsIWx8fCF1KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO2lmKGwubW91bnQhPT11Lm1vdW50KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzUpO3ZhciBjPW8ubG9va3VwTm9kZShsLGEpLGQ9WC5yZWxhdGl2ZShlLG4pO2lmKGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKGQ9WC5yZWxhdGl2ZShyLHQpLGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTUpO3ZhciBtO3RyeXttPW8ubG9va3VwTm9kZSh1LGkpfWNhdGNoe31pZihjIT09bSl7dmFyIGg9by5pc0RpcihjLm1vZGUpLHA9by5tYXlEZWxldGUobCxhLGgpO2lmKHApdGhyb3cgbmV3IG8uRXJybm9FcnJvcihwKTtpZihwPW0/by5tYXlEZWxldGUodSxpLGgpOm8ubWF5Q3JlYXRlKHUsaSkscCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO2lmKCFsLm5vZGVfb3BzLnJlbmFtZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChjKXx8bSYmby5pc01vdW50cG9pbnQobSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigxMCk7aWYodSE9PWwmJihwPW8ubm9kZVBlcm1pc3Npb25zKGwsInciKSxwKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO28uaGFzaFJlbW92ZU5vZGUoYyk7dHJ5e2wubm9kZV9vcHMucmVuYW1lKGMsdSxpKX1jYXRjaCh3KXt0aHJvdyB3fWZpbmFsbHl7by5oYXNoQWRkTm9kZShjKX19fSxybWRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksdD1yLm5vZGUsbj1TLmJhc2VuYW1lKGUpLGE9by5sb29rdXBOb2RlKHQsbiksaT1vLm1heURlbGV0ZSh0LG4sITApO2lmKGkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihpKTtpZighdC5ub2RlX29wcy5ybWRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnJtZGlyKHQsbiksby5kZXN0cm95Tm9kZShhKX0scmVhZGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSksdD1yLm5vZGU7aWYoIXQubm9kZV9vcHMucmVhZGRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU0KTtyZXR1cm4gdC5ub2RlX29wcy5yZWFkZGlyKHQpfSx1bmxpbmsoZSl7dmFyIHI9by5sb29rdXBQYXRoKGUse3BhcmVudDohMH0pLHQ9ci5ub2RlO2lmKCF0KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciBuPVMuYmFzZW5hbWUoZSksYT1vLmxvb2t1cE5vZGUodCxuKSxpPW8ubWF5RGVsZXRlKHQsbiwhMSk7aWYoaSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGkpO2lmKCF0Lm5vZGVfb3BzLnVubGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnVubGluayh0LG4pLG8uZGVzdHJveU5vZGUoYSl9LHJlYWRsaW5rKGUpe3ZhciByPW8ubG9va3VwUGF0aChlKSx0PXIubm9kZTtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighdC5ub2RlX29wcy5yZWFkbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gWC5yZXNvbHZlKG8uZ2V0UGF0aCh0LnBhcmVudCksdC5ub2RlX29wcy5yZWFkbGluayh0KSl9LHN0YXQoZSxyKXt2YXIgdD1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiFyfSksbj10Lm5vZGU7aWYoIW4pdGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCk7aWYoIW4ubm9kZV9vcHMuZ2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5nZXRhdHRyKG4pfSxsc3RhdChlKXtyZXR1cm4gby5zdGF0KGUsITApfSxjaG1vZChlLHIsdCl7dmFyIG47aWYodHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgYT1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiF0fSk7bj1hLm5vZGV9ZWxzZSBuPWU7aWYoIW4ubm9kZV9vcHMuc2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtuLm5vZGVfb3BzLnNldGF0dHIobix7bW9kZTpyJjQwOTV8bi5tb2RlJi00MDk2LHRpbWVzdGFtcDpEYXRlLm5vdygpfSl9LGxjaG1vZChlLHIpe28uY2htb2QoZSxyLCEwKX0sZmNobW9kKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO28uY2htb2QodC5ub2RlLHIpfSxjaG93bihlLHIsdCxuKXt2YXIgYTtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBpPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IW59KTthPWkubm9kZX1lbHNlIGE9ZTtpZighYS5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Eubm9kZV9vcHMuc2V0YXR0cihhLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxsY2hvd24oZSxyLHQpe28uY2hvd24oZSxyLHQsITApfSxmY2hvd24oZSxyLHQpe3ZhciBuPW8uZ2V0U3RyZWFtQ2hlY2tlZChlKTtvLmNob3duKG4ubm9kZSxyLHQpfSx0cnVuY2F0ZShlLHIpe2lmKHI8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgdDtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KTt0PW4ubm9kZX1lbHNlIHQ9ZTtpZighdC5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2lmKG8uaXNEaXIodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMxKTtpZighby5pc0ZpbGUodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgYT1vLm5vZGVQZXJtaXNzaW9ucyh0LCJ3Iik7aWYoYSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGEpO3Qubm9kZV9vcHMuc2V0YXR0cih0LHtzaXplOnIsdGltZXN0YW1wOkRhdGUubm93KCl9KX0sZnRydW5jYXRlKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO2lmKCEodC5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtvLnRydW5jYXRlKHQubm9kZSxyKX0sdXRpbWUoZSxyLHQpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KSxhPW4ubm9kZTthLm5vZGVfb3BzLnNldGF0dHIoYSx7dGltZXN0YW1wOk1hdGgubWF4KHIsdCl9KX0sb3BlbihlLHIsdCl7aWYoZT09PSIiKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3I9dHlwZW9mIHI9PSJzdHJpbmciP1V0KHIpOnIsciY2ND8odD10eXBlb2YgdD4idSI/NDM4OnQsdD10JjQwOTV8MzI3NjgpOnQ9MDt2YXIgbjtpZih0eXBlb2YgZT09Im9iamVjdCIpbj1lO2Vsc2V7ZT1TLm5vcm1hbGl6ZShlKTt0cnl7dmFyIGE9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohKHImMTMxMDcyKX0pO249YS5ub2RlfWNhdGNoe319dmFyIGk9ITE7aWYociY2NClpZihuKXtpZihyJjEyOCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIwKX1lbHNlIG49by5ta25vZChlLHQsMCksaT0hMDtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZihvLmlzQ2hyZGV2KG4ubW9kZSkmJihyJj0tNTEzKSxyJjY1NTM2JiYhby5pc0RpcihuLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTQpO2lmKCFpKXt2YXIgcz1vLm1heU9wZW4obixyKTtpZihzKXRocm93IG5ldyBvLkVycm5vRXJyb3Iocyl9ciY1MTImJiFpJiZvLnRydW5jYXRlKG4sMCksciY9LTEzMTcxMzt2YXIgbD1vLmNyZWF0ZVN0cmVhbSh7bm9kZTpuLHBhdGg6by5nZXRQYXRoKG4pLGZsYWdzOnIsc2Vla2FibGU6ITAscG9zaXRpb246MCxzdHJlYW1fb3BzOm4uc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjohMX0pO3JldHVybiBsLnN0cmVhbV9vcHMub3BlbiYmbC5zdHJlYW1fb3BzLm9wZW4obCksZi5sb2dSZWFkRmlsZXMmJiEociYxKSYmKG8ucmVhZEZpbGVzfHwoby5yZWFkRmlsZXM9e30pLGUgaW4gby5yZWFkRmlsZXN8fChvLnJlYWRGaWxlc1tlXT0xKSksbH0sY2xvc2UoZSl7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2UuZ2V0ZGVudHMmJihlLmdldGRlbnRzPW51bGwpO3RyeXtlLnN0cmVhbV9vcHMuY2xvc2UmJmUuc3RyZWFtX29wcy5jbG9zZShlKX1jYXRjaChyKXt0aHJvdyByfWZpbmFsbHl7by5jbG9zZVN0cmVhbShlLmZkKX1lLmZkPW51bGx9LGlzQ2xvc2VkKGUpe3JldHVybiBlLmZkPT09bnVsbH0sbGxzZWVrKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIWUuc2Vla2FibGV8fCFlLnN0cmVhbV9vcHMubGxzZWVrKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzApO2lmKHQhPTAmJnQhPTEmJnQhPTIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7cmV0dXJuIGUucG9zaXRpb249ZS5zdHJlYW1fb3BzLmxsc2VlayhlLHIsdCksZS51bmdvdHRlbj1bXSxlLnBvc2l0aW9ufSxyZWFkKGUscix0LG4sYSl7aWYobjwwfHxhPDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKG8uaXNEaXIoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzEpO2lmKCFlLnN0cmVhbV9vcHMucmVhZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgaT10eXBlb2YgYTwidSI7aWYoIWkpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIHM9ZS5zdHJlYW1fb3BzLnJlYWQoZSxyLHQsbixhKTtyZXR1cm4gaXx8KGUucG9zaXRpb24rPXMpLHN9LHdyaXRlKGUscix0LG4sYSxpKXtpZihuPDB8fGE8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIShlLmZsYWdzJjIwOTcxNTUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoby5pc0RpcihlLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMSk7aWYoIWUuc3RyZWFtX29wcy53cml0ZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtlLnNlZWthYmxlJiZlLmZsYWdzJjEwMjQmJm8ubGxzZWVrKGUsMCwyKTt2YXIgcz10eXBlb2YgYTwidSI7aWYoIXMpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIGw9ZS5zdHJlYW1fb3BzLndyaXRlKGUscix0LG4sYSxpKTtyZXR1cm4gc3x8KGUucG9zaXRpb24rPWwpLGx9LGFsbG9jYXRlKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYocjwwfHx0PD0wKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKCEoZS5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKCFvLmlzRmlsZShlLm5vZGUubW9kZSkmJiFvLmlzRGlyKGUubm9kZS5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtpZighZS5zdHJlYW1fb3BzLmFsbG9jYXRlKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTM4KTtlLnN0cmVhbV9vcHMuYWxsb2NhdGUoZSxyLHQpfSxtbWFwKGUscix0LG4sYSl7aWYobiYyJiYhKGEmMikmJihlLmZsYWdzJjIwOTcxNTUpIT09Mil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKCFlLnN0cmVhbV9vcHMubW1hcCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtyZXR1cm4gZS5zdHJlYW1fb3BzLm1tYXAoZSxyLHQsbixhKX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gZS5zdHJlYW1fb3BzLm1zeW5jP2Uuc3RyZWFtX29wcy5tc3luYyhlLHIsdCxuLGEpOjB9LGlvY3RsKGUscix0KXtpZighZS5zdHJlYW1fb3BzLmlvY3RsKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTkpO3JldHVybiBlLnN0cmVhbV9vcHMuaW9jdGwoZSxyLHQpfSxyZWFkRmlsZShlLHI9e30pe2lmKHIuZmxhZ3M9ci5mbGFnc3x8MCxyLmVuY29kaW5nPXIuZW5jb2Rpbmd8fCJiaW5hcnkiLHIuZW5jb2RpbmchPT0idXRmOCImJnIuZW5jb2RpbmchPT0iYmluYXJ5Iil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZW5jb2RpbmcgdHlwZSAiJHtyLmVuY29kaW5nfSJgKTt2YXIgdCxuPW8ub3BlbihlLHIuZmxhZ3MpLGE9by5zdGF0KGUpLGk9YS5zaXplLHM9bmV3IFVpbnQ4QXJyYXkoaSk7cmV0dXJuIG8ucmVhZChuLHMsMCxpLDApLHIuZW5jb2Rpbmc9PT0idXRmOCI/dD1jZShzLDApOnIuZW5jb2Rpbmc9PT0iYmluYXJ5IiYmKHQ9cyksby5jbG9zZShuKSx0fSx3cml0ZUZpbGUoZSxyLHQ9e30pe3QuZmxhZ3M9dC5mbGFnc3x8NTc3O3ZhciBuPW8ub3BlbihlLHQuZmxhZ3MsdC5tb2RlKTtpZih0eXBlb2Ygcj09InN0cmluZyIpe3ZhciBhPW5ldyBVaW50OEFycmF5KFplKHIpKzEpLGk9UWUocixhLDAsYS5sZW5ndGgpO28ud3JpdGUobixhLDAsaSx2b2lkIDAsdC5jYW5Pd24pfWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKW8ud3JpdGUobixyLDAsci5ieXRlTGVuZ3RoLHZvaWQgMCx0LmNhbk93bik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpO28uY2xvc2Uobil9LGN3ZDooKT0+by5jdXJyZW50UGF0aCxjaGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSk7aWYoci5ub2RlPT09bnVsbCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighby5pc0RpcihyLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCk7dmFyIHQ9by5ub2RlUGVybWlzc2lvbnMoci5ub2RlLCJ4Iik7aWYodCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHQpO28uY3VycmVudFBhdGg9ci5wYXRofSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKXtvLm1rZGlyKCIvdG1wIiksby5ta2RpcigiL2hvbWUiKSxvLm1rZGlyKCIvaG9tZS93ZWJfdXNlciIpfSxjcmVhdGVEZWZhdWx0RGV2aWNlcygpe28ubWtkaXIoIi9kZXYiKSxvLnJlZ2lzdGVyRGV2aWNlKG8ubWFrZWRldigxLDMpLHtyZWFkOigpPT4wLHdyaXRlOihuLGEsaSxzLGwpPT5zfSksby5ta2RldigiL2Rldi9udWxsIixvLm1ha2VkZXYoMSwzKSksbGUucmVnaXN0ZXIoby5tYWtlZGV2KDUsMCksbGUuZGVmYXVsdF90dHlfb3BzKSxsZS5yZWdpc3RlcihvLm1ha2VkZXYoNiwwKSxsZS5kZWZhdWx0X3R0eTFfb3BzKSxvLm1rZGV2KCIvZGV2L3R0eSIsby5tYWtlZGV2KDUsMCkpLG8ubWtkZXYoIi9kZXYvdHR5MSIsby5tYWtlZGV2KDYsMCkpO3ZhciBlPW5ldyBVaW50OEFycmF5KDEwMjQpLHI9MCx0PSgpPT4ocj09PTAmJihyPUZyKGUpLmJ5dGVMZW5ndGgpLGVbLS1yXSk7by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJyYW5kb20iLHQpLG8uY3JlYXRlRGV2aWNlKCIvZGV2IiwidXJhbmRvbSIsdCksby5ta2RpcigiL2Rldi9zaG0iKSxvLm1rZGlyKCIvZGV2L3NobS90bXAiKX0sY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCl7by5ta2RpcigiL3Byb2MiKTt2YXIgZT1vLm1rZGlyKCIvcHJvYy9zZWxmIik7by5ta2RpcigiL3Byb2Mvc2VsZi9mZCIpLG8ubW91bnQoe21vdW50KCl7dmFyIHI9by5jcmVhdGVOb2RlKGUsImZkIiwxNjg5NSw3Myk7cmV0dXJuIHIubm9kZV9vcHM9e2xvb2t1cCh0LG4pe3ZhciBhPStuLGk9by5nZXRTdHJlYW1DaGVja2VkKGEpLHM9e3BhcmVudDpudWxsLG1vdW50Onttb3VudHBvaW50OiJmYWtlIn0sbm9kZV9vcHM6e3JlYWRsaW5rOigpPT5pLnBhdGh9fTtyZXR1cm4gcy5wYXJlbnQ9cyxzfX0scn19LHt9LCIvcHJvYy9zZWxmL2ZkIil9LGNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpe2Yuc3RkaW4/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRpbiIsZi5zdGRpbik6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKSxmLnN0ZG91dD9vLmNyZWF0ZURldmljZSgiL2RldiIsInN0ZG91dCIsbnVsbCxmLnN0ZG91dCk6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0IiksZi5zdGRlcnI/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRlcnIiLG51bGwsZi5zdGRlcnIpOm8uc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKSxvLm9wZW4oIi9kZXYvc3RkaW4iLDApLG8ub3BlbigiL2Rldi9zdGRvdXQiLDEpLG8ub3BlbigiL2Rldi9zdGRlcnIiLDEpfSxzdGF0aWNJbml0KCl7WzQ0XS5mb3JFYWNoKGU9PntvLmdlbmVyaWNFcnJvcnNbZV09bmV3IG8uRXJybm9FcnJvcihlKSxvLmdlbmVyaWNFcnJvcnNbZV0uc3RhY2s9IjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4ifSksby5uYW1lVGFibGU9bmV3IEFycmF5KDQwOTYpLG8ubW91bnQoYix7fSwiLyIpLG8uY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCksby5jcmVhdGVEZWZhdWx0RGV2aWNlcygpLG8uY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCksby5maWxlc3lzdGVtcz17TUVNRlM6YixXT1JLRVJGUzpWfX0saW5pdChlLHIsdCl7by5pbml0LmluaXRpYWxpemVkPSEwLGYuc3RkaW49ZXx8Zi5zdGRpbixmLnN0ZG91dD1yfHxmLnN0ZG91dCxmLnN0ZGVycj10fHxmLnN0ZGVycixvLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpfSxxdWl0KCl7by5pbml0LmluaXRpYWxpemVkPSExO2Zvcih2YXIgZT0wO2U8by5zdHJlYW1zLmxlbmd0aDtlKyspe3ZhciByPW8uc3RyZWFtc1tlXTtyJiZvLmNsb3NlKHIpfX0sZmluZE9iamVjdChlLHIpe3ZhciB0PW8uYW5hbHl6ZVBhdGgoZSxyKTtyZXR1cm4gdC5leGlzdHM/dC5vYmplY3Q6bnVsbH0sYW5hbHl6ZVBhdGgoZSxyKXt0cnl7dmFyIHQ9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohcn0pO2U9dC5wYXRofWNhdGNoe312YXIgbj17aXNSb290OiExLGV4aXN0czohMSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOiExLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciB0PW8ubG9va3VwUGF0aChlLHtwYXJlbnQ6ITB9KTtuLnBhcmVudEV4aXN0cz0hMCxuLnBhcmVudFBhdGg9dC5wYXRoLG4ucGFyZW50T2JqZWN0PXQubm9kZSxuLm5hbWU9Uy5iYXNlbmFtZShlKSx0PW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IXJ9KSxuLmV4aXN0cz0hMCxuLnBhdGg9dC5wYXRoLG4ub2JqZWN0PXQubm9kZSxuLm5hbWU9dC5ub2RlLm5hbWUsbi5pc1Jvb3Q9dC5wYXRoPT09Ii8ifWNhdGNoKGEpe24uZXJyb3I9YS5lcnJub31yZXR1cm4gbn0sY3JlYXRlUGF0aChlLHIsdCxuKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9lOm8uZ2V0UGF0aChlKTtmb3IodmFyIGE9ci5zcGxpdCgiLyIpLnJldmVyc2UoKTthLmxlbmd0aDspe3ZhciBpPWEucG9wKCk7aWYoaSl7dmFyIHM9Uy5qb2luMihlLGkpO3RyeXtvLm1rZGlyKHMpfWNhdGNoe31lPXN9fXJldHVybiBzfSxjcmVhdGVGaWxlKGUscix0LG4sYSl7dmFyIGk9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscikscz1lcihuLGEpO3JldHVybiBvLmNyZWF0ZShpLHMpfSxjcmVhdGVEYXRhRmlsZShlLHIsdCxuLGEsaSl7dmFyIHM9cjtlJiYoZT10eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscz1yP1Muam9pbjIoZSxyKTplKTt2YXIgbD1lcihuLGEpLHU9by5jcmVhdGUocyxsKTtpZih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2Zvcih2YXIgYz1uZXcgQXJyYXkodC5sZW5ndGgpLGQ9MCxtPXQubGVuZ3RoO2Q8bTsrK2QpY1tkXT10LmNoYXJDb2RlQXQoZCk7dD1jfW8uY2htb2QodSxsfDE0Nik7dmFyIGg9by5vcGVuKHUsNTc3KTtvLndyaXRlKGgsdCwwLHQubGVuZ3RoLDAsaSksby5jbG9zZShoKSxvLmNobW9kKHUsbCl9fSxjcmVhdGVEZXZpY2UoZSxyLHQsbil7dmFyIGE9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSksciksaT1lcighIXQsISFuKTtvLmNyZWF0ZURldmljZS5tYWpvcnx8KG8uY3JlYXRlRGV2aWNlLm1ham9yPTY0KTt2YXIgcz1vLm1ha2VkZXYoby5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtyZXR1cm4gby5yZWdpc3RlckRldmljZShzLHtvcGVuKGwpe2wuc2Vla2FibGU9ITF9LGNsb3NlKGwpe3ZhciB1Oyh1PW49PW51bGw/dm9pZCAwOm4uYnVmZmVyKSE9bnVsbCYmdS5sZW5ndGgmJm4oMTApfSxyZWFkKGwsdSxjLGQsbSl7Zm9yKHZhciBoPTAscD0wO3A8ZDtwKyspe3ZhciB3O3RyeXt3PXQoKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1pZih3PT09dm9pZCAwJiZoPT09MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYpO2lmKHc9PW51bGwpYnJlYWs7aCsrLHVbYytwXT13fXJldHVybiBoJiYobC5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpKSxofSx3cml0ZShsLHUsYyxkLG0pe2Zvcih2YXIgaD0wO2g8ZDtoKyspdHJ5e24odVtjK2hdKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1yZXR1cm4gZCYmKGwubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaH19KSxvLm1rZGV2KGEsaSxzKX0sZm9yY2VMb2FkRmlsZShlKXtpZihlLmlzRGV2aWNlfHxlLmlzRm9sZGVyfHxlLmxpbmt8fGUuY29udGVudHMpcmV0dXJuITA7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpO2lmKFllKXRyeXtlLmNvbnRlbnRzPVNlKFllKGUudXJsKSwhMCksZS51c2VkQnl0ZXM9ZS5jb250ZW50cy5sZW5ndGh9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfSxjcmVhdGVMYXp5RmlsZShlLHIsdCxuLGEpe2NsYXNzIGl7Y29uc3RydWN0b3IoKXt0aGlzLmxlbmd0aEtub3duPSExLHRoaXMuY2h1bmtzPVtdfWdldChwKXtpZighKHA+dGhpcy5sZW5ndGgtMXx8cDwwKSl7dmFyIHc9cCV0aGlzLmNodW5rU2l6ZSxEPXAvdGhpcy5jaHVua1NpemV8MDtyZXR1cm4gdGhpcy5nZXR0ZXIoRClbd119fXNldERhdGFHZXR0ZXIocCl7dGhpcy5nZXR0ZXI9cH1jYWNoZUxlbmd0aCgpe3ZhciBwPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihwLm9wZW4oIkhFQUQiLHQsITEpLHAuc2VuZChudWxsKSwhKHAuc3RhdHVzPj0yMDAmJnAuc3RhdHVzPDMwMHx8cC5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK3Auc3RhdHVzKTt2YXIgdz1OdW1iZXIocC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1sZW5ndGgiKSksRCxNPShEPXAuZ2V0UmVzcG9uc2VIZWFkZXIoIkFjY2VwdC1SYW5nZXMiKSkmJkQ9PT0iYnl0ZXMiLEY9KEQ9cC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpKSYmRD09PSJnemlwIix2PTEwMjQqMTAyNDtNfHwodj13KTt2YXIgXz0oVCxCKT0+e2lmKFQ+Qil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcmFuZ2UgKCIrVCsiLCAiK0IrIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKEI+dy0xKXRocm93IG5ldyBFcnJvcigib25seSAiK3crIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhIik7dmFyIE89bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKE8ub3BlbigiR0VUIix0LCExKSx3IT09diYmTy5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsImJ5dGVzPSIrVCsiLSIrQiksTy5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixPLm92ZXJyaWRlTWltZVR5cGUmJk8ub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpLE8uc2VuZChudWxsKSwhKE8uc3RhdHVzPj0yMDAmJk8uc3RhdHVzPDMwMHx8Ty5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK08uc3RhdHVzKTtyZXR1cm4gTy5yZXNwb25zZSE9PXZvaWQgMD9uZXcgVWludDhBcnJheShPLnJlc3BvbnNlfHxbXSk6U2UoTy5yZXNwb25zZVRleHR8fCIiLCEwKX0sTD10aGlzO0wuc2V0RGF0YUdldHRlcihUPT57dmFyIEI9VCp2LE89KFQrMSkqdi0xO2lmKE89TWF0aC5taW4oTyx3LTEpLHR5cGVvZiBMLmNodW5rc1tUXT4idSImJihMLmNodW5rc1tUXT1fKEIsTykpLHR5cGVvZiBMLmNodW5rc1tUXT4idSIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIEwuY2h1bmtzW1RdfSksKEZ8fCF3KSYmKHY9dz0xLHc9dGhpcy5nZXR0ZXIoMCkubGVuZ3RoLHY9dyxxZSgiTGF6eUZpbGVzIG9uIGd6aXAgZm9yY2VzIGRvd25sb2FkIG9mIHRoZSB3aG9sZSBmaWxlIHdoZW4gbGVuZ3RoIGlzIGFjY2Vzc2VkIikpLHRoaXMuX2xlbmd0aD13LHRoaXMuX2NodW5rU2l6ZT12LHRoaXMubGVuZ3RoS25vd249ITB9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmxlbmd0aEtub3dufHx0aGlzLmNhY2hlTGVuZ3RoKCksdGhpcy5fbGVuZ3RofWdldCBjaHVua1NpemUoKXtyZXR1cm4gdGhpcy5sZW5ndGhLbm93bnx8dGhpcy5jYWNoZUxlbmd0aCgpLHRoaXMuX2NodW5rU2l6ZX19aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil2YXIgcz1uZXcgaSxsPXtpc0RldmljZTohMSxjb250ZW50czpzfTtlbHNlIHZhciBsPXtpc0RldmljZTohMSx1cmw6dH07dmFyIHU9by5jcmVhdGVGaWxlKGUscixsLG4sYSk7bC5jb250ZW50cz91LmNvbnRlbnRzPWwuY29udGVudHM6bC51cmwmJih1LmNvbnRlbnRzPW51bGwsdS51cmw9bC51cmwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHUse3VzZWRCeXRlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RofX19KTt2YXIgYz17fSxkPU9iamVjdC5rZXlzKHUuc3RyZWFtX29wcyk7ZC5mb3JFYWNoKGg9Pnt2YXIgcD11LnN0cmVhbV9vcHNbaF07Y1toXT0oLi4udyk9PihvLmZvcmNlTG9hZEZpbGUodSkscCguLi53KSl9KTtmdW5jdGlvbiBtKGgscCx3LEQsTSl7dmFyIEY9aC5ub2RlLmNvbnRlbnRzO2lmKE0+PUYubGVuZ3RoKXJldHVybiAwO3ZhciB2PU1hdGgubWluKEYubGVuZ3RoLU0sRCk7aWYoRi5zbGljZSlmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GW00rX107ZWxzZSBmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GLmdldChNK18pO3JldHVybiB2fXJldHVybiBjLnJlYWQ9KGgscCx3LEQsTSk9PihvLmZvcmNlTG9hZEZpbGUodSksbShoLHAsdyxELE0pKSxjLm1tYXA9KGgscCx3LEQsTSk9PntvLmZvcmNlTG9hZEZpbGUodSk7dmFyIEY9VHIoKTtpZighRil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ4KTtyZXR1cm4gbShoLEksRixwLHcpLHtwdHI6RixhbGxvY2F0ZWQ6ITB9fSx1LnN0cmVhbV9vcHM9Yyx1fX0sUD17REVGQVVMVF9QT0xMTUFTSzo1LGNhbGN1bGF0ZUF0KGUscix0KXtpZihTLmlzQWJzKHIpKXJldHVybiByO3ZhciBuO2lmKGU9PT0tMTAwKW49by5jd2QoKTtlbHNle3ZhciBhPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO249YS5wYXRofWlmKHIubGVuZ3RoPT0wKXtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtyZXR1cm4gbn1yZXR1cm4gUy5qb2luMihuLHIpfSxkb1N0YXQoZSxyLHQpe3ZhciBuPWUocik7Z1t0Pj4yXT1uLmRldixnW3QrND4+Ml09bi5tb2RlLEFbdCs4Pj4yXT1uLm5saW5rLGdbdCsxMj4+Ml09bi51aWQsZ1t0KzE2Pj4yXT1uLmdpZCxnW3QrMjA+PjJdPW4ucmRldiwkPVtuLnNpemU+Pj4wLCh5PW4uc2l6ZSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCsyND4+Ml09JFswXSxnW3QrMjg+PjJdPSRbMV0sZ1t0KzMyPj4yXT00MDk2LGdbdCszNj4+Ml09bi5ibG9ja3M7dmFyIGE9bi5hdGltZS5nZXRUaW1lKCksaT1uLm10aW1lLmdldFRpbWUoKSxzPW4uY3RpbWUuZ2V0VGltZSgpO3JldHVybiAkPVtNYXRoLmZsb29yKGEvMWUzKT4+PjAsKHk9TWF0aC5mbG9vcihhLzFlMyksK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrNDA+PjJdPSRbMF0sZ1t0KzQ0Pj4yXT0kWzFdLEFbdCs0OD4+Ml09YSUxZTMqMWUzLCQ9W01hdGguZmxvb3IoaS8xZTMpPj4+MCwoeT1NYXRoLmZsb29yKGkvMWUzKSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCs1Nj4+Ml09JFswXSxnW3QrNjA+PjJdPSRbMV0sQVt0KzY0Pj4yXT1pJTFlMyoxZTMsJD1bTWF0aC5mbG9vcihzLzFlMyk+Pj4wLCh5PU1hdGguZmxvb3Iocy8xZTMpLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1t0KzcyPj4yXT0kWzBdLGdbdCs3Nj4+Ml09JFsxXSxBW3QrODA+PjJdPXMlMWUzKjFlMywkPVtuLmlubz4+PjAsKHk9bi5pbm8sK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrODg+PjJdPSRbMF0sZ1t0KzkyPj4yXT0kWzFdLDB9LGRvTXN5bmMoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoci5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO2lmKG4mMilyZXR1cm4gMDt2YXIgaT14LnNsaWNlKGUsZSt0KTtvLm1zeW5jKHIsaSxhLHQsbil9LGdldFN0cmVhbUZyb21GRChlKXt2YXIgcj1vLmdldFN0cmVhbUNoZWNrZWQoZSk7cmV0dXJuIHJ9LHZhcmFyZ3M6dm9pZCAwLGdldFN0cihlKXt2YXIgcj1zZShlKTtyZXR1cm4gcn19O2Z1bmN0aW9uIGp0KGUscix0LG4pe3RyeXtpZihyPVAuZ2V0U3RyKHIpLHI9UC5jYWxjdWxhdGVBdChlLHIpLHQmLTgpcmV0dXJuLTI4O3ZhciBhPW8ubG9va3VwUGF0aChyLHtmb2xsb3c6ITB9KSxpPWEubm9kZTtpZighaSlyZXR1cm4tNDQ7dmFyIHM9IiI7cmV0dXJuIHQmNCYmKHMrPSJyIiksdCYyJiYocys9InciKSx0JjEmJihzKz0ieCIpLHMmJm8ubm9kZVBlcm1pc3Npb25zKGkscyk/LTI6MH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybi1sLmVycm5vfX1mdW5jdGlvbiBNZSgpe3ZhciBlPWdbK1AudmFyYXJncz4+Ml07cmV0dXJuIFAudmFyYXJncys9NCxlfXZhciBkZT1NZTtmdW5jdGlvbiB6dChlLHIsdCl7UC52YXJhcmdzPXQ7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3N3aXRjaChyKXtjYXNlIDA6e3ZhciBhPU1lKCk7aWYoYTwwKXJldHVybi0yODtmb3IoO28uc3RyZWFtc1thXTspYSsrO3ZhciBpO3JldHVybiBpPW8uZHVwU3RyZWFtKG4sYSksaS5mZH1jYXNlIDE6Y2FzZSAyOnJldHVybiAwO2Nhc2UgMzpyZXR1cm4gbi5mbGFncztjYXNlIDQ6e3ZhciBhPU1lKCk7cmV0dXJuIG4uZmxhZ3N8PWEsMH1jYXNlIDEyOnt2YXIgYT1kZSgpLHM9MDtyZXR1cm4gWVthK3M+PjFdPTIsMH1jYXNlIDEzOmNhc2UgMTQ6cmV0dXJuIDB9cmV0dXJuLTI4fWNhdGNoKGwpe2lmKHR5cGVvZiBvPiJ1Inx8bC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGw7cmV0dXJuLWwuZXJybm99fWZ1bmN0aW9uIHh0KGUscil7dHJ5e3ZhciB0PVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3JldHVybiBQLmRvU3RhdChvLnN0YXQsdC5wYXRoLHIpfWNhdGNoKG4pe2lmKHR5cGVvZiBvPiJ1Inx8bi5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IG47cmV0dXJuLW4uZXJybm99fXZhciB2ZT0oZSxyLHQpPT5RZShlLHgscix0KTtmdW5jdGlvbiBIdChlLHIsdCl7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO24uZ2V0ZGVudHN8fChuLmdldGRlbnRzPW8ucmVhZGRpcihuLnBhdGgpKTtmb3IodmFyIGE9MjgwLGk9MCxzPW8ubGxzZWVrKG4sMCwxKSxsPU1hdGguZmxvb3Iocy9hKTtsPG4uZ2V0ZGVudHMubGVuZ3RoJiZpK2E8PXQ7KXt2YXIgdSxjLGQ9bi5nZXRkZW50c1tsXTtpZihkPT09Ii4iKXU9bi5ub2RlLmlkLGM9NDtlbHNlIGlmKGQ9PT0iLi4iKXt2YXIgbT1vLmxvb2t1cFBhdGgobi5wYXRoLHtwYXJlbnQ6ITB9KTt1PW0ubm9kZS5pZCxjPTR9ZWxzZXt2YXIgaD1vLmxvb2t1cE5vZGUobi5ub2RlLGQpO3U9aC5pZCxjPW8uaXNDaHJkZXYoaC5tb2RlKT8yOm8uaXNEaXIoaC5tb2RlKT80Om8uaXNMaW5rKGgubW9kZSk/MTA6OH0kPVt1Pj4+MCwoeT11LCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2k+PjJdPSRbMF0sZ1tyK2krND4+Ml09JFsxXSwkPVsobCsxKSphPj4+MCwoeT0obCsxKSphLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2krOD4+Ml09JFswXSxnW3IraSsxMj4+Ml09JFsxXSxZW3IraSsxNj4+MV09MjgwLElbcitpKzE4XT1jLHZlKGQscitpKzE5LDI1NiksaSs9YSxsKz0xfXJldHVybiBvLmxsc2VlayhuLGwqYSwwKSxpfWNhdGNoKHApe2lmKHR5cGVvZiBvPiJ1Inx8cC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHA7cmV0dXJuLXAuZXJybm99fWZ1bmN0aW9uIFd0KGUscix0KXtQLnZhcmFyZ3M9dDt0cnl7dmFyIG49UC5nZXRTdHJlYW1Gcm9tRkQoZSk7c3dpdGNoKHIpe2Nhc2UgMjE1MDk6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDU6e2lmKCFuLnR0eSlyZXR1cm4tNTk7aWYobi50dHkub3BzLmlvY3RsX3RjZ2V0cyl7dmFyIGE9bi50dHkub3BzLmlvY3RsX3RjZ2V0cyhuKSxpPWRlKCk7Z1tpPj4yXT1hLmNfaWZsYWd8fDAsZ1tpKzQ+PjJdPWEuY19vZmxhZ3x8MCxnW2krOD4+Ml09YS5jX2NmbGFnfHwwLGdbaSsxMj4+Ml09YS5jX2xmbGFnfHwwO2Zvcih2YXIgcz0wO3M8MzI7cysrKUlbaStzKzE3XT1hLmNfY2Nbc118fDA7cmV0dXJuIDB9cmV0dXJuIDB9Y2FzZSAyMTUxMDpjYXNlIDIxNTExOmNhc2UgMjE1MTI6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDY6Y2FzZSAyMTUwNzpjYXNlIDIxNTA4OntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90Y3NldHMpe2Zvcih2YXIgaT1kZSgpLGw9Z1tpPj4yXSx1PWdbaSs0Pj4yXSxjPWdbaSs4Pj4yXSxkPWdbaSsxMj4+Ml0sbT1bXSxzPTA7czwzMjtzKyspbS5wdXNoKElbaStzKzE3XSk7cmV0dXJuIG4udHR5Lm9wcy5pb2N0bF90Y3NldHMobi50dHkscix7Y19pZmxhZzpsLGNfb2ZsYWc6dSxjX2NmbGFnOmMsY19sZmxhZzpkLGNfY2M6bX0pfXJldHVybiAwfWNhc2UgMjE1MTk6e2lmKCFuLnR0eSlyZXR1cm4tNTk7dmFyIGk9ZGUoKTtyZXR1cm4gZ1tpPj4yXT0wLDB9Y2FzZSAyMTUyMDpyZXR1cm4gbi50dHk/LTI4Oi01OTtjYXNlIDIxNTMxOnt2YXIgaT1kZSgpO3JldHVybiBvLmlvY3RsKG4scixpKX1jYXNlIDIxNTIzOntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90aW9jZ3dpbnN6KXt2YXIgaD1uLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeihuLnR0eSksaT1kZSgpO1lbaT4+MV09aFswXSxZW2krMj4+MV09aFsxXX1yZXR1cm4gMH1jYXNlIDIxNTI0OnJldHVybiBuLnR0eT8wOi01OTtjYXNlIDIxNTE1OnJldHVybiBuLnR0eT8wOi01OTtkZWZhdWx0OnJldHVybi0yOH19Y2F0Y2gocCl7aWYodHlwZW9mIG8+InUifHxwLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcDtyZXR1cm4tcC5lcnJub319ZnVuY3Rpb24gQnQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5sc3RhdCxlLHIpfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuLXQuZXJybm99fWZ1bmN0aW9uIE50KGUscix0LG4pe3RyeXtyPVAuZ2V0U3RyKHIpO3ZhciBhPW4mMjU2LGk9biY0MDk2O3JldHVybiBuPW4mLTY0MDEscj1QLmNhbGN1bGF0ZUF0KGUscixpKSxQLmRvU3RhdChhP28ubHN0YXQ6by5zdGF0LHIsdCl9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4tcy5lcnJub319ZnVuY3Rpb24gWXQoZSxyLHQsbil7UC52YXJhcmdzPW47dHJ5e3I9UC5nZXRTdHIocikscj1QLmNhbGN1bGF0ZUF0KGUscik7dmFyIGE9bj9NZSgpOjA7cmV0dXJuIG8ub3BlbihyLHQsYSkuZmR9Y2F0Y2goaSl7aWYodHlwZW9mIG8+InUifHxpLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgaTtyZXR1cm4taS5lcnJub319ZnVuY3Rpb24gR3QoZSxyLHQsbil7dHJ5e3JldHVybiByPVAuZ2V0U3RyKHIpLG49UC5nZXRTdHIobikscj1QLmNhbGN1bGF0ZUF0KGUsciksbj1QLmNhbGN1bGF0ZUF0KHQsbiksby5yZW5hbWUocixuKSwwfWNhdGNoKGEpe2lmKHR5cGVvZiBvPiJ1Inx8YS5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGE7cmV0dXJuLWEuZXJybm99fWZ1bmN0aW9uIHF0KGUpe3RyeXtyZXR1cm4gZT1QLmdldFN0cihlKSxvLnJtZGlyKGUpLDB9Y2F0Y2gocil7aWYodHlwZW9mIG8+InUifHxyLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcjtyZXR1cm4tci5lcnJub319ZnVuY3Rpb24gWHQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5zdGF0LGUscil9Y2F0Y2godCl7aWYodHlwZW9mIG8+InUifHx0Lm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgdDtyZXR1cm4tdC5lcnJub319ZnVuY3Rpb24gS3QoZSxyLHQpe3RyeXtyZXR1cm4gcj1QLmdldFN0cihyKSxyPVAuY2FsY3VsYXRlQXQoZSxyKSx0PT09MD9vLnVubGluayhyKTp0PT09NTEyP28ucm1kaXIocik6aWUoIkludmFsaWQgZmxhZ3MgcGFzc2VkIHRvIHVubGlua2F0IiksMH1jYXRjaChuKXtpZih0eXBlb2Ygbz4idSJ8fG4ubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBuO3JldHVybi1uLmVycm5vfX12YXIgSnQ9KCk9PntpZSgiIil9LFJlPXt9LHJyPWU9Pntmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKSx0PWUucG9wKCk7dChyKX19O2Z1bmN0aW9uIHllKGUpe3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShBW2U+PjJdKX12YXIgaGU9e30sdWU9e30sT2U9e30sU3IsSWU9ZT0+e3Rocm93IG5ldyBTcihlKX0sTj0oZSxyLHQpPT57ZS5mb3JFYWNoKGZ1bmN0aW9uKGwpe09lW2xdPXJ9KTtmdW5jdGlvbiBuKGwpe3ZhciB1PXQobCk7dS5sZW5ndGghPT1lLmxlbmd0aCYmSWUoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKTtmb3IodmFyIGM9MDtjPGUubGVuZ3RoOysrYylLKGVbY10sdVtjXSl9dmFyIGE9bmV3IEFycmF5KHIubGVuZ3RoKSxpPVtdLHM9MDtyLmZvckVhY2goKGwsdSk9Pnt1ZS5oYXNPd25Qcm9wZXJ0eShsKT9hW3VdPXVlW2xdOihpLnB1c2gobCksaGUuaGFzT3duUHJvcGVydHkobCl8fChoZVtsXT1bXSksaGVbbF0ucHVzaCgoKT0+e2FbdV09dWVbbF0sKytzLHM9PT1pLmxlbmd0aCYmbihhKX0pKX0pLGkubGVuZ3RoPT09MCYmbihhKX0sWnQ9ZT0+e3ZhciByPVJlW2VdO2RlbGV0ZSBSZVtlXTt2YXIgdD1yLnJhd0NvbnN0cnVjdG9yLG49ci5yYXdEZXN0cnVjdG9yLGE9ci5maWVsZHMsaT1hLm1hcChzPT5zLmdldHRlclJldHVyblR5cGUpLmNvbmNhdChhLm1hcChzPT5zLnNldHRlckFyZ3VtZW50VHlwZSkpO04oW2VdLGkscz0+e3ZhciBsPXt9O3JldHVybiBhLmZvckVhY2goKHUsYyk9Pnt2YXIgZD11LmZpZWxkTmFtZSxtPXNbY10saD11LmdldHRlcixwPXUuZ2V0dGVyQ29udGV4dCx3PXNbYythLmxlbmd0aF0sRD11LnNldHRlcixNPXUuc2V0dGVyQ29udGV4dDtsW2RdPXtyZWFkOkY9Pm0uZnJvbVdpcmVUeXBlKGgocCxGKSksd3JpdGU6KEYsdik9Pnt2YXIgXz1bXTtEKE0sRix3LnRvV2lyZVR5cGUoXyx2KSkscnIoXyl9fX0pLFt7bmFtZTpyLm5hbWUsZnJvbVdpcmVUeXBlOnU9Pnt2YXIgYz17fTtmb3IodmFyIGQgaW4gbCljW2RdPWxbZF0ucmVhZCh1KTtyZXR1cm4gbih1KSxjfSx0b1dpcmVUeXBlOih1LGMpPT57Zm9yKHZhciBkIGluIGwpaWYoIShkIGluIGMpKXRocm93IG5ldyBUeXBlRXJyb3IoYE1pc3NpbmcgZmllbGQ6ICIke2R9ImApO3ZhciBtPXQoKTtmb3IoZCBpbiBsKWxbZF0ud3JpdGUobSxjW2RdKTtyZXR1cm4gdSE9PW51bGwmJnUucHVzaChuLG0pLG19LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm59XX0pfSxRdD0oZSxyLHQsbixhKT0+e30sZW49KCk9Pntmb3IodmFyIGU9bmV3IEFycmF5KDI1Nikscj0wO3I8MjU2OysrcillW3JdPVN0cmluZy5mcm9tQ2hhckNvZGUocik7TXI9ZX0sTXIsaj1lPT57Zm9yKHZhciByPSIiLHQ9ZTt4W3RdOylyKz1Nclt4W3QrK11dO3JldHVybiByfSxtZSxrPWU9Pnt0aHJvdyBuZXcgbWUoZSl9O2Z1bmN0aW9uIHJuKGUscix0PXt9KXt2YXIgbj1yLm5hbWU7aWYoZXx8ayhgdHlwZSAiJHtufSIgbXVzdCBoYXZlIGEgcG9zaXRpdmUgaW50ZWdlciB0eXBlaWQgcG9pbnRlcmApLHVlLmhhc093blByb3BlcnR5KGUpKXtpZih0Lmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpcmV0dXJuO2soYENhbm5vdCByZWdpc3RlciB0eXBlICcke259JyB0d2ljZWApfWlmKHVlW2VdPXIsZGVsZXRlIE9lW2VdLGhlLmhhc093blByb3BlcnR5KGUpKXt2YXIgYT1oZVtlXTtkZWxldGUgaGVbZV0sYS5mb3JFYWNoKGk9PmkoKSl9fWZ1bmN0aW9uIEsoZSxyLHQ9e30pe2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKTtyZXR1cm4gcm4oZSxyLHQpfXZhciBKPTgsdG49KGUscix0LG4pPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4hIWF9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oYSxpKXtyZXR1cm4gaT90Om59LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKHhbYV0pfSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSxubj1lPT4oe2NvdW50OmUuY291bnQsZGVsZXRlU2NoZWR1bGVkOmUuZGVsZXRlU2NoZWR1bGVkLHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOmUucHJlc2VydmVQb2ludGVyT25EZWxldGUscHRyOmUucHRyLHB0clR5cGU6ZS5wdHJUeXBlLHNtYXJ0UHRyOmUuc21hcnRQdHIsc21hcnRQdHJUeXBlOmUuc21hcnRQdHJUeXBlfSksdHI9ZT0+e2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MubmFtZX1rKHIoZSkrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX0sbnI9ITEsUnI9ZT0+e30sYW49ZT0+e2Uuc21hcnRQdHI/ZS5zbWFydFB0clR5cGUucmF3RGVzdHJ1Y3RvcihlLnNtYXJ0UHRyKTplLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoZS5wdHIpfSxPcj1lPT57ZS5jb3VudC52YWx1ZS09MTt2YXIgcj1lLmNvdW50LnZhbHVlPT09MDtyJiZhbihlKX0sSXI9KGUscix0KT0+e2lmKHI9PT10KXJldHVybiBlO2lmKHQuYmFzZUNsYXNzPT09dm9pZCAwKXJldHVybiBudWxsO3ZhciBuPUlyKGUscix0LmJhc2VDbGFzcyk7cmV0dXJuIG49PT1udWxsP251bGw6dC5kb3duY2FzdChuKX0sTHI9e30sb249KCk9Pk9iamVjdC5rZXlzKGJlKS5sZW5ndGgsc249KCk9Pnt2YXIgZT1bXTtmb3IodmFyIHIgaW4gYmUpYmUuaGFzT3duUHJvcGVydHkocikmJmUucHVzaChiZVtyXSk7cmV0dXJuIGV9LHdlPVtdLGFyPSgpPT57Zm9yKDt3ZS5sZW5ndGg7KXt2YXIgZT13ZS5wb3AoKTtlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlLmRlbGV0ZSgpfX0sRWUsbG49ZT0+e0VlPWUsd2UubGVuZ3RoJiZFZSYmRWUoYXIpfSx1bj0oKT0+e2YuZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudD1vbixmLmdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM9c24sZi5mbHVzaFBlbmRpbmdEZWxldGVzPWFyLGYuc2V0RGVsYXlGdW5jdGlvbj1sbn0sYmU9e30sZm49KGUscik9Pntmb3Iocj09PXZvaWQgMCYmaygicHRyIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIik7ZS5iYXNlQ2xhc3M7KXI9ZS51cGNhc3QociksZT1lLmJhc2VDbGFzcztyZXR1cm4gcn0sY249KGUscik9PihyPWZuKGUsciksYmVbcl0pLExlPShlLHIpPT57KCFyLnB0clR5cGV8fCFyLnB0cikmJkllKCJtYWtlQ2xhc3NIYW5kbGUgcmVxdWlyZXMgcHRyIGFuZCBwdHJUeXBlIik7dmFyIHQ9ISFyLnNtYXJ0UHRyVHlwZSxuPSEhci5zbWFydFB0cjtyZXR1cm4gdCE9PW4mJkllKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKSxyLmNvdW50PXt2YWx1ZToxfSxrZShPYmplY3QuY3JlYXRlKGUseyQkOnt2YWx1ZTpyLHdyaXRhYmxlOiEwfX0pKX07ZnVuY3Rpb24gZG4oZSl7dmFyIHI9dGhpcy5nZXRQb2ludGVlKGUpO2lmKCFyKXJldHVybiB0aGlzLmRlc3RydWN0b3IoZSksbnVsbDt2YXIgdD1jbih0aGlzLnJlZ2lzdGVyZWRDbGFzcyxyKTtpZih0IT09dm9pZCAwKXtpZih0LiQkLmNvdW50LnZhbHVlPT09MClyZXR1cm4gdC4kJC5wdHI9cix0LiQkLnNtYXJ0UHRyPWUsdC5jbG9uZSgpO3ZhciBuPXQuY2xvbmUoKTtyZXR1cm4gdGhpcy5kZXN0cnVjdG9yKGUpLG59ZnVuY3Rpb24gYSgpe3JldHVybiB0aGlzLmlzU21hcnRQb2ludGVyP0xlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6ZX0pOkxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOmV9KX12YXIgaT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHIpLHM9THJbaV07aWYoIXMpcmV0dXJuIGEuY2FsbCh0aGlzKTt2YXIgbDt0aGlzLmlzQ29uc3Q/bD1zLmNvbnN0UG9pbnRlclR5cGU6bD1zLnBvaW50ZXJUeXBlO3ZhciB1PUlyKHIsdGhpcy5yZWdpc3RlcmVkQ2xhc3MsbC5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiB1PT09bnVsbD9hLmNhbGwodGhpcyk6dGhpcy5pc1NtYXJ0UG9pbnRlcj9MZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1LHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOmV9KTpMZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1fSl9dmFyIGtlPWU9PnR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT4idSI/KGtlPXI9PnIsZSk6KG5yPW5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShyPT57T3Ioci4kJCl9KSxrZT1yPT57dmFyIHQ9ci4kJCxuPSEhdC5zbWFydFB0cjtpZihuKXt2YXIgYT17JCQ6dH07bnIucmVnaXN0ZXIocixhLHIpfXJldHVybiByfSxScj1yPT5uci51bnJlZ2lzdGVyKHIpLGtlKGUpKSx2bj0oKT0+e09iamVjdC5hc3NpZ24oVmUucHJvdG90eXBlLHtpc0FsaWFzT2YoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgVmUpfHwhKGUgaW5zdGFuY2VvZiBWZSkpcmV0dXJuITE7dmFyIHI9dGhpcy4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyx0PXRoaXMuJCQucHRyO2UuJCQ9ZS4kJDtmb3IodmFyIG49ZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxhPWUuJCQucHRyO3IuYmFzZUNsYXNzOyl0PXIudXBjYXN0KHQpLHI9ci5iYXNlQ2xhc3M7Zm9yKDtuLmJhc2VDbGFzczspYT1uLnVwY2FzdChhKSxuPW4uYmFzZUNsYXNzO3JldHVybiByPT09biYmdD09PWF9LGNsb25lKCl7aWYodGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpcmV0dXJuIHRoaXMuJCQuY291bnQudmFsdWUrPTEsdGhpczt2YXIgZT1rZShPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSx7JCQ6e3ZhbHVlOm5uKHRoaXMuJCQpfX0pKTtyZXR1cm4gZS4kJC5jb3VudC52YWx1ZSs9MSxlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlfSxkZWxldGUoKXt0aGlzLiQkLnB0cnx8dHIodGhpcyksdGhpcy4kJC5kZWxldGVTY2hlZHVsZWQmJiF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlJiZrKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIiksUnIodGhpcyksT3IodGhpcy4kJCksdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZXx8KHRoaXMuJCQuc21hcnRQdHI9dm9pZCAwLHRoaXMuJCQucHRyPXZvaWQgMCl9LGlzRGVsZXRlZCgpe3JldHVybiF0aGlzLiQkLnB0cn0sZGVsZXRlTGF0ZXIoKXtyZXR1cm4gdGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSYmaygiT2JqZWN0IGFscmVhZHkgc2NoZWR1bGVkIGZvciBkZWxldGlvbiIpLHdlLnB1c2godGhpcyksd2UubGVuZ3RoPT09MSYmRWUmJkVlKGFyKSx0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMCx0aGlzfX0pfTtmdW5jdGlvbiBWZSgpe312YXIgVWU9KGUscik9Pk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJuYW1lIix7dmFsdWU6ZX0pLG9yPShlLHIsdCk9PntpZihlW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDApe3ZhciBuPWVbcl07ZVtyXT1mdW5jdGlvbiguLi5hKXtyZXR1cm4gZVtyXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGEubGVuZ3RoKXx8ayhgRnVuY3Rpb24gJyR7dH0nIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoJHthLmxlbmd0aH0pIC0gZXhwZWN0cyBvbmUgb2YgKCR7ZVtyXS5vdmVybG9hZFRhYmxlfSkhYCksZVtyXS5vdmVybG9hZFRhYmxlW2EubGVuZ3RoXS5hcHBseSh0aGlzLGEpfSxlW3JdLm92ZXJsb2FkVGFibGU9W10sZVtyXS5vdmVybG9hZFRhYmxlW24uYXJnQ291bnRdPW59fSxWcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKT8oKHQ9PT12b2lkIDB8fGZbZV0ub3ZlcmxvYWRUYWJsZSE9PXZvaWQgMCYmZltlXS5vdmVybG9hZFRhYmxlW3RdIT09dm9pZCAwKSYmayhgQ2Fubm90IHJlZ2lzdGVyIHB1YmxpYyBuYW1lICcke2V9JyB0d2ljZWApLG9yKGYsZSxlKSxmLmhhc093blByb3BlcnR5KHQpJiZrKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgb3ZlcmxvYWRzIG9mIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzICgke3R9KSFgKSxmW2VdLm92ZXJsb2FkVGFibGVbdF09cik6KGZbZV09cix0IT09dm9pZCAwJiYoZltlXS5udW1Bcmd1bWVudHM9dCkpfSxobj00OCxtbj01Nyxwbj1lPT57aWYoZT09PXZvaWQgMClyZXR1cm4iX3Vua25vd24iO2U9ZS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csIiQiKTt2YXIgcj1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHI+PWhuJiZyPD1tbj9gXyR7ZX1gOmV9O2Z1bmN0aW9uIF9uKGUscix0LG4sYSxpLHMsbCl7dGhpcy5uYW1lPWUsdGhpcy5jb25zdHJ1Y3Rvcj1yLHRoaXMuaW5zdGFuY2VQcm90b3R5cGU9dCx0aGlzLnJhd0Rlc3RydWN0b3I9bix0aGlzLmJhc2VDbGFzcz1hLHRoaXMuZ2V0QWN0dWFsVHlwZT1pLHRoaXMudXBjYXN0PXMsdGhpcy5kb3duY2FzdD1sLHRoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnM9W119dmFyIGplPShlLHIsdCk9Pntmb3IoO3IhPT10OylyLnVwY2FzdHx8ayhgRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAke3QubmFtZX0sIGdvdCBhbiBpbnN0YW5jZSBvZiAke3IubmFtZX1gKSxlPXIudXBjYXN0KGUpLHI9ci5iYXNlQ2xhc3M7cmV0dXJuIGV9O2Z1bmN0aW9uIGduKGUscil7aWYocj09PW51bGwpcmV0dXJuIHRoaXMuaXNSZWZlcmVuY2UmJmsoYG51bGwgaXMgbm90IGEgdmFsaWQgJHt0aGlzLm5hbWV9YCksMDtyLiQkfHxrKGBDYW5ub3QgcGFzcyAiJHtscihyKX0iIGFzIGEgJHt0aGlzLm5hbWV9YCksci4kJC5wdHJ8fGsoYENhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICR7dGhpcy5uYW1lfWApO3ZhciB0PXIuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3Msbj1qZShyLiQkLnB0cix0LHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gbn1mdW5jdGlvbiB5bihlLHIpe3ZhciB0O2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLHRoaXMuaXNTbWFydFBvaW50ZXI/KHQ9dGhpcy5yYXdDb25zdHJ1Y3RvcigpLGUhPT1udWxsJiZlLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHQpLHQpOjA7KCFyfHwhci4kJCkmJmsoYENhbm5vdCBwYXNzICIke2xyKHIpfSIgYXMgYSAke3RoaXMubmFtZX1gKSxyLiQkLnB0cnx8ayhgQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgJHt0aGlzLm5hbWV9YCksIXRoaXMuaXNDb25zdCYmci4kJC5wdHJUeXBlLmlzQ29uc3QmJmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgbj1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO2lmKHQ9amUoci4kJC5wdHIsbix0aGlzLnJlZ2lzdGVyZWRDbGFzcyksdGhpcy5pc1NtYXJ0UG9pbnRlcilzd2l0Y2goci4kJC5zbWFydFB0cj09PXZvaWQgMCYmaygiUGFzc2luZyByYXcgcG9pbnRlciB0byBzbWFydCBwb2ludGVyIGlzIGlsbGVnYWwiKSx0aGlzLnNoYXJpbmdQb2xpY3kpe2Nhc2UgMDpyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXM/dD1yLiQkLnNtYXJ0UHRyOmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTticmVhaztjYXNlIDE6dD1yLiQkLnNtYXJ0UHRyO2JyZWFrO2Nhc2UgMjppZihyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXMpdD1yLiQkLnNtYXJ0UHRyO2Vsc2V7dmFyIGE9ci5jbG9uZSgpO3Q9dGhpcy5yYXdTaGFyZSh0LHRlLnRvSGFuZGxlKCgpPT5hLmRlbGV0ZSgpKSksZSE9PW51bGwmJmUucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IsdCl9YnJlYWs7ZGVmYXVsdDprKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlLHIpe2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLDA7ci4kJHx8ayhgQ2Fubm90IHBhc3MgIiR7bHIocil9IiBhcyBhICR7dGhpcy5uYW1lfWApLHIuJCQucHRyfHxrKGBDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAke3RoaXMubmFtZX1gKSxyLiQkLnB0clR5cGUuaXNDb25zdCYmayhgQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAke3IuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgdD1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLG49amUoci4kJC5wdHIsdCx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIG59dmFyIEVuPSgpPT57T2JqZWN0LmFzc2lnbih6ZS5wcm90b3R5cGUse2dldFBvaW50ZWUoZSl7cmV0dXJuIHRoaXMucmF3R2V0UG9pbnRlZSYmKGU9dGhpcy5yYXdHZXRQb2ludGVlKGUpKSxlfSxkZXN0cnVjdG9yKGUpe3ZhciByOyhyPXRoaXMucmF3RGVzdHJ1Y3Rvcik9PW51bGx8fHIuY2FsbCh0aGlzLGUpfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGZyb21XaXJlVHlwZTpkbn0pfTtmdW5jdGlvbiB6ZShlLHIsdCxuLGEsaSxzLGwsdSxjLGQpe3RoaXMubmFtZT1lLHRoaXMucmVnaXN0ZXJlZENsYXNzPXIsdGhpcy5pc1JlZmVyZW5jZT10LHRoaXMuaXNDb25zdD1uLHRoaXMuaXNTbWFydFBvaW50ZXI9YSx0aGlzLnBvaW50ZWVUeXBlPWksdGhpcy5zaGFyaW5nUG9saWN5PXMsdGhpcy5yYXdHZXRQb2ludGVlPWwsdGhpcy5yYXdDb25zdHJ1Y3Rvcj11LHRoaXMucmF3U2hhcmU9Yyx0aGlzLnJhd0Rlc3RydWN0b3I9ZCwhYSYmci5iYXNlQ2xhc3M9PT12b2lkIDA/bj8odGhpcy50b1dpcmVUeXBlPWduLHRoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGwpOih0aGlzLnRvV2lyZVR5cGU9d24sdGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbCk6dGhpcy50b1dpcmVUeXBlPXlufXZhciBVcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKXx8SWUoIlJlcGxhY2luZyBub25leGlzdGVudCBwdWJsaWMgc3ltYm9sIiksZltlXS5vdmVybG9hZFRhYmxlIT09dm9pZCAwJiZ0IT09dm9pZCAwP2ZbZV0ub3ZlcmxvYWRUYWJsZVt0XT1yOihmW2VdPXIsZltlXS5hcmdDb3VudD10KX0sYm49KGUscix0KT0+e2U9ZS5yZXBsYWNlKC9wL2csImkiKTt2YXIgbj1mWyJkeW5DYWxsXyIrZV07cmV0dXJuIG4ociwuLi50KX0seGU9W10sanIsenI9ZT0+e3ZhciByPXhlW2VdO3JldHVybiByfHwoZT49eGUubGVuZ3RoJiYoeGUubGVuZ3RoPWUrMSkseGVbZV09cj1qci5nZXQoZSkpLHJ9LGtuPShlLHIsdD1bXSk9PntpZihlLmluY2x1ZGVzKCJqIikpcmV0dXJuIGJuKGUscix0KTt2YXIgbj16cihyKSguLi50KTtyZXR1cm4gbn0sUG49KGUscik9PiguLi50KT0+a24oZSxyLHQpLFc9KGUscik9PntlPWooZSk7ZnVuY3Rpb24gdCgpe3JldHVybiBlLmluY2x1ZGVzKCJqIik/UG4oZSxyKTp6cihyKX12YXIgbj10KCk7cmV0dXJuIHR5cGVvZiBuIT0iZnVuY3Rpb24iJiZrKGB1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgJHtlfTogJHtyfWApLG59LEFuPShlLHIpPT57dmFyIHQ9VWUocixmdW5jdGlvbihuKXt0aGlzLm5hbWU9cix0aGlzLm1lc3NhZ2U9bjt2YXIgYT1uZXcgRXJyb3Iobikuc3RhY2s7YSE9PXZvaWQgMCYmKHRoaXMuc3RhY2s9dGhpcy50b1N0cmluZygpK2AKYCthLnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpKX0pO3JldHVybiB0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZT09PXZvaWQgMD90aGlzLm5hbWU6YCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9YH0sdH0seHIsSHI9ZT0+e3ZhciByPWV0KGUpLHQ9aihyKTtyZXR1cm4gWihyKSx0fSxmZT0oZSxyKT0+e3ZhciB0PVtdLG49e307ZnVuY3Rpb24gYShpKXtpZighbltpXSYmIXVlW2ldKXtpZihPZVtpXSl7T2VbaV0uZm9yRWFjaChhKTtyZXR1cm59dC5wdXNoKGkpLG5baV09ITB9fXRocm93IHIuZm9yRWFjaChhKSxuZXcgeHIoYCR7ZX06IGArdC5tYXAoSHIpLmpvaW4oWyIsICJdKSl9LERuPShlLHIsdCxuLGEsaSxzLGwsdSxjLGQsbSxoKT0+e2Q9aihkKSxpPVcoYSxpKSxsJiYobD1XKHMsbCkpLGMmJihjPVcodSxjKSksaD1XKG0saCk7dmFyIHA9cG4oZCk7VnIocCxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLFtuXSl9KSxOKFtlLHIsdF0sbj9bbl06W10sdz0+e3ZhciBPO3c9d1swXTt2YXIgRCxNO24/KEQ9dy5yZWdpc3RlcmVkQ2xhc3MsTT1ELmluc3RhbmNlUHJvdG90eXBlKTpNPVZlLnByb3RvdHlwZTt2YXIgRj1VZShkLGZ1bmN0aW9uKC4uLnZyKXtpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykhPT12KXRocm93IG5ldyBtZSgiVXNlICduZXcnIHRvIGNvbnN0cnVjdCAiK2QpO2lmKF8uY29uc3RydWN0b3JfYm9keT09PXZvaWQgMCl0aHJvdyBuZXcgbWUoZCsiIGhhcyBubyBhY2Nlc3NpYmxlIGNvbnN0cnVjdG9yIik7dmFyIG90PV8uY29uc3RydWN0b3JfYm9keVt2ci5sZW5ndGhdO2lmKG90PT09dm9pZCAwKXRocm93IG5ldyBtZShgVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgJHtkfSB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCR7dnIubGVuZ3RofSkgLSBleHBlY3RlZCAoJHtPYmplY3Qua2V5cyhfLmNvbnN0cnVjdG9yX2JvZHkpLnRvU3RyaW5nKCl9KSBwYXJhbWV0ZXJzIGluc3RlYWQhYCk7cmV0dXJuIG90LmFwcGx5KHRoaXMsdnIpfSksdj1PYmplY3QuY3JlYXRlKE0se2NvbnN0cnVjdG9yOnt2YWx1ZTpGfX0pO0YucHJvdG90eXBlPXY7dmFyIF89bmV3IF9uKGQsRix2LGgsRCxpLGwsYyk7Xy5iYXNlQ2xhc3MmJigoTz1fLmJhc2VDbGFzcykuX19kZXJpdmVkQ2xhc3Nlcz8/KE8uX19kZXJpdmVkQ2xhc3Nlcz1bXSksXy5iYXNlQ2xhc3MuX19kZXJpdmVkQ2xhc3Nlcy5wdXNoKF8pKTt2YXIgTD1uZXcgemUoZCxfLCEwLCExLCExKSxUPW5ldyB6ZShkKyIqIixfLCExLCExLCExKSxCPW5ldyB6ZShkKyIgY29uc3QqIixfLCExLCEwLCExKTtyZXR1cm4gTHJbZV09e3BvaW50ZXJUeXBlOlQsY29uc3RQb2ludGVyVHlwZTpCfSxVcihwLEYpLFtMLFQsQl19KX07ZnVuY3Rpb24gV3IoZSl7Zm9yKHZhciByPTE7cjxlLmxlbmd0aDsrK3IpaWYoZVtyXSE9PW51bGwmJmVbcl0uZGVzdHJ1Y3RvckZ1bmN0aW9uPT09dm9pZCAwKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uICRuKGUscil7aWYoIShlIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoYG5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAke3R5cGVvZiBlfSB3aGljaCBpcyBub3QgYSBmdW5jdGlvbmApO3ZhciB0PVVlKGUubmFtZXx8InVua25vd25GdW5jdGlvbk5hbWUiLGZ1bmN0aW9uKCl7fSk7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU7dmFyIG49bmV3IHQsYT1lLmFwcGx5KG4scik7cmV0dXJuIGEgaW5zdGFuY2VvZiBPYmplY3Q/YTpufWZ1bmN0aW9uIENuKGUscix0LG4pe2Zvcih2YXIgYT1XcihlKSxpPWUubGVuZ3RoLHM9IiIsbD0iIix1PTA7dTxpLTI7Kyt1KXMrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1LGwrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1KyJXaXJlZCI7dmFyIGM9YAogICAgICAgIHJldHVybiBmdW5jdGlvbiAoJHtzfSkgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAke2ktMn0pIHsKICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAnICsgaHVtYW5OYW1lICsgJyBjYWxsZWQgd2l0aCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLCBleHBlY3RlZCAke2ktMn0nKTsKICAgICAgICB9YDthJiYoYys9YHZhciBkZXN0cnVjdG9ycyA9IFtdOwpgKTt2YXIgZD1hPyJkZXN0cnVjdG9ycyI6Im51bGwiLG09WyJodW1hbk5hbWUiLCJ0aHJvd0JpbmRpbmdFcnJvciIsImludm9rZXIiLCJmbiIsInJ1bkRlc3RydWN0b3JzIiwicmV0VHlwZSIsImNsYXNzUGFyYW0iXTtyJiYoYys9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtWyd0b1dpcmVUeXBlJ10oIitkK2AsIHRoaXMpOwpgKTtmb3IodmFyIHU9MDt1PGktMjsrK3UpYys9InZhciBhcmciK3UrIldpcmVkID0gYXJnVHlwZSIrdSsiWyd0b1dpcmVUeXBlJ10oIitkKyIsIGFyZyIrdStgKTsKYCxtLnB1c2goImFyZ1R5cGUiK3UpO2lmKHImJihsPSJ0aGlzV2lyZWQiKyhsLmxlbmd0aD4wPyIsICI6IiIpK2wpLGMrPSh0fHxuPyJ2YXIgcnYgPSAiOiIiKSsiaW52b2tlcihmbiIrKGwubGVuZ3RoPjA/IiwgIjoiIikrbCtgKTsKYCxhKWMrPWBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7CmA7ZWxzZSBmb3IodmFyIHU9cj8xOjI7dTxlLmxlbmd0aDsrK3Upe3ZhciBoPXU9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyh1LTIpKyJXaXJlZCI7ZVt1XS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiYoYys9YCR7aH1fZHRvcigke2h9KTsKYCxtLnB1c2goYCR7aH1fZHRvcmApKX1yZXR1cm4gdCYmKGMrPWB2YXIgcmV0ID0gcmV0VHlwZVsnZnJvbVdpcmVUeXBlJ10ocnYpOwpyZXR1cm4gcmV0OwpgKSxjKz1gfQpgLFttLGNdfWZ1bmN0aW9uIEhlKGUscix0LG4sYSxpKXt2YXIgcz1yLmxlbmd0aDtzPDImJmsoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpO2Zvcih2YXIgbD1yWzFdIT09bnVsbCYmdCE9PW51bGwsdT1XcihyKSxjPXJbMF0ubmFtZSE9PSJ2b2lkIixkPVtlLGssbixhLHJyLHJbMF0sclsxXV0sbT0wO208cy0yOysrbSlkLnB1c2goclttKzJdKTtpZighdSlmb3IodmFyIG09bD8xOjI7bTxyLmxlbmd0aDsrK20pclttXS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiZkLnB1c2goclttXS5kZXN0cnVjdG9yRnVuY3Rpb24pO2xldFtoLHBdPUNuKHIsbCxjLGkpO2gucHVzaChwKTt2YXIgdz0kbihGdW5jdGlvbixoKSguLi5kKTtyZXR1cm4gVWUoZSx3KX12YXIgV2U9KGUscik9Pntmb3IodmFyIHQ9W10sbj0wO248ZTtuKyspdC5wdXNoKEFbcituKjQ+PjJdKTtyZXR1cm4gdH0saXI9ZT0+e2U9ZS50cmltKCk7Y29uc3Qgcj1lLmluZGV4T2YoIigiKTtyZXR1cm4gciE9PS0xP2Uuc3Vic3RyKDAscik6ZX0sRm49KGUscix0LG4sYSxpLHMsbCk9Pnt2YXIgdT1XZSh0LG4pO3I9aihyKSxyPWlyKHIpLGk9VyhhLGkpLE4oW10sW2VdLGM9PntjPWNbMF07dmFyIGQ9YCR7Yy5uYW1lfS4ke3J9YDtmdW5jdGlvbiBtKCl7ZmUoYENhbm5vdCBjYWxsICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLHUpfXIuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSk7dmFyIGg9Yy5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3I7cmV0dXJuIGhbcl09PT12b2lkIDA/KG0uYXJnQ291bnQ9dC0xLGhbcl09bSk6KG9yKGgscixkKSxoW3JdLm92ZXJsb2FkVGFibGVbdC0xXT1tKSxOKFtdLHUscD0+e3ZhciB3PVtwWzBdLG51bGxdLmNvbmNhdChwLnNsaWNlKDEpKSxEPUhlKGQsdyxudWxsLGkscyxsKTtpZihoW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDA/KEQuYXJnQ291bnQ9dC0xLGhbcl09RCk6aFtyXS5vdmVybG9hZFRhYmxlW3QtMV09RCxjLnJlZ2lzdGVyZWRDbGFzcy5fX2Rlcml2ZWRDbGFzc2VzKWZvcihjb25zdCBNIG9mIGMucmVnaXN0ZXJlZENsYXNzLl9fZGVyaXZlZENsYXNzZXMpTS5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShyKXx8KE0uY29uc3RydWN0b3Jbcl09RCk7cmV0dXJuW119KSxbXX0pfSxUbj0oZSxyLHQsbixhLGkpPT57dmFyIHM9V2Uocix0KTthPVcobixhKSxOKFtdLFtlXSxsPT57bD1sWzBdO3ZhciB1PWBjb25zdHJ1Y3RvciAke2wubmFtZX1gO2lmKGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9PT12b2lkIDAmJihsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5PVtdKSxsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W3ItMV0hPT12b2lkIDApdGhyb3cgbmV3IG1lKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgke3ItMX0pIGZvciBjbGFzcyAnJHtsLm5hbWV9JyEgT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBjdXJyZW50bHkgb25seSBwZXJmb3JtZWQgdXNpbmcgdGhlIHBhcmFtZXRlciBjb3VudCwgbm90IGFjdHVhbCB0eXBlIGluZm8hYCk7cmV0dXJuIGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT0oKT0+e2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7bC5uYW1lfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2Ascyl9LE4oW10scyxjPT4oYy5zcGxpY2UoMSwwLG51bGwpLGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT1IZSh1LGMsbnVsbCxhLGkpLFtdKSksW119KX0sU249KGUscix0LG4sYSxpLHMsbCx1KT0+e3ZhciBjPVdlKHQsbik7cj1qKHIpLHI9aXIociksaT1XKGEsaSksTihbXSxbZV0sZD0+e2Q9ZFswXTt2YXIgbT1gJHtkLm5hbWV9LiR7cn1gO3Iuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSksbCYmZC5yZWdpc3RlcmVkQ2xhc3MucHVyZVZpcnR1YWxGdW5jdGlvbnMucHVzaChyKTtmdW5jdGlvbiBoKCl7ZmUoYENhbm5vdCBjYWxsICR7bX0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLGMpfXZhciBwPWQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHc9cFtyXTtyZXR1cm4gdz09PXZvaWQgMHx8dy5vdmVybG9hZFRhYmxlPT09dm9pZCAwJiZ3LmNsYXNzTmFtZSE9PWQubmFtZSYmdy5hcmdDb3VudD09PXQtMj8oaC5hcmdDb3VudD10LTIsaC5jbGFzc05hbWU9ZC5uYW1lLHBbcl09aCk6KG9yKHAscixtKSxwW3JdLm92ZXJsb2FkVGFibGVbdC0yXT1oKSxOKFtdLGMsRD0+e3ZhciBNPUhlKG0sRCxkLGkscyx1KTtyZXR1cm4gcFtyXS5vdmVybG9hZFRhYmxlPT09dm9pZCAwPyhNLmFyZ0NvdW50PXQtMixwW3JdPU0pOnBbcl0ub3ZlcmxvYWRUYWJsZVt0LTJdPU0sW119KSxbXX0pfSxCcj0oZSxyLHQpPT4oZSBpbnN0YW5jZW9mIE9iamVjdHx8ayhgJHt0fSB3aXRoIGludmFsaWQgInRoaXMiOiAke2V9YCksZSBpbnN0YW5jZW9mIHIucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yfHxrKGAke3R9IGluY29tcGF0aWJsZSB3aXRoICJ0aGlzIiBvZiB0eXBlICR7ZS5jb25zdHJ1Y3Rvci5uYW1lfWApLGUuJCQucHRyfHxrKGBjYW5ub3QgY2FsbCBlbXNjcmlwdGVuIGJpbmRpbmcgbWV0aG9kICR7dH0gb24gZGVsZXRlZCBvYmplY3RgKSxqZShlLiQkLnB0cixlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLHIucmVnaXN0ZXJlZENsYXNzKSksTW49KGUscix0LG4sYSxpLHMsbCx1LGMpPT57cj1qKHIpLGE9VyhuLGEpLE4oW10sW2VdLGQ9PntkPWRbMF07dmFyIG09YCR7ZC5uYW1lfS4ke3J9YCxoPXtnZXQoKXtmZShgQ2Fubm90IGFjY2VzcyAke219IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxbdCxzXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfTtyZXR1cm4gdT9oLnNldD0oKT0+ZmUoYENhbm5vdCBhY2Nlc3MgJHttfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2AsW3Qsc10pOmguc2V0PXA9PmsobSsiIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5IiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHIsaCksTihbXSx1P1t0LHNdOlt0XSxwPT57dmFyIHc9cFswXSxEPXtnZXQoKXt2YXIgRj1Ccih0aGlzLGQsbSsiIGdldHRlciIpO3JldHVybiB3LmZyb21XaXJlVHlwZShhKGksRikpfSxlbnVtZXJhYmxlOiEwfTtpZih1KXt1PVcobCx1KTt2YXIgTT1wWzFdO0Quc2V0PWZ1bmN0aW9uKEYpe3ZhciB2PUJyKHRoaXMsZCxtKyIgc2V0dGVyIiksXz1bXTt1KGMsdixNLnRvV2lyZVR5cGUoXyxGKSkscnIoXyl9fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZC5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUscixEKSxbXX0pLFtdfSl9LHNyPVtdLHJlPVtdLE5yPWU9PntlPjkmJi0tcmVbZSsxXT09PTAmJihyZVtlXT12b2lkIDAsc3IucHVzaChlKSl9LFJuPSgpPT5yZS5sZW5ndGgvMi01LXNyLmxlbmd0aCxPbj0oKT0+e3JlLnB1c2goMCwxLHZvaWQgMCwxLG51bGwsMSwhMCwxLCExLDEpLGYuY291bnRfZW12YWxfaGFuZGxlcz1Sbn0sdGU9e3RvVmFsdWU6ZT0+KGV8fGsoIkNhbm5vdCB1c2UgZGVsZXRlZCB2YWwuIGhhbmRsZSA9ICIrZSkscmVbZV0pLHRvSGFuZGxlOmU9Pntzd2l0Y2goZSl7Y2FzZSB2b2lkIDA6cmV0dXJuIDI7Y2FzZSBudWxsOnJldHVybiA0O2Nhc2UhMDpyZXR1cm4gNjtjYXNlITE6cmV0dXJuIDg7ZGVmYXVsdDp7Y29uc3Qgcj1zci5wb3AoKXx8cmUubGVuZ3RoO3JldHVybiByZVtyXT1lLHJlW3IrMV09MSxyfX19fSxJbj17bmFtZToiZW1zY3JpcHRlbjo6dmFsIixmcm9tV2lyZVR5cGU6ZT0+e3ZhciByPXRlLnRvVmFsdWUoZSk7cmV0dXJuIE5yKGUpLHJ9LHRvV2lyZVR5cGU6KGUscik9PnRlLnRvSGFuZGxlKHIpLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9LFlyPWU9PksoZSxJbiksbHI9ZT0+e2lmKGU9PT1udWxsKXJldHVybiJudWxsIjt2YXIgcj10eXBlb2YgZTtyZXR1cm4gcj09PSJvYmplY3QifHxyPT09ImFycmF5Inx8cj09PSJmdW5jdGlvbiI/ZS50b1N0cmluZygpOiIiK2V9LExuPShlLHIpPT57c3dpdGNoKHIpe2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKGdyW3Q+PjJdKX07Y2FzZSA4OnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUoeXJbdD4+M10pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgZmxvYXQgd2lkdGggKCR7cn0pOiAke2V9YCl9fSxWbj0oZSxyLHQpPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpuPT5uLHRvV2lyZVR5cGU6KG4sYSk9PmEsYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjpMbihyLHQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9LFVuPShlLHIsdCxuLGEsaSxzKT0+e3ZhciBsPVdlKHIsdCk7ZT1qKGUpLGU9aXIoZSksYT1XKG4sYSksVnIoZSxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY2FsbCAke2V9IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxsKX0sci0xKSxOKFtdLGwsdT0+e3ZhciBjPVt1WzBdLG51bGxdLmNvbmNhdCh1LnNsaWNlKDEpKTtyZXR1cm4gVXIoZSxIZShlLGMsbnVsbCxhLGkscyksci0xKSxbXX0pfSxqbj0oZSxyLHQpPT57c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gdD9uPT5JW25dOm49Pnhbbl07Y2FzZSAyOnJldHVybiB0P249Pllbbj4+MV06bj0+Q2Vbbj4+MV07Y2FzZSA0OnJldHVybiB0P249Pmdbbj4+Ml06bj0+QVtuPj4yXTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgaW50ZWdlciB3aWR0aCAoJHtyfSk6ICR7ZX1gKX19LHpuPShlLHIsdCxuLGEpPT57cj1qKHIpO3ZhciBpPWQ9PmQ7aWYobj09PTApe3ZhciBzPTMyLTgqdDtpPWQ9PmQ8PHM+Pj5zfXZhciBsPXIuaW5jbHVkZXMoInVuc2lnbmVkIiksdT0oZCxtKT0+e30sYztsP2M9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbT4+PjB9OmM9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbX0sSyhlLHtuYW1lOnIsZnJvbVdpcmVUeXBlOmksdG9XaXJlVHlwZTpjLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6am4ocix0LG4hPT0wKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSx4bj0oZSxyLHQpPT57dmFyIG49W0ludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XSxhPW5bcl07ZnVuY3Rpb24gaShzKXt2YXIgbD1BW3M+PjJdLHU9QVtzKzQ+PjJdO3JldHVybiBuZXcgYShJLmJ1ZmZlcix1LGwpfXQ9aih0KSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6aSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOml9LHtpZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zOiEwfSl9LEhuPShlLHIpPT57WXIoZSl9LFduPShlLHIpPT57cj1qKHIpO3ZhciB0PXI9PT0ic3RkOjpzdHJpbmciO0soZSx7bmFtZTpyLGZyb21XaXJlVHlwZShuKXt2YXIgYT1BW24+PjJdLGk9bis0LHM7aWYodClmb3IodmFyIGw9aSx1PTA7dTw9YTsrK3Upe3ZhciBjPWkrdTtpZih1PT1hfHx4W2NdPT0wKXt2YXIgZD1jLWwsbT1zZShsLGQpO3M9PT12b2lkIDA/cz1tOihzKz0iXDAiLHMrPW0pLGw9YysxfX1lbHNle2Zvcih2YXIgaD1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3UpaFt1XT1TdHJpbmcuZnJvbUNoYXJDb2RlKHhbaSt1XSk7cz1oLmpvaW4oIiIpfXJldHVybiBaKG4pLHN9LHRvV2lyZVR5cGUobixhKXthIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihhPW5ldyBVaW50OEFycmF5KGEpKTt2YXIgaSxzPXR5cGVvZiBhPT0ic3RyaW5nIjtzfHxhIGluc3RhbmNlb2YgVWludDhBcnJheXx8YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5fHxhIGluc3RhbmNlb2YgSW50OEFycmF5fHxrKCJDYW5ub3QgcGFzcyBub24tc3RyaW5nIHRvIHN0ZDo6c3RyaW5nIiksdCYmcz9pPVplKGEpOmk9YS5sZW5ndGg7dmFyIGw9ZnIoNCtpKzEpLHU9bCs0O2lmKEFbbD4+Ml09aSx0JiZzKXZlKGEsdSxpKzEpO2Vsc2UgaWYocylmb3IodmFyIGM9MDtjPGk7KytjKXt2YXIgZD1hLmNoYXJDb2RlQXQoYyk7ZD4yNTUmJihaKHUpLGsoIlN0cmluZyBoYXMgVVRGLTE2IGNvZGUgdW5pdHMgdGhhdCBkbyBub3QgZml0IGluIDggYml0cyIpKSx4W3UrY109ZH1lbHNlIGZvcih2YXIgYz0wO2M8aTsrK2MpeFt1K2NdPWFbY107cmV0dXJuIG4hPT1udWxsJiZuLnB1c2goWixsKSxsfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGRlc3RydWN0b3JGdW5jdGlvbihuKXtaKG4pfX0pfSxHcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp2b2lkIDAsQm49KGUscik9Pntmb3IodmFyIHQ9ZSxuPXQ+PjEsYT1uK3IvMjshKG4+PWEpJiZDZVtuXTspKytuO2lmKHQ9bjw8MSx0LWU+MzImJkdyKXJldHVybiBHci5kZWNvZGUoeC5zdWJhcnJheShlLHQpKTtmb3IodmFyIGk9IiIscz0wOyEocz49ci8yKTsrK3Mpe3ZhciBsPVlbZStzKjI+PjFdO2lmKGw9PTApYnJlYWs7aSs9U3RyaW5nLmZyb21DaGFyQ29kZShsKX1yZXR1cm4gaX0sTm49KGUscix0KT0+e2lmKHQ/Pyh0PTIxNDc0ODM2NDcpLHQ8MilyZXR1cm4gMDt0LT0yO2Zvcih2YXIgbj1yLGE9dDxlLmxlbmd0aCoyP3QvMjplLmxlbmd0aCxpPTA7aTxhOysraSl7dmFyIHM9ZS5jaGFyQ29kZUF0KGkpO1lbcj4+MV09cyxyKz0yfXJldHVybiBZW3I+PjFdPTAsci1ufSxZbj1lPT5lLmxlbmd0aCoyLEduPShlLHIpPT57Zm9yKHZhciB0PTAsbj0iIjshKHQ+PXIvNCk7KXt2YXIgYT1nW2UrdCo0Pj4yXTtpZihhPT0wKWJyZWFrO2lmKCsrdCxhPj02NTUzNil7dmFyIGk9YS02NTUzNjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGk+PjEwLDU2MzIwfGkmMTAyMyl9ZWxzZSBuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufSxxbj0oZSxyLHQpPT57aWYodD8/KHQ9MjE0NzQ4MzY0NyksdDw0KXJldHVybiAwO2Zvcih2YXIgbj1yLGE9bit0LTQsaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYocz49NTUyOTYmJnM8PTU3MzQzKXt2YXIgbD1lLmNoYXJDb2RlQXQoKytpKTtzPTY1NTM2KygocyYxMDIzKTw8MTApfGwmMTAyM31pZihnW3I+PjJdPXMscis9NCxyKzQ+YSlicmVha31yZXR1cm4gZ1tyPj4yXT0wLHItbn0sWG49ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO24+PTU1Mjk2JiZuPD01NzM0MyYmKyt0LHIrPTR9cmV0dXJuIHJ9LEtuPShlLHIsdCk9Pnt0PWoodCk7dmFyIG4sYSxpLHM7cj09PTI/KG49Qm4sYT1ObixzPVluLGk9bD0+Q2VbbD4+MV0pOnI9PT00JiYobj1HbixhPXFuLHM9WG4saT1sPT5BW2w+PjJdKSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6bD0+e2Zvcih2YXIgdT1BW2w+PjJdLGMsZD1sKzQsbT0wO208PXU7KyttKXt2YXIgaD1sKzQrbSpyO2lmKG09PXV8fGkoaCk9PTApe3ZhciBwPWgtZCx3PW4oZCxwKTtjPT09dm9pZCAwP2M9dzooYys9IlwwIixjKz13KSxkPWgrcn19cmV0dXJuIFoobCksY30sdG9XaXJlVHlwZToobCx1KT0+e3R5cGVvZiB1IT0ic3RyaW5nIiYmayhgQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBDKysgc3RyaW5nIHR5cGUgJHt0fWApO3ZhciBjPXModSksZD1mcig0K2Mrcik7cmV0dXJuIEFbZD4+Ml09Yy9yLGEodSxkKzQsYytyKSxsIT09bnVsbCYmbC5wdXNoKFosZCksZH0sYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjp5ZSxkZXN0cnVjdG9yRnVuY3Rpb24obCl7WihsKX19KX0sSm49KGUscix0LG4sYSxpKT0+e1JlW2VdPXtuYW1lOmoocikscmF3Q29uc3RydWN0b3I6Vyh0LG4pLHJhd0Rlc3RydWN0b3I6VyhhLGkpLGZpZWxkczpbXX19LFpuPShlLHIsdCxuLGEsaSxzLGwsdSxjKT0+e1JlW2VdLmZpZWxkcy5wdXNoKHtmaWVsZE5hbWU6aihyKSxnZXR0ZXJSZXR1cm5UeXBlOnQsZ2V0dGVyOlcobixhKSxnZXR0ZXJDb250ZXh0Omksc2V0dGVyQXJndW1lbnRUeXBlOnMsc2V0dGVyOlcobCx1KSxzZXR0ZXJDb250ZXh0OmN9KX0sUW49KGUscik9PntyPWoociksSyhlLHtpc1ZvaWQ6ITAsbmFtZTpyLGFyZ1BhY2tBZHZhbmNlOjAsZnJvbVdpcmVUeXBlOigpPT57fSx0b1dpcmVUeXBlOih0LG4pPT57fX0pfSxlYT0xLHJhPSgpPT5lYSx0YT0oZSxyLHQpPT54LmNvcHlXaXRoaW4oZSxyLHIrdCksbmE9KCk9PnRlLnRvSGFuZGxlKHt9KSxhYT0oZSxyLHQpPT57ZT10ZS50b1ZhbHVlKGUpLHI9dGUudG9WYWx1ZShyKSx0PXRlLnRvVmFsdWUodCksZVtyXT10fSxvYT0oZSxyKT0+e3ZhciB0PXVlW2VdO3JldHVybiB0PT09dm9pZCAwJiZrKGAke3J9IGhhcyB1bmtub3duIHR5cGUgJHtIcihlKX1gKSx0fSxpYT0oZSxyKT0+e2U9b2EoZSwiX2VtdmFsX3Rha2VfdmFsdWUiKTt2YXIgdD1lLnJlYWRWYWx1ZUZyb21Qb2ludGVyKHIpO3JldHVybiB0ZS50b0hhbmRsZSh0KX0scXI9KGUscik9PnIrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKStyKjQyOTQ5NjcyOTY6TmFOO2Z1bmN0aW9uIHNhKGUscix0KXt2YXIgbj1xcihlLHIpLGE9bmV3IERhdGUobioxZTMpO2dbdD4+Ml09YS5nZXRVVENTZWNvbmRzKCksZ1t0KzQ+PjJdPWEuZ2V0VVRDTWludXRlcygpLGdbdCs4Pj4yXT1hLmdldFVUQ0hvdXJzKCksZ1t0KzEyPj4yXT1hLmdldFVUQ0RhdGUoKSxnW3QrMTY+PjJdPWEuZ2V0VVRDTW9udGgoKSxnW3QrMjA+PjJdPWEuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLGdbdCsyND4+Ml09YS5nZXRVVENEYXkoKTt2YXIgaT1EYXRlLlVUQyhhLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApLHM9KGEuZ2V0VGltZSgpLWkpLygxZTMqNjAqNjAqMjQpfDA7Z1t0KzI4Pj4yXT1zfXZhciBCZT1lPT5lJTQ9PT0wJiYoZSUxMDAhPT0wfHxlJTQwMD09PTApLGxhPShlLHIsdCxuKT0+e3ZhciBhPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxpPW5ldyBEYXRlKGEsMCwxKSxzPW5ldyBEYXRlKGEsNiwxKSxsPWkuZ2V0VGltZXpvbmVPZmZzZXQoKSx1PXMuZ2V0VGltZXpvbmVPZmZzZXQoKSxjPU1hdGgubWF4KGwsdSk7QVtlPj4yXT1jKjYwLGdbcj4+Ml09KyhsIT11KTt2YXIgZD1wPT5wLnRvTG9jYWxlVGltZVN0cmluZyh2b2lkIDAse2hvdXIxMjohMSx0aW1lWm9uZU5hbWU6InNob3J0In0pLnNwbGl0KCIgIilbMV0sbT1kKGkpLGg9ZChzKTt1PGw/KHZlKG0sdCwxNyksdmUoaCxuLDE3KSk6KHZlKG0sbiwxNyksdmUoaCx0LDE3KSl9LHVhPSgpPT5EYXRlLm5vdygpLFhyPSgpPT4yMTQ3NDgzNjQ4LGZhPSgpPT5YcigpLEtyO0tyPSgpPT5wZXJmb3JtYW5jZS5ub3coKTt2YXIgY2E9ZT0+e3ZhciByPSRlLmJ1ZmZlcix0PShlLXIuYnl0ZUxlbmd0aCs2NTUzNSkvNjU1MzY7dHJ5e3JldHVybiAkZS5ncm93KHQpLHdyKCksMX1jYXRjaHt9fSxkYT1lPT57dmFyIHI9eC5sZW5ndGg7ZT4+Pj0wO3ZhciB0PVhyKCk7aWYoZT50KXJldHVybiExO2Zvcih2YXIgbj0odSxjKT0+dSsoYy11JWMpJWMsYT0xO2E8PTQ7YSo9Mil7dmFyIGk9ciooMSsuMi9hKTtpPU1hdGgubWluKGksZSsxMDA2NjMyOTYpO3ZhciBzPU1hdGgubWluKHQsbihNYXRoLm1heChlLGkpLDY1NTM2KSksbD1jYShzKTtpZihsKXJldHVybiEwfXJldHVybiExfSx1cj17fSx2YT0oKT0+aHJ8fCIuL3RoaXMucHJvZ3JhbSIsUGU9KCk9PntpZighUGUuc3RyaW5ncyl7dmFyIGU9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIscj17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmUsXzp2YSgpfTtmb3IodmFyIHQgaW4gdXIpdXJbdF09PT12b2lkIDA/ZGVsZXRlIHJbdF06clt0XT11clt0XTt2YXIgbj1bXTtmb3IodmFyIHQgaW4gciluLnB1c2goYCR7dH09JHtyW3RdfWApO1BlLnN0cmluZ3M9bn1yZXR1cm4gUGUuc3RyaW5nc30saGE9KGUscik9Pntmb3IodmFyIHQ9MDt0PGUubGVuZ3RoOysrdClJW3IrK109ZS5jaGFyQ29kZUF0KHQpO0lbcl09MH0sbWE9KGUscik9Pnt2YXIgdD0wO3JldHVybiBQZSgpLmZvckVhY2goKG4sYSk9Pnt2YXIgaT1yK3Q7QVtlK2EqND4+Ml09aSxoYShuLGkpLHQrPW4ubGVuZ3RoKzF9KSwwfSxwYT0oZSxyKT0+e3ZhciB0PVBlKCk7QVtlPj4yXT10Lmxlbmd0aDt2YXIgbj0wO3JldHVybiB0LmZvckVhY2goYT0+bis9YS5sZW5ndGgrMSksQVtyPj4yXT1uLDB9O2Z1bmN0aW9uIF9hKGUpe3RyeXt2YXIgcj1QLmdldFN0cmVhbUZyb21GRChlKTtyZXR1cm4gby5jbG9zZShyKSwwfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuIHQuZXJybm99fWZ1bmN0aW9uIGdhKGUscil7dHJ5e3ZhciB0PTAsbj0wLGE9MCxpPVAuZ2V0U3RyZWFtRnJvbUZEKGUpLHM9aS50dHk/MjpvLmlzRGlyKGkubW9kZSk/MzpvLmlzTGluayhpLm1vZGUpPzc6NDtyZXR1cm4gSVtyXT1zLFlbcisyPj4xXT1hLCQ9W3Q+Pj4wLCh5PXQsK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3IrOD4+Ml09JFswXSxnW3IrMTI+PjJdPSRbMV0sJD1bbj4+PjAsKHk9biwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbcisxNj4+Ml09JFswXSxnW3IrMjA+PjJdPSRbMV0sMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgeWE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLnJlYWQoZSxJLHMsbCxuKTtpZih1PDApcmV0dXJuLTE7aWYoYSs9dSx1PGwpYnJlYWt9cmV0dXJuIGF9O2Z1bmN0aW9uIHdhKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPXlhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319ZnVuY3Rpb24gRWEoZSxyLHQsbixhKXt2YXIgaT1xcihyLHQpO3RyeXtpZihpc05hTihpKSlyZXR1cm4gNjE7dmFyIHM9UC5nZXRTdHJlYW1Gcm9tRkQoZSk7cmV0dXJuIG8ubGxzZWVrKHMsaSxuKSwkPVtzLnBvc2l0aW9uPj4+MCwoeT1zLnBvc2l0aW9uLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1thPj4yXT0kWzBdLGdbYSs0Pj4yXT0kWzFdLHMuZ2V0ZGVudHMmJmk9PT0wJiZuPT09MCYmKHMuZ2V0ZGVudHM9bnVsbCksMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgYmE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLndyaXRlKGUsSSxzLGwsbik7aWYodTwwKXJldHVybi0xO2ErPXV9cmV0dXJuIGF9O2Z1bmN0aW9uIGthKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPWJhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319dmFyIFBhPShlLHIpPT57Zm9yKHZhciB0PTAsbj0wO248PXI7dCs9ZVtuKytdKTtyZXR1cm4gdH0sSnI9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxacj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLEFhPShlLHIpPT57Zm9yKHZhciB0PW5ldyBEYXRlKGUuZ2V0VGltZSgpKTtyPjA7KXt2YXIgbj1CZSh0LmdldEZ1bGxZZWFyKCkpLGE9dC5nZXRNb250aCgpLGk9KG4/SnI6WnIpW2FdO2lmKHI+aS10LmdldERhdGUoKSlyLT1pLXQuZ2V0RGF0ZSgpKzEsdC5zZXREYXRlKDEpLGE8MTE/dC5zZXRNb250aChhKzEpOih0LnNldE1vbnRoKDApLHQuc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpKzEpKTtlbHNlIHJldHVybiB0LnNldERhdGUodC5nZXREYXRlKCkrciksdH1yZXR1cm4gdH0sRGE9KGUscik9PntJLnNldChlLHIpfSxRcj0oZSxyLHQsbik9Pnt2YXIgYT1BW24rNDA+PjJdLGk9e3RtX3NlYzpnW24+PjJdLHRtX21pbjpnW24rND4+Ml0sdG1faG91cjpnW24rOD4+Ml0sdG1fbWRheTpnW24rMTI+PjJdLHRtX21vbjpnW24rMTY+PjJdLHRtX3llYXI6Z1tuKzIwPj4yXSx0bV93ZGF5OmdbbisyND4+Ml0sdG1feWRheTpnW24rMjg+PjJdLHRtX2lzZHN0OmdbbiszMj4+Ml0sdG1fZ210b2ZmOmdbbiszNj4+Ml0sdG1fem9uZTphP3NlKGEpOiIifSxzPXNlKHQpLGw9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9O2Zvcih2YXIgdSBpbiBsKXM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLGxbdV0pO3ZhciBjPVsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXTtmdW5jdGlvbiBtKHYsXyxMKXtmb3IodmFyIFQ9dHlwZW9mIHY9PSJudW1iZXIiP3YudG9TdHJpbmcoKTp2fHwiIjtULmxlbmd0aDxfOylUPUxbMF0rVDtyZXR1cm4gVH1mdW5jdGlvbiBoKHYsXyl7cmV0dXJuIG0odixfLCIwIil9ZnVuY3Rpb24gcCh2LF8pe2Z1bmN0aW9uIEwoQil7cmV0dXJuIEI8MD8tMTpCPjA/MTowfXZhciBUO3JldHVybihUPUwodi5nZXRGdWxsWWVhcigpLV8uZ2V0RnVsbFllYXIoKSkpPT09MCYmKFQ9TCh2LmdldE1vbnRoKCktXy5nZXRNb250aCgpKSk9PT0wJiYoVD1MKHYuZ2V0RGF0ZSgpLV8uZ2V0RGF0ZSgpKSksVH1mdW5jdGlvbiB3KHYpe3N3aXRjaCh2LmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIHY7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUodi5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIEQodil7dmFyIF89QWEobmV3IERhdGUodi50bV95ZWFyKzE5MDAsMCwxKSx2LnRtX3lkYXkpLEw9bmV3IERhdGUoXy5nZXRGdWxsWWVhcigpLDAsNCksVD1uZXcgRGF0ZShfLmdldEZ1bGxZZWFyKCkrMSwwLDQpLEI9dyhMKSxPPXcoVCk7cmV0dXJuIHAoQixfKTw9MD9wKE8sXyk8PTA/Xy5nZXRGdWxsWWVhcigpKzE6Xy5nZXRGdWxsWWVhcigpOl8uZ2V0RnVsbFllYXIoKS0xfXZhciBNPXsiJWEiOnY9PmNbdi50bV93ZGF5XS5zdWJzdHJpbmcoMCwzKSwiJUEiOnY9PmNbdi50bV93ZGF5XSwiJWIiOnY9PmRbdi50bV9tb25dLnN1YnN0cmluZygwLDMpLCIlQiI6dj0+ZFt2LnRtX21vbl0sIiVDIjp2PT57dmFyIF89di50bV95ZWFyKzE5MDA7cmV0dXJuIGgoXy8xMDB8MCwyKX0sIiVkIjp2PT5oKHYudG1fbWRheSwyKSwiJWUiOnY9Pm0odi50bV9tZGF5LDIsIiAiKSwiJWciOnY9PkQodikudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjpELCIlSCI6dj0+aCh2LnRtX2hvdXIsMiksIiVJIjp2PT57dmFyIF89di50bV9ob3VyO3JldHVybiBfPT0wP189MTI6Xz4xMiYmKF8tPTEyKSxoKF8sMil9LCIlaiI6dj0+aCh2LnRtX21kYXkrUGEoQmUodi50bV95ZWFyKzE5MDApP0pyOlpyLHYudG1fbW9uLTEpLDMpLCIlbSI6dj0+aCh2LnRtX21vbisxLDIpLCIlTSI6dj0+aCh2LnRtX21pbiwyKSwiJW4iOigpPT5gCmAsIiVwIjp2PT52LnRtX2hvdXI+PTAmJnYudG1faG91cjwxMj8iQU0iOiJQTSIsIiVTIjp2PT5oKHYudG1fc2VjLDIpLCIldCI6KCk9PiIJIiwiJXUiOnY9PnYudG1fd2RheXx8NywiJVUiOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy12LnRtX3dkYXk7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJVYiOnY9Pnt2YXIgXz1NYXRoLmZsb29yKCh2LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTcpLzcpO2lmKCh2LnRtX3dkYXkrMzcxLXYudG1feWRheS0yKSU3PD0yJiZfKyssXyl7aWYoXz09NTMpe3ZhciBUPSh2LnRtX3dkYXkrMzcxLXYudG1feWRheSklNztUIT00JiYoVCE9M3x8IUJlKHYudG1feWVhcikpJiYoXz0xKX19ZWxzZXtfPTUyO3ZhciBMPSh2LnRtX3dkYXkrNy12LnRtX3lkYXktMSklNzsoTD09NHx8TD09NSYmQmUodi50bV95ZWFyJTQwMC0xKSkmJl8rK31yZXR1cm4gaChfLDIpfSwiJXciOnY9PnYudG1fd2RheSwiJVciOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTc7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJXkiOnY9Pih2LnRtX3llYXIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjp2PT52LnRtX3llYXIrMTkwMCwiJXoiOnY9Pnt2YXIgXz12LnRtX2dtdG9mZixMPV8+PTA7cmV0dXJuIF89TWF0aC5hYnMoXykvNjAsXz1fLzYwKjEwMCtfJTYwLChMPyIrIjoiLSIpKygiMDAwMCIrXykuc2xpY2UoLTQpfSwiJVoiOnY9PnYudG1fem9uZSwiJSUiOigpPT4iJSJ9O3M9cy5yZXBsYWNlKC8lJS9nLCJcMFwwIik7Zm9yKHZhciB1IGluIE0pcy5pbmNsdWRlcyh1KSYmKHM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLE1bdV0oaSkpKTtzPXMucmVwbGFjZSgvXDBcMC9nLCIlIik7dmFyIEY9U2UocywhMSk7cmV0dXJuIEYubGVuZ3RoPnI/MDooRGEoRixlKSxGLmxlbmd0aC0xKX0sJGE9KGUscix0LG4sYSk9PlFyKGUscix0LG4pO28uY3JlYXRlUHJlbG9hZGVkRmlsZT1WdCxvLnN0YXRpY0luaXQoKSxTcj1mLkludGVybmFsRXJyb3I9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihyKXtzdXBlcihyKSx0aGlzLm5hbWU9IkludGVybmFsRXJyb3IifX0sZW4oKSxtZT1mLkJpbmRpbmdFcnJvcj1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIpLHRoaXMubmFtZT0iQmluZGluZ0Vycm9yIn19LHZuKCksdW4oKSxFbigpLHhyPWYuVW5ib3VuZFR5cGVFcnJvcj1BbihFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpLE9uKCk7dmFyIENhPXtsOkN0LGM6VHQsVTpqdCxzOnp0LFI6eHQsSjpIdCxXOld0LE86QnQsUDpOdCxLOll0LEk6R3QsSDpxdCxROlh0LEU6S3QsVjpKdCxrOlp0LEI6UXQsWjp0bixoOkRuLHk6Rm4sajpUbixiOlNuLGE6TW4sWTpZcix3OlZuLGk6VW4sZjp6bixkOnhuLG06SG4sdjpXbix0OktuLG46Sm4sZTpabixfOlFuLFM6cmEsVDp0YSx4Ok5yLGFhOm5hLCQ6YWEsZzppYSx6OnNhLEY6bGEscDp1YSxHOmZhLG86S3IsRDpkYSxNOm1hLE46cGEscjpfYSxMOmdhLHU6d2EsQTpFYSxxOmthLFg6UXIsQzokYX0sej0kdCgpLGZyPWU9Pihmcj16LmRhKShlKSxldD1lPT4oZXQ9ei5mYSkoZSksWj1lPT4oWj16LmdhKShlKSxydD1lPT4ocnQ9ei5pYSkoZSk7Zi5keW5DYWxsX2ppamk9KGUscix0LG4sYSk9PihmLmR5bkNhbGxfamlqaT16LmphKShlLHIsdCxuLGEpLGYuZHluQ2FsbF9paWlqaT0oZSxyLHQsbixhLGkpPT4oZi5keW5DYWxsX2lpaWppPXoua2EpKGUscix0LG4sYSxpKSxmLmR5bkNhbGxfamlpaWo9KGUscix0LG4sYSxpKT0+KGYuZHluQ2FsbF9qaWlpaj16LmxhKShlLHIsdCxuLGEsaSksZi5keW5DYWxsX2lpaWlpaj0oZSxyLHQsbixhLGkscyk9PihmLmR5bkNhbGxfaWlpaWlqPXoubWEpKGUscix0LG4sYSxpLHMpLGYuZHluQ2FsbF92aWlqaWk9KGUscix0LG4sYSxpLHMpPT4oZi5keW5DYWxsX3ZpaWppaT16Lm5hKShlLHIsdCxuLGEsaSxzKSxmLmR5bkNhbGxfaWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUpPT4oZi5keW5DYWxsX2lpaWlpamo9ei5vYSkoZSxyLHQsbixhLGkscyxsLHUpLGYuZHluQ2FsbF9paWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUsYyk9PihmLmR5bkNhbGxfaWlpaWlpamo9ei5wYSkoZSxyLHQsbixhLGkscyxsLHUsYyksZi5fZmZfaDI2NF9jYWJhY190YWJsZXM9MjA2ODEyO3ZhciBOZTtnZT1mdW5jdGlvbiBlKCl7TmV8fHR0KCksTmV8fChnZT1lKX07ZnVuY3Rpb24gdHQoKXtpZihvZT4wfHwocHQoKSxvZT4wKSlyZXR1cm47ZnVuY3Rpb24gZSgpe05lfHwoTmU9ITAsZi5jYWxsZWRSdW49ITAsIXByJiYoX3QoKSxVKGYpLGYub25SdW50aW1lSW5pdGlhbGl6ZWQmJmYub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxndCgpKSl9Zi5zZXRTdGF0dXM/KGYuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnNldFN0YXR1cygiIil9LDEpLGUoKX0sMSkpOmUoKX1pZihmLnByZUluaXQpZm9yKHR5cGVvZiBmLnByZUluaXQ9PSJmdW5jdGlvbiImJihmLnByZUluaXQ9W2YucHJlSW5pdF0pO2YucHJlSW5pdC5sZW5ndGg+MDspZi5wcmVJbml0LnBvcCgpKCk7dHQoKTtsZXQgbnQ9MzI7ZnVuY3Rpb24gYXQoZSxyPTMsdD01MDApe2xldCBuPTA7Zm9yKDtuPHI7KXRyeXtyZXR1cm4gZSgpfWNhdGNoKGEpe2lmKG50Pj0yNCYmY29uc29sZS53YXJuKGBBdHRlbXB0ICR7bisxfSBmYWlsZWQ6ICR7YS5tZXNzYWdlfWApLG4rKyxuPj1yKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIGFmdGVyICR7cn0gYXR0ZW1wdHNgKX19ZnVuY3Rpb24gRmEoZSl7Y29uc3Qgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoci5vcGVuKCJIRUFEIixlLCExKSxyLnNlbmQoKSxyLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGdldEZpbGVTaXplIHJlcXVlc3QgZmFpbGVkOiAke2V9YCk7cmV0dXJuIHBhcnNlSW50KHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpfWZ1bmN0aW9uIFRhKGUscix0KXtjb25zdCBuPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihuLm9wZW4oIkdFVCIsZSwhMSksbi5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsYGJ5dGVzPSR7cn0tJHtyK3QtMX1gKSxuLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLG4uc2VuZCgpLG4uc3RhdHVzIT09MjA2JiZuLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGZldGNoQXJyYXlCdWZmZXIgcmVxdWVzdCBmYWlsZWQ6ICR7ZX1gKTtyZXR1cm4gbi5yZXNwb25zZX1jbGFzcyBwZXtjb25zdHJ1Y3RvcihyKXtsZXQgdDt0eXBlb2Ygcj09InN0cmluZyI/KHQ9bmV3IEZpbGUoW10sZW5jb2RlVVJJQ29tcG9uZW50KHIpKSxvLmZpbGVzeXN0ZW1zLldPUktFUkZTLnN0cmVhbV9vcHMucmVhZD1mdW5jdGlvbihhLGkscyxsLHUpe2NvbnN0IGM9ZGVjb2RlVVJJQ29tcG9uZW50KGEubm9kZS5jb250ZW50cy5uYW1lKTtpZihhLm5vZGUuc2l6ZT09PTAmJihhLm5vZGUuc2l6ZT1hdCgoKT0+RmEoYykpKSx1Pj1hLm5vZGUuc2l6ZSlyZXR1cm4gMDtjb25zdCBkPWF0KCgpPT5UYShjLHUsbCkpLG09ZC5ieXRlTGVuZ3RoO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShkKSxzKSxtfSk6dD1yLHRoaXMubW91bnRQb2ludD0iL2RhdGEiLHRoaXMubW91bnRPcHRzPXtmaWxlczpbdF19LHRoaXMuZmlsZVBhdGg9dGhpcy5tb3VudFBvaW50KyIvIit0Lm5hbWV9bW91bnQoKXtvLm1rZGlyKHRoaXMubW91bnRQb2ludCksby5tb3VudChvLmZpbGVzeXN0ZW1zLldPUktFUkZTLHRoaXMubW91bnRPcHRzLHRoaXMubW91bnRQb2ludCl9dW5tb3VudCgpe28udW5tb3VudCh0aGlzLm1vdW50UG9pbnQpLG8ucm1kaXIodGhpcy5tb3VudFBvaW50KX19ZnVuY3Rpb24gY3IoZSl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlLmV4dHJhZGF0YSksdD17aWQ6ZS5pZCxpbmRleDplLmluZGV4LGNvZGVjX3R5cGU6ZS5jb2RlY190eXBlLGNvZGVjX3R5cGVfc3RyaW5nOmUuY29kZWNfdHlwZV9zdHJpbmcsY29kZWNfbmFtZTplLmNvZGVjX25hbWUsY29kZWNfc3RyaW5nOmUuY29kZWNfc3RyaW5nLGNvbG9yX3ByaW1hcmllczplLmNvbG9yX3ByaW1hcmllcyxjb2xvcl90cmFuc2ZlcjplLmNvbG9yX3RyYW5zZmVyLGNvbG9yX3NwYWNlOmUuY29sb3Jfc3BhY2UsY29sb3JfcmFuZ2U6ZS5jb2xvcl9yYW5nZSxwcm9maWxlOmUucHJvZmlsZSxwaXhfZm10OmUucGl4X2ZtdCxsZXZlbDplLmxldmVsLHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGNoYW5uZWxzOmUuY2hhbm5lbHMsc2FtcGxlX3JhdGU6ZS5zYW1wbGVfcmF0ZSxzYW1wbGVfZm10OmUuc2FtcGxlX2ZtdCxiaXRfcmF0ZTplLmJpdF9yYXRlLGV4dHJhZGF0YV9zaXplOmUuZXh0cmFkYXRhX3NpemUsZXh0cmFkYXRhOnIscl9mcmFtZV9yYXRlOmUucl9mcmFtZV9yYXRlLGF2Z19mcmFtZV9yYXRlOmUuYXZnX2ZyYW1lX3JhdGUsc2FtcGxlX2FzcGVjdF9yYXRpbzplLnNhbXBsZV9hc3BlY3RfcmF0aW8sZGlzcGxheV9hc3BlY3RfcmF0aW86ZS5kaXNwbGF5X2FzcGVjdF9yYXRpbyxzdGFydF90aW1lOmUuc3RhcnRfdGltZSxkdXJhdGlvbjplLmR1cmF0aW9uLHJvdGF0aW9uOmUucm90YXRpb24sZmxpcDplLmZsaXAsbmJfZnJhbWVzOmUubmJfZnJhbWVzLHRhZ3M6ZS50YWdzfTtyZXR1cm4gZS5kZWxldGUoKSx0fWZ1bmN0aW9uIGRyKGUpe2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhKSx0PXtrZXlmcmFtZTplLmtleWZyYW1lLHRpbWVzdGFtcDplLnRpbWVzdGFtcCxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLGRhdGE6cn07cmV0dXJuIGUuZGVsZXRlKCksdH1mdW5jdGlvbiBTYShlLHI9MCx0PS0xKXtjb25zdCBuPW5ldyBwZShlKTtuLm1vdW50KCk7dHJ5e2NvbnN0IGE9Zi5nZXRfYXZfc3RyZWFtKG4uZmlsZVBhdGgscix0KTtyZXR1cm4gY3IoYSl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfc3RyZWFtIGZhaWxlZDogIithLm1lc3NhZ2UpfWZpbmFsbHl7bi51bm1vdW50KCl9fWZ1bmN0aW9uIE1hKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9hdl9zdHJlYW1zKHIuZmlsZVBhdGgpLG49W107Zm9yKGxldCBhPTA7YTx0LnN0cmVhbXMuc2l6ZSgpO2ErKyluLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9hdl9zdHJlYW1zIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIFJhKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9tZWRpYV9pbmZvKHIuZmlsZVBhdGgpLG49e2Zvcm1hdF9uYW1lOnQuZm9ybWF0X25hbWUsZHVyYXRpb246dC5kdXJhdGlvbixiaXRfcmF0ZTp0LmJpdF9yYXRlLHN0YXJ0X3RpbWU6dC5zdGFydF90aW1lLG5iX3N0cmVhbXM6dC5uYl9zdHJlYW1zLHN0cmVhbXM6W119O2ZvcihsZXQgYT0wO2E8dC5zdHJlYW1zLnNpemUoKTthKyspbi5zdHJlYW1zLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9tZWRpYV9pbmZvIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIE9hKGUscix0PTAsbj0tMSxhPTEpe2NvbnN0IGk9bmV3IHBlKGUpO2kubW91bnQoKTt0cnl7Y29uc3Qgcz1mLmdldF9hdl9wYWNrZXQoaS5maWxlUGF0aCxyLHQsbixhKTtyZXR1cm4gZHIocyl9Y2F0Y2gocyl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0IGZhaWxlZDogIitzLm1lc3NhZ2UpfWZpbmFsbHl7aS51bm1vdW50KCl9fWZ1bmN0aW9uIElhKGUscix0PTEpe2NvbnN0IG49bmV3IHBlKGUpO24ubW91bnQoKTt0cnl7Y29uc3QgYT1mLmdldF9hdl9wYWNrZXRzKG4uZmlsZVBhdGgscix0KSxpPVtdO2ZvcihsZXQgcz0wO3M8YS5wYWNrZXRzLnNpemUoKTtzKyspaS5wdXNoKGRyKGEucGFja2V0cy5nZXQocykpKTtyZXR1cm4gYS5wYWNrZXRzLmRlbGV0ZSgpLGl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0cyBmYWlsZWQ6ICIrYS5tZXNzYWdlKX1maW5hbGx5e24udW5tb3VudCgpfX1hc3luYyBmdW5jdGlvbiBMYShlLHIsdD0wLG49MCxhPTAsaT0tMSxzPTEpe2NvbnN0IGw9bmV3IHBlKHIpO2wubW91bnQoKTtsZXQgdT1udWxsO3RyeXtpZih1PWYuQVZQYWNrZXRSZWFkZXIuY3JlYXRlKGwuZmlsZVBhdGgsdCxuLGEsaSxzKSwhdSl0aHJvdyBuZXcgRXJyb3IoIkFWUGFja2V0UmVhZGVyLmNyZWF0ZSBmYWlsZWQgKG51bGwgcmVhZGVyKSIpO2NvbnN0IGM9VmEoZSk7Zm9yKDs7KXtjb25zdCBkPXUucmVhZF9uZXh0X2F2X3BhY2tldCgpO2lmKHUuaGFzX2Vycm9yKCkpdGhyb3cgbmV3IEVycm9yKCJBVlBhY2tldFJlYWRlciByZWFkX25leHRfYXZfcGFja2V0IGVycm9yIik7aWYodS5pc19maW5pc2hlZCgpKXthd2FpdCBjKDApO2JyZWFrfWlmKGF3YWl0IGMoZCk9PT0wKWJyZWFrfX1jYXRjaChjKXt0aHJvdyBuZXcgRXJyb3IoInJlYWRBVlBhY2tldCBwaXBlbGluZSBmYWlsZWQ6ICIrYy5tZXNzYWdlKX1maW5hbGx5e3UmJnUuZGVsZXRlKCksbC51bm1vdW50KCl9cmV0dXJuIDF9ZnVuY3Rpb24gVmEoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZShuPT57Y29uc3QgYT17dHlwZToiQVZQYWNrZXRTdHJlYW0iLG1zZ0lkOmUscmVzdWx0Om51bGx9O2lmKHQ9PT0wKXtzZWxmLnBvc3RNZXNzYWdlKGEpLG4oMSk7cmV0dXJufWNvbnN0IGk9ZHIodCk7YS5yZXN1bHQ9aSxzZWxmLnBvc3RNZXNzYWdlKGEsW2kuZGF0YS5idWZmZXJdKTtjb25zdCBzPWw9Pntjb25zdHt0eXBlOnUsbXNnSWQ6Y309bC5kYXRhO2M9PT1lJiYodT09PSJSZWFkTmV4dEFWUGFja2V0Ij8oc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDEpKTp1PT09IlN0b3BSZWFkQVZQYWNrZXQiJiYoc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDApKSl9O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KX19ZnVuY3Rpb24gVWEoZSl7bnQ9ZSxmLnNldF9hdl9sb2dfbGV2ZWwoZSl9cmV0dXJuIGYuZ2V0QVZTdHJlYW09U2EsZi5nZXRBVlN0cmVhbXM9TWEsZi5nZXRNZWRpYUluZm89UmEsZi5nZXRBVlBhY2tldD1PYSxmLmdldEFWUGFja2V0cz1JYSxmLnJlYWRBVlBhY2tldD1MYSxmLnNldEFWTG9nTGV2ZWw9VWEsQz1uZSxDfX0pKCk7bGV0IFE7c2VsZi5wb3N0TWVzc2FnZSh7dHlwZTpHLldhc21Xb3JrZXJMb2FkZWR9KSxzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGFzeW5jIGZ1bmN0aW9uKEUpe2NvbnN0e3R5cGU6UixkYXRhOkMsbXNnSWQ6Zn09RS5kYXRhO3RyeXtzd2l0Y2goUil7Y2FzZSJMb2FkV0FTTSI6cmV0dXJuIGF3YWl0IHN0KEMpO2Nhc2UiR2V0QVZTdHJlYW0iOnJldHVybiBsdChDLGYpO2Nhc2UiR2V0QVZTdHJlYW1zIjpyZXR1cm4gdXQoQyxmKTtjYXNlIkdldE1lZGlhSW5mbyI6cmV0dXJuIGZ0KEMsZik7Y2FzZSJHZXRBVlBhY2tldCI6cmV0dXJuIGN0KEMsZik7Y2FzZSJHZXRBVlBhY2tldHMiOnJldHVybiBkdChDLGYpO2Nhc2UiUmVhZEFWUGFja2V0IjpyZXR1cm4gYXdhaXQgdnQoQyxmKTtjYXNlIlNldEFWTG9nTGV2ZWwiOnJldHVybiBodChDLGYpO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChVKXtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOlIsbXNnSWQ6ZixlcnJNc2c6VSBpbnN0YW5jZW9mIEVycm9yP1UubWVzc2FnZToiVW5rbm93biBFcnJvciJ9KX19KTthc3luYyBmdW5jdGlvbiBzdChFKXtjb25zdHt3YXNtRmlsZVBhdGg6Un09RXx8e307UT1hd2FpdCBpdCh7bG9jYXRlRmlsZTooQyxmKT0+Qy5lbmRzV2l0aCgiLndhc20iKSYmUj9SOmYrQyxvblJ1bnRpbWVJbml0aWFsaXplZDooKT0+e3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5XQVNNUnVudGltZUluaXRpYWxpemVkfSl9fSl9ZnVuY3Rpb24gbHQoRSxSKXtjb25zdHtzb3VyY2U6QyxzdHJlYW1UeXBlOmYsc3RyZWFtSW5kZXg6VX09RSxIPVEuZ2V0QVZTdHJlYW0oQyxmLFUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbSxtc2dJZDpSLHJlc3VsdDpIfSxbSC5leHRyYWRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gdXQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0QVZTdHJlYW1zKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbXMsbXNnSWQ6UixyZXN1bHQ6Zn0sZi5tYXAoVT0+VS5leHRyYWRhdGEuYnVmZmVyKSl9ZnVuY3Rpb24gZnQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0TWVkaWFJbmZvKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRNZWRpYUluZm8sbXNnSWQ6UixyZXN1bHQ6Zn0sZi5zdHJlYW1zLm1hcChVPT5VLmV4dHJhZGF0YS5idWZmZXIpKX1mdW5jdGlvbiBjdChFLFIpe2NvbnN0e3NvdXJjZTpDLHRpbWU6ZixzdHJlYW1UeXBlOlUsc3RyZWFtSW5kZXg6SCxzZWVrRmxhZzpuZX09RSxhZT1RLmdldEFWUGFja2V0KEMsZixVLEgsbmUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlBhY2tldCxtc2dJZDpSLHJlc3VsdDphZX0sW2FlLmRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gZHQoRSxSKXtjb25zdHtzb3VyY2U6Qyx0aW1lOmYsc2Vla0ZsYWc6VX09RSxIPVEuZ2V0QVZQYWNrZXRzKEMsZixVKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuR2V0QVZQYWNrZXRzLG1zZ0lkOlIscmVzdWx0Okh9LEgubWFwKG5lPT5uZS5kYXRhLmJ1ZmZlcikpfWFzeW5jIGZ1bmN0aW9uIHZ0KEUsUil7Y29uc3R7c291cmNlOkMsc3RhcnQ6ZixlbmQ6VSxzdHJlYW1UeXBlOkgsc3RyZWFtSW5kZXg6bmUsc2Vla0ZsYWc6YWV9PUUsRGU9YXdhaXQgUS5yZWFkQVZQYWNrZXQoUixDLGYsVSxILG5lLGFlKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuUmVhZEFWUGFja2V0LG1zZ0lkOlIscmVzdWx0OkRlfSl9ZnVuY3Rpb24gaHQoRSxSKXtjb25zdHtsZXZlbDpDfT1FO1Euc2V0QVZMb2dMZXZlbChDKSxzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJTZXRBVkxvZ0xldmVsIixtc2dJZDpSfSl9fSkoKTsK",Wa=t=>Uint8Array.from(atob(t),e=>e.charCodeAt(0)),Ks=typeof window<"u"&&window.Blob&&new Blob([Wa(bn)],{type:"text/javascript;charset=utf-8"});function La(t){let e;try{if(e=Ks&&(window.URL||window.webkitURL).createObjectURL(Ks),!e)throw"";const i=new Worker(e,{name:t==null?void 0:t.name});return i.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(e)}),i}catch{return new Worker("data:text/javascript;base64,"+bn,{name:t==null?void 0:t.name})}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const Ms=1e6;class fi{constructor(e){oi(this,"wasmWorker"),oi(this,"wasmWorkerLoadStatus"),oi(this,"msgId"),oi(this,"source"),this.wasmWorker=new La({name:"web-demuxer"}),this.wasmWorkerLoadStatus=new Promise((i,n)=>{this.wasmWorker.addEventListener("message",c=>{const{type:o,errMsg:m}=c.data;o===rt.WasmWorkerLoaded&&this.post(rt.LoadWASM,{wasmFilePath:e==null?void 0:e.wasmFilePath}),o===rt.WASMRuntimeInitialized&&i(),o===rt.LoadWASM&&m&&n(m)})}),this.msgId=0}post(e,i,n){this.wasmWorker.postMessage({type:e,msgId:n??this.msgId++,data:i})}getFromWorker(e,i){return new Promise((n,c)=>{if(!this.source){c("source is not loaded. call load() first");return}const o=this.msgId,m=h=>{let{data:S}=h;S.type===e&&S.msgId===o&&(S.errMsg?c(S.errMsg):n(S.result),this.wasmWorker.removeEventListener("message",m))};this.wasmWorker.addEventListener("message",m),this.post(e,i,o)})}async load(e){await this.wasmWorkerLoadStatus,this.source=e}destroy(){this.source=void 0,this.wasmWorker.terminate()}getMediaInfo(){return this.getFromWorker(rt.GetMediaInfo,{source:this.source})}getAVStream(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:I0.AVMEDIA_TYPE_VIDEO,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1;return this.getFromWorker(rt.GetAVStream,{source:this.source,streamType:e,streamIndex:i})}getAVStreams(){return this.getFromWorker(rt.GetAVStreams,{source:this.source})}getAVPacket(e){let i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:I0.AVMEDIA_TYPE_VIDEO,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:-1,c=arguments.length>3&&arguments[3]!==void 0?arguments[3]:di.AVSEEK_FLAG_BACKWARD;return this.getFromWorker(rt.GetAVPacket,{source:this.source,time:e,streamType:i,streamIndex:n,seekFlag:c})}getAVPackets(e){let i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:di.AVSEEK_FLAG_BACKWARD;return this.getFromWorker(rt.GetAVPackets,{source:this.source,time:e,seekFlag:i})}readAVPacket(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:I0.AVMEDIA_TYPE_VIDEO,c=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,o=arguments.length>4&&arguments[4]!==void 0?arguments[4]:di.AVSEEK_FLAG_BACKWARD;const m=new CountQueuingStrategy({highWaterMark:1}),h=this.msgId;let S=0,T,G;return new ReadableStream({start:f=>{if(!this.source){f.error("source is not loaded. call load() first");return}T=A=>{const w=A.data;w.type===rt.ReadAVPacket&&w.msgId===h&&w.errMsg&&(f.error(w.errMsg),this.wasmWorker.removeEventListener("message",T)),w.type===rt.AVPacketStream&&w.msgId===h&&(w.result&&!G?f.enqueue(w.result):(this.wasmWorker.removeEventListener("message",T),G?G():f.close()))},this.wasmWorker.addEventListener("message",T),this.post(rt.ReadAVPacket,{source:this.source,start:e,end:i,streamType:n,streamIndex:c,seekFlag:o})},pull:()=>{S>0&&this.post(rt.ReadNextAVPacket,void 0,h),S++},cancel:()=>new Promise(f=>{G=f,this.post(rt.StopReadAVPacket,void 0,h)})},m)}setLogLevel(e){return this.getFromWorker(rt.SetAVLogLevel,{level:e})}getMediaStream(e,i){return this.getAVStream(Ci[e],i)}seekMediaPacket(e,i,n){return this.getAVPacket(i,Ci[e],void 0,n)}readMediaPacket(e,i,n,c){return this.readAVPacket(i,n,Ci[e],void 0,c)}genDecoderConfig(e,i){var n,c;return e===ws.VIDEO?{codec:i.codec_string,codedWidth:i.width,codedHeight:i.height,description:((n=i.extradata)==null?void 0:n.length)>0?i.extradata:void 0,rotation:i.rotation,flip:i.flip}:{codec:i.codec_string||"",sampleRate:i.sample_rate,numberOfChannels:i.channels,description:((c=i.extradata)==null?void 0:c.length)>0?i.extradata:void 0}}genEncodedChunk(e,i){const n={type:i.keyframe===1?"key":"delta",timestamp:i.timestamp*Ms,duration:i.duration*Ms,data:i.data};return e===ws.VIDEO?new EncodedVideoChunk(n):new EncodedAudioChunk(n)}getDecoderConfig(e){return this.getMediaStream(e).then(i=>this.genDecoderConfig(e,i))}seek(e,i,n){return this.seekMediaPacket(e,i,n).then(c=>this.genEncodedChunk(e,c))}read(e,i,n,c){return this.readMediaPacket(e,i,n,c).pipeThrough(new TransformStream({transform:(o,m)=>{const h=this.genEncodedChunk(e,o);m.enqueue(h)}}))}}let ks=!1;function Zi(){ks||(console.warn("⚠️ Demo/Learning Function: This utility is intended for demos and learning purposes only. For production use, please use a proper demuxing library like MediaBunny (https://mediabunny.dev/) or web-demuxer (https://github.com/bilibili/web-demuxer) directly."),ks=!0)}async function xa(t){Zi();const e=new fi({wasmFilePath:"https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"});await e.load(t);const i=e.read("video",0).getReader(),n=[];return new Promise(function(c){i.read().then(async function o(m){const{done:h,value:S}=m;return S&&n.push(S),h?c(n):i.read().then(o)})})}async function Ha(t){Zi();const e=new fi({wasmFilePath:"https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"});await e.load(t);const i=e.read("audio",0).getReader(),n=[];await new Promise(function(h){i.read().then(async function S(T){const{done:G,value:f}=T;return f&&n.push(f),G?h(n):i.read().then(S)})});const o=(await e.getMediaInfo()).streams.filter(h=>h.codec_type_string==="audio")[0],m={codec:o.codec_string,sampleRate:o.sample_rate,numberOfChannels:o.channels};return{chunks:n,config:m}}async function Ya(t){Zi();const e=new fi({wasmFilePath:"https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"});await e.load(t);const i=e.read("video",0).getReader(),n=[];await new Promise(function(h){i.read().then(async function S(T){const{done:G,value:f}=T;return f&&n.push(f),G?h(n):i.read().then(S)})});const o=(await e.getMediaInfo()).streams.filter(h=>h.codec_type_string==="video")[0],m={codec:o.codec_string,codedWidth:o.width,codedHeight:o.height,description:o.extradata};return{chunks:n,config:m}}async function wa(t){Zi();const e=new fi({wasmFilePath:"https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"});await e.load(t);const i=e.read("audio",0).getReader(),n=[];return new Promise(function(c){i.read().then(async function o(m){const{done:h,value:S}=m;return S&&n.push(S),h?c(n):i.read().then(o)})})}/*!
302
+ `;class un{constructor({track:e}){const i=e.getSettings();if(!i)throw new Error("track has no settings");if(e.kind==="video")this.readable=this.createVideoStream(e,i);else if(e.kind==="audio")this.readable=this.createAudioStream(e,i);else throw new Error(`Unsupported track kind: ${e.kind}`)}createVideoStream(e,i){let n,c,o;const m=i.frameRate??30;return new ReadableStream({async start(){n=document.createElement("video"),n.srcObject=new MediaStream([e]),await Promise.all([n.play(),new Promise(h=>{n.onloadedmetadata=h})]),c=performance.now()},async pull(h){for(;;){const S=performance.now();if(S-c<1e3/m){await new Promise(G=>requestAnimationFrame(G));continue}const T=o??Math.round((S-c)*1e3);o=T,c=S,h.enqueue(new VideoFrame(n,{timestamp:c*1e3,duration:T}));break}}})}createAudioStream(e,i){let n,c,o;return new ReadableStream({async start(m){n=new AudioContext({sampleRate:i.sampleRate||48e3});const h=new MediaStreamAudioSourceNode(n,{mediaStream:new MediaStream([e])}),S=new Blob([Ga],{type:"application/javascript"});o=URL.createObjectURL(S),await n.audioWorklet.addModule(o),c=new AudioWorkletNode(n,"audio-capture-processor",{numberOfInputs:1,numberOfOutputs:0,channelCount:i.channelCount||2}),h.connect(c),c.port.onmessage=T=>{const{timestamp:G,channels:f}=T.data,A=f,w=A[0].length,E=A.length,F=w*E,N=new Float32Array(F);for(let K=0;K<E;K++)N.set(A[K],K*w);try{const K=new AudioData({format:"f32-planar",sampleRate:n.sampleRate,numberOfFrames:w,numberOfChannels:E,timestamp:G,data:N});m.enqueue(K)}catch(K){console.error("Failed to create AudioData:",K)}}},cancel(){c&&(c.disconnect(),c.port.onmessage=null),n&&n.close(),o&&URL.revokeObjectURL(o)}})}}self.MediaStreamTrackProcessor||(self.MediaStreamTrackProcessor=un);const va=self.MediaStreamTrackProcessor||un;var Ia=Object.defineProperty,Va=(t,e,i)=>e in t?Ia(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,oi=(t,e,i)=>(Va(t,typeof e!="symbol"?e+"":e,i),i),I0=(t=>(t[t.AVMEDIA_TYPE_UNKNOWN=-1]="AVMEDIA_TYPE_UNKNOWN",t[t.AVMEDIA_TYPE_VIDEO=0]="AVMEDIA_TYPE_VIDEO",t[t.AVMEDIA_TYPE_AUDIO=1]="AVMEDIA_TYPE_AUDIO",t[t.AVMEDIA_TYPE_DATA=2]="AVMEDIA_TYPE_DATA",t[t.AVMEDIA_TYPE_SUBTITLE=3]="AVMEDIA_TYPE_SUBTITLE",t[t.AVMEDIA_TYPE_ATTACHMENT=4]="AVMEDIA_TYPE_ATTACHMENT",t[t.AVMEDIA_TYPE_NB=5]="AVMEDIA_TYPE_NB",t))(I0||{}),di=(t=>(t[t.AVSEEK_FLAG_BACKWARD=1]="AVSEEK_FLAG_BACKWARD",t[t.AVSEEK_FLAG_BYTE=2]="AVSEEK_FLAG_BYTE",t[t.AVSEEK_FLAG_ANY=4]="AVSEEK_FLAG_ANY",t[t.AVSEEK_FLAG_FRAME=8]="AVSEEK_FLAG_FRAME",t))(di||{}),rt=(t=>(t.WasmWorkerLoaded="WasmWorkerLoaded",t.WASMRuntimeInitialized="WASMRuntimeInitialized",t.LoadWASM="LoadWASM",t.GetAVPacket="GetAVPacket",t.GetAVPackets="GetAVPackets",t.GetAVStream="GetAVStream",t.GetAVStreams="GetAVStreams",t.GetMediaInfo="GetMediaInfo",t.ReadAVPacket="ReadAVPacket",t.AVPacketStream="AVPacketStream",t.ReadNextAVPacket="ReadNextAVPacket",t.StopReadAVPacket="StopReadAVPacket",t.SetAVLogLevel="SetAVLogLevel",t))(rt||{});const hn="video",Ra="audio",Ta="subtitle",ws={VIDEO:hn},Ci={[hn]:I0.AVMEDIA_TYPE_VIDEO,[Ra]:I0.AVMEDIA_TYPE_AUDIO,[Ta]:I0.AVMEDIA_TYPE_SUBTITLE},bn="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBBZT0oRT0+KEVbRS5BVk1FRElBX1RZUEVfVU5LTk9XTj0tMV09IkFWTUVESUFfVFlQRV9VTktOT1dOIixFW0UuQVZNRURJQV9UWVBFX1ZJREVPPTBdPSJBVk1FRElBX1RZUEVfVklERU8iLEVbRS5BVk1FRElBX1RZUEVfQVVESU89MV09IkFWTUVESUFfVFlQRV9BVURJTyIsRVtFLkFWTUVESUFfVFlQRV9EQVRBPTJdPSJBVk1FRElBX1RZUEVfREFUQSIsRVtFLkFWTUVESUFfVFlQRV9TVUJUSVRMRT0zXT0iQVZNRURJQV9UWVBFX1NVQlRJVExFIixFW0UuQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ9NF09IkFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UIixFW0UuQVZNRURJQV9UWVBFX05CPTVdPSJBVk1FRElBX1RZUEVfTkIiLEUpKShBZXx8e30pLEc9KEU9PihFLldhc21Xb3JrZXJMb2FkZWQ9Ildhc21Xb3JrZXJMb2FkZWQiLEUuV0FTTVJ1bnRpbWVJbml0aWFsaXplZD0iV0FTTVJ1bnRpbWVJbml0aWFsaXplZCIsRS5Mb2FkV0FTTT0iTG9hZFdBU00iLEUuR2V0QVZQYWNrZXQ9IkdldEFWUGFja2V0IixFLkdldEFWUGFja2V0cz0iR2V0QVZQYWNrZXRzIixFLkdldEFWU3RyZWFtPSJHZXRBVlN0cmVhbSIsRS5HZXRBVlN0cmVhbXM9IkdldEFWU3RyZWFtcyIsRS5HZXRNZWRpYUluZm89IkdldE1lZGlhSW5mbyIsRS5SZWFkQVZQYWNrZXQ9IlJlYWRBVlBhY2tldCIsRS5BVlBhY2tldFN0cmVhbT0iQVZQYWNrZXRTdHJlYW0iLEUuUmVhZE5leHRBVlBhY2tldD0iUmVhZE5leHRBVlBhY2tldCIsRS5TdG9wUmVhZEFWUGFja2V0PSJTdG9wUmVhZEFWUGFja2V0IixFLlNldEFWTG9nTGV2ZWw9IlNldEFWTG9nTGV2ZWwiLEUpKShHfHx7fSk7InZpZGVvIisiIixBZS5BVk1FRElBX1RZUEVfVklERU8sImF1ZGlvIisiIixBZS5BVk1FRElBX1RZUEVfQVVESU8sInN1YnRpdGxlIisiIixBZS5BVk1FRElBX1RZUEVfU1VCVElUTEU7dmFyIGl0PSgoKT0+e3ZhciBFPXNlbGYubG9jYXRpb24uaHJlZjtyZXR1cm4gZnVuY3Rpb24oUj17fSl7dmFyIEMsZj1PYmplY3QuYXNzaWduKHt9LFIpLFUsSCxuZT1uZXcgUHJvbWlzZSgoZSxyKT0+e1U9ZSxIPXJ9KSxhZT0hMCxEZT1PYmplY3QuYXNzaWduKHt9LGYpLGhyPSIuL3RoaXMucHJvZ3JhbSIscT0iIjtmdW5jdGlvbiBtdChlKXtyZXR1cm4gZi5sb2NhdGVGaWxlP2YubG9jYXRlRmlsZShlLHEpOnErZX12YXIgWWUsbXIsR2U7cT1zZWxmLmxvY2F0aW9uLmhyZWYsRSYmKHE9RSkscS5zdGFydHNXaXRoKCJibG9iOiIpP3E9IiI6cT1xLnN1YnN0cigwLHEucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKSxZZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5zZW5kKG51bGwpLHIucmVzcG9uc2VUZXh0fSxHZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkoci5yZXNwb25zZSl9LG1yPShlLHIsdCk9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PntpZihuLnN0YXR1cz09MjAwfHxuLnN0YXR1cz09MCYmbi5yZXNwb25zZSl7cihuLnJlc3BvbnNlKTtyZXR1cm59dCgpfSxuLm9uZXJyb3I9dCxuLnNlbmQobnVsbCl9O3ZhciBxZT1mLnByaW50fHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLGVlPWYucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGYsRGUpLERlPW51bGwsZi5hcmd1bWVudHMmJmYuYXJndW1lbnRzLGYudGhpc1Byb2dyYW0mJihocj1mLnRoaXNQcm9ncmFtKSxmLnF1aXQmJmYucXVpdDt2YXIgX2U7Zi53YXNtQmluYXJ5JiYoX2U9Zi53YXNtQmluYXJ5KTt2YXIgJGUscHI9ITE7ZnVuY3Rpb24gX3IoZSxyKXtlfHxpZShyKX12YXIgSSx4LFksQ2UsZyxBLGdyLHlyO2Z1bmN0aW9uIHdyKCl7dmFyIGU9JGUuYnVmZmVyO2YuSEVBUDg9ST1uZXcgSW50OEFycmF5KGUpLGYuSEVBUDE2PVk9bmV3IEludDE2QXJyYXkoZSksZi5IRUFQVTg9eD1uZXcgVWludDhBcnJheShlKSxmLkhFQVBVMTY9Q2U9bmV3IFVpbnQxNkFycmF5KGUpLGYuSEVBUDMyPWc9bmV3IEludDMyQXJyYXkoZSksZi5IRUFQVTMyPUE9bmV3IFVpbnQzMkFycmF5KGUpLGYuSEVBUEYzMj1ncj1uZXcgRmxvYXQzMkFycmF5KGUpLGYuSEVBUEY2ND15cj1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBFcj1bXSxicj1bXSxrcj1bXTtmdW5jdGlvbiBwdCgpe2lmKGYucHJlUnVuKWZvcih0eXBlb2YgZi5wcmVSdW49PSJmdW5jdGlvbiImJihmLnByZVJ1bj1bZi5wcmVSdW5dKTtmLnByZVJ1bi5sZW5ndGg7KXl0KGYucHJlUnVuLnNoaWZ0KCkpO0tlKEVyKX1mdW5jdGlvbiBfdCgpeyFmLm5vRlNJbml0JiYhby5pbml0LmluaXRpYWxpemVkJiZvLmluaXQoKSxvLmlnbm9yZVBlcm1pc3Npb25zPSExLEtlKGJyKX1mdW5jdGlvbiBndCgpe2lmKGYucG9zdFJ1bilmb3IodHlwZW9mIGYucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKGYucG9zdFJ1bj1bZi5wb3N0UnVuXSk7Zi5wb3N0UnVuLmxlbmd0aDspRXQoZi5wb3N0UnVuLnNoaWZ0KCkpO0tlKGtyKX1mdW5jdGlvbiB5dChlKXtFci51bnNoaWZ0KGUpfWZ1bmN0aW9uIHd0KGUpe2JyLnVuc2hpZnQoZSl9ZnVuY3Rpb24gRXQoZSl7a3IudW5zaGlmdChlKX12YXIgb2U9MCxnZT1udWxsO2Z1bmN0aW9uIEhhKGUpe3JldHVybiBlfWZ1bmN0aW9uIFhlKGUpe3ZhciByO29lKyssKHI9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8ci5jYWxsKGYsb2UpfWZ1bmN0aW9uIEZlKGUpe3ZhciB0O2lmKG9lLS0sKHQ9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8dC5jYWxsKGYsb2UpLG9lPT0wJiZnZSl7dmFyIHI9Z2U7Z2U9bnVsbCxyKCl9fWZ1bmN0aW9uIGllKGUpe3ZhciB0Oyh0PWYub25BYm9ydCk9PW51bGx8fHQuY2FsbChmLGUpLGU9IkFib3J0ZWQoIitlKyIpIixlZShlKSxwcj0hMCxlKz0iLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7dmFyIHI9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKTt0aHJvdyBIKHIpLHJ9dmFyIGJ0PSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIixQcj1lPT5lLnN0YXJ0c1dpdGgoYnQpO2Z1bmN0aW9uIGt0KCl7aWYoZi5sb2NhdGVGaWxlKXt2YXIgZT0id2ViLWRlbXV4ZXIud2FzbSI7cmV0dXJuIFByKGUpP2U6bXQoZSl9cmV0dXJuIG5ldyBVUkwoIndlYi1kZW11eGVyLndhc20iLHNlbGYubG9jYXRpb24uaHJlZikuaHJlZn12YXIgVGU7ZnVuY3Rpb24gQXIoZSl7aWYoZT09VGUmJl9lKXJldHVybiBuZXcgVWludDhBcnJheShfZSk7aWYoR2UpcmV0dXJuIEdlKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBQdChlKXtyZXR1cm4hX2UmJmFlJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4ocj0+e2lmKCFyLm9rKXRocm93YGZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyR7ZX0nYDtyZXR1cm4gci5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goKCk9PkFyKGUpKTpQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5BcihlKSl9ZnVuY3Rpb24gRHIoZSxyLHQpe3JldHVybiBQdChlKS50aGVuKG49PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG4scikpLnRoZW4odCxuPT57ZWUoYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7bn1gKSxpZShuKX0pfWZ1bmN0aW9uIEF0KGUscix0LG4pe3JldHVybiFlJiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PSJmdW5jdGlvbiImJiFQcihyKSYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKHIse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGE9Pnt2YXIgaT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhhLHQpO3JldHVybiBpLnRoZW4obixmdW5jdGlvbihzKXtyZXR1cm4gZWUoYHdhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAke3N9YCksZWUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksRHIocix0LG4pfSl9KTpEcihyLHQsbil9ZnVuY3Rpb24gRHQoKXtyZXR1cm57YTpDYX19ZnVuY3Rpb24gJHQoKXt2YXIgZT1EdCgpO2Z1bmN0aW9uIHIobixhKXtyZXR1cm4gej1uLmV4cG9ydHMsJGU9ei5iYSx3cigpLGpyPXouZWEsd3Qoei5jYSksRmUoKSx6fVhlKCk7ZnVuY3Rpb24gdChuKXtyKG4uaW5zdGFuY2UpfWlmKGYuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gZi5pbnN0YW50aWF0ZVdhc20oZSxyKX1jYXRjaChuKXtlZShgTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogJHtufWApLEgobil9cmV0dXJuIFRlfHwoVGU9a3QoKSksQXQoX2UsVGUsZSx0KS5jYXRjaChIKSx7fX12YXIgeSwkLEtlPWU9Pntmb3IoO2UubGVuZ3RoPjA7KWUuc2hpZnQoKShmKX07Zi5ub0V4aXRSdW50aW1lO3ZhciAkcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxjZT0oZSxyLHQpPT57Zm9yKHZhciBuPXIrdCxhPXI7ZVthXSYmIShhPj1uKTspKythO2lmKGEtcj4xNiYmZS5idWZmZXImJiRyKXJldHVybiAkci5kZWNvZGUoZS5zdWJhcnJheShyLGEpKTtmb3IodmFyIGk9IiI7cjxhOyl7dmFyIHM9ZVtyKytdO2lmKCEocyYxMjgpKXtpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpO2NvbnRpbnVlfXZhciBsPWVbcisrXSY2MztpZigocyYyMjQpPT0xOTIpe2krPVN0cmluZy5mcm9tQ2hhckNvZGUoKHMmMzEpPDw2fGwpO2NvbnRpbnVlfXZhciB1PWVbcisrXSY2MztpZigocyYyNDApPT0yMjQ/cz0ocyYxNSk8PDEyfGw8PDZ8dTpzPShzJjcpPDwxOHxsPDwxMnx1PDw2fGVbcisrXSY2MyxzPDY1NTM2KWkrPVN0cmluZy5mcm9tQ2hhckNvZGUocyk7ZWxzZXt2YXIgYz1zLTY1NTM2O2krPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Yz4+MTAsNTYzMjB8YyYxMDIzKX19cmV0dXJuIGl9LHNlPShlLHIpPT5lP2NlKHgsZSxyKToiIixDdD0oZSxyLHQsbik9PntpZShgQXNzZXJ0aW9uIGZhaWxlZDogJHtzZShlKX0sIGF0OiBgK1tyP3NlKHIpOiJ1bmtub3duIGZpbGVuYW1lIix0LG4/c2Uobik6InVua25vd24gZnVuY3Rpb24iXSl9O2NsYXNzIEZ0e2NvbnN0cnVjdG9yKHIpe3RoaXMuZXhjUHRyPXIsdGhpcy5wdHI9ci0yNH1zZXRfdHlwZShyKXtBW3RoaXMucHRyKzQ+PjJdPXJ9Z2V0X3R5cGUoKXtyZXR1cm4gQVt0aGlzLnB0cis0Pj4yXX1zZXRfZGVzdHJ1Y3RvcihyKXtBW3RoaXMucHRyKzg+PjJdPXJ9Z2V0X2Rlc3RydWN0b3IoKXtyZXR1cm4gQVt0aGlzLnB0cis4Pj4yXX1zZXRfY2F1Z2h0KHIpe3I9cj8xOjAsSVt0aGlzLnB0cisxMl09cn1nZXRfY2F1Z2h0KCl7cmV0dXJuIElbdGhpcy5wdHIrMTJdIT0wfXNldF9yZXRocm93bihyKXtyPXI/MTowLElbdGhpcy5wdHIrMTNdPXJ9Z2V0X3JldGhyb3duKCl7cmV0dXJuIElbdGhpcy5wdHIrMTNdIT0wfWluaXQocix0KXt0aGlzLnNldF9hZGp1c3RlZF9wdHIoMCksdGhpcy5zZXRfdHlwZShyKSx0aGlzLnNldF9kZXN0cnVjdG9yKHQpfXNldF9hZGp1c3RlZF9wdHIocil7QVt0aGlzLnB0cisxNj4+Ml09cn1nZXRfYWRqdXN0ZWRfcHRyKCl7cmV0dXJuIEFbdGhpcy5wdHIrMTY+PjJdfWdldF9leGNlcHRpb25fcHRyKCl7dmFyIHI9cnQodGhpcy5nZXRfdHlwZSgpKTtpZihyKXJldHVybiBBW3RoaXMuZXhjUHRyPj4yXTt2YXIgdD10aGlzLmdldF9hZGp1c3RlZF9wdHIoKTtyZXR1cm4gdCE9PTA/dDp0aGlzLmV4Y1B0cn19dmFyIENyPTAsVHQ9KGUscix0KT0+e3ZhciBuPW5ldyBGdChlKTt0aHJvdyBuLmluaXQocix0KSxDcj1lLENyfSxTPXtpc0FiczplPT5lLmNoYXJBdCgwKT09PSIvIixzcGxpdFBhdGg6ZT0+e3ZhciByPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gci5leGVjKGUpLnNsaWNlKDEpfSxub3JtYWxpemVBcnJheTooZSxyKT0+e2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIGE9ZVtuXTthPT09Ii4iP2Uuc3BsaWNlKG4sMSk6YT09PSIuLiI/KGUuc3BsaWNlKG4sMSksdCsrKTp0JiYoZS5zcGxpY2UobiwxKSx0LS0pfWlmKHIpZm9yKDt0O3QtLSllLnVuc2hpZnQoIi4uIik7cmV0dXJuIGV9LG5vcm1hbGl6ZTplPT57dmFyIHI9Uy5pc0FicyhlKSx0PWUuc3Vic3RyKC0xKT09PSIvIjtyZXR1cm4gZT1TLm5vcm1hbGl6ZUFycmF5KGUuc3BsaXQoIi8iKS5maWx0ZXIobj0+ISFuKSwhcikuam9pbigiLyIpLCFlJiYhciYmKGU9Ii4iKSxlJiZ0JiYoZSs9Ii8iKSwocj8iLyI6IiIpK2V9LGRpcm5hbWU6ZT0+e3ZhciByPVMuc3BsaXRQYXRoKGUpLHQ9clswXSxuPXJbMV07cmV0dXJuIXQmJiFuPyIuIjoobiYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSksdCtuKX0sYmFzZW5hbWU6ZT0+e2lmKGU9PT0iLyIpcmV0dXJuIi8iO2U9Uy5ub3JtYWxpemUoZSksZT1lLnJlcGxhY2UoL1wvJC8sIiIpO3ZhciByPWUubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gcj09PS0xP2U6ZS5zdWJzdHIocisxKX0sam9pbjooLi4uZSk9PlMubm9ybWFsaXplKGUuam9pbigiLyIpKSxqb2luMjooZSxyKT0+Uy5ub3JtYWxpemUoZSsiLyIrcil9LFN0PSgpPT57aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2llKCJpbml0UmFuZG9tRGV2aWNlIil9LEZyPWU9PihGcj1TdCgpKShlKSxYPXtyZXNvbHZlOiguLi5lKT0+e2Zvcih2YXIgcj0iIix0PSExLG49ZS5sZW5ndGgtMTtuPj0tMSYmIXQ7bi0tKXt2YXIgYT1uPj0wP2Vbbl06by5jd2QoKTtpZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKTtpZighYSlyZXR1cm4iIjtyPWErIi8iK3IsdD1TLmlzQWJzKGEpfXJldHVybiByPVMubm9ybWFsaXplQXJyYXkoci5zcGxpdCgiLyIpLmZpbHRlcihpPT4hIWkpLCF0KS5qb2luKCIvIiksKHQ/Ii8iOiIiKStyfHwiLiJ9LHJlbGF0aXZlOihlLHIpPT57ZT1YLnJlc29sdmUoZSkuc3Vic3RyKDEpLHI9WC5yZXNvbHZlKHIpLnN1YnN0cigxKTtmdW5jdGlvbiB0KGMpe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGgmJmNbZF09PT0iIjtkKyspO2Zvcih2YXIgbT1jLmxlbmd0aC0xO20+PTAmJmNbbV09PT0iIjttLS0pO3JldHVybiBkPm0/W106Yy5zbGljZShkLG0tZCsxKX1mb3IodmFyIG49dChlLnNwbGl0KCIvIikpLGE9dChyLnNwbGl0KCIvIikpLGk9TWF0aC5taW4obi5sZW5ndGgsYS5sZW5ndGgpLHM9aSxsPTA7bDxpO2wrKylpZihuW2xdIT09YVtsXSl7cz1sO2JyZWFrfWZvcih2YXIgdT1bXSxsPXM7bDxuLmxlbmd0aDtsKyspdS5wdXNoKCIuLiIpO3JldHVybiB1PXUuY29uY2F0KGEuc2xpY2UocykpLHUuam9pbigiLyIpfX0sSmU9W10sWmU9ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO248PTEyNz9yKys6bjw9MjA0Nz9yKz0yOm4+PTU1Mjk2JiZuPD01NzM0Mz8ocis9NCwrK3QpOnIrPTN9cmV0dXJuIHJ9LFFlPShlLHIsdCxuKT0+e2lmKCEobj4wKSlyZXR1cm4gMDtmb3IodmFyIGE9dCxpPXQrbi0xLHM9MDtzPGUubGVuZ3RoOysrcyl7dmFyIGw9ZS5jaGFyQ29kZUF0KHMpO2lmKGw+PTU1Mjk2JiZsPD01NzM0Myl7dmFyIHU9ZS5jaGFyQ29kZUF0KCsrcyk7bD02NTUzNisoKGwmMTAyMyk8PDEwKXx1JjEwMjN9aWYobDw9MTI3KXtpZih0Pj1pKWJyZWFrO3JbdCsrXT1sfWVsc2UgaWYobDw9MjA0Nyl7aWYodCsxPj1pKWJyZWFrO3JbdCsrXT0xOTJ8bD4+NixyW3QrK109MTI4fGwmNjN9ZWxzZSBpZihsPD02NTUzNSl7aWYodCsyPj1pKWJyZWFrO3JbdCsrXT0yMjR8bD4+MTIsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M31lbHNle2lmKHQrMz49aSlicmVhaztyW3QrK109MjQwfGw+PjE4LHJbdCsrXT0xMjh8bD4+MTImNjMsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M319cmV0dXJuIHJbdF09MCx0LWF9O2Z1bmN0aW9uIFNlKGUscix0KXt2YXIgbj1aZShlKSsxLGE9bmV3IEFycmF5KG4pLGk9UWUoZSxhLDAsYS5sZW5ndGgpO3JldHVybiByJiYoYS5sZW5ndGg9aSksYX12YXIgTXQ9KCk9PntpZighSmUubGVuZ3RoKXt2YXIgZT1udWxsO2lmKCFlKXJldHVybiBudWxsO0plPVNlKGUsITApfXJldHVybiBKZS5zaGlmdCgpfSxsZT17dHR5czpbXSxpbml0KCl7fSxzaHV0ZG93bigpe30scmVnaXN0ZXIoZSxyKXtsZS50dHlzW2VdPXtpbnB1dDpbXSxvdXRwdXQ6W10sb3BzOnJ9LG8ucmVnaXN0ZXJEZXZpY2UoZSxsZS5zdHJlYW1fb3BzKX0sc3RyZWFtX29wczp7b3BlbihlKXt2YXIgcj1sZS50dHlzW2Uubm9kZS5yZGV2XTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtlLnR0eT1yLGUuc2Vla2FibGU9ITF9LGNsb3NlKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LGZzeW5jKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LHJlYWQoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMuZ2V0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7Zm9yKHZhciBpPTAscz0wO3M8bjtzKyspe3ZhciBsO3RyeXtsPWUudHR5Lm9wcy5nZXRfY2hhcihlLnR0eSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9aWYobD09PXZvaWQgMCYmaT09PTApdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2KTtpZihsPT1udWxsKWJyZWFrO2krKyxyW3Qrc109bH1yZXR1cm4gaSYmKGUubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaX0sd3JpdGUoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMucHV0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7dHJ5e2Zvcih2YXIgaT0wO2k8bjtpKyspZS50dHkub3BzLnB1dF9jaGFyKGUudHR5LHJbdCtpXSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9cmV0dXJuIG4mJihlLm5vZGUudGltZXN0YW1wPURhdGUubm93KCkpLGl9fSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyKGUpe3JldHVybiBNdCgpfSxwdXRfY2hhcihlLHIpe3I9PT1udWxsfHxyPT09MTA/KHFlKGNlKGUub3V0cHV0LDApKSxlLm91dHB1dD1bXSk6ciE9MCYmZS5vdXRwdXQucHVzaChyKX0sZnN5bmMoZSl7ZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aD4wJiYocWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKX0saW9jdGxfdGNnZXRzKGUpe3JldHVybntjX2lmbGFnOjI1ODU2LGNfb2ZsYWc6NSxjX2NmbGFnOjE5MSxjX2xmbGFnOjM1Mzg3LGNfY2M6WzMsMjgsMTI3LDIxLDQsMCwxLDAsMTcsMTksMjYsMCwxOCwxNSwyMywyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXX19LGlvY3RsX3Rjc2V0cyhlLHIsdCl7cmV0dXJuIDB9LGlvY3RsX3Rpb2Nnd2luc3ooZSl7cmV0dXJuWzI0LDgwXX19LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyKGUscil7cj09PW51bGx8fHI9PT0xMD8oZWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKTpyIT0wJiZlLm91dHB1dC5wdXNoKHIpfSxmc3luYyhlKXtlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoPjAmJihlZShjZShlLm91dHB1dCwwKSksZS5vdXRwdXQ9W10pfX19LFRyPWU9PntpZSgpfSxiPXtvcHNfdGFibGU6bnVsbCxtb3VudChlKXtyZXR1cm4gYi5jcmVhdGVOb2RlKG51bGwsIi8iLDE2ODk1LDApfSxjcmVhdGVOb2RlKGUscix0LG4pe2lmKG8uaXNCbGtkZXYodCl8fG8uaXNGSUZPKHQpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Iub3BzX3RhYmxlfHwoYi5vcHNfdGFibGU9e2Rpcjp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIsbG9va3VwOmIubm9kZV9vcHMubG9va3VwLG1rbm9kOmIubm9kZV9vcHMubWtub2QscmVuYW1lOmIubm9kZV9vcHMucmVuYW1lLHVubGluazpiLm5vZGVfb3BzLnVubGluayxybWRpcjpiLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6Yi5ub2RlX29wcy5yZWFkZGlyLHN5bWxpbms6Yi5ub2RlX29wcy5zeW1saW5rfSxzdHJlYW06e2xsc2VlazpiLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTp7bGxzZWVrOmIuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpiLnN0cmVhbV9vcHMucmVhZCx3cml0ZTpiLnN0cmVhbV9vcHMud3JpdGUsYWxsb2NhdGU6Yi5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6Yi5zdHJlYW1fb3BzLm1tYXAsbXN5bmM6Yi5zdHJlYW1fb3BzLm1zeW5jfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIscmVhZGxpbms6Yi5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6Yi5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6Yi5ub2RlX29wcy5zZXRhdHRyfSxzdHJlYW06by5jaHJkZXZfc3RyZWFtX29wc319KTt2YXIgYT1vLmNyZWF0ZU5vZGUoZSxyLHQsbik7cmV0dXJuIG8uaXNEaXIoYS5tb2RlKT8oYS5ub2RlX29wcz1iLm9wc190YWJsZS5kaXIubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZGlyLnN0cmVhbSxhLmNvbnRlbnRzPXt9KTpvLmlzRmlsZShhLm1vZGUpPyhhLm5vZGVfb3BzPWIub3BzX3RhYmxlLmZpbGUubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZmlsZS5zdHJlYW0sYS51c2VkQnl0ZXM9MCxhLmNvbnRlbnRzPW51bGwpOm8uaXNMaW5rKGEubW9kZSk/KGEubm9kZV9vcHM9Yi5vcHNfdGFibGUubGluay5ub2RlLGEuc3RyZWFtX29wcz1iLm9wc190YWJsZS5saW5rLnN0cmVhbSk6by5pc0NocmRldihhLm1vZGUpJiYoYS5ub2RlX29wcz1iLm9wc190YWJsZS5jaHJkZXYubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbSksYS50aW1lc3RhbXA9RGF0ZS5ub3coKSxlJiYoZS5jb250ZW50c1tyXT1hLGUudGltZXN0YW1wPWEudGltZXN0YW1wKSxhfSxnZXRGaWxlRGF0YUFzVHlwZWRBcnJheShlKXtyZXR1cm4gZS5jb250ZW50cz9lLmNvbnRlbnRzLnN1YmFycmF5P2UuY29udGVudHMuc3ViYXJyYXkoMCxlLnVzZWRCeXRlcyk6bmV3IFVpbnQ4QXJyYXkoZS5jb250ZW50cyk6bmV3IFVpbnQ4QXJyYXkoMCl9LGV4cGFuZEZpbGVTdG9yYWdlKGUscil7dmFyIHQ9ZS5jb250ZW50cz9lLmNvbnRlbnRzLmxlbmd0aDowO2lmKCEodD49cikpe3ZhciBuPTEwMjQqMTAyNDtyPU1hdGgubWF4KHIsdCoodDxuPzI6MS4xMjUpPj4+MCksdCE9MCYmKHI9TWF0aC5tYXgociwyNTYpKTt2YXIgYT1lLmNvbnRlbnRzO2UuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkociksZS51c2VkQnl0ZXM+MCYmZS5jb250ZW50cy5zZXQoYS5zdWJhcnJheSgwLGUudXNlZEJ5dGVzKSwwKX19LHJlc2l6ZUZpbGVTdG9yYWdlKGUscil7aWYoZS51c2VkQnl0ZXMhPXIpaWYocj09MCllLmNvbnRlbnRzPW51bGwsZS51c2VkQnl0ZXM9MDtlbHNle3ZhciB0PWUuY29udGVudHM7ZS5jb250ZW50cz1uZXcgVWludDhBcnJheShyKSx0JiZlLmNvbnRlbnRzLnNldCh0LnN1YmFycmF5KDAsTWF0aC5taW4ocixlLnVzZWRCeXRlcykpKSxlLnVzZWRCeXRlcz1yfX0sbm9kZV9vcHM6e2dldGF0dHIoZSl7dmFyIHI9e307cmV0dXJuIHIuZGV2PW8uaXNDaHJkZXYoZS5tb2RlKT9lLmlkOjEsci5pbm89ZS5pZCxyLm1vZGU9ZS5tb2RlLHIubmxpbms9MSxyLnVpZD0wLHIuZ2lkPTAsci5yZGV2PWUucmRldixvLmlzRGlyKGUubW9kZSk/ci5zaXplPTQwOTY6by5pc0ZpbGUoZS5tb2RlKT9yLnNpemU9ZS51c2VkQnl0ZXM6by5pc0xpbmsoZS5tb2RlKT9yLnNpemU9ZS5saW5rLmxlbmd0aDpyLnNpemU9MCxyLmF0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLm10aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmN0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmJsa3NpemU9NDA5NixyLmJsb2Nrcz1NYXRoLmNlaWwoci5zaXplL3IuYmxrc2l6ZSkscn0sc2V0YXR0cihlLHIpe3IubW9kZSE9PXZvaWQgMCYmKGUubW9kZT1yLm1vZGUpLHIudGltZXN0YW1wIT09dm9pZCAwJiYoZS50aW1lc3RhbXA9ci50aW1lc3RhbXApLHIuc2l6ZSE9PXZvaWQgMCYmYi5yZXNpemVGaWxlU3RvcmFnZShlLHIuc2l6ZSl9LGxvb2t1cChlLHIpe3Rocm93IG8uZ2VuZXJpY0Vycm9yc1s0NF19LG1rbm9kKGUscix0LG4pe3JldHVybiBiLmNyZWF0ZU5vZGUoZSxyLHQsbil9LHJlbmFtZShlLHIsdCl7aWYoby5pc0RpcihlLm1vZGUpKXt2YXIgbjt0cnl7bj1vLmxvb2t1cE5vZGUocix0KX1jYXRjaHt9aWYobilmb3IodmFyIGEgaW4gbi5jb250ZW50cyl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU1KX1kZWxldGUgZS5wYXJlbnQuY29udGVudHNbZS5uYW1lXSxlLnBhcmVudC50aW1lc3RhbXA9RGF0ZS5ub3coKSxlLm5hbWU9dCxyLmNvbnRlbnRzW3RdPWUsci50aW1lc3RhbXA9ZS5wYXJlbnQudGltZXN0YW1wLGUucGFyZW50PXJ9LHVubGluayhlLHIpe2RlbGV0ZSBlLmNvbnRlbnRzW3JdLGUudGltZXN0YW1wPURhdGUubm93KCl9LHJtZGlyKGUscil7dmFyIHQ9by5sb29rdXBOb2RlKGUscik7Zm9yKHZhciBuIGluIHQuY29udGVudHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NSk7ZGVsZXRlIGUuY29udGVudHNbcl0sZS50aW1lc3RhbXA9RGF0ZS5ub3coKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3ZhciBuPWIuY3JlYXRlTm9kZShlLHIsNDE0NzEsMCk7cmV0dXJuIG4ubGluaz10LG59LHJlYWRsaW5rKGUpe2lmKCFvLmlzTGluayhlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO3JldHVybiBlLmxpbmt9fSxzdHJlYW1fb3BzOntyZWFkKGUscix0LG4sYSl7dmFyIGk9ZS5ub2RlLmNvbnRlbnRzO2lmKGE+PWUubm9kZS51c2VkQnl0ZXMpcmV0dXJuIDA7dmFyIHM9TWF0aC5taW4oZS5ub2RlLnVzZWRCeXRlcy1hLG4pO2lmKHM+OCYmaS5zdWJhcnJheSlyLnNldChpLnN1YmFycmF5KGEsYStzKSx0KTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspclt0K2xdPWlbYStsXTtyZXR1cm4gc30sd3JpdGUoZSxyLHQsbixhLGkpe2lmKHIuYnVmZmVyPT09SS5idWZmZXImJihpPSExKSwhbilyZXR1cm4gMDt2YXIgcz1lLm5vZGU7aWYocy50aW1lc3RhbXA9RGF0ZS5ub3coKSxyLnN1YmFycmF5JiYoIXMuY29udGVudHN8fHMuY29udGVudHMuc3ViYXJyYXkpKXtpZihpKXJldHVybiBzLmNvbnRlbnRzPXIuc3ViYXJyYXkodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihzLnVzZWRCeXRlcz09PTAmJmE9PT0wKXJldHVybiBzLmNvbnRlbnRzPXIuc2xpY2UodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihhK248PXMudXNlZEJ5dGVzKXJldHVybiBzLmNvbnRlbnRzLnNldChyLnN1YmFycmF5KHQsdCtuKSxhKSxufWlmKGIuZXhwYW5kRmlsZVN0b3JhZ2UocyxhK24pLHMuY29udGVudHMuc3ViYXJyYXkmJnIuc3ViYXJyYXkpcy5jb250ZW50cy5zZXQoci5zdWJhcnJheSh0LHQrbiksYSk7ZWxzZSBmb3IodmFyIGw9MDtsPG47bCsrKXMuY29udGVudHNbYStsXT1yW3QrbF07cmV0dXJuIHMudXNlZEJ5dGVzPU1hdGgubWF4KHMudXNlZEJ5dGVzLGErbiksbn0sbGxzZWVrKGUscix0KXt2YXIgbj1yO2lmKHQ9PT0xP24rPWUucG9zaXRpb246dD09PTImJm8uaXNGaWxlKGUubm9kZS5tb2RlKSYmKG4rPWUubm9kZS51c2VkQnl0ZXMpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn0sYWxsb2NhdGUoZSxyLHQpe2IuZXhwYW5kRmlsZVN0b3JhZ2UoZS5ub2RlLHIrdCksZS5ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChlLm5vZGUudXNlZEJ5dGVzLHIrdCl9LG1tYXAoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO3ZhciBpLHMsbD1lLm5vZGUuY29udGVudHM7aWYoIShhJjIpJiZsLmJ1ZmZlcj09PUkuYnVmZmVyKXM9ITEsaT1sLmJ5dGVPZmZzZXQ7ZWxzZXtpZigodD4wfHx0K3I8bC5sZW5ndGgpJiYobC5zdWJhcnJheT9sPWwuc3ViYXJyYXkodCx0K3IpOmw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobCx0LHQrcikpLHM9ITAsaT1UcigpLCFpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDgpO0kuc2V0KGwsaSl9cmV0dXJue3B0cjppLGFsbG9jYXRlZDpzfX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gYi5zdHJlYW1fb3BzLndyaXRlKGUsciwwLG4sdCwhMSksMH19fSxSdD0oZSxyLHQsbik9Pnt2YXIgYT1gYWwgJHtlfWA7bXIoZSxpPT57cihuZXcgVWludDhBcnJheShpKSksYSYmRmUoKX0saT0+e2lmKHQpdCgpO2Vsc2UgdGhyb3dgTG9hZGluZyBkYXRhIGZpbGUgIiR7ZX0iIGZhaWxlZC5gfSksYSYmWGUoKX0sT3Q9KGUscix0LG4sYSxpKT0+e28uY3JlYXRlRGF0YUZpbGUoZSxyLHQsbixhLGkpfSxJdD1mLnByZWxvYWRQbHVnaW5zfHxbXSxMdD0oZSxyLHQsbik9Pnt0eXBlb2YgQnJvd3NlcjwidSImJkJyb3dzZXIuaW5pdCgpO3ZhciBhPSExO3JldHVybiBJdC5mb3JFYWNoKGk9PnthfHxpLmNhbkhhbmRsZShyKSYmKGkuaGFuZGxlKGUscix0LG4pLGE9ITApfSksYX0sVnQ9KGUscix0LG4sYSxpLHMsbCx1LGMpPT57dmFyIGQ9cj9YLnJlc29sdmUoUy5qb2luMihlLHIpKTplO2Z1bmN0aW9uIG0oaCl7ZnVuY3Rpb24gcCh3KXtjPT1udWxsfHxjKCksbHx8T3QoZSxyLHcsbixhLHUpLGk9PW51bGx8fGkoKSxGZSgpfUx0KGgsZCxwLCgpPT57cz09bnVsbHx8cygpLEZlKCl9KXx8cChoKX1YZSgpLHR5cGVvZiB0PT0ic3RyaW5nIj9SdCh0LG0scyk6bSh0KX0sVXQ9ZT0+e3ZhciByPXtyOjAsInIrIjoyLHc6NTc3LCJ3KyI6NTc4LGE6MTA4OSwiYSsiOjEwOTB9LHQ9cltlXTtpZih0eXBlb2YgdD4idSIpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAke2V9YCk7cmV0dXJuIHR9LGVyPShlLHIpPT57dmFyIHQ9MDtyZXR1cm4gZSYmKHR8PTM2NSksciYmKHR8PTE0NiksdH0sVj17RElSX01PREU6MTY4OTUsRklMRV9NT0RFOjMzMjc5LHJlYWRlcjpudWxsLG1vdW50KGUpe19yKGFlKSxWLnJlYWRlcnx8KFYucmVhZGVyPW5ldyBGaWxlUmVhZGVyU3luYyk7dmFyIHI9Vi5jcmVhdGVOb2RlKG51bGwsIi8iLFYuRElSX01PREUsMCksdD17fTtmdW5jdGlvbiBuKGkpe2Zvcih2YXIgcz1pLnNwbGl0KCIvIiksbD1yLHU9MDt1PHMubGVuZ3RoLTE7dSsrKXt2YXIgYz1zLnNsaWNlKDAsdSsxKS5qb2luKCIvIik7dFtjXXx8KHRbY109Vi5jcmVhdGVOb2RlKGwsc1t1XSxWLkRJUl9NT0RFLDApKSxsPXRbY119cmV0dXJuIGx9ZnVuY3Rpb24gYShpKXt2YXIgcz1pLnNwbGl0KCIvIik7cmV0dXJuIHNbcy5sZW5ndGgtMV19cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5vcHRzLmZpbGVzfHxbXSxmdW5jdGlvbihpKXtWLmNyZWF0ZU5vZGUobihpLm5hbWUpLGEoaS5uYW1lKSxWLkZJTEVfTU9ERSwwLGksaS5sYXN0TW9kaWZpZWREYXRlKX0pLChlLm9wdHMuYmxvYnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe1YuY3JlYXRlTm9kZShuKGkubmFtZSksYShpLm5hbWUpLFYuRklMRV9NT0RFLDAsaS5kYXRhKX0pLChlLm9wdHMucGFja2FnZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubWV0YWRhdGEuZmlsZXMuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgbD1zLmZpbGVuYW1lLnN1YnN0cigxKTtWLmNyZWF0ZU5vZGUobihsKSxhKGwpLFYuRklMRV9NT0RFLDAsaS5ibG9iLnNsaWNlKHMuc3RhcnQscy5lbmQpKX0pfSkscn0sY3JlYXRlTm9kZShlLHIsdCxuLGEsaSl7dmFyIHM9by5jcmVhdGVOb2RlKGUscix0KTtyZXR1cm4gcy5tb2RlPXQscy5ub2RlX29wcz1WLm5vZGVfb3BzLHMuc3RyZWFtX29wcz1WLnN0cmVhbV9vcHMscy50aW1lc3RhbXA9KGl8fG5ldyBEYXRlKS5nZXRUaW1lKCksX3IoVi5GSUxFX01PREUhPT1WLkRJUl9NT0RFKSx0PT09Vi5GSUxFX01PREU/KHMuc2l6ZT1hLnNpemUscy5jb250ZW50cz1hKToocy5zaXplPTQwOTYscy5jb250ZW50cz17fSksZSYmKGUuY29udGVudHNbcl09cyksc30sbm9kZV9vcHM6e2dldGF0dHIoZSl7cmV0dXJue2RldjoxLGlubzplLmlkLG1vZGU6ZS5tb2RlLG5saW5rOjEsdWlkOjAsZ2lkOjAscmRldjowLHNpemU6ZS5zaXplLGF0aW1lOm5ldyBEYXRlKGUudGltZXN0YW1wKSxtdGltZTpuZXcgRGF0ZShlLnRpbWVzdGFtcCksY3RpbWU6bmV3IERhdGUoZS50aW1lc3RhbXApLGJsa3NpemU6NDA5NixibG9ja3M6TWF0aC5jZWlsKGUuc2l6ZS80MDk2KX19LHNldGF0dHIoZSxyKXtyLm1vZGUhPT12b2lkIDAmJihlLm1vZGU9ci5tb2RlKSxyLnRpbWVzdGFtcCE9PXZvaWQgMCYmKGUudGltZXN0YW1wPXIudGltZXN0YW1wKX0sbG9va3VwKGUscil7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCl9LG1rbm9kKGUscix0LG4pe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSxyZW5hbWUoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSx1bmxpbmsoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scm1kaXIoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfX0sc3RyZWFtX29wczp7cmVhZChlLHIsdCxuLGEpe2lmKGE+PWUubm9kZS5zaXplKXJldHVybiAwO3ZhciBpPWUubm9kZS5jb250ZW50cy5zbGljZShhLGErbikscz1WLnJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpKTtyZXR1cm4gci5zZXQobmV3IFVpbnQ4QXJyYXkocyksdCksaS5zaXplfSx3cml0ZShlLHIsdCxuLGEpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoMjkpfSxsbHNlZWsoZSxyLHQpe3ZhciBuPXI7aWYodD09PTE/bis9ZS5wb3NpdGlvbjp0PT09MiYmby5pc0ZpbGUoZS5ub2RlLm1vZGUpJiYobis9ZS5ub2RlLnNpemUpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn19fSxvPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6e30sc3RyZWFtczpbXSxuZXh0SW5vZGU6MSxuYW1lVGFibGU6bnVsbCxjdXJyZW50UGF0aDoiLyIsaW5pdGlhbGl6ZWQ6ITEsaWdub3JlUGVybWlzc2lvbnM6ITAsRXJybm9FcnJvcjpjbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWU9IkVycm5vRXJyb3IiLHRoaXMuZXJybm89ZX19LGdlbmVyaWNFcnJvcnM6e30sZmlsZXN5c3RlbXM6bnVsbCxzeW5jRlNSZXF1ZXN0czowLEZTU3RyZWFtOmNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zaGFyZWQ9e319Z2V0IG9iamVjdCgpe3JldHVybiB0aGlzLm5vZGV9c2V0IG9iamVjdChlKXt0aGlzLm5vZGU9ZX1nZXQgaXNSZWFkKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfWdldCBpc1dyaXRlKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0wfWdldCBpc0FwcGVuZCgpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9Z2V0IGZsYWdzKCl7cmV0dXJuIHRoaXMuc2hhcmVkLmZsYWdzfXNldCBmbGFncyhlKXt0aGlzLnNoYXJlZC5mbGFncz1lfWdldCBwb3NpdGlvbigpe3JldHVybiB0aGlzLnNoYXJlZC5wb3NpdGlvbn1zZXQgcG9zaXRpb24oZSl7dGhpcy5zaGFyZWQucG9zaXRpb249ZX19LEZTTm9kZTpjbGFzc3tjb25zdHJ1Y3RvcihlLHIsdCxuKXtlfHwoZT10aGlzKSx0aGlzLnBhcmVudD1lLHRoaXMubW91bnQ9ZS5tb3VudCx0aGlzLm1vdW50ZWQ9bnVsbCx0aGlzLmlkPW8ubmV4dElub2RlKyssdGhpcy5uYW1lPXIsdGhpcy5tb2RlPXQsdGhpcy5ub2RlX29wcz17fSx0aGlzLnN0cmVhbV9vcHM9e30sdGhpcy5yZGV2PW4sdGhpcy5yZWFkTW9kZT0zNjUsdGhpcy53cml0ZU1vZGU9MTQ2fWdldCByZWFkKCl7cmV0dXJuKHRoaXMubW9kZSZ0aGlzLnJlYWRNb2RlKT09PXRoaXMucmVhZE1vZGV9c2V0IHJlYWQoZSl7ZT90aGlzLm1vZGV8PXRoaXMucmVhZE1vZGU6dGhpcy5tb2RlJj1+dGhpcy5yZWFkTW9kZX1nZXQgd3JpdGUoKXtyZXR1cm4odGhpcy5tb2RlJnRoaXMud3JpdGVNb2RlKT09PXRoaXMud3JpdGVNb2RlfXNldCB3cml0ZShlKXtlP3RoaXMubW9kZXw9dGhpcy53cml0ZU1vZGU6dGhpcy5tb2RlJj1+dGhpcy53cml0ZU1vZGV9Z2V0IGlzRm9sZGVyKCl7cmV0dXJuIG8uaXNEaXIodGhpcy5tb2RlKX1nZXQgaXNEZXZpY2UoKXtyZXR1cm4gby5pc0NocmRldih0aGlzLm1vZGUpfX0sbG9va3VwUGF0aChlLHI9e30pe2lmKGU9WC5yZXNvbHZlKGUpLCFlKXJldHVybntwYXRoOiIiLG5vZGU6bnVsbH07dmFyIHQ9e2ZvbGxvd19tb3VudDohMCxyZWN1cnNlX2NvdW50OjB9O2lmKHI9T2JqZWN0LmFzc2lnbih0LHIpLHIucmVjdXJzZV9jb3VudD44KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzIpO2Zvcih2YXIgbj1lLnNwbGl0KCIvIikuZmlsdGVyKG09PiEhbSksYT1vLnJvb3QsaT0iLyIscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgbD1zPT09bi5sZW5ndGgtMTtpZihsJiZyLnBhcmVudClicmVhaztpZihhPW8ubG9va3VwTm9kZShhLG5bc10pLGk9Uy5qb2luMihpLG5bc10pLG8uaXNNb3VudHBvaW50KGEpJiYoIWx8fGwmJnIuZm9sbG93X21vdW50KSYmKGE9YS5tb3VudGVkLnJvb3QpLCFsfHxyLmZvbGxvdylmb3IodmFyIHU9MDtvLmlzTGluayhhLm1vZGUpOyl7dmFyIGM9by5yZWFkbGluayhpKTtpPVgucmVzb2x2ZShTLmRpcm5hbWUoaSksYyk7dmFyIGQ9by5sb29rdXBQYXRoKGkse3JlY3Vyc2VfY291bnQ6ci5yZWN1cnNlX2NvdW50KzF9KTtpZihhPWQubm9kZSx1Kys+NDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMil9fXJldHVybntwYXRoOmksbm9kZTphfX0sZ2V0UGF0aChlKXtmb3IodmFyIHI7Oyl7aWYoby5pc1Jvb3QoZSkpe3ZhciB0PWUubW91bnQubW91bnRwb2ludDtyZXR1cm4gcj90W3QubGVuZ3RoLTFdIT09Ii8iP2Ake3R9LyR7cn1gOnQrcjp0fXI9cj9gJHtlLm5hbWV9LyR7cn1gOmUubmFtZSxlPWUucGFyZW50fX0saGFzaE5hbWUoZSxyKXtmb3IodmFyIHQ9MCxuPTA7bjxyLmxlbmd0aDtuKyspdD0odDw8NSktdCtyLmNoYXJDb2RlQXQobil8MDtyZXR1cm4oZSt0Pj4+MCklby5uYW1lVGFibGUubGVuZ3RofSxoYXNoQWRkTm9kZShlKXt2YXIgcj1vLmhhc2hOYW1lKGUucGFyZW50LmlkLGUubmFtZSk7ZS5uYW1lX25leHQ9by5uYW1lVGFibGVbcl0sby5uYW1lVGFibGVbcl09ZX0saGFzaFJlbW92ZU5vZGUoZSl7dmFyIHI9by5oYXNoTmFtZShlLnBhcmVudC5pZCxlLm5hbWUpO2lmKG8ubmFtZVRhYmxlW3JdPT09ZSlvLm5hbWVUYWJsZVtyXT1lLm5hbWVfbmV4dDtlbHNlIGZvcih2YXIgdD1vLm5hbWVUYWJsZVtyXTt0Oyl7aWYodC5uYW1lX25leHQ9PT1lKXt0Lm5hbWVfbmV4dD1lLm5hbWVfbmV4dDticmVha310PXQubmFtZV9uZXh0fX0sbG9va3VwTm9kZShlLHIpe3ZhciB0PW8ubWF5TG9va3VwKGUpO2lmKHQpdGhyb3cgbmV3IG8uRXJybm9FcnJvcih0KTtmb3IodmFyIG49by5oYXNoTmFtZShlLmlkLHIpLGE9by5uYW1lVGFibGVbbl07YTthPWEubmFtZV9uZXh0KXt2YXIgaT1hLm5hbWU7aWYoYS5wYXJlbnQuaWQ9PT1lLmlkJiZpPT09cilyZXR1cm4gYX1yZXR1cm4gby5sb29rdXAoZSxyKX0sY3JlYXRlTm9kZShlLHIsdCxuKXt2YXIgYT1uZXcgby5GU05vZGUoZSxyLHQsbik7cmV0dXJuIG8uaGFzaEFkZE5vZGUoYSksYX0sZGVzdHJveU5vZGUoZSl7by5oYXNoUmVtb3ZlTm9kZShlKX0saXNSb290KGUpe3JldHVybiBlPT09ZS5wYXJlbnR9LGlzTW91bnRwb2ludChlKXtyZXR1cm4hIWUubW91bnRlZH0saXNGaWxlKGUpe3JldHVybihlJjYxNDQwKT09PTMyNzY4fSxpc0RpcihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0xNjM4NH0saXNMaW5rKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTYwfSxpc0NocmRldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT04MTkyfSxpc0Jsa2RldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0yNDU3Nn0saXNGSUZPKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTZ9LGlzU29ja2V0KGUpe3JldHVybihlJjQ5MTUyKT09PTQ5MTUyfSxmbGFnc1RvUGVybWlzc2lvblN0cmluZyhlKXt2YXIgcj1bInIiLCJ3IiwicnciXVtlJjNdO3JldHVybiBlJjUxMiYmKHIrPSJ3Iikscn0sbm9kZVBlcm1pc3Npb25zKGUscil7cmV0dXJuIG8uaWdub3JlUGVybWlzc2lvbnM/MDpyLmluY2x1ZGVzKCJyIikmJiEoZS5tb2RlJjI5Mil8fHIuaW5jbHVkZXMoInciKSYmIShlLm1vZGUmMTQ2KXx8ci5pbmNsdWRlcygieCIpJiYhKGUubW9kZSY3Myk/MjowfSxtYXlMb29rdXAoZSl7aWYoIW8uaXNEaXIoZS5tb2RlKSlyZXR1cm4gNTQ7dmFyIHI9by5ub2RlUGVybWlzc2lvbnMoZSwieCIpO3JldHVybiByfHwoZS5ub2RlX29wcy5sb29rdXA/MDoyKX0sbWF5Q3JlYXRlKGUscil7dHJ5e3ZhciB0PW8ubG9va3VwTm9kZShlLHIpO3JldHVybiAyMH1jYXRjaHt9cmV0dXJuIG8ubm9kZVBlcm1pc3Npb25zKGUsInd4Iil9LG1heURlbGV0ZShlLHIsdCl7dmFyIG47dHJ5e249by5sb29rdXBOb2RlKGUscil9Y2F0Y2goaSl7cmV0dXJuIGkuZXJybm99dmFyIGE9by5ub2RlUGVybWlzc2lvbnMoZSwid3giKTtpZihhKXJldHVybiBhO2lmKHQpe2lmKCFvLmlzRGlyKG4ubW9kZSkpcmV0dXJuIDU0O2lmKG8uaXNSb290KG4pfHxvLmdldFBhdGgobik9PT1vLmN3ZCgpKXJldHVybiAxMH1lbHNlIGlmKG8uaXNEaXIobi5tb2RlKSlyZXR1cm4gMzE7cmV0dXJuIDB9LG1heU9wZW4oZSxyKXtyZXR1cm4gZT9vLmlzTGluayhlLm1vZGUpPzMyOm8uaXNEaXIoZS5tb2RlKSYmKG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikhPT0iciJ8fHImNTEyKT8zMTpvLm5vZGVQZXJtaXNzaW9ucyhlLG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikpOjQ0fSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQoKXtmb3IodmFyIGU9MDtlPD1vLk1BWF9PUEVOX0ZEUztlKyspaWYoIW8uc3RyZWFtc1tlXSlyZXR1cm4gZTt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMzKX0sZ2V0U3RyZWFtQ2hlY2tlZChlKXt2YXIgcj1vLmdldFN0cmVhbShlKTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO3JldHVybiByfSxnZXRTdHJlYW06ZT0+by5zdHJlYW1zW2VdLGNyZWF0ZVN0cmVhbShlLHI9LTEpe3JldHVybiBlPU9iamVjdC5hc3NpZ24obmV3IG8uRlNTdHJlYW0sZSkscj09LTEmJihyPW8ubmV4dGZkKCkpLGUuZmQ9cixvLnN0cmVhbXNbcl09ZSxlfSxjbG9zZVN0cmVhbShlKXtvLnN0cmVhbXNbZV09bnVsbH0sZHVwU3RyZWFtKGUscj0tMSl7dmFyIG4sYTt2YXIgdD1vLmNyZWF0ZVN0cmVhbShlLHIpO3JldHVybihhPShuPXQuc3RyZWFtX29wcyk9PW51bGw/dm9pZCAwOm4uZHVwKT09bnVsbHx8YS5jYWxsKG4sdCksdH0sY2hyZGV2X3N0cmVhbV9vcHM6e29wZW4oZSl7dmFyIHQsbjt2YXIgcj1vLmdldERldmljZShlLm5vZGUucmRldik7ZS5zdHJlYW1fb3BzPXIuc3RyZWFtX29wcywobj0odD1lLnN0cmVhbV9vcHMpLm9wZW4pPT1udWxsfHxuLmNhbGwodCxlKX0sbGxzZWVrKCl7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCl9fSxtYWpvcjplPT5lPj44LG1pbm9yOmU9PmUmMjU1LG1ha2VkZXY6KGUscik9PmU8PDh8cixyZWdpc3RlckRldmljZShlLHIpe28uZGV2aWNlc1tlXT17c3RyZWFtX29wczpyfX0sZ2V0RGV2aWNlOmU9Pm8uZGV2aWNlc1tlXSxnZXRNb3VudHMoZSl7Zm9yKHZhciByPVtdLHQ9W2VdO3QubGVuZ3RoOyl7dmFyIG49dC5wb3AoKTtyLnB1c2gobiksdC5wdXNoKC4uLm4ubW91bnRzKX1yZXR1cm4gcn0sc3luY2ZzKGUscil7dHlwZW9mIGU9PSJmdW5jdGlvbiImJihyPWUsZT0hMSksby5zeW5jRlNSZXF1ZXN0cysrLG8uc3luY0ZTUmVxdWVzdHM+MSYmZWUoYHdhcm5pbmc6ICR7by5zeW5jRlNSZXF1ZXN0c30gRlMuc3luY2ZzIG9wZXJhdGlvbnMgaW4gZmxpZ2h0IGF0IG9uY2UsIHByb2JhYmx5IGp1c3QgZG9pbmcgZXh0cmEgd29ya2ApO3ZhciB0PW8uZ2V0TW91bnRzKG8ucm9vdC5tb3VudCksbj0wO2Z1bmN0aW9uIGEocyl7cmV0dXJuIG8uc3luY0ZTUmVxdWVzdHMtLSxyKHMpfWZ1bmN0aW9uIGkocyl7aWYocylyZXR1cm4gaS5lcnJvcmVkP3ZvaWQgMDooaS5lcnJvcmVkPSEwLGEocykpOysrbj49dC5sZW5ndGgmJmEobnVsbCl9dC5mb3JFYWNoKHM9PntpZighcy50eXBlLnN5bmNmcylyZXR1cm4gaShudWxsKTtzLnR5cGUuc3luY2ZzKHMsZSxpKX0pfSxtb3VudChlLHIsdCl7dmFyIG49dD09PSIvIixhPSF0LGk7aWYobiYmby5yb290KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFuJiYhYSl7dmFyIHM9by5sb29rdXBQYXRoKHQse2ZvbGxvd19tb3VudDohMX0pO2lmKHQ9cy5wYXRoLGk9cy5ub2RlLG8uaXNNb3VudHBvaW50KGkpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFvLmlzRGlyKGkubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCl9dmFyIGw9e3R5cGU6ZSxvcHRzOnIsbW91bnRwb2ludDp0LG1vdW50czpbXX0sdT1lLm1vdW50KGwpO3JldHVybiB1Lm1vdW50PWwsbC5yb290PXUsbj9vLnJvb3Q9dTppJiYoaS5tb3VudGVkPWwsaS5tb3VudCYmaS5tb3VudC5tb3VudHMucHVzaChsKSksdX0sdW5tb3VudChlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93X21vdW50OiExfSk7aWYoIW8uaXNNb3VudHBvaW50KHIubm9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7dmFyIHQ9ci5ub2RlLG49dC5tb3VudGVkLGE9by5nZXRNb3VudHMobik7T2JqZWN0LmtleXMoby5uYW1lVGFibGUpLmZvckVhY2gocz0+e2Zvcih2YXIgbD1vLm5hbWVUYWJsZVtzXTtsOyl7dmFyIHU9bC5uYW1lX25leHQ7YS5pbmNsdWRlcyhsLm1vdW50KSYmby5kZXN0cm95Tm9kZShsKSxsPXV9fSksdC5tb3VudGVkPW51bGw7dmFyIGk9dC5tb3VudC5tb3VudHMuaW5kZXhPZihuKTt0Lm1vdW50Lm1vdW50cy5zcGxpY2UoaSwxKX0sbG9va3VwKGUscil7cmV0dXJuIGUubm9kZV9vcHMubG9va3VwKGUscil9LG1rbm9kKGUscix0KXt2YXIgbj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksYT1uLm5vZGUsaT1TLmJhc2VuYW1lKGUpO2lmKCFpfHxpPT09Ii4ifHxpPT09Ii4uIil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgcz1vLm1heUNyZWF0ZShhLGkpO2lmKHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihzKTtpZighYS5ub2RlX29wcy5ta25vZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gYS5ub2RlX29wcy5ta25vZChhLGkscix0KX0sY3JlYXRlKGUscil7cmV0dXJuIHI9ciE9PXZvaWQgMD9yOjQzOCxyJj00MDk1LHJ8PTMyNzY4LG8ubWtub2QoZSxyLDApfSxta2RpcihlLHIpe3JldHVybiByPXIhPT12b2lkIDA/cjo1MTEsciY9MTAyMyxyfD0xNjM4NCxvLm1rbm9kKGUsciwwKX0sbWtkaXJUcmVlKGUscil7Zm9yKHZhciB0PWUuc3BsaXQoIi8iKSxuPSIiLGE9MDthPHQubGVuZ3RoOysrYSlpZih0W2FdKXtuKz0iLyIrdFthXTt0cnl7by5ta2RpcihuLHIpfWNhdGNoKGkpe2lmKGkuZXJybm8hPTIwKXRocm93IGl9fX0sbWtkZXYoZSxyLHQpe3JldHVybiB0eXBlb2YgdD4idSImJih0PXIscj00MzgpLHJ8PTgxOTIsby5ta25vZChlLHIsdCl9LHN5bWxpbmsoZSxyKXtpZighWC5yZXNvbHZlKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciB0PW8ubG9va3VwUGF0aChyLHtwYXJlbnQ6ITB9KSxuPXQubm9kZTtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTt2YXIgYT1TLmJhc2VuYW1lKHIpLGk9by5tYXlDcmVhdGUobixhKTtpZihpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoaSk7aWYoIW4ubm9kZV9vcHMuc3ltbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5zeW1saW5rKG4sYSxlKX0scmVuYW1lKGUscil7dmFyIHQ9Uy5kaXJuYW1lKGUpLG49Uy5kaXJuYW1lKHIpLGE9Uy5iYXNlbmFtZShlKSxpPVMuYmFzZW5hbWUocikscyxsLHU7aWYocz1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksbD1zLm5vZGUscz1vLmxvb2t1cFBhdGgocix7cGFyZW50OiEwfSksdT1zLm5vZGUsIWx8fCF1KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO2lmKGwubW91bnQhPT11Lm1vdW50KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzUpO3ZhciBjPW8ubG9va3VwTm9kZShsLGEpLGQ9WC5yZWxhdGl2ZShlLG4pO2lmKGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKGQ9WC5yZWxhdGl2ZShyLHQpLGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTUpO3ZhciBtO3RyeXttPW8ubG9va3VwTm9kZSh1LGkpfWNhdGNoe31pZihjIT09bSl7dmFyIGg9by5pc0RpcihjLm1vZGUpLHA9by5tYXlEZWxldGUobCxhLGgpO2lmKHApdGhyb3cgbmV3IG8uRXJybm9FcnJvcihwKTtpZihwPW0/by5tYXlEZWxldGUodSxpLGgpOm8ubWF5Q3JlYXRlKHUsaSkscCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO2lmKCFsLm5vZGVfb3BzLnJlbmFtZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChjKXx8bSYmby5pc01vdW50cG9pbnQobSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigxMCk7aWYodSE9PWwmJihwPW8ubm9kZVBlcm1pc3Npb25zKGwsInciKSxwKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO28uaGFzaFJlbW92ZU5vZGUoYyk7dHJ5e2wubm9kZV9vcHMucmVuYW1lKGMsdSxpKX1jYXRjaCh3KXt0aHJvdyB3fWZpbmFsbHl7by5oYXNoQWRkTm9kZShjKX19fSxybWRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksdD1yLm5vZGUsbj1TLmJhc2VuYW1lKGUpLGE9by5sb29rdXBOb2RlKHQsbiksaT1vLm1heURlbGV0ZSh0LG4sITApO2lmKGkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihpKTtpZighdC5ub2RlX29wcy5ybWRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnJtZGlyKHQsbiksby5kZXN0cm95Tm9kZShhKX0scmVhZGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSksdD1yLm5vZGU7aWYoIXQubm9kZV9vcHMucmVhZGRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU0KTtyZXR1cm4gdC5ub2RlX29wcy5yZWFkZGlyKHQpfSx1bmxpbmsoZSl7dmFyIHI9by5sb29rdXBQYXRoKGUse3BhcmVudDohMH0pLHQ9ci5ub2RlO2lmKCF0KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciBuPVMuYmFzZW5hbWUoZSksYT1vLmxvb2t1cE5vZGUodCxuKSxpPW8ubWF5RGVsZXRlKHQsbiwhMSk7aWYoaSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGkpO2lmKCF0Lm5vZGVfb3BzLnVubGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnVubGluayh0LG4pLG8uZGVzdHJveU5vZGUoYSl9LHJlYWRsaW5rKGUpe3ZhciByPW8ubG9va3VwUGF0aChlKSx0PXIubm9kZTtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighdC5ub2RlX29wcy5yZWFkbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gWC5yZXNvbHZlKG8uZ2V0UGF0aCh0LnBhcmVudCksdC5ub2RlX29wcy5yZWFkbGluayh0KSl9LHN0YXQoZSxyKXt2YXIgdD1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiFyfSksbj10Lm5vZGU7aWYoIW4pdGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCk7aWYoIW4ubm9kZV9vcHMuZ2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5nZXRhdHRyKG4pfSxsc3RhdChlKXtyZXR1cm4gby5zdGF0KGUsITApfSxjaG1vZChlLHIsdCl7dmFyIG47aWYodHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgYT1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiF0fSk7bj1hLm5vZGV9ZWxzZSBuPWU7aWYoIW4ubm9kZV9vcHMuc2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtuLm5vZGVfb3BzLnNldGF0dHIobix7bW9kZTpyJjQwOTV8bi5tb2RlJi00MDk2LHRpbWVzdGFtcDpEYXRlLm5vdygpfSl9LGxjaG1vZChlLHIpe28uY2htb2QoZSxyLCEwKX0sZmNobW9kKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO28uY2htb2QodC5ub2RlLHIpfSxjaG93bihlLHIsdCxuKXt2YXIgYTtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBpPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IW59KTthPWkubm9kZX1lbHNlIGE9ZTtpZighYS5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Eubm9kZV9vcHMuc2V0YXR0cihhLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxsY2hvd24oZSxyLHQpe28uY2hvd24oZSxyLHQsITApfSxmY2hvd24oZSxyLHQpe3ZhciBuPW8uZ2V0U3RyZWFtQ2hlY2tlZChlKTtvLmNob3duKG4ubm9kZSxyLHQpfSx0cnVuY2F0ZShlLHIpe2lmKHI8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgdDtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KTt0PW4ubm9kZX1lbHNlIHQ9ZTtpZighdC5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2lmKG8uaXNEaXIodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMxKTtpZighby5pc0ZpbGUodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgYT1vLm5vZGVQZXJtaXNzaW9ucyh0LCJ3Iik7aWYoYSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGEpO3Qubm9kZV9vcHMuc2V0YXR0cih0LHtzaXplOnIsdGltZXN0YW1wOkRhdGUubm93KCl9KX0sZnRydW5jYXRlKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO2lmKCEodC5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtvLnRydW5jYXRlKHQubm9kZSxyKX0sdXRpbWUoZSxyLHQpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KSxhPW4ubm9kZTthLm5vZGVfb3BzLnNldGF0dHIoYSx7dGltZXN0YW1wOk1hdGgubWF4KHIsdCl9KX0sb3BlbihlLHIsdCl7aWYoZT09PSIiKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3I9dHlwZW9mIHI9PSJzdHJpbmciP1V0KHIpOnIsciY2ND8odD10eXBlb2YgdD4idSI/NDM4OnQsdD10JjQwOTV8MzI3NjgpOnQ9MDt2YXIgbjtpZih0eXBlb2YgZT09Im9iamVjdCIpbj1lO2Vsc2V7ZT1TLm5vcm1hbGl6ZShlKTt0cnl7dmFyIGE9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohKHImMTMxMDcyKX0pO249YS5ub2RlfWNhdGNoe319dmFyIGk9ITE7aWYociY2NClpZihuKXtpZihyJjEyOCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIwKX1lbHNlIG49by5ta25vZChlLHQsMCksaT0hMDtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZihvLmlzQ2hyZGV2KG4ubW9kZSkmJihyJj0tNTEzKSxyJjY1NTM2JiYhby5pc0RpcihuLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTQpO2lmKCFpKXt2YXIgcz1vLm1heU9wZW4obixyKTtpZihzKXRocm93IG5ldyBvLkVycm5vRXJyb3Iocyl9ciY1MTImJiFpJiZvLnRydW5jYXRlKG4sMCksciY9LTEzMTcxMzt2YXIgbD1vLmNyZWF0ZVN0cmVhbSh7bm9kZTpuLHBhdGg6by5nZXRQYXRoKG4pLGZsYWdzOnIsc2Vla2FibGU6ITAscG9zaXRpb246MCxzdHJlYW1fb3BzOm4uc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjohMX0pO3JldHVybiBsLnN0cmVhbV9vcHMub3BlbiYmbC5zdHJlYW1fb3BzLm9wZW4obCksZi5sb2dSZWFkRmlsZXMmJiEociYxKSYmKG8ucmVhZEZpbGVzfHwoby5yZWFkRmlsZXM9e30pLGUgaW4gby5yZWFkRmlsZXN8fChvLnJlYWRGaWxlc1tlXT0xKSksbH0sY2xvc2UoZSl7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2UuZ2V0ZGVudHMmJihlLmdldGRlbnRzPW51bGwpO3RyeXtlLnN0cmVhbV9vcHMuY2xvc2UmJmUuc3RyZWFtX29wcy5jbG9zZShlKX1jYXRjaChyKXt0aHJvdyByfWZpbmFsbHl7by5jbG9zZVN0cmVhbShlLmZkKX1lLmZkPW51bGx9LGlzQ2xvc2VkKGUpe3JldHVybiBlLmZkPT09bnVsbH0sbGxzZWVrKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIWUuc2Vla2FibGV8fCFlLnN0cmVhbV9vcHMubGxzZWVrKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzApO2lmKHQhPTAmJnQhPTEmJnQhPTIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7cmV0dXJuIGUucG9zaXRpb249ZS5zdHJlYW1fb3BzLmxsc2VlayhlLHIsdCksZS51bmdvdHRlbj1bXSxlLnBvc2l0aW9ufSxyZWFkKGUscix0LG4sYSl7aWYobjwwfHxhPDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKG8uaXNEaXIoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzEpO2lmKCFlLnN0cmVhbV9vcHMucmVhZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgaT10eXBlb2YgYTwidSI7aWYoIWkpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIHM9ZS5zdHJlYW1fb3BzLnJlYWQoZSxyLHQsbixhKTtyZXR1cm4gaXx8KGUucG9zaXRpb24rPXMpLHN9LHdyaXRlKGUscix0LG4sYSxpKXtpZihuPDB8fGE8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIShlLmZsYWdzJjIwOTcxNTUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoby5pc0RpcihlLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMSk7aWYoIWUuc3RyZWFtX29wcy53cml0ZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtlLnNlZWthYmxlJiZlLmZsYWdzJjEwMjQmJm8ubGxzZWVrKGUsMCwyKTt2YXIgcz10eXBlb2YgYTwidSI7aWYoIXMpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIGw9ZS5zdHJlYW1fb3BzLndyaXRlKGUscix0LG4sYSxpKTtyZXR1cm4gc3x8KGUucG9zaXRpb24rPWwpLGx9LGFsbG9jYXRlKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYocjwwfHx0PD0wKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKCEoZS5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKCFvLmlzRmlsZShlLm5vZGUubW9kZSkmJiFvLmlzRGlyKGUubm9kZS5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtpZighZS5zdHJlYW1fb3BzLmFsbG9jYXRlKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTM4KTtlLnN0cmVhbV9vcHMuYWxsb2NhdGUoZSxyLHQpfSxtbWFwKGUscix0LG4sYSl7aWYobiYyJiYhKGEmMikmJihlLmZsYWdzJjIwOTcxNTUpIT09Mil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKCFlLnN0cmVhbV9vcHMubW1hcCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtyZXR1cm4gZS5zdHJlYW1fb3BzLm1tYXAoZSxyLHQsbixhKX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gZS5zdHJlYW1fb3BzLm1zeW5jP2Uuc3RyZWFtX29wcy5tc3luYyhlLHIsdCxuLGEpOjB9LGlvY3RsKGUscix0KXtpZighZS5zdHJlYW1fb3BzLmlvY3RsKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTkpO3JldHVybiBlLnN0cmVhbV9vcHMuaW9jdGwoZSxyLHQpfSxyZWFkRmlsZShlLHI9e30pe2lmKHIuZmxhZ3M9ci5mbGFnc3x8MCxyLmVuY29kaW5nPXIuZW5jb2Rpbmd8fCJiaW5hcnkiLHIuZW5jb2RpbmchPT0idXRmOCImJnIuZW5jb2RpbmchPT0iYmluYXJ5Iil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZW5jb2RpbmcgdHlwZSAiJHtyLmVuY29kaW5nfSJgKTt2YXIgdCxuPW8ub3BlbihlLHIuZmxhZ3MpLGE9by5zdGF0KGUpLGk9YS5zaXplLHM9bmV3IFVpbnQ4QXJyYXkoaSk7cmV0dXJuIG8ucmVhZChuLHMsMCxpLDApLHIuZW5jb2Rpbmc9PT0idXRmOCI/dD1jZShzLDApOnIuZW5jb2Rpbmc9PT0iYmluYXJ5IiYmKHQ9cyksby5jbG9zZShuKSx0fSx3cml0ZUZpbGUoZSxyLHQ9e30pe3QuZmxhZ3M9dC5mbGFnc3x8NTc3O3ZhciBuPW8ub3BlbihlLHQuZmxhZ3MsdC5tb2RlKTtpZih0eXBlb2Ygcj09InN0cmluZyIpe3ZhciBhPW5ldyBVaW50OEFycmF5KFplKHIpKzEpLGk9UWUocixhLDAsYS5sZW5ndGgpO28ud3JpdGUobixhLDAsaSx2b2lkIDAsdC5jYW5Pd24pfWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKW8ud3JpdGUobixyLDAsci5ieXRlTGVuZ3RoLHZvaWQgMCx0LmNhbk93bik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpO28uY2xvc2Uobil9LGN3ZDooKT0+by5jdXJyZW50UGF0aCxjaGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSk7aWYoci5ub2RlPT09bnVsbCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighby5pc0RpcihyLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCk7dmFyIHQ9by5ub2RlUGVybWlzc2lvbnMoci5ub2RlLCJ4Iik7aWYodCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHQpO28uY3VycmVudFBhdGg9ci5wYXRofSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKXtvLm1rZGlyKCIvdG1wIiksby5ta2RpcigiL2hvbWUiKSxvLm1rZGlyKCIvaG9tZS93ZWJfdXNlciIpfSxjcmVhdGVEZWZhdWx0RGV2aWNlcygpe28ubWtkaXIoIi9kZXYiKSxvLnJlZ2lzdGVyRGV2aWNlKG8ubWFrZWRldigxLDMpLHtyZWFkOigpPT4wLHdyaXRlOihuLGEsaSxzLGwpPT5zfSksby5ta2RldigiL2Rldi9udWxsIixvLm1ha2VkZXYoMSwzKSksbGUucmVnaXN0ZXIoby5tYWtlZGV2KDUsMCksbGUuZGVmYXVsdF90dHlfb3BzKSxsZS5yZWdpc3RlcihvLm1ha2VkZXYoNiwwKSxsZS5kZWZhdWx0X3R0eTFfb3BzKSxvLm1rZGV2KCIvZGV2L3R0eSIsby5tYWtlZGV2KDUsMCkpLG8ubWtkZXYoIi9kZXYvdHR5MSIsby5tYWtlZGV2KDYsMCkpO3ZhciBlPW5ldyBVaW50OEFycmF5KDEwMjQpLHI9MCx0PSgpPT4ocj09PTAmJihyPUZyKGUpLmJ5dGVMZW5ndGgpLGVbLS1yXSk7by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJyYW5kb20iLHQpLG8uY3JlYXRlRGV2aWNlKCIvZGV2IiwidXJhbmRvbSIsdCksby5ta2RpcigiL2Rldi9zaG0iKSxvLm1rZGlyKCIvZGV2L3NobS90bXAiKX0sY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCl7by5ta2RpcigiL3Byb2MiKTt2YXIgZT1vLm1rZGlyKCIvcHJvYy9zZWxmIik7by5ta2RpcigiL3Byb2Mvc2VsZi9mZCIpLG8ubW91bnQoe21vdW50KCl7dmFyIHI9by5jcmVhdGVOb2RlKGUsImZkIiwxNjg5NSw3Myk7cmV0dXJuIHIubm9kZV9vcHM9e2xvb2t1cCh0LG4pe3ZhciBhPStuLGk9by5nZXRTdHJlYW1DaGVja2VkKGEpLHM9e3BhcmVudDpudWxsLG1vdW50Onttb3VudHBvaW50OiJmYWtlIn0sbm9kZV9vcHM6e3JlYWRsaW5rOigpPT5pLnBhdGh9fTtyZXR1cm4gcy5wYXJlbnQ9cyxzfX0scn19LHt9LCIvcHJvYy9zZWxmL2ZkIil9LGNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpe2Yuc3RkaW4/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRpbiIsZi5zdGRpbik6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKSxmLnN0ZG91dD9vLmNyZWF0ZURldmljZSgiL2RldiIsInN0ZG91dCIsbnVsbCxmLnN0ZG91dCk6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0IiksZi5zdGRlcnI/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRlcnIiLG51bGwsZi5zdGRlcnIpOm8uc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKSxvLm9wZW4oIi9kZXYvc3RkaW4iLDApLG8ub3BlbigiL2Rldi9zdGRvdXQiLDEpLG8ub3BlbigiL2Rldi9zdGRlcnIiLDEpfSxzdGF0aWNJbml0KCl7WzQ0XS5mb3JFYWNoKGU9PntvLmdlbmVyaWNFcnJvcnNbZV09bmV3IG8uRXJybm9FcnJvcihlKSxvLmdlbmVyaWNFcnJvcnNbZV0uc3RhY2s9IjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4ifSksby5uYW1lVGFibGU9bmV3IEFycmF5KDQwOTYpLG8ubW91bnQoYix7fSwiLyIpLG8uY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCksby5jcmVhdGVEZWZhdWx0RGV2aWNlcygpLG8uY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCksby5maWxlc3lzdGVtcz17TUVNRlM6YixXT1JLRVJGUzpWfX0saW5pdChlLHIsdCl7by5pbml0LmluaXRpYWxpemVkPSEwLGYuc3RkaW49ZXx8Zi5zdGRpbixmLnN0ZG91dD1yfHxmLnN0ZG91dCxmLnN0ZGVycj10fHxmLnN0ZGVycixvLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpfSxxdWl0KCl7by5pbml0LmluaXRpYWxpemVkPSExO2Zvcih2YXIgZT0wO2U8by5zdHJlYW1zLmxlbmd0aDtlKyspe3ZhciByPW8uc3RyZWFtc1tlXTtyJiZvLmNsb3NlKHIpfX0sZmluZE9iamVjdChlLHIpe3ZhciB0PW8uYW5hbHl6ZVBhdGgoZSxyKTtyZXR1cm4gdC5leGlzdHM/dC5vYmplY3Q6bnVsbH0sYW5hbHl6ZVBhdGgoZSxyKXt0cnl7dmFyIHQ9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohcn0pO2U9dC5wYXRofWNhdGNoe312YXIgbj17aXNSb290OiExLGV4aXN0czohMSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOiExLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciB0PW8ubG9va3VwUGF0aChlLHtwYXJlbnQ6ITB9KTtuLnBhcmVudEV4aXN0cz0hMCxuLnBhcmVudFBhdGg9dC5wYXRoLG4ucGFyZW50T2JqZWN0PXQubm9kZSxuLm5hbWU9Uy5iYXNlbmFtZShlKSx0PW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IXJ9KSxuLmV4aXN0cz0hMCxuLnBhdGg9dC5wYXRoLG4ub2JqZWN0PXQubm9kZSxuLm5hbWU9dC5ub2RlLm5hbWUsbi5pc1Jvb3Q9dC5wYXRoPT09Ii8ifWNhdGNoKGEpe24uZXJyb3I9YS5lcnJub31yZXR1cm4gbn0sY3JlYXRlUGF0aChlLHIsdCxuKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9lOm8uZ2V0UGF0aChlKTtmb3IodmFyIGE9ci5zcGxpdCgiLyIpLnJldmVyc2UoKTthLmxlbmd0aDspe3ZhciBpPWEucG9wKCk7aWYoaSl7dmFyIHM9Uy5qb2luMihlLGkpO3RyeXtvLm1rZGlyKHMpfWNhdGNoe31lPXN9fXJldHVybiBzfSxjcmVhdGVGaWxlKGUscix0LG4sYSl7dmFyIGk9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscikscz1lcihuLGEpO3JldHVybiBvLmNyZWF0ZShpLHMpfSxjcmVhdGVEYXRhRmlsZShlLHIsdCxuLGEsaSl7dmFyIHM9cjtlJiYoZT10eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscz1yP1Muam9pbjIoZSxyKTplKTt2YXIgbD1lcihuLGEpLHU9by5jcmVhdGUocyxsKTtpZih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2Zvcih2YXIgYz1uZXcgQXJyYXkodC5sZW5ndGgpLGQ9MCxtPXQubGVuZ3RoO2Q8bTsrK2QpY1tkXT10LmNoYXJDb2RlQXQoZCk7dD1jfW8uY2htb2QodSxsfDE0Nik7dmFyIGg9by5vcGVuKHUsNTc3KTtvLndyaXRlKGgsdCwwLHQubGVuZ3RoLDAsaSksby5jbG9zZShoKSxvLmNobW9kKHUsbCl9fSxjcmVhdGVEZXZpY2UoZSxyLHQsbil7dmFyIGE9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSksciksaT1lcighIXQsISFuKTtvLmNyZWF0ZURldmljZS5tYWpvcnx8KG8uY3JlYXRlRGV2aWNlLm1ham9yPTY0KTt2YXIgcz1vLm1ha2VkZXYoby5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtyZXR1cm4gby5yZWdpc3RlckRldmljZShzLHtvcGVuKGwpe2wuc2Vla2FibGU9ITF9LGNsb3NlKGwpe3ZhciB1Oyh1PW49PW51bGw/dm9pZCAwOm4uYnVmZmVyKSE9bnVsbCYmdS5sZW5ndGgmJm4oMTApfSxyZWFkKGwsdSxjLGQsbSl7Zm9yKHZhciBoPTAscD0wO3A8ZDtwKyspe3ZhciB3O3RyeXt3PXQoKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1pZih3PT09dm9pZCAwJiZoPT09MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYpO2lmKHc9PW51bGwpYnJlYWs7aCsrLHVbYytwXT13fXJldHVybiBoJiYobC5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpKSxofSx3cml0ZShsLHUsYyxkLG0pe2Zvcih2YXIgaD0wO2g8ZDtoKyspdHJ5e24odVtjK2hdKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1yZXR1cm4gZCYmKGwubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaH19KSxvLm1rZGV2KGEsaSxzKX0sZm9yY2VMb2FkRmlsZShlKXtpZihlLmlzRGV2aWNlfHxlLmlzRm9sZGVyfHxlLmxpbmt8fGUuY29udGVudHMpcmV0dXJuITA7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpO2lmKFllKXRyeXtlLmNvbnRlbnRzPVNlKFllKGUudXJsKSwhMCksZS51c2VkQnl0ZXM9ZS5jb250ZW50cy5sZW5ndGh9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfSxjcmVhdGVMYXp5RmlsZShlLHIsdCxuLGEpe2NsYXNzIGl7Y29uc3RydWN0b3IoKXt0aGlzLmxlbmd0aEtub3duPSExLHRoaXMuY2h1bmtzPVtdfWdldChwKXtpZighKHA+dGhpcy5sZW5ndGgtMXx8cDwwKSl7dmFyIHc9cCV0aGlzLmNodW5rU2l6ZSxEPXAvdGhpcy5jaHVua1NpemV8MDtyZXR1cm4gdGhpcy5nZXR0ZXIoRClbd119fXNldERhdGFHZXR0ZXIocCl7dGhpcy5nZXR0ZXI9cH1jYWNoZUxlbmd0aCgpe3ZhciBwPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihwLm9wZW4oIkhFQUQiLHQsITEpLHAuc2VuZChudWxsKSwhKHAuc3RhdHVzPj0yMDAmJnAuc3RhdHVzPDMwMHx8cC5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK3Auc3RhdHVzKTt2YXIgdz1OdW1iZXIocC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1sZW5ndGgiKSksRCxNPShEPXAuZ2V0UmVzcG9uc2VIZWFkZXIoIkFjY2VwdC1SYW5nZXMiKSkmJkQ9PT0iYnl0ZXMiLEY9KEQ9cC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpKSYmRD09PSJnemlwIix2PTEwMjQqMTAyNDtNfHwodj13KTt2YXIgXz0oVCxCKT0+e2lmKFQ+Qil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcmFuZ2UgKCIrVCsiLCAiK0IrIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKEI+dy0xKXRocm93IG5ldyBFcnJvcigib25seSAiK3crIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhIik7dmFyIE89bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKE8ub3BlbigiR0VUIix0LCExKSx3IT09diYmTy5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsImJ5dGVzPSIrVCsiLSIrQiksTy5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixPLm92ZXJyaWRlTWltZVR5cGUmJk8ub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpLE8uc2VuZChudWxsKSwhKE8uc3RhdHVzPj0yMDAmJk8uc3RhdHVzPDMwMHx8Ty5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK08uc3RhdHVzKTtyZXR1cm4gTy5yZXNwb25zZSE9PXZvaWQgMD9uZXcgVWludDhBcnJheShPLnJlc3BvbnNlfHxbXSk6U2UoTy5yZXNwb25zZVRleHR8fCIiLCEwKX0sTD10aGlzO0wuc2V0RGF0YUdldHRlcihUPT57dmFyIEI9VCp2LE89KFQrMSkqdi0xO2lmKE89TWF0aC5taW4oTyx3LTEpLHR5cGVvZiBMLmNodW5rc1tUXT4idSImJihMLmNodW5rc1tUXT1fKEIsTykpLHR5cGVvZiBMLmNodW5rc1tUXT4idSIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIEwuY2h1bmtzW1RdfSksKEZ8fCF3KSYmKHY9dz0xLHc9dGhpcy5nZXR0ZXIoMCkubGVuZ3RoLHY9dyxxZSgiTGF6eUZpbGVzIG9uIGd6aXAgZm9yY2VzIGRvd25sb2FkIG9mIHRoZSB3aG9sZSBmaWxlIHdoZW4gbGVuZ3RoIGlzIGFjY2Vzc2VkIikpLHRoaXMuX2xlbmd0aD13LHRoaXMuX2NodW5rU2l6ZT12LHRoaXMubGVuZ3RoS25vd249ITB9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmxlbmd0aEtub3dufHx0aGlzLmNhY2hlTGVuZ3RoKCksdGhpcy5fbGVuZ3RofWdldCBjaHVua1NpemUoKXtyZXR1cm4gdGhpcy5sZW5ndGhLbm93bnx8dGhpcy5jYWNoZUxlbmd0aCgpLHRoaXMuX2NodW5rU2l6ZX19aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil2YXIgcz1uZXcgaSxsPXtpc0RldmljZTohMSxjb250ZW50czpzfTtlbHNlIHZhciBsPXtpc0RldmljZTohMSx1cmw6dH07dmFyIHU9by5jcmVhdGVGaWxlKGUscixsLG4sYSk7bC5jb250ZW50cz91LmNvbnRlbnRzPWwuY29udGVudHM6bC51cmwmJih1LmNvbnRlbnRzPW51bGwsdS51cmw9bC51cmwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHUse3VzZWRCeXRlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RofX19KTt2YXIgYz17fSxkPU9iamVjdC5rZXlzKHUuc3RyZWFtX29wcyk7ZC5mb3JFYWNoKGg9Pnt2YXIgcD11LnN0cmVhbV9vcHNbaF07Y1toXT0oLi4udyk9PihvLmZvcmNlTG9hZEZpbGUodSkscCguLi53KSl9KTtmdW5jdGlvbiBtKGgscCx3LEQsTSl7dmFyIEY9aC5ub2RlLmNvbnRlbnRzO2lmKE0+PUYubGVuZ3RoKXJldHVybiAwO3ZhciB2PU1hdGgubWluKEYubGVuZ3RoLU0sRCk7aWYoRi5zbGljZSlmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GW00rX107ZWxzZSBmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GLmdldChNK18pO3JldHVybiB2fXJldHVybiBjLnJlYWQ9KGgscCx3LEQsTSk9PihvLmZvcmNlTG9hZEZpbGUodSksbShoLHAsdyxELE0pKSxjLm1tYXA9KGgscCx3LEQsTSk9PntvLmZvcmNlTG9hZEZpbGUodSk7dmFyIEY9VHIoKTtpZighRil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ4KTtyZXR1cm4gbShoLEksRixwLHcpLHtwdHI6RixhbGxvY2F0ZWQ6ITB9fSx1LnN0cmVhbV9vcHM9Yyx1fX0sUD17REVGQVVMVF9QT0xMTUFTSzo1LGNhbGN1bGF0ZUF0KGUscix0KXtpZihTLmlzQWJzKHIpKXJldHVybiByO3ZhciBuO2lmKGU9PT0tMTAwKW49by5jd2QoKTtlbHNle3ZhciBhPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO249YS5wYXRofWlmKHIubGVuZ3RoPT0wKXtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtyZXR1cm4gbn1yZXR1cm4gUy5qb2luMihuLHIpfSxkb1N0YXQoZSxyLHQpe3ZhciBuPWUocik7Z1t0Pj4yXT1uLmRldixnW3QrND4+Ml09bi5tb2RlLEFbdCs4Pj4yXT1uLm5saW5rLGdbdCsxMj4+Ml09bi51aWQsZ1t0KzE2Pj4yXT1uLmdpZCxnW3QrMjA+PjJdPW4ucmRldiwkPVtuLnNpemU+Pj4wLCh5PW4uc2l6ZSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCsyND4+Ml09JFswXSxnW3QrMjg+PjJdPSRbMV0sZ1t0KzMyPj4yXT00MDk2LGdbdCszNj4+Ml09bi5ibG9ja3M7dmFyIGE9bi5hdGltZS5nZXRUaW1lKCksaT1uLm10aW1lLmdldFRpbWUoKSxzPW4uY3RpbWUuZ2V0VGltZSgpO3JldHVybiAkPVtNYXRoLmZsb29yKGEvMWUzKT4+PjAsKHk9TWF0aC5mbG9vcihhLzFlMyksK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrNDA+PjJdPSRbMF0sZ1t0KzQ0Pj4yXT0kWzFdLEFbdCs0OD4+Ml09YSUxZTMqMWUzLCQ9W01hdGguZmxvb3IoaS8xZTMpPj4+MCwoeT1NYXRoLmZsb29yKGkvMWUzKSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCs1Nj4+Ml09JFswXSxnW3QrNjA+PjJdPSRbMV0sQVt0KzY0Pj4yXT1pJTFlMyoxZTMsJD1bTWF0aC5mbG9vcihzLzFlMyk+Pj4wLCh5PU1hdGguZmxvb3Iocy8xZTMpLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1t0KzcyPj4yXT0kWzBdLGdbdCs3Nj4+Ml09JFsxXSxBW3QrODA+PjJdPXMlMWUzKjFlMywkPVtuLmlubz4+PjAsKHk9bi5pbm8sK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrODg+PjJdPSRbMF0sZ1t0KzkyPj4yXT0kWzFdLDB9LGRvTXN5bmMoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoci5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO2lmKG4mMilyZXR1cm4gMDt2YXIgaT14LnNsaWNlKGUsZSt0KTtvLm1zeW5jKHIsaSxhLHQsbil9LGdldFN0cmVhbUZyb21GRChlKXt2YXIgcj1vLmdldFN0cmVhbUNoZWNrZWQoZSk7cmV0dXJuIHJ9LHZhcmFyZ3M6dm9pZCAwLGdldFN0cihlKXt2YXIgcj1zZShlKTtyZXR1cm4gcn19O2Z1bmN0aW9uIGp0KGUscix0LG4pe3RyeXtpZihyPVAuZ2V0U3RyKHIpLHI9UC5jYWxjdWxhdGVBdChlLHIpLHQmLTgpcmV0dXJuLTI4O3ZhciBhPW8ubG9va3VwUGF0aChyLHtmb2xsb3c6ITB9KSxpPWEubm9kZTtpZighaSlyZXR1cm4tNDQ7dmFyIHM9IiI7cmV0dXJuIHQmNCYmKHMrPSJyIiksdCYyJiYocys9InciKSx0JjEmJihzKz0ieCIpLHMmJm8ubm9kZVBlcm1pc3Npb25zKGkscyk/LTI6MH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybi1sLmVycm5vfX1mdW5jdGlvbiBNZSgpe3ZhciBlPWdbK1AudmFyYXJncz4+Ml07cmV0dXJuIFAudmFyYXJncys9NCxlfXZhciBkZT1NZTtmdW5jdGlvbiB6dChlLHIsdCl7UC52YXJhcmdzPXQ7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3N3aXRjaChyKXtjYXNlIDA6e3ZhciBhPU1lKCk7aWYoYTwwKXJldHVybi0yODtmb3IoO28uc3RyZWFtc1thXTspYSsrO3ZhciBpO3JldHVybiBpPW8uZHVwU3RyZWFtKG4sYSksaS5mZH1jYXNlIDE6Y2FzZSAyOnJldHVybiAwO2Nhc2UgMzpyZXR1cm4gbi5mbGFncztjYXNlIDQ6e3ZhciBhPU1lKCk7cmV0dXJuIG4uZmxhZ3N8PWEsMH1jYXNlIDEyOnt2YXIgYT1kZSgpLHM9MDtyZXR1cm4gWVthK3M+PjFdPTIsMH1jYXNlIDEzOmNhc2UgMTQ6cmV0dXJuIDB9cmV0dXJuLTI4fWNhdGNoKGwpe2lmKHR5cGVvZiBvPiJ1Inx8bC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGw7cmV0dXJuLWwuZXJybm99fWZ1bmN0aW9uIHh0KGUscil7dHJ5e3ZhciB0PVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3JldHVybiBQLmRvU3RhdChvLnN0YXQsdC5wYXRoLHIpfWNhdGNoKG4pe2lmKHR5cGVvZiBvPiJ1Inx8bi5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IG47cmV0dXJuLW4uZXJybm99fXZhciB2ZT0oZSxyLHQpPT5RZShlLHgscix0KTtmdW5jdGlvbiBIdChlLHIsdCl7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO24uZ2V0ZGVudHN8fChuLmdldGRlbnRzPW8ucmVhZGRpcihuLnBhdGgpKTtmb3IodmFyIGE9MjgwLGk9MCxzPW8ubGxzZWVrKG4sMCwxKSxsPU1hdGguZmxvb3Iocy9hKTtsPG4uZ2V0ZGVudHMubGVuZ3RoJiZpK2E8PXQ7KXt2YXIgdSxjLGQ9bi5nZXRkZW50c1tsXTtpZihkPT09Ii4iKXU9bi5ub2RlLmlkLGM9NDtlbHNlIGlmKGQ9PT0iLi4iKXt2YXIgbT1vLmxvb2t1cFBhdGgobi5wYXRoLHtwYXJlbnQ6ITB9KTt1PW0ubm9kZS5pZCxjPTR9ZWxzZXt2YXIgaD1vLmxvb2t1cE5vZGUobi5ub2RlLGQpO3U9aC5pZCxjPW8uaXNDaHJkZXYoaC5tb2RlKT8yOm8uaXNEaXIoaC5tb2RlKT80Om8uaXNMaW5rKGgubW9kZSk/MTA6OH0kPVt1Pj4+MCwoeT11LCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2k+PjJdPSRbMF0sZ1tyK2krND4+Ml09JFsxXSwkPVsobCsxKSphPj4+MCwoeT0obCsxKSphLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2krOD4+Ml09JFswXSxnW3IraSsxMj4+Ml09JFsxXSxZW3IraSsxNj4+MV09MjgwLElbcitpKzE4XT1jLHZlKGQscitpKzE5LDI1NiksaSs9YSxsKz0xfXJldHVybiBvLmxsc2VlayhuLGwqYSwwKSxpfWNhdGNoKHApe2lmKHR5cGVvZiBvPiJ1Inx8cC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHA7cmV0dXJuLXAuZXJybm99fWZ1bmN0aW9uIFd0KGUscix0KXtQLnZhcmFyZ3M9dDt0cnl7dmFyIG49UC5nZXRTdHJlYW1Gcm9tRkQoZSk7c3dpdGNoKHIpe2Nhc2UgMjE1MDk6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDU6e2lmKCFuLnR0eSlyZXR1cm4tNTk7aWYobi50dHkub3BzLmlvY3RsX3RjZ2V0cyl7dmFyIGE9bi50dHkub3BzLmlvY3RsX3RjZ2V0cyhuKSxpPWRlKCk7Z1tpPj4yXT1hLmNfaWZsYWd8fDAsZ1tpKzQ+PjJdPWEuY19vZmxhZ3x8MCxnW2krOD4+Ml09YS5jX2NmbGFnfHwwLGdbaSsxMj4+Ml09YS5jX2xmbGFnfHwwO2Zvcih2YXIgcz0wO3M8MzI7cysrKUlbaStzKzE3XT1hLmNfY2Nbc118fDA7cmV0dXJuIDB9cmV0dXJuIDB9Y2FzZSAyMTUxMDpjYXNlIDIxNTExOmNhc2UgMjE1MTI6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDY6Y2FzZSAyMTUwNzpjYXNlIDIxNTA4OntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90Y3NldHMpe2Zvcih2YXIgaT1kZSgpLGw9Z1tpPj4yXSx1PWdbaSs0Pj4yXSxjPWdbaSs4Pj4yXSxkPWdbaSsxMj4+Ml0sbT1bXSxzPTA7czwzMjtzKyspbS5wdXNoKElbaStzKzE3XSk7cmV0dXJuIG4udHR5Lm9wcy5pb2N0bF90Y3NldHMobi50dHkscix7Y19pZmxhZzpsLGNfb2ZsYWc6dSxjX2NmbGFnOmMsY19sZmxhZzpkLGNfY2M6bX0pfXJldHVybiAwfWNhc2UgMjE1MTk6e2lmKCFuLnR0eSlyZXR1cm4tNTk7dmFyIGk9ZGUoKTtyZXR1cm4gZ1tpPj4yXT0wLDB9Y2FzZSAyMTUyMDpyZXR1cm4gbi50dHk/LTI4Oi01OTtjYXNlIDIxNTMxOnt2YXIgaT1kZSgpO3JldHVybiBvLmlvY3RsKG4scixpKX1jYXNlIDIxNTIzOntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90aW9jZ3dpbnN6KXt2YXIgaD1uLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeihuLnR0eSksaT1kZSgpO1lbaT4+MV09aFswXSxZW2krMj4+MV09aFsxXX1yZXR1cm4gMH1jYXNlIDIxNTI0OnJldHVybiBuLnR0eT8wOi01OTtjYXNlIDIxNTE1OnJldHVybiBuLnR0eT8wOi01OTtkZWZhdWx0OnJldHVybi0yOH19Y2F0Y2gocCl7aWYodHlwZW9mIG8+InUifHxwLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcDtyZXR1cm4tcC5lcnJub319ZnVuY3Rpb24gQnQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5sc3RhdCxlLHIpfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuLXQuZXJybm99fWZ1bmN0aW9uIE50KGUscix0LG4pe3RyeXtyPVAuZ2V0U3RyKHIpO3ZhciBhPW4mMjU2LGk9biY0MDk2O3JldHVybiBuPW4mLTY0MDEscj1QLmNhbGN1bGF0ZUF0KGUscixpKSxQLmRvU3RhdChhP28ubHN0YXQ6by5zdGF0LHIsdCl9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4tcy5lcnJub319ZnVuY3Rpb24gWXQoZSxyLHQsbil7UC52YXJhcmdzPW47dHJ5e3I9UC5nZXRTdHIocikscj1QLmNhbGN1bGF0ZUF0KGUscik7dmFyIGE9bj9NZSgpOjA7cmV0dXJuIG8ub3BlbihyLHQsYSkuZmR9Y2F0Y2goaSl7aWYodHlwZW9mIG8+InUifHxpLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgaTtyZXR1cm4taS5lcnJub319ZnVuY3Rpb24gR3QoZSxyLHQsbil7dHJ5e3JldHVybiByPVAuZ2V0U3RyKHIpLG49UC5nZXRTdHIobikscj1QLmNhbGN1bGF0ZUF0KGUsciksbj1QLmNhbGN1bGF0ZUF0KHQsbiksby5yZW5hbWUocixuKSwwfWNhdGNoKGEpe2lmKHR5cGVvZiBvPiJ1Inx8YS5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGE7cmV0dXJuLWEuZXJybm99fWZ1bmN0aW9uIHF0KGUpe3RyeXtyZXR1cm4gZT1QLmdldFN0cihlKSxvLnJtZGlyKGUpLDB9Y2F0Y2gocil7aWYodHlwZW9mIG8+InUifHxyLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcjtyZXR1cm4tci5lcnJub319ZnVuY3Rpb24gWHQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5zdGF0LGUscil9Y2F0Y2godCl7aWYodHlwZW9mIG8+InUifHx0Lm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgdDtyZXR1cm4tdC5lcnJub319ZnVuY3Rpb24gS3QoZSxyLHQpe3RyeXtyZXR1cm4gcj1QLmdldFN0cihyKSxyPVAuY2FsY3VsYXRlQXQoZSxyKSx0PT09MD9vLnVubGluayhyKTp0PT09NTEyP28ucm1kaXIocik6aWUoIkludmFsaWQgZmxhZ3MgcGFzc2VkIHRvIHVubGlua2F0IiksMH1jYXRjaChuKXtpZih0eXBlb2Ygbz4idSJ8fG4ubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBuO3JldHVybi1uLmVycm5vfX12YXIgSnQ9KCk9PntpZSgiIil9LFJlPXt9LHJyPWU9Pntmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKSx0PWUucG9wKCk7dChyKX19O2Z1bmN0aW9uIHllKGUpe3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShBW2U+PjJdKX12YXIgaGU9e30sdWU9e30sT2U9e30sU3IsSWU9ZT0+e3Rocm93IG5ldyBTcihlKX0sTj0oZSxyLHQpPT57ZS5mb3JFYWNoKGZ1bmN0aW9uKGwpe09lW2xdPXJ9KTtmdW5jdGlvbiBuKGwpe3ZhciB1PXQobCk7dS5sZW5ndGghPT1lLmxlbmd0aCYmSWUoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKTtmb3IodmFyIGM9MDtjPGUubGVuZ3RoOysrYylLKGVbY10sdVtjXSl9dmFyIGE9bmV3IEFycmF5KHIubGVuZ3RoKSxpPVtdLHM9MDtyLmZvckVhY2goKGwsdSk9Pnt1ZS5oYXNPd25Qcm9wZXJ0eShsKT9hW3VdPXVlW2xdOihpLnB1c2gobCksaGUuaGFzT3duUHJvcGVydHkobCl8fChoZVtsXT1bXSksaGVbbF0ucHVzaCgoKT0+e2FbdV09dWVbbF0sKytzLHM9PT1pLmxlbmd0aCYmbihhKX0pKX0pLGkubGVuZ3RoPT09MCYmbihhKX0sWnQ9ZT0+e3ZhciByPVJlW2VdO2RlbGV0ZSBSZVtlXTt2YXIgdD1yLnJhd0NvbnN0cnVjdG9yLG49ci5yYXdEZXN0cnVjdG9yLGE9ci5maWVsZHMsaT1hLm1hcChzPT5zLmdldHRlclJldHVyblR5cGUpLmNvbmNhdChhLm1hcChzPT5zLnNldHRlckFyZ3VtZW50VHlwZSkpO04oW2VdLGkscz0+e3ZhciBsPXt9O3JldHVybiBhLmZvckVhY2goKHUsYyk9Pnt2YXIgZD11LmZpZWxkTmFtZSxtPXNbY10saD11LmdldHRlcixwPXUuZ2V0dGVyQ29udGV4dCx3PXNbYythLmxlbmd0aF0sRD11LnNldHRlcixNPXUuc2V0dGVyQ29udGV4dDtsW2RdPXtyZWFkOkY9Pm0uZnJvbVdpcmVUeXBlKGgocCxGKSksd3JpdGU6KEYsdik9Pnt2YXIgXz1bXTtEKE0sRix3LnRvV2lyZVR5cGUoXyx2KSkscnIoXyl9fX0pLFt7bmFtZTpyLm5hbWUsZnJvbVdpcmVUeXBlOnU9Pnt2YXIgYz17fTtmb3IodmFyIGQgaW4gbCljW2RdPWxbZF0ucmVhZCh1KTtyZXR1cm4gbih1KSxjfSx0b1dpcmVUeXBlOih1LGMpPT57Zm9yKHZhciBkIGluIGwpaWYoIShkIGluIGMpKXRocm93IG5ldyBUeXBlRXJyb3IoYE1pc3NpbmcgZmllbGQ6ICIke2R9ImApO3ZhciBtPXQoKTtmb3IoZCBpbiBsKWxbZF0ud3JpdGUobSxjW2RdKTtyZXR1cm4gdSE9PW51bGwmJnUucHVzaChuLG0pLG19LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm59XX0pfSxRdD0oZSxyLHQsbixhKT0+e30sZW49KCk9Pntmb3IodmFyIGU9bmV3IEFycmF5KDI1Nikscj0wO3I8MjU2OysrcillW3JdPVN0cmluZy5mcm9tQ2hhckNvZGUocik7TXI9ZX0sTXIsaj1lPT57Zm9yKHZhciByPSIiLHQ9ZTt4W3RdOylyKz1Nclt4W3QrK11dO3JldHVybiByfSxtZSxrPWU9Pnt0aHJvdyBuZXcgbWUoZSl9O2Z1bmN0aW9uIHJuKGUscix0PXt9KXt2YXIgbj1yLm5hbWU7aWYoZXx8ayhgdHlwZSAiJHtufSIgbXVzdCBoYXZlIGEgcG9zaXRpdmUgaW50ZWdlciB0eXBlaWQgcG9pbnRlcmApLHVlLmhhc093blByb3BlcnR5KGUpKXtpZih0Lmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpcmV0dXJuO2soYENhbm5vdCByZWdpc3RlciB0eXBlICcke259JyB0d2ljZWApfWlmKHVlW2VdPXIsZGVsZXRlIE9lW2VdLGhlLmhhc093blByb3BlcnR5KGUpKXt2YXIgYT1oZVtlXTtkZWxldGUgaGVbZV0sYS5mb3JFYWNoKGk9PmkoKSl9fWZ1bmN0aW9uIEsoZSxyLHQ9e30pe2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKTtyZXR1cm4gcm4oZSxyLHQpfXZhciBKPTgsdG49KGUscix0LG4pPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4hIWF9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oYSxpKXtyZXR1cm4gaT90Om59LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKHhbYV0pfSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSxubj1lPT4oe2NvdW50OmUuY291bnQsZGVsZXRlU2NoZWR1bGVkOmUuZGVsZXRlU2NoZWR1bGVkLHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOmUucHJlc2VydmVQb2ludGVyT25EZWxldGUscHRyOmUucHRyLHB0clR5cGU6ZS5wdHJUeXBlLHNtYXJ0UHRyOmUuc21hcnRQdHIsc21hcnRQdHJUeXBlOmUuc21hcnRQdHJUeXBlfSksdHI9ZT0+e2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MubmFtZX1rKHIoZSkrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX0sbnI9ITEsUnI9ZT0+e30sYW49ZT0+e2Uuc21hcnRQdHI/ZS5zbWFydFB0clR5cGUucmF3RGVzdHJ1Y3RvcihlLnNtYXJ0UHRyKTplLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoZS5wdHIpfSxPcj1lPT57ZS5jb3VudC52YWx1ZS09MTt2YXIgcj1lLmNvdW50LnZhbHVlPT09MDtyJiZhbihlKX0sSXI9KGUscix0KT0+e2lmKHI9PT10KXJldHVybiBlO2lmKHQuYmFzZUNsYXNzPT09dm9pZCAwKXJldHVybiBudWxsO3ZhciBuPUlyKGUscix0LmJhc2VDbGFzcyk7cmV0dXJuIG49PT1udWxsP251bGw6dC5kb3duY2FzdChuKX0sTHI9e30sb249KCk9Pk9iamVjdC5rZXlzKGJlKS5sZW5ndGgsc249KCk9Pnt2YXIgZT1bXTtmb3IodmFyIHIgaW4gYmUpYmUuaGFzT3duUHJvcGVydHkocikmJmUucHVzaChiZVtyXSk7cmV0dXJuIGV9LHdlPVtdLGFyPSgpPT57Zm9yKDt3ZS5sZW5ndGg7KXt2YXIgZT13ZS5wb3AoKTtlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlLmRlbGV0ZSgpfX0sRWUsbG49ZT0+e0VlPWUsd2UubGVuZ3RoJiZFZSYmRWUoYXIpfSx1bj0oKT0+e2YuZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudD1vbixmLmdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM9c24sZi5mbHVzaFBlbmRpbmdEZWxldGVzPWFyLGYuc2V0RGVsYXlGdW5jdGlvbj1sbn0sYmU9e30sZm49KGUscik9Pntmb3Iocj09PXZvaWQgMCYmaygicHRyIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIik7ZS5iYXNlQ2xhc3M7KXI9ZS51cGNhc3QociksZT1lLmJhc2VDbGFzcztyZXR1cm4gcn0sY249KGUscik9PihyPWZuKGUsciksYmVbcl0pLExlPShlLHIpPT57KCFyLnB0clR5cGV8fCFyLnB0cikmJkllKCJtYWtlQ2xhc3NIYW5kbGUgcmVxdWlyZXMgcHRyIGFuZCBwdHJUeXBlIik7dmFyIHQ9ISFyLnNtYXJ0UHRyVHlwZSxuPSEhci5zbWFydFB0cjtyZXR1cm4gdCE9PW4mJkllKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKSxyLmNvdW50PXt2YWx1ZToxfSxrZShPYmplY3QuY3JlYXRlKGUseyQkOnt2YWx1ZTpyLHdyaXRhYmxlOiEwfX0pKX07ZnVuY3Rpb24gZG4oZSl7dmFyIHI9dGhpcy5nZXRQb2ludGVlKGUpO2lmKCFyKXJldHVybiB0aGlzLmRlc3RydWN0b3IoZSksbnVsbDt2YXIgdD1jbih0aGlzLnJlZ2lzdGVyZWRDbGFzcyxyKTtpZih0IT09dm9pZCAwKXtpZih0LiQkLmNvdW50LnZhbHVlPT09MClyZXR1cm4gdC4kJC5wdHI9cix0LiQkLnNtYXJ0UHRyPWUsdC5jbG9uZSgpO3ZhciBuPXQuY2xvbmUoKTtyZXR1cm4gdGhpcy5kZXN0cnVjdG9yKGUpLG59ZnVuY3Rpb24gYSgpe3JldHVybiB0aGlzLmlzU21hcnRQb2ludGVyP0xlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6ZX0pOkxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOmV9KX12YXIgaT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHIpLHM9THJbaV07aWYoIXMpcmV0dXJuIGEuY2FsbCh0aGlzKTt2YXIgbDt0aGlzLmlzQ29uc3Q/bD1zLmNvbnN0UG9pbnRlclR5cGU6bD1zLnBvaW50ZXJUeXBlO3ZhciB1PUlyKHIsdGhpcy5yZWdpc3RlcmVkQ2xhc3MsbC5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiB1PT09bnVsbD9hLmNhbGwodGhpcyk6dGhpcy5pc1NtYXJ0UG9pbnRlcj9MZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1LHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOmV9KTpMZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1fSl9dmFyIGtlPWU9PnR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT4idSI/KGtlPXI9PnIsZSk6KG5yPW5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShyPT57T3Ioci4kJCl9KSxrZT1yPT57dmFyIHQ9ci4kJCxuPSEhdC5zbWFydFB0cjtpZihuKXt2YXIgYT17JCQ6dH07bnIucmVnaXN0ZXIocixhLHIpfXJldHVybiByfSxScj1yPT5uci51bnJlZ2lzdGVyKHIpLGtlKGUpKSx2bj0oKT0+e09iamVjdC5hc3NpZ24oVmUucHJvdG90eXBlLHtpc0FsaWFzT2YoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgVmUpfHwhKGUgaW5zdGFuY2VvZiBWZSkpcmV0dXJuITE7dmFyIHI9dGhpcy4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyx0PXRoaXMuJCQucHRyO2UuJCQ9ZS4kJDtmb3IodmFyIG49ZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxhPWUuJCQucHRyO3IuYmFzZUNsYXNzOyl0PXIudXBjYXN0KHQpLHI9ci5iYXNlQ2xhc3M7Zm9yKDtuLmJhc2VDbGFzczspYT1uLnVwY2FzdChhKSxuPW4uYmFzZUNsYXNzO3JldHVybiByPT09biYmdD09PWF9LGNsb25lKCl7aWYodGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpcmV0dXJuIHRoaXMuJCQuY291bnQudmFsdWUrPTEsdGhpczt2YXIgZT1rZShPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSx7JCQ6e3ZhbHVlOm5uKHRoaXMuJCQpfX0pKTtyZXR1cm4gZS4kJC5jb3VudC52YWx1ZSs9MSxlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlfSxkZWxldGUoKXt0aGlzLiQkLnB0cnx8dHIodGhpcyksdGhpcy4kJC5kZWxldGVTY2hlZHVsZWQmJiF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlJiZrKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIiksUnIodGhpcyksT3IodGhpcy4kJCksdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZXx8KHRoaXMuJCQuc21hcnRQdHI9dm9pZCAwLHRoaXMuJCQucHRyPXZvaWQgMCl9LGlzRGVsZXRlZCgpe3JldHVybiF0aGlzLiQkLnB0cn0sZGVsZXRlTGF0ZXIoKXtyZXR1cm4gdGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSYmaygiT2JqZWN0IGFscmVhZHkgc2NoZWR1bGVkIGZvciBkZWxldGlvbiIpLHdlLnB1c2godGhpcyksd2UubGVuZ3RoPT09MSYmRWUmJkVlKGFyKSx0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMCx0aGlzfX0pfTtmdW5jdGlvbiBWZSgpe312YXIgVWU9KGUscik9Pk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJuYW1lIix7dmFsdWU6ZX0pLG9yPShlLHIsdCk9PntpZihlW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDApe3ZhciBuPWVbcl07ZVtyXT1mdW5jdGlvbiguLi5hKXtyZXR1cm4gZVtyXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGEubGVuZ3RoKXx8ayhgRnVuY3Rpb24gJyR7dH0nIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoJHthLmxlbmd0aH0pIC0gZXhwZWN0cyBvbmUgb2YgKCR7ZVtyXS5vdmVybG9hZFRhYmxlfSkhYCksZVtyXS5vdmVybG9hZFRhYmxlW2EubGVuZ3RoXS5hcHBseSh0aGlzLGEpfSxlW3JdLm92ZXJsb2FkVGFibGU9W10sZVtyXS5vdmVybG9hZFRhYmxlW24uYXJnQ291bnRdPW59fSxWcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKT8oKHQ9PT12b2lkIDB8fGZbZV0ub3ZlcmxvYWRUYWJsZSE9PXZvaWQgMCYmZltlXS5vdmVybG9hZFRhYmxlW3RdIT09dm9pZCAwKSYmayhgQ2Fubm90IHJlZ2lzdGVyIHB1YmxpYyBuYW1lICcke2V9JyB0d2ljZWApLG9yKGYsZSxlKSxmLmhhc093blByb3BlcnR5KHQpJiZrKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgb3ZlcmxvYWRzIG9mIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzICgke3R9KSFgKSxmW2VdLm92ZXJsb2FkVGFibGVbdF09cik6KGZbZV09cix0IT09dm9pZCAwJiYoZltlXS5udW1Bcmd1bWVudHM9dCkpfSxobj00OCxtbj01Nyxwbj1lPT57aWYoZT09PXZvaWQgMClyZXR1cm4iX3Vua25vd24iO2U9ZS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csIiQiKTt2YXIgcj1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHI+PWhuJiZyPD1tbj9gXyR7ZX1gOmV9O2Z1bmN0aW9uIF9uKGUscix0LG4sYSxpLHMsbCl7dGhpcy5uYW1lPWUsdGhpcy5jb25zdHJ1Y3Rvcj1yLHRoaXMuaW5zdGFuY2VQcm90b3R5cGU9dCx0aGlzLnJhd0Rlc3RydWN0b3I9bix0aGlzLmJhc2VDbGFzcz1hLHRoaXMuZ2V0QWN0dWFsVHlwZT1pLHRoaXMudXBjYXN0PXMsdGhpcy5kb3duY2FzdD1sLHRoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnM9W119dmFyIGplPShlLHIsdCk9Pntmb3IoO3IhPT10OylyLnVwY2FzdHx8ayhgRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAke3QubmFtZX0sIGdvdCBhbiBpbnN0YW5jZSBvZiAke3IubmFtZX1gKSxlPXIudXBjYXN0KGUpLHI9ci5iYXNlQ2xhc3M7cmV0dXJuIGV9O2Z1bmN0aW9uIGduKGUscil7aWYocj09PW51bGwpcmV0dXJuIHRoaXMuaXNSZWZlcmVuY2UmJmsoYG51bGwgaXMgbm90IGEgdmFsaWQgJHt0aGlzLm5hbWV9YCksMDtyLiQkfHxrKGBDYW5ub3QgcGFzcyAiJHtscihyKX0iIGFzIGEgJHt0aGlzLm5hbWV9YCksci4kJC5wdHJ8fGsoYENhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICR7dGhpcy5uYW1lfWApO3ZhciB0PXIuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3Msbj1qZShyLiQkLnB0cix0LHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gbn1mdW5jdGlvbiB5bihlLHIpe3ZhciB0O2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLHRoaXMuaXNTbWFydFBvaW50ZXI/KHQ9dGhpcy5yYXdDb25zdHJ1Y3RvcigpLGUhPT1udWxsJiZlLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHQpLHQpOjA7KCFyfHwhci4kJCkmJmsoYENhbm5vdCBwYXNzICIke2xyKHIpfSIgYXMgYSAke3RoaXMubmFtZX1gKSxyLiQkLnB0cnx8ayhgQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgJHt0aGlzLm5hbWV9YCksIXRoaXMuaXNDb25zdCYmci4kJC5wdHJUeXBlLmlzQ29uc3QmJmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgbj1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO2lmKHQ9amUoci4kJC5wdHIsbix0aGlzLnJlZ2lzdGVyZWRDbGFzcyksdGhpcy5pc1NtYXJ0UG9pbnRlcilzd2l0Y2goci4kJC5zbWFydFB0cj09PXZvaWQgMCYmaygiUGFzc2luZyByYXcgcG9pbnRlciB0byBzbWFydCBwb2ludGVyIGlzIGlsbGVnYWwiKSx0aGlzLnNoYXJpbmdQb2xpY3kpe2Nhc2UgMDpyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXM/dD1yLiQkLnNtYXJ0UHRyOmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTticmVhaztjYXNlIDE6dD1yLiQkLnNtYXJ0UHRyO2JyZWFrO2Nhc2UgMjppZihyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXMpdD1yLiQkLnNtYXJ0UHRyO2Vsc2V7dmFyIGE9ci5jbG9uZSgpO3Q9dGhpcy5yYXdTaGFyZSh0LHRlLnRvSGFuZGxlKCgpPT5hLmRlbGV0ZSgpKSksZSE9PW51bGwmJmUucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IsdCl9YnJlYWs7ZGVmYXVsdDprKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlLHIpe2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLDA7ci4kJHx8ayhgQ2Fubm90IHBhc3MgIiR7bHIocil9IiBhcyBhICR7dGhpcy5uYW1lfWApLHIuJCQucHRyfHxrKGBDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAke3RoaXMubmFtZX1gKSxyLiQkLnB0clR5cGUuaXNDb25zdCYmayhgQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAke3IuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgdD1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLG49amUoci4kJC5wdHIsdCx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIG59dmFyIEVuPSgpPT57T2JqZWN0LmFzc2lnbih6ZS5wcm90b3R5cGUse2dldFBvaW50ZWUoZSl7cmV0dXJuIHRoaXMucmF3R2V0UG9pbnRlZSYmKGU9dGhpcy5yYXdHZXRQb2ludGVlKGUpKSxlfSxkZXN0cnVjdG9yKGUpe3ZhciByOyhyPXRoaXMucmF3RGVzdHJ1Y3Rvcik9PW51bGx8fHIuY2FsbCh0aGlzLGUpfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGZyb21XaXJlVHlwZTpkbn0pfTtmdW5jdGlvbiB6ZShlLHIsdCxuLGEsaSxzLGwsdSxjLGQpe3RoaXMubmFtZT1lLHRoaXMucmVnaXN0ZXJlZENsYXNzPXIsdGhpcy5pc1JlZmVyZW5jZT10LHRoaXMuaXNDb25zdD1uLHRoaXMuaXNTbWFydFBvaW50ZXI9YSx0aGlzLnBvaW50ZWVUeXBlPWksdGhpcy5zaGFyaW5nUG9saWN5PXMsdGhpcy5yYXdHZXRQb2ludGVlPWwsdGhpcy5yYXdDb25zdHJ1Y3Rvcj11LHRoaXMucmF3U2hhcmU9Yyx0aGlzLnJhd0Rlc3RydWN0b3I9ZCwhYSYmci5iYXNlQ2xhc3M9PT12b2lkIDA/bj8odGhpcy50b1dpcmVUeXBlPWduLHRoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGwpOih0aGlzLnRvV2lyZVR5cGU9d24sdGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbCk6dGhpcy50b1dpcmVUeXBlPXlufXZhciBVcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKXx8SWUoIlJlcGxhY2luZyBub25leGlzdGVudCBwdWJsaWMgc3ltYm9sIiksZltlXS5vdmVybG9hZFRhYmxlIT09dm9pZCAwJiZ0IT09dm9pZCAwP2ZbZV0ub3ZlcmxvYWRUYWJsZVt0XT1yOihmW2VdPXIsZltlXS5hcmdDb3VudD10KX0sYm49KGUscix0KT0+e2U9ZS5yZXBsYWNlKC9wL2csImkiKTt2YXIgbj1mWyJkeW5DYWxsXyIrZV07cmV0dXJuIG4ociwuLi50KX0seGU9W10sanIsenI9ZT0+e3ZhciByPXhlW2VdO3JldHVybiByfHwoZT49eGUubGVuZ3RoJiYoeGUubGVuZ3RoPWUrMSkseGVbZV09cj1qci5nZXQoZSkpLHJ9LGtuPShlLHIsdD1bXSk9PntpZihlLmluY2x1ZGVzKCJqIikpcmV0dXJuIGJuKGUscix0KTt2YXIgbj16cihyKSguLi50KTtyZXR1cm4gbn0sUG49KGUscik9PiguLi50KT0+a24oZSxyLHQpLFc9KGUscik9PntlPWooZSk7ZnVuY3Rpb24gdCgpe3JldHVybiBlLmluY2x1ZGVzKCJqIik/UG4oZSxyKTp6cihyKX12YXIgbj10KCk7cmV0dXJuIHR5cGVvZiBuIT0iZnVuY3Rpb24iJiZrKGB1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgJHtlfTogJHtyfWApLG59LEFuPShlLHIpPT57dmFyIHQ9VWUocixmdW5jdGlvbihuKXt0aGlzLm5hbWU9cix0aGlzLm1lc3NhZ2U9bjt2YXIgYT1uZXcgRXJyb3Iobikuc3RhY2s7YSE9PXZvaWQgMCYmKHRoaXMuc3RhY2s9dGhpcy50b1N0cmluZygpK2AKYCthLnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpKX0pO3JldHVybiB0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZT09PXZvaWQgMD90aGlzLm5hbWU6YCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9YH0sdH0seHIsSHI9ZT0+e3ZhciByPWV0KGUpLHQ9aihyKTtyZXR1cm4gWihyKSx0fSxmZT0oZSxyKT0+e3ZhciB0PVtdLG49e307ZnVuY3Rpb24gYShpKXtpZighbltpXSYmIXVlW2ldKXtpZihPZVtpXSl7T2VbaV0uZm9yRWFjaChhKTtyZXR1cm59dC5wdXNoKGkpLG5baV09ITB9fXRocm93IHIuZm9yRWFjaChhKSxuZXcgeHIoYCR7ZX06IGArdC5tYXAoSHIpLmpvaW4oWyIsICJdKSl9LERuPShlLHIsdCxuLGEsaSxzLGwsdSxjLGQsbSxoKT0+e2Q9aihkKSxpPVcoYSxpKSxsJiYobD1XKHMsbCkpLGMmJihjPVcodSxjKSksaD1XKG0saCk7dmFyIHA9cG4oZCk7VnIocCxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLFtuXSl9KSxOKFtlLHIsdF0sbj9bbl06W10sdz0+e3ZhciBPO3c9d1swXTt2YXIgRCxNO24/KEQ9dy5yZWdpc3RlcmVkQ2xhc3MsTT1ELmluc3RhbmNlUHJvdG90eXBlKTpNPVZlLnByb3RvdHlwZTt2YXIgRj1VZShkLGZ1bmN0aW9uKC4uLnZyKXtpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykhPT12KXRocm93IG5ldyBtZSgiVXNlICduZXcnIHRvIGNvbnN0cnVjdCAiK2QpO2lmKF8uY29uc3RydWN0b3JfYm9keT09PXZvaWQgMCl0aHJvdyBuZXcgbWUoZCsiIGhhcyBubyBhY2Nlc3NpYmxlIGNvbnN0cnVjdG9yIik7dmFyIG90PV8uY29uc3RydWN0b3JfYm9keVt2ci5sZW5ndGhdO2lmKG90PT09dm9pZCAwKXRocm93IG5ldyBtZShgVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgJHtkfSB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCR7dnIubGVuZ3RofSkgLSBleHBlY3RlZCAoJHtPYmplY3Qua2V5cyhfLmNvbnN0cnVjdG9yX2JvZHkpLnRvU3RyaW5nKCl9KSBwYXJhbWV0ZXJzIGluc3RlYWQhYCk7cmV0dXJuIG90LmFwcGx5KHRoaXMsdnIpfSksdj1PYmplY3QuY3JlYXRlKE0se2NvbnN0cnVjdG9yOnt2YWx1ZTpGfX0pO0YucHJvdG90eXBlPXY7dmFyIF89bmV3IF9uKGQsRix2LGgsRCxpLGwsYyk7Xy5iYXNlQ2xhc3MmJigoTz1fLmJhc2VDbGFzcykuX19kZXJpdmVkQ2xhc3Nlcz8/KE8uX19kZXJpdmVkQ2xhc3Nlcz1bXSksXy5iYXNlQ2xhc3MuX19kZXJpdmVkQ2xhc3Nlcy5wdXNoKF8pKTt2YXIgTD1uZXcgemUoZCxfLCEwLCExLCExKSxUPW5ldyB6ZShkKyIqIixfLCExLCExLCExKSxCPW5ldyB6ZShkKyIgY29uc3QqIixfLCExLCEwLCExKTtyZXR1cm4gTHJbZV09e3BvaW50ZXJUeXBlOlQsY29uc3RQb2ludGVyVHlwZTpCfSxVcihwLEYpLFtMLFQsQl19KX07ZnVuY3Rpb24gV3IoZSl7Zm9yKHZhciByPTE7cjxlLmxlbmd0aDsrK3IpaWYoZVtyXSE9PW51bGwmJmVbcl0uZGVzdHJ1Y3RvckZ1bmN0aW9uPT09dm9pZCAwKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uICRuKGUscil7aWYoIShlIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoYG5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAke3R5cGVvZiBlfSB3aGljaCBpcyBub3QgYSBmdW5jdGlvbmApO3ZhciB0PVVlKGUubmFtZXx8InVua25vd25GdW5jdGlvbk5hbWUiLGZ1bmN0aW9uKCl7fSk7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU7dmFyIG49bmV3IHQsYT1lLmFwcGx5KG4scik7cmV0dXJuIGEgaW5zdGFuY2VvZiBPYmplY3Q/YTpufWZ1bmN0aW9uIENuKGUscix0LG4pe2Zvcih2YXIgYT1XcihlKSxpPWUubGVuZ3RoLHM9IiIsbD0iIix1PTA7dTxpLTI7Kyt1KXMrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1LGwrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1KyJXaXJlZCI7dmFyIGM9YAogICAgICAgIHJldHVybiBmdW5jdGlvbiAoJHtzfSkgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAke2ktMn0pIHsKICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAnICsgaHVtYW5OYW1lICsgJyBjYWxsZWQgd2l0aCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLCBleHBlY3RlZCAke2ktMn0nKTsKICAgICAgICB9YDthJiYoYys9YHZhciBkZXN0cnVjdG9ycyA9IFtdOwpgKTt2YXIgZD1hPyJkZXN0cnVjdG9ycyI6Im51bGwiLG09WyJodW1hbk5hbWUiLCJ0aHJvd0JpbmRpbmdFcnJvciIsImludm9rZXIiLCJmbiIsInJ1bkRlc3RydWN0b3JzIiwicmV0VHlwZSIsImNsYXNzUGFyYW0iXTtyJiYoYys9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtWyd0b1dpcmVUeXBlJ10oIitkK2AsIHRoaXMpOwpgKTtmb3IodmFyIHU9MDt1PGktMjsrK3UpYys9InZhciBhcmciK3UrIldpcmVkID0gYXJnVHlwZSIrdSsiWyd0b1dpcmVUeXBlJ10oIitkKyIsIGFyZyIrdStgKTsKYCxtLnB1c2goImFyZ1R5cGUiK3UpO2lmKHImJihsPSJ0aGlzV2lyZWQiKyhsLmxlbmd0aD4wPyIsICI6IiIpK2wpLGMrPSh0fHxuPyJ2YXIgcnYgPSAiOiIiKSsiaW52b2tlcihmbiIrKGwubGVuZ3RoPjA/IiwgIjoiIikrbCtgKTsKYCxhKWMrPWBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7CmA7ZWxzZSBmb3IodmFyIHU9cj8xOjI7dTxlLmxlbmd0aDsrK3Upe3ZhciBoPXU9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyh1LTIpKyJXaXJlZCI7ZVt1XS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiYoYys9YCR7aH1fZHRvcigke2h9KTsKYCxtLnB1c2goYCR7aH1fZHRvcmApKX1yZXR1cm4gdCYmKGMrPWB2YXIgcmV0ID0gcmV0VHlwZVsnZnJvbVdpcmVUeXBlJ10ocnYpOwpyZXR1cm4gcmV0OwpgKSxjKz1gfQpgLFttLGNdfWZ1bmN0aW9uIEhlKGUscix0LG4sYSxpKXt2YXIgcz1yLmxlbmd0aDtzPDImJmsoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpO2Zvcih2YXIgbD1yWzFdIT09bnVsbCYmdCE9PW51bGwsdT1XcihyKSxjPXJbMF0ubmFtZSE9PSJ2b2lkIixkPVtlLGssbixhLHJyLHJbMF0sclsxXV0sbT0wO208cy0yOysrbSlkLnB1c2goclttKzJdKTtpZighdSlmb3IodmFyIG09bD8xOjI7bTxyLmxlbmd0aDsrK20pclttXS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiZkLnB1c2goclttXS5kZXN0cnVjdG9yRnVuY3Rpb24pO2xldFtoLHBdPUNuKHIsbCxjLGkpO2gucHVzaChwKTt2YXIgdz0kbihGdW5jdGlvbixoKSguLi5kKTtyZXR1cm4gVWUoZSx3KX12YXIgV2U9KGUscik9Pntmb3IodmFyIHQ9W10sbj0wO248ZTtuKyspdC5wdXNoKEFbcituKjQ+PjJdKTtyZXR1cm4gdH0saXI9ZT0+e2U9ZS50cmltKCk7Y29uc3Qgcj1lLmluZGV4T2YoIigiKTtyZXR1cm4gciE9PS0xP2Uuc3Vic3RyKDAscik6ZX0sRm49KGUscix0LG4sYSxpLHMsbCk9Pnt2YXIgdT1XZSh0LG4pO3I9aihyKSxyPWlyKHIpLGk9VyhhLGkpLE4oW10sW2VdLGM9PntjPWNbMF07dmFyIGQ9YCR7Yy5uYW1lfS4ke3J9YDtmdW5jdGlvbiBtKCl7ZmUoYENhbm5vdCBjYWxsICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLHUpfXIuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSk7dmFyIGg9Yy5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3I7cmV0dXJuIGhbcl09PT12b2lkIDA/KG0uYXJnQ291bnQ9dC0xLGhbcl09bSk6KG9yKGgscixkKSxoW3JdLm92ZXJsb2FkVGFibGVbdC0xXT1tKSxOKFtdLHUscD0+e3ZhciB3PVtwWzBdLG51bGxdLmNvbmNhdChwLnNsaWNlKDEpKSxEPUhlKGQsdyxudWxsLGkscyxsKTtpZihoW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDA/KEQuYXJnQ291bnQ9dC0xLGhbcl09RCk6aFtyXS5vdmVybG9hZFRhYmxlW3QtMV09RCxjLnJlZ2lzdGVyZWRDbGFzcy5fX2Rlcml2ZWRDbGFzc2VzKWZvcihjb25zdCBNIG9mIGMucmVnaXN0ZXJlZENsYXNzLl9fZGVyaXZlZENsYXNzZXMpTS5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShyKXx8KE0uY29uc3RydWN0b3Jbcl09RCk7cmV0dXJuW119KSxbXX0pfSxUbj0oZSxyLHQsbixhLGkpPT57dmFyIHM9V2Uocix0KTthPVcobixhKSxOKFtdLFtlXSxsPT57bD1sWzBdO3ZhciB1PWBjb25zdHJ1Y3RvciAke2wubmFtZX1gO2lmKGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9PT12b2lkIDAmJihsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5PVtdKSxsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W3ItMV0hPT12b2lkIDApdGhyb3cgbmV3IG1lKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgke3ItMX0pIGZvciBjbGFzcyAnJHtsLm5hbWV9JyEgT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBjdXJyZW50bHkgb25seSBwZXJmb3JtZWQgdXNpbmcgdGhlIHBhcmFtZXRlciBjb3VudCwgbm90IGFjdHVhbCB0eXBlIGluZm8hYCk7cmV0dXJuIGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT0oKT0+e2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7bC5uYW1lfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2Ascyl9LE4oW10scyxjPT4oYy5zcGxpY2UoMSwwLG51bGwpLGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT1IZSh1LGMsbnVsbCxhLGkpLFtdKSksW119KX0sU249KGUscix0LG4sYSxpLHMsbCx1KT0+e3ZhciBjPVdlKHQsbik7cj1qKHIpLHI9aXIociksaT1XKGEsaSksTihbXSxbZV0sZD0+e2Q9ZFswXTt2YXIgbT1gJHtkLm5hbWV9LiR7cn1gO3Iuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSksbCYmZC5yZWdpc3RlcmVkQ2xhc3MucHVyZVZpcnR1YWxGdW5jdGlvbnMucHVzaChyKTtmdW5jdGlvbiBoKCl7ZmUoYENhbm5vdCBjYWxsICR7bX0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLGMpfXZhciBwPWQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHc9cFtyXTtyZXR1cm4gdz09PXZvaWQgMHx8dy5vdmVybG9hZFRhYmxlPT09dm9pZCAwJiZ3LmNsYXNzTmFtZSE9PWQubmFtZSYmdy5hcmdDb3VudD09PXQtMj8oaC5hcmdDb3VudD10LTIsaC5jbGFzc05hbWU9ZC5uYW1lLHBbcl09aCk6KG9yKHAscixtKSxwW3JdLm92ZXJsb2FkVGFibGVbdC0yXT1oKSxOKFtdLGMsRD0+e3ZhciBNPUhlKG0sRCxkLGkscyx1KTtyZXR1cm4gcFtyXS5vdmVybG9hZFRhYmxlPT09dm9pZCAwPyhNLmFyZ0NvdW50PXQtMixwW3JdPU0pOnBbcl0ub3ZlcmxvYWRUYWJsZVt0LTJdPU0sW119KSxbXX0pfSxCcj0oZSxyLHQpPT4oZSBpbnN0YW5jZW9mIE9iamVjdHx8ayhgJHt0fSB3aXRoIGludmFsaWQgInRoaXMiOiAke2V9YCksZSBpbnN0YW5jZW9mIHIucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yfHxrKGAke3R9IGluY29tcGF0aWJsZSB3aXRoICJ0aGlzIiBvZiB0eXBlICR7ZS5jb25zdHJ1Y3Rvci5uYW1lfWApLGUuJCQucHRyfHxrKGBjYW5ub3QgY2FsbCBlbXNjcmlwdGVuIGJpbmRpbmcgbWV0aG9kICR7dH0gb24gZGVsZXRlZCBvYmplY3RgKSxqZShlLiQkLnB0cixlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLHIucmVnaXN0ZXJlZENsYXNzKSksTW49KGUscix0LG4sYSxpLHMsbCx1LGMpPT57cj1qKHIpLGE9VyhuLGEpLE4oW10sW2VdLGQ9PntkPWRbMF07dmFyIG09YCR7ZC5uYW1lfS4ke3J9YCxoPXtnZXQoKXtmZShgQ2Fubm90IGFjY2VzcyAke219IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxbdCxzXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfTtyZXR1cm4gdT9oLnNldD0oKT0+ZmUoYENhbm5vdCBhY2Nlc3MgJHttfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2AsW3Qsc10pOmguc2V0PXA9PmsobSsiIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5IiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHIsaCksTihbXSx1P1t0LHNdOlt0XSxwPT57dmFyIHc9cFswXSxEPXtnZXQoKXt2YXIgRj1Ccih0aGlzLGQsbSsiIGdldHRlciIpO3JldHVybiB3LmZyb21XaXJlVHlwZShhKGksRikpfSxlbnVtZXJhYmxlOiEwfTtpZih1KXt1PVcobCx1KTt2YXIgTT1wWzFdO0Quc2V0PWZ1bmN0aW9uKEYpe3ZhciB2PUJyKHRoaXMsZCxtKyIgc2V0dGVyIiksXz1bXTt1KGMsdixNLnRvV2lyZVR5cGUoXyxGKSkscnIoXyl9fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZC5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUscixEKSxbXX0pLFtdfSl9LHNyPVtdLHJlPVtdLE5yPWU9PntlPjkmJi0tcmVbZSsxXT09PTAmJihyZVtlXT12b2lkIDAsc3IucHVzaChlKSl9LFJuPSgpPT5yZS5sZW5ndGgvMi01LXNyLmxlbmd0aCxPbj0oKT0+e3JlLnB1c2goMCwxLHZvaWQgMCwxLG51bGwsMSwhMCwxLCExLDEpLGYuY291bnRfZW12YWxfaGFuZGxlcz1Sbn0sdGU9e3RvVmFsdWU6ZT0+KGV8fGsoIkNhbm5vdCB1c2UgZGVsZXRlZCB2YWwuIGhhbmRsZSA9ICIrZSkscmVbZV0pLHRvSGFuZGxlOmU9Pntzd2l0Y2goZSl7Y2FzZSB2b2lkIDA6cmV0dXJuIDI7Y2FzZSBudWxsOnJldHVybiA0O2Nhc2UhMDpyZXR1cm4gNjtjYXNlITE6cmV0dXJuIDg7ZGVmYXVsdDp7Y29uc3Qgcj1zci5wb3AoKXx8cmUubGVuZ3RoO3JldHVybiByZVtyXT1lLHJlW3IrMV09MSxyfX19fSxJbj17bmFtZToiZW1zY3JpcHRlbjo6dmFsIixmcm9tV2lyZVR5cGU6ZT0+e3ZhciByPXRlLnRvVmFsdWUoZSk7cmV0dXJuIE5yKGUpLHJ9LHRvV2lyZVR5cGU6KGUscik9PnRlLnRvSGFuZGxlKHIpLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9LFlyPWU9PksoZSxJbiksbHI9ZT0+e2lmKGU9PT1udWxsKXJldHVybiJudWxsIjt2YXIgcj10eXBlb2YgZTtyZXR1cm4gcj09PSJvYmplY3QifHxyPT09ImFycmF5Inx8cj09PSJmdW5jdGlvbiI/ZS50b1N0cmluZygpOiIiK2V9LExuPShlLHIpPT57c3dpdGNoKHIpe2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKGdyW3Q+PjJdKX07Y2FzZSA4OnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUoeXJbdD4+M10pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgZmxvYXQgd2lkdGggKCR7cn0pOiAke2V9YCl9fSxWbj0oZSxyLHQpPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpuPT5uLHRvV2lyZVR5cGU6KG4sYSk9PmEsYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjpMbihyLHQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9LFVuPShlLHIsdCxuLGEsaSxzKT0+e3ZhciBsPVdlKHIsdCk7ZT1qKGUpLGU9aXIoZSksYT1XKG4sYSksVnIoZSxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY2FsbCAke2V9IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxsKX0sci0xKSxOKFtdLGwsdT0+e3ZhciBjPVt1WzBdLG51bGxdLmNvbmNhdCh1LnNsaWNlKDEpKTtyZXR1cm4gVXIoZSxIZShlLGMsbnVsbCxhLGkscyksci0xKSxbXX0pfSxqbj0oZSxyLHQpPT57c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gdD9uPT5JW25dOm49Pnhbbl07Y2FzZSAyOnJldHVybiB0P249Pllbbj4+MV06bj0+Q2Vbbj4+MV07Y2FzZSA0OnJldHVybiB0P249Pmdbbj4+Ml06bj0+QVtuPj4yXTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgaW50ZWdlciB3aWR0aCAoJHtyfSk6ICR7ZX1gKX19LHpuPShlLHIsdCxuLGEpPT57cj1qKHIpO3ZhciBpPWQ9PmQ7aWYobj09PTApe3ZhciBzPTMyLTgqdDtpPWQ9PmQ8PHM+Pj5zfXZhciBsPXIuaW5jbHVkZXMoInVuc2lnbmVkIiksdT0oZCxtKT0+e30sYztsP2M9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbT4+PjB9OmM9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbX0sSyhlLHtuYW1lOnIsZnJvbVdpcmVUeXBlOmksdG9XaXJlVHlwZTpjLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6am4ocix0LG4hPT0wKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSx4bj0oZSxyLHQpPT57dmFyIG49W0ludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XSxhPW5bcl07ZnVuY3Rpb24gaShzKXt2YXIgbD1BW3M+PjJdLHU9QVtzKzQ+PjJdO3JldHVybiBuZXcgYShJLmJ1ZmZlcix1LGwpfXQ9aih0KSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6aSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOml9LHtpZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zOiEwfSl9LEhuPShlLHIpPT57WXIoZSl9LFduPShlLHIpPT57cj1qKHIpO3ZhciB0PXI9PT0ic3RkOjpzdHJpbmciO0soZSx7bmFtZTpyLGZyb21XaXJlVHlwZShuKXt2YXIgYT1BW24+PjJdLGk9bis0LHM7aWYodClmb3IodmFyIGw9aSx1PTA7dTw9YTsrK3Upe3ZhciBjPWkrdTtpZih1PT1hfHx4W2NdPT0wKXt2YXIgZD1jLWwsbT1zZShsLGQpO3M9PT12b2lkIDA/cz1tOihzKz0iXDAiLHMrPW0pLGw9YysxfX1lbHNle2Zvcih2YXIgaD1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3UpaFt1XT1TdHJpbmcuZnJvbUNoYXJDb2RlKHhbaSt1XSk7cz1oLmpvaW4oIiIpfXJldHVybiBaKG4pLHN9LHRvV2lyZVR5cGUobixhKXthIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihhPW5ldyBVaW50OEFycmF5KGEpKTt2YXIgaSxzPXR5cGVvZiBhPT0ic3RyaW5nIjtzfHxhIGluc3RhbmNlb2YgVWludDhBcnJheXx8YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5fHxhIGluc3RhbmNlb2YgSW50OEFycmF5fHxrKCJDYW5ub3QgcGFzcyBub24tc3RyaW5nIHRvIHN0ZDo6c3RyaW5nIiksdCYmcz9pPVplKGEpOmk9YS5sZW5ndGg7dmFyIGw9ZnIoNCtpKzEpLHU9bCs0O2lmKEFbbD4+Ml09aSx0JiZzKXZlKGEsdSxpKzEpO2Vsc2UgaWYocylmb3IodmFyIGM9MDtjPGk7KytjKXt2YXIgZD1hLmNoYXJDb2RlQXQoYyk7ZD4yNTUmJihaKHUpLGsoIlN0cmluZyBoYXMgVVRGLTE2IGNvZGUgdW5pdHMgdGhhdCBkbyBub3QgZml0IGluIDggYml0cyIpKSx4W3UrY109ZH1lbHNlIGZvcih2YXIgYz0wO2M8aTsrK2MpeFt1K2NdPWFbY107cmV0dXJuIG4hPT1udWxsJiZuLnB1c2goWixsKSxsfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGRlc3RydWN0b3JGdW5jdGlvbihuKXtaKG4pfX0pfSxHcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp2b2lkIDAsQm49KGUscik9Pntmb3IodmFyIHQ9ZSxuPXQ+PjEsYT1uK3IvMjshKG4+PWEpJiZDZVtuXTspKytuO2lmKHQ9bjw8MSx0LWU+MzImJkdyKXJldHVybiBHci5kZWNvZGUoeC5zdWJhcnJheShlLHQpKTtmb3IodmFyIGk9IiIscz0wOyEocz49ci8yKTsrK3Mpe3ZhciBsPVlbZStzKjI+PjFdO2lmKGw9PTApYnJlYWs7aSs9U3RyaW5nLmZyb21DaGFyQ29kZShsKX1yZXR1cm4gaX0sTm49KGUscix0KT0+e2lmKHQ/Pyh0PTIxNDc0ODM2NDcpLHQ8MilyZXR1cm4gMDt0LT0yO2Zvcih2YXIgbj1yLGE9dDxlLmxlbmd0aCoyP3QvMjplLmxlbmd0aCxpPTA7aTxhOysraSl7dmFyIHM9ZS5jaGFyQ29kZUF0KGkpO1lbcj4+MV09cyxyKz0yfXJldHVybiBZW3I+PjFdPTAsci1ufSxZbj1lPT5lLmxlbmd0aCoyLEduPShlLHIpPT57Zm9yKHZhciB0PTAsbj0iIjshKHQ+PXIvNCk7KXt2YXIgYT1nW2UrdCo0Pj4yXTtpZihhPT0wKWJyZWFrO2lmKCsrdCxhPj02NTUzNil7dmFyIGk9YS02NTUzNjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGk+PjEwLDU2MzIwfGkmMTAyMyl9ZWxzZSBuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufSxxbj0oZSxyLHQpPT57aWYodD8/KHQ9MjE0NzQ4MzY0NyksdDw0KXJldHVybiAwO2Zvcih2YXIgbj1yLGE9bit0LTQsaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYocz49NTUyOTYmJnM8PTU3MzQzKXt2YXIgbD1lLmNoYXJDb2RlQXQoKytpKTtzPTY1NTM2KygocyYxMDIzKTw8MTApfGwmMTAyM31pZihnW3I+PjJdPXMscis9NCxyKzQ+YSlicmVha31yZXR1cm4gZ1tyPj4yXT0wLHItbn0sWG49ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO24+PTU1Mjk2JiZuPD01NzM0MyYmKyt0LHIrPTR9cmV0dXJuIHJ9LEtuPShlLHIsdCk9Pnt0PWoodCk7dmFyIG4sYSxpLHM7cj09PTI/KG49Qm4sYT1ObixzPVluLGk9bD0+Q2VbbD4+MV0pOnI9PT00JiYobj1HbixhPXFuLHM9WG4saT1sPT5BW2w+PjJdKSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6bD0+e2Zvcih2YXIgdT1BW2w+PjJdLGMsZD1sKzQsbT0wO208PXU7KyttKXt2YXIgaD1sKzQrbSpyO2lmKG09PXV8fGkoaCk9PTApe3ZhciBwPWgtZCx3PW4oZCxwKTtjPT09dm9pZCAwP2M9dzooYys9IlwwIixjKz13KSxkPWgrcn19cmV0dXJuIFoobCksY30sdG9XaXJlVHlwZToobCx1KT0+e3R5cGVvZiB1IT0ic3RyaW5nIiYmayhgQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBDKysgc3RyaW5nIHR5cGUgJHt0fWApO3ZhciBjPXModSksZD1mcig0K2Mrcik7cmV0dXJuIEFbZD4+Ml09Yy9yLGEodSxkKzQsYytyKSxsIT09bnVsbCYmbC5wdXNoKFosZCksZH0sYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjp5ZSxkZXN0cnVjdG9yRnVuY3Rpb24obCl7WihsKX19KX0sSm49KGUscix0LG4sYSxpKT0+e1JlW2VdPXtuYW1lOmoocikscmF3Q29uc3RydWN0b3I6Vyh0LG4pLHJhd0Rlc3RydWN0b3I6VyhhLGkpLGZpZWxkczpbXX19LFpuPShlLHIsdCxuLGEsaSxzLGwsdSxjKT0+e1JlW2VdLmZpZWxkcy5wdXNoKHtmaWVsZE5hbWU6aihyKSxnZXR0ZXJSZXR1cm5UeXBlOnQsZ2V0dGVyOlcobixhKSxnZXR0ZXJDb250ZXh0Omksc2V0dGVyQXJndW1lbnRUeXBlOnMsc2V0dGVyOlcobCx1KSxzZXR0ZXJDb250ZXh0OmN9KX0sUW49KGUscik9PntyPWoociksSyhlLHtpc1ZvaWQ6ITAsbmFtZTpyLGFyZ1BhY2tBZHZhbmNlOjAsZnJvbVdpcmVUeXBlOigpPT57fSx0b1dpcmVUeXBlOih0LG4pPT57fX0pfSxlYT0xLHJhPSgpPT5lYSx0YT0oZSxyLHQpPT54LmNvcHlXaXRoaW4oZSxyLHIrdCksbmE9KCk9PnRlLnRvSGFuZGxlKHt9KSxhYT0oZSxyLHQpPT57ZT10ZS50b1ZhbHVlKGUpLHI9dGUudG9WYWx1ZShyKSx0PXRlLnRvVmFsdWUodCksZVtyXT10fSxvYT0oZSxyKT0+e3ZhciB0PXVlW2VdO3JldHVybiB0PT09dm9pZCAwJiZrKGAke3J9IGhhcyB1bmtub3duIHR5cGUgJHtIcihlKX1gKSx0fSxpYT0oZSxyKT0+e2U9b2EoZSwiX2VtdmFsX3Rha2VfdmFsdWUiKTt2YXIgdD1lLnJlYWRWYWx1ZUZyb21Qb2ludGVyKHIpO3JldHVybiB0ZS50b0hhbmRsZSh0KX0scXI9KGUscik9PnIrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKStyKjQyOTQ5NjcyOTY6TmFOO2Z1bmN0aW9uIHNhKGUscix0KXt2YXIgbj1xcihlLHIpLGE9bmV3IERhdGUobioxZTMpO2dbdD4+Ml09YS5nZXRVVENTZWNvbmRzKCksZ1t0KzQ+PjJdPWEuZ2V0VVRDTWludXRlcygpLGdbdCs4Pj4yXT1hLmdldFVUQ0hvdXJzKCksZ1t0KzEyPj4yXT1hLmdldFVUQ0RhdGUoKSxnW3QrMTY+PjJdPWEuZ2V0VVRDTW9udGgoKSxnW3QrMjA+PjJdPWEuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLGdbdCsyND4+Ml09YS5nZXRVVENEYXkoKTt2YXIgaT1EYXRlLlVUQyhhLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApLHM9KGEuZ2V0VGltZSgpLWkpLygxZTMqNjAqNjAqMjQpfDA7Z1t0KzI4Pj4yXT1zfXZhciBCZT1lPT5lJTQ9PT0wJiYoZSUxMDAhPT0wfHxlJTQwMD09PTApLGxhPShlLHIsdCxuKT0+e3ZhciBhPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxpPW5ldyBEYXRlKGEsMCwxKSxzPW5ldyBEYXRlKGEsNiwxKSxsPWkuZ2V0VGltZXpvbmVPZmZzZXQoKSx1PXMuZ2V0VGltZXpvbmVPZmZzZXQoKSxjPU1hdGgubWF4KGwsdSk7QVtlPj4yXT1jKjYwLGdbcj4+Ml09KyhsIT11KTt2YXIgZD1wPT5wLnRvTG9jYWxlVGltZVN0cmluZyh2b2lkIDAse2hvdXIxMjohMSx0aW1lWm9uZU5hbWU6InNob3J0In0pLnNwbGl0KCIgIilbMV0sbT1kKGkpLGg9ZChzKTt1PGw/KHZlKG0sdCwxNyksdmUoaCxuLDE3KSk6KHZlKG0sbiwxNyksdmUoaCx0LDE3KSl9LHVhPSgpPT5EYXRlLm5vdygpLFhyPSgpPT4yMTQ3NDgzNjQ4LGZhPSgpPT5YcigpLEtyO0tyPSgpPT5wZXJmb3JtYW5jZS5ub3coKTt2YXIgY2E9ZT0+e3ZhciByPSRlLmJ1ZmZlcix0PShlLXIuYnl0ZUxlbmd0aCs2NTUzNSkvNjU1MzY7dHJ5e3JldHVybiAkZS5ncm93KHQpLHdyKCksMX1jYXRjaHt9fSxkYT1lPT57dmFyIHI9eC5sZW5ndGg7ZT4+Pj0wO3ZhciB0PVhyKCk7aWYoZT50KXJldHVybiExO2Zvcih2YXIgbj0odSxjKT0+dSsoYy11JWMpJWMsYT0xO2E8PTQ7YSo9Mil7dmFyIGk9ciooMSsuMi9hKTtpPU1hdGgubWluKGksZSsxMDA2NjMyOTYpO3ZhciBzPU1hdGgubWluKHQsbihNYXRoLm1heChlLGkpLDY1NTM2KSksbD1jYShzKTtpZihsKXJldHVybiEwfXJldHVybiExfSx1cj17fSx2YT0oKT0+aHJ8fCIuL3RoaXMucHJvZ3JhbSIsUGU9KCk9PntpZighUGUuc3RyaW5ncyl7dmFyIGU9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIscj17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmUsXzp2YSgpfTtmb3IodmFyIHQgaW4gdXIpdXJbdF09PT12b2lkIDA/ZGVsZXRlIHJbdF06clt0XT11clt0XTt2YXIgbj1bXTtmb3IodmFyIHQgaW4gciluLnB1c2goYCR7dH09JHtyW3RdfWApO1BlLnN0cmluZ3M9bn1yZXR1cm4gUGUuc3RyaW5nc30saGE9KGUscik9Pntmb3IodmFyIHQ9MDt0PGUubGVuZ3RoOysrdClJW3IrK109ZS5jaGFyQ29kZUF0KHQpO0lbcl09MH0sbWE9KGUscik9Pnt2YXIgdD0wO3JldHVybiBQZSgpLmZvckVhY2goKG4sYSk9Pnt2YXIgaT1yK3Q7QVtlK2EqND4+Ml09aSxoYShuLGkpLHQrPW4ubGVuZ3RoKzF9KSwwfSxwYT0oZSxyKT0+e3ZhciB0PVBlKCk7QVtlPj4yXT10Lmxlbmd0aDt2YXIgbj0wO3JldHVybiB0LmZvckVhY2goYT0+bis9YS5sZW5ndGgrMSksQVtyPj4yXT1uLDB9O2Z1bmN0aW9uIF9hKGUpe3RyeXt2YXIgcj1QLmdldFN0cmVhbUZyb21GRChlKTtyZXR1cm4gby5jbG9zZShyKSwwfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuIHQuZXJybm99fWZ1bmN0aW9uIGdhKGUscil7dHJ5e3ZhciB0PTAsbj0wLGE9MCxpPVAuZ2V0U3RyZWFtRnJvbUZEKGUpLHM9aS50dHk/MjpvLmlzRGlyKGkubW9kZSk/MzpvLmlzTGluayhpLm1vZGUpPzc6NDtyZXR1cm4gSVtyXT1zLFlbcisyPj4xXT1hLCQ9W3Q+Pj4wLCh5PXQsK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3IrOD4+Ml09JFswXSxnW3IrMTI+PjJdPSRbMV0sJD1bbj4+PjAsKHk9biwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbcisxNj4+Ml09JFswXSxnW3IrMjA+PjJdPSRbMV0sMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgeWE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLnJlYWQoZSxJLHMsbCxuKTtpZih1PDApcmV0dXJuLTE7aWYoYSs9dSx1PGwpYnJlYWt9cmV0dXJuIGF9O2Z1bmN0aW9uIHdhKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPXlhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319ZnVuY3Rpb24gRWEoZSxyLHQsbixhKXt2YXIgaT1xcihyLHQpO3RyeXtpZihpc05hTihpKSlyZXR1cm4gNjE7dmFyIHM9UC5nZXRTdHJlYW1Gcm9tRkQoZSk7cmV0dXJuIG8ubGxzZWVrKHMsaSxuKSwkPVtzLnBvc2l0aW9uPj4+MCwoeT1zLnBvc2l0aW9uLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1thPj4yXT0kWzBdLGdbYSs0Pj4yXT0kWzFdLHMuZ2V0ZGVudHMmJmk9PT0wJiZuPT09MCYmKHMuZ2V0ZGVudHM9bnVsbCksMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgYmE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLndyaXRlKGUsSSxzLGwsbik7aWYodTwwKXJldHVybi0xO2ErPXV9cmV0dXJuIGF9O2Z1bmN0aW9uIGthKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPWJhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319dmFyIFBhPShlLHIpPT57Zm9yKHZhciB0PTAsbj0wO248PXI7dCs9ZVtuKytdKTtyZXR1cm4gdH0sSnI9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxacj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLEFhPShlLHIpPT57Zm9yKHZhciB0PW5ldyBEYXRlKGUuZ2V0VGltZSgpKTtyPjA7KXt2YXIgbj1CZSh0LmdldEZ1bGxZZWFyKCkpLGE9dC5nZXRNb250aCgpLGk9KG4/SnI6WnIpW2FdO2lmKHI+aS10LmdldERhdGUoKSlyLT1pLXQuZ2V0RGF0ZSgpKzEsdC5zZXREYXRlKDEpLGE8MTE/dC5zZXRNb250aChhKzEpOih0LnNldE1vbnRoKDApLHQuc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpKzEpKTtlbHNlIHJldHVybiB0LnNldERhdGUodC5nZXREYXRlKCkrciksdH1yZXR1cm4gdH0sRGE9KGUscik9PntJLnNldChlLHIpfSxRcj0oZSxyLHQsbik9Pnt2YXIgYT1BW24rNDA+PjJdLGk9e3RtX3NlYzpnW24+PjJdLHRtX21pbjpnW24rND4+Ml0sdG1faG91cjpnW24rOD4+Ml0sdG1fbWRheTpnW24rMTI+PjJdLHRtX21vbjpnW24rMTY+PjJdLHRtX3llYXI6Z1tuKzIwPj4yXSx0bV93ZGF5OmdbbisyND4+Ml0sdG1feWRheTpnW24rMjg+PjJdLHRtX2lzZHN0OmdbbiszMj4+Ml0sdG1fZ210b2ZmOmdbbiszNj4+Ml0sdG1fem9uZTphP3NlKGEpOiIifSxzPXNlKHQpLGw9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9O2Zvcih2YXIgdSBpbiBsKXM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLGxbdV0pO3ZhciBjPVsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXTtmdW5jdGlvbiBtKHYsXyxMKXtmb3IodmFyIFQ9dHlwZW9mIHY9PSJudW1iZXIiP3YudG9TdHJpbmcoKTp2fHwiIjtULmxlbmd0aDxfOylUPUxbMF0rVDtyZXR1cm4gVH1mdW5jdGlvbiBoKHYsXyl7cmV0dXJuIG0odixfLCIwIil9ZnVuY3Rpb24gcCh2LF8pe2Z1bmN0aW9uIEwoQil7cmV0dXJuIEI8MD8tMTpCPjA/MTowfXZhciBUO3JldHVybihUPUwodi5nZXRGdWxsWWVhcigpLV8uZ2V0RnVsbFllYXIoKSkpPT09MCYmKFQ9TCh2LmdldE1vbnRoKCktXy5nZXRNb250aCgpKSk9PT0wJiYoVD1MKHYuZ2V0RGF0ZSgpLV8uZ2V0RGF0ZSgpKSksVH1mdW5jdGlvbiB3KHYpe3N3aXRjaCh2LmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIHY7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUodi5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIEQodil7dmFyIF89QWEobmV3IERhdGUodi50bV95ZWFyKzE5MDAsMCwxKSx2LnRtX3lkYXkpLEw9bmV3IERhdGUoXy5nZXRGdWxsWWVhcigpLDAsNCksVD1uZXcgRGF0ZShfLmdldEZ1bGxZZWFyKCkrMSwwLDQpLEI9dyhMKSxPPXcoVCk7cmV0dXJuIHAoQixfKTw9MD9wKE8sXyk8PTA/Xy5nZXRGdWxsWWVhcigpKzE6Xy5nZXRGdWxsWWVhcigpOl8uZ2V0RnVsbFllYXIoKS0xfXZhciBNPXsiJWEiOnY9PmNbdi50bV93ZGF5XS5zdWJzdHJpbmcoMCwzKSwiJUEiOnY9PmNbdi50bV93ZGF5XSwiJWIiOnY9PmRbdi50bV9tb25dLnN1YnN0cmluZygwLDMpLCIlQiI6dj0+ZFt2LnRtX21vbl0sIiVDIjp2PT57dmFyIF89di50bV95ZWFyKzE5MDA7cmV0dXJuIGgoXy8xMDB8MCwyKX0sIiVkIjp2PT5oKHYudG1fbWRheSwyKSwiJWUiOnY9Pm0odi50bV9tZGF5LDIsIiAiKSwiJWciOnY9PkQodikudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjpELCIlSCI6dj0+aCh2LnRtX2hvdXIsMiksIiVJIjp2PT57dmFyIF89di50bV9ob3VyO3JldHVybiBfPT0wP189MTI6Xz4xMiYmKF8tPTEyKSxoKF8sMil9LCIlaiI6dj0+aCh2LnRtX21kYXkrUGEoQmUodi50bV95ZWFyKzE5MDApP0pyOlpyLHYudG1fbW9uLTEpLDMpLCIlbSI6dj0+aCh2LnRtX21vbisxLDIpLCIlTSI6dj0+aCh2LnRtX21pbiwyKSwiJW4iOigpPT5gCmAsIiVwIjp2PT52LnRtX2hvdXI+PTAmJnYudG1faG91cjwxMj8iQU0iOiJQTSIsIiVTIjp2PT5oKHYudG1fc2VjLDIpLCIldCI6KCk9PiIJIiwiJXUiOnY9PnYudG1fd2RheXx8NywiJVUiOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy12LnRtX3dkYXk7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJVYiOnY9Pnt2YXIgXz1NYXRoLmZsb29yKCh2LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTcpLzcpO2lmKCh2LnRtX3dkYXkrMzcxLXYudG1feWRheS0yKSU3PD0yJiZfKyssXyl7aWYoXz09NTMpe3ZhciBUPSh2LnRtX3dkYXkrMzcxLXYudG1feWRheSklNztUIT00JiYoVCE9M3x8IUJlKHYudG1feWVhcikpJiYoXz0xKX19ZWxzZXtfPTUyO3ZhciBMPSh2LnRtX3dkYXkrNy12LnRtX3lkYXktMSklNzsoTD09NHx8TD09NSYmQmUodi50bV95ZWFyJTQwMC0xKSkmJl8rK31yZXR1cm4gaChfLDIpfSwiJXciOnY9PnYudG1fd2RheSwiJVciOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTc7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJXkiOnY9Pih2LnRtX3llYXIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjp2PT52LnRtX3llYXIrMTkwMCwiJXoiOnY9Pnt2YXIgXz12LnRtX2dtdG9mZixMPV8+PTA7cmV0dXJuIF89TWF0aC5hYnMoXykvNjAsXz1fLzYwKjEwMCtfJTYwLChMPyIrIjoiLSIpKygiMDAwMCIrXykuc2xpY2UoLTQpfSwiJVoiOnY9PnYudG1fem9uZSwiJSUiOigpPT4iJSJ9O3M9cy5yZXBsYWNlKC8lJS9nLCJcMFwwIik7Zm9yKHZhciB1IGluIE0pcy5pbmNsdWRlcyh1KSYmKHM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLE1bdV0oaSkpKTtzPXMucmVwbGFjZSgvXDBcMC9nLCIlIik7dmFyIEY9U2UocywhMSk7cmV0dXJuIEYubGVuZ3RoPnI/MDooRGEoRixlKSxGLmxlbmd0aC0xKX0sJGE9KGUscix0LG4sYSk9PlFyKGUscix0LG4pO28uY3JlYXRlUHJlbG9hZGVkRmlsZT1WdCxvLnN0YXRpY0luaXQoKSxTcj1mLkludGVybmFsRXJyb3I9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihyKXtzdXBlcihyKSx0aGlzLm5hbWU9IkludGVybmFsRXJyb3IifX0sZW4oKSxtZT1mLkJpbmRpbmdFcnJvcj1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIpLHRoaXMubmFtZT0iQmluZGluZ0Vycm9yIn19LHZuKCksdW4oKSxFbigpLHhyPWYuVW5ib3VuZFR5cGVFcnJvcj1BbihFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpLE9uKCk7dmFyIENhPXtsOkN0LGM6VHQsVTpqdCxzOnp0LFI6eHQsSjpIdCxXOld0LE86QnQsUDpOdCxLOll0LEk6R3QsSDpxdCxROlh0LEU6S3QsVjpKdCxrOlp0LEI6UXQsWjp0bixoOkRuLHk6Rm4sajpUbixiOlNuLGE6TW4sWTpZcix3OlZuLGk6VW4sZjp6bixkOnhuLG06SG4sdjpXbix0OktuLG46Sm4sZTpabixfOlFuLFM6cmEsVDp0YSx4Ok5yLGFhOm5hLCQ6YWEsZzppYSx6OnNhLEY6bGEscDp1YSxHOmZhLG86S3IsRDpkYSxNOm1hLE46cGEscjpfYSxMOmdhLHU6d2EsQTpFYSxxOmthLFg6UXIsQzokYX0sej0kdCgpLGZyPWU9Pihmcj16LmRhKShlKSxldD1lPT4oZXQ9ei5mYSkoZSksWj1lPT4oWj16LmdhKShlKSxydD1lPT4ocnQ9ei5pYSkoZSk7Zi5keW5DYWxsX2ppamk9KGUscix0LG4sYSk9PihmLmR5bkNhbGxfamlqaT16LmphKShlLHIsdCxuLGEpLGYuZHluQ2FsbF9paWlqaT0oZSxyLHQsbixhLGkpPT4oZi5keW5DYWxsX2lpaWppPXoua2EpKGUscix0LG4sYSxpKSxmLmR5bkNhbGxfamlpaWo9KGUscix0LG4sYSxpKT0+KGYuZHluQ2FsbF9qaWlpaj16LmxhKShlLHIsdCxuLGEsaSksZi5keW5DYWxsX2lpaWlpaj0oZSxyLHQsbixhLGkscyk9PihmLmR5bkNhbGxfaWlpaWlqPXoubWEpKGUscix0LG4sYSxpLHMpLGYuZHluQ2FsbF92aWlqaWk9KGUscix0LG4sYSxpLHMpPT4oZi5keW5DYWxsX3ZpaWppaT16Lm5hKShlLHIsdCxuLGEsaSxzKSxmLmR5bkNhbGxfaWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUpPT4oZi5keW5DYWxsX2lpaWlpamo9ei5vYSkoZSxyLHQsbixhLGkscyxsLHUpLGYuZHluQ2FsbF9paWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUsYyk9PihmLmR5bkNhbGxfaWlpaWlpamo9ei5wYSkoZSxyLHQsbixhLGkscyxsLHUsYyksZi5fZmZfaDI2NF9jYWJhY190YWJsZXM9MjA2ODEyO3ZhciBOZTtnZT1mdW5jdGlvbiBlKCl7TmV8fHR0KCksTmV8fChnZT1lKX07ZnVuY3Rpb24gdHQoKXtpZihvZT4wfHwocHQoKSxvZT4wKSlyZXR1cm47ZnVuY3Rpb24gZSgpe05lfHwoTmU9ITAsZi5jYWxsZWRSdW49ITAsIXByJiYoX3QoKSxVKGYpLGYub25SdW50aW1lSW5pdGlhbGl6ZWQmJmYub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxndCgpKSl9Zi5zZXRTdGF0dXM/KGYuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnNldFN0YXR1cygiIil9LDEpLGUoKX0sMSkpOmUoKX1pZihmLnByZUluaXQpZm9yKHR5cGVvZiBmLnByZUluaXQ9PSJmdW5jdGlvbiImJihmLnByZUluaXQ9W2YucHJlSW5pdF0pO2YucHJlSW5pdC5sZW5ndGg+MDspZi5wcmVJbml0LnBvcCgpKCk7dHQoKTtsZXQgbnQ9MzI7ZnVuY3Rpb24gYXQoZSxyPTMsdD01MDApe2xldCBuPTA7Zm9yKDtuPHI7KXRyeXtyZXR1cm4gZSgpfWNhdGNoKGEpe2lmKG50Pj0yNCYmY29uc29sZS53YXJuKGBBdHRlbXB0ICR7bisxfSBmYWlsZWQ6ICR7YS5tZXNzYWdlfWApLG4rKyxuPj1yKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIGFmdGVyICR7cn0gYXR0ZW1wdHNgKX19ZnVuY3Rpb24gRmEoZSl7Y29uc3Qgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoci5vcGVuKCJIRUFEIixlLCExKSxyLnNlbmQoKSxyLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGdldEZpbGVTaXplIHJlcXVlc3QgZmFpbGVkOiAke2V9YCk7cmV0dXJuIHBhcnNlSW50KHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpfWZ1bmN0aW9uIFRhKGUscix0KXtjb25zdCBuPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihuLm9wZW4oIkdFVCIsZSwhMSksbi5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsYGJ5dGVzPSR7cn0tJHtyK3QtMX1gKSxuLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLG4uc2VuZCgpLG4uc3RhdHVzIT09MjA2JiZuLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGZldGNoQXJyYXlCdWZmZXIgcmVxdWVzdCBmYWlsZWQ6ICR7ZX1gKTtyZXR1cm4gbi5yZXNwb25zZX1jbGFzcyBwZXtjb25zdHJ1Y3RvcihyKXtsZXQgdDt0eXBlb2Ygcj09InN0cmluZyI/KHQ9bmV3IEZpbGUoW10sZW5jb2RlVVJJQ29tcG9uZW50KHIpKSxvLmZpbGVzeXN0ZW1zLldPUktFUkZTLnN0cmVhbV9vcHMucmVhZD1mdW5jdGlvbihhLGkscyxsLHUpe2NvbnN0IGM9ZGVjb2RlVVJJQ29tcG9uZW50KGEubm9kZS5jb250ZW50cy5uYW1lKTtpZihhLm5vZGUuc2l6ZT09PTAmJihhLm5vZGUuc2l6ZT1hdCgoKT0+RmEoYykpKSx1Pj1hLm5vZGUuc2l6ZSlyZXR1cm4gMDtjb25zdCBkPWF0KCgpPT5UYShjLHUsbCkpLG09ZC5ieXRlTGVuZ3RoO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShkKSxzKSxtfSk6dD1yLHRoaXMubW91bnRQb2ludD0iL2RhdGEiLHRoaXMubW91bnRPcHRzPXtmaWxlczpbdF19LHRoaXMuZmlsZVBhdGg9dGhpcy5tb3VudFBvaW50KyIvIit0Lm5hbWV9bW91bnQoKXtvLm1rZGlyKHRoaXMubW91bnRQb2ludCksby5tb3VudChvLmZpbGVzeXN0ZW1zLldPUktFUkZTLHRoaXMubW91bnRPcHRzLHRoaXMubW91bnRQb2ludCl9dW5tb3VudCgpe28udW5tb3VudCh0aGlzLm1vdW50UG9pbnQpLG8ucm1kaXIodGhpcy5tb3VudFBvaW50KX19ZnVuY3Rpb24gY3IoZSl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlLmV4dHJhZGF0YSksdD17aWQ6ZS5pZCxpbmRleDplLmluZGV4LGNvZGVjX3R5cGU6ZS5jb2RlY190eXBlLGNvZGVjX3R5cGVfc3RyaW5nOmUuY29kZWNfdHlwZV9zdHJpbmcsY29kZWNfbmFtZTplLmNvZGVjX25hbWUsY29kZWNfc3RyaW5nOmUuY29kZWNfc3RyaW5nLGNvbG9yX3ByaW1hcmllczplLmNvbG9yX3ByaW1hcmllcyxjb2xvcl90cmFuc2ZlcjplLmNvbG9yX3RyYW5zZmVyLGNvbG9yX3NwYWNlOmUuY29sb3Jfc3BhY2UsY29sb3JfcmFuZ2U6ZS5jb2xvcl9yYW5nZSxwcm9maWxlOmUucHJvZmlsZSxwaXhfZm10OmUucGl4X2ZtdCxsZXZlbDplLmxldmVsLHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGNoYW5uZWxzOmUuY2hhbm5lbHMsc2FtcGxlX3JhdGU6ZS5zYW1wbGVfcmF0ZSxzYW1wbGVfZm10OmUuc2FtcGxlX2ZtdCxiaXRfcmF0ZTplLmJpdF9yYXRlLGV4dHJhZGF0YV9zaXplOmUuZXh0cmFkYXRhX3NpemUsZXh0cmFkYXRhOnIscl9mcmFtZV9yYXRlOmUucl9mcmFtZV9yYXRlLGF2Z19mcmFtZV9yYXRlOmUuYXZnX2ZyYW1lX3JhdGUsc2FtcGxlX2FzcGVjdF9yYXRpbzplLnNhbXBsZV9hc3BlY3RfcmF0aW8sZGlzcGxheV9hc3BlY3RfcmF0aW86ZS5kaXNwbGF5X2FzcGVjdF9yYXRpbyxzdGFydF90aW1lOmUuc3RhcnRfdGltZSxkdXJhdGlvbjplLmR1cmF0aW9uLHJvdGF0aW9uOmUucm90YXRpb24sZmxpcDplLmZsaXAsbmJfZnJhbWVzOmUubmJfZnJhbWVzLHRhZ3M6ZS50YWdzfTtyZXR1cm4gZS5kZWxldGUoKSx0fWZ1bmN0aW9uIGRyKGUpe2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhKSx0PXtrZXlmcmFtZTplLmtleWZyYW1lLHRpbWVzdGFtcDplLnRpbWVzdGFtcCxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLGRhdGE6cn07cmV0dXJuIGUuZGVsZXRlKCksdH1mdW5jdGlvbiBTYShlLHI9MCx0PS0xKXtjb25zdCBuPW5ldyBwZShlKTtuLm1vdW50KCk7dHJ5e2NvbnN0IGE9Zi5nZXRfYXZfc3RyZWFtKG4uZmlsZVBhdGgscix0KTtyZXR1cm4gY3IoYSl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfc3RyZWFtIGZhaWxlZDogIithLm1lc3NhZ2UpfWZpbmFsbHl7bi51bm1vdW50KCl9fWZ1bmN0aW9uIE1hKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9hdl9zdHJlYW1zKHIuZmlsZVBhdGgpLG49W107Zm9yKGxldCBhPTA7YTx0LnN0cmVhbXMuc2l6ZSgpO2ErKyluLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9hdl9zdHJlYW1zIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIFJhKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9tZWRpYV9pbmZvKHIuZmlsZVBhdGgpLG49e2Zvcm1hdF9uYW1lOnQuZm9ybWF0X25hbWUsZHVyYXRpb246dC5kdXJhdGlvbixiaXRfcmF0ZTp0LmJpdF9yYXRlLHN0YXJ0X3RpbWU6dC5zdGFydF90aW1lLG5iX3N0cmVhbXM6dC5uYl9zdHJlYW1zLHN0cmVhbXM6W119O2ZvcihsZXQgYT0wO2E8dC5zdHJlYW1zLnNpemUoKTthKyspbi5zdHJlYW1zLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9tZWRpYV9pbmZvIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIE9hKGUscix0PTAsbj0tMSxhPTEpe2NvbnN0IGk9bmV3IHBlKGUpO2kubW91bnQoKTt0cnl7Y29uc3Qgcz1mLmdldF9hdl9wYWNrZXQoaS5maWxlUGF0aCxyLHQsbixhKTtyZXR1cm4gZHIocyl9Y2F0Y2gocyl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0IGZhaWxlZDogIitzLm1lc3NhZ2UpfWZpbmFsbHl7aS51bm1vdW50KCl9fWZ1bmN0aW9uIElhKGUscix0PTEpe2NvbnN0IG49bmV3IHBlKGUpO24ubW91bnQoKTt0cnl7Y29uc3QgYT1mLmdldF9hdl9wYWNrZXRzKG4uZmlsZVBhdGgscix0KSxpPVtdO2ZvcihsZXQgcz0wO3M8YS5wYWNrZXRzLnNpemUoKTtzKyspaS5wdXNoKGRyKGEucGFja2V0cy5nZXQocykpKTtyZXR1cm4gYS5wYWNrZXRzLmRlbGV0ZSgpLGl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0cyBmYWlsZWQ6ICIrYS5tZXNzYWdlKX1maW5hbGx5e24udW5tb3VudCgpfX1hc3luYyBmdW5jdGlvbiBMYShlLHIsdD0wLG49MCxhPTAsaT0tMSxzPTEpe2NvbnN0IGw9bmV3IHBlKHIpO2wubW91bnQoKTtsZXQgdT1udWxsO3RyeXtpZih1PWYuQVZQYWNrZXRSZWFkZXIuY3JlYXRlKGwuZmlsZVBhdGgsdCxuLGEsaSxzKSwhdSl0aHJvdyBuZXcgRXJyb3IoIkFWUGFja2V0UmVhZGVyLmNyZWF0ZSBmYWlsZWQgKG51bGwgcmVhZGVyKSIpO2NvbnN0IGM9VmEoZSk7Zm9yKDs7KXtjb25zdCBkPXUucmVhZF9uZXh0X2F2X3BhY2tldCgpO2lmKHUuaGFzX2Vycm9yKCkpdGhyb3cgbmV3IEVycm9yKCJBVlBhY2tldFJlYWRlciByZWFkX25leHRfYXZfcGFja2V0IGVycm9yIik7aWYodS5pc19maW5pc2hlZCgpKXthd2FpdCBjKDApO2JyZWFrfWlmKGF3YWl0IGMoZCk9PT0wKWJyZWFrfX1jYXRjaChjKXt0aHJvdyBuZXcgRXJyb3IoInJlYWRBVlBhY2tldCBwaXBlbGluZSBmYWlsZWQ6ICIrYy5tZXNzYWdlKX1maW5hbGx5e3UmJnUuZGVsZXRlKCksbC51bm1vdW50KCl9cmV0dXJuIDF9ZnVuY3Rpb24gVmEoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZShuPT57Y29uc3QgYT17dHlwZToiQVZQYWNrZXRTdHJlYW0iLG1zZ0lkOmUscmVzdWx0Om51bGx9O2lmKHQ9PT0wKXtzZWxmLnBvc3RNZXNzYWdlKGEpLG4oMSk7cmV0dXJufWNvbnN0IGk9ZHIodCk7YS5yZXN1bHQ9aSxzZWxmLnBvc3RNZXNzYWdlKGEsW2kuZGF0YS5idWZmZXJdKTtjb25zdCBzPWw9Pntjb25zdHt0eXBlOnUsbXNnSWQ6Y309bC5kYXRhO2M9PT1lJiYodT09PSJSZWFkTmV4dEFWUGFja2V0Ij8oc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDEpKTp1PT09IlN0b3BSZWFkQVZQYWNrZXQiJiYoc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDApKSl9O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KX19ZnVuY3Rpb24gVWEoZSl7bnQ9ZSxmLnNldF9hdl9sb2dfbGV2ZWwoZSl9cmV0dXJuIGYuZ2V0QVZTdHJlYW09U2EsZi5nZXRBVlN0cmVhbXM9TWEsZi5nZXRNZWRpYUluZm89UmEsZi5nZXRBVlBhY2tldD1PYSxmLmdldEFWUGFja2V0cz1JYSxmLnJlYWRBVlBhY2tldD1MYSxmLnNldEFWTG9nTGV2ZWw9VWEsQz1uZSxDfX0pKCk7bGV0IFE7c2VsZi5wb3N0TWVzc2FnZSh7dHlwZTpHLldhc21Xb3JrZXJMb2FkZWR9KSxzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGFzeW5jIGZ1bmN0aW9uKEUpe2NvbnN0e3R5cGU6UixkYXRhOkMsbXNnSWQ6Zn09RS5kYXRhO3RyeXtzd2l0Y2goUil7Y2FzZSJMb2FkV0FTTSI6cmV0dXJuIGF3YWl0IHN0KEMpO2Nhc2UiR2V0QVZTdHJlYW0iOnJldHVybiBsdChDLGYpO2Nhc2UiR2V0QVZTdHJlYW1zIjpyZXR1cm4gdXQoQyxmKTtjYXNlIkdldE1lZGlhSW5mbyI6cmV0dXJuIGZ0KEMsZik7Y2FzZSJHZXRBVlBhY2tldCI6cmV0dXJuIGN0KEMsZik7Y2FzZSJHZXRBVlBhY2tldHMiOnJldHVybiBkdChDLGYpO2Nhc2UiUmVhZEFWUGFja2V0IjpyZXR1cm4gYXdhaXQgdnQoQyxmKTtjYXNlIlNldEFWTG9nTGV2ZWwiOnJldHVybiBodChDLGYpO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChVKXtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOlIsbXNnSWQ6ZixlcnJNc2c6VSBpbnN0YW5jZW9mIEVycm9yP1UubWVzc2FnZToiVW5rbm93biBFcnJvciJ9KX19KTthc3luYyBmdW5jdGlvbiBzdChFKXtjb25zdHt3YXNtRmlsZVBhdGg6Un09RXx8e307UT1hd2FpdCBpdCh7bG9jYXRlRmlsZTooQyxmKT0+Qy5lbmRzV2l0aCgiLndhc20iKSYmUj9SOmYrQyxvblJ1bnRpbWVJbml0aWFsaXplZDooKT0+e3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5XQVNNUnVudGltZUluaXRpYWxpemVkfSl9fSl9ZnVuY3Rpb24gbHQoRSxSKXtjb25zdHtzb3VyY2U6QyxzdHJlYW1UeXBlOmYsc3RyZWFtSW5kZXg6VX09RSxIPVEuZ2V0QVZTdHJlYW0oQyxmLFUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbSxtc2dJZDpSLHJlc3VsdDpIfSxbSC5leHRyYWRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gdXQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0QVZTdHJlYW1zKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbXMsbXNnSWQ6UixyZXN1bHQ6Zn0sZi5tYXAoVT0+VS5leHRyYWRhdGEuYnVmZmVyKSl9ZnVuY3Rpb24gZnQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0TWVkaWFJbmZvKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRNZWRpYUluZm8sbXNnSWQ6UixyZXN1bHQ6Zn0sZi5zdHJlYW1zLm1hcChVPT5VLmV4dHJhZGF0YS5idWZmZXIpKX1mdW5jdGlvbiBjdChFLFIpe2NvbnN0e3NvdXJjZTpDLHRpbWU6ZixzdHJlYW1UeXBlOlUsc3RyZWFtSW5kZXg6SCxzZWVrRmxhZzpuZX09RSxhZT1RLmdldEFWUGFja2V0KEMsZixVLEgsbmUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlBhY2tldCxtc2dJZDpSLHJlc3VsdDphZX0sW2FlLmRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gZHQoRSxSKXtjb25zdHtzb3VyY2U6Qyx0aW1lOmYsc2Vla0ZsYWc6VX09RSxIPVEuZ2V0QVZQYWNrZXRzKEMsZixVKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuR2V0QVZQYWNrZXRzLG1zZ0lkOlIscmVzdWx0Okh9LEgubWFwKG5lPT5uZS5kYXRhLmJ1ZmZlcikpfWFzeW5jIGZ1bmN0aW9uIHZ0KEUsUil7Y29uc3R7c291cmNlOkMsc3RhcnQ6ZixlbmQ6VSxzdHJlYW1UeXBlOkgsc3RyZWFtSW5kZXg6bmUsc2Vla0ZsYWc6YWV9PUUsRGU9YXdhaXQgUS5yZWFkQVZQYWNrZXQoUixDLGYsVSxILG5lLGFlKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuUmVhZEFWUGFja2V0LG1zZ0lkOlIscmVzdWx0OkRlfSl9ZnVuY3Rpb24gaHQoRSxSKXtjb25zdHtsZXZlbDpDfT1FO1Euc2V0QVZMb2dMZXZlbChDKSxzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJTZXRBVkxvZ0xldmVsIixtc2dJZDpSfSl9fSkoKTsK",Wa=t=>Uint8Array.from(atob(t),e=>e.charCodeAt(0)),Ks=typeof window<"u"&&window.Blob&&new Blob([Wa(bn)],{type:"text/javascript;charset=utf-8"});function La(t){let e;try{if(e=Ks&&(window.URL||window.webkitURL).createObjectURL(Ks),!e)throw"";const i=new Worker(e,{name:t==null?void 0:t.name});return i.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(e)}),i}catch{return new Worker("data:text/javascript;base64,"+bn,{name:t==null?void 0:t.name})}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const Ms=1e6;class fi{constructor(e){oi(this,"wasmWorker"),oi(this,"wasmWorkerLoadStatus"),oi(this,"msgId"),oi(this,"source"),this.wasmWorker=new La({name:"web-demuxer"}),this.wasmWorkerLoadStatus=new Promise((i,n)=>{this.wasmWorker.addEventListener("message",c=>{const{type:o,errMsg:m}=c.data;o===rt.WasmWorkerLoaded&&this.post(rt.LoadWASM,{wasmFilePath:e==null?void 0:e.wasmFilePath}),o===rt.WASMRuntimeInitialized&&i(),o===rt.LoadWASM&&m&&n(m)})}),this.msgId=0}post(e,i,n){this.wasmWorker.postMessage({type:e,msgId:n??this.msgId++,data:i})}getFromWorker(e,i){return new Promise((n,c)=>{if(!this.source){c("source is not loaded. call load() first");return}const o=this.msgId,m=h=>{let{data:S}=h;S.type===e&&S.msgId===o&&(S.errMsg?c(S.errMsg):n(S.result),this.wasmWorker.removeEventListener("message",m))};this.wasmWorker.addEventListener("message",m),this.post(e,i,o)})}async load(e){await this.wasmWorkerLoadStatus,this.source=e}destroy(){this.source=void 0,this.wasmWorker.terminate()}getMediaInfo(){return this.getFromWorker(rt.GetMediaInfo,{source:this.source})}getAVStream(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:I0.AVMEDIA_TYPE_VIDEO,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1;return this.getFromWorker(rt.GetAVStream,{source:this.source,streamType:e,streamIndex:i})}getAVStreams(){return this.getFromWorker(rt.GetAVStreams,{source:this.source})}getAVPacket(e){let i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:I0.AVMEDIA_TYPE_VIDEO,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:-1,c=arguments.length>3&&arguments[3]!==void 0?arguments[3]:di.AVSEEK_FLAG_BACKWARD;return this.getFromWorker(rt.GetAVPacket,{source:this.source,time:e,streamType:i,streamIndex:n,seekFlag:c})}getAVPackets(e){let i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:di.AVSEEK_FLAG_BACKWARD;return this.getFromWorker(rt.GetAVPackets,{source:this.source,time:e,seekFlag:i})}readAVPacket(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:I0.AVMEDIA_TYPE_VIDEO,c=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,o=arguments.length>4&&arguments[4]!==void 0?arguments[4]:di.AVSEEK_FLAG_BACKWARD;const m=new CountQueuingStrategy({highWaterMark:1}),h=this.msgId;let S=0,T,G;return new ReadableStream({start:f=>{if(!this.source){f.error("source is not loaded. call load() first");return}T=A=>{const w=A.data;w.type===rt.ReadAVPacket&&w.msgId===h&&w.errMsg&&(f.error(w.errMsg),this.wasmWorker.removeEventListener("message",T)),w.type===rt.AVPacketStream&&w.msgId===h&&(w.result&&!G?f.enqueue(w.result):(this.wasmWorker.removeEventListener("message",T),G?G():f.close()))},this.wasmWorker.addEventListener("message",T),this.post(rt.ReadAVPacket,{source:this.source,start:e,end:i,streamType:n,streamIndex:c,seekFlag:o})},pull:()=>{S>0&&this.post(rt.ReadNextAVPacket,void 0,h),S++},cancel:()=>new Promise(f=>{G=f,this.post(rt.StopReadAVPacket,void 0,h)})},m)}setLogLevel(e){return this.getFromWorker(rt.SetAVLogLevel,{level:e})}getMediaStream(e,i){return this.getAVStream(Ci[e],i)}seekMediaPacket(e,i,n){return this.getAVPacket(i,Ci[e],void 0,n)}readMediaPacket(e,i,n,c){return this.readAVPacket(i,n,Ci[e],void 0,c)}genDecoderConfig(e,i){var n,c;return e===ws.VIDEO?{codec:i.codec_string,codedWidth:i.width,codedHeight:i.height,description:((n=i.extradata)==null?void 0:n.length)>0?i.extradata:void 0,rotation:i.rotation,flip:i.flip}:{codec:i.codec_string||"",sampleRate:i.sample_rate,numberOfChannels:i.channels,description:((c=i.extradata)==null?void 0:c.length)>0?i.extradata:void 0}}genEncodedChunk(e,i){const n={type:i.keyframe===1?"key":"delta",timestamp:i.timestamp*Ms,duration:i.duration*Ms,data:i.data};return e===ws.VIDEO?new EncodedVideoChunk(n):new EncodedAudioChunk(n)}getDecoderConfig(e){return this.getMediaStream(e).then(i=>this.genDecoderConfig(e,i))}seek(e,i,n){return this.seekMediaPacket(e,i,n).then(c=>this.genEncodedChunk(e,c))}read(e,i,n,c){return this.readMediaPacket(e,i,n,c).pipeThrough(new TransformStream({transform:(o,m)=>{const h=this.genEncodedChunk(e,o);m.enqueue(h)}}))}}let ks=!1;function Zi(){ks||(console.warn("⚠️ Demo/Learning Function: This utility is intended for demos and learning purposes only. For production use, please use a proper demuxing library like MediaBunny (https://mediabunny.dev/) or web-demuxer (https://github.com/bilibili/web-demuxer) directly."),ks=!0)}async function xa(t){Zi();const e=new fi({wasmFilePath:"https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"});await e.load(t);const i=e.read("video",0).getReader(),n=[];return new Promise(function(c){i.read().then(async function o(m){const{done:h,value:S}=m;return S&&n.push(S),h?c(n):i.read().then(o)})})}async function Ha(t){Zi();const e=new fi({wasmFilePath:"https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"});await e.load(t);const i=e.read("audio",0).getReader(),n=[];await new Promise(function(h){i.read().then(async function S(T){const{done:G,value:f}=T;return f&&n.push(f),G?h(n):i.read().then(S)})});const o=(await e.getMediaInfo()).streams.filter(h=>h.codec_type_string==="audio")[0],m={codec:o.codec_string,sampleRate:o.sample_rate,numberOfChannels:o.channels};return{chunks:n,config:m}}async function Ya(t){Zi();const e=new fi({wasmFilePath:"https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"});await e.load(t);const i=e.read("video",0).getReader(),n=[];await new Promise(function(h){i.read().then(async function S(T){const{done:G,value:f}=T;return f&&n.push(f),G?h(n):i.read().then(S)})});const o=(await e.getMediaInfo()).streams.filter(h=>h.codec_type_string==="video")[0],m={codec:o.codec_string,codedWidth:o.width,codedHeight:o.height,description:o.extradata};return{chunks:n,config:m}}async function wa(t){Zi();const e=new fi({wasmFilePath:"https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"});await e.load(t);const i=e.read("audio",0).getReader(),n=[];return new Promise(function(c){i.read().then(async function o(m){const{done:h,value:S}=m;return S&&n.push(S),h?c(n):i.read().then(o)})})}/*!
303
303
  * Copyright (c) 2025-present, Vanilagy and contributors
304
304
  *
305
305
  * This Source Code Form is subject to the terms of the Mozilla Public
package/dist/index.js CHANGED
@@ -10249,25 +10249,29 @@ class mn {
10249
10249
  throw new Error(`Unsupported track kind: ${e.kind}`);
10250
10250
  }
10251
10251
  createVideoStream(e, i) {
10252
- let n, c;
10253
- const o = i.frameRate ?? 30;
10252
+ let n, c, o;
10253
+ const m = i.frameRate ?? 30;
10254
10254
  return new ReadableStream({
10255
10255
  async start() {
10256
10256
  n = document.createElement("video"), n.srcObject = new MediaStream([e]), await Promise.all([
10257
10257
  n.play(),
10258
- new Promise((m) => {
10259
- n.onloadedmetadata = m;
10258
+ new Promise((h) => {
10259
+ n.onloadedmetadata = h;
10260
10260
  })
10261
10261
  ]), c = performance.now();
10262
10262
  },
10263
- async pull(m) {
10263
+ async pull(h) {
10264
10264
  for (; ; ) {
10265
- const h = performance.now();
10266
- if (h - c < 1e3 / o) {
10267
- await new Promise((S) => requestAnimationFrame(S));
10265
+ const S = performance.now();
10266
+ if (S - c < 1e3 / m) {
10267
+ await new Promise((G) => requestAnimationFrame(G));
10268
10268
  continue;
10269
10269
  }
10270
- c = h, m.enqueue(new VideoFrame(n, { timestamp: c * 1e3 }));
10270
+ const T = o ?? Math.round((S - c) * 1e3);
10271
+ o = T, c = S, h.enqueue(new VideoFrame(n, {
10272
+ timestamp: c * 1e3,
10273
+ duration: T
10274
+ }));
10271
10275
  break;
10272
10276
  }
10273
10277
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webcodecs-utils",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "Utility functions for working with WebCodecs API",
5
5
  "homepage": "https://webcodecsfundamentals.org",
6
6
  "repository": {